diff --git a/.github/workflows/dependabot-retarget.yml b/.github/workflows/dependabot-retarget.yml index 9a01d138..36f904ca 100644 --- a/.github/workflows/dependabot-retarget.yml +++ b/.github/workflows/dependabot-retarget.yml @@ -14,7 +14,7 @@ jobs: runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index ece48823..e6e6e4ad 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -734,8 +734,6 @@ jobs: CHECKSUM_X64="${{ steps.appimage-info.outputs.checksum_x64 }}" CHECKSUM_ARM64="${{ steps.appimage-info.outputs.checksum_arm64 }}" RELEASE_DATE="${{ steps.package-version.outputs.release_date }}" - APPIMAGE_X64_NAME="${{ steps.appimage-info.outputs.appimage_x64_name }}" - APPIMAGE_ARM64_NAME="${{ steps.appimage-info.outputs.appimage_arm64_name }}" mkdir -p flatpak-submission @@ -762,6 +760,58 @@ jobs: path: flatpak-submission/* retention-days: 30 + - name: Check for Flathub token + id: check_flathub_token + run: | + if [ -n "${{ secrets.FLATHUB_TOKEN }}" ]; then + echo "has_token=true" >> $GITHUB_OUTPUT + fi + + - name: Open PR on Flathub repo + if: steps.check_flathub_token.outputs.has_token == 'true' + env: + GH_TOKEN: ${{ secrets.FLATHUB_TOKEN }} + VERSION: ${{ steps.package-version.outputs.version }} + run: | + FLATHUB_REPO="flathub/com.karmaa.termix" + BRANCH="release-$VERSION" + + git config --global user.name "LukeGus" + git config --global user.email "bugattiguy527@gmail.com" + + git clone "https://x-access-token:${GH_TOKEN}@github.com/${FLATHUB_REPO}.git" flathub-repo + cd flathub-repo + + git checkout -b "$BRANCH" + + cp ../flatpak-submission/com.karmaa.termix.yml ./ + cp ../flatpak-submission/com.karmaa.termix.desktop ./ + cp ../flatpak-submission/com.karmaa.termix.metainfo.xml ./ + cp ../flatpak-submission/flathub.json ./ + cp ../flatpak-submission/com.karmaa.termix.svg ./ + cp ../flatpak-submission/icon-256.png ./ + cp ../flatpak-submission/icon-128.png ./ + + if git diff --quiet && git diff --cached --quiet; then + echo "No changes to submit for $VERSION; Flathub repo already up to date." + exit 0 + fi + + git add -A + git commit -m "Update to $VERSION" + git push origin "$BRANCH" + + EXISTING_PR=$(gh pr list --repo "$FLATHUB_REPO" --head "$BRANCH" --state open --json number -q '.[0].number' || true) + if [ -z "$EXISTING_PR" ]; then + gh pr create --repo "$FLATHUB_REPO" \ + --base master \ + --head "$BRANCH" \ + --title "Update to $VERSION" \ + --body "Automated release update to version $VERSION." + else + echo "PR #$EXISTING_PR already open for $BRANCH." + fi + submit-to-homebrew: runs-on: blacksmith-6vcpu-macos-latest if: inputs.artifact_destination == 'submit' && (inputs.build_type == 'all' || inputs.build_type == 'macos') diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8df10dda..28525b2f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -85,14 +85,14 @@ jobs: runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout dev branch - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ needs.prep.outputs.dev_branch }} fetch-depth: 0 token: ${{ secrets.GHCR_TOKEN }} - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" cache: "npm" @@ -137,17 +137,25 @@ jobs: runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout dev branch - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ needs.prep.outputs.dev_branch }} fetch-depth: 0 token: ${{ secrets.GHCR_TOKEN }} - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" + - name: Merge main into dev branch + run: | + git config user.name "LukeGus" + git config user.email "bugattiguy527@gmail.com" + git fetch origin main + git merge origin/main -X ours --no-edit || true + git push origin HEAD:"${{ needs.prep.outputs.dev_branch }}" + - name: Clean up stale Crowdin git integration branch continue-on-error: true env: @@ -287,13 +295,13 @@ jobs: runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout main - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: main fetch-depth: 1 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" @@ -399,14 +407,14 @@ jobs: runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout Termix - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ needs.merge-to-main.outputs.build_ref }} fetch-depth: 1 path: termix - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: "termix/.nvmrc" cache: "npm" @@ -419,7 +427,7 @@ jobs: npm run generate:openapi - name: Checkout Docs repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: Termix-SSH/Docs ref: main @@ -488,13 +496,13 @@ jobs: runs-on: blacksmith-2vcpu-ubuntu-2404 steps: - name: Checkout main - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: main fetch-depth: 1 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" diff --git a/.gitignore b/.gitignore index b891f5f8..d9251b2b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ electron/build-info.cjs /.mcp.json /CLAUDE.md /old_db/ +/scripts/fix-bugs.mjs +/scripts/fix-features.mjs diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index dbf12138..160a559e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,6 +1,6 @@ -Bug fixes and new features, including Proxmox integration, SSO/OIDC redesign, revamped host metrics, tmux session management, and numerous UI and stability improvements. +Dozens of bug fixes and small new features, including VNC/RDP sharing, OIDC improvements, file manager fixes, SSH jump host fixes, terminal enhancements, RDP keyboard layout support, and much more. @@ -12,42 +12,112 @@ https://youtu.be/ImwAbm4hW-k -- Improved terminal syntax highlighting with more customizability and reliability (toggle setting moved from user profile to host editor) -- Tmux session monitor/management -- Tailscale SSH authentication and device listing support -- SSO/OIDC redesign (multiple OIDC providers, LDAP, Google, GitHub support) -- Terminal session logging -- Customize side rail tab visibility -- Admin audit log -- Added `x.x.x` version tag alongside `release-x.x.x` for Docker -- OIDC custom group claim support -- Renamed server stats to host metrics -- Fully revamped host metrics page with new cards and dashboard like organizing system (services, process inspector, log viewer, cron jobs, packages, ssl cert management, firewall, user/permissions, health checks, disk breakdown, timers, and top by memory) -- Proxmox guest discovery and import integration -- Moved ssh host config outside of top tab bar and into new tab bar visible on SSH tab -- Improved folder management (nested folders, folder icons, folder colors, better folder selection, etc.) -- Storage preference to user profile settings (store/load toggles locally or in the DB) -- Sort/filter functions to credential list (copy of host list) +- VNC, RDP, and Telnet credential sharing support +- Default host settings (SOCKS5, credentials, terminal settings, and more) +- Custom terminal background image per host +- Silent OIDC login configurable as default (no URL parameter required) +- Bulk open SSH sessions for multiple selected hosts at once +- Improved Nord theme contrast and accessibility +- Admin can manually create users while registration is disabled +- OIDC auto-provisioned users supported when registration and password login are disabled +- OIDC username usable as SSH username credential +- Custom labels and drag-to-reorder for sessions in the Connections panel +- Appearance and profile settings persisted to the database across devices +- Saved server URL dropdown in the app connection screen +- File manager text editor font size adjustment +- Tab key shortcut for entering your username in the terminal +- Shift+Tab hotkey support for mobile +- Terminal keyboard shortcuts support +- UTF-8 encoding support in the file manager +- Optional broadcast address for Wake-on-LAN packets +- SFTP legacy mode support +- Snippets JSON import and export with folder metadata +- Clickable links and service shortcuts on the dashboard +- Host status color indicators restored to sidebar +- Per-host configuration to set tab title to shell's window title instead of host name +- Split screen hotkeys +- Support for AZERTY and other non-QWERTY keyboard layouts in RDP +- RDP load balancing info and Connection Broker Cookie support +- Per-connection guacd proxy host and port configuration +- Deep link support for bookmarking direct SSH or file manager sessions +- ACME/Certbot SSL certificate support +- Import hosts from SSH config file +- OIDC with custom CA certificate support +- Open files directly in the file manager text editor +- File manager text editor Ctrl+W capture to prevent accidental tab close +- Option to collapse hosts to a single line in the sidebar +- Select a different backend Termix server from within the app +- Windows portable app now truly portable (no registry writes) +- Bundle fonts for offline environments +- Option to disable clickable links in the terminal +- Proxmox login options including OPKSSH +- UI suggestions and general interface improvements +- Per-protocol host metrics (online/offline detection) configuration +- Increase file manager max upload size by splicing files and reassembling them (~5GB) -- SFTP jump-host fallback from host data -- Guacd password incorrectly passed for app view -- Admin page failing to load admin information -- Disabled hardware acceleration on Windows to prevent startup crash -- Dashboard total credentials stuck at 0 -- Host username ignored when credential attached -- Clone host cannot switch auth method -- File manager context menu off-screen -- File delete affecting inactive tabs -- Silent delete failure on Windows hosts -- iPad host tab does nothing -- Docker console terminal background using incorrect colors -- Reliable OIDC group syncing for admin roles -- Guacd connections using incorrect screen height -- 2FA failing to disable -- Hostname fill entire column and truncate at proper spot in dashboard -- Make credentials start collapsed -- Incorrect JSDoc comments +- File transfers over 100MB failing +- File transfers over 30 seconds aborted by axios timeout +- SSH terminal through jump host chain timing out with malformed SSH messages +- Cloning a host with SSH key auth not allowing auth method change on the clone +- File deletion in the file manager affecting selected files in inactive tabs +- File manager not connecting when cert passphrase is not saved +- File text editor cursor position lost on save +- macOS Option + Left/Right Arrow outputting raw ANSI sequences instead of moving cursor by word +- File manager tree view not sorted alphabetically +- SFTP failing with timeout when using a jump host chain +- SSH key auth with Duo not showing prompt and failing immediately +- Enabling 2FA with password login disabled causing a login deadlock +- Failed to disable 2FA even when providing correct TOTP or password +- Arrow buttons not working in Midnight Commander on the Android app +- Credential deploy command copy failing silently (clipboard API unavailable in some browsers) +- Disabling password login still showing the password login form +- Folder picker in the new host form not showing existing folders +- Command palette always opening hosts as SSH terminal regardless of protocol settings +- Saving SSH credentials failing on fresh installs +- Import hosts failing when hosts use SSH key credentials +- Warpgate authentication prompting for a password unnecessarily +- File manager folder icon not appearing under host name on hover +- File manager delete silently failing on Windows hosts (rm -f not supported by PowerShell) +- SSH terminal failing with keepalive timeout when server MOTD is slow to load +- SSH connection via SOCKS5 proxy failing after update +- Linking an OIDC account to a password account not working +- User password copy missing and RBAC issues in admin panel +- Debian and Android packages not opening the server on launch +- Username field in host edit and new host form having no effect +- Mobile terminal crashing on iOS with React error 130 +- Network interface symbols incorrect in host metrics +- Sudo password auto-fill not working on Ubuntu Server 26.04 +- get_cwd command injecting into live PTY and corrupting interactive programs +- Initial directory command failing on Windows PowerShell SSH targets +- 3-way split not working with layout issues +- Docker management not working for Windows hosts +- Docker management failing on Debian with exit code 1 +- Docker logs not respecting the current theme +- API not responding correctly after update +- Caddy reverse proxy configuration not working +- Wrong keyboard layout in VNC sessions +- KDE scaling issues in the desktop app +- Linux app failing to start due to better-sqlite3 Node version mismatch +- Tab autocomplete not working in the macOS x86 app +- Cloudflare SSL tunnels with third-level subdomains blocking Termix web portal access +- Fzf completion not working in the Android app +- SSH terminal frame delivery jitter in Docker (ssh2 native crypto not compiled) +- OIDC login failing in Linux and Android apps when Authentik has a Captcha stage +- Android app crashing after entering password when auth is set to None +- Editing or saving a host clearing the password for RDP and VNC connections +- Hardcoded 30-minute open-tabs TTL defeating session persistence +- Keyboard mapping issues on Windows Server 2019 via RDP +- Shared server not appearing for other users +- RBAC role assignment failing for OIDC users +- SSO configuration broken when supplied via environment variables +- RDP requiring credentials even when none are needed +- Terminal outputting success right after folder path +- GitHub/Google SSO provider giving ERR_INVALID_URL +- Keyboard focus not on main screen when selecting tmux session +- Remove all references to SALT variable +- Syntax highlighter duplicating path, visual corruptions, cursor jumps, etc. +- RDP session screen clips/spills over on viewport resize diff --git a/build/after-pack.cjs b/build/after-pack.cjs new file mode 100644 index 00000000..6796a3ce --- /dev/null +++ b/build/after-pack.cjs @@ -0,0 +1,12 @@ +const fs = require("fs"); +const path = require("path"); + +exports.default = async function afterPack(context) { + const { targets, appOutDir } = context; + + const isDir = targets.some((t) => t.name === "dir"); + if (!isDir) return; + + const markerPath = path.join(appOutDir, ".portable"); + fs.writeFileSync(markerPath, ""); +}; diff --git a/docker/Dockerfile b/docker/Dockerfile index b9a8a149..5b2c28e1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # Stage 1: Install dependencies -FROM node:24-slim AS deps +FROM node:26-slim AS deps WORKDIR /app RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/* @@ -36,7 +36,7 @@ RUN npm rebuild better-sqlite3 RUN npm run build:backend # Stage 4: Production dependencies only -FROM node:24-slim AS production-deps +FROM node:26-slim AS production-deps WORKDIR /app RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/* @@ -53,14 +53,14 @@ RUN npm ci --omit=dev --ignore-scripts && \ npm cache clean --force # Stage 5: Final optimized image -FROM node:24-slim +FROM node:26-slim WORKDIR /app ENV DATA_DIR=/app/data \ PORT=8080 \ NODE_ENV=production -RUN apt-get update && apt-get install -y nginx gettext-base openssl ca-certificates gosu wget && \ +RUN apt-get update && apt-get install -y nginx gettext-base openssl ca-certificates gosu wget certbot python3-certbot-dns-cloudflare && \ update-ca-certificates && \ rm -rf /var/lib/apt/lists/* && \ mkdir -p /app/data /app/uploads /app/data/.opk /app/nginx /tmp/nginx && \ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 1cd91279..c46e28c2 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -41,7 +41,7 @@ fi mkdir -p /tmp/nginx envsubst '${PORT} ${SSL_PORT} ${SSL_CERT_PATH} ${SSL_KEY_PATH}' < $NGINX_CONF_SOURCE > /tmp/nginx/nginx.conf -mkdir -p /app/data /app/uploads /app/data/.opk +mkdir -p /app/data /app/uploads /app/data/.opk /app/data/acme-webroot/.well-known/acme-challenge chmod 755 /app/data /app/uploads /app/data/.opk 2>/dev/null || true if [ -w /app/data ]; then diff --git a/docker/nginx-https.conf b/docker/nginx-https.conf index a3036727..ee58e8fb 100644 --- a/docker/nginx-https.conf +++ b/docker/nginx-https.conf @@ -24,7 +24,11 @@ http { client_header_timeout 300s; set_real_ip_from 127.0.0.1; + set_real_ip_from 10.0.0.0/8; + set_real_ip_from 172.16.0.0/12; + set_real_ip_from 192.168.0.0/16; real_ip_header X-Forwarded-For; + real_ip_recursive on; map $http_x_forwarded_proto $proxy_x_forwarded_proto { default $http_x_forwarded_proto; @@ -67,6 +71,12 @@ http { add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection "1; mode=block" always; + location ^~ /.well-known/acme-challenge/ { + root /app/data/acme-webroot; + default_type "text/plain"; + try_files $uri =404; + } + location = /sw.js { root /app/html; expires off; @@ -128,7 +138,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/releases(/.*)?$ { @@ -137,7 +147,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/alerts(/.*)?$ { @@ -146,7 +156,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/rbac(/.*)?$ { @@ -155,7 +165,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/credentials(/.*)?$ { @@ -164,7 +174,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -177,7 +187,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/c2s-tunnel-presets(/.*)?$ { @@ -186,7 +196,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/audit-logs(/.*)?$ { @@ -195,7 +205,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/terminal(/.*)?$ { @@ -204,7 +214,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/open-tabs(/.*)?$ { @@ -213,7 +223,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/user-preferences(/.*)?$ { @@ -222,7 +232,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/database(/.*)?$ { @@ -234,7 +244,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -253,7 +263,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -269,7 +279,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/quick-connect { @@ -281,7 +291,7 @@ http { proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/host/opkssh-chooser(/.*)?$ { @@ -320,7 +330,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /session_logs/ { @@ -329,7 +339,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /tailscale/ { @@ -338,7 +348,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /ssh/websocket/ { @@ -377,7 +387,7 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $http_host; @@ -397,7 +407,7 @@ http { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/tunnel/ { @@ -406,7 +416,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /ssh/tunnel/ { @@ -417,7 +427,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_read_timeout 86400s; proxy_send_timeout 86400s; proxy_buffering off; @@ -430,7 +440,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/file_manager/pinned { @@ -439,7 +449,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/file_manager/shortcuts { @@ -448,7 +458,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/file_manager/sudo-password { @@ -457,7 +467,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /ssh/file_manager/ { @@ -471,7 +481,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -492,7 +502,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -508,7 +518,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /health { @@ -517,7 +527,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/status(/.*)?$ { @@ -526,7 +536,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/metrics(/.*)?$ { @@ -535,7 +545,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 60s; @@ -548,7 +558,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/host-metrics(/.*)?$ { @@ -557,7 +567,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 600s; proxy_send_timeout 600s; @@ -570,7 +580,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/uptime(/.*)?$ { @@ -579,7 +589,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/activity(/.*)?$ { @@ -588,7 +598,16 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; + } + + location ~ ^/service-links(/.*)?$ { + proxy_pass http://127.0.0.1:30006; + proxy_http_version 1.1; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ^~ /docker/console/ { @@ -602,7 +621,7 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $http_host; @@ -623,7 +642,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -637,7 +656,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; diff --git a/docker/nginx.conf b/docker/nginx.conf index dd5eabda..5da83bcf 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -24,7 +24,11 @@ http { client_header_timeout 300s; set_real_ip_from 127.0.0.1; + set_real_ip_from 10.0.0.0/8; + set_real_ip_from 172.16.0.0/12; + set_real_ip_from 192.168.0.0/16; real_ip_header X-Forwarded-For; + real_ip_recursive on; map $http_x_forwarded_proto $proxy_x_forwarded_proto { default $http_x_forwarded_proto; @@ -56,6 +60,12 @@ http { add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection "1; mode=block" always; + location ^~ /.well-known/acme-challenge/ { + root /app/data/acme-webroot; + default_type "text/plain"; + try_files $uri =404; + } + location = /sw.js { root /app/html; expires off; @@ -117,7 +127,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/releases(/.*)?$ { @@ -126,7 +136,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/alerts(/.*)?$ { @@ -135,7 +145,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/rbac(/.*)?$ { @@ -144,7 +154,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/credentials(/.*)?$ { @@ -153,7 +163,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -166,7 +176,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/proxmox(/.*)?$ { @@ -175,7 +185,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 120s; proxy_read_timeout 120s; @@ -187,7 +197,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/audit-logs(/.*)?$ { @@ -196,7 +206,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/terminal(/.*)?$ { @@ -205,7 +215,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/open-tabs(/.*)?$ { @@ -214,7 +224,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/user-preferences(/.*)?$ { @@ -223,7 +233,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/database(/.*)?$ { @@ -235,7 +245,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -254,7 +264,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -270,7 +280,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/quick-connect { @@ -282,7 +292,7 @@ http { proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/host/opkssh-chooser(/.*)?$ { @@ -321,7 +331,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /session_logs/ { @@ -330,7 +340,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /tailscale/ { @@ -339,7 +349,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /ssh/websocket/ { @@ -378,7 +388,7 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $http_host; @@ -398,7 +408,7 @@ http { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/tunnel/ { @@ -407,7 +417,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /ssh/tunnel/ { @@ -418,7 +428,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_read_timeout 86400s; proxy_send_timeout 86400s; proxy_buffering off; @@ -431,7 +441,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/file_manager/pinned { @@ -440,7 +450,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/file_manager/shortcuts { @@ -449,7 +459,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /host/file_manager/sudo-password { @@ -458,7 +468,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /ssh/file_manager/ { @@ -472,7 +482,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -493,7 +503,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -509,7 +519,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location /health { @@ -518,7 +528,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/status(/.*)?$ { @@ -527,7 +537,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/metrics(/.*)?$ { @@ -536,7 +546,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 60s; @@ -549,7 +559,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/host-metrics(/.*)?$ { @@ -558,7 +568,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 600s; proxy_send_timeout 600s; @@ -571,7 +581,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/uptime(/.*)?$ { @@ -580,7 +590,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ~ ^/activity(/.*)?$ { @@ -589,7 +599,16 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; + } + + location ~ ^/service-links(/.*)?$ { + proxy_pass http://127.0.0.1:30006; + proxy_http_version 1.1; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; } location ^~ /docker/console/ { @@ -603,7 +622,7 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $http_host; @@ -624,7 +643,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; @@ -638,7 +657,7 @@ http { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; proxy_connect_timeout 60s; proxy_send_timeout 300s; diff --git a/electron-builder.json b/electron-builder.json index 52739c98..d2eb0685 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -130,6 +130,7 @@ "artifactName": "termix_macos_${arch}_dmg.${ext}", "sign": true }, + "afterPack": "build/after-pack.cjs", "afterSign": "build/notarize.cjs", "mas": { "provisioningProfile": "build/Termix_Mac_App_Store.provisionprofile", diff --git a/electron/main.cjs b/electron/main.cjs index 104ec5a2..75600256 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -20,6 +20,32 @@ const { URL } = require("url"); const { fork } = require("child_process"); const WebSocket = require("ws"); +// Portable mode: if a `.portable` marker exists next to the executable, +// store all data in a `data` folder beside the exe instead of %APPDATA%. +(function setupPortableDataDir() { + const exeDir = path.dirname(process.execPath); + const markerPath = path.join(exeDir, ".portable"); + const envOverride = process.env.TERMIX_DATA_DIR; + + let portableDataDir = null; + if (envOverride) { + portableDataDir = envOverride; + } else if (app.isPackaged && fs.existsSync(markerPath)) { + portableDataDir = path.join(exeDir, "data"); + } + + if (portableDataDir) { + try { + if (!fs.existsSync(portableDataDir)) { + fs.mkdirSync(portableDataDir, { recursive: true }); + } + app.setPath("userData", portableDataDir); + } catch { + // Fall back to default userData if we can't create the directory. + } + } +})(); + const logFile = path.join(app.getPath("userData"), "termix-main.log"); const electronAuthCookiesPath = path.join( app.getPath("userData"), @@ -476,6 +502,11 @@ if (process.platform === "linux") { app.commandLine.appendSwitch("--ozone-platform-hint=auto"); app.commandLine.appendSwitch("--enable-features=VaapiVideoDecoder"); + + // Fix click-coordinate misalignment with fractional display scaling on KDE/Wayland. + // Chromium's hit-testing uses unscaled coords while the compositor scales visually, + // so forcing scale factor 1 keeps them in sync. See: https://github.com/brave/brave-browser/issues/50028 + app.commandLine.appendSwitch("--force-device-scale-factor", "1"); } if (process.platform === "win32") { diff --git a/package-lock.json b/package-lock.json index 1b918430..4010ad1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "termix", - "version": "2.4.0", + "version": "2.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "termix", - "version": "2.4.0", + "version": "2.4.1", "hasInstallScript": true, "dependencies": { "@types/ldapjs": "^3.0.6", - "axios": "^1.17.0", + "axios": "^1.18.0", "bcryptjs": "^3.0.3", - "better-sqlite3": "^12.9.0", - "body-parser": "^2.2.2", + "better-sqlite3": "^12.11.1", + "body-parser": "^2.3.0", "chalk": "^5.6.2", "cookie-parser": "^1.4.7", "cors": "^2.8.6", @@ -27,13 +27,13 @@ "jszip": "^3.10.1", "ldapjs": "^3.0.7", "motion": "^12.38.0", - "multer": "^2.1.1", + "multer": "^2.2.0", "nanoid": "^5.1.9", "qrcode": "^1.5.4", "socks": "^2.8.7", "speakeasy": "^2.0.0", "ssh2": "^1.17.0", - "undici": "^8.4.0", + "undici": "^8.5.0", "ws": "^8.20.0" }, "devDependencies": { @@ -49,6 +49,9 @@ "@electron/rebuild": "^4.0.4", "@eslint/js": "^9.0.0", "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@fontsource/fira-code": "^5.2.7", + "@fontsource/jetbrains-mono": "^5.2.8", + "@fontsource/source-code-pro": "^5.2.7", "@monaco-editor/react": "^4.7.0", "@radix-ui/react-accordion": "^1.2.13", "@radix-ui/react-alert-dialog": "^1.1.16", @@ -59,11 +62,11 @@ "@radix-ui/react-popover": "^1.1.16", "@radix-ui/react-progress": "^1.1.9", "@radix-ui/react-scroll-area": "^1.2.11", - "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-select": "^2.3.1", "@radix-ui/react-separator": "^1.1.9", - "@radix-ui/react-slider": "^1.3.6", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-slider": "^1.4.1", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-switch": "^1.3.1", "@radix-ui/react-tabs": "^1.1.14", "@radix-ui/react-tooltip": "^1.2.9", "@tailwindcss/vite": "^4.2.4", @@ -101,9 +104,9 @@ "clsx": "^2.1.1", "cmdk": "^1.1.1", "concurrently": "^9.2.1", - "cytoscape": "^3.33.2", - "electron": "^42.2.0", - "electron-builder": "^26.8.1", + "cytoscape": "^3.34.0", + "electron": "^42.4.1", + "electron-builder": "^26.15.3", "eslint": "^9.0.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", @@ -115,14 +118,14 @@ "i18next-browser-languagedetector": "^8.2.1", "jsdom": "^29.1.1", "lint-staged": "^17.0.7", - "lucide-react": "^1.11.0", + "lucide-react": "^1.20.0", "prettier": "3.8.3", - "radix-ui": "^1.4.3", + "radix-ui": "^1.6.0", "react": "^19.2.7", "react-cytoscapejs": "^2.0.0", "react-dom": "^19.2.7", "react-h5-audio-player": "^3.10.2", - "react-hook-form": "^7.73.1", + "react-hook-form": "^7.79.0", "react-i18next": "^17.0.4", "react-icons": "^5.6.0", "react-markdown": "^10.1.0", @@ -131,13 +134,13 @@ "react-syntax-highlighter": "^16.1.1", "react-xtermjs": "^1.0.10", "remark-gfm": "^4.0.1", - "sharp": "^0.34.5", + "sharp": "^0.35.1", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", "tailwindcss": "^4.2.4", "tw-animate-css": "^1.4.0", "typescript": "~6.0.3", - "typescript-eslint": "^8.59.0", + "typescript-eslint": "^8.61.1", "vite": "^8.0.16", "vite-plugin-svgr": "^5.2.0", "vitest": "^4.1.8" @@ -1482,48 +1485,16 @@ "node": ">=20.0.0" } }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.3.tgz", + "integrity": "sha512-OjKpjB7gohtEjZiq6nDx1egqjZJhGPN1iFOIED+NFhB/MMkXw/XRcHjh1DGXKT5z2W9eW7Jy2UKU3gpjvusFTQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=22.12.0" } }, - "node_modules/@develar/schema-utils/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@develar/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, "node_modules/@electron/asar": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-4.2.0.tgz", @@ -2147,6 +2118,36 @@ "url": "https://github.com/sponsors/ayuhito" } }, + "node_modules/@fontsource/fira-code": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/fira-code/-/fira-code-5.2.7.tgz", + "integrity": "sha512-tnB9NNund9TwIym8/7DMJe573nlPEQb+fKUV5GL8TBYXjIhDvL0D7mgmNVNQUPhXp+R7RylQeiBdkA4EbOHPGQ==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/jetbrains-mono": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", + "integrity": "sha512-6w8/SG4kqvIMu7xd7wt6x3idn1Qux3p9N62s6G3rfldOUYHpWcc2FKrqf+Vo44jRvqWj2oAtTHrZXEP23oSKwQ==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/source-code-pro": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/source-code-pro/-/source-code-pro-5.2.7.tgz", + "integrity": "sha512-7papq9TH94KT+S5VSY8cU7tFmwuGkIe3qxXRMscuAXH6AjMU+KJI75f28FzgBVDrlMfA0jjlTV4/x5+H5o/5EQ==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -2247,9 +2248,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.1.tgz", + "integrity": "sha512-T15JRWOubQ3f5+GxnWeIvo47u5qV0M9HBgJhT+f2gE1e9e6OhR6K73Re52Hm80qWcu1DNb3GweKmpr/MnuP2Ow==", "cpu": [ "arm64" ], @@ -2260,19 +2261,19 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "@img/sharp-libvips-darwin-arm64": "1.3.0" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.1.tgz", + "integrity": "sha512-t1CPD0cr7XCHjwUj6tQ5MC0pCi866I+gUW6zbUX4aFPnKd1DFBtk0M+gWcjX8VeEzgfCNiSiNTVFZ6b7kvdbnQ==", "cpu": [ "x64" ], @@ -2283,19 +2284,39 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "@img/sharp-libvips-darwin-x64": "1.3.0" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.1.tgz", + "integrity": "sha512-MBSQXqNPThW9EcZ905H6N4sEdX5EwZEYzGx5EBq9ncDCGJALMiY1xPFJxNdzuB1iBjLOpIfxajM6YxdvwmQSLA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.0.tgz", + "integrity": "sha512-EKbmBKtyTH+GPFDRw2TgK2oV6hyxxlJVIar4hoTYSNmIwipgMFdxPQqR392GmfdsPGWga0mCFN1cCKjRb9cljw==", "cpu": [ "arm64" ], @@ -2310,9 +2331,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.0.tgz", + "integrity": "sha512-Pl2OmOvrJ42adUllESxBsG54PfXLo1OYg9i3c5/5Ln/qJ0gZuTM9YMhQJPIbXqwidLRc/c2zuHt4RsrymmNv7A==", "cpu": [ "x64" ], @@ -2327,13 +2348,16 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.0.tgz", + "integrity": "sha512-A8UpHoUDW4DwnXoV6+q3C1s7QLRAHtPDEjWuNZjwHMyoCNZnm0GeNN8ls9f/bsEYTRQRW96C/n34XJQHJ2fT7A==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2344,13 +2368,16 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.0.tgz", + "integrity": "sha512-C0SqjoFKnszqa44EQ7xoaT48nnO0lOyXEULfXMWi8krrjOPGYkeK30Okzla6ATbBYsyZ0ySinK0FVkpv3DwzfQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2361,13 +2388,16 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.0.tgz", + "integrity": "sha512-WOpkVxAjFd369iaIzEgNRreFD+gWdUMIGD5zplhNKNeqS6mm5dac3q2AFyCBmzYoAdouzZvRBgxy4z8QHZb4/A==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2378,13 +2408,16 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.0.tgz", + "integrity": "sha512-DRWw0mOHusrCCuw2rqP87oLg6PGlkomVDFqw2hIwsSfwWpu4k3XLcBPaKKl6ct/GtL/cwNkgwjV/tc0Mqht3VA==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2395,13 +2428,16 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.0.tgz", + "integrity": "sha512-9APy+nFWhHS+kzLgWZfLcyrUd7YqnAQVa4BPOo4xkoHpdoktOAPG4cEr9+Jpl0TtqfVmcMJimNL5qNTyyOHZNA==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2412,13 +2448,16 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.0.tgz", + "integrity": "sha512-y9RNUYDe2A1UAdhLyfeOodGRszQdaEoe4nfOpp/sNVPl2CWIcUyFaDoCh4vPLPxu19803j2naLqZup2WxDXCLA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2429,13 +2468,16 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.0.tgz", + "integrity": "sha512-cC1wkC0Mlucd0KSiGrLkJnB/ZqPvZCntc/Lk7ZnYO5ZSbF2euNek4Xvxafojq+wN1q/W0eprdpUIjUr/EV2PBg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2446,13 +2488,16 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.0.tgz", + "integrity": "sha512-LiYMhUZicB1QG//+RvmYZpXJO8fYRENfp+MZUCnG9aw+AKvGAy9gPaCnuwsPcBFs8EV66M0NNxj9VHcNklE8zw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2463,213 +2508,265 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.1.tgz", + "integrity": "sha512-jygmR02PpCYypt7xB7nst1vqjZp/BpRA/Kf9nK7qRponJ/KrLPaZWEG4G15z1d2FZ6XqI+T0350ha3RSnKx24A==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "@img/sharp-libvips-linux-arm": "1.3.0" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.1.tgz", + "integrity": "sha512-ErCRyGU7LeoaFBZ0xW8hhLlXzhAg80sc4vxePB86qvtEvW1jEhhmbiNBP4oEzZfPMnu6HwHXfzD2W2kBU+RnCw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "@img/sharp-libvips-linux-arm64": "1.3.0" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.1.tgz", + "integrity": "sha512-LUWZ2+r2UoLCd8j0RLCwQ4gL6w47+Y7igxtVnPIDXOOEjV86LpBkAHq5VpJeg+GHbw0KN/JWlPJOdZjyZnFqFQ==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" + "@img/sharp-libvips-linux-ppc64": "1.3.0" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.1.tgz", + "integrity": "sha512-i7x6J3mwF4JgT0sM4V4WlAWdJ0bucPtA9rzO1bTji1n5qgBq/W5nn87RvOQPleuuxahNoLdTngByD8/vDDLArw==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" + "@img/sharp-libvips-linux-riscv64": "1.3.0" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.1.tgz", + "integrity": "sha512-0zSaTUjTF0kIWTSYxD4EG/nvCU4jez53+3RdURtoY3HvbXtIQ98W90JnrGz/oLRFuEnfIy9+7xeq883euc0ZWw==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "@img/sharp-libvips-linux-s390x": "1.3.0" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.1.tgz", + "integrity": "sha512-NbJD4mWdeyrNQKluO/tR/wBDOelcowSVGNBWxI0e3ZtlXc6F/UOVKDj1MLD4zl3oHTuvKW3s+MA9N54YTldAYw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "@img/sharp-libvips-linux-x64": "1.3.0" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.1.tgz", + "integrity": "sha512-VoW2sQCWI+0YIKQEmWJ8vzaQjTg9wIyfkFpvEfAS2h43X6iHu7GTk1hhOgB4IpSzCHe8UwQZIcx7b81VTaOrJA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.0" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.1.tgz", + "integrity": "sha512-LjBoSd/c5JU0/K5MwzDMlgsSRP2bPn98JQGFFQAOLQ0bU/1z4ekxUdSKY9BmlwSh/cA+OrvpgsWqfZyYfVHBRw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.0" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.1.tgz", + "integrity": "sha512-PCQUoQdZyE8tp3HpbevuihfUmgSP4qWI0FGEPWoeXqaS+cUrFfemabHQiebUmUmlUhCuNnQMxGrQ+CPqK4hnxg==", "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@emnapi/runtime": "^1.11.0" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.1.tgz", + "integrity": "sha512-xU2ml2bU2OPxYVvW2A6ae4M1g5QKyhKG06P4FAt+YEaFQQO0919Qx+XxIZEUuWTMoDViLpMws2/dQwoe/VcA6A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.1" + }, + "engines": { + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.1.tgz", + "integrity": "sha512-IkmHwuFhYpd3bTsN5SAahjwhiAcyXPooBt8vEUgxY3T0IP70sSJ0nU1xiPzZY8AH/OB1XpV3j8aZSVSOSfTbdA==", "cpu": [ "arm64" ], @@ -2680,16 +2777,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.1.tgz", + "integrity": "sha512-wQahqCi9MD8Yxzg4gVM4fNrZxh+r6vD55PyIg+WJPaM5ZRUyF35iQpwJCuma3r6viU9/8Pxlc+XHV+woVa6nCQ==", "cpu": [ "ia32" ], @@ -2700,16 +2797,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.1.tgz", + "integrity": "sha512-WzBtkYtZHATLPe8XRharxZXxQ9cdLrQWHiwxt+BJ5rBsisQrKeeV86ErxPSVhcG6xCEuNhs0SqLpWr7XDa2k6w==", "cpu": [ "x64" ], @@ -2720,7 +2817,7 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -3456,6 +3553,19 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@oxc-project/types": { "version": "0.133.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", @@ -3466,6 +3576,58 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", @@ -3474,27 +3636,27 @@ "license": "MIT" }, "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", + "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", "dev": true, "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", + "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", "dev": true, "license": "MIT" }, "node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", - "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.10.tgz", + "integrity": "sha512-TraSwZUqTcVbiDV2/RXzAXC7aeVVXchq0daPFZE7zAxYFaMzjOUggLOfQH9KFLgRizuwVKZO/crveV1eeO3/ZQ==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/react-visually-hidden": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -3512,20 +3674,20 @@ } }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.13.tgz", - "integrity": "sha512-xITxBB2p5m5tAe7M0F95kb4uAh7jSIKGlExMEm93HlW+XxZHV2eXFbPWLktd4JhRiwcnXNbO7iekcrbZy6ZCvA==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.14.tgz", + "integrity": "sha512-iE8YB9nmTBH8zd73ofBISZ8JCzgMoMkATJr7qDwa6u5F1+7mTM81V6fa71jgZ65rpjVpecDf1vSnwIFP9Ly1zw==", "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collapsible": "1.1.13", - "@radix-ui/react-collection": "1.1.9", + "@radix-ui/react-collapsible": "1.1.14", + "@radix-ui/react-collection": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -3543,317 +3705,18 @@ } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collapsible": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.13.tgz", - "integrity": "sha512-F0s8+p2XNpfc3k02zBfB0jPWbkHVG162+p7BdUMyJ2308QMqZ+oaclX+FAzKFovgL5OqRU+Rvy6f/vbdlJVaqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collection": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.9.tgz", - "integrity": "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.16.tgz", - "integrity": "sha512-vPaIgo0mxYlvcFaM9jB2Uot9TjGXMuAPEvrc6BOLeV+I5U8s1dkIoouYaa6lmSfc5SPMo5x5djOTOTvaigdGMQ==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.17.tgz", + "integrity": "sha512-563ygGeyWPrxyVCNp7OV4rE2aIXhFPknpFyo4wbDlcyMMPZ6ySh+zC5WTvY0ZFLgPTg/QB6tA8PyDQyJ2b4cPg==", "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dialog": "1.1.16", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" + "@radix-ui/react-dialog": "1.1.17", + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -3871,13 +3734,13 @@ } }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.10.tgz", + "integrity": "sha512-j2VTDz1vgCsmuG0k5lBfOcM8n5JPFqZBcMryasFjHYMhwxYL5SRUV5lMSUpRdNtw3D/Sv8pzJtrlAgkssYSsQQ==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -3895,13 +3758,13 @@ } }, "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", - "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.10.tgz", + "integrity": "sha512-kbI7NrqhDeuytYrq7JjAsoXczvL8wgj2tc1MyaYWm+50bMKHCHQtVWCryslx4cCpmCTTkBcwQckE4CmmGV2haQ==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -3919,17 +3782,17 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", - "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.0.tgz", + "integrity": "sha512-am/CwltXtmtdtP+5FbYblYDnMa/zuKcMJP1i3/SJMDXXfj2mG+BTqLH2wucqeyyiQMursUtg/5cK+Nh2pCaSOA==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -3947,9 +3810,9 @@ } }, "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.4.tgz", - "integrity": "sha512-m3JmIOAX5ZzZ6VPjxEU2dbTOhoHi0nT5riwcDwe8idocsWf4a5DXJLDtZ6LfJwMBx7W+A2b7kp2TgPEKtaiF6A==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.5.tgz", + "integrity": "sha512-pREzrmNnVwGvYaBoM64huTRK7B3lrTRuwj8A9nwhPiEtMb+yudiWh6zWAqEtP0Dzd5+iBa1Ki7V1pCxV8ExMdA==", "dev": true, "license": "MIT", "dependencies": { @@ -3957,7 +3820,7 @@ "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" @@ -3977,198 +3840,21 @@ } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-previous": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", - "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.14.tgz", + "integrity": "sha512-9bT+FvifX1FK2Mj6UEsTdyu0cN3JaA3KdfhaBao+ONrYFy/pyOy3TU1TNw7iOk1o+0hOEq67RojlUUmoFGwxyA==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -4186,16 +3872,16 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.10.tgz", + "integrity": "sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", @@ -4212,29 +3898,10 @@ } } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", + "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4248,9 +3915,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", + "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4264,18 +3931,17 @@ } }, "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.1.tgz", + "integrity": "sha512-XbrxS68W5dyiE4fAb96yvJwSVU5x66B20A99sD5Mk3xSWK/LqeOnx6TZnim1KieMjXS/CTFq8reOAjWxas2G8Q==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-menu": "2.1.18", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -4293,23 +3959,23 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.16.tgz", - "integrity": "sha512-l9ok83YBclEZhbjgzt76Hw733e6cvRKPNgO6GJ/IETlufXG9p+fRu2wlvpImQvR6xdJ8h7J8J2DBvsPEiEsKMw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.17.tgz", + "integrity": "sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==", "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.12", + "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.9", + "@radix-ui/react-focus-scope": "1.1.10", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" @@ -4329,301 +3995,10 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", - "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.9.tgz", - "integrity": "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", - "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", + "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4637,17 +4012,17 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.13.tgz", + "integrity": "sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-escape-keydown": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -4665,9 +4040,9 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.17.tgz", - "integrity": "sha512-S6b3Jm57sY5EdDyOMLkacbB0qMnKhy1RCKZCt795ZkmtUOAvojYIZ5p7dXHIh5Cyr3jCLLI5/g64V3FKLudZmw==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.18.tgz", + "integrity": "sha512-PZGV82gFk0WltDRI//SsG28ZIjlo9ANTmoNYg0jLNzXXiDsAy5PkOOYQaVD1pPxY6t7gxffb1QMD6qaUvsBZdw==", "dev": true, "license": "MIT", "dependencies": { @@ -4675,8 +4050,8 @@ "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.17", - "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-menu": "2.1.18", + "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -4694,141 +4069,7 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-arrow": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.9.tgz", - "integrity": "sha512-yqHW5WQ/cTpU/un7dqqIKNy2iRU8BC0JB78PEzTfCCYvZu1U6W9KwObAniMk9nhSfyotKPQTYaUD/HB0f5muig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-collection": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.9.tgz", - "integrity": "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", - "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-focus-guards": { + "node_modules/@radix-ui/react-focus-guards": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", @@ -4844,391 +4085,16 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.9.tgz", - "integrity": "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-menu": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.17.tgz", - "integrity": "sha512-fmbNnFyf+JYCN0DhhWnEdUTDnZD1mXaPQWivdsPIb8oOSbARfD3LIQJbLCG8a8QLCwoMxiJ7GVPIFcC8Dw8v2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.12", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.9", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.0", - "@radix-ui/react-portal": "1.1.11", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-roving-focus": "1.1.12", - "@radix-ui/react-slot": "1.2.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.7.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-popper": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.0.tgz", - "integrity": "sha512-9PB589e1aWZbrlFUHdz6WiPCL+xLZHQFX7oibqG/6Q0SwOkxDyQX9W/cyPa+sAPPKuC8cpLCpRczE5a/1DiwVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-portal": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", - "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.12.tgz", - "integrity": "sha512-FvgPt1bRmg8Xt2QpF7NUZW3dE0ZQHGm41dAdgT2J2GJPoIXz+9Em3NobAxf4fupcxhgHu03E5CRiU2MWvObXyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.10.tgz", + "integrity": "sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -5246,42 +4112,18 @@ } }, "node_modules/@radix-ui/react-form": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", - "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.10.tgz", + "integrity": "sha512-1NfuvctVtX4sU3Mmq/IdrR8UunxiCMiVg3A5UENKhFzxUBeOyaQQ+lmaQaV7Tc8cqvBKsJL3/KGBsixK0D8WFg==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-form/node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-label": "2.1.10", + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -5299,21 +4141,21 @@ } }, "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", - "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.17.tgz", + "integrity": "sha512-GjZQIEANVkuuWeztlKz6QEHe31ZX2iDfHzcTMCQVZXC0JyQrgfKWSC+LOOEw6aVV64zyjzobIzSA4AU4eKWrHA==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-popper": "1.3.1", + "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -5331,13 +4173,13 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", + "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -5350,37 +4192,13 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.9.tgz", - "integrity": "sha512-rDoTeMbCwRVcnmo7NGT9IlPo1yXmEI+xc1URP3oeewwZEV4mdTp1dYUhYbQdo4D1q2SjKVvv4N1gNY77QAQtjA==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.10.tgz", + "integrity": "sha512-ib0zvq2ZsAqKm5tRnqGJn3vOxSgIts5ToxsXT0q1S/GfLD1Zj7UOEnkw8u2w6sRmn47djpQWuSU1DCL1R29/yw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -5398,30 +4216,30 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.18.tgz", + "integrity": "sha512-lj8Rxjtn6zJq1oSbE/uDtAwCbB9BnxgHD+8MwJMuTh6u1dPamYhW9iuELr/Z8d0D/UysFblYYHeBPwi7T4k0YQ==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.10", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-popper": "1.3.1", + "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -5438,42 +4256,23 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-menubar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", - "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.18.tgz", + "integrity": "sha512-hX7EGx/oFq6DPY27GQuP/2wP48GHf5LG6r06VgNJlG+znmDS8OfopZcRcGly3L4lsB9FqpmLx6JQSE9P3BUpyw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-menu": "2.1.18", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -5491,26 +4290,26 @@ } }, "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", - "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.16.tgz", + "integrity": "sha512-nJ0SkrSQgudyYhMiYeHA1ayLVuduEJCFLan1RZZN7c9kqzzCFLaU9kuy81uNtqzweM9YaQPgWzxi9MwQ9jZ04g==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -5528,24 +4327,24 @@ } }, "node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", - "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.10.tgz", + "integrity": "sha512-GHkcJ+WVj91At+OvUVTD4R3W0/wxw9t/sG5xFUBYXaCbtWiooZX5Md376QjJqgH4VsVyXrbVNHO2O4NYcmjfVg==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/number": "1.1.2", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-effect-event": "0.0.3", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -5563,20 +4362,20 @@ } }, "node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", - "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.5.tgz", + "integrity": "sha512-fVuA82u0b/fClpbEJv8yp1nU9eSvoSEOERsU/hhf3FXGPIvkmE7oEaHEu8poowoXO39/Va7zq2E0TUcYr1dBRg==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-effect-event": "0.0.3", + "@radix-ui/react-use-is-hydrated": "0.1.1" }, "peerDependencies": { "@types/react": "*", @@ -5594,24 +4393,24 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.16.tgz", - "integrity": "sha512-8brVpAU5Uq7Bh0c8EFc4ZTf2JJTYn0o+1L+CUJB3UYIOkTjKGMgoHvduylrahdmNlr3DfH0rFq2DrbNZXgaspw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.17.tgz", + "integrity": "sha512-/YSAOdJ7YJvdn7bn5sdSx2egW+SKY+u7O5RyAVs94Ymrg2fg5QTSFPMRkzvhGyFuE4/qsmPBdrwYoZMZh/4f+g==", "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.12", + "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.9", + "@radix-ui/react-focus-scope": "1.1.10", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.0", - "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-popper": "1.3.1", + "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" @@ -5631,170 +4430,18 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-arrow": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.9.tgz", - "integrity": "sha512-yqHW5WQ/cTpU/un7dqqIKNy2iRU8BC0JB78PEzTfCCYvZu1U6W9KwObAniMk9nhSfyotKPQTYaUD/HB0f5muig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", - "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.9.tgz", - "integrity": "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.0.tgz", - "integrity": "sha512-9PB589e1aWZbrlFUHdz6WiPCL+xLZHQFX7oibqG/6Q0SwOkxDyQX9W/cyPa+sAPPKuC8cpLCpRczE5a/1DiwVQ==", + "node_modules/@radix-ui/react-popper": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.1.tgz", + "integrity": "sha512-bhnq/0DEPTi2lsOD3J5rTL65qUKHbKbhqHsmN9TMiclSXpipi651ooUKPPp6G5lF/WiHBdn1s0Wuqsn+myVAvw==", "dev": true, "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.9", + "@radix-ui/react-arrow": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-rect": "1.1.2", @@ -5816,256 +4463,15 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", - "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.12.tgz", + "integrity": "sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -6083,14 +4489,13 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", + "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -6108,13 +4513,13 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.6.tgz", + "integrity": "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", @@ -6131,74 +4536,15 @@ } } }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.9.tgz", - "integrity": "sha512-+EOkvg1Zn1vI1+fRDfRSAiJ7BWfcDAo5ASMmbqrcLZ4s4USk2FGkoHgeb2X+CkUgo2zJMiyObwf1k44CrRWsyw==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.10.tgz", + "integrity": "sha512-JYzEg60lk79PwKM27WZyKd7PW8O4OM5jOaFfRPfOyeXmMw7tLJh5kSj+CEjVTehszuwml/AdCzPGMXBTGf4BBw==", "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -6216,22 +4562,22 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", - "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.1.tgz", + "integrity": "sha512-/SSxZdKEo2Eo29FFRKd06EfFDYp8HryKg0WYg7QLXaydPzl52YfSvCH2a3QDBRdtcuwACroJT8UVjQVgOJ7P9A==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -6249,21 +4595,21 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.13.tgz", + "integrity": "sha512-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -6281,9 +4627,9 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.11.tgz", - "integrity": "sha512-DS39ziOgea75U/TrXKU2/oKp0be2jrDHnzFLvahg/0iNAT1Zq16e4Uw0WXwyXvsK+mG3BRyMb7A3NRZMDuEXtQ==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.12.tgz", + "integrity": "sha512-xuafVzQiTCLsyEjakowTdG3OgTXsmO7IdCiO77otIa+z44xoLNs9Do5eg7POFumIOCjtG6djfm6RKUKpUa/csA==", "dev": true, "license": "MIT", "dependencies": { @@ -6293,7 +4639,7 @@ "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", + "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2" }, @@ -6312,176 +4658,35 @@ } } }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.1.tgz", + "integrity": "sha512-w6eDvY78LE9ZUiNnXCA1QVK8RYN7k9galFv09kjVydJqBAgHd7Y9A6h0UJ/6DCZNGZMZrB2ohcSW1Bo9d8+wWA==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", + "@radix-ui/number": "1.1.2", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.10", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-popper": "1.3.1", + "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.6", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -6498,57 +4703,14 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.9.tgz", - "integrity": "sha512-gvgW+JV/Mbjj6darztTetnmElpQEzZrXpJvfj+dOxNAxiyHEAyUvEjjl4zxblvmjmKmi3jfPoy7ZdxzCuUBJSA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.10.tgz", + "integrity": "sha512-Y6K6jLQCVfCnTL2MEtGxDLffkhNfEfHsEg3Wa8JU+IWdn3EWbLXd3OuOfQRN7p/W/cUce1WyTk3QeuAoDBzN9g==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -6566,23 +4728,23 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", - "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.1.tgz", + "integrity": "sha512-r91WSpQucNGFKAIxT8FT0H0zyjd5tJlqObLp7LOMV4z49KoDCwjy01w3vDOU4e1wxhF9IgjYco7SB6byOW7Buw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/number": "1.1.2", + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -6600,9 +4762,9 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.5.tgz", - "integrity": "sha512-rCMO3QsIVKv5JTY5CVbo2MvO77SpEqqYc8AvRE7OWqRDOIqAKjsp+DrmnY9uc8NPdxB5E2z47HTYGeE2+NTptg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", + "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", "dev": true, "license": "MIT", "dependencies": { @@ -6618,36 +4780,20 @@ } } }, - "node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.1.tgz", + "integrity": "sha512-55bQtCnOB0BohomSHi6qvQXpJEEqUGDm6hRrM0Bph5OXwhSegqkd8IqgBAQkM1IlgUlWZIxpxRcpOEfRIgimyw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -6665,9 +4811,9 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.14.tgz", - "integrity": "sha512-D5jwp9JNuwDeCw3CYD2Fz+sSHo0droQjC8u75dJHe4aWr5q6yBiXZU+hurXnKudRgEpUkD5TsI6bjHPo5ThUxA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.15.tgz", + "integrity": "sha512-kxc9gI6/HfcU4nfMMVS3AmQK414kbU1IE6UCJmMmxjhO3cRPXOyYnmvyKD+ODt7q56nRq9l7Wovi6uaGwKgMlg==", "dev": true, "license": "MIT", "dependencies": { @@ -6676,8 +4822,8 @@ "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-roving-focus": "1.1.12", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -6695,277 +4841,25 @@ } } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-collection": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.9.tgz", - "integrity": "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.12.tgz", - "integrity": "sha512-FvgPt1bRmg8Xt2QpF7NUZW3dE0ZQHGm41dAdgT2J2GJPoIXz+9Em3NobAxf4fupcxhgHu03E5CRiU2MWvObXyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.17.tgz", + "integrity": "sha512-uL4kyyWy000pPL43fGGCV5qT6ZchCWEQZOSlkYiPwPt8Hy1iW38RjeptIvz1/SZesrW6Vn58Ct3sV7tfEfiAbw==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -6983,15 +4877,15 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", - "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.12.tgz", + "integrity": "sha512-AsAVsYNZIlRBsci7BhE+QyQeKd1h6TffJYt+lF0QQkd5OpQ3klfIByPsCb4G0h/Fq6PJwh1FYNluzBFYzhk4+w==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -7009,19 +4903,19 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", - "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.13.tgz", + "integrity": "sha512-Xb9PLtlvU66F36LiKba6dFswu6V2mDkgidO4fNSbQHQwmZ9ObxMIO17MN/LJ4aWJecVuSVLAHPZjyeMzJrgeiA==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-toggle": "1.1.12", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -7039,43 +4933,19 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", - "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.13.tgz", + "integrity": "sha512-Za1l4f6fzTkGgz/iynAMN8iaqiKff2wm2/QwiLmHPtDQreWEBrvSimgQFIekxMUdRPhILM7xdIXxuS/o/DGZag==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-toggle-group": "1.1.11" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-separator": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.13" }, "peerDependencies": { "@types/react": "*", @@ -7093,24 +4963,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.9.tgz", - "integrity": "sha512-u6F9MmTtBSLkiXNVDrtB/yPCZarM9smNswC24YYLV/M+bth6J3Gs3vlJezEoFwKZvPvxhCpUYdUnOsNG/0XOlA==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.10.tgz", + "integrity": "sha512-NlNe8D0dWEpVfXFli90IO6X07Josx/b1iu98tDnx9Xv0HT4wLIL+m2VOheMHhK7qbp2HoTBqALEFzGyZs/levw==", "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.12", + "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.0", - "@radix-ui/react-portal": "1.1.11", + "@radix-ui/react-popper": "1.3.1", + "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-slot": "1.2.5", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-visually-hidden": "1.2.5" + "@radix-ui/react-visually-hidden": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -7127,223 +4997,7 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-arrow": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.9.tgz", - "integrity": "sha512-yqHW5WQ/cTpU/un7dqqIKNy2iRU8BC0JB78PEzTfCCYvZu1U6W9KwObAniMk9nhSfyotKPQTYaUD/HB0f5muig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.12.tgz", - "integrity": "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.0.tgz", - "integrity": "sha512-9PB589e1aWZbrlFUHdz6WiPCL+xLZHQFX7oibqG/6Q0SwOkxDyQX9W/cyPa+sAPPKuC8cpLCpRczE5a/1DiwVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.9", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.11.tgz", - "integrity": "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.5.tgz", - "integrity": "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-callback-ref": { + "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", @@ -7359,7 +5013,7 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-controllable-state": { + "node_modules/@radix-ui/react-use-controllable-state": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", @@ -7379,7 +5033,7 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-effect-event": { + "node_modules/@radix-ui/react-use-effect-event": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", @@ -7398,7 +5052,7 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-escape-keydown": { + "node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", @@ -7417,7 +5071,23 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-layout-effect": { + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", + "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", @@ -7433,7 +5103,23 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-rect": { + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", + "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", @@ -7452,7 +5138,7 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-size": { + "node_modules/@radix-ui/react-use-size": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", @@ -7471,208 +5157,14 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.5.tgz", - "integrity": "sha512-tPcHNI3FajdDBFpl/Ez1m2WL0ufJqBKyHxMDBvKitopamK36WwBGOMicuMEZKkM5Wce41QxUyv6BsiqfrWBiGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.6.tgz", + "integrity": "sha512-jCE0WljWifTI4niIMCll06kGpsJTAPiZVU9H4WR1N6qW7At9ystHbN7dDB+we2xH535roFHj7qKS+RGj0FMDWQ==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", @@ -7690,9 +5182,9 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", + "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", "dev": true, "license": "MIT" }, @@ -8934,18 +6426,6 @@ "undici-types": ">=7.24.0 <7.24.7" } }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, "node_modules/@types/prismjs": { "version": "1.26.6", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", @@ -9062,14 +6542,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/verror": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", - "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -9080,29 +6552,18 @@ "@types/node": "*" } }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", - "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", + "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/type-utils": "8.60.0", - "@typescript-eslint/utils": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/type-utils": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -9115,7 +6576,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.60.0", + "@typescript-eslint/parser": "^8.61.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -9131,16 +6592,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", - "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", + "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3" }, "engines": { @@ -9156,14 +6617,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", - "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", + "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.60.0", - "@typescript-eslint/types": "^8.60.0", + "@typescript-eslint/tsconfig-utils": "^8.61.1", + "@typescript-eslint/types": "^8.61.1", "debug": "^4.4.3" }, "engines": { @@ -9178,14 +6639,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", - "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", + "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0" + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9196,9 +6657,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", - "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", + "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", "dev": true, "license": "MIT", "engines": { @@ -9213,15 +6674,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", - "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", + "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -9238,9 +6699,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", - "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", + "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", "dev": true, "license": "MIT", "engines": { @@ -9252,16 +6713,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", - "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", + "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.60.0", - "@typescript-eslint/tsconfig-utils": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/project-service": "8.61.1", + "@typescript-eslint/tsconfig-utils": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -9280,16 +6741,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", - "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", + "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0" + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9304,13 +6765,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", - "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", + "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/types": "8.61.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -9710,13 +7171,6 @@ "addons/*" ] }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, "node_modules/abbrev": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", @@ -9811,16 +7265,6 @@ } } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-escapes": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", @@ -9865,40 +7309,36 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/app-builder-bin": { - "version": "5.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", - "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", - "dev": true, - "license": "MIT" - }, "node_modules/app-builder-lib": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", - "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", "dev": true, "license": "MIT", "dependencies": { - "@develar/schema-utils": "~2.6.5", "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", - "@electron/rebuild": "^4.0.3", + "@electron/rebuild": "^4.0.4", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", "async-exit-hook": "^2.0.1", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "26.8.1", + "electron-publish": "26.15.3", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", @@ -9906,7 +7346,8 @@ "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^10.0.3", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", "plist": "3.1.0", "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", @@ -9914,14 +7355,15 @@ "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", "which": "^5.0.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "26.8.1", - "electron-builder-squirrel-windows": "26.8.1" + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" } }, "node_modules/app-builder-lib/node_modules/@electron/notarize": { @@ -10074,6 +7516,21 @@ "safer-buffer": "~2.1.0" } }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -10122,17 +7579,6 @@ "dev": true, "license": "MIT" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -10166,10 +7612,17 @@ "node": ">= 4.0.0" } }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, "node_modules/axios": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", - "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", + "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", @@ -10400,9 +7853,9 @@ } }, "node_modules/better-sqlite3": { - "version": "12.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.10.0.tgz", - "integrity": "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==", + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", + "integrity": "sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -10432,21 +7885,28 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^1.0.5", + "content-type": "^2.0.0", "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" }, "engines": { "node": ">=18" @@ -10456,6 +7916,19 @@ "url": "https://opencollective.com/express" } }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/brace-expansion": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", @@ -10503,42 +7976,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -10561,16 +7998,14 @@ } }, "node_modules/builder-util": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", - "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", "dev": true, "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.12", - "builder-util-runtime": "9.5.1", + "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", @@ -10583,12 +8018,15 @@ "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/builder-util-runtime": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", - "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", "dev": true, "license": "MIT", "dependencies": { @@ -10649,6 +8087,16 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -10868,24 +8316,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -11352,17 +8782,6 @@ "node": ">=10.0.0" } }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -11414,9 +8833,9 @@ "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.33.4", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.4.tgz", - "integrity": "sha512-HIN5Pmd9MrX9BkV7tDwnOcEJCSFvCpc8X97h3f508J6I5FsqAY65wKOCvgH2CuP42CaahWaz4tuh32SOOIH7ww==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz", + "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==", "dev": true, "license": "MIT", "engines": { @@ -11622,88 +9041,18 @@ } }, "node_modules/dmg-builder": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", - "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" } }, - "node_modules/dmg-builder/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dmg-license/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/dmg-license/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", @@ -11915,6 +9264,16 @@ "node": ">= 0.4" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -11947,15 +9306,15 @@ } }, "node_modules/electron": { - "version": "42.2.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-42.2.0.tgz", - "integrity": "sha512-b2Tc7sIKiZEl0tBVwFM5GJ+FT5KYhmy9QJHjx8BGVZPVW2SctXWEvrE959ElB56qw7H05dBkhlikDA1DmpaAMw==", + "version": "42.4.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-42.4.1.tgz", + "integrity": "sha512-8CYHJP5O4wFO+ycoJR98yy907MmPeo+vWXrzjxmGGgRNKqv8pOjjm+wphO0CCgQJnBU7+QUPSJS4QXhbKrO50w==", "dev": true, "license": "MIT", "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", "@electron/get": "^5.0.0", - "@types/node": "^24.9.0", - "extract-zip": "^2.0.1" + "@types/node": "^24.9.0" }, "bin": { "electron": "cli.js", @@ -11966,18 +9325,18 @@ } }, "node_modules/electron-builder": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", - "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", - "dmg-builder": "26.8.1", + "dmg-builder": "26.15.3", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", @@ -12022,15 +9381,16 @@ } }, "node_modules/electron-publish": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", - "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", "dev": true, "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "form-data": "^4.0.5", "fs-extra": "^10.1.0", @@ -12688,27 +10048,6 @@ "dev": true, "license": "MIT" }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, "node_modules/extsprintf": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", @@ -12776,16 +10115,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -13175,22 +10504,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/git-raw-commits": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", @@ -13653,24 +10966,6 @@ "@babel/runtime": "^7.23.2" } }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -13687,28 +10982,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause", - "optional": true - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -14997,9 +12270,9 @@ } }, "node_modules/lucide-react": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.16.0.tgz", - "integrity": "sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.20.0.tgz", + "integrity": "sha512-jhXLeC/7m0/tjL1nzMdKk6x256zWA6AtbhTVreHOiKPoeX2d6MK4FbyIQPpVq0E6iPWBisyy1TW+pEge/uMEuQ==", "dev": true, "license": "ISC", "peerDependencies": { @@ -16227,9 +13500,9 @@ "license": "MIT" }, "node_modules/multer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", - "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.2.0.tgz", + "integrity": "sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -16359,14 +13632,6 @@ "node": ">=22.12.0" } }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/node-api-version": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", @@ -16438,6 +13703,13 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.46", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", @@ -16800,13 +14072,6 @@ "url": "https://github.com/sponsors/jet2jet" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -16827,6 +14092,37 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -17157,6 +14453,26 @@ "node": ">=6" } }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -17338,454 +14654,67 @@ } }, "node_modules/radix-ui": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", - "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.0.tgz", + "integrity": "sha512-EUEC70O03EgxWMP5aoqfBZ6iLC5bczFagGy7zhSYRt8o5DP7IWNiP3ywetse3L9b8843ExB0OGWZvgbYVJuNeg==", "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-accessible-icon": "1.1.7", - "@radix-ui/react-accordion": "1.2.12", - "@radix-ui/react-alert-dialog": "1.1.15", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-aspect-ratio": "1.1.7", - "@radix-ui/react-avatar": "1.1.10", - "@radix-ui/react-checkbox": "1.3.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-context-menu": "2.2.16", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-dropdown-menu": "2.1.16", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-form": "0.1.8", - "@radix-ui/react-hover-card": "1.1.15", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-menubar": "1.1.16", - "@radix-ui/react-navigation-menu": "1.2.14", - "@radix-ui/react-one-time-password-field": "0.1.8", - "@radix-ui/react-password-toggle-field": "0.1.3", - "@radix-ui/react-popover": "1.1.15", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-progress": "1.1.7", - "@radix-ui/react-radio-group": "1.3.8", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-scroll-area": "1.2.10", - "@radix-ui/react-select": "2.2.6", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-slider": "1.3.6", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-switch": "1.2.6", - "@radix-ui/react-tabs": "1.1.13", - "@radix-ui/react-toast": "1.2.15", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-toggle-group": "1.1.11", - "@radix-ui/react-toolbar": "1.1.11", - "@radix-ui/react-tooltip": "1.2.8", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-escape-keydown": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-accessible-icon": "1.1.10", + "@radix-ui/react-accordion": "1.2.14", + "@radix-ui/react-alert-dialog": "1.1.17", + "@radix-ui/react-arrow": "1.1.10", + "@radix-ui/react-aspect-ratio": "1.1.10", + "@radix-ui/react-avatar": "1.2.0", + "@radix-ui/react-checkbox": "1.3.5", + "@radix-ui/react-collapsible": "1.1.14", + "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context-menu": "2.3.1", + "@radix-ui/react-dialog": "1.1.17", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-dropdown-menu": "2.1.18", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.10", + "@radix-ui/react-form": "0.1.10", + "@radix-ui/react-hover-card": "1.1.17", + "@radix-ui/react-label": "2.1.10", + "@radix-ui/react-menu": "2.1.18", + "@radix-ui/react-menubar": "1.1.18", + "@radix-ui/react-navigation-menu": "1.2.16", + "@radix-ui/react-one-time-password-field": "0.1.10", + "@radix-ui/react-password-toggle-field": "0.1.5", + "@radix-ui/react-popover": "1.1.17", + "@radix-ui/react-popper": "1.3.1", + "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-progress": "1.1.10", + "@radix-ui/react-radio-group": "1.4.1", + "@radix-ui/react-roving-focus": "1.1.13", + "@radix-ui/react-scroll-area": "1.2.12", + "@radix-ui/react-select": "2.3.1", + "@radix-ui/react-separator": "1.1.10", + "@radix-ui/react-slider": "1.4.1", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-switch": "1.3.1", + "@radix-ui/react-tabs": "1.1.15", + "@radix-ui/react-toast": "1.2.17", + "@radix-ui/react-toggle": "1.1.12", + "@radix-ui/react-toggle-group": "1.1.13", + "@radix-ui/react-toolbar": "1.1.13", + "@radix-ui/react-tooltip": "1.2.10", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-effect-event": "0.0.3", + "@radix-ui/react-use-escape-keydown": "1.1.2", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-size": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -17912,9 +14841,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.76.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.76.1.tgz", - "integrity": "sha512-rYM7tPiWlu3nZchkR/ex7piyzui2vFPyaLnXnI/RnblB/L4qfMmyses8llJVtF1NpE9WBBsJlGtcSZzPCXW1qQ==", + "version": "7.79.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz", + "integrity": "sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==", "dev": true, "license": "MIT", "engines": { @@ -18494,9 +15423,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -18569,48 +15498,48 @@ "license": "ISC" }, "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.1.tgz", + "integrity": "sha512-lW979AMi+ESidzMv/Lnv+F9bknzLyxLqFI05Sm433vOeRcltgxQmXpnfOOFIAlKtwXU/ksupm2srQoFCkR214g==", "dev": true, - "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@img/colour": "^1.0.0", + "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", - "semver": "^7.7.3" + "semver": "^7.8.4" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" + "@img/sharp-darwin-arm64": "0.35.1", + "@img/sharp-darwin-x64": "0.35.1", + "@img/sharp-freebsd-wasm32": "0.35.1", + "@img/sharp-libvips-darwin-arm64": "1.3.0", + "@img/sharp-libvips-darwin-x64": "1.3.0", + "@img/sharp-libvips-linux-arm": "1.3.0", + "@img/sharp-libvips-linux-arm64": "1.3.0", + "@img/sharp-libvips-linux-ppc64": "1.3.0", + "@img/sharp-libvips-linux-riscv64": "1.3.0", + "@img/sharp-libvips-linux-s390x": "1.3.0", + "@img/sharp-libvips-linux-x64": "1.3.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.0", + "@img/sharp-libvips-linuxmusl-x64": "1.3.0", + "@img/sharp-linux-arm": "0.35.1", + "@img/sharp-linux-arm64": "0.35.1", + "@img/sharp-linux-ppc64": "0.35.1", + "@img/sharp-linux-riscv64": "0.35.1", + "@img/sharp-linux-s390x": "0.35.1", + "@img/sharp-linux-x64": "0.35.1", + "@img/sharp-linuxmusl-arm64": "0.35.1", + "@img/sharp-linuxmusl-x64": "0.35.1", + "@img/sharp-webcontainers-wasm32": "0.35.1", + "@img/sharp-win32-arm64": "0.35.1", + "@img/sharp-win32-ia32": "0.35.1", + "@img/sharp-win32-x64": "0.35.1" } }, "node_modules/shebang-command": { @@ -18814,22 +15743,6 @@ "node": ">=18" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -19399,9 +16312,9 @@ "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-5sJPdPjfI5Kx+qbrDesxkglRBxW//g7hCsqspEjwkewGvBMGIKMOTKzLt1hFVJzyadba3lDUN20O9qhvbQUSTA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, "license": "MIT", "engines": { @@ -19617,16 +16530,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz", - "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", + "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.60.0", - "@typescript-eslint/parser": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/utils": "8.60.0" + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -19641,9 +16554,9 @@ } }, "node_modules/undici": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.4.0.tgz", - "integrity": "sha512-tDR4LgFBeV7YBWOFMlmbhtrnFVWuZ6HKbkG+88/csQdhK2tPlW78PnLI2VRjIQtTlslvgSZ4R43WBE+4g6rhng==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.5.0.tgz", + "integrity": "sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==", "license": "MIT", "engines": { "node": ">=22.19.0" @@ -19767,6 +16680,35 @@ "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -20190,6 +17132,20 @@ "loose-envify": "^1.0.0" } }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, "node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -20432,17 +17388,6 @@ "node": ">=12" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 83d6cbed..f8efb547 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "termix", "private": true, - "version": "2.4.0", + "version": "2.4.1", "description": "Self-hosted SSH and remote desktop management.", "author": "Karmaa", "main": "electron/main.cjs", @@ -42,10 +42,10 @@ }, "dependencies": { "@types/ldapjs": "^3.0.6", - "axios": "^1.17.0", + "axios": "^1.18.0", "bcryptjs": "^3.0.3", - "better-sqlite3": "^12.9.0", - "body-parser": "^2.2.2", + "better-sqlite3": "^12.11.1", + "body-parser": "^2.3.0", "chalk": "^5.6.2", "cookie-parser": "^1.4.7", "cors": "^2.8.6", @@ -59,13 +59,13 @@ "jszip": "^3.10.1", "ldapjs": "^3.0.7", "motion": "^12.38.0", - "multer": "^2.1.1", + "multer": "^2.2.0", "nanoid": "^5.1.9", "qrcode": "^1.5.4", "socks": "^2.8.7", "speakeasy": "^2.0.0", "ssh2": "^1.17.0", - "undici": "^8.4.0", + "undici": "^8.5.0", "ws": "^8.20.0" }, "devDependencies": { @@ -81,6 +81,9 @@ "@electron/rebuild": "^4.0.4", "@eslint/js": "^9.0.0", "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@fontsource/fira-code": "^5.2.7", + "@fontsource/jetbrains-mono": "^5.2.8", + "@fontsource/source-code-pro": "^5.2.7", "@monaco-editor/react": "^4.7.0", "@radix-ui/react-accordion": "^1.2.13", "@radix-ui/react-alert-dialog": "^1.1.16", @@ -91,11 +94,11 @@ "@radix-ui/react-popover": "^1.1.16", "@radix-ui/react-progress": "^1.1.9", "@radix-ui/react-scroll-area": "^1.2.11", - "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-select": "^2.3.1", "@radix-ui/react-separator": "^1.1.9", - "@radix-ui/react-slider": "^1.3.6", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-slider": "^1.4.1", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-switch": "^1.3.1", "@radix-ui/react-tabs": "^1.1.14", "@radix-ui/react-tooltip": "^1.2.9", "@tailwindcss/vite": "^4.2.4", @@ -133,9 +136,9 @@ "clsx": "^2.1.1", "cmdk": "^1.1.1", "concurrently": "^9.2.1", - "cytoscape": "^3.33.2", - "electron": "^42.2.0", - "electron-builder": "^26.8.1", + "cytoscape": "^3.34.0", + "electron": "^42.4.1", + "electron-builder": "^26.15.3", "eslint": "^9.0.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", @@ -147,14 +150,14 @@ "i18next-browser-languagedetector": "^8.2.1", "jsdom": "^29.1.1", "lint-staged": "^17.0.7", - "lucide-react": "^1.11.0", + "lucide-react": "^1.20.0", "prettier": "3.8.3", - "radix-ui": "^1.4.3", + "radix-ui": "^1.6.0", "react": "^19.2.7", "react-cytoscapejs": "^2.0.0", "react-dom": "^19.2.7", "react-h5-audio-player": "^3.10.2", - "react-hook-form": "^7.73.1", + "react-hook-form": "^7.79.0", "react-i18next": "^17.0.4", "react-icons": "^5.6.0", "react-markdown": "^10.1.0", @@ -163,13 +166,13 @@ "react-syntax-highlighter": "^16.1.1", "react-xtermjs": "^1.0.10", "remark-gfm": "^4.0.1", - "sharp": "^0.34.5", + "sharp": "^0.35.1", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", "tailwindcss": "^4.2.4", "tw-animate-css": "^1.4.0", "typescript": "~6.0.3", - "typescript-eslint": "^8.59.0", + "typescript-eslint": "^8.61.1", "vite": "^8.0.16", "vite-plugin-svgr": "^5.2.0", "vitest": "^4.1.8" diff --git a/src/backend/dashboard.ts b/src/backend/dashboard.ts index 98814fa2..70733745 100644 --- a/src/backend/dashboard.ts +++ b/src/backend/dashboard.ts @@ -2,12 +2,18 @@ import express from "express"; import cookieParser from "cookie-parser"; import { createCorsMiddleware } from "./utils/cors-config.js"; import { getDb } from "./database/db/index.js"; -import { recentActivity, hosts, hostAccess } from "./database/db/schema.js"; -import { eq, and, desc, inArray } from "drizzle-orm"; +import { + recentActivity, + hosts, + hostAccess, + userRoles, +} from "./database/db/schema.js"; +import { eq, and, desc, inArray, or, isNull, gte, sql } from "drizzle-orm"; import { dashboardLogger } from "./utils/logger.js"; import { SimpleDBOps } from "./utils/simple-db-ops.js"; import { AuthManager } from "./utils/auth-manager.js"; import type { AuthenticatedRequest } from "../types/index.js"; +import { dashboardServiceLinksRouter } from "./database/routes/dashboard-service-links-routes.js"; const app = express(); const authManager = AuthManager.getInstance(); @@ -227,11 +233,30 @@ app.post("/activity/log", async (req, res) => { ); if (ownedHosts.length === 0) { + const userRoleIds = await getDb() + .select({ roleId: userRoles.roleId }) + .from(userRoles) + .where(eq(userRoles.userId, userId)); + const roleIds = userRoleIds.map((r) => r.roleId); + + const now = new Date().toISOString(); const sharedHosts = await getDb() .select() .from(hostAccess) .where( - and(eq(hostAccess.hostId, hostId), eq(hostAccess.userId, userId)), + and( + eq(hostAccess.hostId, hostId), + or( + eq(hostAccess.userId, userId), + roleIds.length > 0 + ? sql`${hostAccess.roleId} IN (${sql.join( + roleIds.map((id) => sql`${id}`), + sql`, `, + )})` + : sql`false`, + ), + or(isNull(hostAccess.expiresAt), gte(hostAccess.expiresAt, now)), + ), ); if (sharedHosts.length === 0) { @@ -349,6 +374,8 @@ app.delete("/activity/reset", async (req, res) => { } }); +app.use("/service-links", dashboardServiceLinksRouter); + const PORT = 30006; app.listen(PORT, async () => { try { diff --git a/src/backend/database/database.ts b/src/backend/database/database.ts index b8a0fd1f..2d93745c 100644 --- a/src/backend/database/database.ts +++ b/src/backend/database/database.ts @@ -1832,7 +1832,11 @@ if (frontendDist) { ); app.use((req, res, next) => { - if (req.method === "GET" && req.accepts("html")) { + if ( + req.method === "GET" && + req.accepts("html") && + !req.headers.authorization + ) { res.setHeader( "Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0", diff --git a/src/backend/database/db/index.ts b/src/backend/database/db/index.ts index aaa27e02..961062f0 100644 --- a/src/backend/database/db/index.ts +++ b/src/backend/database/db/index.ts @@ -694,6 +694,7 @@ const migrateSchema = () => { addColumnIfNotExists("user_preferences", "disable_update_check", "INTEGER"); addColumnIfNotExists("user_preferences", "confirm_tab_close", "INTEGER"); addColumnIfNotExists("user_preferences", "hidden_rail_tabs", "TEXT"); + addColumnIfNotExists("user_preferences", "compact_host_view", "INTEGER"); addColumnIfNotExists("users", "is_admin", "INTEGER NOT NULL DEFAULT 0"); @@ -753,6 +754,11 @@ const migrateSchema = () => { "enable_file_manager", "INTEGER NOT NULL DEFAULT 1", ); + addColumnIfNotExists( + "ssh_data", + "scp_legacy", + "INTEGER NOT NULL DEFAULT 0", + ); addColumnIfNotExists("ssh_data", "default_path", "TEXT"); addColumnIfNotExists( "ssh_data", @@ -1197,6 +1203,14 @@ const migrateSchema = () => { { column: "vnc_user", sql: "ALTER TABLE ssh_data ADD COLUMN vnc_user TEXT" }, { column: "telnet_user", sql: "ALTER TABLE ssh_data ADD COLUMN telnet_user TEXT" }, { column: "telnet_password", sql: "ALTER TABLE ssh_data ADD COLUMN telnet_password TEXT" }, + { column: "rdp_credential_id", sql: "ALTER TABLE ssh_data ADD COLUMN rdp_credential_id INTEGER REFERENCES ssh_credentials(id) ON DELETE SET NULL" }, + { column: "vnc_credential_id", sql: "ALTER TABLE ssh_data ADD COLUMN vnc_credential_id INTEGER REFERENCES ssh_credentials(id) ON DELETE SET NULL" }, + { column: "wol_broadcast_address", sql: "ALTER TABLE ssh_data ADD COLUMN wol_broadcast_address TEXT" }, + { column: "use_warpgate", sql: "ALTER TABLE ssh_data ADD COLUMN use_warpgate INTEGER NOT NULL DEFAULT 0" }, + { column: "telnet_credential_id", sql: "ALTER TABLE ssh_data ADD COLUMN telnet_credential_id INTEGER REFERENCES ssh_credentials(id) ON DELETE SET NULL" }, + { column: "rdp_auth_type", sql: "ALTER TABLE ssh_data ADD COLUMN rdp_auth_type TEXT" }, + { column: "vnc_auth_type", sql: "ALTER TABLE ssh_data ADD COLUMN vnc_auth_type TEXT" }, + { column: "telnet_auth_type", sql: "ALTER TABLE ssh_data ADD COLUMN telnet_auth_type TEXT" }, ]; for (const migration of sshDataMigrations) { @@ -1214,6 +1228,23 @@ const migrateSchema = () => { } } + // Migrate legacy authType="warpgate" hosts to useWarpgate=1 with authType="none" + try { + const result = sqlite + .prepare("UPDATE ssh_data SET use_warpgate = 1, auth_type = 'none' WHERE auth_type = 'warpgate'") + .run(); + if (result.changes > 0) { + databaseLogger.info(`Migrated ${result.changes} host(s) from authType='warpgate' to useWarpgate=true`, { + operation: "warpgate_auth_migration", + }); + } + } catch (e) { + databaseLogger.warn("Failed to migrate legacy warpgate authType hosts", { + operation: "warpgate_auth_migration", + error: e, + }); + } + // Copy unencrypted username/domain into protocol-specific columns for old guac hosts. // Passwords are handled via the legacy field name fallback in lazy-field-encryption.ts. const usernameDomainBackfills = [ diff --git a/src/backend/database/db/schema.ts b/src/backend/database/db/schema.ts index a900968e..4e72535d 100644 --- a/src/backend/database/db/schema.ts +++ b/src/backend/database/db/schema.ts @@ -94,6 +94,7 @@ export const hosts = sqliteTable("ssh_data", { tags: text("tags"), pin: integer("pin", { mode: "boolean" }).notNull().default(false), authType: text("auth_type").notNull(), + useWarpgate: integer("use_warpgate", { mode: "boolean" }).notNull().default(false), forceKeyboardInteractive: text("force_keyboard_interactive"), password: text("password"), @@ -127,6 +128,7 @@ export const hosts = sqliteTable("ssh_data", { enableFileManager: integer("enable_file_manager", { mode: "boolean" }) .notNull() .default(true), + scpLegacy: integer("scp_legacy", { mode: "boolean" }).notNull().default(false), enableDocker: integer("enable_docker", { mode: "boolean" }) .notNull() .default(false), @@ -168,17 +170,24 @@ export const hosts = sqliteTable("ssh_data", { vncPort: integer("vnc_port").default(5900), telnetPort: integer("telnet_port").default(23), + rdpCredentialId: integer("rdp_credential_id").references(() => sshCredentials.id, { onDelete: "set null" }), rdpUser: text("rdp_user"), rdpPassword: text("rdp_password"), rdpDomain: text("rdp_domain"), rdpSecurity: text("rdp_security"), rdpIgnoreCert: integer("rdp_ignore_cert", { mode: "boolean" }).default(false), + vncCredentialId: integer("vnc_credential_id").references(() => sshCredentials.id, { onDelete: "set null" }), vncPassword: text("vnc_password"), vncUser: text("vnc_user"), telnetUser: text("telnet_user"), telnetPassword: text("telnet_password"), + telnetCredentialId: integer("telnet_credential_id").references(() => sshCredentials.id, { onDelete: "set null" }), + + rdpAuthType: text("rdp_auth_type"), + vncAuthType: text("vnc_auth_type"), + telnetAuthType: text("telnet_auth_type"), domain: text("domain"), security: text("security"), @@ -193,6 +202,7 @@ export const hosts = sqliteTable("ssh_data", { socks5ProxyChain: text("socks5_proxy_chain"), macAddress: text("mac_address"), + wolBroadcastAddress: text("wol_broadcast_address"), portKnockSequence: text("port_knock_sequence"), hostKeyFingerprint: text("host_key_fingerprint"), @@ -705,6 +715,8 @@ export const userPreferences = sqliteTable("user_preferences", { disableUpdateCheck: integer("disable_update_check", { mode: "boolean" }), confirmTabClose: integer("confirm_tab_close", { mode: "boolean" }), hiddenRailTabs: text("hidden_rail_tabs"), + compactHostView: integer("compact_host_view", { mode: "boolean" }), + statusColorScheme: text("status_color_scheme"), updatedAt: text("updated_at") .notNull() .default(sql`CURRENT_TIMESTAMP`), @@ -763,6 +775,19 @@ export const hostHealthHistory = sqliteTable("host_health_history", { detail: text("detail"), }); +export const dashboardServiceLinks = sqliteTable("dashboard_service_links", { + id: integer("id").primaryKey({ autoIncrement: true }), + userId: text("user_id") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + label: text("label").notNull(), + url: text("url").notNull(), + order: integer("order").notNull().default(0), + createdAt: text("created_at") + .notNull() + .default(sql`CURRENT_TIMESTAMP`), +}); + // --- tmux-monitor begin --- export const tmuxSessionTags = sqliteTable("tmux_session_tags", { id: integer("id").primaryKey({ autoIncrement: true }), diff --git a/src/backend/database/routes/acme-ssl-routes.ts b/src/backend/database/routes/acme-ssl-routes.ts new file mode 100644 index 00000000..0fcf286b --- /dev/null +++ b/src/backend/database/routes/acme-ssl-routes.ts @@ -0,0 +1,399 @@ +import { execSync } from "child_process"; +import { promises as fs } from "fs"; +import path from "path"; +import type { AuthenticatedRequest } from "../../../types/index.js"; +import type { RequestHandler, Router } from "express"; +import { eq } from "drizzle-orm"; +import { authLogger } from "../../utils/logger.js"; +import { db } from "../db/index.js"; +import { users } from "../db/schema.js"; +import { logAudit, getRequestMeta } from "../../utils/audit-logger.js"; + +const DATA_DIR = process.env.DATA_DIR || "./db/data"; +const SSL_DIR = path.join(DATA_DIR, "ssl"); +const ACME_WEBROOT = path.join(DATA_DIR, "acme-webroot"); +const CLOUDFLARE_CREDENTIALS_FILE = path.join( + DATA_DIR, + "ssl", + "cloudflare.ini", +); + +export type AcmeSettings = { + enabled: boolean; + domain: string; + email: string; + challengeType: "http-webroot" | "dns-cloudflare"; + cloudflareToken: string; + lastIssuedAt: string | null; + certStatus: "none" | "valid" | "expiring" | "expired"; + certExpiresAt: string | null; +}; + +function getCertInfo(): { + status: "none" | "valid" | "expiring" | "expired"; + expiresAt: string | null; +} { + const certFile = path.join(SSL_DIR, "termix.crt"); + try { + execSync(`openssl x509 -in "${certFile}" -noout 2>/dev/null`, { + stdio: "pipe", + }); + } catch { + return { status: "none", expiresAt: null }; + } + + try { + const endDateRaw = execSync( + `openssl x509 -in "${certFile}" -noout -enddate`, + { stdio: "pipe" }, + ) + .toString() + .trim() + .replace("notAfter=", ""); + const expiresAt = new Date(endDateRaw).toISOString(); + + try { + execSync(`openssl x509 -in "${certFile}" -checkend 0 -noout`, { + stdio: "pipe", + }); + } catch { + return { status: "expired", expiresAt }; + } + + try { + execSync(`openssl x509 -in "${certFile}" -checkend 2592000 -noout`, { + stdio: "pipe", + }); + return { status: "valid", expiresAt }; + } catch { + return { status: "expiring", expiresAt }; + } + } catch { + return { status: "none", expiresAt: null }; + } +} + +function getAcmeSettingsFromDb(): AcmeSettings { + const row = db.$client + .prepare("SELECT value FROM settings WHERE key = 'acme_ssl_settings'") + .get() as { value: string } | undefined; + + const { status, expiresAt } = getCertInfo(); + const stored = row ? JSON.parse(row.value) : {}; + + return { + enabled: stored.enabled ?? false, + domain: stored.domain ?? "", + email: stored.email ?? "", + challengeType: stored.challengeType ?? "http-webroot", + cloudflareToken: stored.cloudflareToken + ? `${stored.cloudflareToken.slice(0, 4)}${"*".repeat(Math.max(0, stored.cloudflareToken.length - 4))}` + : "", + lastIssuedAt: stored.lastIssuedAt ?? null, + certStatus: status, + certExpiresAt: expiresAt, + }; +} + +export function registerAcmeSSLRoutes( + router: Router, + authenticateJWT: RequestHandler, +): void { + /** + * @openapi + * /users/acme-ssl-settings: + * get: + * summary: Get ACME SSL settings + * description: Returns current ACME/Let's Encrypt configuration and certificate status. + * tags: + * - Users + * responses: + * 200: + * description: ACME SSL settings and certificate status. + * 500: + * description: Failed to get ACME SSL settings. + */ + router.get("/acme-ssl-settings", authenticateJWT, async (_req, res) => { + try { + res.json(getAcmeSettingsFromDb()); + } catch (err) { + authLogger.error("Failed to get ACME SSL settings", err); + res.status(500).json({ error: "Failed to get ACME SSL settings" }); + } + }); + + /** + * @openapi + * /users/acme-ssl-settings: + * patch: + * summary: Update ACME SSL settings (admin only) + * description: Saves ACME/Let's Encrypt configuration. + * tags: + * - Users + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * enabled: + * type: boolean + * domain: + * type: string + * email: + * type: string + * challengeType: + * type: string + * enum: [http-webroot, dns-cloudflare] + * cloudflareToken: + * type: string + * responses: + * 200: + * description: ACME SSL settings updated. + * 403: + * description: Not authorized. + * 500: + * description: Failed to update ACME SSL settings. + */ + router.patch("/acme-ssl-settings", authenticateJWT, async (req, res) => { + const userId = (req as AuthenticatedRequest).userId; + try { + const user = await db.select().from(users).where(eq(users.id, userId)); + if (!user || user.length === 0 || !user[0].isAdmin) { + return res.status(403).json({ error: "Not authorized" }); + } + + const existing = db.$client + .prepare("SELECT value FROM settings WHERE key = 'acme_ssl_settings'") + .get() as { value: string } | undefined; + const current = existing ? JSON.parse(existing.value) : {}; + + const { enabled, domain, email, challengeType, cloudflareToken } = + req.body; + + const updated = { + ...current, + ...(typeof enabled === "boolean" && { enabled }), + ...(typeof domain === "string" && { domain }), + ...(typeof email === "string" && { email }), + ...(typeof challengeType === "string" && { challengeType }), + ...(typeof cloudflareToken === "string" && + cloudflareToken && + !cloudflareToken.includes("*") && { cloudflareToken }), + }; + + db.$client + .prepare( + "INSERT OR REPLACE INTO settings (key, value) VALUES ('acme_ssl_settings', ?)", + ) + .run(JSON.stringify(updated)); + + const { ipAddress, userAgent } = getRequestMeta(req); + const actorRecord = await db + .select({ username: users.username }) + .from(users) + .where(eq(users.id, userId)) + .limit(1); + await logAudit({ + userId, + username: actorRecord[0]?.username ?? userId, + action: "update_acme_ssl_settings", + resourceType: "setting", + details: JSON.stringify({ + enabled, + domain, + email, + challengeType, + hasCloudflareToken: !!updated.cloudflareToken, + }), + ipAddress, + userAgent, + success: true, + }); + + res.json(getAcmeSettingsFromDb()); + } catch (err) { + authLogger.error("Failed to update ACME SSL settings", err); + res.status(500).json({ error: "Failed to update ACME SSL settings" }); + } + }); + + /** + * @openapi + * /users/acme-ssl-request: + * post: + * summary: Request or renew Let's Encrypt certificate (admin only) + * description: Triggers certbot to issue or renew a certificate using the configured challenge method. + * tags: + * - Users + * responses: + * 200: + * description: Certificate issued or renewed successfully. + * 400: + * description: Invalid configuration. + * 403: + * description: Not authorized. + * 500: + * description: Certificate issuance failed. + */ + router.post("/acme-ssl-request", authenticateJWT, async (req, res) => { + const userId = (req as AuthenticatedRequest).userId; + try { + const user = await db.select().from(users).where(eq(users.id, userId)); + if (!user || user.length === 0 || !user[0].isAdmin) { + return res.status(403).json({ error: "Not authorized" }); + } + + const row = db.$client + .prepare("SELECT value FROM settings WHERE key = 'acme_ssl_settings'") + .get() as { value: string } | undefined; + + if (!row) { + return res.status(400).json({ error: "ACME settings not configured" }); + } + + const settings = JSON.parse(row.value); + const { domain, email, challengeType, cloudflareToken } = settings; + + if (!domain || !email) { + return res.status(400).json({ error: "Domain and email are required" }); + } + + try { + execSync("certbot --version", { stdio: "pipe" }); + } catch { + return res + .status(500) + .json({ error: "certbot is not available in this environment" }); + } + + await fs.mkdir(SSL_DIR, { recursive: true }); + await fs.mkdir(ACME_WEBROOT, { recursive: true }); + + let certbotCmd: string; + + if (challengeType === "dns-cloudflare") { + if (!cloudflareToken) { + return res.status(400).json({ + error: "Cloudflare API token is required for DNS challenge", + }); + } + + await fs.mkdir(path.dirname(CLOUDFLARE_CREDENTIALS_FILE), { + recursive: true, + }); + await fs.writeFile( + CLOUDFLARE_CREDENTIALS_FILE, + `dns_cloudflare_api_token = ${cloudflareToken}\n`, + { mode: 0o600 }, + ); + + certbotCmd = [ + "certbot", + "certonly", + "--non-interactive", + "--agree-tos", + "--dns-cloudflare", + `--dns-cloudflare-credentials "${CLOUDFLARE_CREDENTIALS_FILE}"`, + "--dns-cloudflare-propagation-seconds", + "30", + "-d", + `"${domain}"`, + "--email", + `"${email}"`, + "--cert-name", + "termix", + ].join(" "); + } else { + certbotCmd = [ + "certbot", + "certonly", + "--non-interactive", + "--agree-tos", + "--webroot", + "-w", + `"${ACME_WEBROOT}"`, + "-d", + `"${domain}"`, + "--email", + `"${email}"`, + "--cert-name", + "termix", + ].join(" "); + } + + authLogger.info("Requesting Let's Encrypt certificate", { + domain, + challengeType, + operation: "acme_cert_request", + }); + + execSync(certbotCmd, { stdio: "pipe", timeout: 120000 }); + + const liveDir = `/etc/letsencrypt/live/termix`; + const fullchainSrc = path.join(liveDir, "fullchain.pem"); + const privkeySrc = path.join(liveDir, "privkey.pem"); + const certDest = path.join(SSL_DIR, "termix.crt"); + const keyDest = path.join(SSL_DIR, "termix.key"); + + await fs.copyFile(fullchainSrc, certDest); + await fs.copyFile(privkeySrc, keyDest); + await fs.chmod(keyDest, 0o600); + await fs.chmod(certDest, 0o644); + + const updated = { ...settings, lastIssuedAt: new Date().toISOString() }; + db.$client + .prepare( + "INSERT OR REPLACE INTO settings (key, value) VALUES ('acme_ssl_settings', ?)", + ) + .run(JSON.stringify(updated)); + + authLogger.info("Let's Encrypt certificate issued and installed", { + domain, + operation: "acme_cert_installed", + }); + + const { ipAddress, userAgent } = getRequestMeta(req); + const actorRecord = await db + .select({ username: users.username }) + .from(users) + .where(eq(users.id, userId)) + .limit(1); + await logAudit({ + userId, + username: actorRecord[0]?.username ?? userId, + action: "acme_ssl_request", + resourceType: "setting", + details: JSON.stringify({ domain, challengeType, success: true }), + ipAddress, + userAgent, + success: true, + }); + + res.json({ success: true, ...getAcmeSettingsFromDb() }); + } catch (err) { + const message = err instanceof Error ? err.message : "Unknown error"; + authLogger.error("ACME certificate request failed", err); + + const { ipAddress, userAgent } = getRequestMeta(req); + const actorRecord = await db + .select({ username: users.username }) + .from(users) + .where(eq(users.id, userId)) + .limit(1); + await logAudit({ + userId, + username: actorRecord[0]?.username ?? userId, + action: "acme_ssl_request", + resourceType: "setting", + details: JSON.stringify({ error: message }), + ipAddress, + userAgent, + success: false, + }); + + res.status(500).json({ error: `Certificate request failed: ${message}` }); + } + }); +} diff --git a/src/backend/database/routes/credentials.ts b/src/backend/database/routes/credentials.ts index 79f6e6a8..d0b55478 100644 --- a/src/backend/database/routes/credentials.ts +++ b/src/backend/database/routes/credentials.ts @@ -154,7 +154,9 @@ router.post( error: keyInfo.error, }); return res.status(400).json({ - error: `Invalid SSH key: ${keyInfo.error}`, + error: keyInfo.error + ? `Invalid SSH key: ${keyInfo.error}` + : "Unrecognized SSH key format. Only OpenSSH and PEM formats are supported (not PuTTY .ppk).", }); } } @@ -525,7 +527,9 @@ router.put( error: keyInfo.error, }); return res.status(400).json({ - error: `Invalid SSH key: ${keyInfo.error}`, + error: keyInfo.error + ? `Invalid SSH key: ${keyInfo.error}` + : "Unrecognized SSH key format. Only OpenSSH and PEM formats are supported (not PuTTY .ppk).", }); } updateFields.privateKey = keyInfo.privateKey; @@ -986,7 +990,7 @@ function formatSSHHostOutput( tunnelConnections: host.tunnelConnections ? JSON.parse(host.tunnelConnections as string) : [], - enableFileManager: !!host.enableFileManager, + enableFileManager: host.enableFileManager !== false, defaultPath: host.defaultPath, createdAt: host.createdAt, updatedAt: host.updatedAt, diff --git a/src/backend/database/routes/dashboard-service-links-routes.ts b/src/backend/database/routes/dashboard-service-links-routes.ts new file mode 100644 index 00000000..e7dacebe --- /dev/null +++ b/src/backend/database/routes/dashboard-service-links-routes.ts @@ -0,0 +1,281 @@ +import type { AuthenticatedRequest } from "../../../types/index.js"; +import type { Request, Response } from "express"; +import { and, asc, eq } from "drizzle-orm"; +import { dashboardLogger } from "../../utils/logger.js"; +import { db } from "../db/index.js"; +import { dashboardServiceLinks } from "../db/schema.js"; +import { isNonEmptyString } from "./host-normalizers.js"; +import express from "express"; + +export const dashboardServiceLinksRouter = express.Router(); + +function isValidUrl(url: string): boolean { + try { + const parsed = new URL(url); + return parsed.protocol === "http:" || parsed.protocol === "https:"; + } catch { + return false; + } +} + +/** + * @openapi + * /service-links: + * get: + * summary: Get service links + * description: Returns all dashboard service links for the authenticated user. + * tags: + * - Dashboard + * responses: + * 200: + * description: List of service links. + * 500: + * description: Failed to fetch service links. + */ +dashboardServiceLinksRouter.get("/", async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + try { + const links = await db + .select() + .from(dashboardServiceLinks) + .where(eq(dashboardServiceLinks.userId, userId)) + .orderBy(asc(dashboardServiceLinks.order), asc(dashboardServiceLinks.id)); + res.json(links); + } catch (err) { + dashboardLogger.error("Failed to fetch service links", err); + res.status(500).json({ error: "Failed to fetch service links" }); + } +}); + +/** + * @openapi + * /service-links: + * post: + * summary: Create service link + * description: Creates a new dashboard service link for the authenticated user. + * tags: + * - Dashboard + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - label + * - url + * properties: + * label: + * type: string + * url: + * type: string + * responses: + * 201: + * description: Service link created. + * 400: + * description: Invalid data. + * 500: + * description: Failed to create service link. + */ +dashboardServiceLinksRouter.post("/", async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + const { label, url } = req.body; + + if (!isNonEmptyString(label) || !isNonEmptyString(url)) { + return res.status(400).json({ error: "label and url are required" }); + } + if (!isValidUrl(url)) { + return res + .status(400) + .json({ error: "url must be a valid http or https URL" }); + } + + try { + const existing = await db + .select({ order: dashboardServiceLinks.order }) + .from(dashboardServiceLinks) + .where(eq(dashboardServiceLinks.userId, userId)) + .orderBy(asc(dashboardServiceLinks.order)); + + const nextOrder = + existing.length > 0 ? existing[existing.length - 1].order + 1 : 0; + + const [created] = await db + .insert(dashboardServiceLinks) + .values({ + userId, + label: label.trim(), + url: url.trim(), + order: nextOrder, + createdAt: new Date().toISOString(), + }) + .returning(); + + res.status(201).json(created); + } catch (err) { + dashboardLogger.error("Failed to create service link", err); + res.status(500).json({ error: "Failed to create service link" }); + } +}); + +/** + * @openapi + * /service-links/{id}: + * delete: + * summary: Delete service link + * description: Deletes a dashboard service link by ID. + * tags: + * - Dashboard + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: integer + * responses: + * 200: + * description: Service link deleted. + * 400: + * description: Invalid id. + * 404: + * description: Not found. + * 500: + * description: Failed to delete service link. + */ +dashboardServiceLinksRouter.delete( + "/:id", + async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + const idParam = Array.isArray(req.params.id) + ? req.params.id[0] + : req.params.id; + const id = parseInt(idParam); + + if (isNaN(id)) { + return res.status(400).json({ error: "Invalid id" }); + } + + try { + const existing = await db + .select() + .from(dashboardServiceLinks) + .where( + and( + eq(dashboardServiceLinks.id, id), + eq(dashboardServiceLinks.userId, userId), + ), + ); + + if (existing.length === 0) { + return res.status(404).json({ error: "Not found" }); + } + + await db + .delete(dashboardServiceLinks) + .where( + and( + eq(dashboardServiceLinks.id, id), + eq(dashboardServiceLinks.userId, userId), + ), + ); + + res.json({ message: "Service link deleted" }); + } catch (err) { + dashboardLogger.error("Failed to delete service link", err); + res.status(500).json({ error: "Failed to delete service link" }); + } + }, +); + +/** + * @openapi + * /service-links/{id}: + * put: + * summary: Update service link + * description: Updates label or url of a dashboard service link. + * tags: + * - Dashboard + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: integer + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * label: + * type: string + * url: + * type: string + * responses: + * 200: + * description: Service link updated. + * 400: + * description: Invalid data. + * 404: + * description: Not found. + * 500: + * description: Failed to update service link. + */ +dashboardServiceLinksRouter.put("/:id", async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + const idParam = Array.isArray(req.params.id) + ? req.params.id[0] + : req.params.id; + const id = parseInt(idParam); + const { label, url } = req.body; + + if (isNaN(id)) { + return res.status(400).json({ error: "Invalid id" }); + } + if (url !== undefined && !isValidUrl(url)) { + return res + .status(400) + .json({ error: "url must be a valid http or https URL" }); + } + + try { + const existing = await db + .select() + .from(dashboardServiceLinks) + .where( + and( + eq(dashboardServiceLinks.id, id), + eq(dashboardServiceLinks.userId, userId), + ), + ); + + if (existing.length === 0) { + return res.status(404).json({ error: "Not found" }); + } + + const updates: Partial<{ label: string; url: string }> = {}; + if (isNonEmptyString(label)) updates.label = label.trim(); + if (isNonEmptyString(url)) updates.url = url.trim(); + + if (Object.keys(updates).length === 0) { + return res.status(400).json({ error: "Nothing to update" }); + } + + const [updated] = await db + .update(dashboardServiceLinks) + .set(updates) + .where( + and( + eq(dashboardServiceLinks.id, id), + eq(dashboardServiceLinks.userId, userId), + ), + ) + .returning(); + + res.json(updated); + } catch (err) { + dashboardLogger.error("Failed to update service link", err); + res.status(500).json({ error: "Failed to update service link" }); + } +}); diff --git a/src/backend/database/routes/host-bulk-routes.test.ts b/src/backend/database/routes/host-bulk-routes.test.ts new file mode 100644 index 00000000..d105df9e --- /dev/null +++ b/src/backend/database/routes/host-bulk-routes.test.ts @@ -0,0 +1,104 @@ +import { describe, it, expect } from "vitest"; +import { parseSSHConfig } from "./host-bulk-routes.js"; + +describe("parseSSHConfig", () => { + it("parses a basic Host block", () => { + const config = ` +Host myserver + HostName 192.168.1.10 + User alice + Port 2222 +`; + const result = parseSSHConfig(config); + expect(result).toHaveLength(1); + expect(result[0]).toMatchObject({ + name: "myserver", + hostname: "192.168.1.10", + user: "alice", + port: 2222, + }); + }); + + it("parses multiple Host blocks", () => { + const config = ` +Host web + HostName web.example.com + User deploy + +Host db + HostName db.example.com + User postgres + Port 5432 +`; + const result = parseSSHConfig(config); + expect(result).toHaveLength(2); + expect(result[0].name).toBe("web"); + expect(result[1].name).toBe("db"); + expect(result[1].port).toBe(5432); + }); + + it("ignores comment lines", () => { + const config = ` +# This is a comment +Host server + # Another comment + HostName 10.0.0.1 + User root +`; + const result = parseSSHConfig(config); + expect(result).toHaveLength(1); + expect(result[0].hostname).toBe("10.0.0.1"); + }); + + it("skips wildcard Host entries", () => { + const config = ` +Host * + ServerAliveInterval 60 + +Host prod + HostName prod.example.com + User ubuntu +`; + const result = parseSSHConfig(config); + expect(result).toHaveLength(1); + expect(result[0].name).toBe("prod"); + }); + + it("captures IdentityFile and ProxyJump", () => { + const config = ` +Host bastion + HostName bastion.example.com + User ec2-user + IdentityFile ~/.ssh/id_rsa + ProxyJump jumphost.example.com +`; + const result = parseSSHConfig(config); + expect(result).toHaveLength(1); + expect(result[0].identityFile).toBe("~/.ssh/id_rsa"); + expect(result[0].proxyJump).toBe("jumphost.example.com"); + }); + + it("skips Host blocks without a HostName", () => { + const config = ` +Host alias-only + User foo +`; + const result = parseSSHConfig(config); + expect(result).toHaveLength(0); + }); + + it("defaults port to undefined when not specified", () => { + const config = ` +Host server + HostName 1.2.3.4 + User root +`; + const result = parseSSHConfig(config); + expect(result[0].port).toBeUndefined(); + }); + + it("returns empty array for empty input", () => { + expect(parseSSHConfig("")).toHaveLength(0); + expect(parseSSHConfig(" \n\n ")).toHaveLength(0); + }); +}); diff --git a/src/backend/database/routes/host-bulk-routes.ts b/src/backend/database/routes/host-bulk-routes.ts index 935c0727..54cbf1fd 100644 --- a/src/backend/database/routes/host-bulk-routes.ts +++ b/src/backend/database/routes/host-bulk-routes.ts @@ -11,6 +11,68 @@ import { normalizeImportedHost, } from "./host-normalizers.js"; +type SSHConfigHost = { + name: string; + hostname?: string; + user?: string; + port?: number; + identityFile?: string; + proxyJump?: string; +}; + +export function parseSSHConfig(content: string): SSHConfigHost[] { + const results: SSHConfigHost[] = []; + let current: SSHConfigHost | null = null; + + for (const rawLine of content.split("\n")) { + const line = rawLine.trim(); + if (!line || line.startsWith("#")) continue; + + const spaceIdx = line.indexOf(" "); + if (spaceIdx === -1) continue; + + const key = line.slice(0, spaceIdx).toLowerCase(); + const value = line.slice(spaceIdx + 1).trim(); + + if (key === "host") { + if (current && current.hostname) results.push(current); + // Skip wildcard patterns + if (value === "*" || value.includes("*") || value.includes("?")) { + current = null; + } else { + current = { name: value }; + } + continue; + } + + if (!current) continue; + + switch (key) { + case "hostname": + current.hostname = value; + break; + case "user": + current.user = value; + break; + case "port": { + const p = Number.parseInt(value, 10); + if (p > 0 && p <= 65535) current.port = p; + break; + } + case "identityfile": + if (!current.identityFile) current.identityFile = value; + break; + case "proxyjump": + current.proxyJump = value; + break; + } + } + + if (current && current.hostname) results.push(current); + + return results; +} + export function registerHostBulkRoutes( router: Router, authenticateJWT: RequestHandler, @@ -363,6 +425,12 @@ export function registerHostBulkRoutes( if (fallback.length > 0) { hostData.credentialId = fallback[0].id; + } else if (isNonEmptyString(hostData.key)) { + hostData.authType = "key"; + hostData.credentialId = undefined; + } else if (isNonEmptyString(hostData.password)) { + hostData.authType = "password"; + hostData.credentialId = undefined; } else { results.failed++; results.errors.push( @@ -519,4 +587,212 @@ export function registerHostBulkRoutes( }); }, ); + + /** + * @openapi + * /host/ssh-config-import: + * post: + * summary: Import hosts from an OpenSSH config file + * description: Parses an OpenSSH ~/.ssh/config file and imports the defined hosts. + * tags: + * - SSH + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - content + * properties: + * content: + * type: string + * description: Raw text content of the SSH config file. + * overwrite: + * type: boolean + * responses: + * 200: + * description: Import completed. + * 400: + * description: Invalid request body. + */ + router.post( + "/ssh-config-import", + authenticateJWT, + async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + const { content, overwrite } = req.body; + + if (!isNonEmptyString(content)) { + return res.status(400).json({ + error: "content is required and must be a non-empty string", + }); + } + + let parsed: SSHConfigHost[]; + try { + parsed = parseSSHConfig(content); + } catch (err) { + return res + .status(400) + .json({ error: "Failed to parse SSH config file" }); + } + + if (parsed.length === 0) { + return res.status(400).json({ + error: "No valid Host entries found in the SSH config file", + }); + } + + if (parsed.length > 100) { + return res + .status(400) + .json({ error: "Maximum 100 hosts allowed per import" }); + } + + const hostsToImport = parsed.map((h) => ({ + name: h.name, + ip: h.hostname, + port: h.port ?? 22, + username: h.user, + authType: h.identityFile ? "key" : undefined, + connectionType: "ssh", + enableSsh: true, + ...(h.proxyJump + ? { + jumpHosts: [{ host: h.proxyJump, port: 22 }], + } + : {}), + })); + + const results = { + success: 0, + updated: 0, + skipped: 0, + failed: 0, + errors: [] as string[], + }; + + let existingHostMap: Map | undefined; + if (overwrite) { + try { + const allHosts = await SimpleDBOps.select>( + db.select().from(hosts).where(eq(hosts.userId, userId)), + "ssh_data", + userId, + ); + existingHostMap = new Map(); + for (const h of allHosts) { + const key = `${h.ip}:${h.port}:${h.username}`; + existingHostMap.set(key, { id: h.id as number }); + } + } catch { + existingHostMap = undefined; + } + } + + for (let i = 0; i < hostsToImport.length; i++) { + const hostData = normalizeImportedHost( + hostsToImport[i] as Record, + ); + + try { + if (!isNonEmptyString(hostData.ip) || !isValidPort(hostData.port)) { + results.failed++; + results.errors.push( + `Host "${parsed[i].name}": Missing required fields (HostName, Port)`, + ); + continue; + } + + const sshDataObj: Record = { + userId, + connectionType: "ssh", + name: hostData.name || hostData.ip, + folder: "Default", + tags: "", + ip: hostData.ip, + port: hostData.port, + username: hostData.username || null, + authType: hostData.authType || "none", + password: null, + key: null, + keyPassword: null, + keyType: null, + credentialId: null, + pin: false, + enableTerminal: true, + enableTunnel: true, + enableFileManager: true, + enableDocker: false, + enableProxmox: false, + enableTmuxMonitor: false, + showTerminalInSidebar: 0, + showFileManagerInSidebar: 0, + showTunnelInSidebar: 0, + showDockerInSidebar: 0, + showServerStatsInSidebar: 0, + defaultPath: "/", + sudoPassword: null, + tunnelConnections: "[]", + jumpHosts: hostData.jumpHosts + ? JSON.stringify(hostData.jumpHosts) + : null, + quickActions: null, + statsConfig: null, + dockerConfig: null, + proxmoxConfig: null, + terminalConfig: null, + forceKeyboardInteractive: "false", + notes: null, + useSocks5: 0, + socks5Host: null, + socks5Port: null, + socks5Username: null, + socks5Password: null, + socks5ProxyChain: null, + portKnockSequence: null, + overrideCredentialUsername: 0, + enableSsh: true, + enableRdp: false, + enableVnc: false, + enableTelnet: false, + updatedAt: new Date().toISOString(), + }; + + const lookupKey = `${hostData.ip}:${hostData.port}:${hostData.username}`; + const existing = existingHostMap?.get(lookupKey); + + if (existing) { + await SimpleDBOps.update( + hosts, + "ssh_data", + eq(hosts.id, existing.id), + sshDataObj, + userId, + ); + results.updated++; + } else { + sshDataObj.createdAt = new Date().toISOString(); + await SimpleDBOps.insert(hosts, "ssh_data", sshDataObj, userId); + results.success++; + } + } catch (error) { + results.failed++; + results.errors.push( + `Host "${parsed[i].name}": ${error instanceof Error ? error.message : "Unknown error"}`, + ); + } + } + + res.json({ + message: `Import completed: ${results.success} created, ${results.updated} updated, ${results.failed} failed`, + success: results.success, + updated: results.updated, + skipped: results.skipped, + failed: results.failed, + errors: results.errors, + }); + }, + ); } diff --git a/src/backend/database/routes/host-internal-routes.ts b/src/backend/database/routes/host-internal-routes.ts index 3bafed6a..32988f61 100644 --- a/src/backend/database/routes/host-internal-routes.ts +++ b/src/backend/database/routes/host-internal-routes.ts @@ -82,7 +82,7 @@ export function registerHostInternalRoutes(router: Router): void { ), pin: !!host.pin, enableTerminal: !!host.enableTerminal, - enableFileManager: !!host.enableFileManager, + enableFileManager: host.enableFileManager !== false, showTerminalInSidebar: !!host.showTerminalInSidebar, showFileManagerInSidebar: !!host.showFileManagerInSidebar, showTunnelInSidebar: !!host.showTunnelInSidebar, @@ -155,7 +155,7 @@ export function registerHostInternalRoutes(router: Router): void { tunnelConnections: tunnelConnections, pin: !!host.pin, enableTerminal: !!host.enableTerminal, - enableFileManager: !!host.enableFileManager, + enableFileManager: host.enableFileManager !== false, showTerminalInSidebar: !!host.showTerminalInSidebar, showFileManagerInSidebar: !!host.showFileManagerInSidebar, showTunnelInSidebar: !!host.showTunnelInSidebar, diff --git a/src/backend/database/routes/host-network-routes.ts b/src/backend/database/routes/host-network-routes.ts index 1d98591e..654aa7c6 100644 --- a/src/backend/database/routes/host-network-routes.ts +++ b/src/backend/database/routes/host-network-routes.ts @@ -101,7 +101,10 @@ export function registerHostNetworkRoutes( try { const host = await db - .select({ macAddress: hosts.macAddress }) + .select({ + macAddress: hosts.macAddress, + wolBroadcastAddress: hosts.wolBroadcastAddress, + }) .from(hosts) .where(and(eq(hosts.id, hostId), eq(hosts.userId, userId))) .then((rows) => rows[0]); @@ -116,7 +119,10 @@ export function registerHostNetworkRoutes( .json({ error: "No valid MAC address configured" }); } - await sendWakeOnLan(host.macAddress); + await sendWakeOnLan( + host.macAddress, + host.wolBroadcastAddress ?? undefined, + ); sshLogger.info("Wake-on-LAN packet sent", { operation: "wake_on_lan", diff --git a/src/backend/database/routes/host-normalizers.ts b/src/backend/database/routes/host-normalizers.ts index edb7576b..06978572 100644 --- a/src/backend/database/routes/host-normalizers.ts +++ b/src/backend/database/routes/host-normalizers.ts @@ -237,7 +237,7 @@ export function transformHostResponse( pin: !!host.pin, enableTerminal: !!host.enableTerminal, enableTunnel: !!host.enableTunnel, - enableFileManager: !!host.enableFileManager, + enableFileManager: host.enableFileManager !== false, enableDocker: !!host.enableDocker, enableProxmox: !!host.enableProxmox, enableTmuxMonitor: !!host.enableTmuxMonitor, @@ -293,6 +293,7 @@ export function transformHostResponse( ? JSON.parse(host.proxmoxConfig as string) : undefined, forceKeyboardInteractive: host.forceKeyboardInteractive === "true", + useWarpgate: !!host.useWarpgate, socks5ProxyChain: host.socks5ProxyChain ? JSON.parse(host.socks5ProxyChain as string) : [], diff --git a/src/backend/database/routes/host.ts b/src/backend/database/routes/host.ts index a76d0ddd..06b950c4 100644 --- a/src/backend/database/routes/host.ts +++ b/src/backend/database/routes/host.ts @@ -144,6 +144,7 @@ router.post( password, authMethod, authType, + useWarpgate, credentialId, key, keyPassword, @@ -153,6 +154,7 @@ router.post( enableTerminal, enableTunnel, enableFileManager, + scpLegacy, enableDocker, enableProxmox, enableTmuxMonitor, @@ -184,6 +186,7 @@ router.post( portKnockSequence, overrideCredentialUsername, macAddress, + wolBroadcastAddress, enableSsh, enableRdp, enableVnc, @@ -243,6 +246,7 @@ router.post( port, username: effectiveUsername, authType: effectiveAuthType, + useWarpgate: useWarpgate ? 1 : 0, credentialId: credentialId || null, overrideCredentialUsername: overrideCredentialUsername ? 1 : 0, pin: pin ? 1 : 0, @@ -256,6 +260,7 @@ router.post( ? JSON.stringify(quickActions) : null, enableFileManager: enableFileManager ? 1 : 0, + scpLegacy: scpLegacy ? 1 : 0, enableDocker: enableDocker ? 1 : 0, enableProxmox: enableProxmox ? 1 : 0, enableTmuxMonitor: enableTmuxMonitor ? 1 : 0, @@ -301,6 +306,7 @@ router.post( ? JSON.stringify(socks5ProxyChain) : null, macAddress: macAddress || null, + wolBroadcastAddress: wolBroadcastAddress || null, portKnockSequence: portKnockSequence ? JSON.stringify(portKnockSequence) : null, @@ -713,6 +719,7 @@ router.put( password, authMethod, authType, + useWarpgate, credentialId, key, keyPassword, @@ -722,6 +729,7 @@ router.put( enableTerminal, enableTunnel, enableFileManager, + scpLegacy, enableDocker, enableProxmox, enableTmuxMonitor, @@ -753,6 +761,7 @@ router.put( portKnockSequence, overrideCredentialUsername, macAddress, + wolBroadcastAddress, enableSsh, enableRdp, enableVnc, @@ -809,6 +818,7 @@ router.put( port, username: effectiveUsername, authType: effectiveAuthType, + useWarpgate: useWarpgate ? 1 : 0, credentialId: credentialId || null, overrideCredentialUsername: overrideCredentialUsername ? 1 : 0, pin: pin ? 1 : 0, @@ -822,6 +832,7 @@ router.put( ? JSON.stringify(quickActions) : null, enableFileManager: enableFileManager ? 1 : 0, + scpLegacy: scpLegacy ? 1 : 0, enableDocker: enableDocker ? 1 : 0, enableProxmox: enableProxmox ? 1 : 0, enableTmuxMonitor: enableTmuxMonitor ? 1 : 0, @@ -867,6 +878,7 @@ router.put( ? JSON.stringify(socks5ProxyChain) : null, macAddress: macAddress || null, + wolBroadcastAddress: wolBroadcastAddress || null, portKnockSequence: portKnockSequence ? JSON.stringify(portKnockSequence) : null, @@ -952,10 +964,9 @@ router.put( sshDataObj.keyType = null; } - if (rdpPassword !== undefined) sshDataObj.rdpPassword = rdpPassword || null; - if (vncPassword !== undefined) sshDataObj.vncPassword = vncPassword || null; - if (telnetPassword !== undefined) - sshDataObj.telnetPassword = telnetPassword || null; + if (rdpPassword) sshDataObj.rdpPassword = rdpPassword; + if (vncPassword) sshDataObj.vncPassword = vncPassword; + if (telnetPassword) sshDataObj.telnetPassword = telnetPassword; try { const accessInfo = await permissionManager.canAccessHost( @@ -988,6 +999,8 @@ router.put( .select({ userId: hosts.userId, credentialId: hosts.credentialId, + rdpCredentialId: hosts.rdpCredentialId, + vncCredentialId: hosts.vncCredentialId, authType: hosts.authType, }) .from(hosts) @@ -1025,11 +1038,26 @@ router.put( }); } - if (sshDataObj.credentialId !== undefined) { - if ( - hostRecord[0].credentialId !== null && - sshDataObj.credentialId === null - ) { + { + const newCredId = + sshDataObj.credentialId !== undefined + ? sshDataObj.credentialId + : hostRecord[0].credentialId; + const newRdpCredId = + sshDataObj.rdpCredentialId !== undefined + ? sshDataObj.rdpCredentialId + : hostRecord[0].rdpCredentialId; + const newVncCredId = + sshDataObj.vncCredentialId !== undefined + ? sshDataObj.vncCredentialId + : hostRecord[0].vncCredentialId; + const hadCredential = + hostRecord[0].credentialId !== null || + hostRecord[0].rdpCredentialId !== null || + hostRecord[0].vncCredentialId !== null; + const willHaveCredential = + newCredId !== null || newRdpCredId !== null || newVncCredId !== null; + if (hadCredential && !willHaveCredential) { await db .delete(hostAccess) .where(eq(hostAccess.hostId, Number(hostId))); @@ -1169,6 +1197,7 @@ router.get( tunnelConnections: hosts.tunnelConnections, jumpHosts: hosts.jumpHosts, enableFileManager: hosts.enableFileManager, + scpLegacy: hosts.scpLegacy, defaultPath: hosts.defaultPath, autostartPassword: hosts.autostartPassword, autostartKey: hosts.autostartKey, @@ -1203,6 +1232,7 @@ router.get( ignoreCert: hosts.ignoreCert, guacamoleConfig: hosts.guacamoleConfig, macAddress: hosts.macAddress, + wolBroadcastAddress: hosts.wolBroadcastAddress, dockerConfig: hosts.dockerConfig, proxmoxConfig: hosts.proxmoxConfig, enableSsh: hosts.enableSsh, @@ -1213,11 +1243,13 @@ router.get( rdpPort: hosts.rdpPort, vncPort: hosts.vncPort, telnetPort: hosts.telnetPort, + rdpCredentialId: hosts.rdpCredentialId, rdpUser: hosts.rdpUser, rdpPassword: hosts.rdpPassword, rdpDomain: hosts.rdpDomain, rdpSecurity: hosts.rdpSecurity, rdpIgnoreCert: hosts.rdpIgnoreCert, + vncCredentialId: hosts.vncCredentialId, vncUser: hosts.vncUser, vncPassword: hosts.vncPassword, telnetUser: hosts.telnetUser, @@ -1445,7 +1477,19 @@ router.get( const host = data[0]; const resolved = (await resolveHostCredentials(host, userId)) || host; - const value = resolved[field]; + let value = resolved[field]; + + if (!value && field === "sudoPassword" && resolved.terminalConfig) { + try { + const tc = + typeof resolved.terminalConfig === "string" + ? JSON.parse(resolved.terminalConfig) + : resolved.terminalConfig; + value = tc?.sudoPassword || null; + } catch { + // malformed JSON — leave value null + } + } if (!value) { return res.status(404).json({ error: "No password set" }); @@ -1574,7 +1618,8 @@ router.get( !!resolvedHost.overrideCredentialUsername, enableTerminal: !!resolvedHost.enableTerminal, enableTunnel: !!resolvedHost.enableTunnel, - enableFileManager: !!resolvedHost.enableFileManager, + enableFileManager: resolvedHost.enableFileManager !== false, + scpLegacy: !!resolvedHost.scpLegacy, enableDocker: !!resolvedHost.enableDocker, enableProxmox: !!resolvedHost.enableProxmox, enableTmuxMonitor: !!resolvedHost.enableTmuxMonitor, @@ -1722,7 +1767,7 @@ router.get( !!resolvedHost.overrideCredentialUsername, enableTerminal: !!resolvedHost.enableTerminal, enableTunnel: !!resolvedHost.enableTunnel, - enableFileManager: !!resolvedHost.enableFileManager, + enableFileManager: resolvedHost.enableFileManager !== false, enableDocker: !!resolvedHost.enableDocker, enableProxmox: !!resolvedHost.enableProxmox, enableTmuxMonitor: !!resolvedHost.enableTmuxMonitor, diff --git a/src/backend/database/routes/ldap-auth-routes.ts b/src/backend/database/routes/ldap-auth-routes.ts index c3fcf63d..cefdc6cb 100644 --- a/src/backend/database/routes/ldap-auth-routes.ts +++ b/src/backend/database/routes/ldap-auth-routes.ts @@ -2,7 +2,7 @@ import type { Router } from "express"; import type { LDAPProviderConfig } from "../../../types/index.js"; import { db } from "../db/index.js"; import { ssoProviders, users, roles, userRoles } from "../db/schema.js"; -import { eq } from "drizzle-orm"; +import { eq, and } from "drizzle-orm"; import { nanoid } from "nanoid"; import { authLogger } from "../../utils/logger.js"; import { AuthManager } from "../../utils/auth-manager.js"; @@ -298,14 +298,7 @@ export function registerLDAPAuthRoutes(router: Router): void { const isFirst = (countRow?.count || 0) === 0; if (!isFirst && !autoProvision) { - const regRow = db.$client - .prepare( - "SELECT value FROM settings WHERE key = 'allow_registration'", - ) - .get() as { value: string } | undefined; - if (regRow && regRow.value !== "true") { - return res.status(403).json({ error: "Registration is disabled" }); - } + return res.status(403).json({ error: "Registration is disabled" }); } userId = nanoid(); @@ -375,6 +368,39 @@ export function registerLDAPAuthRoutes(router: Router): void { if (config.adminGroup && !!existingUsers[0].isAdmin !== isAdmin) { await db.update(users).set({ isAdmin }).where(eq(users.id, userId)); existingUsers[0].isAdmin = isAdmin; + try { + const newRoleName = isAdmin ? "admin" : "user"; + const oldRoleName = isAdmin ? "user" : "admin"; + const newRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, newRoleName)) + .limit(1); + const oldRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, oldRoleName)) + .limit(1); + if (oldRole.length > 0) { + await db + .delete(userRoles) + .where( + and( + eq(userRoles.userId, userId), + eq(userRoles.roleId, oldRole[0].id), + ), + ); + } + if (newRole.length > 0) { + await db.insert(userRoles).values({ + userId, + roleId: newRole[0].id, + grantedBy: userId, + }); + } + } catch { + /* non-fatal */ + } } // Update display name if not dual-auth diff --git a/src/backend/database/routes/open-tabs.ts b/src/backend/database/routes/open-tabs.ts index 0478115c..b5e04ad3 100644 --- a/src/backend/database/routes/open-tabs.ts +++ b/src/backend/database/routes/open-tabs.ts @@ -23,7 +23,24 @@ const authenticateJWT = authManager.createAuthMiddleware(); * 200: * description: List of open tabs ordered by tab_order. */ -const TAB_TTL_MS = 30 * 60 * 1000; +const DEFAULT_TAB_TTL_MINUTES = 30; + +function getTabTtlMs(): number { + try { + const row = db.$client + .prepare( + "SELECT value FROM settings WHERE key = 'terminal_session_timeout_minutes'", + ) + .get() as { value: string } | undefined; + if (row) { + const minutes = parseInt(row.value, 10); + if (!isNaN(minutes) && minutes > 0) return minutes * 60_000; + } + } catch { + // DB not available, use default + } + return DEFAULT_TAB_TTL_MINUTES * 60_000; +} // Legacy tab types that were renamed. Normalize on read so previously saved // tabs still restore to the correct (renamed) tab type. @@ -38,7 +55,7 @@ function normalizeTabType(tabType: string): string { router.get("/", authenticateJWT, async (req: Request, res: Response) => { const userId = (req as AuthenticatedRequest).userId; try { - const cutoff = new Date(Date.now() - TAB_TTL_MS).toISOString(); + const cutoff = new Date(Date.now() - getTabTtlMs()).toISOString(); const tabs = db .select() .from(userOpenTabs) diff --git a/src/backend/database/routes/rbac.ts b/src/backend/database/routes/rbac.ts index c7a7ca8b..5582582f 100644 --- a/src/backend/database/routes/rbac.ts +++ b/src/backend/database/routes/rbac.ts @@ -129,7 +129,12 @@ router.post( return res.status(403).json({ error: "Not host owner" }); } - if (!host[0].credentialId && host[0].authType !== "opkssh") { + if ( + !host[0].credentialId && + !host[0].rdpCredentialId && + !host[0].vncCredentialId && + host[0].authType !== "opkssh" + ) { return res.status(400).json({ error: "Only hosts using credentials or OPKSSH can be shared. Please create a credential and assign it to this host before sharing.", @@ -204,21 +209,25 @@ router.post( .delete(sharedCredentials) .where(eq(sharedCredentials.hostAccessId, existing[0].id)); - if (host[0].credentialId) { + const activeCredentialId = + host[0].credentialId ?? + host[0].rdpCredentialId ?? + host[0].vncCredentialId; + if (activeCredentialId) { const { SharedCredentialManager } = await import("../../utils/shared-credential-manager.js"); const sharedCredManager = SharedCredentialManager.getInstance(); if (targetType === "user") { await sharedCredManager.createSharedCredentialForUser( existing[0].id, - host[0].credentialId, + activeCredentialId, targetUserId!, userId, ); } else { await sharedCredManager.createSharedCredentialsForRole( existing[0].id, - host[0].credentialId, + activeCredentialId, targetRoleId!, userId, ); @@ -252,18 +261,22 @@ router.post( await import("../../utils/shared-credential-manager.js"); const sharedCredManager = SharedCredentialManager.getInstance(); - if (host[0].credentialId) { + const activeCredentialId = + host[0].credentialId ?? + host[0].rdpCredentialId ?? + host[0].vncCredentialId; + if (activeCredentialId) { if (targetType === "user") { await sharedCredManager.createSharedCredentialForUser( result.lastInsertRowid as number, - host[0].credentialId, + activeCredentialId, targetUserId!, userId, ); } else { await sharedCredManager.createSharedCredentialsForRole( result.lastInsertRowid as number, - host[0].credentialId, + activeCredentialId, targetRoleId!, userId, ); @@ -487,6 +500,12 @@ router.get( try { const now = new Date().toISOString(); + const userRoleIds = await db + .select({ roleId: userRoles.roleId }) + .from(userRoles) + .where(eq(userRoles.userId, userId)); + const roleIds = userRoleIds.map((r) => r.roleId); + const sharedHosts = await db .select({ id: hosts.id, @@ -506,7 +525,15 @@ router.get( .innerJoin(users, eq(hosts.userId, users.id)) .where( and( - eq(hostAccess.userId, userId), + or( + eq(hostAccess.userId, userId), + roleIds.length > 0 + ? sql`${hostAccess.roleId} IN (${sql.join( + roleIds.map((id) => sql`${id}`), + sql`, `, + )})` + : sql`false`, + ), or(isNull(hostAccess.expiresAt), gte(hostAccess.expiresAt, now)), ), ) diff --git a/src/backend/database/routes/snippets.ts b/src/backend/database/routes/snippets.ts index 4a515115..5848b20e 100644 --- a/src/backend/database/routes/snippets.ts +++ b/src/backend/database/routes/snippets.ts @@ -924,6 +924,268 @@ router.post( }, ); +/** + * @openapi + * /snippets/export: + * get: + * summary: Export all snippets and folders as JSON + * description: Returns all snippets and snippet folders for the authenticated user as a JSON export. + * tags: + * - Snippets + * responses: + * 200: + * description: Export object containing snippets and folders arrays. + * 400: + * description: Invalid userId. + * 500: + * description: Failed to export snippets. + */ +router.get( + "/export", + authenticateJWT, + requireDataAccess, + async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + + if (!isNonEmptyString(userId)) { + authLogger.warn("Invalid userId for snippet export"); + return res.status(400).json({ error: "Invalid userId" }); + } + + try { + const allSnippets = await db + .select() + .from(snippets) + .where(eq(snippets.userId, userId)) + .orderBy(asc(snippets.folder), asc(snippets.order)); + + const allFolders = await db + .select() + .from(snippetFolders) + .where(eq(snippetFolders.userId, userId)) + .orderBy(asc(snippetFolders.name)); + + const exportedSnippets = allSnippets.map((s) => ({ + name: s.name, + content: s.content, + description: s.description, + folder: s.folder, + order: s.order, + hostFilter: s.hostFilter, + })); + + const exportedFolders = allFolders.map((f) => ({ + name: f.name, + color: f.color, + icon: f.icon, + })); + + authLogger.success(`Snippets exported by user ${userId}`, { + operation: "snippet_export", + userId, + snippetCount: exportedSnippets.length, + folderCount: exportedFolders.length, + }); + + res.json({ snippets: exportedSnippets, folders: exportedFolders }); + } catch (err) { + authLogger.error("Failed to export snippets", err); + res.status(500).json({ error: "Failed to export snippets" }); + } + }, +); + +/** + * @openapi + * /snippets/bulk-import: + * post: + * summary: Bulk import snippets and folders from JSON + * description: Imports snippets and folders. Existing folders are skipped; existing snippets (matched by name+folder) can be skipped or overwritten. + * tags: + * - Snippets + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * snippets: + * type: array + * folders: + * type: array + * overwrite: + * type: boolean + * responses: + * 200: + * description: Import results with counts. + * 400: + * description: Invalid request body. + * 500: + * description: Failed to import snippets. + */ +router.post( + "/bulk-import", + authenticateJWT, + requireDataAccess, + async (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + const { + snippets: snippetsToImport, + folders: foldersToImport, + overwrite, + } = req.body; + + if (!isNonEmptyString(userId)) { + return res.status(400).json({ error: "Invalid userId" }); + } + + if (!Array.isArray(snippetsToImport) && !Array.isArray(foldersToImport)) { + return res + .status(400) + .json({ error: "snippets or folders array is required" }); + } + + const results = { + snippetsImported: 0, + snippetsSkipped: 0, + snippetsUpdated: 0, + foldersImported: 0, + foldersSkipped: 0, + failed: 0, + errors: [] as string[], + }; + + try { + if (Array.isArray(foldersToImport)) { + for (const folder of foldersToImport) { + if (!isNonEmptyString(folder.name)) { + results.failed++; + results.errors.push(`Folder missing name`); + continue; + } + + const existing = await db + .select() + .from(snippetFolders) + .where( + and( + eq(snippetFolders.userId, userId), + eq(snippetFolders.name, folder.name.trim()), + ), + ) + .limit(1); + + if (existing.length > 0) { + results.foldersSkipped++; + continue; + } + + await db.insert(snippetFolders).values({ + userId, + name: folder.name.trim(), + color: folder.color?.trim() || null, + icon: folder.icon?.trim() || null, + }); + results.foldersImported++; + } + } + + if (Array.isArray(snippetsToImport)) { + for (let i = 0; i < snippetsToImport.length; i++) { + const s = snippetsToImport[i]; + + if (!isNonEmptyString(s.name) || !isNonEmptyString(s.content)) { + results.failed++; + results.errors.push( + `Snippet ${i + 1}: name and content are required`, + ); + continue; + } + + const folderVal = s.folder?.trim() || null; + + const existing = await db + .select() + .from(snippets) + .where( + and( + eq(snippets.userId, userId), + eq(snippets.name, s.name.trim()), + folderVal + ? eq(snippets.folder, folderVal) + : sql`(${snippets.folder} IS NULL OR ${snippets.folder} = '')`, + ), + ) + .limit(1); + + if (existing.length > 0) { + if (!overwrite) { + results.snippetsSkipped++; + continue; + } + + await db + .update(snippets) + .set({ + content: s.content.trim(), + description: s.description?.trim() || null, + folder: folderVal, + order: + typeof s.order === "number" ? s.order : existing[0].order, + hostFilter: s.hostFilter || null, + updatedAt: sql`CURRENT_TIMESTAMP`, + }) + .where( + and( + eq(snippets.id, existing[0].id), + eq(snippets.userId, userId), + ), + ); + results.snippetsUpdated++; + continue; + } + + const maxOrderResult = await db + .select({ maxOrder: sql`MAX(${snippets.order})` }) + .from(snippets) + .where( + and( + eq(snippets.userId, userId), + folderVal + ? eq(snippets.folder, folderVal) + : sql`(${snippets.folder} IS NULL OR ${snippets.folder} = '')`, + ), + ); + const maxOrder = maxOrderResult[0]?.maxOrder ?? -1; + + await db.insert(snippets).values({ + userId, + name: s.name.trim(), + content: s.content.trim(), + description: s.description?.trim() || null, + folder: folderVal, + order: typeof s.order === "number" ? s.order : maxOrder + 1, + hostFilter: s.hostFilter || null, + }); + results.snippetsImported++; + } + } + + authLogger.success(`Snippets bulk-imported by user ${userId}`, { + operation: "snippet_bulk_import", + userId, + ...results, + }); + + res.json({ success: true, ...results }); + } catch (err) { + authLogger.error("Failed to bulk import snippets", err); + res.status(500).json({ error: "Failed to import snippets" }); + } + }, +); + /** * @openapi * /snippets: diff --git a/src/backend/database/routes/sso-provider-routes.ts b/src/backend/database/routes/sso-provider-routes.ts index 662f48f4..7a2d068f 100644 --- a/src/backend/database/routes/sso-provider-routes.ts +++ b/src/backend/database/routes/sso-provider-routes.ts @@ -9,6 +9,7 @@ import { eq, asc } from "drizzle-orm"; import { authLogger } from "../../utils/logger.js"; import { AuthManager } from "../../utils/auth-manager.js"; import type { SSOProviderType } from "../../../types/index.js"; +import { getOIDCConfigFromEnv } from "./user-oidc-utils.js"; const authManager = AuthManager.getInstance(); @@ -117,6 +118,16 @@ export function registerSSOProviderRoutes(router: Router): void { .from(ssoProviders) .where(eq(ssoProviders.enabled, true)) .orderBy(asc(ssoProviders.displayOrder), asc(ssoProviders.id)); + + // If no DB providers exist, synthesize one from env vars so SSO login + // remains available when configured purely via environment variables. + if (providers.length === 0) { + const envConfig = getOIDCConfigFromEnv(); + if (envConfig) { + providers.push({ id: 0, name: "SSO", type: "oidc", displayOrder: 0 }); + } + } + res.json(providers); } catch (err) { authLogger.error("Failed to list SSO providers", err); diff --git a/src/backend/database/routes/user-admin-routes.ts b/src/backend/database/routes/user-admin-routes.ts index fe53cc6a..d6630e1b 100644 --- a/src/backend/database/routes/user-admin-routes.ts +++ b/src/backend/database/routes/user-admin-routes.ts @@ -1,10 +1,13 @@ import type { AuthenticatedRequest } from "../../../types/index.js"; import type { RequestHandler, Router } from "express"; -import { eq } from "drizzle-orm"; +import { eq, and } from "drizzle-orm"; import { authLogger } from "../../utils/logger.js"; import { db } from "../db/index.js"; -import { users } from "../db/schema.js"; +import { users, roles, userRoles } from "../db/schema.js"; import { logAudit, getRequestMeta } from "../../utils/audit-logger.js"; +import bcrypt from "bcryptjs"; +import { nanoid } from "nanoid"; +import { AuthManager } from "../../utils/auth-manager.js"; function isNonEmptyString(val: unknown): val is string { return typeof val === "string" && val.trim().length > 0; @@ -139,6 +142,50 @@ export function registerUserAdminRoutes( : eq(users.username, resolvedUsername!), ); + try { + const targetId = targetUser[0].id; + const adminRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, "admin")) + .limit(1); + const userRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, "user")) + .limit(1); + if (adminRole.length > 0) { + await db + .delete(userRoles) + .where( + and( + eq(userRoles.userId, targetId), + eq(userRoles.roleId, adminRole[0].id), + ), + ); + await db.insert(userRoles).values({ + userId: targetId, + roleId: adminRole[0].id, + grantedBy: userId, + }); + } + if (userRole.length > 0) { + await db + .delete(userRoles) + .where( + and( + eq(userRoles.userId, targetId), + eq(userRoles.roleId, userRole[0].id), + ), + ); + } + } catch (roleError) { + authLogger.error("Failed to sync admin role on make-admin", roleError, { + operation: "make_admin_role_sync", + userId: targetUser[0].id, + }); + } + try { const { saveMemoryDatabaseToFile } = await import("../db/index.js"); await saveMemoryDatabaseToFile(); @@ -277,6 +324,54 @@ export function registerUserAdminRoutes( : eq(users.username, resolvedUsername!), ); + try { + const targetId = targetUser[0].id; + const adminRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, "admin")) + .limit(1); + const userRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, "user")) + .limit(1); + if (adminRole.length > 0) { + await db + .delete(userRoles) + .where( + and( + eq(userRoles.userId, targetId), + eq(userRoles.roleId, adminRole[0].id), + ), + ); + } + if (userRole.length > 0) { + await db + .delete(userRoles) + .where( + and( + eq(userRoles.userId, targetId), + eq(userRoles.roleId, userRole[0].id), + ), + ); + await db.insert(userRoles).values({ + userId: targetId, + roleId: userRole[0].id, + grantedBy: userId, + }); + } + } catch (roleError) { + authLogger.error( + "Failed to sync user role on remove-admin", + roleError, + { + operation: "remove_admin_role_sync", + userId: targetUser[0].id, + }, + ); + } + try { const { saveMemoryDatabaseToFile } = await import("../db/index.js"); await saveMemoryDatabaseToFile(); @@ -321,4 +416,184 @@ export function registerUserAdminRoutes( res.status(500).json({ error: "Failed to remove admin status" }); } }); + + /** + * @openapi + * /users/admin-create: + * post: + * summary: Admin create user + * description: Allows an admin to create a new user regardless of whether public registration is enabled. + * tags: + * - Users + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * username: + * type: string + * password: + * type: string + * responses: + * 200: + * description: User created successfully. + * 400: + * description: Username and password are required. + * 403: + * description: Not authorized. + * 409: + * description: Username already exists. + * 500: + * description: Failed to create user. + */ + router.post("/admin-create", authenticateJWT, async (req, res) => { + const adminId = (req as AuthenticatedRequest).userId; + + try { + const adminUser = await db + .select() + .from(users) + .where(eq(users.id, adminId)); + if (!adminUser || adminUser.length === 0 || !adminUser[0].isAdmin) { + return res.status(403).json({ error: "Not authorized" }); + } + } catch (err) { + authLogger.error("Failed to verify admin status", err); + return res.status(500).json({ error: "Failed to verify admin status" }); + } + + const { username, password } = req.body; + + if (!isNonEmptyString(username) || !isNonEmptyString(password)) { + return res + .status(400) + .json({ error: "Username and password are required" }); + } + + try { + const existing = await db + .select() + .from(users) + .where(eq(users.username, username)); + if (existing && existing.length > 0) { + return res.status(409).json({ error: "Username already exists" }); + } + + const password_hash = await bcrypt.hash(password, 10); + const id = nanoid(); + + db.$client.transaction(() => { + db.$client + .prepare( + "INSERT INTO users (id, username, password_hash, is_admin, is_oidc, client_id, client_secret, issuer_url, authorization_url, token_url, identifier_path, name_path, scopes, totp_secret, totp_enabled, totp_backup_codes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + ) + .run( + id, + username, + password_hash, + 0, + 0, + "", + "", + "", + "", + "", + "", + "", + "openid email profile", + null, + 0, + null, + ); + })(); + + try { + const userRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, "user")) + .limit(1); + if (userRole.length > 0) { + await db.insert(userRoles).values({ + userId: id, + roleId: userRole[0].id, + grantedBy: adminId, + }); + } + } catch (roleError) { + authLogger.error( + "Failed to assign default role during admin create", + roleError, + { + operation: "admin_create_user_role", + userId: id, + }, + ); + } + + const authManager = AuthManager.getInstance(); + try { + await authManager.registerUser(id, password); + } catch (encryptionError) { + await db.delete(users).where(eq(users.id, id)); + authLogger.error( + "Failed to setup user encryption during admin create, rolled back", + encryptionError, + { operation: "admin_create_user_encryption_failed", userId: id }, + ); + return res.status(500).json({ + error: "Failed to setup user security - user creation cancelled", + }); + } + + try { + const { saveMemoryDatabaseToFile } = await import("../db/index.js"); + await saveMemoryDatabaseToFile(); + } catch (saveError) { + authLogger.error( + "Failed to persist admin-created user to disk", + saveError, + { + operation: "admin_create_user_save_failed", + userId: id, + }, + ); + } + + authLogger.success("User created by admin", { + operation: "admin_create_user_success", + adminId, + userId: id, + username, + }); + + const { ipAddress, userAgent } = getRequestMeta(req); + const adminRecord = await db + .select({ username: users.username }) + .from(users) + .where(eq(users.id, adminId)) + .limit(1); + await logAudit({ + userId: adminId, + username: adminRecord[0]?.username ?? adminId, + action: "create_user", + resourceType: "user", + resourceId: id, + resourceName: username, + ipAddress, + userAgent, + success: true, + }); + + res.json({ + message: "User created", + toast: { type: "success", message: `User created: ${username}` }, + }); + } catch (err) { + authLogger.error("Failed to admin-create user", err); + res.status(500).json({ error: "Failed to create user" }); + } + }); } diff --git a/src/backend/database/routes/user-oidc-utils.test.ts b/src/backend/database/routes/user-oidc-utils.test.ts index 33c2bdc8..7ce97ade 100644 --- a/src/backend/database/routes/user-oidc-utils.test.ts +++ b/src/backend/database/routes/user-oidc-utils.test.ts @@ -61,6 +61,23 @@ describe("isOIDCUserAllowed", () => { it("does not match the email against an identifier-only pattern when email differs", () => { expect(isOIDCUserAllowed("alice", "sub-123", "alice@x.com")).toBe(false); }); + + it("matches *@domain.com wildcard pattern against emails", () => { + expect( + isOIDCUserAllowed("*@company.com", "sub-1", "john@company.com"), + ).toBe(true); + expect( + isOIDCUserAllowed("*@company.com", "sub-1", "jane@COMPANY.COM"), + ).toBe(true); + expect(isOIDCUserAllowed("*@company.com", "sub-1", "user@other.com")).toBe( + false, + ); + }); + + it("matches glob patterns with multiple wildcards", () => { + expect(isOIDCUserAllowed("admin*", "admin_user")).toBe(true); + expect(isOIDCUserAllowed("admin*", "user_admin")).toBe(false); + }); }); describe("getOIDCConfigFromEnv", () => { diff --git a/src/backend/database/routes/user-oidc-utils.ts b/src/backend/database/routes/user-oidc-utils.ts index 3e225fd3..85469e03 100644 --- a/src/backend/database/routes/user-oidc-utils.ts +++ b/src/backend/database/routes/user-oidc-utils.ts @@ -4,6 +4,7 @@ import { db } from "../db/index.js"; import { ssoProviders } from "../db/schema.js"; import { eq } from "drizzle-orm"; import { DataCrypto } from "../../utils/data-crypto.js"; +import { Agent } from "undici"; export type OIDCConfig = { client_id: string; @@ -18,8 +19,14 @@ export type OIDCConfig = { allowed_users: string; admin_group: string; group_claim?: string; + ca_cert?: string; }; +export function buildFetchOptions(caCert?: string): Record { + if (!caCert || !caCert.trim()) return {}; + return { dispatcher: new Agent({ connect: { ca: caCert } }) }; +} + export function getOIDCConfigFromEnv(): OIDCConfig | null { const client_id = process.env.OIDC_CLIENT_ID; const client_secret = process.env.OIDC_CLIENT_SECRET; @@ -107,6 +114,15 @@ export function isOIDCUserAllowed( ]; for (const pattern of patterns) { if (pattern === "*") return true; + if (pattern.includes("*")) { + const escaped = pattern + .toLowerCase() + .replace(/[.+^${}()|[\]\\]/g, "\\$&") + .replace(/\*/g, ".*"); + const regex = new RegExp(`^${escaped}$`); + if (values.some((v) => v && regex.test(v.toLowerCase()))) return true; + continue; + } for (const value of values) { if (!value) continue; if (pattern.toLowerCase().startsWith("@")) { @@ -123,7 +139,9 @@ export async function verifyOIDCToken( idToken: string, issuerUrl: string, clientId: string, + caCert?: string, ): Promise> { + const fetchOptions = buildFetchOptions(caCert); const normalizedIssuerUrl = issuerUrl.endsWith("/") ? issuerUrl.slice(0, -1) : issuerUrl; @@ -142,7 +160,7 @@ export async function verifyOIDCToken( try { const discoveryUrl = `${normalizedIssuerUrl}/.well-known/openid-configuration`; - const discoveryResponse = await fetch(discoveryUrl); + const discoveryResponse = await fetch(discoveryUrl, fetchOptions); if (discoveryResponse.ok) { const discovery = (await discoveryResponse.json()) as Record< string, @@ -160,7 +178,7 @@ export async function verifyOIDCToken( for (const url of jwksUrls) { try { - const response = await fetch(url); + const response = await fetch(url, fetchOptions); if (response.ok) { const jwksData = (await response.json()) as Record; if (jwksData && jwksData.keys && Array.isArray(jwksData.keys)) { @@ -214,6 +232,49 @@ export async function verifyOIDCToken( return payload; } +const GOOGLE_DEFAULTS = { + issuer_url: "https://accounts.google.com", + authorization_url: "https://accounts.google.com/o/oauth2/v2/auth", + token_url: "https://oauth2.googleapis.com/token", + userinfo_url: "https://openidconnect.googleapis.com/v1/userinfo", + identifier_path: "sub", + name_path: "name", + scopes: "openid email profile", +}; + +const GITHUB_DEFAULTS = { + issuer_url: "https://token.actions.githubusercontent.com", + authorization_url: "https://github.com/login/oauth/authorize", + token_url: "https://github.com/login/oauth/access_token", + userinfo_url: "https://api.github.com/user", + identifier_path: "id", + name_path: "name", + scopes: "read:user user:email", +}; + +function applyProviderDefaults( + config: OIDCConfig, + providerType: string, +): OIDCConfig { + const defaults = + providerType === "google" + ? GOOGLE_DEFAULTS + : providerType === "github" + ? GITHUB_DEFAULTS + : null; + if (!defaults) return config; + return { + ...config, + issuer_url: config.issuer_url || defaults.issuer_url, + authorization_url: config.authorization_url || defaults.authorization_url, + token_url: config.token_url || defaults.token_url, + userinfo_url: config.userinfo_url || defaults.userinfo_url, + identifier_path: config.identifier_path || defaults.identifier_path, + name_path: config.name_path || defaults.name_path, + scopes: config.scopes || defaults.scopes, + }; +} + function decryptConfigSecret( config: Record, ): Record { @@ -280,10 +341,14 @@ export async function loadProviderConfig( } else { parsed = decryptConfigSecret(parsed); } - const config = parsed as unknown as OIDCConfig; + const providerType = row.type as SSOProviderType; + const config = applyProviderDefaults( + parsed as unknown as OIDCConfig, + providerType, + ); return { config, - providerType: row.type as SSOProviderType, + providerType, providerDbId: row.id, }; } @@ -318,9 +383,13 @@ export async function loadProviderConfig( parsed = {}; } parsed = decryptConfigSecret(parsed); + const oidcProviderType = oidcRow.type as SSOProviderType; return { - config: parsed as unknown as OIDCConfig, - providerType: oidcRow.type as SSOProviderType, + config: applyProviderDefaults( + parsed as unknown as OIDCConfig, + oidcProviderType, + ), + providerType: oidcProviderType, providerDbId: oidcRow.id, }; } diff --git a/src/backend/database/routes/user-password-reset-routes.ts b/src/backend/database/routes/user-password-reset-routes.ts index 8a1c8584..749796a7 100644 --- a/src/backend/database/routes/user-password-reset-routes.ts +++ b/src/backend/database/routes/user-password-reset-routes.ts @@ -63,12 +63,19 @@ export function registerUserPasswordResetRoutes( */ router.post("/initiate-reset", async (req, res) => { try { - const row = db.$client - .prepare( - "SELECT value FROM settings WHERE key = 'allow_password_reset'", - ) - .get(); - if (row && (row as { value: string }).value !== "true") { + const envVal = process.env.ALLOW_PASSWORD_RESET; + const allowed = + envVal !== undefined + ? envVal.trim().toLowerCase() === "true" + : (() => { + const row = db.$client + .prepare( + "SELECT value FROM settings WHERE key = 'allow_password_reset'", + ) + .get(); + return row ? (row as { value: string }).value === "true" : true; + })(); + if (!allowed) { return res .status(403) .json({ error: "Password reset is currently disabled" }); @@ -346,8 +353,7 @@ export function registerUserPasswordResetRoutes( } const userId = user[0].id; - const saltRounds = parseInt(process.env.SALT || "10", 10); - const password_hash = await bcrypt.hash(newPassword, saltRounds); + const password_hash = await bcrypt.hash(newPassword, 10); let userIdFromJwt: string | null = null; const cookie = req.cookies?.jwt; diff --git a/src/backend/database/routes/user-preferences.ts b/src/backend/database/routes/user-preferences.ts index 97df7643..c99d6054 100644 --- a/src/backend/database/routes/user-preferences.ts +++ b/src/backend/database/routes/user-preferences.ts @@ -17,7 +17,7 @@ const pickPreferences = (row?: typeof userPreferences.$inferSelect) => ({ fontSize: row?.fontSize ?? null, accentColor: row?.accentColor ?? null, language: row?.language ?? null, - storageMode: row?.storageMode ?? "local", + storageMode: row?.storageMode ?? "cloud", commandAutocomplete: row?.commandAutocomplete ?? null, commandPaletteEnabled: row?.commandPaletteEnabled ?? null, showHostTags: row?.showHostTags ?? null, @@ -28,6 +28,8 @@ const pickPreferences = (row?: typeof userPreferences.$inferSelect) => ({ disableUpdateCheck: row?.disableUpdateCheck ?? null, confirmTabClose: row?.confirmTabClose ?? null, hiddenRailTabs: row?.hiddenRailTabs ?? null, + compactHostView: row?.compactHostView ?? null, + statusColorScheme: row?.statusColorScheme ?? null, }); /** @@ -92,6 +94,12 @@ const pickPreferences = (row?: typeof userPreferences.$inferSelect) => ({ * hiddenRailTabs: * type: string * nullable: true + * compactHostView: + * type: boolean + * nullable: true + * statusColorScheme: + * type: string + * nullable: true */ router.get("/", authenticateJWT, (req: Request, res: Response) => { const userId = (req as AuthenticatedRequest).userId; @@ -158,6 +166,10 @@ router.get("/", authenticateJWT, (req: Request, res: Response) => { * type: boolean * hiddenRailTabs: * type: string + * compactHostView: + * type: boolean + * statusColorScheme: + * type: string * responses: * 200: * description: Preferences updated successfully. @@ -181,6 +193,8 @@ router.put("/", authenticateJWT, (req: Request, res: Response) => { disableUpdateCheck, confirmTabClose, hiddenRailTabs, + compactHostView, + statusColorScheme, } = req.body as { reopenTabsOnLogin?: boolean; theme?: string | null; @@ -198,6 +212,8 @@ router.put("/", authenticateJWT, (req: Request, res: Response) => { disableUpdateCheck?: boolean | null; confirmTabClose?: boolean | null; hiddenRailTabs?: string | null; + compactHostView?: boolean | null; + statusColorScheme?: string | null; }; const updates: Partial = { @@ -220,6 +236,7 @@ router.put("/", authenticateJWT, (req: Request, res: Response) => { language, storageMode, hiddenRailTabs, + statusColorScheme, })) { if (value !== undefined && value !== null && typeof value !== "string") { return res.status(400).json({ error: `${key} must be a string` }); @@ -236,6 +253,7 @@ router.put("/", authenticateJWT, (req: Request, res: Response) => { confirmSnippetExecution, disableUpdateCheck, confirmTabClose, + compactHostView, }; for (const [key, value] of Object.entries(boolFields)) { if (value !== undefined && value !== null && typeof value !== "boolean") { @@ -263,6 +281,9 @@ router.put("/", authenticateJWT, (req: Request, res: Response) => { if (disableUpdateCheck !== undefined) updates.disableUpdateCheck = disableUpdateCheck; if (confirmTabClose !== undefined) updates.confirmTabClose = confirmTabClose; + if (compactHostView !== undefined) updates.compactHostView = compactHostView; + if (statusColorScheme !== undefined) + updates.statusColorScheme = statusColorScheme; if (Object.keys(updates).length === 1) { return res.status(400).json({ error: "No preferences provided" }); diff --git a/src/backend/database/routes/user-settings-routes.ts b/src/backend/database/routes/user-settings-routes.ts index 9083978f..2d82cbd9 100644 --- a/src/backend/database/routes/user-settings-routes.ts +++ b/src/backend/database/routes/user-settings-routes.ts @@ -15,6 +15,24 @@ function getDefaultGuacUrl(): string { return `${process.env.GUACD_HOST || "localhost"}:${process.env.GUACD_PORT || "4822"}`; } +export type HostDefaults = { + useSocks5?: boolean; + socks5Host?: string; + socks5Port?: number; + socks5Username?: string; + socks5Password?: string; + credentialId?: number | null; + metricsEnabled?: boolean; + statusCheckEnabled?: boolean; + fontSize?: number; + fontFamily?: string; + theme?: string; + cursorStyle?: string; + cursorBlink?: boolean; + enableSessionLogging?: boolean; + enableCommandHistory?: boolean; +}; + export function registerUserSettingsRoutes( router: Router, authenticateJWT: RequestHandler, @@ -544,4 +562,91 @@ export function registerUserSettingsRoutes( } }, ); + + /** + * @openapi + * /users/host-defaults: + * get: + * summary: Get host creation defaults + * description: Returns the global default settings applied when creating a new host. + * tags: + * - Users + * responses: + * 200: + * description: Host defaults object. + * 500: + * description: Failed to get host defaults. + */ + router.get("/host-defaults", authenticateJWT, async (_req, res) => { + try { + const row = db.$client + .prepare("SELECT value FROM settings WHERE key = 'host_defaults'") + .get() as { value: string } | undefined; + const defaults: HostDefaults = row ? JSON.parse(row.value) : {}; + res.json(defaults); + } catch (err) { + authLogger.error("Failed to get host defaults", err); + res.status(500).json({ error: "Failed to get host defaults" }); + } + }); + + /** + * @openapi + * /users/host-defaults: + * patch: + * summary: Update host creation defaults (admin only) + * description: Sets global default settings applied when a new host is created. + * tags: + * - Users + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * responses: + * 200: + * description: Host defaults updated. + * 403: + * description: Not authorized. + * 500: + * description: Failed to update host defaults. + */ + router.patch("/host-defaults", authenticateJWT, async (req, res) => { + const userId = (req as AuthenticatedRequest).userId; + try { + const user = await db.select().from(users).where(eq(users.id, userId)); + if (!user || user.length === 0 || !user[0].isAdmin) { + return res.status(403).json({ error: "Not authorized" }); + } + const defaults: HostDefaults = req.body; + db.$client + .prepare( + "INSERT OR REPLACE INTO settings (key, value) VALUES ('host_defaults', ?)", + ) + .run(JSON.stringify(defaults)); + + const { ipAddress, userAgent } = getRequestMeta(req); + const actorRecord = await db + .select({ username: users.username }) + .from(users) + .where(eq(users.id, userId)) + .limit(1); + await logAudit({ + userId, + username: actorRecord[0]?.username ?? userId, + action: "update_host_defaults", + resourceType: "setting", + details: JSON.stringify(defaults), + ipAddress, + userAgent, + success: true, + }); + + res.json(defaults); + } catch (err) { + authLogger.error("Failed to update host defaults", err); + res.status(500).json({ error: "Failed to update host defaults" }); + } + }); } diff --git a/src/backend/database/routes/user-totp-routes.ts b/src/backend/database/routes/user-totp-routes.ts index 32813359..07b78efd 100644 --- a/src/backend/database/routes/user-totp-routes.ts +++ b/src/backend/database/routes/user-totp-routes.ts @@ -5,6 +5,7 @@ import bcrypt from "bcryptjs"; import QRCode from "qrcode"; import speakeasy from "speakeasy"; import { AuthManager } from "../../utils/auth-manager.js"; +import { FieldCrypto } from "../../utils/field-crypto.js"; import { LazyFieldEncryption } from "../../utils/lazy-field-encryption.js"; import { authLogger } from "../../utils/logger.js"; import { loginRateLimiter } from "../../utils/login-rate-limiter.js"; @@ -28,6 +29,7 @@ type TotpUserRecord = typeof users.$inferSelect; export async function verifyTotpReauth( userRecord: TotpUserRecord, credential: string, + userDataKey?: Buffer | null, ): Promise { if (!userRecord.isOidc && userRecord.passwordHash) { const passwordMatch = await bcrypt.compare( @@ -40,22 +42,41 @@ export async function verifyTotpReauth( } if (userRecord.totpSecret) { - const totpMatch = speakeasy.totp.verify({ - secret: userRecord.totpSecret, - encoding: "base32", - token: credential, - window: 2, - }); - if (totpMatch) { - return true; + const totpSecret = userDataKey + ? LazyFieldEncryption.safeGetFieldValue( + userRecord.totpSecret, + userDataKey, + userRecord.id, + "totpSecret", + ) + : userRecord.totpSecret; + + if (totpSecret) { + const totpMatch = speakeasy.totp.verify({ + secret: totpSecret, + encoding: "base32", + token: credential, + window: 2, + }); + if (totpMatch) { + return true; + } } } + const rawBackupCodes = + userDataKey && userRecord.totpBackupCodes + ? LazyFieldEncryption.safeGetFieldValue( + userRecord.totpBackupCodes, + userDataKey, + userRecord.id, + "totpBackupCodes", + ) + : userRecord.totpBackupCodes; + let backupCodes: unknown = []; try { - backupCodes = userRecord.totpBackupCodes - ? JSON.parse(userRecord.totpBackupCodes) - : []; + backupCodes = rawBackupCodes ? JSON.parse(rawBackupCodes) : []; } catch { backupCodes = []; } @@ -63,9 +84,18 @@ export async function verifyTotpReauth( const backupIndex = backupCodes.indexOf(credential); if (backupIndex !== -1) { backupCodes.splice(backupIndex, 1); + const updatedJson = JSON.stringify(backupCodes); + const storedValue = userDataKey + ? FieldCrypto.encryptField( + updatedJson, + userDataKey, + userRecord.id, + "totpBackupCodes", + ) + : updatedJson; await db .update(users) - .set({ totpBackupCodes: JSON.stringify(backupCodes) }) + .set({ totpBackupCodes: storedValue }) .where(eq(users.id, userRecord.id)); return true; } @@ -172,6 +202,21 @@ export function registerUserTotpRoutes( } try { + const passwordLoginRow = db.$client + .prepare( + "SELECT value FROM settings WHERE key = 'allow_password_login'", + ) + .get() as { value: string } | undefined; + const passwordLoginAllowed = passwordLoginRow + ? passwordLoginRow.value === "true" + : true; + if (!passwordLoginAllowed) { + return res.status(409).json({ + error: + "Cannot enable 2FA while password login is disabled. Enable password login first.", + }); + } + const user = await db.select().from(users).where(eq(users.id, userId)); if (!user || user.length === 0) { return res.status(404).json({ error: "User not found" }); @@ -187,8 +232,18 @@ export function registerUserTotpRoutes( return res.status(400).json({ error: "TOTP setup not initiated" }); } + const userDataKey = authManager.getUserDataKey(userId); + const totpSecret = userDataKey + ? LazyFieldEncryption.safeGetFieldValue( + userRecord.totpSecret, + userDataKey, + userId, + "totpSecret", + ) + : userRecord.totpSecret; + const verified = speakeasy.totp.verify({ - secret: userRecord.totpSecret, + secret: totpSecret, encoding: "base32", token: totp_code, window: 2, @@ -202,11 +257,21 @@ export function registerUserTotpRoutes( Math.random().toString(36).substring(2, 10).toUpperCase(), ); + const backupCodesJson = JSON.stringify(backupCodes); + const storedBackupCodes = userDataKey + ? FieldCrypto.encryptField( + backupCodesJson, + userDataKey, + userId, + "totpBackupCodes", + ) + : backupCodesJson; + await db .update(users) .set({ totpEnabled: true, - totpBackupCodes: JSON.stringify(backupCodes), + totpBackupCodes: storedBackupCodes, }) .where(eq(users.id, userId)); @@ -297,7 +362,12 @@ export function registerUserTotpRoutes( return res.status(400).json({ error: "TOTP is not enabled" }); } - const verified = await verifyTotpReauth(userRecord, credential); + const userDataKey = authManager.getUserDataKey(userId); + const verified = await verifyTotpReauth( + userRecord, + credential, + userDataKey, + ); if (!verified) { return res .status(401) @@ -378,7 +448,12 @@ export function registerUserTotpRoutes( return res.status(400).json({ error: "TOTP is not enabled" }); } - const verified = await verifyTotpReauth(userRecord, credential); + const userDataKey = authManager.getUserDataKey(userId); + const verified = await verifyTotpReauth( + userRecord, + credential, + userDataKey, + ); if (!verified) { return res .status(401) @@ -389,9 +464,19 @@ export function registerUserTotpRoutes( Math.random().toString(36).substring(2, 10).toUpperCase(), ); + const backupCodesJson = JSON.stringify(backupCodes); + const storedBackupCodes = userDataKey + ? FieldCrypto.encryptField( + backupCodesJson, + userDataKey, + userId, + "totpBackupCodes", + ) + : backupCodesJson; + await db .update(users) - .set({ totpBackupCodes: JSON.stringify(backupCodes) }) + .set({ totpBackupCodes: storedBackupCodes }) .where(eq(users.id, userId)); res.json({ backup_codes: backupCodes }); diff --git a/src/backend/database/routes/users.ts b/src/backend/database/routes/users.ts index 9df534c7..d25a263d 100644 --- a/src/backend/database/routes/users.ts +++ b/src/backend/database/routes/users.ts @@ -2,7 +2,7 @@ import type { AuthenticatedRequest } from "../../../types/index.js"; import express from "express"; import { db } from "../db/index.js"; import { users, settings, roles, userRoles } from "../db/schema.js"; -import { eq } from "drizzle-orm"; +import { eq, and } from "drizzle-orm"; import bcrypt from "bcryptjs"; import { nanoid } from "nanoid"; import type { Request, Response } from "express"; @@ -22,9 +22,11 @@ import { verifyOIDCToken, extractOidcGroups, loadProviderConfig, + buildFetchOptions, } from "./user-oidc-utils.js"; import { registerUserApiKeyRoutes } from "./user-api-key-routes.js"; import { registerUserSettingsRoutes } from "./user-settings-routes.js"; +import { registerAcmeSSLRoutes } from "./acme-ssl-routes.js"; import { registerUserTotpRoutes } from "./user-totp-routes.js"; import { registerUserSessionRoutes } from "./user-session-routes.js"; import { registerUserOidcAccountRoutes } from "./user-oidc-account-routes.js"; @@ -43,6 +45,45 @@ function isNonEmptyString(val: unknown): val is string { return typeof val === "string" && val.trim().length > 0; } +function isRegistrationAllowed(): boolean { + const envVal = process.env.ALLOW_REGISTRATION; + if (envVal !== undefined) return envVal.trim().toLowerCase() === "true"; + try { + const row = db.$client + .prepare("SELECT value FROM settings WHERE key = 'allow_registration'") + .get() as { value: string } | undefined; + return row ? row.value === "true" : true; + } catch { + return true; + } +} + +function isPasswordLoginAllowed(): boolean { + const envVal = process.env.ALLOW_PASSWORD_LOGIN; + if (envVal !== undefined) return envVal.trim().toLowerCase() === "true"; + try { + const row = db.$client + .prepare("SELECT value FROM settings WHERE key = 'allow_password_login'") + .get() as { value: string } | undefined; + return row ? row.value === "true" : true; + } catch { + return true; + } +} + +function isPasswordResetAllowed(): boolean { + const envVal = process.env.ALLOW_PASSWORD_RESET; + if (envVal !== undefined) return envVal.trim().toLowerCase() === "true"; + try { + const row = db.$client + .prepare("SELECT value FROM settings WHERE key = 'allow_password_reset'") + .get() as { value: string } | undefined; + return row ? row.value === "true" : true; + } catch { + return true; + } +} + function isNativeAppRequest(req: Request): boolean { return ( (req.get("User-Agent") || "").startsWith("Termix-Mobile/") || @@ -85,20 +126,10 @@ const requireAdmin = authManager.createAdminMiddleware(); * description: Failed to create user. */ router.post("/create", async (req, res) => { - try { - const row = db.$client - .prepare("SELECT value FROM settings WHERE key = 'allow_registration'") - .get(); - if (row && (row as Record).value !== "true") { - return res - .status(403) - .json({ error: "Registration is currently disabled" }); - } - } catch (e) { - authLogger.warn("Failed to check registration status", { - operation: "registration_check", - error: e, - }); + if (!isRegistrationAllowed()) { + return res + .status(403) + .json({ error: "Registration is currently disabled" }); } const { username, password } = req.body; @@ -135,8 +166,7 @@ router.post("/create", async (req, res) => { return res.status(409).json({ error: "Username already exists" }); } - const saltRounds = parseInt(process.env.SALT || "10", 10); - const password_hash = await bcrypt.hash(password, saltRounds); + const password_hash = await bcrypt.hash(password, 10); const id = nanoid(); const isFirstUser = db.$client.transaction(() => { @@ -737,6 +767,9 @@ router.get("/oidc/callback", async (req, res) => { .run(`oidc_provider_${state}`); } + const caCert = config.ca_cert; + const fetchOptions = buildFetchOptions(caCert); + // GitHub does not issue OIDC id_tokens; handle its token exchange separately if (callbackProviderType === "github") { const ghTokenResponse = await fetch(config.token_url, { @@ -752,6 +785,7 @@ router.get("/oidc/callback", async (req, res) => { code: code, redirect_uri: backendCallbackUri, }), + ...fetchOptions, }); if (!ghTokenResponse.ok) { @@ -789,6 +823,7 @@ router.get("/oidc/callback", async (req, res) => { Accept: "application/json", "User-Agent": "Termix", }, + ...fetchOptions, }); if (!ghUserInfoResponse.ok) { return res @@ -859,16 +894,9 @@ router.get("/oidc/callback", async (req, res) => { "true"; if (!isFirstUser && !ghAutoProvision) { - const regRow = db.$client - .prepare( - "SELECT value FROM settings WHERE key = 'allow_registration'", - ) - .get() as { value: string } | undefined; - if (regRow && regRow.value !== "true") { - const redirectUrl = new URL(frontendOrigin); - redirectUrl.searchParams.set("error", "registration_disabled"); - return res.redirect(redirectUrl.toString()); - } + const redirectUrl = new URL(frontendOrigin); + redirectUrl.searchParams.set("error", "registration_disabled"); + return res.redirect(redirectUrl.toString()); } const ghId = nanoid(); @@ -972,7 +1000,6 @@ router.get("/oidc/callback", async (req, res) => { headers: { "Content-Type": "application/x-www-form-urlencoded", Accept: "application/json", - Authorization: `Basic ${Buffer.from(`${encodeURIComponent(config.client_id)}:${encodeURIComponent(config.client_secret)}`).toString("base64")}`, }, body: new URLSearchParams({ grant_type: "authorization_code", @@ -981,6 +1008,7 @@ router.get("/oidc/callback", async (req, res) => { code: code, redirect_uri: backendCallbackUri, }), + ...fetchOptions, }); if (!tokenResponse.ok) { @@ -1023,7 +1051,7 @@ router.get("/oidc/callback", async (req, res) => { try { const discoveryUrl = `${normalizedIssuerUrl}/.well-known/openid-configuration`; - const discoveryResponse = await fetch(discoveryUrl); + const discoveryResponse = await fetch(discoveryUrl, fetchOptions); if (discoveryResponse.ok) { const discovery = (await discoveryResponse.json()) as Record< string, @@ -1058,6 +1086,7 @@ router.get("/oidc/callback", async (req, res) => { tokenData.id_token as string, config.issuer_url, config.client_id, + caCert, ); } catch { try { @@ -1081,6 +1110,7 @@ router.get("/oidc/callback", async (req, res) => { headers: { Authorization: `Bearer ${tokenData.access_token}`, }, + ...fetchOptions, }); if (userInfoResponse.ok) { @@ -1190,33 +1220,17 @@ router.get("/oidc/callback", async (req, res) => { } if (!isFirstUser && !oidcAutoProvision) { - try { - const regRow = db.$client - .prepare( - "SELECT value FROM settings WHERE key = 'allow_registration'", - ) - .get(); - if (regRow && (regRow as Record).value !== "true") { - authLogger.warn( - "OIDC user attempted to register when registration is disabled", - { - operation: "oidc_registration_disabled", - identifier, - name, - }, - ); - - const redirectUrl = new URL(frontendOrigin); - redirectUrl.searchParams.set("error", "registration_disabled"); - - return res.redirect(redirectUrl.toString()); - } - } catch (e) { - authLogger.warn("Failed to check registration status during OIDC", { - operation: "oidc_registration_check", - error: e, - }); - } + authLogger.warn( + "OIDC user attempted to register but auto-provisioning is disabled", + { + operation: "oidc_registration_disabled", + identifier, + name, + }, + ); + const redirectUrl = new URL(frontendOrigin); + redirectUrl.searchParams.set("error", "registration_disabled"); + return res.redirect(redirectUrl.toString()); } const id = nanoid(); @@ -1367,6 +1381,39 @@ router.get("/oidc/callback", async (req, res) => { .set({ isAdmin: shouldBeAdmin }) .where(eq(users.id, userRecord.id)); userRecord.isAdmin = shouldBeAdmin; + try { + const newRoleName = shouldBeAdmin ? "admin" : "user"; + const oldRoleName = shouldBeAdmin ? "user" : "admin"; + const newRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, newRoleName)) + .limit(1); + const oldRole = await db + .select({ id: roles.id }) + .from(roles) + .where(eq(roles.name, oldRoleName)) + .limit(1); + if (oldRole.length > 0) { + await db + .delete(userRoles) + .where( + and( + eq(userRoles.userId, userRecord.id), + eq(userRoles.roleId, oldRole[0].id), + ), + ); + } + if (newRole.length > 0) { + await db.insert(userRoles).values({ + userId: userRecord.id, + roleId: newRole[0].id, + grantedBy: userRecord.id, + }); + } + } catch { + /* non-fatal */ + } authLogger.info("OIDC admin status synced", { operation: "oidc_admin_group_sync", userId: userRecord.id, @@ -1504,21 +1551,10 @@ router.post("/login", async (req, res) => { }); } - try { - const row = db.$client - .prepare("SELECT value FROM settings WHERE key = 'allow_password_login'") - .get(); - if (row && (row as { value: string }).value !== "true") { - return res - .status(403) - .json({ error: "Password authentication is currently disabled" }); - } - } catch (e) { - authLogger.error("Failed to check password login status", { - operation: "login_check", - error: e, - }); - return res.status(500).json({ error: "Failed to check login status" }); + if (!isPasswordLoginAllowed()) { + return res + .status(403) + .json({ error: "Password authentication is currently disabled" }); } try { @@ -1919,12 +1955,7 @@ router.get("/db-health", requireAdmin, async (req, res) => { */ router.get("/registration-allowed", async (req, res) => { try { - const row = db.$client - .prepare("SELECT value FROM settings WHERE key = 'allow_registration'") - .get(); - res.json({ - allowed: row ? (row as Record).value === "true" : true, - }); + res.json({ allowed: isRegistrationAllowed() }); } catch (err) { authLogger.error("Failed to get registration allowed", err); res.status(500).json({ error: "Failed to get registration allowed" }); @@ -2029,6 +2060,107 @@ router.patch("/oidc-auto-provision", authenticateJWT, async (req, res) => { } }); +/** + * @openapi + * /users/oidc-silent-login-default: + * get: + * summary: Get OIDC silent login default setting + * description: Returns whether silent OIDC login is enabled as the default behavior. + * tags: + * - Users + * responses: + * 200: + * description: Silent login default setting. + * 500: + * description: Failed to get setting. + */ +router.get("/oidc-silent-login-default", async (_req, res) => { + try { + const row = db.$client + .prepare( + "SELECT value FROM settings WHERE key = 'oidc_silent_login_default'", + ) + .get(); + res.json({ + enabled: row ? (row as Record).value === "true" : false, + }); + } catch (err) { + authLogger.error("Failed to get OIDC silent login default", err); + res.status(500).json({ error: "Failed to get OIDC silent login default" }); + } +}); + +/** + * @openapi + * /users/oidc-silent-login-default: + * patch: + * summary: Set OIDC silent login default setting + * description: Enables or disables silent OIDC login as the default behavior on the login page. + * tags: + * - Users + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * enabled: + * type: boolean + * responses: + * 200: + * description: Setting updated. + * 400: + * description: Invalid value. + * 403: + * description: Not authorized. + * 500: + * description: Failed to update setting. + */ +router.patch( + "/oidc-silent-login-default", + authenticateJWT, + async (req, res) => { + const userId = (req as AuthenticatedRequest).userId; + try { + const user = await db.select().from(users).where(eq(users.id, userId)); + if (!user || user.length === 0 || !user[0].isAdmin) { + return res.status(403).json({ error: "Not authorized" }); + } + const { enabled } = req.body; + if (typeof enabled !== "boolean") { + return res.status(400).json({ error: "Invalid value for enabled" }); + } + const existing = db.$client + .prepare( + "SELECT value FROM settings WHERE key = 'oidc_silent_login_default'", + ) + .get(); + if (existing) { + db.$client + .prepare( + "UPDATE settings SET value = ? WHERE key = 'oidc_silent_login_default'", + ) + .run(enabled ? "true" : "false"); + } else { + db.$client + .prepare( + "INSERT INTO settings (key, value) VALUES ('oidc_silent_login_default', ?)", + ) + .run(enabled ? "true" : "false"); + } + const { saveMemoryDatabaseToFile } = await import("../db/index.js"); + await saveMemoryDatabaseToFile(); + res.json({ enabled }); + } catch (err) { + authLogger.error("Failed to set OIDC silent login default", err); + res + .status(500) + .json({ error: "Failed to set OIDC silent login default" }); + } + }, +); + /** * @openapi * /users/password-login-allowed: @@ -2045,12 +2177,7 @@ router.patch("/oidc-auto-provision", authenticateJWT, async (req, res) => { */ router.get("/password-login-allowed", async (req, res) => { try { - const row = db.$client - .prepare("SELECT value FROM settings WHERE key = 'allow_password_login'") - .get(); - res.json({ - allowed: row ? (row as { value: string }).value === "true" : true, - }); + res.json({ allowed: isPasswordLoginAllowed() }); } catch (err) { authLogger.error("Failed to get password login allowed", err); res.status(500).json({ error: "Failed to get password login allowed" }); @@ -2095,6 +2222,17 @@ router.patch("/password-login-allowed", authenticateJWT, async (req, res) => { if (typeof allowed !== "boolean") { return res.status(400).json({ error: "Invalid value for allowed" }); } + if (!allowed) { + const totpRow = db.$client + .prepare("SELECT COUNT(*) as count FROM users WHERE totp_enabled = 1") + .get() as { count?: number }; + if ((totpRow?.count || 0) > 0) { + return res.status(409).json({ + error: + "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + }); + } + } db.$client .prepare( "INSERT OR REPLACE INTO settings (key, value) VALUES ('allow_password_login', ?)", @@ -2125,12 +2263,7 @@ router.patch("/password-login-allowed", authenticateJWT, async (req, res) => { */ router.get("/password-reset-allowed", async (req, res) => { try { - const row = db.$client - .prepare("SELECT value FROM settings WHERE key = 'allow_password_reset'") - .get(); - res.json({ - allowed: row ? (row as { value: string }).value === "true" : true, - }); + res.json({ allowed: isPasswordResetAllowed() }); } catch (err) { authLogger.error("Failed to get password reset allowed", err); res.status(500).json({ error: "Failed to get password reset allowed" }); @@ -2347,8 +2480,7 @@ router.post("/change-password", authenticateJWT, async (req, res) => { .json({ error: "Failed to update password and re-encrypt data." }); } - const saltRounds = parseInt(process.env.SALT || "10", 10); - const password_hash = await bcrypt.hash(newPassword, saltRounds); + const password_hash = await bcrypt.hash(newPassword, 10); await db .update(users) .set({ passwordHash: password_hash }) @@ -2518,6 +2650,7 @@ registerUserOidcAccountRoutes(router, { }); registerUserSettingsRoutes(router, authenticateJWT); +registerAcmeSSLRoutes(router, authenticateJWT); registerUserApiKeyRoutes(router, requireAdmin); diff --git a/src/backend/guacamole/routes.ts b/src/backend/guacamole/routes.ts index b7ac567a..a30f789a 100644 --- a/src/backend/guacamole/routes.ts +++ b/src/backend/guacamole/routes.ts @@ -5,8 +5,8 @@ import { AuthManager } from "../utils/auth-manager.js"; import { PermissionManager } from "../utils/permission-manager.js"; import { SimpleDBOps } from "../utils/simple-db-ops.js"; import { getDb } from "../database/db/index.js"; -import { hosts } from "../database/db/schema.js"; -import { eq } from "drizzle-orm"; +import { hosts, sshCredentials } from "../database/db/schema.js"; +import { eq, and } from "drizzle-orm"; import { Client } from "ssh2"; import net from "net"; import type { AuthenticatedRequest } from "../../types/index.js"; @@ -67,9 +67,15 @@ router.use(authManager.createAuthMiddleware()); */ router.post("/token", async (req, res) => { try { - const { type, hostname, port, username, password, domain, ...options } = + const { type, hostname, port, username, password, domain, ...rawOptions } = req.body; + // Strip "auto" sentinel values before forwarding to guacd + const options: Record = {}; + for (const [key, value] of Object.entries(rawOptions)) { + if (value !== "auto") options[key] = value; + } + if (!type || !hostname) { return res .status(400) @@ -261,12 +267,138 @@ router.post( } } + // Strip "auto" sentinel values — these mean "use guacd default" in the UI + // but guacd doesn't recognise "auto" as a valid parameter value. + for (const key of Object.keys(guacConfig)) { + if (guacConfig[key] === "auto") { + delete guacConfig[key]; + } + } + + // Extract per-connection guacd proxy settings before passing the rest as connection settings + const perConnectionGuacdHost = guacConfig["guacd-hostname"] as + | string + | undefined; + const perConnectionGuacdPortRaw = guacConfig["guacd-port"]; + const perConnectionGuacdPort = perConnectionGuacdPortRaw + ? parseInt(String(perConnectionGuacdPortRaw), 10) || undefined + : undefined; + delete guacConfig["guacd-hostname"]; + delete guacConfig["guacd-port"]; + if (guacConfig.dpi != null) { const parsed = parseInt(String(guacConfig.dpi), 10); guacConfig.dpi = Number.isFinite(parsed) && parsed > 0 ? parsed : undefined; } + const hostRecord = host as Record; + + // Backward compat: if authType is not stored but a credentialId is, treat as credential mode + const rdpEffectiveAuthType = + (host.rdpAuthType as string) || + (host.rdpCredentialId ? "credential" : "direct"); + const vncEffectiveAuthType = + (host.vncAuthType as string) || + (host.vncCredentialId ? "credential" : "direct"); + const telnetEffectiveAuthType = + (host.telnetAuthType as string) || + (hostRecord.telnetCredentialId ? "credential" : "direct"); + + if (rdpEffectiveAuthType === "credential" && host.rdpCredentialId) { + try { + const rdpCreds = await SimpleDBOps.select( + getDb() + .select() + .from(sshCredentials) + .where( + and( + eq(sshCredentials.id, host.rdpCredentialId as number), + eq(sshCredentials.userId, host.userId as string), + ), + ), + "ssh_credentials", + userId, + ); + if (rdpCreds.length > 0) { + const cred = rdpCreds[0] as Record; + if (cred.username) host.rdpUser = cred.username; + if (cred.password) host.rdpPassword = cred.password; + // domain is never sourced from credential + } + } catch (e) { + guacLogger.warn("Failed to resolve RDP credential", { + operation: "guac_rdp_credential_resolve", + hostId, + error: e instanceof Error ? e.message : "Unknown", + }); + } + } + + if (vncEffectiveAuthType === "credential" && host.vncCredentialId) { + try { + const vncCreds = await SimpleDBOps.select( + getDb() + .select() + .from(sshCredentials) + .where( + and( + eq(sshCredentials.id, host.vncCredentialId as number), + eq(sshCredentials.userId, host.userId as string), + ), + ), + "ssh_credentials", + userId, + ); + if (vncCreds.length > 0) { + const cred = vncCreds[0] as Record; + if (cred.password) host.vncPassword = cred.password; + if (cred.username) host.vncUser = cred.username; + } + } catch (e) { + guacLogger.warn("Failed to resolve VNC credential", { + operation: "guac_vnc_credential_resolve", + hostId, + error: e instanceof Error ? e.message : "Unknown", + }); + } + } + + if ( + telnetEffectiveAuthType === "credential" && + hostRecord.telnetCredentialId + ) { + try { + const telnetCreds = await SimpleDBOps.select( + getDb() + .select() + .from(sshCredentials) + .where( + and( + eq( + sshCredentials.id, + hostRecord.telnetCredentialId as number, + ), + eq(sshCredentials.userId, host.userId as string), + ), + ), + "ssh_credentials", + userId, + ); + if (telnetCreds.length > 0) { + const cred = telnetCreds[0] as Record; + if (cred.username) host.telnetUser = cred.username; + if (cred.password) host.telnetPassword = cred.password; + } + } catch (e) { + guacLogger.warn("Failed to resolve Telnet credential", { + operation: "guac_telnet_credential_resolve", + hostId, + error: e instanceof Error ? e.message : "Unknown", + }); + } + } + let token: string; let hostname = host.ip as string; let port = host.port as number; @@ -385,6 +517,15 @@ router.post( } } + const guacdOverrides = { + ...(perConnectionGuacdHost + ? { guacdHost: perConnectionGuacdHost } + : {}), + ...(perConnectionGuacdPort + ? { guacdPort: perConnectionGuacdPort } + : {}), + }; + switch (connectionType) { case "rdp": if (guacConfig["enable-drive"] && !guacConfig["drive-path"]) { @@ -405,6 +546,7 @@ router.post( ? !!host.ignoreCert : true, ...guacConfig, + ...guacdOverrides, }); break; case "vnc": @@ -416,6 +558,7 @@ router.post( port, security: "any", ...guacConfig, + ...guacdOverrides, }, ); break; @@ -423,6 +566,7 @@ router.post( token = tokenService.createTelnetToken(hostname, username, password, { port, ...guacConfig, + ...guacdOverrides, }); break; default: diff --git a/src/backend/guacamole/token-service.ts b/src/backend/guacamole/token-service.ts index 83a2c93a..0142ec94 100644 --- a/src/backend/guacamole/token-service.ts +++ b/src/backend/guacamole/token-service.ts @@ -3,6 +3,8 @@ import { guacLogger } from "../utils/logger.js"; export interface GuacamoleConnectionSettings { type: "rdp" | "vnc" | "telnet"; + guacdHost?: string; + guacdPort?: number; settings: { hostname: string; port?: number; @@ -120,18 +122,24 @@ export class GuacamoleTokenService { hostname: string, username: string, password: string, - options: Partial = {}, + options: Partial & { + guacdHost?: string; + guacdPort?: number; + } = {}, ): string { + const { guacdHost, guacdPort, ...settingsOptions } = options; const token: GuacamoleToken = { connection: { type: "rdp", + ...(guacdHost ? { guacdHost } : {}), + ...(guacdPort ? { guacdPort } : {}), settings: { hostname, - username, - password, + ...(username ? { username } : {}), + ...(password ? { password } : {}), port: 3389, "ignore-cert": true, - ...options, + ...settingsOptions, }, }, }; @@ -142,17 +150,23 @@ export class GuacamoleTokenService { hostname: string, username?: string, password?: string, - options: Partial = {}, + options: Partial & { + guacdHost?: string; + guacdPort?: number; + } = {}, ): string { + const { guacdHost, guacdPort, ...settingsOptions } = options; const token: GuacamoleToken = { connection: { type: "vnc", + ...(guacdHost ? { guacdHost } : {}), + ...(guacdPort ? { guacdPort } : {}), settings: { hostname, ...(username ? { username } : {}), password, port: 5900, - ...options, + ...settingsOptions, }, }, }; @@ -163,17 +177,23 @@ export class GuacamoleTokenService { hostname: string, username?: string, password?: string, - options: Partial = {}, + options: Partial & { + guacdHost?: string; + guacdPort?: number; + } = {}, ): string { + const { guacdHost, guacdPort, ...settingsOptions } = options; const token: GuacamoleToken = { connection: { type: "telnet", + ...(guacdHost ? { guacdHost } : {}), + ...(guacdPort ? { guacdPort } : {}), settings: { hostname, username, password, port: 23, - ...options, + ...settingsOptions, }, }, }; diff --git a/src/backend/ssh/auth-manager.ts b/src/backend/ssh/auth-manager.ts index e79e2db8..0d79a845 100644 --- a/src/backend/ssh/auth-manager.ts +++ b/src/backend/ssh/auth-manager.ts @@ -23,6 +23,7 @@ interface HostConfig { keyPassword?: string; keyType?: string; authType?: string; + useWarpgate?: boolean; credentialId?: number; userId?: string; forceKeyboardInteractive?: boolean; @@ -112,6 +113,7 @@ export class SSHAuthManager { prompts: Array<{ prompt: string; echo: boolean }>, finish: (responses: string[]) => void, resolvedCredentials: ResolvedCredentials, + hostConfig?: HostConfig, ): void { this.context.isKeyboardInteractive = true; const promptTexts = prompts.map((p) => p.prompt); @@ -143,7 +145,7 @@ export class SSHAuthManager { return; } - this.handlePasswordAuth(prompts, finish, resolvedCredentials); + this.handlePasswordAuth(prompts, finish, resolvedCredentials, hostConfig); } private handleWarpgateAuth( @@ -282,7 +284,22 @@ export class SSHAuthManager { prompts: Array<{ prompt: string; echo: boolean }>, finish: (responses: string[]) => void, resolvedCredentials: ResolvedCredentials, + hostConfig?: HostConfig, ): void { + // For Warpgate hosts: auto-answer password prompts silently using stored credentials. + // Warpgate sends a password prompt before its browser-verification round; we must + // not show a UI prompt here -- the WarpgateDialog handles user interaction later. + if (hostConfig?.useWarpgate) { + const responses = prompts.map((p) => { + if (/password/i.test(p.prompt) && resolvedCredentials.password) { + return resolvedCredentials.password as string; + } + return ""; + }); + finish(responses); + return; + } + const hasStoredPassword = resolvedCredentials.password && resolvedCredentials.authType !== "none"; @@ -290,19 +307,34 @@ export class SSHAuthManager { /password/i.test(p.prompt), ); - if (!hasStoredPassword && passwordPromptIndex !== -1) { + // Find the first prompt we can't auto-answer. This handles DUO/PAM challenges + // that don't say "password" (e.g. "Passcode or option (1-N):"). + const firstUnansweredIndex = prompts.findIndex((p) => { + if (/password/i.test(p.prompt) && hasStoredPassword) return false; + return true; + }); + + if (firstUnansweredIndex !== -1) { if (this.context.keyboardInteractiveResponded) { return; } this.context.keyboardInteractiveResponded = true; + const promptIndex = + passwordPromptIndex !== -1 && !hasStoredPassword + ? passwordPromptIndex + : firstUnansweredIndex; + this.context.keyboardInteractiveFinish = (userResponses: string[]) => { const userInput = (userResponses[0] || "").trim(); const responses = prompts.map((p, index) => { - if (index === passwordPromptIndex) { + if (index === promptIndex) { return userInput; } + if (/password/i.test(p.prompt) && resolvedCredentials.password) { + return resolvedCredentials.password; + } return ""; }); @@ -335,7 +367,7 @@ export class SSHAuthManager { this.context.ws.send( JSON.stringify({ type: "password_required", - prompt: prompts[passwordPromptIndex].prompt, + prompt: prompts[promptIndex].prompt, }), ); return; diff --git a/src/backend/ssh/credential-username.test.ts b/src/backend/ssh/credential-username.test.ts index fef686db..fc6a56e4 100644 --- a/src/backend/ssh/credential-username.test.ts +++ b/src/backend/ssh/credential-username.test.ts @@ -1,5 +1,8 @@ -import { describe, it, expect } from "vitest"; -import { pickResolvedUsername } from "./credential-username.js"; +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { + pickResolvedUsername, + expandOidcUsername, +} from "./credential-username.js"; describe("pickResolvedUsername", () => { it("keeps the host username when one is set, even with a credential username", () => { @@ -26,3 +29,70 @@ describe("pickResolvedUsername", () => { expect(pickResolvedUsername(undefined, undefined, false)).toBeUndefined(); }); }); + +describe("expandOidcUsername", () => { + beforeEach(() => { + vi.resetModules(); + }); + + it("returns the username unchanged when it has no placeholder", async () => { + expect(await expandOidcUsername("alice", "user-1")).toBe("alice"); + expect(await expandOidcUsername(undefined, "user-1")).toBeUndefined(); + }); + + it("expands the placeholder with the user's OIDC identifier", async () => { + vi.doMock("../database/db/index.js", () => ({ + getDb: () => ({ + select: () => ({ + from: () => ({ + where: () => ({ + limit: async () => [{ oidcIdentifier: "jdoe" }], + }), + }), + }), + }), + })); + vi.doMock("../database/db/schema.js", () => ({ users: {} })); + vi.doMock("drizzle-orm", () => ({ eq: vi.fn() })); + + const { expandOidcUsername: expand } = + await import("./credential-username.js"); + expect(await expand("$oidc.preferred_username", "user-1")).toBe("jdoe"); + }); + + it("leaves the placeholder as-is when the user has no OIDC identifier", async () => { + vi.doMock("../database/db/index.js", () => ({ + getDb: () => ({ + select: () => ({ + from: () => ({ + where: () => ({ + limit: async () => [{ oidcIdentifier: null }], + }), + }), + }), + }), + })); + vi.doMock("../database/db/schema.js", () => ({ users: {} })); + vi.doMock("drizzle-orm", () => ({ eq: vi.fn() })); + + const { expandOidcUsername: expand } = + await import("./credential-username.js"); + expect(await expand("$oidc.preferred_username", "user-1")).toBe( + "$oidc.preferred_username", + ); + }); + + it("returns the username unchanged when the DB lookup throws", async () => { + vi.doMock("../database/db/index.js", () => ({ + getDb: () => { + throw new Error("DB unavailable"); + }, + })); + + const { expandOidcUsername: expand } = + await import("./credential-username.js"); + expect(await expand("$oidc.preferred_username", "user-1")).toBe( + "$oidc.preferred_username", + ); + }); +}); diff --git a/src/backend/ssh/credential-username.ts b/src/backend/ssh/credential-username.ts index e0e15577..26f6d982 100644 --- a/src/backend/ssh/credential-username.ts +++ b/src/backend/ssh/credential-username.ts @@ -21,6 +21,40 @@ export function pickResolvedUsername( return cred; } +/** + * Expands the `$oidc.preferred_username` placeholder in an SSH username to the + * connecting user's OIDC identifier. Returns the username unchanged if it does + * not contain the placeholder or the user has no OIDC identifier. + */ +export async function expandOidcUsername( + username: string | undefined, + userId: string, +): Promise { + if (!username || !username.includes("$oidc.preferred_username")) { + return username; + } + + try { + const { getDb } = await import("../database/db/index.js"); + const { users } = await import("../database/db/schema.js"); + const { eq } = await import("drizzle-orm"); + + const db = getDb(); + const rows = await db + .select({ oidcIdentifier: users.oidcIdentifier }) + .from(users) + .where(eq(users.id, userId)) + .limit(1); + + const oidcIdentifier = rows[0]?.oidcIdentifier; + if (!oidcIdentifier) return username; + + return username.replace(/\$oidc\.preferred_username/g, oidcIdentifier); + } catch { + return username; + } +} + function isNonEmptyString(value: unknown): value is string { return typeof value === "string" && value.trim() !== ""; } diff --git a/src/backend/ssh/docker-container-routes.ts b/src/backend/ssh/docker-container-routes.ts index f9c71e50..d6c8dc8d 100644 --- a/src/backend/ssh/docker-container-routes.ts +++ b/src/backend/ssh/docker-container-routes.ts @@ -8,6 +8,7 @@ type DockerSession = { lastActive: number; activeOperations: number; hostId?: number; + isWindows?: boolean; }; type PendingDockerTotpSession = unknown; @@ -93,7 +94,10 @@ export function registerDockerContainerRoutes( try { const allFlag = all ? "-a " : ""; - const command = `docker ps ${allFlag}--format '{"id":"{{.ID}}","name":"{{.Names}}","image":"{{.Image}}","status":"{{.Status}}","state":"{{.State}}","ports":"{{.Ports}}","created":"{{.CreatedAt}}"}'`; + const formatStr = session.isWindows + ? `"{\\"id\\":\\"{{.ID}}\\",\\"name\\":\\"{{.Names}}\\",\\"image\\":\\"{{.Image}}\\",\\"status\\":\\"{{.Status}}\\",\\"state\\":\\"{{.State}}\\",\\"ports\\":\\"{{.Ports}}\\",\\"created\\":\\"{{.CreatedAt}}\\"}"` + : `'{"id":"{{.ID}}","name":"{{.Names}}","image":"{{.Image}}","status":"{{.Status}}","state":"{{.State}}","ports":"{{.Ports}}","created":"{{.CreatedAt}}"}' `; + const command = `docker ps ${allFlag}--format ${formatStr}`; const output = await executeDockerCommand( session, @@ -916,7 +920,7 @@ export function registerDockerContainerRoutes( session.activeOperations++; try { - let command = `docker logs ${containerId} 2>&1`; + let command = `docker logs ${containerId}`; if (tail && tail > 0) { command += ` --tail ${Math.floor(tail)}`; @@ -934,6 +938,8 @@ export function registerDockerContainerRoutes( command += ` --until ${until}`; } + command += " 2>&1"; + const logs = await executeDockerCommand( session, command, @@ -1026,7 +1032,10 @@ export function registerDockerContainerRoutes( session.activeOperations++; try { - const command = `docker stats ${containerId} --no-stream --format '{"cpu":"{{.CPUPerc}}","memory":"{{.MemUsage}}","memoryPercent":"{{.MemPerc}}","netIO":"{{.NetIO}}","blockIO":"{{.BlockIO}}","pids":"{{.PIDs}}"}'`; + const statsFormatStr = session.isWindows + ? `"{\\"cpu\\":\\"{{.CPUPerc}}\\",\\"memory\\":\\"{{.MemUsage}}\\",\\"memoryPercent\\":\\"{{.MemPerc}}\\",\\"netIO\\":\\"{{.NetIO}}\\",\\"blockIO\\":\\"{{.BlockIO}}\\",\\"pids\\":\\"{{.PIDs}}\\"}"` + : `'{"cpu":"{{.CPUPerc}}","memory":"{{.MemUsage}}","memoryPercent":"{{.MemPerc}}","netIO":"{{.NetIO}}","blockIO":"{{.BlockIO}}","pids":"{{.PIDs}}"}' `; + const command = `docker stats ${containerId} --no-stream --format ${statsFormatStr}`; const output = await executeDockerCommand( session, diff --git a/src/backend/ssh/docker.ts b/src/backend/ssh/docker.ts index a3cf1ec6..8523e620 100644 --- a/src/backend/ssh/docker.ts +++ b/src/backend/ssh/docker.ts @@ -44,6 +44,7 @@ interface SSHSession { activeOperations: number; hostId?: number; userId?: string; + isWindows?: boolean; } interface PendingTOTPSession { @@ -852,9 +853,10 @@ app.post("/docker/ssh/connect", async (req, res) => { if ( resolvedCredentials.authType === "none" || - resolvedCredentials.authType === "tailscale" + resolvedCredentials.authType === "tailscale" || + resolvedCredentials.authType === "warpgate" ) { - // Tailscale SSH and "none" auth: no credentials needed + // Tailscale SSH, "none", and Warpgate auth: no static credentials } else if (resolvedCredentials.authType === "password") { if (resolvedCredentials.password) { config.password = resolvedCredentials.password; @@ -1038,7 +1040,7 @@ app.post("/docker/ssh/connect", async (req, res) => { ), ); - sshSessions[sessionId] = { + const session: SSHSession = { client, isConnected: true, lastActive: Date.now(), @@ -1047,8 +1049,24 @@ app.post("/docker/ssh/connect", async (req, res) => { userId, }; + sshSessions[sessionId] = session; scheduleSessionCleanup(sessionId); + client.exec("ver", (err, stream) => { + if (!err && stream) { + let output = ""; + stream.on("data", (d: Buffer) => { + output += d.toString(); + }); + stream.on("close", () => { + if (output.toLowerCase().includes("windows")) { + session.isWindows = true; + } + }); + stream.stderr.on("data", () => {}); + } + }); + res.json({ success: true, message: "SSH connection established", @@ -1313,6 +1331,11 @@ app.post("/docker/ssh/connect", async (req, res) => { /password/i.test(p.prompt), ); + if (resolvedCredentials.authType === "warpgate") { + finish(prompts.map(() => "")); + return; + } + if ( (resolvedCredentials.authType === "none" || resolvedCredentials.authType === "tailscale") && @@ -2144,7 +2167,7 @@ app.get("/docker/validate/:sessionId", async (req, res) => { try { await executeDockerCommand( session, - "docker ps >/dev/null 2>&1", + "docker ps", sessionId, userId, session.hostId, diff --git a/src/backend/ssh/file-manager-content-routes.ts b/src/backend/ssh/file-manager-content-routes.ts index 0c18f877..6d12ed4f 100644 --- a/src/backend/ssh/file-manager-content-routes.ts +++ b/src/backend/ssh/file-manager-content-routes.ts @@ -1,4 +1,5 @@ -import type { Express } from "express"; +import type { Express, Request, Response } from "express"; +import Busboy from "busboy"; import type { AuthenticatedRequest } from "../../types/index.js"; import { fileLogger } from "../utils/logger.js"; import { @@ -1302,4 +1303,208 @@ export function registerFileContentRoutes( trySFTP(); }); + + /** + * @openapi + * /ssh/file_manager/ssh/uploadFileStream: + * post: + * summary: Stream-upload a file via multipart form + * description: Uploads a file to the remote host by streaming multipart form data directly into an SFTP write stream, avoiding full in-memory buffering. + * tags: + * - File Manager + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * required: + * - sessionId + * - path + * - file + * properties: + * sessionId: + * type: string + * path: + * type: string + * file: + * type: string + * format: binary + * responses: + * 200: + * description: File uploaded successfully. + * 400: + * description: Missing required parameters or SSH connection not established. + * 500: + * description: Failed to upload file. + */ + app.post( + "/ssh/file_manager/ssh/uploadFileStream", + (req: Request, res: Response) => { + const userId = (req as AuthenticatedRequest).userId; + + const contentType = req.headers["content-type"] || ""; + if (!contentType.includes("multipart/form-data")) { + return res + .status(400) + .json({ error: "Expected multipart/form-data request" }); + } + + let sessionId: string | undefined; + let remotePath: string | undefined; + let fileName: string | undefined; + let uploadStartTime: number; + let resolved = false; + + const bb = Busboy({ headers: req.headers }); + + bb.on("field", (name: string, value: string) => { + if (name === "sessionId") sessionId = value; + if (name === "path") remotePath = value; + }); + + bb.on( + "file", + ( + fieldname: string, + fileStream: NodeJS.ReadableStream, + info: { filename: string; encoding: string; mimeType: string }, + ) => { + fileName = info.filename; + + if (!sessionId || !remotePath || !fileName) { + fileStream.resume(); + if (!resolved) { + resolved = true; + res + .status(400) + .json({ error: "Missing sessionId or path field" }); + } + return; + } + + const sshConn = sshSessions[sessionId]; + if (!sshConn?.isConnected) { + fileStream.resume(); + if (!resolved) { + resolved = true; + res.status(400).json({ error: "SSH connection not established" }); + } + return; + } + + if (!verifySessionOwnership(sshConn, userId)) { + fileStream.resume(); + if (!resolved) { + resolved = true; + res.status(403).json({ error: "Session access denied" }); + } + return; + } + + sshConn.lastActive = Date.now(); + uploadStartTime = Date.now(); + + const fullPath = remotePath.endsWith("/") + ? remotePath + fileName + : remotePath + "/" + fileName; + + fileLogger.info("Streaming file upload started", { + operation: "file_upload_stream_start", + sessionId, + userId, + path: fullPath, + }); + + getSessionSftp(sshConn) + .then((sftp) => { + const writeStream = sftp.createWriteStream(fullPath); + + writeStream.on("error", (err) => { + fileLogger.error("SFTP write stream error during upload:", err); + if (!resolved) { + resolved = true; + res + .status(500) + .json({ error: `Upload failed: ${err.message}` }); + } + }); + + writeStream.on("finish", () => { + if (resolved) return; + resolved = true; + fileLogger.success("Streaming file upload completed", { + operation: "file_upload_stream_complete", + sessionId, + userId, + path: fullPath, + duration: Date.now() - uploadStartTime, + }); + res.json({ + message: "File uploaded successfully", + path: fullPath, + toast: { + type: "success", + message: `File uploaded: ${fullPath}`, + }, + }); + }); + + writeStream.on("close", () => { + if (resolved) return; + resolved = true; + fileLogger.success("Streaming file upload completed", { + operation: "file_upload_stream_complete", + sessionId, + userId, + path: fullPath, + duration: Date.now() - uploadStartTime, + }); + res.json({ + message: "File uploaded successfully", + path: fullPath, + toast: { + type: "success", + message: `File uploaded: ${fullPath}`, + }, + }); + }); + + fileStream.on("error", (err) => { + fileLogger.error("File read stream error during upload:", err); + writeStream.destroy(); + if (!resolved) { + resolved = true; + res + .status(500) + .json({ error: `Upload stream error: ${err.message}` }); + } + }); + + (fileStream as NodeJS.ReadableStream).pipe( + writeStream as unknown as NodeJS.WritableStream, + ); + }) + .catch((err: Error) => { + fileStream.resume(); + fileLogger.error("SFTP session error during stream upload:", err); + if (!resolved) { + resolved = true; + res.status(500).json({ error: `SFTP error: ${err.message}` }); + } + }); + }, + ); + + bb.on("error", (err: Error) => { + fileLogger.error("Busboy parse error during stream upload:", err); + if (!resolved) { + resolved = true; + res.status(500).json({ error: `Upload parse error: ${err.message}` }); + } + }); + + req.pipe(bb); + }, + ); } diff --git a/src/backend/ssh/file-manager-download-routes.ts b/src/backend/ssh/file-manager-download-routes.ts index 75a80638..e7e58d60 100644 --- a/src/backend/ssh/file-manager-download-routes.ts +++ b/src/backend/ssh/file-manager-download-routes.ts @@ -2,7 +2,11 @@ import type { Express } from "express"; import type { AuthenticatedRequest } from "../../types/index.js"; import { fileLogger } from "../utils/logger.js"; import { getMimeType } from "./file-manager-utils.js"; -import { getSessionSftp, type SSHSession } from "./file-manager-session.js"; +import { + execChannel, + getSessionSftp, + type SSHSession, +} from "./file-manager-session.js"; type FileDownloadRoutesDeps = { sshSessions: Record; @@ -10,6 +14,37 @@ type FileDownloadRoutesDeps = { verifySessionOwnership: (session: SSHSession, userId: string) => boolean; }; +function escapeSingleQuotes(path: string): string { + return path.replace(/'/g, "'\"'\"'"); +} + +function downloadViaExec( + session: SSHSession, + filePath: string, +): Promise { + return new Promise((resolve, reject) => { + const escaped = escapeSingleQuotes(filePath); + execChannel(session, `cat '${escaped}'`, (err, stream) => { + if (err) return reject(err); + const chunks: Buffer[] = []; + let stderr = ""; + stream.on("data", (chunk: Buffer) => chunks.push(chunk)); + stream.stderr.on("data", (chunk: Buffer) => { + stderr += chunk.toString(); + }); + stream.on("close", (code: number) => { + if (code !== 0) { + return reject( + new Error(stderr.trim() || `cat exited with code ${code}`), + ); + } + resolve(Buffer.concat(chunks)); + }); + stream.on("error", reject); + }); + }); +} + export function registerFileDownloadRoutes( app: Express, { @@ -23,7 +58,7 @@ export function registerFileDownloadRoutes( * /ssh/file_manager/ssh/downloadFile: * post: * summary: Download a file - * description: Downloads a file from the remote host. + * description: Downloads a file from the remote host. Uses SCP legacy mode (cat over exec) when the host has scpLegacy enabled, otherwise uses SFTP. * tags: * - File Manager * requestBody: @@ -88,6 +123,45 @@ export function registerFileDownloadRoutes( sshConn.lastActive = Date.now(); scheduleSessionCleanup(sessionId); + + if (sshConn.scpLegacy) { + fileLogger.info( + "Downloading file via legacy exec/cat (SCP legacy mode)", + { + operation: "file_download_legacy", + sessionId, + userId, + path: filePath, + }, + ); + + try { + const data = await downloadViaExec(sshConn, filePath); + const fileName = filePath.split("/").pop() || "download"; + fileLogger.success("File download completed (legacy mode)", { + operation: "file_download_complete", + sessionId, + userId, + hostId, + path: filePath, + bytes: data.length, + duration: Date.now() - downloadStartTime, + }); + return res.json({ + content: data.toString("base64"), + fileName, + size: data.length, + mimeType: getMimeType(fileName), + path: filePath, + }); + } catch (err) { + fileLogger.error("Legacy exec/cat download failed:", err); + return res.status(500).json({ + error: `Failed to download file: ${(err as Error).message}`, + }); + } + } + fileLogger.info("Opening SFTP channel", { operation: "file_sftp_open", sessionId, @@ -168,6 +242,33 @@ export function registerFileDownloadRoutes( }); }); + /** + * @openapi + * /ssh/file_manager/ssh/downloadFileStream: + * post: + * summary: Stream-download a file + * description: Downloads a file as a binary stream. Uses SCP legacy mode (cat over exec) when the host has scpLegacy enabled, otherwise uses SFTP. + * tags: + * - File Manager + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * sessionId: + * type: string + * path: + * type: string + * responses: + * 200: + * description: Binary file stream. + * 400: + * description: Missing required parameters. + * 500: + * description: Download failed. + */ app.post("/ssh/file_manager/ssh/downloadFileStream", async (req, res) => { const { sessionId, path: filePath } = req.body; const userId = (req as AuthenticatedRequest).userId; @@ -188,6 +289,43 @@ export function registerFileDownloadRoutes( sshConn.lastActive = Date.now(); + const fileName = filePath.split("/").pop() || "download"; + res.setHeader("Content-Type", "application/octet-stream"); + res.setHeader( + "Content-Disposition", + `attachment; filename="${encodeURIComponent(fileName)}"`, + ); + + if (sshConn.scpLegacy) { + fileLogger.info("Streaming file via legacy exec/cat (SCP legacy mode)", { + operation: "file_download_stream_legacy", + sessionId, + userId, + path: filePath, + }); + + const escaped = escapeSingleQuotes(filePath); + execChannel(sshConn, `cat '${escaped}'`, (err, stream) => { + if (err) { + if (!res.headersSent) { + res.status(500).json({ error: `Download failed: ${err.message}` }); + } + return; + } + stream.on("error", (streamErr: Error) => { + if (!res.headersSent) { + res + .status(500) + .json({ error: `Download failed: ${streamErr.message}` }); + } else { + res.destroy(); + } + }); + stream.pipe(res); + }); + return; + } + try { const sftp = await getSessionSftp(sshConn); const stats = await new Promise<{ size: number; isFile: () => boolean }>( @@ -200,12 +338,6 @@ export function registerFileDownloadRoutes( return res.status(400).json({ error: "Cannot download directories" }); } - const fileName = filePath.split("/").pop() || "download"; - res.setHeader("Content-Type", "application/octet-stream"); - res.setHeader( - "Content-Disposition", - `attachment; filename="${encodeURIComponent(fileName)}"`, - ); res.setHeader("Content-Length", String(stats.size)); const readStream = sftp.createReadStream(filePath); diff --git a/src/backend/ssh/file-manager-operation-routes.ts b/src/backend/ssh/file-manager-operation-routes.ts index c1653680..3cbf25ee 100644 --- a/src/backend/ssh/file-manager-operation-routes.ts +++ b/src/backend/ssh/file-manager-operation-routes.ts @@ -6,6 +6,7 @@ import { execWithSudo, type SSHSession, } from "./file-manager-session.js"; +import { isWindowsSftpPath } from "./transfer-paths.js"; type FileOperationRoutesDeps = { sshSessions: Record; @@ -373,11 +374,23 @@ export function registerFileOperationRoutes( type: isDirectory ? "directory" : "file", }); sshConn.lastActive = Date.now(); - const escapedPath = itemPath.replace(/'/g, "'\"'\"'"); - const deleteCommand = isDirectory - ? `rm -rf '${escapedPath}'` - : `rm -f '${escapedPath}'`; + const isWindowsPath = isWindowsSftpPath(itemPath); + let deleteCommand: string; + if (isWindowsPath) { + const winPath = itemPath + .replace(/\//g, "\\") + .replace(/^\\([A-Za-z]:\\)/, "$1"); + const escapedWinPath = winPath.replace(/"/g, '""'); + deleteCommand = isDirectory + ? `rd /s /q "${escapedWinPath}"` + : `del /f /q "${escapedWinPath}"`; + } else { + const escapedPath = itemPath.replace(/'/g, "'\"'\"'"); + deleteCommand = isDirectory + ? `rm -rf '${escapedPath}'` + : `rm -f '${escapedPath}'`; + } const executeDelete = (useSudo: boolean): Promise => { return new Promise((resolve) => { @@ -465,10 +478,6 @@ export function registerFileOperationRoutes( }, }); } else { - // The shell didn't echo our SUCCESS sentinel. This happens on - // non-POSIX shells (e.g. Windows PowerShell, where `rm -f` is - // not supported) and the command can exit 0 while doing nothing. - // Surface whatever the shell produced so the failure isn't silent. const detail = errorData.trim() || outputData.trim() || diff --git a/src/backend/ssh/file-manager-session.ts b/src/backend/ssh/file-manager-session.ts index 1bbebf22..8c11081e 100644 --- a/src/backend/ssh/file-manager-session.ts +++ b/src/backend/ssh/file-manager-session.ts @@ -39,6 +39,7 @@ export interface SSHSession { transferDedicated?: boolean; transferId?: string; browseSessionId?: string; + scpLegacy?: boolean; } export interface PendingTOTPSession { diff --git a/src/backend/ssh/file-manager.ts b/src/backend/ssh/file-manager.ts index 5b06c46f..338049f1 100644 --- a/src/backend/ssh/file-manager.ts +++ b/src/backend/ssh/file-manager.ts @@ -132,6 +132,7 @@ async function buildDedicatedTransferConnectConfig( client: SSHClient, ): Promise> { const { ip, port, username } = host; + const preloadedHostData = await SSHHostKeyVerifier.preloadHostData(host.id); const config: Record = { host: ip?.replace(/^\[|\]$/g, "") || ip, port, @@ -149,6 +150,7 @@ async function buildDedicatedTransferConnectConfig( null, userId, false, + preloadedHostData, ), env: { TERM: "xterm-256color", @@ -726,6 +728,13 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { let resolvedPort = port; let resolvedUsername = username; let resolvedJumpHosts = jumpHosts; + let resolvedScpLegacy = false; + let resolvedUseSocks5 = useSocks5; + let resolvedSocks5Host = socks5Host; + let resolvedSocks5Port = socks5Port; + let resolvedSocks5Username = socks5Username; + let resolvedSocks5Password = socks5Password; + let resolvedSocks5ProxyChain = socks5ProxyChain; if (hostId && userId && !password && !sshKey) { try { const { resolveHostById } = await import("./host-resolver.js"); @@ -743,6 +752,15 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { }; hostKeepaliveInterval = resolvedHost.terminalConfig?.keepaliveInterval; hostKeepaliveCountMax = resolvedHost.terminalConfig?.keepaliveCountMax; + resolvedScpLegacy = resolvedHost.scpLegacy ?? false; + if (resolvedHost.useSocks5) { + resolvedUseSocks5 = resolvedHost.useSocks5; + resolvedSocks5Host = resolvedHost.socks5Host; + resolvedSocks5Port = resolvedHost.socks5Port; + resolvedSocks5Username = resolvedHost.socks5Username; + resolvedSocks5Password = resolvedHost.socks5Password; + resolvedSocks5ProxyChain = resolvedHost.socks5ProxyChain; + } if ( (!resolvedJumpHosts || resolvedJumpHosts.length === 0) && resolvedHost.jumpHosts && @@ -790,6 +808,15 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { }; hostKeepaliveInterval = resolvedHost.terminalConfig?.keepaliveInterval; hostKeepaliveCountMax = resolvedHost.terminalConfig?.keepaliveCountMax; + resolvedScpLegacy = resolvedHost.scpLegacy ?? false; + if (resolvedHost.useSocks5) { + resolvedUseSocks5 = resolvedHost.useSocks5; + resolvedSocks5Host = resolvedHost.socks5Host; + resolvedSocks5Port = resolvedHost.socks5Port; + resolvedSocks5Username = resolvedHost.socks5Username; + resolvedSocks5Password = resolvedHost.socks5Password; + resolvedSocks5ProxyChain = resolvedHost.socks5ProxyChain; + } if ( (!resolvedJumpHosts || resolvedJumpHosts.length === 0) && resolvedHost.jumpHosts && @@ -822,6 +849,7 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { } } + const preloadedHostData = await SSHHostKeyVerifier.preloadHostData(hostId); const config: Record = { host: resolvedIp?.replace(/^\[|\]$/g, "") || resolvedIp, port: resolvedPort, @@ -829,10 +857,12 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { tryKeyboard: true, keepaliveInterval: typeof hostKeepaliveInterval === "number" - ? hostKeepaliveInterval * 1000 + ? Math.max(5000, hostKeepaliveInterval * 1000) : 60000, keepaliveCountMax: - typeof hostKeepaliveCountMax === "number" ? hostKeepaliveCountMax : 5, + typeof hostKeepaliveCountMax === "number" + ? Math.max(1, hostKeepaliveCountMax) + : 5, readyTimeout: 60000, tcpKeepAlive: true, tcpKeepAliveInitialDelay: 30000, @@ -843,6 +873,7 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { null, userId, false, + preloadedHostData, ), env: { TERM: "xterm-256color", @@ -1015,7 +1046,8 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { } } else if ( resolvedCredentials.authType === "none" || - resolvedCredentials.authType === "tailscale" + resolvedCredentials.authType === "tailscale" || + resolvedCredentials.authType === "warpgate" ) { connectionLogs.push( createConnectionLog( @@ -1109,6 +1141,7 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { hostId, username, sudoPassword: resolvedCredentials.sudoPassword, + scpLegacy: resolvedScpLegacy, }; scheduleSessionCleanup(sessionId); res.json({ @@ -1266,6 +1299,14 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { } if ( + err.message.includes("Cannot parse privateKey") && + err.message.includes("no passphrase") + ) { + res.json({ + status: "passphrase_required", + connectionLogs, + }); + } else if ( (resolvedCredentials.authType === "none" || resolvedCredentials.authType === "tailscale") && (err.message.includes("authentication") || @@ -1426,12 +1467,18 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { const hasStoredPassword = resolvedCredentials.password && resolvedCredentials.authType !== "none" && - resolvedCredentials.authType !== "tailscale"; + resolvedCredentials.authType !== "tailscale" && + resolvedCredentials.authType !== "warpgate"; const passwordPromptIndex = prompts.findIndex((p) => /password/i.test(p.prompt), ); + if (resolvedCredentials.authType === "warpgate") { + finish(prompts.map(() => "")); + return; + } + if ( (resolvedCredentials.authType === "none" || resolvedCredentials.authType === "tailscale") && @@ -1512,16 +1559,17 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { ); const proxyConfig: SOCKS5Config | null = - useSocks5 && - (socks5Host || - (socks5ProxyChain && (socks5ProxyChain as ProxyNode[]).length > 0)) + resolvedUseSocks5 && + (resolvedSocks5Host || + (resolvedSocks5ProxyChain && + (resolvedSocks5ProxyChain as ProxyNode[]).length > 0)) ? { - useSocks5, - socks5Host, - socks5Port, - socks5Username, - socks5Password, - socks5ProxyChain: socks5ProxyChain as ProxyNode[], + useSocks5: resolvedUseSocks5, + socks5Host: resolvedSocks5Host, + socks5Port: resolvedSocks5Port, + socks5Username: resolvedSocks5Username, + socks5Password: resolvedSocks5Password, + socks5ProxyChain: resolvedSocks5ProxyChain as ProxyNode[], } : null; @@ -1571,7 +1619,37 @@ app.post("/ssh/file_manager/ssh/connect", async (req, res) => { }); } + let forwardOutDone = false; + const forwardOutTimeout = setTimeout(() => { + if (!forwardOutDone) { + forwardOutDone = true; + fileLogger.error("Timeout waiting for jump host forwardOut", { + operation: "file_jump_forward_timeout", + sessionId, + hostId, + ip, + port, + }); + connectionLogs.push( + createConnectionLog( + "error", + "jump", + "Timed out waiting for jump host tunnel to target host", + ), + ); + jumpClient.end(); + res.status(500).json({ + error: "Jump host tunnel timed out", + connectionLogs, + }); + } + }, 30000); + jumpClient.forwardOut("127.0.0.1", 0, ip, port, (err, stream) => { + if (forwardOutDone) return; + forwardOutDone = true; + clearTimeout(forwardOutTimeout); + if (err) { fileLogger.error("Failed to forward through jump host", err, { operation: "file_jump_forward", diff --git a/src/backend/ssh/host-key-verifier.ts b/src/backend/ssh/host-key-verifier.ts index 8edf81b3..baf20a95 100644 --- a/src/backend/ssh/host-key-verifier.ts +++ b/src/backend/ssh/host-key-verifier.ts @@ -21,6 +21,37 @@ interface VerificationResponse { } export class SSHHostKeyVerifier { + /** + * Pre-fetches the host record from the database so the verifier callback + * during SSH key exchange doesn't need to do an async DB query. This keeps + * the key exchange critical path fast, avoiding LoginGraceTime expiry on + * the remote server (especially important for jump-host tunneled connections). + */ + static async preloadHostData(hostId: number | null): Promise<{ + hostKeyFingerprint: string | null; + hostKeyType: string | null; + hostKeyAlgorithm: string | null; + hostKeyChangedCount: number | null; + name: string | null; + } | null> { + if (!hostId) return null; + try { + const host = await db.query.hosts.findFirst({ + where: eq(hosts.id, hostId), + columns: { + hostKeyFingerprint: true, + hostKeyType: true, + hostKeyAlgorithm: true, + hostKeyChangedCount: true, + name: true, + }, + }); + return host ?? null; + } catch { + return null; + } + } + static async createHostVerifier( hostId: number | null, ip: string, @@ -28,6 +59,9 @@ export class SSHHostKeyVerifier { ws: WebSocket | null, userId: string, isJumpHost: boolean = false, + preloadedHost?: Awaited< + ReturnType + >, ): Promise<(hostkey: Buffer, verify: (valid: boolean) => void) => void> { return (hostkey: Buffer, verify: (valid: boolean) => void): void => { (async () => { @@ -52,9 +86,10 @@ export class SSHHostKeyVerifier { return; } - const host = await db.query.hosts.findFirst({ - where: eq(hosts.id, hostId), - }); + const host = + preloadedHost !== undefined + ? preloadedHost + : await db.query.hosts.findFirst({ where: eq(hosts.id, hostId) }); if (!host) { sshLogger.warn( @@ -141,13 +176,6 @@ export class SSHHostKeyVerifier { } if (host.hostKeyFingerprint === fingerprint) { - await db - .update(hosts) - .set({ - hostKeyLastVerified: new Date().toISOString(), - }) - .where(eq(hosts.id, hostId)); - sshLogger.info("Host key verified successfully", { operation: "host_key_verified", hostId, @@ -158,7 +186,18 @@ export class SSHHostKeyVerifier { userId, }); + // Verify first, then update the timestamp asynchronously so the + // DB write doesn't delay the SSH key exchange critical path. verify(true); + db.update(hosts) + .set({ hostKeyLastVerified: new Date().toISOString() }) + .where(eq(hosts.id, hostId)) + .catch((err) => { + sshLogger.error("Failed to update hostKeyLastVerified", err, { + operation: "host_key_update_timestamp", + hostId, + }); + }); return; } diff --git a/src/backend/ssh/host-metrics.ts b/src/backend/ssh/host-metrics.ts index 880c15f4..f05541e2 100644 --- a/src/backend/ssh/host-metrics.ts +++ b/src/backend/ssh/host-metrics.ts @@ -96,6 +96,9 @@ interface SSHHostWithCredentials { socks5Password?: string; socks5ProxyChain?: ProxyNode[]; connectionType?: "ssh" | "rdp" | "vnc" | "telnet"; + rdpPort?: number; + vncPort?: number; + telnetPort?: number; } type StatusEntry = { @@ -348,7 +351,12 @@ class PollingManager { try { let pingHost = refreshedHost.ip; - let pingPort = refreshedHost.port; + const ct = refreshedHost.connectionType || "ssh"; + let pingPort: number; + if (ct === "rdp") pingPort = refreshedHost.rdpPort ?? 3389; + else if (ct === "vnc") pingPort = refreshedHost.vncPort ?? 5900; + else if (ct === "telnet") pingPort = refreshedHost.telnetPort ?? 23; + else pingPort = refreshedHost.port; if (refreshedHost.jumpHosts && refreshedHost.jumpHosts.length > 0) { const firstJump = await fetchHostById( refreshedHost.jumpHosts[0].hostId, @@ -792,6 +800,12 @@ async function resolveHostCredentials( socks5ProxyChain: host.socks5ProxyChain ? JSON.parse(host.socks5ProxyChain as string) : undefined, + connectionType: + (host.connectionType as SSHHostWithCredentials["connectionType"]) || + "ssh", + rdpPort: (host.rdpPort as number | undefined) ?? undefined, + vncPort: (host.vncPort as number | undefined) ?? undefined, + telnetPort: (host.telnetPort as number | undefined) ?? undefined, }; if (host.credentialId) { @@ -1028,7 +1042,11 @@ async function buildSshConfig( cause: keyError, }); } - } else if (host.authType === "none" || host.authType === "tailscale") { + } else if ( + host.authType === "none" || + host.authType === "tailscale" || + host.authType === "warpgate" + ) { // no credentials needed } else if (host.authType === "opkssh") { // cert auth setup happens in createSshFactory (needs client instance) diff --git a/src/backend/ssh/host-resolver.ts b/src/backend/ssh/host-resolver.ts index 091a6c53..a856e536 100644 --- a/src/backend/ssh/host-resolver.ts +++ b/src/backend/ssh/host-resolver.ts @@ -3,7 +3,10 @@ import { hosts, sshCredentials } from "../database/db/schema.js"; import { eq, and } from "drizzle-orm"; import { SimpleDBOps } from "../utils/simple-db-ops.js"; import { logger } from "../utils/logger.js"; -import { pickResolvedUsername } from "./credential-username.js"; +import { + pickResolvedUsername, + expandOidcUsername, +} from "./credential-username.js"; import type { SSHHost } from "../../types/index.js"; const sshLogger = logger; @@ -120,6 +123,10 @@ export async function resolveHostById( : cred.password ? "password" : "none"; + host.username = await expandOidcUsername( + host.username as string | undefined, + userId, + ); return host as unknown as SSHHost; } } @@ -150,6 +157,10 @@ export async function resolveHostById( : sharedCred.password ? "password" : "none"; + host.username = await expandOidcUsername( + host.username as string | undefined, + userId, + ); return host as unknown as SSHHost; } } catch (e) { @@ -203,6 +214,11 @@ export async function resolveHostById( } } + host.username = await expandOidcUsername( + host.username as string | undefined, + userId, + ); + return host as unknown as SSHHost; } diff --git a/src/backend/ssh/terminal.ts b/src/backend/ssh/terminal.ts index 9345725b..1d556c11 100644 --- a/src/backend/ssh/terminal.ts +++ b/src/backend/ssh/terminal.ts @@ -5,7 +5,7 @@ import ssh2Pkg, { type PseudoTtyOptions, } from "ssh2"; const { Client, utils: ssh2Utils } = ssh2Pkg; -import { SSH_ALGORITHMS } from "../utils/ssh-algorithms.js"; +import { buildSSHAlgorithms } from "../utils/ssh-algorithms.js"; import axios from "axios"; import { getDb } from "../database/db/index.js"; import { hosts } from "../database/db/schema.js"; @@ -30,6 +30,7 @@ import { waitForTmuxSession, } from "./tmux-helper.js"; import { MemoryAgent, performPortKnocking } from "./terminal-auth-helpers.js"; +import { isWindowsSftpPath, sftpPathToLocalPath } from "./transfer-paths.js"; interface ConnectToHostData { cols: number; @@ -187,9 +188,8 @@ wss.on("connection", async (ws: WebSocket, req) => { let isConnecting = false; let isConnected = false; let isCleaningUp = false; - let cwdPending = false; - let cwdBuffer = ""; let isShellInitializing = false; + let isDuplicateConnDiscarded = false; let warpgateAuthPromptSent = false; let warpgateAuthTimeout: NodeJS.Timeout | null = null; let isAwaitingAuthCredentials = false; @@ -237,7 +237,12 @@ wss.on("connection", async (ws: WebSocket, req) => { if (currentSessionId) { const session = sessionManager.getSession(currentSessionId); if (session?.isConnected) { - sessionManager.detachWs(currentSessionId); + // Only detach if this WS is still the one attached to the session. + // If a refresh reconnected and reattached a new WS before this close + // event fired, we must not clobber that new attachment. + if (session.attachedWs === ws || session.attachedWs === null) { + sessionManager.detachWs(currentSessionId); + } } else { sessionManager.destroySession(currentSessionId); currentSessionId = null; @@ -446,15 +451,80 @@ wss.on("connection", async (ws: WebSocket, req) => { break; case "get_cwd": { - const activeStream = - sessionManager.getSession(currentSessionId)?.sshStream ?? sshStream; - if (!activeStream) { + const activeConn = + sessionManager.getSession(currentSessionId)?.sshConn ?? sshConn; + if (!activeConn) { ws.send(JSON.stringify({ type: "cwd", path: "/" })); break; } - cwdPending = true; - cwdBuffer = ""; - activeStream.write('\x15a=TERMIX_CWD; echo "$a:$(pwd)"\r'); + activeConn.exec("pwd", (err, execStream) => { + if (err) { + ws.send(JSON.stringify({ type: "cwd", path: "/" })); + return; + } + let stdout = ""; + execStream.on("data", (chunk: Buffer) => { + stdout += chunk.toString("utf-8"); + }); + execStream.stderr.on("data", () => {}); + execStream.on("close", () => { + const cwd = stdout.trim() || "/"; + const attachedWs = + sessionManager.getSession(currentSessionId)?.attachedWs ?? ws; + if (attachedWs.readyState === WebSocket.OPEN) { + attachedWs.send(JSON.stringify({ type: "cwd", path: cwd })); + } + }); + }); + break; + } + + case "open_file_in_editor": { + const { path: requestedPath } = data as { path: string }; + const activeConn = + sessionManager.getSession(currentSessionId)?.sshConn ?? sshConn; + if (!activeConn || !requestedPath) { + ws.send( + JSON.stringify({ + type: "open_file_in_editor", + path: requestedPath || "/", + }), + ); + break; + } + const escapedPath = requestedPath.replace(/'/g, "'\\''"); + activeConn.exec( + `realpath '${escapedPath}' 2>/dev/null || echo '${escapedPath}'`, + (err, execStream) => { + if (err) { + ws.send( + JSON.stringify({ + type: "open_file_in_editor", + path: requestedPath, + }), + ); + return; + } + let stdout = ""; + execStream.on("data", (chunk: Buffer) => { + stdout += chunk.toString("utf-8"); + }); + execStream.stderr.on("data", () => {}); + execStream.on("close", () => { + const resolvedPath = stdout.trim() || requestedPath; + const attachedWs = + sessionManager.getSession(currentSessionId)?.attachedWs ?? ws; + if (attachedWs.readyState === WebSocket.OPEN) { + attachedWs.send( + JSON.stringify({ + type: "open_file_in_editor", + path: resolvedPath, + }), + ); + } + }); + }, + ); break; } @@ -990,7 +1060,7 @@ wss.on("connection", async (ws: WebSocket, req) => { ); } - if (!hostConfig.useSocks5 && resolvedHostData.useSocks5) { + if (resolvedHostData.useSocks5) { hostConfig.useSocks5 = resolvedHostData.useSocks5; hostConfig.socks5Host = resolvedHostData.socks5Host; hostConfig.socks5Port = resolvedHostData.socks5Port; @@ -1134,27 +1204,43 @@ wss.on("connection", async (ws: WebSocket, req) => { !existingSession.sshStream.destroyed && existingSession.sshConn !== sshConn ) { + const reusedSessionId = currentSessionId; sshLogger.info( "Reusing existing live session after duplicate connectToHost, closing new SSH conn", { operation: "terminal_reuse_existing_session", - sessionId: currentSessionId, + sessionId: reusedSessionId, tabInstanceId, userId, }, ); + // Null out currentSessionId before ending the duplicate connection so + // the sshConn "close" handler does not destroy the reused session. + // Set isDuplicateConnDiscarded so the close handler does not send a + // "disconnected" message to the new WS that is now attached to the live session. + // Null out currentSessionId before ending the duplicate connection so + // the sshConn "close" handler does not destroy the reused session. + // Set isDuplicateConnDiscarded so the close handler exits without + // sending a "disconnected" message to the new WS. + currentSessionId = null; + isDuplicateConnDiscarded = true; + clearTimeout(connectionTimeout); try { sshConn?.end(); } catch { /* ignore */ } sshConn = null; + sshStream = null; + // Point this WS handler's closure at the live session so the input + // handler can forward keystrokes via currentSessionId. + currentSessionId = reusedSessionId; sshStream = existingSession.sshStream; sshConn = existingSession.sshConn; isConnecting = false; isConnected = true; - sessionManager.attachWs(currentSessionId, userId, ws, tabInstanceId); + sessionManager.attachWs(reusedSessionId, userId, ws, tabInstanceId); const buffered = sessionManager.getBuffer(existingSession); if (buffered) { @@ -1163,20 +1249,18 @@ wss.on("connection", async (ws: WebSocket, req) => { ws.send( JSON.stringify({ type: "sessionCreated", - sessionId: currentSessionId, + sessionId: reusedSessionId, }), ); ws.send( JSON.stringify({ type: "sessionAttached", - sessionId: currentSessionId, + sessionId: reusedSessionId, }), ); ws.send( JSON.stringify({ type: "connected", message: "Session reattached" }), ); - - cleanupAuthState(connectionTimeout); return; } @@ -1350,44 +1434,9 @@ wss.on("connection", async (ws: WebSocket, req) => { const boundSessionId = currentSessionId; - const CWD_SENTINEL = "TERMIX_CWD:"; - stream.on("data", (data: Buffer) => { try { - let utf8String = data.toString("utf-8"); - - if (cwdPending) { - cwdBuffer += utf8String; - const sentinelIdx = cwdBuffer.indexOf(CWD_SENTINEL); - if (sentinelIdx !== -1) { - const afterSentinel = cwdBuffer.slice( - sentinelIdx + CWD_SENTINEL.length, - ); - const newlineIdx = afterSentinel.search(/[\r\n]/); - if (newlineIdx !== -1) { - const cwd = - afterSentinel.slice(0, newlineIdx).trim() || "/"; - cwdPending = false; - // Strip the sentinel line from output sent to terminal - const beforeSentinel = cwdBuffer.slice(0, sentinelIdx); - const afterNewline = afterSentinel.slice(newlineIdx); - utf8String = beforeSentinel + afterNewline; - cwdBuffer = ""; - const attachedWs = - sessionManager.getSession(boundSessionId)?.attachedWs ?? - ws; - if (attachedWs.readyState === WebSocket.OPEN) { - attachedWs.send( - JSON.stringify({ type: "cwd", path: cwd }), - ); - } - } else { - return; - } - } else { - return; - } - } + const utf8String = data.toString("utf-8"); if (!utf8String) return; @@ -1475,7 +1524,14 @@ wss.on("connection", async (ws: WebSocket, req) => { const runPostShellCommands = (delay: number) => { setTimeout(() => { if (initialPath && initialPath.trim() !== "") { - const cdCommand = `cd "${initialPath.replace(/"/g, '\\"')}"\r`; + let cdCommand: string; + if (isWindowsSftpPath(initialPath)) { + const winPath = sftpPathToLocalPath(initialPath); + const escaped = winPath.replace(/"/g, '""'); + cdCommand = `cd "${escaped}"\r`; + } else { + cdCommand = `cd "${initialPath.replace(/"/g, '\\"')}"\r`; + } stream.write(cdCommand); } if (executeCommand && executeCommand.trim() !== "") { @@ -1543,27 +1599,6 @@ wss.on("connection", async (ws: WebSocket, req) => { }), ); runPostShellCommands(0); - } else if (detection.sessions.length === 1) { - attachOrCreateTmuxSession(stream, detection.sessions[0].name); - const sessionName = detection.sessions[0].name; - const session = sessionManager.getSession(boundSessionId); - if (session) { - session.tmuxSessionName = sessionName; - } - sshLogger.info("Auto-attached to existing tmux session", { - operation: "tmux_auto_attach", - sessionName, - hostId: id, - }); - ws.send( - JSON.stringify({ - type: "tmux_session_attached", - sessionName, - }), - ); - // Reattaching to existing session -- don't re-run - // initialPath/executeCommand since the session already - // has its own state } else { sshLogger.info( "Multiple tmux sessions found, sending list to frontend", @@ -1910,6 +1945,11 @@ wss.on("connection", async (ws: WebSocket, req) => { hostId: id, }); + if (isDuplicateConnDiscarded) { + cleanupAuthState(connectionTimeout); + return; + } + if (isAwaitingAuthCredentials) { if (currentSessionId) { sessionManager.destroySession(currentSessionId); @@ -1991,6 +2031,7 @@ wss.on("connection", async (ws: WebSocket, req) => { resolvedCredentials as unknown as Parameters< typeof sshAuthManager.handleKeyboardInteractive >[5], + hostConfig, ); isKeyboardInteractive = sshAuthManager.context.isKeyboardInteractive; @@ -2008,19 +2049,24 @@ wss.on("connection", async (ws: WebSocket, req) => { const hostKeepaliveInterval = hostConfig.terminalConfig?.keepaliveInterval; const hostKeepaliveCountMax = hostConfig.terminalConfig?.keepaliveCountMax; + // Pre-fetch the stored host key before connect so the verifier callback + // runs synchronously during SSH key exchange, avoiding LoginGraceTime + // expiry on slow connections (especially through jump host tunnels). + const preloadedHostData = await SSHHostKeyVerifier.preloadHostData(id); + const connectConfig: Record = { host: ip, port, username, - tryKeyboard: - resolvedCredentials.authType !== "none" && - resolvedCredentials.authType !== "tailscale", + tryKeyboard: resolvedCredentials.authType !== "tailscale", keepaliveInterval: typeof hostKeepaliveInterval === "number" - ? hostKeepaliveInterval * 1000 + ? Math.max(5000, hostKeepaliveInterval * 1000) : 30000, keepaliveCountMax: - typeof hostKeepaliveCountMax === "number" ? hostKeepaliveCountMax : 3, + typeof hostKeepaliveCountMax === "number" + ? Math.max(1, hostKeepaliveCountMax) + : 5, readyTimeout: 120000, tcpKeepAlive: true, tcpKeepAliveInitialDelay: 30000, @@ -2032,6 +2078,7 @@ wss.on("connection", async (ws: WebSocket, req) => { ws, userId, false, + preloadedHostData, ), env: { TERM: "xterm-256color", @@ -2045,51 +2092,16 @@ wss.on("connection", async (ws: WebSocket, req) => { LC_COLLATE: "en_US.UTF-8", COLORTERM: "truecolor", }, - algorithms: { - kex: [ - "curve25519-sha256", - "curve25519-sha256@libssh.org", - "ecdh-sha2-nistp521", - "ecdh-sha2-nistp384", - "ecdh-sha2-nistp256", - "diffie-hellman-group-exchange-sha256", - "diffie-hellman-group18-sha512", - "diffie-hellman-group17-sha512", - "diffie-hellman-group16-sha512", - "diffie-hellman-group15-sha512", - "diffie-hellman-group14-sha256", - "diffie-hellman-group14-sha1", - "diffie-hellman-group-exchange-sha1", - "diffie-hellman-group1-sha1", - ], - serverHostKey: [ - "ssh-ed25519", - "ecdsa-sha2-nistp521", - "ecdsa-sha2-nistp384", - "ecdsa-sha2-nistp256", - "rsa-sha2-512", - "rsa-sha2-256", - "ssh-rsa", - "ssh-dss", - ], - cipher: SSH_ALGORITHMS.cipher, - hmac: [ - "hmac-sha2-512-etm@openssh.com", - "hmac-sha2-256-etm@openssh.com", - "hmac-sha2-512", - "hmac-sha2-256", - "hmac-sha1", - "hmac-md5", - ], - compress: ["none", "zlib@openssh.com", "zlib"], - }, + algorithms: buildSSHAlgorithms( + hostConfig.terminalConfig?.allowLegacyAlgorithms !== false, + ), }; if ( resolvedCredentials.authType === "none" || resolvedCredentials.authType === "tailscale" ) { - // Tailscale SSH and "none" auth: daemon handles authorization, no credentials needed + // Tailscale SSH and "none": no static credentials needed } else if (resolvedCredentials.authType === "password") { if (!resolvedCredentials.password) { sshLogger.error( diff --git a/src/backend/utils/ssh-algorithms.ts b/src/backend/utils/ssh-algorithms.ts index caece95f..40a59122 100644 --- a/src/backend/utils/ssh-algorithms.ts +++ b/src/backend/utils/ssh-algorithms.ts @@ -1,6 +1,12 @@ import crypto from "crypto"; import { createRequire } from "module"; -import type { ConnectConfig, CipherAlgorithm } from "ssh2"; +import type { + ConnectConfig, + CipherAlgorithm, + KexAlgorithm, + ServerHostKeyAlgorithm, + MacAlgorithm, +} from "ssh2"; const nativeRequire = createRequire(import.meta.url); const availableCiphers = new Set(crypto.getCiphers()); @@ -47,6 +53,76 @@ function filterCiphers(list: CipherAlgorithm[]): CipherAlgorithm[] { }); } +const LEGACY_KEX: KexAlgorithm[] = [ + "diffie-hellman-group14-sha1", + "diffie-hellman-group-exchange-sha1", + "diffie-hellman-group1-sha1", +]; + +const LEGACY_SERVER_HOST_KEY: ServerHostKeyAlgorithm[] = ["ssh-rsa", "ssh-dss"]; + +const LEGACY_HMAC: MacAlgorithm[] = ["hmac-sha1", "hmac-md5"]; + +const LEGACY_CIPHER = filterCiphers(["3des-cbc"]); + +export function buildSSHAlgorithms( + allowLegacy: boolean, +): NonNullable { + const kex: KexAlgorithm[] = [ + "curve25519-sha256", + "curve25519-sha256@libssh.org", + "ecdh-sha2-nistp521", + "ecdh-sha2-nistp384", + "ecdh-sha2-nistp256", + "diffie-hellman-group-exchange-sha256", + "diffie-hellman-group18-sha512", + "diffie-hellman-group17-sha512", + "diffie-hellman-group16-sha512", + "diffie-hellman-group15-sha512", + "diffie-hellman-group14-sha256", + ]; + const serverHostKey: ServerHostKeyAlgorithm[] = [ + "ssh-ed25519", + "ecdsa-sha2-nistp521", + "ecdsa-sha2-nistp384", + "ecdsa-sha2-nistp256", + "rsa-sha2-512", + "rsa-sha2-256", + ]; + const hmac: MacAlgorithm[] = [ + "hmac-sha2-512-etm@openssh.com", + "hmac-sha2-256-etm@openssh.com", + "hmac-sha2-512", + "hmac-sha2-256", + ]; + const cipher = filterCiphers([ + "chacha20-poly1305@openssh.com", + "aes256-gcm@openssh.com", + "aes128-gcm@openssh.com", + "aes256-ctr", + "aes192-ctr", + "aes128-ctr", + "aes256-cbc", + "aes192-cbc", + "aes128-cbc", + ]); + + if (allowLegacy) { + kex.push(...LEGACY_KEX); + serverHostKey.push(...LEGACY_SERVER_HOST_KEY); + hmac.push(...LEGACY_HMAC); + cipher.push(...LEGACY_CIPHER); + } + + return { + kex, + serverHostKey, + cipher, + hmac, + compress: ["none", "zlib@openssh.com", "zlib"], + }; +} + export const SSH_ALGORITHMS: NonNullable = { kex: [ "curve25519-sha256", diff --git a/src/backend/utils/wake-on-lan.test.ts b/src/backend/utils/wake-on-lan.test.ts index 0a53ced4..eb681d06 100644 --- a/src/backend/utils/wake-on-lan.test.ts +++ b/src/backend/utils/wake-on-lan.test.ts @@ -1,5 +1,18 @@ -import { describe, it, expect } from "vitest"; -import { isValidMac, buildMagicPacket } from "./wake-on-lan.js"; +import { describe, it, expect, vi, beforeEach } from "vitest"; + +vi.mock("dgram", () => { + const socket = { + once: vi.fn(), + bind: vi.fn(), + setBroadcast: vi.fn(), + send: vi.fn(), + close: vi.fn(), + }; + return { default: { createSocket: vi.fn(() => socket) } }; +}); + +import dgram from "dgram"; +import { isValidMac, buildMagicPacket, sendWakeOnLan } from "./wake-on-lan.js"; describe("isValidMac", () => { it("accepts colon-separated MAC addresses", () => { @@ -49,3 +62,55 @@ describe("buildMagicPacket", () => { expect(colon.equals(hyphen)).toBe(true); }); }); + +describe("sendWakeOnLan", () => { + let mockSocket: ReturnType; + + beforeEach(() => { + vi.clearAllMocks(); + mockSocket = (dgram.createSocket as ReturnType)(); + (mockSocket.bind as ReturnType).mockImplementation( + (cb: () => void) => cb(), + ); + (mockSocket.send as ReturnType).mockImplementation( + ( + _buf: unknown, + _off: unknown, + _len: unknown, + _port: unknown, + _addr: unknown, + cb: (err: null) => void, + ) => cb(null), + ); + }); + + it("rejects on invalid MAC address", async () => { + await expect(sendWakeOnLan("not-a-mac")).rejects.toThrow( + "Invalid MAC address", + ); + }); + + it("sends to 255.255.255.255 by default", async () => { + await sendWakeOnLan("aa:bb:cc:dd:ee:ff"); + expect(mockSocket.send).toHaveBeenCalledWith( + expect.any(Buffer), + 0, + 102, + 9, + "255.255.255.255", + expect.any(Function), + ); + }); + + it("sends to a custom broadcast address when provided", async () => { + await sendWakeOnLan("aa:bb:cc:dd:ee:ff", "192.168.1.255"); + expect(mockSocket.send).toHaveBeenCalledWith( + expect.any(Buffer), + 0, + 102, + 9, + "192.168.1.255", + expect.any(Function), + ); + }); +}); diff --git a/src/backend/utils/wake-on-lan.ts b/src/backend/utils/wake-on-lan.ts index 69b98659..e02b96ea 100644 --- a/src/backend/utils/wake-on-lan.ts +++ b/src/backend/utils/wake-on-lan.ts @@ -20,7 +20,10 @@ export function isValidMac(mac: string): boolean { return MAC_REGEX.test(mac); } -export function sendWakeOnLan(mac: string): Promise { +export function sendWakeOnLan( + mac: string, + broadcastAddress = "255.255.255.255", +): Promise { return new Promise((resolve, reject) => { if (!isValidMac(mac)) { return reject(new Error("Invalid MAC address")); @@ -36,7 +39,7 @@ export function sendWakeOnLan(mac: string): Promise { socket.bind(() => { socket.setBroadcast(true); - socket.send(packet, 0, packet.length, 9, "255.255.255.255", (err) => { + socket.send(packet, 0, packet.length, 9, broadcastAddress, (err) => { socket.close(); if (err) reject(err); else resolve(); diff --git a/src/main.tsx b/src/main.tsx index 329eaa06..7258d9c3 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -70,6 +70,7 @@ function FullscreenApp() { const view = searchParams.get("view"); const hostId = searchParams.get("hostId"); const tmuxSession = searchParams.get("tmuxSession"); + const path = searchParams.get("path"); switch (view) { case "terminal": @@ -80,7 +81,12 @@ function FullscreenApp() { /> ); case "file-manager": - return ; + return ( + + ); case "tunnel": return ; case "host-metrics": @@ -168,6 +174,11 @@ function App() { }, 450); } + function handleChangeServer() { + localStorage.setItem("termix_show_server_config", "true"); + handleLogout(); + } + const showApp = phase === "idle-app" || phase === "fading-in" || phase === "fading-out"; const showAuth = @@ -211,7 +222,11 @@ function App() { }} > - + )} diff --git a/src/types/index.ts b/src/types/index.ts index a78a6af7..af1d3ff1 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -35,6 +35,7 @@ export interface OIDCProviderConfig { allowed_users?: string; admin_group?: string; group_claim?: string; + ca_cert?: string; } export interface LDAPProviderConfig { @@ -64,6 +65,7 @@ export type SSHAuthType = | "none" | "opkssh" | "tailscale"; + export type GuacamoleAuthType = "password" | "credential"; export interface ProxmoxConfig { @@ -101,6 +103,7 @@ export interface Host { tags: string[]; pin: boolean; authType: "password" | "key" | "credential" | "none" | "opkssh" | "tailscale"; + useWarpgate?: boolean; password?: string; key?: string; keyPassword?: string; @@ -120,6 +123,7 @@ export interface Host { enableCommandHistory: boolean; enableTunnel: boolean; enableFileManager: boolean; + scpLegacy?: boolean; enableDocker: boolean; enableProxmox: boolean; enableTmuxMonitor: boolean; @@ -145,6 +149,7 @@ export interface Host { socks5ProxyChain?: ProxyNode[]; macAddress?: string; + wolBroadcastAddress?: string; portKnockSequence?: Array<{ port: number; protocol?: "tcp" | "udp"; @@ -165,15 +170,21 @@ export interface Host { rdpPort?: number; vncPort?: number; telnetPort?: number; + rdpCredentialId?: number | null; rdpUser?: string; rdpPassword?: string; rdpDomain?: string; rdpSecurity?: string; rdpIgnoreCert?: boolean; + vncCredentialId?: number | null; vncPassword?: string; vncUser?: string; telnetUser?: string; telnetPassword?: string; + telnetCredentialId?: number | null; + rdpAuthType?: "direct" | "credential" | null; + vncAuthType?: "direct" | "credential" | null; + telnetAuthType?: "direct" | "credential" | null; createdAt: string; updatedAt: string; @@ -211,6 +222,7 @@ export interface HostData { tags?: string[]; pin?: boolean; authType: "password" | "key" | "credential" | "none" | "opkssh" | "tailscale"; + useWarpgate?: boolean; password?: string; key?: File | null; keyPassword?: string; @@ -223,6 +235,7 @@ export interface HostData { enableCommandHistory?: boolean; enableTunnel?: boolean; enableFileManager?: boolean; + scpLegacy?: boolean; enableDocker?: boolean; enableProxmox?: boolean; enableTmuxMonitor?: boolean; @@ -249,6 +262,7 @@ export interface HostData { socks5ProxyChain?: ProxyNode[]; macAddress?: string; + wolBroadcastAddress?: string; portKnockSequence?: Array<{ port: number; protocol?: "tcp" | "udp"; @@ -270,15 +284,21 @@ export interface HostData { rdpPort?: number; vncPort?: number; telnetPort?: number; + rdpCredentialId?: number | null; rdpUser?: string; rdpPassword?: string; rdpDomain?: string; rdpSecurity?: string; rdpIgnoreCert?: boolean; + vncCredentialId?: number | null; vncPassword?: string; vncUser?: string; telnetUser?: string; telnetPassword?: string; + telnetCredentialId?: number | null; + rdpAuthType?: "direct" | "credential" | null; + vncAuthType?: "direct" | "credential" | null; + telnetAuthType?: "direct" | "credential" | null; } export type SSHHost = Host; @@ -597,6 +617,11 @@ export interface TerminalConfig { urls: boolean; numbers: boolean; }; + backgroundImage?: string; + backgroundImageOpacity?: number; + allowLegacyAlgorithms?: boolean; + linkClickBehavior?: "confirm" | "direct"; + useSSHTitle?: boolean; } // ============================================================================ diff --git a/src/types/ui-types.ts b/src/types/ui-types.ts index 308d6dbe..e41813d2 100644 --- a/src/types/ui-types.ts +++ b/src/types/ui-types.ts @@ -11,6 +11,7 @@ export type Host = { lastAccess: string; tags?: string[]; authType: "password" | "key" | "credential" | "none" | "opkssh" | "tailscale"; + useWarpgate?: boolean; credentialId?: string; overrideCredentialUsername?: boolean; password?: string; @@ -24,6 +25,7 @@ export type Host = { keyType?: string; notes?: string; macAddress?: string; + wolBroadcastAddress?: string; pin?: boolean; enableTerminal: boolean; @@ -53,6 +55,7 @@ export type Host = { keepaliveCountMax?: number; environmentVariables: { key: string; value: string }[]; startupSnippetId?: number | null; + linkClickBehavior?: "confirm" | "direct"; }; useSocks5?: boolean; @@ -88,6 +91,7 @@ export type Host = { }[]; enableFileManager: boolean; + scpLegacy?: boolean; defaultPath?: string; enableDocker: boolean; @@ -95,6 +99,7 @@ export type Host = { enableTmuxMonitor: boolean; proxmoxConfig?: { defaultCredentialId: number | null; + defaultAuthType?: string; windowsPatterns: string; dockerPatterns: string; preferredPrefixes: string; @@ -121,12 +126,14 @@ export type Host = { vncPort: number; telnetPort: number; + rdpCredentialId?: string; rdpUser?: string; rdpPassword?: string; domain?: string; security?: string; ignoreCert?: boolean; + vncCredentialId?: string; vncPassword?: string; vncUser?: string; @@ -201,14 +208,17 @@ export type Tab = { instanceId: string; type: TabType; label: string; + customLabel?: string; host?: Host; openedAt: number; restoredSessionId?: string | null; + initialFilePath?: string; terminalRef?: import("react").RefObject<{ sendInput?: (data: string) => void; reconnect?: () => void; fit?: () => void; notifyResize?: () => void; + getApplicationCursorKeysMode?: () => boolean; } | null>; }; @@ -236,7 +246,8 @@ export type DashboardCardId = | "quick_actions" | "host_status" | "recent_activity" - | "network_graph"; + | "network_graph" + | "service_links"; export type DashboardCardConfig = { id: DashboardCardId; @@ -275,9 +286,11 @@ export type AdminSection = | "users" | "sessions" | "roles" + | "host-defaults" | "database" | "api-keys" - | "audit-log"; + | "audit-log" + | "ssl"; export type AccentColorId = string; export type ThemeId = | "dark" @@ -309,6 +322,7 @@ export type Snippet = { content: string; folder: string | null; order: number; + hostIds?: number[]; }; export const FOLDER_ICONS = [ diff --git a/src/ui/AppShell.tsx b/src/ui/AppShell.tsx index 53c52f67..f601e158 100644 --- a/src/ui/AppShell.tsx +++ b/src/ui/AppShell.tsx @@ -36,6 +36,7 @@ import type { FontSizeId, } from "@/types/ui-types"; import { applyAccentColor, applyFontSize, PANE_COUNTS } from "@/lib/theme"; +import { globalShortcutHandler } from "@/lib/global-shortcut-handler"; import { useTheme } from "@/components/theme-provider"; import { getSSHHosts, @@ -80,7 +81,7 @@ function sshHostToHost(h: SSHHostWithStatus): Host { enableSsh: h.enableSsh ?? (h.connectionType === "ssh" || !h.connectionType), enableTerminal: h.enableTerminal ?? true, enableTunnel: h.enableTunnel ?? false, - enableFileManager: h.enableFileManager ?? false, + enableFileManager: h.enableFileManager ?? true, enableDocker: h.enableDocker ?? false, enableProxmox: h.enableProxmox ?? false, enableTmuxMonitor: h.enableTmuxMonitor ?? false, // --- tmux-monitor --- @@ -108,6 +109,9 @@ function sshHostToHost(h: SSHHostWithStatus): Host { socks5Username: h.socks5Username, socks5Password: h.socks5Password, socks5ProxyChain: h.socks5ProxyChain ?? [], + statsConfig: (typeof h.statsConfig === "string" + ? JSON.parse(h.statsConfig) + : h.statsConfig) as Host["statsConfig"], }; } @@ -161,9 +165,11 @@ export { tabIcon, renderTabContent } from "@/shell/tabUtils"; export function AppShell({ username, onLogout, + onChangeServer, }: { username: string; onLogout: () => void; + onChangeServer?: () => void; }) { const { t, i18n } = useTranslation(); const { setTheme } = useTheme(); @@ -193,6 +199,9 @@ export function AppShell({ JSON.parse(localStorage.getItem("termix_paneTabIds") ?? "null") ?? Array(6).fill(null), ); + useEffect(() => { + paneTabIdsRef.current = paneTabIds; + }, [paneTabIds]); const [focusedPaneIndex, setFocusedPaneIndex] = useState(null); const [realHostTree, setRealHostTree] = useState(null); const [hostsLoading, setHostsLoading] = useState(true); @@ -204,7 +213,6 @@ export function AppShell({ const [sidebarOpen, setSidebarOpen] = useState(true); const [railView, setRailView] = useState("hosts"); - const [profileDropdownOpen, setProfileDropdownOpen] = useState(false); const [sidebarWidth, setSidebarWidth] = useState(() => { const saved = localStorage.getItem("termix_sidebarWidth"); return saved ? parseInt(saved, 10) : 291; @@ -243,6 +251,26 @@ export function AppShell({ }, []); const lastShiftTime = useRef(0); + const tabsRef = useRef(tabs); + const activeTabIdRef = useRef(activeTabId); + const splitModeRef = useRef(splitMode); + const focusedPaneIndexRef = useRef(null); + const paneContentElsRef = useRef<(HTMLDivElement | null)[]>( + Array(6).fill(null), + ); + const paneTabIdsRef = useRef<(string | null)[]>(Array(6).fill(null)); + useEffect(() => { + tabsRef.current = tabs; + }, [tabs]); + useEffect(() => { + activeTabIdRef.current = activeTabId; + }, [activeTabId]); + useEffect(() => { + splitModeRef.current = splitMode; + }, [splitMode]); + useEffect(() => { + focusedPaneIndexRef.current = focusedPaneIndex; + }, [focusedPaneIndex]); const [commandPaletteShortcutEnabled, setCommandPaletteShortcutEnabled] = useState(() => { const v = localStorage.getItem("commandPaletteShortcutEnabled"); @@ -254,6 +282,9 @@ export function AppShell({ const [paneContentEls, setPaneContentEls] = useState< (HTMLDivElement | null)[] >(Array(6).fill(null)); + useEffect(() => { + paneContentElsRef.current = paneContentEls; + }, [paneContentEls]); // Stable per-tab DOM nodes — created once per tab, never destroyed while the tab lives. // We always portal each tab's content into its own node, then move that node between @@ -314,6 +345,174 @@ export function AppShell({ return () => window.removeEventListener("keydown", handleKeyDown); }, [commandPaletteShortcutEnabled]); + // Split-screen and tab navigation hotkeys + // Also registered in globalShortcutHandler so xterm can invoke directly + // without going through synthetic DOM events (which are unreliable). + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + // Ctrl+Shift+\ — toggle 2-way split (side by side) + if (e.ctrlKey && e.shiftKey && !e.altKey && e.code === "Backslash") { + e.preventDefault(); + if (splitModeRef.current !== "none") { + splitModeRef.current = "none"; + setSplitMode("none"); + setPaneTabIds(Array(6).fill(null)); + } else { + const mode = "2-way"; + splitModeRef.current = mode; + const currentTabs = tabsRef.current; + const currentActiveId = activeTabIdRef.current; + const count = PANE_COUNTS[mode]; + const next: (string | null)[] = Array(6).fill(null); + next[0] = currentActiveId; + let slot = 1; + for (const tab of currentTabs) { + if (slot >= count) break; + if (tab.id !== currentActiveId && tab.type !== "dashboard") { + next[slot] = tab.id; + slot++; + } + } + setSplitMode(mode); + setPaneTabIds(next); + } + return; + } + + // Ctrl+Shift+- — toggle 3-way-horizontal split (top/bottom) + if (e.ctrlKey && e.shiftKey && !e.altKey && e.code === "Minus") { + e.preventDefault(); + if (splitModeRef.current !== "none") { + splitModeRef.current = "none"; + setSplitMode("none"); + setPaneTabIds(Array(6).fill(null)); + } else { + const mode = "3-way-horizontal"; + splitModeRef.current = mode; + const currentTabs = tabsRef.current; + const currentActiveId = activeTabIdRef.current; + const count = PANE_COUNTS[mode]; + const next: (string | null)[] = Array(6).fill(null); + next[0] = currentActiveId; + let slot = 1; + for (const tab of currentTabs) { + if (slot >= count) break; + if (tab.id !== currentActiveId && tab.type !== "dashboard") { + next[slot] = tab.id; + slot++; + } + } + setSplitMode(mode); + setPaneTabIds(next); + } + return; + } + + // Alt+Arrow — navigate between panes in split mode + if (e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey) { + if ( + e.code === "ArrowLeft" || + e.code === "ArrowRight" || + e.code === "ArrowUp" || + e.code === "ArrowDown" + ) { + if (splitModeRef.current === "none") return; + const count = PANE_COUNTS[splitModeRef.current]; + if (count < 2) return; + e.preventDefault(); + const current = focusedPaneIndexRef.current ?? 0; + const mode = splitModeRef.current; + const dir = e.code; + + // Layout-aware navigation maps: [left, right, up, down] per pane index. + // null means no movement in that direction. + const navMap: Record = { + "2-way": [ + [null, 1, null, null], + [0, null, null, null], + ], + "3-way": [ + [null, 1, null, null], + [0, null, null, 2], + [0, null, 1, null], + ], + "3-way-horizontal": [ + [null, 1, null, 2], + [0, null, null, 2], + [null, null, 0, null], + ], + "4-way": [ + [null, 1, null, 2], + [0, null, null, 3], + [null, 3, 0, null], + [2, null, 1, null], + ], + "5-way": [ + [null, 1, null, 3], + [0, 2, null, 4], + [1, null, null, 4], + [null, 4, 0, null], + [3, null, 1, null], + ], + "6-way": [ + [null, 1, null, 3], + [0, 2, null, 4], + [1, null, null, 5], + [null, 4, 0, null], + [3, 5, 1, null], + [4, null, 2, null], + ], + }; + + const paneNav = navMap[mode]?.[current]; + const dirIndex = + { ArrowLeft: 0, ArrowRight: 1, ArrowUp: 2, ArrowDown: 3 }[dir] ?? + -1; + const next = paneNav?.[dirIndex] ?? null; + if (next === null) return; + + focusedPaneIndexRef.current = next; + setFocusedPaneIndex(next); + // Physically move DOM focus into the target pane's terminal + const tabId = paneTabIdsRef.current[next]; + if (tabId) { + const termRef = terminalRefs.current.get(tabId); + ( + termRef?.current as + | import("@/features/terminal/Terminal").TerminalHandle + | null + )?.focus(); + } + return; + } + } + + // Ctrl+Shift+] / Ctrl+Shift+[ — cycle through open tabs (] = next, [ = previous) + if (e.ctrlKey && e.shiftKey && !e.altKey && !e.metaKey) { + if (e.code === "BracketRight" || e.code === "BracketLeft") { + e.preventDefault(); + const currentTabs = tabsRef.current; + if (currentTabs.length < 2) return; + const currentId = activeTabIdRef.current; + const idx = currentTabs.findIndex((t) => t.id === currentId); + const next = + e.code === "BracketRight" + ? (idx + 1) % currentTabs.length + : (idx - 1 + currentTabs.length) % currentTabs.length; + setActiveTabId(currentTabs[next].id); + return; + } + } + }; + + globalShortcutHandler.current = handleKeyDown; + window.addEventListener("keydown", handleKeyDown); + return () => { + globalShortcutHandler.current = null; + window.removeEventListener("keydown", handleKeyDown); + }; + }, []); + useEffect(() => { const handler = () => { const v = localStorage.getItem("commandPaletteShortcutEnabled"); @@ -623,11 +822,17 @@ export function AppShell({ const restoredSessionId = liveSession?.sessionId ?? saved.backendSessionId ?? null; + const isCustomLabel = + host && + saved.label !== host.name && + !/^.+ \(\d+\)$/.test(saved.label); + restoredTabs.push({ id: tabId, instanceId: saved.id, type: saved.tabType as TabType, label: saved.label, + customLabel: isCustomLabel ? saved.label : undefined, host, openedAt: new Date(saved.createdAt).getTime(), restoredSessionId, @@ -694,7 +899,12 @@ export function AppShell({ const openTab = useCallback(function openTab( host: Host, type: TabType, - restore?: { instanceId: string; restoredSessionId: string | null }, + restore?: { + instanceId: string; + restoredSessionId: string | null; + savedLabel?: string; + initialFilePath?: string; + }, ) { const tabId = `${host.name}-${type}-${Date.now()}`; const instanceId = @@ -707,7 +917,34 @@ export function AppShell({ if (ref) terminalRefs.current.set(tabId, ref); let finalLabel = host.name; + const savedLabel = restore?.savedLabel; + const initialFilePath = restore?.initialFilePath; + // A saved label that doesn't match the bare host name or the auto-numbered pattern is a custom label + const isCustomLabel = + savedLabel != null && + savedLabel !== host.name && + !/^.+ \(\d+\)$/.test(savedLabel); + setTabs((prev) => { + if (isCustomLabel && savedLabel) { + finalLabel = savedLabel; + return [ + ...prev, + { + id: tabId, + instanceId, + type, + label: finalLabel, + customLabel: finalLabel, + host, + openedAt, + terminalRef: ref, + restoredSessionId: restore?.restoredSessionId ?? null, + initialFilePath, + }, + ]; + } + const same = prev.filter( (t) => t.type === type && t.label.replace(/ \(\d+\)$/, "") === host.name, @@ -734,6 +971,7 @@ export function AppShell({ openedAt, terminalRef: ref, restoredSessionId: restore?.restoredSessionId ?? null, + initialFilePath, }, ]; }); @@ -789,6 +1027,9 @@ export function AppShell({ ), 0, ); + } else if (pendingEvent === "host-manager:show-credentials") { + setSidebarOpen(true); + setRailView("credentials"); } else { setSidebarOpen(true); setRailView("hosts"); @@ -919,6 +1160,18 @@ export function AppShell({ doCloseTab(id); } + function renameTab(tabId: string, newLabel: string) { + setTabs((prev) => + prev.map((t) => + t.id === tabId ? { ...t, customLabel: newLabel, label: newLabel } : t, + ), + ); + const tab = tabs.find((t) => t.id === tabId); + if (tab?.instanceId) { + patchOpenTab(tab.instanceId, { label: newLabel }).catch(() => {}); + } + } + function splitTabQuick(tabId: string, mode: SplitMode) { setSplitMode(mode); setPaneTabIds(() => { @@ -1182,6 +1435,7 @@ export function AppShell({ openTab(host, record.tabType as TabType, { instanceId: record.id, restoredSessionId: effectiveSessionId, + savedLabel: record.label, }); } else { openSingletonTab(record.tabType as TabType); @@ -1193,6 +1447,8 @@ export function AppShell({ prev.filter((r) => r.id !== recordId), ); }} + onRenameTab={renameTab} + onReorderTabs={setTabs} /> )} @@ -1208,6 +1464,7 @@ export function AppShell({ @@ -1264,8 +1521,6 @@ export function AppShell({ splitMode={splitMode} username={username} isAdmin={isAdmin} - profileDropdownOpen={profileDropdownOpen} - onProfileDropdownChange={setProfileDropdownOpen} onRailClick={handleRailClick} onOpenTab={openSingletonTab} onLogout={onLogout} @@ -1334,6 +1589,7 @@ export function AppShell({ onSplitTab={splitTabQuick} onAddToSplit={addTabToSplit} onRemoveFromSplit={removeTabFromSplit} + onRenameTab={renameTab} />
{/* Split view — always mounted when not mobile, hidden via CSS when inactive */} @@ -1388,6 +1644,17 @@ export function AppShell({ openTab, closeTab, inPane || activeInline, + (host, filePath) => + openTab(host, "files", { + instanceId: + typeof crypto.randomUUID === "function" + ? crypto.randomUUID() + : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`, + restoredSessionId: null, + initialFilePath: filePath, + }), + (host, path) => openTab(host, "files"), + renameTab, ), tabNode, tab.id, diff --git a/src/ui/api/acme-ssl-api.ts b/src/ui/api/acme-ssl-api.ts new file mode 100644 index 00000000..64bb286a --- /dev/null +++ b/src/ui/api/acme-ssl-api.ts @@ -0,0 +1,47 @@ +import { authApi, handleApiError } from "@/main-axios"; + +export type AcmeChallengeType = "http-webroot" | "dns-cloudflare"; + +export type AcmeSettings = { + enabled: boolean; + domain: string; + email: string; + challengeType: AcmeChallengeType; + cloudflareToken: string; + lastIssuedAt: string | null; + certStatus: "none" | "valid" | "expiring" | "expired"; + certExpiresAt: string | null; +}; + +export async function getAcmeSslSettings(): Promise { + try { + const response = await authApi.get("/users/acme-ssl-settings"); + return response.data; + } catch (error) { + handleApiError(error, "fetch ACME SSL settings"); + } +} + +export async function updateAcmeSslSettings( + settings: Partial< + Omit + >, +): Promise { + try { + const response = await authApi.patch("/users/acme-ssl-settings", settings); + return response.data; + } catch (error) { + handleApiError(error, "update ACME SSL settings"); + } +} + +export async function requestAcmeCertificate(): Promise< + AcmeSettings & { success: boolean } +> { + try { + const response = await authApi.post("/users/acme-ssl-request", {}); + return response.data; + } catch (error) { + handleApiError(error, "request ACME certificate"); + } +} diff --git a/src/ui/api/dashboard-api.ts b/src/ui/api/dashboard-api.ts index 584bda35..281eda40 100644 --- a/src/ui/api/dashboard-api.ts +++ b/src/ui/api/dashboard-api.ts @@ -81,3 +81,56 @@ export async function resetRecentActivity(): Promise<{ message: string }> { throw handleApiError(error, "reset recent activity"); } } + +export interface ServiceLink { + id: number; + userId: string; + label: string; + url: string; + order: number; + createdAt: string; +} + +export async function getServiceLinks(): Promise { + try { + const response = await dashboardApi.get("/service-links"); + return response.data; + } catch (error) { + throw handleApiError(error, "fetch service links"); + } +} + +export async function createServiceLink( + label: string, + url: string, +): Promise { + try { + const response = await dashboardApi.post("/service-links", { label, url }); + return response.data; + } catch (error) { + throw handleApiError(error, "create service link"); + } +} + +export async function deleteServiceLink( + id: number, +): Promise<{ message: string }> { + try { + const response = await dashboardApi.delete(`/service-links/${id}`); + return response.data; + } catch (error) { + throw handleApiError(error, "delete service link"); + } +} + +export async function updateServiceLink( + id: number, + updates: { label?: string; url?: string }, +): Promise { + try { + const response = await dashboardApi.put(`/service-links/${id}`, updates); + return response.data; + } catch (error) { + throw handleApiError(error, "update service link"); + } +} diff --git a/src/ui/api/open-tabs-api.ts b/src/ui/api/open-tabs-api.ts index ad2f62db..880bf993 100644 --- a/src/ui/api/open-tabs-api.ts +++ b/src/ui/api/open-tabs-api.ts @@ -94,6 +94,8 @@ export interface UserPreferences { disableUpdateCheck?: boolean | null; confirmTabClose?: boolean | null; hiddenRailTabs?: string | null; + compactHostView?: boolean | null; + statusColorScheme?: string | null; } export async function getUserPreferences(): Promise { diff --git a/src/ui/api/settings-api.ts b/src/ui/api/settings-api.ts index 79fd12d3..4eeed208 100644 --- a/src/ui/api/settings-api.ts +++ b/src/ui/api/settings-api.ts @@ -146,3 +146,43 @@ export async function updateGuacamoleSettings(settings: { } // ============================================================================ +// HOST DEFAULTS SETTINGS +// ============================================================================ + +export type HostDefaults = { + useSocks5?: boolean; + socks5Host?: string; + socks5Port?: number; + socks5Username?: string; + socks5Password?: string; + credentialId?: number | null; + metricsEnabled?: boolean; + statusCheckEnabled?: boolean; + fontSize?: number; + fontFamily?: string; + theme?: string; + cursorStyle?: string; + cursorBlink?: boolean; + enableSessionLogging?: boolean; + enableCommandHistory?: boolean; +}; + +export async function getHostDefaults(): Promise { + try { + const response = await authApi.get("/users/host-defaults"); + return response.data; + } catch (error) { + handleApiError(error, "fetch host defaults"); + } +} + +export async function updateHostDefaults( + defaults: HostDefaults, +): Promise { + try { + const response = await authApi.patch("/users/host-defaults", defaults); + return response.data; + } catch (error) { + handleApiError(error, "update host defaults"); + } +} diff --git a/src/ui/api/snippets-api.ts b/src/ui/api/snippets-api.ts index 5c18e5e7..92ee345d 100644 --- a/src/ui/api/snippets-api.ts +++ b/src/ui/api/snippets-api.ts @@ -181,3 +181,52 @@ export async function reorderSnippets( throw handleApiError(error, "reorder snippets"); } } + +export interface SnippetExportData { + snippets: Array<{ + name: string; + content: string; + description?: string | null; + folder?: string | null; + order?: number; + hostFilter?: string | null; + }>; + folders: Array<{ + name: string; + color?: string | null; + icon?: string | null; + }>; +} + +export async function exportSnippets(): Promise { + try { + const response = await authApi.get("/snippets/export"); + return response.data; + } catch (error) { + throw handleApiError(error, "export snippets"); + } +} + +export async function importSnippets( + data: SnippetExportData, + overwrite: boolean, +): Promise<{ + success: boolean; + snippetsImported: number; + snippetsSkipped: number; + snippetsUpdated: number; + foldersImported: number; + foldersSkipped: number; + failed: number; + errors: string[]; +}> { + try { + const response = await authApi.post("/snippets/bulk-import", { + ...data, + overwrite, + }); + return response.data; + } catch (error) { + throw handleApiError(error, "import snippets"); + } +} diff --git a/src/ui/api/ssh-file-operations-api.ts b/src/ui/api/ssh-file-operations-api.ts index 4d284638..a7c047a6 100644 --- a/src/ui/api/ssh-file-operations-api.ts +++ b/src/ui/api/ssh-file-operations-api.ts @@ -51,10 +51,11 @@ export async function connectSSH( }, ): Promise> { try { - const response = await fileManagerApi.post("/ssh/connect", { - sessionId, - ...config, - }); + const response = await fileManagerApi.post( + "/ssh/connect", + { sessionId, ...config }, + { timeout: 120000 }, + ); return response.data; } catch (error: unknown) { if ( @@ -344,18 +345,20 @@ export async function uploadSSHFile( sessionId: string, path: string, fileName: string, - content: string, + file: File, hostId?: number, userId?: string, ): Promise> { try { - const response = await fileManagerApi.post("/ssh/uploadFile", { - sessionId, - path, - fileName, - content, - hostId, - userId, + const form = new FormData(); + form.append("sessionId", sessionId); + form.append("path", path); + if (hostId !== undefined) form.append("hostId", String(hostId)); + if (userId !== undefined) form.append("userId", userId); + form.append("file", file, fileName); + + const response = await fileManagerApi.post("/ssh/uploadFileStream", form, { + timeout: 0, }); return response.data; } catch (error) { @@ -370,12 +373,16 @@ export async function downloadSSHFile( userId?: string, ): Promise> { try { - const response = await fileManagerApi.post("/ssh/downloadFile", { - sessionId, - path: filePath, - hostId, - userId, - }); + const response = await fileManagerApi.post( + "/ssh/downloadFile", + { + sessionId, + path: filePath, + hostId, + userId, + }, + { timeout: 0 }, + ); return response.data; } catch (error) { handleApiError(error, "download SSH file"); @@ -389,7 +396,7 @@ export async function downloadSSHFileStream( const response = await fileManagerApi.post( "/ssh/downloadFileStream", { sessionId, path: filePath }, - { responseType: "blob" }, + { responseType: "blob", timeout: 0 }, ); const blob = response.data as Blob; const fileName = filePath.split("/").pop() || "download"; diff --git a/src/ui/api/ssh-host-management-api.ts b/src/ui/api/ssh-host-management-api.ts index 59f9d9b6..303bf491 100644 --- a/src/ui/api/ssh-host-management-api.ts +++ b/src/ui/api/ssh-host-management-api.ts @@ -107,6 +107,28 @@ export async function bulkImportSSHHosts( } } +export async function importSSHConfigHosts( + content: string, + overwrite = false, +): Promise<{ + message: string; + success: number; + updated: number; + skipped: number; + failed: number; + errors: string[]; +}> { + try { + const response = await sshHostApi.post("/ssh-config-import", { + content, + overwrite, + }); + return response.data; + } catch (error) { + handleApiError(error, "import SSH config hosts"); + } +} + export async function discoverProxmoxGuests( hostId: number, ): Promise { diff --git a/src/ui/api/user-management-api.ts b/src/ui/api/user-management-api.ts index ef7d7c5e..1fe4c6e3 100644 --- a/src/ui/api/user-management-api.ts +++ b/src/ui/api/user-management-api.ts @@ -196,6 +196,30 @@ export async function updateOidcAutoProvision( } } +export async function getOidcSilentLoginDefault(): Promise<{ + enabled: boolean; +}> { + try { + const response = await authApi.get("/users/oidc-silent-login-default"); + return response.data; + } catch (error) { + handleApiError(error, "get OIDC silent login default"); + } +} + +export async function updateOidcSilentLoginDefault( + enabled: boolean, +): Promise<{ enabled: boolean }> { + try { + const response = await authApi.patch("/users/oidc-silent-login-default", { + enabled, + }); + return response.data; + } catch (error) { + handleApiError(error, "update OIDC silent login default"); + } +} + export async function updatePasswordLoginAllowed( allowed: boolean, ): Promise<{ allowed: boolean }> { diff --git a/src/ui/auth/Auth.tsx b/src/ui/auth/Auth.tsx index 36233d4a..8bb58e19 100644 --- a/src/ui/auth/Auth.tsx +++ b/src/ui/auth/Auth.tsx @@ -34,6 +34,7 @@ import { isElectron, getEmbeddedServerStatus, getCurrentToken, + getOidcSilentLoginDefault, } from "@/main-axios"; import { getSSOProviders, ldapLogin } from "@/api/sso-provider-api"; import type { SSOProviderPublic } from "@/types/index"; @@ -256,6 +257,9 @@ export function Auth({ onLogin }: AuthProps) { const [ldapUsername, setLdapUsername] = useState(""); const [ldapPassword, setLdapPassword] = useState(""); const silentSigninHandledRef = useRef(false); + const [oidcSilentLoginDefault, setOidcSilentLoginDefault] = useState(false); + const [oidcSilentLoginDefaultLoaded, setOidcSilentLoginDefaultLoaded] = + useState(false); const [firstUser, setFirstUser] = useState(false); const [dbConnectionFailed, setDbConnectionFailed] = useState(false); const [dbHealthChecking, setDbHealthChecking] = useState(true); @@ -288,6 +292,10 @@ export function Auth({ onLogin }: AuthProps) { .then((providers) => setSsoProviders(providers || [])) .catch(() => setSsoProviders([])) .finally(() => setSsoProvidersLoaded(true)); + getOidcSilentLoginDefault() + .then((res) => setOidcSilentLoginDefault(res.enabled)) + .catch(() => {}) + .finally(() => setOidcSilentLoginDefaultLoaded(true)); }, []); useEffect(() => { @@ -312,6 +320,18 @@ export function Auth({ onLogin }: AuthProps) { return; } if (isElectron()) { + const forceShow = localStorage.getItem("termix_show_server_config"); + if (forceShow === "true") { + localStorage.removeItem("termix_show_server_config"); + try { + const config = await getServerConfig(); + setCurrentServerUrl(config?.serverUrl || ""); + } catch { + // ignore + } + setShowServerConfig(true); + return; + } try { const [config, status] = await Promise.all([ getServerConfig(), @@ -732,6 +752,29 @@ export function Auth({ onLogin }: AuthProps) { const loadingKey = providerId ?? -1; setProviderLoading((prev) => ({ ...prev, [loadingKey]: true })); try { + if (isInElectronWebView()) { + // Inside the Electron iframe: delegate OIDC to the parent window so + // the system browser opens instead of navigating the iframe (which + // would break captcha stages like Cloudflare Turnstile). + const callbackPort = 17832 + Math.floor(Math.random() * 100); + const authResponse = await getOIDCAuthorizeUrl( + rememberMe, + callbackPort, + providerId, + ); + const { auth_url: authUrl } = authResponse; + if (!authUrl) throw new Error(t("errors.invalidAuthUrl")); + window.parent.postMessage( + { + type: "OIDC_SYSTEM_BROWSER_AUTH", + source: "oidc_request", + authUrl, + callbackPort, + }, + "*", + ); + return; + } if (isElectron()) { const electronAPI = ( window as unknown as { @@ -834,14 +877,19 @@ export function Auth({ onLogin }: AuthProps) { useEffect(() => { if (!ssoProvidersLoaded || silentSigninHandledRef.current) return; - if (!shouldTriggerSilentSignin(window.location.search)) return; + if (!oidcSilentLoginDefaultLoaded) return; - const nextSearch = removeSilentSigninFromSearch(window.location.search); - window.history.replaceState( - {}, - document.title, - `${window.location.pathname}${nextSearch}${window.location.hash}`, - ); + const urlTriggered = shouldTriggerSilentSignin(window.location.search); + if (!urlTriggered && !oidcSilentLoginDefault) return; + + if (urlTriggered) { + const nextSearch = removeSilentSigninFromSearch(window.location.search); + window.history.replaceState( + {}, + document.title, + `${window.location.pathname}${nextSearch}${window.location.hash}`, + ); + } silentSigninHandledRef.current = true; @@ -853,8 +901,17 @@ export function Auth({ onLogin }: AuthProps) { return; } - toast.info(t("errors.silentSigninOidcUnavailable")); - }, [handleOIDCLogin, ssoProvidersLoaded, ssoProviders, t]); + if (urlTriggered) { + toast.info(t("errors.silentSigninOidcUnavailable")); + } + }, [ + handleOIDCLogin, + ssoProvidersLoaded, + ssoProviders, + t, + oidcSilentLoginDefault, + oidcSilentLoginDefaultLoaded, + ]); // Electron server config / webview auth success screens if (isElectron() && !isInElectronWebView()) { diff --git a/src/ui/auth/ElectronLoginForm.tsx b/src/ui/auth/ElectronLoginForm.tsx index 24224f89..8bd003e2 100644 --- a/src/ui/auth/ElectronLoginForm.tsx +++ b/src/ui/auth/ElectronLoginForm.tsx @@ -63,13 +63,43 @@ export function ElectronLoginForm({ try { if (event.source !== iframeRef.current?.contentWindow) return; if (!event.data || typeof event.data !== "object") return; - const { type, platform, source, token } = event.data; + const { type, platform, source, token, authUrl, callbackPort } = + event.data; + if ( type === "AUTH_SUCCESS" && platform === "desktop" && AUTH_MESSAGE_SOURCES.has(source) ) { await handleAuthSuccess(token ?? null); + return; + } + + // OIDC login requested from inside the iframe — open the system browser + // so captcha stages (e.g. Cloudflare Turnstile) render correctly. + if (type === "OIDC_SYSTEM_BROWSER_AUTH" && authUrl && callbackPort) { + const electronAPI = ( + window as unknown as { + electronAPI?: { + oidcSystemBrowserAuth?: ( + url: string, + port: number, + ) => Promise<{ + success: boolean; + token?: string; + error?: string; + }>; + }; + } + ).electronAPI; + if (!electronAPI?.oidcSystemBrowserAuth) return; + const result = await electronAPI.oidcSystemBrowserAuth( + authUrl, + callbackPort, + ); + if (result.success && result.token) { + await handleAuthSuccess(result.token); + } } } catch { // ignore diff --git a/src/ui/auth/ElectronServerConfig.tsx b/src/ui/auth/ElectronServerConfig.tsx index 65137c3c..eef3ff1a 100644 --- a/src/ui/auth/ElectronServerConfig.tsx +++ b/src/ui/auth/ElectronServerConfig.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef } from "react"; import { Button } from "@/components/button.tsx"; import { Input } from "@/components/input.tsx"; import { Label } from "@/components/label.tsx"; @@ -12,7 +12,34 @@ import { setEmbeddedMode, type ServerConfig, } from "@/main-axios.ts"; -import { Server, Monitor, Loader2 } from "lucide-react"; +import { Server, Monitor, Loader2, ChevronDown, X } from "lucide-react"; + +const SAVED_URLS_KEY = "termix_saved_server_urls"; +const MAX_SAVED_URLS = 5; + +function getSavedUrls(): string[] { + try { + const raw = localStorage.getItem(SAVED_URLS_KEY); + if (!raw) return []; + return JSON.parse(raw); + } catch { + return []; + } +} + +function addSavedUrl(url: string) { + const urls = getSavedUrls().filter((u) => u !== url); + urls.unshift(url); + localStorage.setItem( + SAVED_URLS_KEY, + JSON.stringify(urls.slice(0, MAX_SAVED_URLS)), + ); +} + +function removeSavedUrl(url: string) { + const urls = getSavedUrls().filter((u) => u !== url); + localStorage.setItem(SAVED_URLS_KEY, JSON.stringify(urls)); +} interface ServerConfigProps { onServerConfigured: (serverUrl: string) => void; @@ -36,12 +63,31 @@ export function ElectronServerConfig({ const [embeddedAvailable, setEmbeddedAvailable] = useState( null, ); + const [savedUrls, setSavedUrls] = useState([]); + const [dropdownOpen, setDropdownOpen] = useState(false); + const dropdownRef = useRef(null); useEffect(() => { loadServerConfig(); checkEmbeddedBackend(); + setSavedUrls(getSavedUrls()); }, []); + useEffect(() => { + function handleClickOutside(e: MouseEvent) { + if ( + dropdownRef.current && + !dropdownRef.current.contains(e.target as Node) + ) { + setDropdownOpen(false); + } + } + if (dropdownOpen) { + document.addEventListener("mousedown", handleClickOutside); + } + return () => document.removeEventListener("mousedown", handleClickOutside); + }, [dropdownOpen]); + const loadServerConfig = async () => { try { const config = await getServerConfig(); @@ -151,6 +197,8 @@ export function ElectronServerConfig({ const success = await saveServerConfig(config); if (success) { + addSavedUrl(normalizedUrl); + setSavedUrls(getSavedUrls()); onServerConfigured(normalizedUrl); } else { setError(t("serverConfig.saveFailed")); @@ -220,14 +268,70 @@ export function ElectronServerConfig({
- handleUrlChange(e.target.value)} - disabled={loading || embeddedLoading} - /> +
+ handleUrlChange(e.target.value)} + disabled={loading || embeddedLoading} + className={savedUrls.length > 0 ? "pr-9" : ""} + onFocus={() => { + if (savedUrls.length > 0) setDropdownOpen(true); + }} + /> + {savedUrls.length > 0 && ( + + )} + {dropdownOpen && savedUrls.length > 0 && ( +
+

+ {t("serverConfig.savedServers")} +

+ {savedUrls.map((url) => ( +
+ + +
+ ))} +
+ )} +
{serverUrl.trim().startsWith("https://") && ( diff --git a/src/ui/auth/LoginPage.tsx b/src/ui/auth/LoginPage.tsx index 34e6faa6..fa0d829b 100644 --- a/src/ui/auth/LoginPage.tsx +++ b/src/ui/auth/LoginPage.tsx @@ -29,6 +29,7 @@ import { isElectron, getEmbeddedServerStatus, getCurrentToken, + getOidcSilentLoginDefault, } from "@/main-axios"; import { getSSOProviders, ldapLogin } from "@/api/sso-provider-api"; import type { SSOProviderPublic } from "@/types/index"; @@ -129,6 +130,9 @@ export function Auth({ const [ldapPassword, setLdapPassword] = useState(""); const [ldapLoading, setLdapLoading] = useState(false); const silentSigninHandledRef = useRef(false); + const [oidcSilentLoginDefault, setOidcSilentLoginDefault] = useState(false); + const [oidcSilentLoginDefaultLoaded, setOidcSilentLoginDefaultLoaded] = + useState(false); const [resetStep, setResetStep] = useState< "initiate" | "verify" | "newPassword" @@ -258,6 +262,17 @@ export function Auth({ }); }, []); + useEffect(() => { + getOidcSilentLoginDefault() + .then((res) => { + setOidcSilentLoginDefault(res.enabled); + }) + .catch(() => {}) + .finally(() => { + setOidcSilentLoginDefaultLoaded(true); + }); + }, []); + useEffect(() => { if (showServerConfig) { return; @@ -683,8 +698,19 @@ export function Auth({ setLdapLoading(true); try { await ldapLogin(providerId, ldapUsername, ldapPassword, rememberMe); - const userInfo = await getUserInfo(); - onLogin(userInfo); + const meRes = await getUserInfo(); + setInternalLoggedIn(true); + setLoggedIn(true); + setIsAdmin(!!meRes.is_admin); + setUsername(meRes.username || null); + setUserId(meRes.userId || null); + setDbError(null); + onAuthSuccess({ + isAdmin: !!meRes.is_admin, + username: meRes.username || null, + userId: meRes.userId || null, + }); + toast.success(t("messages.loginSuccess")); } catch (err: unknown) { const error = err as { response?: { data?: { error?: string } }; @@ -699,19 +725,35 @@ export function Auth({ setLdapLoading(false); } }, - [ldapUsername, ldapPassword, rememberMe, onLogin, t], + [ + ldapUsername, + ldapPassword, + rememberMe, + onAuthSuccess, + setLoggedIn, + setIsAdmin, + setUsername, + setUserId, + setDbError, + t, + ], ); useEffect(() => { if (!ssoProvidersLoaded || silentSigninHandledRef.current) return; - if (!shouldTriggerSilentSignin(window.location.search)) return; + if (!oidcSilentLoginDefaultLoaded) return; - const nextSearch = removeSilentSigninFromSearch(window.location.search); - window.history.replaceState( - {}, - document.title, - `${window.location.pathname}${nextSearch}${window.location.hash}`, - ); + const urlTriggered = shouldTriggerSilentSignin(window.location.search); + if (!urlTriggered && !oidcSilentLoginDefault) return; + + if (urlTriggered) { + const nextSearch = removeSilentSigninFromSearch(window.location.search); + window.history.replaceState( + {}, + document.title, + `${window.location.pathname}${nextSearch}${window.location.hash}`, + ); + } silentSigninHandledRef.current = true; const oidcProvider = ssoProviders.find( @@ -728,8 +770,17 @@ export function Auth({ return; } - toast.info(t("errors.silentSigninOidcUnavailable")); - }, [handleOIDCLogin, ssoProvidersLoaded, ssoProviders, t]); + if (urlTriggered) { + toast.info(t("errors.silentSigninOidcUnavailable")); + } + }, [ + handleOIDCLogin, + ssoProvidersLoaded, + ssoProviders, + t, + oidcSilentLoginDefault, + oidcSilentLoginDefaultLoaded, + ]); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); @@ -1515,106 +1566,122 @@ export function Auth({ className="flex flex-col gap-5" onSubmit={handleSubmit} > -
- - - setLocalUsername(e.target.value) - } - disabled={loading || loggedIn} - /> -
-
- - setPassword(e.target.value)} - disabled={loading || loggedIn} - /> -
- {tab === "login" && ( -
- - setRememberMe(checked === true) - } - disabled={loading || loggedIn} - /> -
- )} - {tab === "signup" && ( -
- - - setSignupConfirmPassword(e.target.value) - } - disabled={loading || loggedIn} - /> -
- )} - - {tab === "login" && ( - + {loading + ? Spinner + : tab === "login" + ? t("common.login") + : t("auth.signUp")} + + {tab === "login" && ( + + )} + )} {ssoProviders.length > 0 && !isElectron() && (
-
-
- - {t("auth.orContinueWith")} - -
-
+ {(passwordLoginAllowed || + firstUser || + tab === "signup") && ( +
+
+ + {t("auth.orContinueWith")} + +
+
+ )} {ssoProviders.map((provider) => { if (provider.type === "ldap") { const isExpanded = diff --git a/src/ui/components/proxmox/ProxmoxDiscoverDialog.tsx b/src/ui/components/proxmox/ProxmoxDiscoverDialog.tsx index f302d70a..f34e0812 100644 --- a/src/ui/components/proxmox/ProxmoxDiscoverDialog.tsx +++ b/src/ui/components/proxmox/ProxmoxDiscoverDialog.tsx @@ -34,6 +34,8 @@ interface ProxmoxDiscoverDialogProps { preselectedHostId?: number; /** Credential to use for imported hosts */ defaultCredentialId?: number | null; + /** Auth type to use for imported hosts */ + defaultAuthType?: string; /** Username from the default credential */ defaultUsername?: string; } @@ -45,6 +47,7 @@ export function ProxmoxDiscoverDialog({ onHostsChanged, preselectedHostId, defaultCredentialId, + defaultAuthType, defaultUsername, }: ProxmoxDiscoverDialogProps) { const { t } = useTranslation(); @@ -115,6 +118,8 @@ export function ProxmoxDiscoverDialog({ try { // Prefer explicitly configured credential, then fall back to the host's own credential const credId = defaultCredentialId ?? discoveredCredentialId; + const resolvedAuthType = + defaultAuthType ?? (credId != null ? "credential" : "password"); const toImport = guests .filter((g) => selected.has(g.vmid)) @@ -124,13 +129,13 @@ export function ProxmoxDiscoverDialog({ port: g.connectionType === "rdp" ? 3389 : 22, username: defaultUsername ?? "root", folder: importFolder, - ...(credId != null + authType: resolvedAuthType, + ...(resolvedAuthType === "credential" && credId != null ? { - authType: "credential" as const, credentialId: credId, overrideCredentialUsername: true, } - : { authType: "password" as const }), + : {}), enableTerminal: g.connectionType !== "rdp", enableFileManager: g.connectionType !== "rdp", enableTunnel: g.connectionType !== "rdp", diff --git a/src/ui/dashboard/DashboardTab.tsx b/src/ui/dashboard/DashboardTab.tsx index 9cf24b3b..48a70825 100644 --- a/src/ui/dashboard/DashboardTab.tsx +++ b/src/ui/dashboard/DashboardTab.tsx @@ -6,10 +6,12 @@ import { Separator } from "@/components/separator"; import { Activity, Database, + ExternalLink, GripHorizontal, GripVertical, KeyRound, LayoutDashboard, + Link, MessagesSquare, Network, Plus, @@ -37,10 +39,21 @@ import { registerMetricsViewer, sendMetricsHeartbeat, getUserInfo, + getServiceLinks, + createServiceLink, + deleteServiceLink, +} from "@/main-axios"; +import type { + RecentActivityItem, + SSHHostWithStatus, + ServiceLink, } from "@/main-axios"; -import type { RecentActivityItem, SSHHostWithStatus } from "@/main-axios"; import { useTranslation } from "react-i18next"; import { NetworkGraphCard } from "@/dashboard/cards/NetworkGraphCard"; +import { + useStatusColorScheme, + getStatusClasses, +} from "@/hooks/use-status-color-scheme"; function sshHostToHost(h: SSHHostWithStatus): Host { return { @@ -66,7 +79,7 @@ function sshHostToHost(h: SSHHostWithStatus): Host { macAddress: h.macAddress, enableTerminal: h.enableTerminal ?? true, enableTunnel: h.enableTunnel ?? false, - enableFileManager: h.enableFileManager ?? false, + enableFileManager: h.enableFileManager ?? true, enableDocker: h.enableDocker ?? false, enableSsh: h.connectionType === "ssh" || !h.connectionType, enableRdp: h.connectionType === "rdp", @@ -205,35 +218,48 @@ function CountersBarCard({ hosts, credentialCount, activeTunnelCount, + onOpenSingletonTab, }: { hosts: Host[]; credentialCount: number; activeTunnelCount: number; + onOpenSingletonTab: (type: TabType, pendingEvent?: string) => void; }) { const { t } = useTranslation(); return ( -
+
-
+ +
-
+ +
+
); } @@ -365,16 +391,48 @@ function QuickActionsCard({ ); } +function MetricBar({ label, value }: { label: string; value: number }) { + const color = + value >= 90 + ? "bg-red-500" + : value >= 70 + ? "bg-yellow-500" + : "bg-accent-brand"; + const textColor = + value >= 90 + ? "text-red-400" + : value >= 70 + ? "text-yellow-400" + : "text-accent-brand"; + return ( +
+
+ {label} + + {value.toFixed(0)}% + +
+
+
+
+
+ ); +} + function HostStatusCard({ hosts, hostMetrics, onOpenTab, }: { hosts: Host[]; - hostMetrics: Map; + hostMetrics: Map< + string, + { cpu: number | null; ram: number | null; disk: number | null } + >; onOpenTab: (host: Host, type: TabType) => void; }) { const { t } = useTranslation(); + const statusScheme = useStatusColorScheme(); const online = hosts.filter((h) => h.online).length; return ( @@ -399,19 +457,23 @@ function HostStatusCard({ const metrics = hostMetrics.get(host.id); const cpu = metrics?.cpu ?? null; const ram = metrics?.ram ?? null; - const hasMetrics = cpu !== null || ram !== null; + const disk = metrics?.disk ?? null; + const hasMetrics = cpu !== null || ram !== null || disk !== null; return (
onOpenTab(host, "host-metrics")} - className="flex items-center justify-between px-4 py-2.5 border-b border-border last:border-0 hover:bg-muted/50 cursor-pointer" + className="flex items-center justify-between px-4 py-2.5 border-b border-border last:border-0 hover:bg-muted/50 cursor-pointer group/row" >
- {host.name} +
+ {host.name} + +
{host.ip} @@ -421,40 +483,13 @@ function HostStatusCard({ {host.online && hasMetrics ? (
{cpu !== null && ( -
-
- - {t("dashboard.cpu")} - - - {cpu.toFixed(0)}% - -
-
-
-
-
+ )} {ram !== null && ( -
-
- - {t("dashboard.ram")} - - - {ram.toFixed(0)}% - -
-
-
-
-
+ + )} + {disk !== null && ( + )}
) : ( @@ -465,10 +500,13 @@ function HostStatusCard({ + + — +
)} {host.online ? t("dashboardTab.online") @@ -495,6 +533,7 @@ function RecentActivityCard({ onClear: () => void; }) { const { t } = useTranslation(); + const statusScheme = useStatusColorScheme(); const typeIcon: Record = { terminal: , file_manager: , @@ -570,7 +609,7 @@ function RecentActivityCard({ >
@@ -593,6 +632,124 @@ function RecentActivityCard({ ); } +function ServiceLinksCard({ + links, + onAdd, + onDelete, +}: { + links: ServiceLink[]; + onAdd: (label: string, url: string) => Promise; + onDelete: (id: number) => Promise; +}) { + const { t } = useTranslation(); + const [label, setLabel] = useState(""); + const [url, setUrl] = useState(""); + const [urlError, setUrlError] = useState(false); + const [adding, setAdding] = useState(false); + + const handleAdd = async () => { + let valid = true; + try { + const parsed = new URL(url); + if (parsed.protocol !== "http:" && parsed.protocol !== "https:") { + valid = false; + } + } catch { + valid = false; + } + if (!valid) { + setUrlError(true); + return; + } + setUrlError(false); + setAdding(true); + try { + await onAdd(label.trim(), url.trim()); + setLabel(""); + setUrl(""); + } finally { + setAdding(false); + } + }; + + return ( + +
+ + + {t("dashboardTab.serviceLinksTitle")} + +
+
+ {links.length === 0 && ( +
+ {t("dashboardTab.serviceLinksEmpty")} +
+ )} + {links.map((link) => ( +
+ + + + {link.label} + + + {link.url} + + + +
+ ))} +
+
+ setLabel(e.target.value)} + placeholder={t("dashboardTab.serviceLinksLabelPlaceholder")} + className="flex-1 min-w-0 text-xs bg-transparent border border-border px-2 py-1 focus:outline-none focus:border-accent-brand/60" + /> + { + setUrl(e.target.value); + setUrlError(false); + }} + placeholder={t("dashboardTab.serviceLinksUrlPlaceholder")} + className={`flex-[2] min-w-0 text-xs bg-transparent border px-2 py-1 focus:outline-none ${urlError ? "border-destructive" : "border-border focus:border-accent-brand/60"}`} + /> + +
+ {urlError && ( +
+ {t("dashboardTab.serviceLinksInvalidUrl")} +
+ )} +
+ ); +} + // ─── CardItem ───────────────────────────────────────────────────────────────── function CardItem({ @@ -617,6 +774,9 @@ function CardItem({ activity, onClearActivity, isAdmin, + serviceLinks, + onAddServiceLink, + onDeleteServiceLink, }: { slot: CardSlot; editMode: boolean; @@ -629,7 +789,10 @@ function CardItem({ onOpenSingletonTab: (type: TabType, pendingEvent?: string) => void; onOpenTab: (host: Host, type: TabType) => void; hosts: Host[]; - hostMetrics: Map; + hostMetrics: Map< + string, + { cpu: number | null; ram: number | null; disk: number | null } + >; uptimeFormatted: string; versionText: string; versionStatus: "up_to_date" | "requires_update" | "beta"; @@ -639,6 +802,9 @@ function CardItem({ activity: RecentActivityItem[]; onClearActivity: () => void; isAdmin: boolean; + serviceLinks: ServiceLink[]; + onAddServiceLink: (label: string, url: string) => Promise; + onDeleteServiceLink: (id: number) => Promise; }) { const cardRef = useRef(null); @@ -704,6 +870,7 @@ function CardItem({ hosts={hosts} credentialCount={credentialCount} activeTunnelCount={activeTunnelCount} + onOpenSingletonTab={onOpenSingletonTab} /> )} {slot.id === "quick_actions" && ( @@ -735,6 +902,13 @@ function CardItem({ onOpenInNewTab={() => onOpenSingletonTab("network_graph")} /> )} + {slot.id === "service_links" && ( + + )}
{editMode && !isFlex && (
void; onOpenTab: (host: Host, type: TabType) => void; hosts: Host[]; - hostMetrics: Map; + hostMetrics: Map< + string, + { cpu: number | null; ram: number | null; disk: number | null } + >; uptimeFormatted: string; versionText: string; versionStatus: "up_to_date" | "requires_update" | "beta"; @@ -842,6 +1019,9 @@ type PanelColumnProps = { onClearActivity: () => void; cardLabels: Record; isAdmin: boolean; + serviceLinks: ServiceLink[]; + onAddServiceLink: (label: string, url: string) => Promise; + onDeleteServiceLink: (id: number) => Promise; }; function PanelColumn({ @@ -869,6 +1049,9 @@ function PanelColumn({ onClearActivity, cardLabels, isAdmin, + serviceLinks, + onAddServiceLink, + onDeleteServiceLink, }: PanelColumnProps) { const { t } = useTranslation(); const sorted = [...slots].sort((a, b) => a.order - b.order); @@ -921,6 +1104,9 @@ function PanelColumn({ activity={activity} onClearActivity={onClearActivity} isAdmin={isAdmin} + serviceLinks={serviceLinks} + onAddServiceLink={onAddServiceLink} + onDeleteServiceLink={onDeleteServiceLink} />
))} @@ -1028,7 +1214,7 @@ export function DashboardTab({ const [activeTunnelCount, setActiveTunnelCount] = useState(0); const [activity, setActivity] = useState([]); const [hostMetrics, setHostMetrics] = useState< - Map + Map >(new Map()); const viewerSessionsRef = useRef>(new Map()); @@ -1066,6 +1252,7 @@ export function DashboardTab({ id: host.id, cpu: metrics.cpu?.percent ?? null, ram: metrics.memory?.percent ?? null, + disk: metrics.disk?.percent ?? null, }; } catch { return null; @@ -1074,9 +1261,12 @@ export function DashboardTab({ ); viewerSessionsRef.current = newSessions; - const map = new Map(); + const map = new Map< + string, + { cpu: number | null; ram: number | null; disk: number | null } + >(); for (const r of results) { - if (r) map.set(r.id, { cpu: r.cpu, ram: r.ram }); + if (r) map.set(r.id, { cpu: r.cpu, ram: r.ram, disk: r.disk }); } setHostMetrics(map); }, []); @@ -1169,6 +1359,24 @@ export function DashboardTab({ } }; + const [serviceLinks, setServiceLinks] = useState([]); + + useEffect(() => { + getServiceLinks() + .then(setServiceLinks) + .catch(() => {}); + }, []); + + const handleAddServiceLink = async (label: string, url: string) => { + const created = await createServiceLink(label, url); + setServiceLinks((prev) => [...prev, created]); + }; + + const handleDeleteServiceLink = async (id: number) => { + await deleteServiceLink(id); + setServiceLinks((prev) => prev.filter((l) => l.id !== id)); + }; + const todayLabel = new Date().toLocaleDateString(i18n.language, { weekday: "long", month: "long", @@ -1192,6 +1400,7 @@ export function DashboardTab({ host_status: t("dashboardTab.hostStatus"), recent_activity: t("dashboard.recentActivity"), network_graph: t("dashboard.networkGraph"), + service_links: t("dashboard.serviceLinks"), }; const onColumnDividerMouseDown = useCallback( @@ -1264,7 +1473,9 @@ export function DashboardTab({ ? 350 : id === "host_status" || id === "recent_activity" ? null - : 150; + : id === "service_links" + ? 200 + : 150; return [...prev, { id, panel, order: maxOrder, height: defaultHeight }]; }); }; @@ -1299,6 +1510,9 @@ export function DashboardTab({ onOpenTab, cardLabels, isAdmin, + serviceLinks, + onAddServiceLink: handleAddServiceLink, + onDeleteServiceLink: handleDeleteServiceLink, }; const isMobile = useIsMobile(); @@ -1393,6 +1607,7 @@ export function DashboardTab({ hosts={hosts} credentialCount={credentialCount} activeTunnelCount={activeTunnelCount} + onOpenSingletonTab={onOpenSingletonTab} /> )} {slot.id === "quick_actions" && ( @@ -1424,6 +1639,13 @@ export function DashboardTab({ onOpenInNewTab={() => onOpenSingletonTab("network_graph")} /> )} + {slot.id === "service_links" && ( + + )}
))}
diff --git a/src/ui/dashboard/cards/NetworkGraphCard.tsx b/src/ui/dashboard/cards/NetworkGraphCard.tsx index 9505dab7..4cec13a3 100644 --- a/src/ui/dashboard/cards/NetworkGraphCard.tsx +++ b/src/ui/dashboard/cards/NetworkGraphCard.tsx @@ -128,11 +128,17 @@ function buildNodeSvg( ): string { const isOnline = status === "online"; const isOffline = status === "offline"; - const statusColor = isOnline - ? "rgb(16,185,129)" - : isOffline - ? "rgb(239,68,68)" - : "rgb(100,116,139)"; + const useRealColors = localStorage.getItem("statusColorScheme") === "status"; + let statusColor: string; + if (isOnline) { + statusColor = useRealColors + ? "rgb(16,185,129)" + : resolveCssVar("--accent-brand", "rgb(16,185,129)"); + } else if (isOffline) { + statusColor = useRealColors ? "rgb(239,68,68)" : "rgba(16,185,129,0.2)"; + } else { + statusColor = "rgb(100,116,139)"; + } const bg = resolveCssVar("--card", "#1e1e20"); const border = resolveCssVar("--border", "#2a2a2c"); diff --git a/src/ui/features/docker/components/LogViewer.tsx b/src/ui/features/docker/components/LogViewer.tsx index 81cc4c2b..bca7b51e 100644 --- a/src/ui/features/docker/components/LogViewer.tsx +++ b/src/ui/features/docker/components/LogViewer.tsx @@ -204,7 +204,7 @@ export function LogViewer({
-
+
{filteredLogs.length > 0 ? ( filteredLogs.map((line, i) => { const tsEnd = line.indexOf(" ", 1); diff --git a/src/ui/features/file-manager/FileManager.tsx b/src/ui/features/file-manager/FileManager.tsx index 432f205d..11d5e434 100644 --- a/src/ui/features/file-manager/FileManager.tsx +++ b/src/ui/features/file-manager/FileManager.tsx @@ -24,6 +24,7 @@ import { useConfirmation } from "@/hooks/use-confirmation.ts"; import { toast } from "sonner"; import { useTranslation } from "react-i18next"; import { FileManagerDialogs } from "./FileManagerDialogs.tsx"; +import { PassphraseDialog } from "@/ssh/dialogs/PassphraseDialog.tsx"; import { FileManagerToolbar } from "./FileManagerToolbar.tsx"; import { TransferToHostDialog } from "./components/TransferToHostDialog.tsx"; import { TerminalWindow } from "./components/TerminalWindow.tsx"; @@ -78,7 +79,12 @@ import type { } from "./file-manager-types.ts"; import { formatFileSize } from "./file-manager-utils.ts"; -function FileManagerContent({ initialHost, onClose }: FileManagerProps) { +function FileManagerContent({ + initialHost, + initialFilePath, + initialPath, + onClose, +}: FileManagerProps) { const { openWindow } = useWindowManager(); const { t } = useTranslation(); const formatTransferMetrics = useMemo( @@ -94,10 +100,10 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { const [currentHost] = useState(initialHost || null); const [currentPath, setCurrentPath] = useState( - initialHost?.defaultPath || "/", + initialPath || initialHost?.defaultPath || "/", ); const [navHistory, setNavHistory] = useState([ - initialHost?.defaultPath || "/", + initialPath || initialHost?.defaultPath || "/", ]); const [navIndex, setNavIndex] = useState(0); const [files, setFiles] = useState([]); @@ -133,6 +139,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { const [authDialogReason, setAuthDialogReason] = useState< "no_keyboard" | "auth_failed" | "timeout" >("no_keyboard"); + const [showPassphraseDialog, setShowPassphraseDialog] = useState(false); const [pinnedFiles, setPinnedFiles] = useState>(new Set()); const [sidebarRefreshTrigger, setSidebarRefreshTrigger] = useState(0); const [hasConnectionError, setHasConnectionError] = useState(false); @@ -267,6 +274,60 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { }; }, [sshSessionId, startKeepalive, stopKeepalive]); + const initialFileOpenedRef = useRef(false); + useEffect(() => { + if (!sshSessionId || !initialFilePath || initialFileOpenedRef.current) + return; + initialFileOpenedRef.current = true; + + const fileName = initialFilePath.split("/").pop() || initialFilePath; + const fileDir = + initialFilePath.lastIndexOf("/") > 0 + ? initialFilePath.substring(0, initialFilePath.lastIndexOf("/")) + : "/"; + + setCurrentPath(fileDir); + + const file: FileItem = { + name: fileName, + path: initialFilePath, + type: "file", + }; + + const windowCount = Date.now() % 10; + const offsetX = Math.min( + 120 + windowCount * 30, + Math.max(0, window.innerWidth - 820), + ); + const offsetY = Math.min( + 120 + windowCount * 30, + Math.max(0, window.innerHeight - 620), + ); + + const createWindowComponent = (windowId: string) => ( + + ); + + openWindow({ + title: fileName, + x: offsetX, + y: offsetY, + width: 800, + height: 600, + isMaximized: false, + isMinimized: false, + component: createWindowComponent, + }); + }, [sshSessionId, initialFilePath]); + const initialLoadDoneRef = useRef(false); const lastPathChangeRef = useRef(""); const pathChangeTimerRef = useRef(null); @@ -416,6 +477,12 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { return; } + if (result?.status === "passphrase_required") { + setShowPassphraseDialog(true); + setIsLoading(false); + return; + } + setSshSessionId(sessionId); try { @@ -839,24 +906,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { "/" : currentPath; - const fileContent = await new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onerror = () => reject(reader.error); - reader.onload = () => { - if (typeof reader.result === "string") { - resolve(reader.result.split(",")[1] || ""); - } else { - reject(new Error("Failed to read file")); - } - }; - reader.readAsDataURL(file); - }); - await uploadSSHFile( sshSessionId, uploadPath, file.name, - fileContent, + file, currentHost?.id, ); } @@ -896,26 +950,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { try { await ensureSSHConnection(); - const fileContent = await new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onerror = () => reject(reader.error); - - reader.onload = () => { - if (typeof reader.result === "string") { - const base64 = reader.result.split(",")[1] || ""; - resolve(base64); - } else { - reject(new Error("Failed to read file")); - } - }; - reader.readAsDataURL(file); - }); - await uploadSSHFile( sshSessionId, currentPath, file.name, - fileContent, + file, currentHost?.id, undefined, ); @@ -1357,6 +1396,23 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { }); } + function handleCopyFolderLink(path: string) { + if (!currentHost?.id) return; + const params = new URLSearchParams({ + view: "file-manager", + hostId: String(currentHost.id), + path, + }); + const url = `${window.location.origin}?${params.toString()}`; + copyToClipboard(url).then((ok) => { + if (ok) { + toast.success(t("fileManager.folderLinkCopied")); + } else { + toast.error(t("fileManager.failedToCopyFolderLink")); + } + }); + } + async function handlePasteFiles() { if (!clipboard || !sshSessionId) return; @@ -2120,6 +2176,85 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { if (onClose) onClose(); } + async function handlePassphraseSubmit(passphrase: string) { + if (!currentHost) return; + + try { + setIsLoading(true); + setShowPassphraseDialog(false); + + const sessionId = currentHost.id.toString(); + + const result = await connectSSH(sessionId, { + hostId: currentHost.id, + ip: currentHost.ip, + port: currentHost.port, + username: currentHost.username, + sshKey: currentHost.key, + keyPassword: passphrase, + authType: "key", + credentialId: currentHost.credentialId, + userId: currentHost.userId, + jumpHosts: currentHost.jumpHosts, + useSocks5: currentHost.useSocks5, + socks5Host: currentHost.socks5Host, + socks5Port: currentHost.socks5Port, + socks5Username: currentHost.socks5Username, + socks5Password: currentHost.socks5Password, + socks5ProxyChain: currentHost.socks5ProxyChain, + }); + + if (result?.status === "passphrase_required") { + setShowPassphraseDialog(true); + setIsLoading(false); + toast.error(t("fileManager.incorrectPassphrase")); + return; + } + + if (result?.requires_totp) { + setTotpRequired(true); + setTotpSessionId(sessionId); + setTotpPrompt(result.prompt || t("fileManager.verificationCodePrompt")); + setIsLoading(false); + return; + } + + if (result?.status === "auth_required") { + setAuthDialogReason(result.reason || "auth_failed"); + setShowAuthDialog(true); + setIsLoading(false); + return; + } + + setSshSessionId(sessionId); + + try { + const response = await listSSHFiles(sessionId, currentPath); + const files = Array.isArray(response) + ? response + : response?.files || []; + setFiles(files); + clearSelection(); + initialLoadDoneRef.current = true; + toast.success(t("fileManager.connectedSuccessfully")); + logFileManagerActivity(); + } catch (dirError: unknown) { + console.error("Failed to load initial directory:", dirError); + } + } catch (error: unknown) { + console.error("SSH connection with passphrase failed:", error); + setShowPassphraseDialog(true); + toast.error(t("fileManager.incorrectPassphrase")); + } finally { + setIsLoading(false); + } + } + + function handlePassphraseCancel() { + setShowPassphraseDialog(false); + if (onClose) onClose(); + } + function generateUniqueName( baseName: string, type: "file" | "directory", @@ -2749,6 +2884,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { onExtractArchive={handleExtractArchive} onCompress={handleOpenCompressDialog} onCopyPath={handleCopyPath} + onCopyFolderLink={handleCopyFolderLink} onTransferToHost={handleOpenTransferDialog} />
@@ -2768,6 +2904,21 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) { /> )} + {currentHost && ( + + )} + - + ); } diff --git a/src/ui/features/file-manager/FileManagerApp.tsx b/src/ui/features/file-manager/FileManagerApp.tsx index f702c6a7..ea38f2b2 100644 --- a/src/ui/features/file-manager/FileManagerApp.tsx +++ b/src/ui/features/file-manager/FileManagerApp.tsx @@ -5,9 +5,13 @@ import { FullScreenAppWrapper } from "@/features/FullScreenAppWrapper.tsx"; interface FileManagerAppProps { hostId?: string; + initialPath?: string; } -const FileManagerApp: React.FC = ({ hostId }) => { +const FileManagerApp: React.FC = ({ + hostId, + initialPath, +}) => { const { t } = useTranslation(); return ( @@ -39,6 +43,7 @@ const FileManagerApp: React.FC = ({ hostId }) => { {}} /> ); diff --git a/src/ui/features/file-manager/FileManagerContextMenu.tsx b/src/ui/features/file-manager/FileManagerContextMenu.tsx index 5dd9d86b..1c7946a3 100644 --- a/src/ui/features/file-manager/FileManagerContextMenu.tsx +++ b/src/ui/features/file-manager/FileManagerContextMenu.tsx @@ -19,6 +19,7 @@ import { Bookmark, FileArchive, ArrowRightLeft, + Link, } from "lucide-react"; import { useTranslation } from "react-i18next"; import { Kbd, KbdKey, KbdSeparator } from "@/components/kbd.tsx"; @@ -67,6 +68,7 @@ interface ContextMenuProps { onExtractArchive?: (file: FileItem) => void; onCompress?: (files: FileItem[]) => void; onCopyPath?: (files: FileItem[]) => void; + onCopyFolderLink?: (path: string) => void; onTransferToHost?: (files: FileItem[], move: boolean) => void; } @@ -110,6 +112,7 @@ export function FileManagerContextMenu({ onExtractArchive, onCompress, onCopyPath, + onCopyFolderLink, onTransferToHost, }: ContextMenuProps) { const { t } = useTranslation(); @@ -350,12 +353,22 @@ export function FileManagerContextMenu({ }); } + if (isSingleFile && files[0].type === "directory" && onCopyFolderLink) { + menuItems.push({ + icon: , + label: t("fileManager.copyFolderLink"), + action: () => onCopyFolderLink(files[0].path), + }); + } + if ( (hasFiles && (onPreview || onDragToDesktop)) || (isSingleFile && files[0].type === "file" && (onPinFile || onUnpinFile)) || - (isSingleFile && files[0].type === "directory" && onAddShortcut) + (isSingleFile && + files[0].type === "directory" && + (onAddShortcut || onCopyFolderLink)) ) { menuItems.push({ separator: true } as MenuItem); } @@ -491,6 +504,15 @@ export function FileManagerContextMenu({ shortcut: "Ctrl+V", }); } + + if (onCopyFolderLink && currentPath) { + menuItems.push({ separator: true } as MenuItem); + menuItems.push({ + icon: , + label: t("fileManager.copyCurrentFolderLink"), + action: () => onCopyFolderLink(currentPath), + }); + } } const filteredMenuItems = menuItems.filter((item, index) => { diff --git a/src/ui/features/file-manager/FileManagerSidebar.tsx b/src/ui/features/file-manager/FileManagerSidebar.tsx index 54ee003f..22ae9739 100644 --- a/src/ui/features/file-manager/FileManagerSidebar.tsx +++ b/src/ui/features/file-manager/FileManagerSidebar.tsx @@ -173,9 +173,11 @@ export function FileManagerSidebar({ try { const response = await listSSHFiles(sshSessionId, "/"); const rootFiles = (response.files || []) as DirectoryItemData[]; - const rootFolders = rootFiles.filter( - (item: DirectoryItemData) => item.type === "directory", - ); + const rootFolders = rootFiles + .filter((item: DirectoryItemData) => item.type === "directory") + .sort((a, b) => + a.name.localeCompare(b.name, undefined, { sensitivity: "base" }), + ); const rootTreeItems = rootFolders.map((folder: DirectoryItemData) => ({ id: `folder-${folder.name}`, @@ -232,9 +234,11 @@ export function FileManagerSidebar({ try { const subResponse = await listSSHFiles(sshSessionId, folderPath); const subFiles = (subResponse.files || []) as DirectoryItemData[]; - const subFolders = subFiles.filter( - (item: DirectoryItemData) => item.type === "directory", - ); + const subFolders = subFiles + .filter((item: DirectoryItemData) => item.type === "directory") + .sort((a, b) => + a.name.localeCompare(b.name, undefined, { sensitivity: "base" }), + ); const subTreeItems = subFolders.map((folder: DirectoryItemData) => ({ id: `folder-${folder.path.replace(/\//g, "-")}`, diff --git a/src/ui/features/file-manager/components/CodeEditor.tsx b/src/ui/features/file-manager/components/CodeEditor.tsx index 4e6cb718..40d005b7 100644 --- a/src/ui/features/file-manager/components/CodeEditor.tsx +++ b/src/ui/features/file-manager/components/CodeEditor.tsx @@ -23,6 +23,7 @@ interface CodeEditorProps { onChange: (value: string) => void; onFocus: () => void; onBlur: () => void; + fontSize?: number; } function getLanguageExtension(filename: string) { @@ -73,7 +74,7 @@ function getLanguageExtension(filename: string) { export const CodeEditor = forwardRef( function CodeEditor( - { fileName, value, placeholder, onChange, onFocus, onBlur }, + { fileName, value, placeholder, onChange, onFocus, onBlur, fontSize = 14 }, ref, ) { const editorRef = useRef<{ view?: EditorView } | null>(null); @@ -105,6 +106,7 @@ export const CodeEditor = forwardRef( EditorView.theme({ "&": { height: "100%", + fontSize: `${fontSize}px`, }, ".cm-scroller": { overflow: "auto", @@ -116,7 +118,7 @@ export const CodeEditor = forwardRef( }, }), ]; - }, [fileName]); + }, [fileName, fontSize]); useImperativeHandle( ref, diff --git a/src/ui/features/file-manager/components/FileViewer.tsx b/src/ui/features/file-manager/components/FileViewer.tsx index 321f9d65..5e968af9 100644 --- a/src/ui/features/file-manager/components/FileViewer.tsx +++ b/src/ui/features/file-manager/components/FileViewer.tsx @@ -17,6 +17,8 @@ import { RotateCcw, Keyboard, Search, + ZoomIn, + ZoomOut, } from "lucide-react"; import { SiJavascript, @@ -85,6 +87,7 @@ interface FileViewerProps { savedContent?: string; isLoading?: boolean; isEditable?: boolean; + resetKey?: number; onContentChange?: (content: string) => void; onSave?: (content: string) => void; onRevert?: () => void; @@ -265,6 +268,7 @@ export function FileViewer({ savedContent = "", isLoading = false, isEditable = false, + resetKey, onContentChange, onSave, onRevert, @@ -280,8 +284,31 @@ export function FileViewer({ const [showKeyboardShortcuts, setShowKeyboardShortcuts] = useState(false); const [editorFocused, setEditorFocused] = useState(false); const [markdownEditMode, setMarkdownEditMode] = useState(false); + const [editorFontSize, setEditorFontSize] = useState(() => { + const stored = localStorage.getItem("fileManagerEditorFontSize"); + return stored ? parseInt(stored, 10) : 14; + }); const editorRef = useRef(null); + const MIN_FONT_SIZE = 8; + const MAX_FONT_SIZE = 32; + + const decreaseFontSize = () => { + setEditorFontSize((prev) => { + const next = Math.max(MIN_FONT_SIZE, prev - 1); + localStorage.setItem("fileManagerEditorFontSize", String(next)); + return next; + }); + }; + + const increaseFontSize = () => { + setEditorFontSize((prev) => { + const next = Math.min(MAX_FONT_SIZE, prev + 1); + localStorage.setItem("fileManagerEditorFontSize", String(next)); + return next; + }); + }; + const fileTypeInfo = getFileType(file.name); const WARNING_SIZE = 50 * 1024 * 1024; @@ -301,6 +328,9 @@ export function FileViewer({ if (savedContent) { setOriginalContent(savedContent); } + }, [file.name, file.path, resetKey]); + + useEffect(() => { setHasChanges(content !== savedContent); if (fileTypeInfo.type === "unknown" && isLargeFile && !forceShowAsText) { @@ -308,14 +338,7 @@ export function FileViewer({ } else { setShowLargeFileWarning(false); } - }, [ - content, - savedContent, - fileTypeInfo.type, - isLargeFile, - forceShowAsText, - file.name, - ]); + }, [content, savedContent, fileTypeInfo.type, isLargeFile, forceShowAsText]); const handleContentChange = (newContent: string) => { setEditedContent(newContent); @@ -417,6 +440,33 @@ export function FileViewer({ )} + {isEditable && ( +
+ + + {editorFontSize}px + + +
+ )} {isEditable && ( + + +
+
+ {quickKeys.map((sym, i) => ( +
+ {sym} + +
+ ))} +
+
+ +
+ setNewSymbol(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") addKey(); + }} + maxLength={8} + placeholder={t("mobileKeyboard.quickKeyPlaceholder")} + className="h-9 text-xs font-mono" + /> + +
+ + + + + + + ); +} + +// --- CtrlPanel --- + +interface CtrlPanelProps { + onSend: (letter: string) => void; +} + +function CtrlPanel({ onSend }: CtrlPanelProps) { + const CTRL_KEYS = ["c", "d", "l", "u", "z", "a", "r", "w", "k"]; + + return ( +
+ {CTRL_KEYS.map((k) => ( + + ))} +
+ ); +} + +// --- MobileTerminalKeyboard --- + +export function MobileTerminalKeyboard({ + terminalRef, +}: MobileTerminalKeyboardProps) { + const { t } = useTranslation(); + const [ctrlActive, setCtrlActive] = useState(false); + const [shiftActive, setShiftActive] = useState(false); + const [quickKeys, setQuickKeys] = useState(loadQuickKeys); + const [sheetOpen, setSheetOpen] = useState(false); + + function send(seq: string) { + terminalRef.current?.sendInput?.(seq); + } + + function toggleCtrl() { + setCtrlActive((v) => !v); + setShiftActive(false); + } + + function toggleShift() { + setShiftActive((v) => !v); + setCtrlActive(false); + } + + function sendArrow(normalSeq: string, appSeq: string, shiftSeq: string) { + if (shiftActive) { + send(shiftSeq); + setShiftActive(false); + return; + } + const appMode = + terminalRef.current?.getApplicationCursorKeysMode?.() ?? false; + send(appMode ? appSeq : normalSeq); + } + + function handleTab() { + send(shiftActive ? "\x1b[Z" : "\t"); + setShiftActive(false); + } + + function handleCtrlKey(letter: string) { + const seq = CTRL_MAP[letter]; + if (seq) send(seq); + setCtrlActive(false); + } + + function updateQuickKeys(next: string[]) { + setQuickKeys(next); + saveQuickKeys(next); + } + + return ( +
+ {/* Row 1 — special keys */} +
+ {/* ESC */} + + + {/* Tab / back-tab */} + + +
+ + {/* Ctrl */} + + + {/* Shift */} + + +
+ + {/* Arrow keys */} + + + + + +
+ + {/* Home / End */} + + + +
+ + {/* PgUp / PgDn / Del */} + + + +
+ + {/* Ctrl combos panel */} + {ctrlActive && } + + {/* Row 2 — quick keys */} +
+ {quickKeys.map((sym, i) => ( + + ))} + +
+ +
+
+ + +
+ ); +} diff --git a/src/ui/features/terminal/Terminal.tsx b/src/ui/features/terminal/Terminal.tsx index 7102b013..34db2f3b 100644 --- a/src/ui/features/terminal/Terminal.tsx +++ b/src/ui/features/terminal/Terminal.tsx @@ -40,6 +40,7 @@ import { } from "@/lib/terminal-themes.ts"; import "./terminal-global-styles.ts"; import { useTheme } from "@/components/theme-provider.tsx"; +import { globalShortcutHandler } from "@/lib/global-shortcut-handler"; import { useCommandTracker } from "@/features/terminal/command-history/useCommandTracker.ts"; import { highlightTerminalOutput } from "@/lib/terminal-syntax-highlighter.ts"; import { useCommandHistory } from "@/features/terminal/command-history/CommandHistoryContext.tsx"; @@ -75,6 +76,7 @@ interface SSHTerminalProps { /** Attach to this tmux session right after connecting (tmux monitor). */ tmuxAttachSession?: string; onOpenFileManager?: (path?: string) => void; + onOpenFileInEditor?: (filePath: string) => void; previewTheme?: string | null; } @@ -85,10 +87,12 @@ const TerminalInner = forwardRef( isVisible, splitScreen = false, onClose, + onTitleChange, initialPath, executeCommand, tmuxAttachSession, onOpenFileManager, + onOpenFileInEditor, previewTheme, }, ref, @@ -114,7 +118,11 @@ const TerminalInner = forwardRef( const activeTheme = previewTheme || config.theme; const themeColors = resolveTermixThemeColors(activeTheme, appTheme); - const backgroundColor = themeColors.background; + const backgroundImage = config.backgroundImage || ""; + const backgroundImageOpacity = config.backgroundImageOpacity ?? 0.15; + const backgroundColor = backgroundImage + ? "transparent" + : themeColors.background; const fitAddonRef = useRef(null); const webSocketRef = useRef(null); const resizeTimeout = useRef(null); @@ -176,6 +184,10 @@ const TerminalInner = forwardRef( const pendingRestoredSessionIdRef = useRef( hostConfig.restoredSessionId ?? null, ); + const [linkClickDialog, setLinkClickDialog] = useState<{ + url: string; + } | null>(null); + const [tmuxSessionPicker, setTmuxSessionPicker] = useState<{ sessions: Array<{ name: string; @@ -655,6 +667,7 @@ const TerminalInner = forwardRef( isFittingRef.current = false; } }, + focus: () => terminal?.focus(), sendInput: (data: string) => { if (webSocketRef.current?.readyState === 1) { webSocketRef.current.send(JSON.stringify({ type: "input", data })); @@ -673,6 +686,8 @@ const TerminalInner = forwardRef( } }, refresh: () => hardRefresh(), + getApplicationCursorKeysMode: () => + terminal?.modes?.applicationCursorKeysMode ?? false, openFileManager: () => { if (webSocketRef.current?.readyState === WebSocket.OPEN) { webSocketRef.current.send(JSON.stringify({ type: "get_cwd" })); @@ -941,6 +956,24 @@ const TerminalInner = forwardRef( ); } terminal.onData((data) => { + if (data === "\r" || data === "\n") { + const currentCmd = getCurrentCommand().trim(); + const termixMatch = currentCmd.match(/^termix\s+(.+)$/); + if (termixMatch && onOpenFileInEditor) { + const filePath = termixMatch[1].trim(); + trackInput(data); + terminal.write("\r\n"); + if (ws.readyState === WebSocket.OPEN) { + ws.send( + JSON.stringify({ + type: "open_file_in_editor", + path: filePath, + }), + ); + } + return; + } + } trackInput(data); ws.send(JSON.stringify({ type: "input", data })); }); @@ -970,6 +1003,13 @@ const TerminalInner = forwardRef( } if (msg.type === "data") { if (typeof msg.data === "string") { + if (showAutocompleteRef.current) { + showAutocompleteRef.current = false; + setShowAutocomplete(false); + setAutocompleteSuggestions([]); + currentAutocompleteCommand.current = ""; + } + const syntaxHighlightingEnabled = hostConfig.terminalConfig?.syntaxHighlighting !== false; @@ -982,7 +1022,13 @@ const TerminalInner = forwardRef( terminal.write(outputData); const sudoPasswordPattern = - /(?:\[sudo\][^\n]*:\s*$|sudo:[^\n]*password[^\n]*required|password for [^\n]*:\s*$|Password:\s*$)/i; + /(?:\[sudo\][^\n\r]*:\s*$|sudo:[^\n\r]*password[^\n\r]*required|password for [^\n\r]*:\s*$|Password:\s*$)/im; + // Strip ANSI escape codes before testing — newer sudo versions (Ubuntu 26.04+) + // emit colored prompts with embedded escape sequences that break the regex. + const strippedData = msg.data.replace( + /\x1b(?:[@-Z\\-_]|\[[0-9;?>=!]*[@-~])/g, + "", + ); const hasSudoPw = hostConfig.terminalConfig?.sudoPassword || hostConfig.password || @@ -990,7 +1036,7 @@ const TerminalInner = forwardRef( hostConfig.hasPassword; if ( config.sudoPasswordAutoFill && - sudoPasswordPattern.test(msg.data) && + sudoPasswordPattern.test(strippedData) && hasSudoPw && !sudoPromptShownRef.current ) { @@ -1386,6 +1432,8 @@ const TerminalInner = forwardRef( } } else if (msg.type === "cwd") { onOpenFileManager?.(msg.path as string); + } else if (msg.type === "open_file_in_editor") { + onOpenFileInEditor?.(msg.path as string); } else if (msg.type === "passphrase_required") { setShowPassphraseDialog(true); setIsConnecting(false); @@ -1792,7 +1840,9 @@ const TerminalInner = forwardRef( | "both"; terminal.options.theme = { - background: themeColors.background, + background: config.backgroundImage + ? "transparent" + : themeColors.background, foreground: themeColors.foreground, cursor: themeColors.cursor, cursorAccent: themeColors.cursorAccent, @@ -1850,7 +1900,7 @@ const TerminalInner = forwardRef( fontFamily, allowTransparency: true, // MUST be set before open() convertEol: false, - macOptionIsMeta: false, + macOptionIsMeta: true, macOptionClickForcesSelection: false, rightClickSelectsWord: config.rightClickSelectsWord, fastScrollSensitivity: config.fastScrollSensitivity, @@ -1860,7 +1910,9 @@ const TerminalInner = forwardRef( lineHeight: config.lineHeight, bellStyle: config.bellStyle as "none" | "sound" | "visual" | "both", theme: { - background: themeColors.background, + background: config.backgroundImage + ? "transparent" + : themeColors.background, foreground: themeColors.foreground, cursor: themeColors.cursor, cursorAccent: themeColors.cursorAccent, @@ -1894,7 +1946,17 @@ const TerminalInner = forwardRef( uri.startsWith("http://") || uri.startsWith("https://") ? uri : `https://${uri}`; - window.open(url, "_blank"); + + const hostBehavior = hostConfig.terminalConfig?.linkClickBehavior; + const globalBehavior = + localStorage.getItem("terminalLinkClickBehavior") ?? "confirm"; + const behavior = hostBehavior ?? globalBehavior; + + if (behavior === "direct") { + window.open(url, "_blank"); + } else { + setLinkClickDialog({ url }); + } }); fitAddonRef.current = fitAddon; @@ -1906,6 +1968,9 @@ const TerminalInner = forwardRef( terminal.unicode.activeVersion = "11"; terminal.open(xtermRef.current); + terminal.onTitleChange((title) => { + if (title) onTitleChange?.(title); + }); document.fonts.ready.then(() => { terminal.refresh(0, terminal.rows - 1); fitAddon.fit(); @@ -2017,7 +2082,18 @@ const TerminalInner = forwardRef( return false; }; + // On macOS Electron, Tab key events can be swallowed by Chromium's focus + // traversal system before xterm.js sees them. Calling preventDefault() in + // the capture phase blocks that traversal while still allowing the event to + // reach xterm.js's internal handler (which fires our attachCustomKeyEventHandler). + const handleTabCapture = (e: KeyboardEvent) => { + if (e.key === "Tab") { + e.preventDefault(); + } + }; + element?.addEventListener("keydown", handleBackspaceMode, true); + element?.addEventListener("keydown", handleTabCapture, true); const resizeObserver = new ResizeObserver(() => { if (resizeTimeout.current) clearTimeout(resizeTimeout.current); @@ -2041,6 +2117,7 @@ const TerminalInner = forwardRef( element?.removeEventListener("mousemove", handleTmuxDragMove); element?.removeEventListener("mouseup", handleTmuxDragEnd); element?.removeEventListener("keydown", handleBackspaceMode, true); + element?.removeEventListener("keydown", handleTabCapture, true); if (notifyTimerRef.current) clearTimeout(notifyTimerRef.current); if (resizeTimeout.current) clearTimeout(resizeTimeout.current); }; @@ -2096,6 +2173,37 @@ const TerminalInner = forwardRef( return true; } + // Forward global app shortcuts to AppShell directly — xterm swallows + // all keydown events and synthetic re-dispatch is unreliable. + // stopPropagation prevents the same event from also firing the window listener. + if (e.ctrlKey && e.shiftKey && !e.altKey && !e.metaKey) { + const globalCodes = [ + "BracketRight", + "BracketLeft", + "Backslash", + "Minus", + ]; + if (globalCodes.includes(e.code)) { + e.stopPropagation(); + globalShortcutHandler.current?.(e); + return false; + } + } + + if (e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey) { + const arrowCodes = [ + "ArrowLeft", + "ArrowRight", + "ArrowUp", + "ArrowDown", + ]; + if (arrowCodes.includes(e.code)) { + e.stopPropagation(); + globalShortcutHandler.current?.(e); + return false; + } + } + if ( e.ctrlKey && !e.shiftKey && @@ -2132,6 +2240,38 @@ const TerminalInner = forwardRef( } } + if ( + e.ctrlKey && + e.shiftKey && + !e.altKey && + !e.metaKey && + e.key.toLowerCase() === "c" + ) { + const selection = terminal.getSelection(); + if (selection) { + e.preventDefault(); + e.stopPropagation(); + writeTextToClipboard(selection); + terminal.clearSelection(); + return false; + } + } + + if ( + e.ctrlKey && + e.shiftKey && + !e.altKey && + !e.metaKey && + e.key.toLowerCase() === "v" + ) { + e.preventDefault(); + e.stopPropagation(); + readTextFromClipboard().then((text) => { + if (text) terminal.paste(text); + }); + return false; + } + if ( e.ctrlKey && !e.shiftKey && @@ -2426,10 +2566,30 @@ const TerminalInner = forwardRef( const hasConnectionError = !!connectionError; return ( -
+
+ {backgroundImage && ( +
+ )}
( }), ); } + setTimeout(() => terminal?.focus(), 50); }} onCreateNew={() => { setTmuxSessionPicker(null); @@ -2667,6 +2828,7 @@ const TerminalInner = forwardRef( }), ); } + setTimeout(() => terminal?.focus(), 50); }} onCancel={() => setTmuxSessionPicker(null)} backgroundColor={backgroundColor} @@ -2680,6 +2842,57 @@ const TerminalInner = forwardRef( position={autocompletePosition} onSelect={handleAutocompleteSelect} /> + + {linkClickDialog && ( +
+
+

+ {t("terminal.linkDialogTitle")} +

+

+ {linkClickDialog.url} +

+
+ + + +
+
+
+ )}
); }, diff --git a/src/ui/features/terminal/terminal-global-styles.ts b/src/ui/features/terminal/terminal-global-styles.ts index e181bfa8..15913c39 100644 --- a/src/ui/features/terminal/terminal-global-styles.ts +++ b/src/ui/features/terminal/terminal-global-styles.ts @@ -1,9 +1,5 @@ const style = document.createElement("style"); style.innerHTML = ` -@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap'); - @font-face { font-family: 'Caskaydia Cove Nerd Font Mono'; src: url('./fonts/CaskaydiaCoveNerdFontMono-Regular.ttf') format('truetype'); diff --git a/src/ui/features/terminal/terminal-types.ts b/src/ui/features/terminal/terminal-types.ts index 68f0d681..26bee16e 100644 --- a/src/ui/features/terminal/terminal-types.ts +++ b/src/ui/features/terminal/terminal-types.ts @@ -21,7 +21,9 @@ export interface TerminalHandle { disconnect: () => void; reconnect: () => void; fit: () => void; + focus: () => void; sendInput: (data: string) => void; notifyResize: () => void; refresh: () => void; + getApplicationCursorKeysMode: () => boolean; } diff --git a/src/ui/hooks/use-status-color-scheme.ts b/src/ui/hooks/use-status-color-scheme.ts new file mode 100644 index 00000000..1ca6eb0a --- /dev/null +++ b/src/ui/hooks/use-status-color-scheme.ts @@ -0,0 +1,51 @@ +import { useState, useEffect } from "react"; + +export type StatusColorScheme = "accent" | "status"; + +export function useStatusColorScheme(): StatusColorScheme { + const [scheme, setScheme] = useState( + () => + (localStorage.getItem("statusColorScheme") as StatusColorScheme) ?? + "accent", + ); + + useEffect(() => { + const handler = () => { + setScheme( + (localStorage.getItem("statusColorScheme") as StatusColorScheme) ?? + "accent", + ); + }; + window.addEventListener("statusColorSchemeChanged", handler); + return () => + window.removeEventListener("statusColorSchemeChanged", handler); + }, []); + + return scheme; +} + +/** Returns Tailwind class names for a status dot/stripe. */ +export function getStatusClasses( + online: boolean, + scheme: StatusColorScheme, + variant: "dot" | "stripe" | "badge", +): string { + if (scheme === "status") { + if (variant === "dot") return online ? "bg-emerald-500" : "bg-red-500"; + if (variant === "stripe") + return online ? "bg-emerald-500" : "bg-red-500/40"; + // badge + return online + ? "border-emerald-500/40 text-emerald-500 bg-emerald-500/10" + : "border-red-500/40 text-red-500 bg-red-500/10"; + } + // accent scheme + if (variant === "dot") + return online ? "bg-accent-brand" : "bg-muted-foreground/25"; + if (variant === "stripe") + return online ? "bg-accent-brand" : "bg-transparent"; + // badge + return online + ? "border-accent-brand/40 text-accent-brand bg-accent-brand/10" + : "border-border/50 text-muted-foreground/60 bg-muted/30"; +} diff --git a/src/ui/index.css b/src/ui/index.css index 8bedf7da..29047c70 100644 --- a/src/ui/index.css +++ b/src/ui/index.css @@ -1,6 +1,16 @@ @import "tailwindcss"; @import "tw-animate-css"; @import "@fontsource-variable/jetbrains-mono"; +@import "@fontsource/jetbrains-mono/400.css"; +@import "@fontsource/jetbrains-mono/400-italic.css"; +@import "@fontsource/jetbrains-mono/700.css"; +@import "@fontsource/jetbrains-mono/700-italic.css"; +@import "@fontsource/fira-code/400.css"; +@import "@fontsource/fira-code/700.css"; +@import "@fontsource/source-code-pro/400.css"; +@import "@fontsource/source-code-pro/400-italic.css"; +@import "@fontsource/source-code-pro/700.css"; +@import "@fontsource/source-code-pro/700-italic.css"; @font-face { font-family: "Caskaydia Cove Nerd Font Mono"; @@ -242,38 +252,38 @@ .nord { --background: #2e3440; --foreground: #eceff4; - --card: #272c36; + --card: #303642; --card-foreground: #eceff4; - --popover: #272c36; + --popover: #303642; --popover-foreground: #eceff4; --primary: #eceff4; --primary-foreground: #2e3440; --secondary: #3b4252; --secondary-foreground: #eceff4; - --surface: #272c36; - --surface-dim: #22262e; + --surface: #303642; + --surface-dim: #262b35; --muted: #3b4252; - --muted-foreground: #4c566a; + --muted-foreground: #8899b0; --accent: #3b4252; --accent-foreground: #eceff4; --destructive: #bf616a; - --border: rgba(76, 86, 106, 0.35); - --input: rgba(76, 86, 106, 0.3); - --ring: #4c566a; + --border: rgba(136, 192, 208, 0.2); + --input: rgba(136, 192, 208, 0.15); + --ring: #88c0d0; --chart-1: #bf616a; --chart-2: #88c0d0; --chart-3: #a3be8c; --chart-4: #ebcb8b; --chart-5: #b48ead; --radius: 0.625rem; - --sidebar: #272c36; + --sidebar: #282d39; --sidebar-foreground: #eceff4; --sidebar-primary: #88c0d0; --sidebar-primary-foreground: #2e3440; --sidebar-accent: #3b4252; --sidebar-accent-foreground: #eceff4; - --sidebar-border: rgba(76, 86, 106, 0.35); - --sidebar-ring: #4c566a; + --sidebar-border: rgba(136, 192, 208, 0.2); + --sidebar-ring: #88c0d0; } /* ── Solarized Dark ─────────────────────────────────────────── */ diff --git a/src/ui/lib/clipboard-provider.ts b/src/ui/lib/clipboard-provider.ts index 2266f401..d3cd1b0e 100644 --- a/src/ui/lib/clipboard-provider.ts +++ b/src/ui/lib/clipboard-provider.ts @@ -18,9 +18,13 @@ export class RobustClipboardProvider implements IClipboardProvider { }); return; } - navigator.clipboard.writeText(text).catch(() => { + if (navigator.clipboard?.writeText) { + navigator.clipboard.writeText(text).catch(() => { + this.pendingWrite = text; + }); + } else { this.pendingWrite = text; - }); + } } }; window.addEventListener("focus", this.focusHandler); @@ -47,7 +51,11 @@ export class RobustClipboardProvider implements IClipboardProvider { await window.electronClipboard.writeText(text); return; } - await navigator.clipboard.writeText(text); + if (navigator.clipboard?.writeText) { + await navigator.clipboard.writeText(text); + } else { + this.pendingWrite = text; + } } catch { this.pendingWrite = text; } diff --git a/src/ui/lib/global-shortcut-handler.ts b/src/ui/lib/global-shortcut-handler.ts new file mode 100644 index 00000000..e3c2e95a --- /dev/null +++ b/src/ui/lib/global-shortcut-handler.ts @@ -0,0 +1,5 @@ +// Module-level ref so xterm's key handler can invoke app-level shortcuts +// without going through synthetic DOM events. +export const globalShortcutHandler = { + current: null as ((e: KeyboardEvent) => void) | null, +}; diff --git a/src/ui/lib/terminal-syntax-highlighter.test.ts b/src/ui/lib/terminal-syntax-highlighter.test.ts index fb89f9b7..332f80f7 100644 --- a/src/ui/lib/terminal-syntax-highlighter.test.ts +++ b/src/ui/lib/terminal-syntax-highlighter.test.ts @@ -154,7 +154,7 @@ describe("highlightTerminalOutput", () => { }); it("processes multi-line text line by line", () => { - const text = "some output\nERROR: failed"; + const text = "some output\nERROR: failed\n"; const out = highlightTerminalOutput(text); expect(out).toContain(ESC + "[91m"); }); @@ -198,4 +198,91 @@ describe("highlightTerminalOutput", () => { }); expect(out).not.toContain(ESC + "[96m"); }); + + it("skips highlighting when chunk contains a mid-line carriage return", () => { + // Progress bars and shell prompt redraws use \r to overwrite the current line + const chunk = "downloading...\rdownloading [====] 100%"; + expect(highlightTerminalOutput(chunk)).toBe(chunk); + }); + + it("still processes CRLF line endings (\\r\\n is fine)", () => { + const out = highlightTerminalOutput("ERROR occurred\r\n"); + expect(out).toContain(ESC + "[91m"); + }); + + it("does not highlight shell prompt lines (user@host:path$)", () => { + const prompt = `${ESC}[01;32mpi@raspberrypi${ESC}[00m:${ESC}[01;34m/home/pi${ESC}[00m$ `; + const out = highlightTerminalOutput(prompt); + expect(out).toBe(prompt); + }); + + it("does not highlight plain-text shell prompt line", () => { + const prompt = "pi@raspberrypi:/home/pi$ "; + const out = highlightTerminalOutput(prompt); + expect(out).toBe(prompt); + }); + + it("does not highlight 'success' when immediately followed by a path (cd output)", () => { + // Some shells print "success~/new/dir" or "success/path" after a cd command + const out = highlightTerminalOutput("success~/home/user/projects"); + expect(out).not.toContain(ESC + "[92m"); + }); + + it("still highlights 'success' when not followed by a path separator", () => { + const out = highlightTerminalOutput("Build success: all tests passed"); + expect(out).toContain(ESC + "[92m"); + }); + + it("highlights output lines but not the prompt in a mixed chunk", () => { + const chunk = `ERROR: disk full\npi@raspberrypi:~$ `; + const out = highlightTerminalOutput(chunk); + // The error line should be highlighted + expect(out).toContain(ESC + "[91m"); + // The prompt line should be unchanged + expect(out).toContain("pi@raspberrypi:~$ "); + const promptLine = out.split("\n")[1]; + expect(promptLine).toBe("pi@raspberrypi:~$ "); + }); + + it("does not highlight paths inside a command-echo line (prompt + command)", () => { + // When the shell echoes the user's command, it prefixes the prompt. + // The path in the prompt portion (/home/user) must not be highlighted — + // the shell already colored it, and re-coloring it causes the doubled-path bug. + const echo = "user@host:/home/user$ cd /opt/app/bin/files"; + const out = highlightTerminalOutput(echo); + expect(out).toBe(echo); + }); + + it("does not highlight paths in colored command-echo lines (root prompt)", () => { + const echo = `${ESC}[01;32mroot@host${ESC}[00m:${ESC}[01;34m/home/user${ESC}[00m# cd /opt/app/bin/files`; + const out = highlightTerminalOutput(echo); + expect(out).toBe(echo); + }); + + it("does not highlight the last line of a multi-line chunk with no trailing newline", () => { + // In a multi-line chunk, the trailing fragment without \n could be a live + // readline input line. Injecting ANSI bytes there breaks bash's cursor + // arithmetic (causes cursor jump / text shift when using arrow keys). + const chunk = "ERROR: disk full\nuser@host:/path$ cd /var/log"; + const out = highlightTerminalOutput(chunk); + // First line (terminated by \n) gets highlighted + expect(out.split("\n")[0]).toContain(ESC + "[91m"); + // Last unterminated fragment is left verbatim + expect(out.split("\n")[1]).toBe("user@host:/path$ cd /var/log"); + }); + + it("still highlights a single-line chunk with no trailing newline", () => { + // A single-line chunk with no \n is plain command output, not a readline + // input fragment — highlight it normally. + const out = highlightTerminalOutput("ERROR: something failed"); + expect(out).toContain(ESC + "[91m"); + }); + + it("highlights all lines when the chunk ends with a newline", () => { + // When a chunk ends with \n every line is complete output — highlight them all. + const chunk = "ERROR: disk full\nconnect to /var/run/app.sock\n"; + const out = highlightTerminalOutput(chunk); + expect(out.split("\n")[0]).toContain(ESC + "[91m"); + expect(out.split("\n")[1]).toContain(ESC + "[36m"); + }); }); diff --git a/src/ui/lib/terminal-syntax-highlighter.ts b/src/ui/lib/terminal-syntax-highlighter.ts index 64a2825a..1bbfd995 100644 --- a/src/ui/lib/terminal-syntax-highlighter.ts +++ b/src/ui/lib/terminal-syntax-highlighter.ts @@ -56,6 +56,28 @@ const MAX_LINE_LENGTH = 2000; // If a chunk contains these, we skip highlighting entirely. const TUI_SEQUENCE = /\x1b\[[\d;]*[ABCDEFGHJKST]/; +// A bare \r (not immediately followed by \n) means the terminal is overwriting +// the current line (shell prompts, progress bars). Highlighting mid-rewrite +// chunks corrupts the cursor state, so we skip the whole chunk. +const MID_LINE_CR = /\r(?!\n)/; + +// Detects shell prompt lines (user@host:/path$ or similar) after stripping ANSI. +// These should not be highlighted — the server already colored them, and injecting +// additional ANSI codes into the prompt fragments causes display corruption. +const STRIP_ANSI_RE = /\x1b(?:[@-Z\\-_]|\[[0-9;?>=!]*[@-~])/g; + +function isShellPromptLine(bare: string): boolean { + const plain = bare.replace(STRIP_ANSI_RE, ""); + // Matches a trailing prompt: "user@host:~$ ", "root@pi:/home/pi# ", "[user@host dir]$ " + if (/(?:[\w.-]+@[\w.-]+|[\w.-]+).*?[$#%>]\s*$/.test(plain)) return true; + // Matches a leading prompt followed by a command: "user@host:/path$ cmd arg" + // This is the echoed command line — the shell colors the prompt prefix itself, + // so injecting extra ANSI codes into it causes visual corruption / doubled paths. + if (/^(?:\[?[\w.-]+@[\w.-]+[\w./ ~-]*\]?|[\w.-]+).*?[$#%>]\s+\S/.test(plain)) + return true; + return false; +} + // Matches any complete ANSI escape sequence const ANSI_REGEX = /\x1b(?:[@-Z\\-_]|\[[0-9;?>=!]*[@-~])/g; @@ -114,10 +136,13 @@ const ALL_PATTERNS: HighlightPattern[] = [ category: "logLevels", }, - // Success keywords — kept conservative to avoid noise + // Success keywords — kept conservative to avoid noise. + // Negative lookahead prevents matching when directly followed by a path separator + // (e.g. shell `cd` output that prints "success~/new/dir"). { name: "log-success", - regex: /\b(?:success(?:ful(?:ly)?)?|pass(?:ed)?|complete(?:d)?|ok\b)\b/gi, + regex: + /\b(?:success(?:ful(?:ly)?)?|pass(?:ed)?|complete(?:d)?|ok\b)\b(?![\\/~])/gi, ansiCode: ANSI.brightGreen, priority: 8, category: "logLevels", @@ -313,6 +338,7 @@ function highlightLine( const bare = cr ? line.slice(0, -1) : line; if (!bare.trim()) return line; + if (isShellPromptLine(bare)) return line; const segments = parseAnsiSegments(bare); const result = segments @@ -334,12 +360,29 @@ export function highlightTerminalOutput( if (hasIncompleteAnsiSequence(text)) return text; if (TUI_SEQUENCE.test(text)) return text; + if (MID_LINE_CR.test(text)) return text; const activePatterns = buildActivePatterns(options); if (activePatterns.length === 0) return text; - return text - .split("\n") - .map((line) => highlightLine(line, activePatterns)) + const lines = text.split("\n"); + const endsWithNewline = text.endsWith("\n"); + const hasMultipleLines = lines.length > 1; + + // When a multi-line chunk has a trailing fragment without \n, that fragment + // could be a live readline input line that bash will redraw with \r + + // cursor-positioning sequences. Injecting ANSI bytes into it adds invisible + // chars that bash doesn't count, so bash's cursor arithmetic diverges from + // xterm's actual column position — causing the cursor to jump and text to + // shift when the user types or navigates with arrow keys. + // Only skip the last fragment when the chunk already has complete lines + // before it (single-line chunks with no \n are plain output, not input). + const highlightCount = + hasMultipleLines && !endsWithNewline ? lines.length - 1 : lines.length; + + return lines + .map((line, i) => + i < highlightCount ? highlightLine(line, activePatterns) : line, + ) .join("\n"); } diff --git a/src/ui/lib/terminal-themes.ts b/src/ui/lib/terminal-themes.ts index d4f80bc7..d96bfab6 100644 --- a/src/ui/lib/terminal-themes.ts +++ b/src/ui/lib/terminal-themes.ts @@ -821,6 +821,8 @@ export const DEFAULT_TERMINAL_CONFIG = { keepaliveInterval: undefined as number | undefined, keepaliveCountMax: undefined as number | undefined, autoTmux: false, + backgroundImage: "" as string, + backgroundImageOpacity: 0.15, }; export type TerminalConfigType = typeof DEFAULT_TERMINAL_CONFIG; diff --git a/src/ui/lib/theme.ts b/src/ui/lib/theme.ts index 05cfffe6..71a43557 100644 --- a/src/ui/lib/theme.ts +++ b/src/ui/lib/theme.ts @@ -41,6 +41,12 @@ export const DASHBOARD_CARDS: DashboardCardConfig[] = [ description: "Visual map of host network topology", defaultEnabled: false, }, + { + id: "service_links", + label: "Service Links", + description: "Clickable buttons linking to services on your servers", + defaultEnabled: false, + }, ]; export const ACCENT_PRESET_COLORS = [ diff --git a/src/ui/locales/en.json b/src/ui/locales/en.json index 54e5c5bd..e8cdfe92 100644 --- a/src/ui/locales/en.json +++ b/src/ui/locales/en.json @@ -58,7 +58,10 @@ "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", "embeddedConnecting": "Connecting to local server...", "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", - "localServer": "Local Server" + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { "error": "Version Check Error", @@ -105,6 +108,7 @@ "cancel": "Cancel", "username": "Username", "login": "Login", + "logout": "Logout", "register": "Register", "password": "Password", "confirmPassword": "Confirm Password", @@ -165,6 +169,7 @@ "noPasswordAvailable": "No password available", "failedToCopyPassword": "Failed to copy password", "refreshTab": "Refresh connection", + "renameTab": "Rename tab", "openFileManager": "Open File Manager", "dashboard": "Dashboard", "networkGraph": "Network Graph", @@ -190,6 +195,7 @@ "downloadSample": "Download Sample", "failedToDeleteHost": "Failed to delete {{name}}", "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", @@ -264,6 +270,7 @@ "forceKeyboardInteractive": "Force Keyboard-Interactive", "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", "addKnock": "Add Port", @@ -297,6 +304,8 @@ "addressIp": "Address / IP", "friendlyName": "Friendly Name", "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Folder & Advanced", "privateNotes": "Private Notes", "privateNotesPlaceholder": "Details about this server...", @@ -339,6 +348,8 @@ "docsLink": "View docs", "opksshLabel": "OPKSSH", "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", "tailscaleDeviceSelect": "Select Tailscale device", "tailscaleDeviceSelectPlaceholder": "Select a device...", "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", @@ -348,6 +359,9 @@ "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Terminal Appearance", "colorTheme": "Color Theme", "fontFamilyLabel": "Font Family", @@ -361,6 +375,9 @@ "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", "rightClickSelectsWordLabel": "Right-click Selects Word", "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", "syntaxHighlightingLabel": "Syntax Highlighting", "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", "syntaxHighlightingCategories": "Highlight Categories", @@ -382,6 +399,8 @@ "scrollbackMaxLines": "Maximum number of lines kept in history", "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Enable Auto-Mosh", "enableAutoMoshDesc": "Prefer Mosh over SSH if available", "enableAutoTmux": "Enable Auto-Tmux", @@ -390,6 +409,11 @@ "enableSessionLoggingDesc": "Record terminal session output for later review", "enableCommandHistory": "Command History", "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", @@ -436,8 +460,15 @@ "proxmoxIntegration": "Proxmox Integration", "enableProxmox": "Enable Proxmox", "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", "proxmoxDefaultCredential": "Default Credential", - "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts. The credential's username is applied to all guests.", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", "proxmoxWindowsDetection": "Windows / RDP detection", "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", "proxmoxDockerDetection": "Docker detection", @@ -465,6 +496,8 @@ "proxmoxImportFailed": "Import failed", "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", "defaultPathLabel": "Default Path", "fileManagerPathHint": "The directory to open when the file manager launches for this host.", "statusChecksLabel": "Status Checks", @@ -522,6 +555,7 @@ "credentialUpdated": "Credential updated", "credentialCreated": "Credential created", "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Back to Hosts", "backToCredentials": "Back to Credentials", "pinned": "Pinned", @@ -686,6 +720,7 @@ "nSelected": "{{count}} selected", "featuresMenu": "Features", "moveMenu": "Move", + "connectSelected": "Connect", "cancelSelection": "Cancel", "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", "targetHostLabel": "Target Host", @@ -746,6 +781,12 @@ "guac": { "connection": "Connection", "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Select a credential...", "connectionSettings": "Connection Settings", "displaySettings": "Display Settings", "audioSettings": "Audio Settings", @@ -773,6 +814,13 @@ "initialProgram": "Initial Program", "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", "gatewayPort": "Gateway Port", "gatewayUsername": "Gateway Username", @@ -937,7 +985,8 @@ "persisted": "Persisted in background", "expiresIn": "Expires in {{duration}}", "search": "Search connections...", - "noSearchResults": "No connections match your search" + "noSearchResults": "No connections match your search", + "rename": "Rename session" }, "guacamole": { "connecting": "Connecting to {{type}} session...", @@ -1034,6 +1083,9 @@ "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", "opksshSignInWith": "Sign in with {{provider}}", "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Open", + "linkDialogCopy": "Copy", "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", "connectionLogTitle": "Connection Log", "connectionLogCopy": "Copy logs to clipboard", @@ -1043,7 +1095,12 @@ "connectionLogCopyFailed": "Failed to copy logs to clipboard", "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", - "sessionTakenOver": "Session was opened in another tab. Reconnecting..." + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Split Tab", + "addToSplit": "Add to Split", + "removeFromSplit": "Remove from Split" + } }, "fileManager": { "noHostSelected": "No host selected", @@ -1124,6 +1181,10 @@ "pathCopiedToClipboard": "Path copied to clipboard", "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", "movedItems": "Moved {{count}} items", "failedToDeleteItem": "Failed to delete item", "itemRenamedSuccessfully": "{{type}} renamed successfully", @@ -1233,6 +1294,8 @@ "move": "Move", "searchInFile": "Search in file (Ctrl+F)", "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", "startWritingMarkdown": "Start writing your markdown content...", "loadingFileComparison": "Loading file comparison...", "reload": "Reload", @@ -1248,6 +1311,7 @@ "totpVerificationFailed": "TOTP verification failed", "warpgateVerificationFailed": "Warpgate authentication failed", "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", "verificationCodePrompt": "Verification code:", "changePermissions": "Change Permissions", "currentPermissions": "Current Permissions", @@ -1632,7 +1696,7 @@ }, "auth": { "tagline": "Self-hosted SSH and remote desktop management", - "loginTitle": "Login to Termix", + "loginTitle": "Welcome back", "registerTitle": "Create Account", "forgotPassword": "Forgot Password?", "rememberMe": "Remember Device for 30 Days (includes TOTP)", @@ -1684,6 +1748,7 @@ "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", "authenticationDisabled": "Authentication Disabled", "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { @@ -1812,7 +1877,8 @@ "serverStatsCard": "Server Stats", "panelMain": "Main", "panelSide": "Side", - "justNow": "just now" + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABLE", @@ -1833,7 +1899,17 @@ "done": "Done", "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", "empty": "Empty", - "clear": "Clear" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" }, "sessionLogs": { "title": "Session Logs", @@ -2036,6 +2112,38 @@ "sectionDatabase": "Database", "sectionApiKeys": "API Keys", "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", "auditLogTotal": "{{total}} total entries", "auditLogEmpty": "No audit log entries found", "auditLogSuccess": "Success", @@ -2052,11 +2160,13 @@ "auditLogFilterTo": "To", "auditLogFilterAll": "All", "allowRegistration": "Allow User Registration", - "allowRegistrationDesc": "Let new users self-register", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Allow Password Login", "allowPasswordLoginDesc": "Username/password login", "oidcAutoProvision": "OIDC Auto-Provision", - "oidcAutoProvisionDesc": "Auto-create accounts for OIDC users even when registration is disabled", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Allow Password Reset", "allowPasswordResetDesc": "Reset code via Docker logs", "commandHistoryEnabled": "Command History", @@ -2094,6 +2204,8 @@ "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", "oidcGroupClaim": "Group Claim", "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", "removeOidc": "Remove", "usersCount": "{{count}} users", "createUser": "Create", @@ -2193,10 +2305,19 @@ "linkAccountSuccess": "Accounts linked successfully", "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", "saving": "Saving...", "updateRegistrationFailed": "Failed to update registration setting", "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Failed to update password reset setting", "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", "sessionTimeoutSaved": "Session timeout saved", @@ -2233,7 +2354,27 @@ "importSelectFile": "Please select a file first", "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", "importFailed": "Import failed: {{error}}", - "importError": "Database import failed" + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { @@ -2292,7 +2433,13 @@ "splitTab": "Split Tab", "addToSplit": "Add to Split", "removeFromSplit": "Remove from Split", - "assignToPane": "Assign to pane" + "assignToPane": "Assign to pane", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { "title": "Snippets", @@ -2364,7 +2511,33 @@ "shareLoadError": "Failed to load share data", "loading": "Loading...", "close": "Close", - "reorderFailed": "Failed to save snippet order" + "reorderFailed": "Failed to save snippet order", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { "storageModeLocal": "Browser", @@ -2389,6 +2562,7 @@ "versionLabel": "Version", "deleteAccount": "Delete Account", "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", "deleteButton": "Delete", "deleteAccountPermanent": "This action is permanent and cannot be undone.", "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", @@ -2400,6 +2574,8 @@ "settingsTerminal": "Terminal", "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "History Tracking", "historyTrackingDesc": "Track terminal commands", "commandPalette": "Command Palette", @@ -2413,6 +2589,10 @@ "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Click to Expand Host Actions", "hostTrayOnClickDesc": "Always show connection buttons; click to expand management options instead of hover", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Keep the left sidebar app rail always expanded instead of expanding on hover", "settingsNavigation": "Navigation", @@ -2581,5 +2761,29 @@ "timeMinutes": "{{count}}m ago", "timeHours": "{{count}}h ago", "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/af_ZA.json b/src/ui/locales/translated/af_ZA.json index f82fcab2..aefdd4d2 100644 --- a/src/ui/locales/translated/af_ZA.json +++ b/src/ui/locales/translated/af_ZA.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Lêers", - "folder": "Vouer", - "password": "Wagwoord", - "key": "Sleutel", - "sshPrivateKey": "SSH Privaat Sleutel", - "upload": "Oplaai", - "keyPassword": "Sleutelwagwoord", - "sshKey": "SSH-sleutel", - "uploadPrivateKeyFile": "Laai privaat sleutellêer op", - "searchCredentials": "Soek geloofsbriewe...", - "addCredential": "Voeg geloofsbriewe by", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "CA-sertifikaat (-cert.pub)", "caCertificateDescription": "Opsioneel: Laai die CA-getekende sertifikaatlêer op of plak dit (bv. id_ed25519-cert.pub). Vereis wanneer jou SSH-bediener sertifikaatgebaseerde magtiging gebruik.", "uploadCertFile": "Laai -cert.pub-lêer op", - "clearCert": "Duidelik", + "clearCert": "Clear", "certLoaded": "Sertifikaat gelaai", "certPublicKeyLabel": "CA-sertifikaat", "certTypeLabel": "Sertifikaattipe", "pasteOrUploadCert": "Plak of laai 'n -cert.pub-sertifikaat op...", "hasCaCert": "Het CA-sertifikaat", - "noCaCert": "Geen CA-sertifikaat nie" + "noCaCert": "Geen CA-sertifikaat nie", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Standaardbestelling", + "sortNameAsc": "Naam (A → Z)", + "sortNameDesc": "Naam (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Vee filters uit", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Kon nie waarskuwings laai nie", - "failedToDismissAlert": "Kon nie waarskuwing toemaak nie" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Bedienerkonfigurasie", - "description": "Konfigureer die Termix-bediener-URL om aan jou backend-dienste te koppel", - "serverUrl": "Bediener-URL", - "enterServerUrl": "Voer asseblief 'n bediener-URL in", - "saveFailed": "Kon nie konfigurasie stoor nie", - "saveError": "Fout met die stoor van die konfigurasie", - "saving": "Stoor...", - "saveConfig": "Stoor Konfigurasie", - "helpText": "Voer die URL in waar jou Termix-bediener loop (bv. http://localhost:30001 of https://your-server.com)", - "changeServer": "Verander bediener", - "mustIncludeProtocol": "Bediener-URL moet met http:// of https:// begin", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Laat ongeldige sertifikaat toe", "allowInvalidCertificateDesc": "Gebruik slegs vir vertroude selfgehoste bedieners met selfgetekende of IP-adres sertifikate.", - "useEmbedded": "Gebruik plaaslike bediener", - "embeddedDesc": "Begin Termix met die ingeboude plaaslike bediener (geen afstandbediener nodig nie)", - "embeddedConnecting": "Verbind met plaaslike bediener...", - "embeddedNotReady": "Die plaaslike bediener is nog nie gereed nie. Wag asseblief 'n oomblik en probeer weer.", - "localServer": "Plaaslike bediener" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Plaaslike bediener", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Weergawekontrolefout", - "checkFailed": "Kon nie vir opdaterings kyk nie", - "upToDate": "Toepassing is op datum", - "currentVersion": "Jy gebruik weergawe {{version}}", - "updateAvailable": "Opdatering beskikbaar", - "newVersionAvailable": "'n Nuwe weergawe is beskikbaar! Jy gebruik {{current}}, maar {{latest}} is beskikbaar.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Beta-weergawe", - "betaVersionDesc": "Jy gebruik {{current}}, wat nuwer is as die nuutste stabiele weergawe {{latest}}.", - "releasedOn": "Vrygestel op {{date}}", - "downloadUpdate": "Laai opdatering af", - "checking": "Kontroleer tans vir opdaterings...", - "checkUpdates": "Kyk vir opdaterings", - "checkingUpdates": "Kontroleer tans vir opdaterings...", - "updateRequired": "Opdatering Vereis" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Maak toe", - "minimize": "Minimaliseer", - "online": "Aanlyn", - "offline": "Vanlyn", - "continue": "Gaan voort", - "maintenance": "Onderhoud", - "degraded": "Gedegradeer", - "error": "Fout", - "warning": "Waarskuwing", - "unsavedChanges": "Ongestoorde veranderinge", - "dismiss": "Maak toe", - "loading": "Laai tans...", - "optional": "Opsioneel", - "connect": "Verbind", - "copied": "Gekopieer", - "connecting": "Verbind...", - "updateAvailable": "Opdatering beskikbaar", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Maak oop in Nuwe Oortjie", - "noReleases": "Geen vrystellings nie", - "updatesAndReleases": "Opdaterings en vrystellings", - "newVersionAvailable": "'n Nuwe weergawe ({{version}}) is beskikbaar.", - "failedToFetchUpdateInfo": "Kon nie opdateringsinligting haal nie", - "preRelease": "Voorvrystelling", - "noReleasesFound": "Geen vrystellings gevind nie.", - "cancel": "Kanselleer", - "username": "Gebruikersnaam", - "login": "Aanmeld", - "register": "Registreer", - "password": "Wagwoord", - "confirmPassword": "Bevestig wagwoord", - "back": "Terug", - "save": "Stoor", - "saving": "Stoor...", - "delete": "Vee uit", - "rename": "Hernoem", - "edit": "Wysig", - "add": "Voeg by", - "confirm": "Bevestig", - "no": "Nee", - "or": "OF", - "next": "Volgende", - "previous": "Vorige", - "refresh": "Verfris", - "language": "Taal", - "checking": "Kontroleer tans...", - "checkingDatabase": "Kontroleer databasisverbinding...", - "checkingAuthentication": "Kontroleer tans verifikasie...", - "backendReconnected": "Bedienerverbinding herstel", - "connectionDegraded": "Bedienerverbinding verloor, herstel…", - "reload": "Herlaai", - "remove": "Verwyder", - "create": "Skep", - "update": "Opdatering", - "copy": "Kopieer", - "copyFailed": "Kon nie na knipbord kopieer nie", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maksimeer", "restore": "Herstel", - "of": "van" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Tuis", - "terminal": "Terminaal", + "home": "Home", + "terminal": "Terminal", "docker": "Docker", - "tunnels": "Tonnels", - "fileManager": "Lêerbestuurder", - "serverStats": "Bedienerstatistieke", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "admin": "Admin", - "userProfile": "Gebruikersprofiel", - "splitScreen": "Gesplete skerm", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Sluit hierdie aktiewe sessie?", - "close": "Maak toe", - "cancel": "Kanselleer", - "sshManager": "SSH-bestuurder", - "cannotSplitTab": "Kan nie hierdie oortjie verdeel nie", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Kopieer Wagwoord", - "copySudoPassword": "Kopieer Sudo-wagwoord", - "passwordCopied": "Wagwoord gekopieer na knipbord", - "noPasswordAvailable": "Geen wagwoord beskikbaar nie", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "Kon nie wagwoord kopieer nie", "refreshTab": "Verfris verbinding", - "openFileManager": "Maak Lêerbestuurder oop", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", "dashboard": "Dashboard", - "networkGraph": "Netwerkgrafiek", - "quickConnect": "Vinnige verbinding", - "sshTools": "SSH-gereedskap", - "history": "Geskiedenis", - "hosts": "Gashere", - "snippets": "Brokkies", - "hostManager": "Gasheerbestuurder", - "credentials": "Geloofsbriewe", - "connections": "Verbindings", - "roleAdministrator": "Administrateur", - "roleUser": "Gebruiker" + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Gashere", - "noHosts": "Geen SSH-gashere nie", - "retry": "Probeer weer", - "refresh": "Verfris", - "optional": "Opsioneel", - "downloadSample": "Laai voorbeeld af", - "failedToDeleteHost": "Kon nie {{name}} uitvee nie", - "importSkipExisting": "Invoer (slaan bestaande oor)", - "connectionDetails": "Verbindingsbesonderhede", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Afstandslessenaar", - "port": "Hawe", - "username": "Gebruikersnaam", - "folder": "Vouer", - "tags": "Etikette", - "pin": "Speld vas", - "addHost": "Voeg gasheer by", - "editHost": "Wysig gasheer", - "cloneHost": "Kloon gasheer", - "enableTerminal": "Aktiveer Terminaal", - "enableTunnel": "Aktiveer Tonnel", - "enableFileManager": "Aktiveer Lêerbestuurder", - "enableDocker": "Aktiveer Docker", - "defaultPath": "Standaardpad", - "connection": "Verbinding", - "upload": "Oplaai", - "authentication": "Verifikasie", - "password": "Wagwoord", - "key": "Sleutel", - "credential": "Geloofsbrief", - "none": "Geen", - "sshPrivateKey": "SSH Privaat Sleutel", - "keyType": "Sleuteltipe", - "uploadFile": "Laai lêer op", - "tabGeneral": "Algemeen", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Tonnels", + "tabTunnels": "Tunnels", "tabDocker": "Docker", "tabFiles": "Lêers", - "tabStats": "Statistiek", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Deling", - "tabAuthentication": "Verifikasie", - "terminal": "Terminaal", - "tunnel": "Tonnel", - "fileManager": "Lêerbestuurder", - "serverStats": "Bedienerstatistieke", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", "status": "Status", - "folderRenamed": "Lêer \"{{oldName}}\" is suksesvol hernoem na \"{{newName}}\"", - "failedToRenameFolder": "Kon nie die vouer hernoem nie", - "movedToFolder": "Geskuif na \"{{folder}}\"", - "editHostTooltip": "Wysig gasheer", - "statusChecks": "Statuskontroles", - "metricsCollection": "Metrieke-versameling", - "metricsInterval": "Metrieke Versamelingsinterval", - "metricsIntervalDesc": "Hoe gereeld om bedienerstatistieke in te samel (5s - 1u)", - "behavior": "Gedrag", - "themePreview": "Temavoorskou", - "theme": "Tema", - "fontFamily": "Lettertipefamilie", - "fontSize": "Lettergrootte", - "letterSpacing": "Letterspasiëring", - "lineHeight": "Lynhoogte", - "cursorStyle": "Wyserstyl", - "cursorBlink": "Wyserknip", - "scrollbackBuffer": "Terugrolbuffer", - "bellStyle": "Klokstyl", - "rightClickSelectsWord": "Regskliek Kies Woord", - "fastScrollModifier": "Vinnige Blaai-wysiger", - "fastScrollSensitivity": "Vinnige blaai-sensitiwiteit", - "sshAgentForwarding": "SSH Agent Aanstuur", - "backspaceMode": "Terugspasie-modus", - "startupSnippet": "Opstart-brokkie", - "selectSnippet": "Kies uittreksel", - "forceKeyboardInteractive": "Forseer sleutelbord-interaktief", - "overrideCredentialUsername": "Oorskryf geloofsbriewe gebruikersnaam", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Gebruik die gebruikersnaam wat hierbo gespesifiseer is in plaas van die gebruikersnaam van die geloofsbriewe", - "jumpHostChain": "Springgasheerketting", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", "addKnock": "Voeg poort by", "addProxyNode": "Voeg Node by", - "proxyNode": "Proxy-knooppunt", - "proxyType": "Proxy Tipe", - "quickActions": "Vinnige Aksies", - "sudoPasswordAutoFill": "Sudo Wagwoord Outomatiese Vul", - "sudoPassword": "Sudo-wagwoord", - "keepaliveInterval": "Lewendige interval (ms)", - "moshCommand": "MOSH-opdrag", - "environmentVariables": "Omgewingsveranderlikes", - "addVariable": "Voeg veranderlike by", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Kopieer terminaal-URL", - "copyFileManagerUrl": "Kopieer Lêerbestuurder URL", - "copyRemoteDesktopUrl": "Kopieer Afstandslessenaar URL", - "failedToConnect": "Kon nie aan konsole koppel nie", - "connect": "Verbind", - "disconnect": "Ontkoppel", - "start": "Begin", - "enableStatusCheck": "Aktiveer Statuskontrole", - "enableMetrics": "Aktiveer Metrieke", - "bulkUpdateFailed": "Grootmaatopdatering het misluk", - "selectAll": "Kies Alles", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Deselekteer alles", "protocols": "Protokolle", "secureShell": "Veilige Dop", @@ -272,6 +303,9 @@ "unencryptedShell": "Ongeënkripteerde dop", "addressIp": "Adres / IP", "friendlyName": "Vriendelike Naam", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Vouer en Gevorderd", "privateNotes": "Privaat Notas", "privateNotesPlaceholder": "Besonderhede oor hierdie bediener...", @@ -281,18 +315,18 @@ "addKnockBtn": "Voeg Klop by", "noPortKnocking": "Geen poortklopping gekonfigureer nie.", "knockPort": "Knock Port", - "protocol": "Protokol", + "protocol": "Protocol", "delayAfterMs": "Vertraging na (ms)", "useSocks5Proxy": "Gebruik SOCKS5 Proxy", "useSocks5ProxyDesc": "Roeteer verbinding deur 'n proxy-bediener", - "proxyHost": "Proxy-gasheer", - "proxyPort": "Proxy-poort", - "proxyUsername": "Proxy-gebruikersnaam", - "proxyPassword": "Proxy-wagwoord", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Enkele Proxy", - "proxyChainMode": "Proxy-ketting", + "proxyChainMode": "Proxy Chain", "you": "Jy", - "jumpHostChainLabel": "Springgasheerketting", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Voeg Spring by", "noJumpHosts": "Geen springgashere gekonfigureer nie.", "selectAServer": "Kies 'n bediener...", @@ -300,10 +334,10 @@ "authMethod": "Magtigingsmetode", "storedCredential": "Gestoorde geloofsbriewe", "selectACredential": "Kies 'n geloofsbrief...", - "keyTypeLabel": "Sleuteltipe", - "keyTypeAuto": "Outomatiese opsporing", - "keyPasteTab": "Plak", - "keyUploadTab": "Oplaai", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Sleutellêer gelaai", "keyUploadClick": "Klik om .pem / .key / .ppk op te laai", "clearKey": "Vee sleutel uit", @@ -311,59 +345,105 @@ "keyReplaceNotice": "plak 'n nuwe sleutel hieronder om dit te vervang", "keyPassphraseSaved": "Wagwoordfrase gestoor, tik om te verander", "replaceKey": "Vervang sleutel", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Forseer Sleutelbord Interaktief", "forceKeyboardInteractiveShortDesc": "Forseer handmatige wagwoordinvoer selfs al is sleutels teenwoordig", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Terminaalvoorkoms", "colorTheme": "Kleurtema", - "fontFamilyLabel": "Lettertipefamilie", - "fontSizeLabel": "Lettergrootte", - "cursorStyleLabel": "Wyserstyl", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Letterspasiëring (px)", - "lineHeightLabel": "Lynhoogte", - "bellStyleLabel": "Klokstyl", - "backspaceModeLabel": "Terugspasie-modus", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Wysertjie flikker", "cursorBlinkingDesc": "Aktiveer flikkerende animasie vir die terminaalwyser", "rightClickSelectsWordLabel": "Regskliek Kies Woord", "rightClickSelectsWordShortDesc": "Kies die woord onder die wyser met die regskliek", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Sintaksis-uitlig", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Tydstempels", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Gedrag en Gevorderd", - "scrollbackBufferLabel": "Terugrolbuffer", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Maksimum aantal lyne wat in die geskiedenis gehou word", - "sshAgentForwardingLabel": "SSH Agent Aanstuur", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Gee jou plaaslike SSH-sleutels aan hierdie gasheer deur", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Aktiveer Auto-Mosh", "enableAutoMoshDesc": "Verkies Mosh bo SSH indien beskikbaar", "enableAutoTmux": "Aktiveer Auto-Tmux", "enableAutoTmuxDesc": "Begin of koppel outomaties aan tmux-sessie", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Sudo Wagwoord Outomatiese Vul", "sudoPasswordAutoFillShortDesc": "Verskaf outomaties 'n sudo-wagwoord wanneer gevra word", - "sudoPasswordLabel": "Sudo-wagwoord", - "environmentVariablesLabel": "Omgewingsveranderlikes", - "addVariableBtn": "Voeg veranderlike by", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Geen omgewingveranderlikes gekonfigureer nie.", - "fastScrollModifierLabel": "Vinnige Blaai-wysiger", - "fastScrollSensitivityLabel": "Vinnige blaai-sensitiwiteit", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Mosh-opdrag", - "startupSnippetLabel": "Opstart-brokkie", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Lewendige interval (sekondes)", "maxKeepaliveMisses": "Max Keepalive mis", "tunnelSettings": "Tonnelinstellings", "enableTunneling": "Aktiveer Tonnelbou", "enableTunnelingDesc": "Aktiveer SSH-tonnelfunksionaliteit vir hierdie gasheer", "serverTunnelsSection": "Bedienertonnels", - "addTunnelBtn": "Voeg tonnel by", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Geen tonnels gekonfigureer nie.", - "tunnelLabel": "Tonnel {{number}}", - "tunnelType": "Tonnel Tipe", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Stuur 'n plaaslike poort aan na 'n poort op die afstandbediener (of 'n gasheer wat daarvandaan bereik kan word).", "tunnelModeRemoteDesc": "Stuur 'n poort op die afgeleë bediener terug na 'n plaaslike poort op jou masjien.", "tunnelModeDynamicDesc": "Skep 'n SOCKS5-instaanbediener op 'n plaaslike poort vir dinamiese poortaanstuuring.", "sameHost": "Hierdie gasheer (direkte tonnel)", "endpointHost": "Eindpuntgasheer", - "endpointPort": "Eindpuntpoort", + "endpointPort": "Endpoint Port", "bindHost": "Bind gasheer", - "sourcePort": "Bronpoort", - "maxRetries": "Maksimum herprobeer", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Herprobeerinterval (s)", "autoStartLabel": "Outomatiese begin", "autoStartDesc": "Koppel outomaties hierdie tonnel wanneer die gasheer gelaai is", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Kon nie koppel nie", "failedToDisconnectTunnel": "Kon nie ontkoppel nie", "dockerIntegration": "Docker-integrasie", - "enableDockerMonitor": "Aktiveer Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Monitor en bestuur houers op hierdie gasheer via Docker", - "enableFileManagerMonitor": "Aktiveer Lêerbestuurder", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Blaai deur en bestuur lêers op hierdie gasheer via SFTP", - "defaultPathLabel": "Standaardpad", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "Die gids om oop te maak wanneer die lêerbestuurder vir hierdie gasheer begin.", - "statusChecksLabel": "Statuskontroles", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Aktiveer statuskontroles", "enableStatusChecksDesc": "Ping hierdie gasheer gereeld om beskikbaarheid te verifieer", "useGlobalInterval": "Gebruik globale interval", "useGlobalIntervalDesc": "Oorskryf met die bedienerwye statuskontrole-interval", "checkIntervalS": "Kontrole-interval (s)", "checkIntervalDesc": "Sekondes tussen elke konnektiwiteitsping", - "metricsCollectionLabel": "Metrieke-versameling", - "enableMetricsLabel": "Aktiveer Metrieke", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Versamel SVE-, RAM-, skyf- en netwerkgebruik van hierdie gasheer", "useGlobalMetrics": "Gebruik globale interval", "useGlobalMetricsDesc": "Oorskryf met die bedienerwye metrieke-interval", "metricsIntervalS": "Metrieke Interval (s)", "metricsIntervalDesc2": "Sekondes tussen metrieke momentopnames", "visibleWidgets": "Sigbare Widgets", - "cpuUsageLabel": "SVE-gebruik", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "SVE-persentasie, laaigemiddeldes, vonklyngrafiek", - "memoryLabel": "Geheuegebruik", + "memoryLabel": "Memory Usage", "memoryDesc": "RAM-gebruik, ruil, kasgeheue", - "storageLabel": "Skyfgebruik", + "storageLabel": "Disk Usage", "storageDesc": "Skyfgebruik per monteerpunt", - "networkLabel": "Netwerkkoppelvlakke", + "networkLabel": "Network Interfaces", "networkDesc": "Koppelvlaklys en bandwydte", - "uptimeLabel": "Optyd", + "uptimeLabel": "Uptime", "uptimeDesc": "Stelsel-opstarttyd en opstarttyd", "systemInfoLabel": "Stelselinligting", "systemInfoDesc": "OS, kern, gasheernaam, argitektuur", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Suksesvolle en mislukte aanmeldgebeurtenisse", "topProcessesLabel": "Topprosesse", "topProcessesDesc": "PID, SVE%, MEM%, opdrag", - "listeningPortsLabel": "Luisterpoorte", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Maak poorte oop met proses en toestand", "firewallLabel": "Firewall", "firewallDesc": "Firewall, AppArmor, SELinux status", - "quickActionsLabel": "Vinnige Aksies", - "quickActionsToolbar": "Vinnige aksies verskyn as knoppies in die Bedienerstatistieke-nutsbalk vir die uitvoering van opdragte met een klik.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Geen vinnige aksies nog nie.", "buttonLabel": "Knoppie-etiket", "selectSnippetPlaceholder": "Kies uittreksel...", "addActionBtn": "Voeg Aksie by", "hostSharedSuccessfully": "Gasheer suksesvol gedeel", - "failedToShareHost": "Kon nie gasheer deel nie", + "failedToShareHost": "Failed to share host", "accessRevoked": "Toegang herroep", - "failedToRevokeAccess": "Kon nie toegang herroep nie", - "cancelBtn": "Kanselleer", - "savingBtn": "Stoor...", - "addHostBtn": "Voeg gasheer by", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Gasheer opgedateer", "hostCreated": "Gasheer geskep", "failedToSave": "Kon nie gasheer stoor nie", "credentialUpdated": "Geloofsbrief opgedateer", "credentialCreated": "Geloofsbrief geskep", - "failedToSaveCredential": "Kon nie geloofsbriewe stoor nie", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Terug na gashere", "backToCredentials": "Terug na geloofsbriewe", - "pinned": "Vasgepen", - "noHostsFound": "Geen gashere gevind nie", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Probeer 'n ander term", "addFirstHost": "Voeg jou eerste gasheer by om te begin", "noCredentialsFound": "Geen geloofsbriewe gevind nie", - "addCredentialBtn": "Voeg geloofsbriewe by", - "updateCredentialBtn": "Opdatering van geloofsbriewe", - "features": "Kenmerke", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Geen vouer nie)", - "deleteSelected": "Vee uit", + "deleteSelected": "Delete", "exitSelection": "Verlaat seleksie", - "importSkip": "Invoer (slaan bestaande oor)", + "importSkip": "Import (skip existing)", "importOverwrite": "Invoer (oorskryf)", "collapseBtn": "Ineenstorting", "importExportBtn": "Invoer / Uitvoer", "hostStatusesRefreshed": "Gasheerstatusse is verfris", "failedToRefreshHosts": "Kon nie gashere verfris nie", - "movedHostTo": "Geskuif {{host}} na \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Kon nie gasheer skuif nie", - "folderRenamedTo": "Vouer hernoem na \"{{name}}\"", - "deletedFolder": "Verwyderde vouer \"{{name}}\"", - "failedToDeleteFolder": "Kon nie vouer uitvee nie", - "deleteAllInFolder": "Vee alle gashere in \"{{name}}\" uit? Dit kan nie ongedaan gemaak word nie.", - "deletedHost": "Verwyder {{name}}", - "copiedToClipboard": "Na knipbord gekopieer", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Wysig vouer", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Wysig vouer", + "deleteFolder": "Vee vouer uit", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Kon nie gashere skuif nie", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "Terminaal-URL gekopieer", "fileManagerUrlCopied": "Lêerbestuurder-URL gekopieer", "tunnelUrlCopied": "Tonnel-URL gekopieer", "dockerUrlCopied": "Docker-URL gekopieer", - "serverStatsUrlCopied": "Bedienerstatistieke-URL gekopieer", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP-URL gekopieer", "vncUrlCopied": "VNC URL gekopieer", "telnetUrlCopied": "Telnet-URL gekopieer", @@ -471,109 +633,112 @@ "expandActions": "Vou aksies uit", "collapseActions": "Vou aksies in", "wakeOnLanAction": "Wakker word op LAN", - "wakeOnLanSuccess": "Magiese pakkie gestuur na {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Kon nie magiese pakkie stuur nie", - "cloneHostAction": "Kloon gasheer", + "cloneHostAction": "Clone Host", "copyAddress": "Kopieer Adres", "copyLink": "Kopieer skakel", - "copyTerminalUrlAction": "Kopieer terminaal-URL", - "copyFileManagerUrlAction": "Kopieer Lêerbestuurder URL", - "copyTunnelUrlAction": "Kopieer Tonnel URL", - "copyDockerUrlAction": "Kopieer Docker URL", - "copyServerStatsUrlAction": "Kopieer bedienerstatistieke-URL", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "Kopieer RDP-URL", "copyVncUrlAction": "Kopieer VNC URL", "copyTelnetUrlAction": "Kopieer Telnet-URL", - "copyRemoteDesktopUrlAction": "Kopieer Afstandslessenaar URL", - "deleteCredentialConfirm": "Vee geloofsbriewe \"{{name}} \" uit?", - "deletedCredential": "Verwyder {{name}}", - "deploySSHKeyTitle": "Implementeer SSH-sleutel", - "deployingBtn": "Implementeer tans...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Ontplooi", "failedToDeployKey": "Kon nie sleutel ontplooi nie", - "deleteHostsConfirm": "Vee {{count}} gasheer{{plural}}uit? Dit kan nie ongedaan gemaak word nie.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Na wortel geskuif", - "failedToMoveHosts": "Kon nie gashere skuif nie", - "enableTerminalFeature": "Aktiveer Terminaal", - "disableTerminalFeature": "Deaktiveer terminaal", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Aktiveer lêers", "disableFilesFeature": "Deaktiveer lêers", "enableTunnelsFeature": "Aktiveer tonnels", "disableTunnelsFeature": "Deaktiveer tonnels", - "enableDockerFeature": "Aktiveer Docker", - "disableDockerFeature": "Deaktiveer Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Voeg etikette by...", "authDetails": "Verifikasiebesonderhede", - "credType": "Tipe", + "credType": "Type", "generateKeyPairDesc": "Genereer 'n nuwe sleutelpaar, beide private en publieke sleutels sal outomaties ingevul word.", "generatingKey": "Genereer tans...", - "generateLabel": "Genereer {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Laai lêer op", "keyPassphraseOptional": "Sleutelwagwoordfrase (Opsioneel)", "sshPublicKeyOptional": "SSH Publieke Sleutel (Opsioneel)", "publicKeyGenerated": "Publieke sleutel gegenereer", "failedToGeneratePublicKey": "Kon nie publieke sleutel aflei nie", "publicKeyCopied": "Publieke sleutel gekopieer", - "keyPairGenerated": "{{label}} sleutelpaar gegenereer", - "failedToGenerateKeyPair": "Kon nie sleutelpaar genereer nie", - "searchHostsPlaceholder": "Soek gashere, adresse, etikette…", - "searchCredentialsPlaceholder": "Soekbesonderhede…", - "refreshBtn": "Verfris", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Voeg etikette by...", - "deleteConfirmBtn": "Vee uit", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "Die SSH-bediener moet GatewayPorts ja, AllowTcpForwarding ja, en PermitRootLogin ja gestel hê in /etc/ssh/sshd_config.", - "deleteHostConfirm": "Vee \"{{name}} \" uit?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Aktiveer ten minste een protokol hierbo om verifikasie- en verbindingsinstellings te konfigureer.", - "keyPassphrase": "Sleutelwagwoordfrase", - "connectBtn": "Verbind", - "disconnectBtn": "Ontkoppel", - "basicInformation": "Basiese Inligting", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Verifikasiebesonderhede", - "credTypeLabel": "Tipe", - "hostsTab": "Gashere", - "credentialsTab": "Geloofsbriewe", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Kies veelvuldige", "selectHosts": "Kies gashere", - "connectionLabel": "Verbinding", - "authenticationLabel": "Verifikasie", - "generateKeyPairTitle": "Genereer sleutelpaar", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Genereer 'n nuwe sleutelpaar, beide private en publieke sleutels sal outomaties ingevul word.", - "generateFromPrivateKey": "Genereer vanaf Privaat Sleutel", - "refreshBtn2": "Verfris", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Verlaat seleksie", "exportAll": "Voer alles uit", - "addHostBtn2": "Voeg gasheer by", - "addCredentialBtn2": "Voeg geloofsbriewe by", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Kontroleer gasheerstatusse...", - "pinnedSection": "Vasgepen", + "pinnedSection": "Pinned", "hostsExported": "Gashere suksesvol uitgevoer", "exportFailed": "Kon nie gashere uitvoer nie", "sampleDownloaded": "Voorbeeldlêer afgelaai", - "failedToDeleteCredential2": "Kon nie geloofsbriewe verwyder nie", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Geen vouer nie)", - "nSelected": "{{count}} gekies", - "featuresMenu": "Kenmerke", - "moveMenu": "Beweeg", - "cancelSelection": "Kanselleer", - "deployDialogDesc": "Ontplooi {{name}} na 'n gasheer se authorized_keys.", - "targetHostLabel": "Teikengasheer", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Kies 'n gasheer...", "keyDeployedSuccess": "Sleutel suksesvol ontplooi", "failedToDeployKey2": "Kon nie sleutel ontplooi nie", - "deletedCount": "Verwyderde {{count}} gashere", - "failedToDeleteCount": "Kon nie {{count}} gashere verwyder nie", - "duplicatedHost": "Gedupliseerde \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Kon nie gasheer dupliseer nie", - "updatedCount": "Opgedateerde {{count}} gashere", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Vriendelike Naam", - "descriptionLabel": "Beskrywing", + "descriptionLabel": "Description", "loadingHost": "Laai gasheer...", - "loadingHosts": "Laai gashere...", - "loadingCredentials": "Laai aanmeldbewyse...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Geen gashere nog nie", - "noHostsMatchSearch": "Geen gashere stem ooreen met jou soektog nie", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Gasheer nie gevind nie", - "searchHosts": "Soek gashere...", + "searchHosts": "Search hosts...", "sortHosts": "Sorteer gashere", "sortDefault": "Standaardbestelling", "sortNameAsc": "Naam (A → Z)", @@ -586,83 +751,96 @@ "filterHosts": "Filter gashere", "filterClearAll": "Vee filters uit", "filterStatusGroup": "Status", - "filterOnline": "Aanlyn", - "filterOffline": "Vanlyn", - "filterPinned": "Vasgepen", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "Magtigingsoort", - "filterAuthPassword": "Wagwoord", - "filterAuthKey": "SSH-sleutel", - "filterAuthCredential": "Geloofsbrief", - "filterAuthNone": "Geen", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "Protokol", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "Kenmerke", - "filterFeatureTerminal": "Terminaal", - "filterFeatureFileManager": "Lêerbestuurder", - "filterFeatureTunnel": "Tonnel", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", - "filterTagsGroup": "Etikette", - "shareHost": "Deel gasheer", - "shareHostTitle": "Deel: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Hierdie gasheer moet 'n geloofsbrief gebruik om deling te aktiveer. Wysig die gasheer en ken eers 'n geloofsbrief toe." }, "guac": { - "connection": "Verbinding", - "authentication": "Verifikasie", - "connectionSettings": "Verbindingsinstellings", - "displaySettings": "Skerminstellings", - "audioSettings": "Oudio-instellings", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Gestoorde geloofsbriewe", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Magtigingsmetode", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Kies 'n geloofsbrief...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "RDP-prestasie", - "deviceRedirection": "Toestelherleiding", - "session": "Sessie", - "gateway": "Poort", - "remoteApp": "Afstandsprogram", - "clipboard": "Klembord", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "Sessie-opname", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC-instellings", - "terminalSettings": "Terminaalinstellings", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "RDP-poort", - "username": "Gebruikersnaam", - "password": "Wagwoord", - "domain": "Domein", - "securityMode": "Sekuriteitsmodus", - "colorDepth": "Kleurdiepte", - "width": "Breedte", - "height": "Hoogte", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Vergrootingsmetode", - "clientName": "Kliëntnaam", - "initialProgram": "Aanvanklike Program", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Bedieneruitleg", - "timezone": "Tydsone", - "gatewayHostname": "Gateway-gasheernaam", - "gatewayPort": "Poortpoort", - "gatewayUsername": "Gateway-gebruikersnaam", - "gatewayPassword": "Gateway-wagwoord", - "gatewayDomain": "Gateway-domein", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "RemoteApp-program", "workingDirectory": "Werkgids", "arguments": "Argumente", "normalizeLineEndings": "Normaliseer Lyn Eindigings", - "recordingPath": "Opnamepad", - "recordingName": "Opnamenaam", - "macAddress": "MAC-adres", - "broadcastAddress": "Uitsaaiadres", - "udpPort": "UDP-poort", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Wagtyd (s)", - "driveName": "Skyfnaam", - "drivePath": "Rypad", - "ignoreCertificate": "Ignoreer Sertifikaat", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Laat verbindings na gashere met selfgetekende sertifikate toe", - "forceLossless": "Forseer verliesloos", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Forseer verlieslose beeldkodering (hoër gehalte, meer bandwydte)", - "disableAudio": "Deaktiveer oudio", + "disableAudio": "Disable Audio", "disableAudioDesc": "Demp alle klank van die afstandsessie", "enableAudioInput": "Aktiveer oudio-invoer (mikrofoon)", "enableAudioInputDesc": "Stuur plaaslike mikrofoon na die afgeleë sessie aan", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Aktiveer Aero-glaseffekte", "menuAnimations": "Menu Animasies", "menuAnimationsDesc": "Aktiveer menu-vervaag- en skuifanimasies", - "disableBitmapCaching": "Deaktiveer Bitmap-kasgeheue", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Skakel bitmap-kasgeheue af (kan help met foute)", - "disableOffscreenCaching": "Deaktiveer buiteskerm-kasgeheue", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Skakel buiteskerm-kasgeheue af", - "disableGlyphCaching": "Deaktiveer glifkasgeheue", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Skakel glifkasgeheue af", - "enableGfx": "Aktiveer GFX", + "enableGfx": "Enable GFX", "enableGfxDesc": "Gebruik RemoteFX grafiese pyplyn", - "enablePrinting": "Aktiveer drukwerk", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Herlei plaaslike drukkers na die afgeleë sessie", - "enableDriveRedirection": "Aktiveer dryfherleiding", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Karaktereer 'n plaaslike vouer as 'n skyf in die afstandsessie", - "createDrivePath": "Skep 'n rylaanpad", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Skep die lêer outomaties as dit nie bestaan nie", - "disableDownload": "Deaktiveer aflaai", + "disableDownload": "Disable Download", "disableDownloadDesc": "Voorkom die aflaai van lêers vanaf die afgeleë sessie", - "disableUpload": "Deaktiveer oplaai", + "disableUpload": "Disable Upload", "disableUploadDesc": "Voorkom die oplaai van lêers na die afgeleë sessie", - "enableTouch": "Aktiveer Aanraking", + "enableTouch": "Enable Touch", "enableTouchDesc": "Aktiveer aanstuur van raakinvoer", - "consoleSession": "Konsolesessie", + "consoleSession": "Console Session", "consoleSessionDesc": "Koppel aan die konsole (sessie 0) in plaas van 'n nuwe sessie", "sendWolPacket": "Stuur WOL-pakket", "sendWolPacketDesc": "Stuur 'n magiese pakket om hierdie gasheer wakker te maak voordat jy verbind", - "disableCopy": "Deaktiveer Kopieer", + "disableCopy": "Disable Copy", "disableCopyDesc": "Voorkom die kopiëring van teks vanaf die afgeleë sessie", - "disablePaste": "Deaktiveer plak", + "disablePaste": "Disable Paste", "disablePasteDesc": "Voorkom die plak van teks in die afgeleë sessie", "createPathIfMissing": "Skep pad indien ontbreek", "createPathIfMissingDesc": "Skep outomaties die opnamegids", - "excludeOutput": "Sluit Uitvoer Uit", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Moenie skermuitvoer opneem nie (slegs metadata)", - "excludeMouse": "Sluit Muis uit", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Moenie muisbewegings opneem nie", "includeKeystrokes": "Sluit toetsaanslagen in", "includeKeystrokesDesc": "Neem rou toetsaanslagen op benewens skermuitvoer", @@ -718,102 +896,105 @@ "vncPassword": "VNC-wagwoord", "vncUsernameOptional": "Gebruikersnaam (opsioneel)", "vncLeaveBlank": "Los leeg indien nie nodig nie", - "cursorMode": "Wysermodus", - "swapRedBlue": "Ruil Rooi/Blou", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Ruil die rooi en blou kleurkanale om (maak sommige kleurprobleme reg)", "readOnly": "Leesalleen", "readOnlyDesc": "Bekyk die afstandskerm sonder om enige invoer te stuur", "telnetPort": "Telnet-poort", - "terminalType": "Terminaaltipe", - "fontName": "Lettertipe Naam", - "fontSize": "Lettergrootte", - "colorScheme": "Kleurskema", - "backspaceKey": "Terugspasie-sleutel", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Stoor eers die gasheer.", "sharingOptionsAfterSave": "Deelopsies is beskikbaar nadat die gasheer gestoor is.", "sharingLoadError": "Kon nie deeldata laai nie. Gaan jou verbinding na en probeer weer.", - "shareHostSection": "Deel gasheer", - "shareWithUser": "Deel met Gebruiker", - "shareWithRole": "Deel met Rol", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Kies Gebruiker", - "selectRole": "Kies Rol", + "selectRole": "Select Role", "selectUserOption": "Kies 'n gebruiker...", "selectRoleOption": "Kies 'n rol...", - "permissionLevel": "Toestemmingsvlak", + "permissionLevel": "Permission Level", "expiresInHours": "Verval oor (ure)", "noExpiryPlaceholder": "Los leeg vir geen vervaldatum", - "shareBtn": "Deel", - "currentAccess": "Huidige Toegang", - "typeHeader": "Tipe", - "targetHeader": "Teiken", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "Toestemming", - "grantedByHeader": "Toegeken deur", - "expiresHeader": "Vervaldatum", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Geen toegangsinskrywings nog nie.", - "expiredLabel": "Verstryk", - "neverLabel": "Nooit", - "revokeBtn": "Herroep", - "cancelBtn": "Kanselleer", - "savingBtn": "Stoor...", - "updateHostBtn": "Opdateer gasheer", - "addHostBtn": "Voeg gasheer by" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Soek gashere, opdragte of instellings...", - "quickActions": "Vinnige Aksies", - "hostManager": "Gasheerbestuurder", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Bestuur, voeg by of wysig gashere", "addNewHost": "Voeg nuwe gasheer by", "addNewHostDesc": "Registreer 'n nuwe gasheer", - "adminSettings": "Admin-instellings", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Konfigureer stelselvoorkeure en gebruikers", - "userProfile": "Gebruikersprofiel", + "userProfile": "User Profile", "userProfileDesc": "Bestuur jou rekening en voorkeure", - "addCredential": "Voeg geloofsbriewe by", + "addCredential": "Add Credential", "addCredentialDesc": "Stoor SSH-sleutels of wagwoorde", - "recentActivity": "Onlangse Aktiwiteit", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Bedieners en gashere", - "noHostsFound": "Geen gashere gevind wat ooreenstem met \"{{search}}\"", - "links": "Skakels", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigeer", - "select": "Kies", + "select": "Select", "toggleWith": "Wissel met" }, "splitScreen": { - "paneEmpty": "Ruit {{index}} - leeg", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Geen oortjie toegeken nie", "focusedPane": "Aktiewe paneel" }, "connections": { "noConnections": "Geen verbindings nie", "noConnectionsDesc": "Maak 'n terminaal, lêerbestuurder of afstandlessenaar oop om verbindings hier te sien", - "connectedFor": "Gekoppel vir {{duration}}", - "connected": "Verbonde", - "disconnected": "Ontkoppel", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Maak oortjie toe", "closeConnection": "Maak verbinding toe", "forgetTab": "Vergeet", - "removeBackground": "Verwyder", - "reconnect": "Herkoppel", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Heropen", "sectionOpen": "Oop", "sectionBackground": "Agtergrond", "backgroundDesc": "Sessies duur vir 30 minute na ontkoppeling voort en kan weer gekoppel word.", "persisted": "Het in die agtergrond voortgeduur", - "expiresIn": "Verval oor {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Soek verbindings...", - "noSearchResults": "Geen verbindings stem ooreen met jou soektog nie" + "noSearchResults": "Geen verbindings stem ooreen met jou soektog nie", + "rename": "Rename session" }, "guacamole": { - "connecting": "Verbind met {{type}} sessie...", - "connectionError": "Verbindingsfout", - "connectionFailed": "Verbinding het misluk", - "failedToConnect": "Kon nie verbindingstoken kry nie", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Gasheer nie gevind nie", - "noHostSelected": "Geen gasheer gekies nie", - "reconnect": "Herkoppel", - "retry": "Probeer weer", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "Diens vir afstandwerkskerm (guacd) is nie beskikbaar nie. Maak asseblief seker dat guacd loop, toeganklik is en behoorlik in administrateurinstellings gekonfigureer is.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -822,13 +1003,13 @@ "winKey": "Windows-sleutel", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Skof", + "shift": "Shift", "win": "Wen", - "stickyActive": "{{key}} (vasgeklem - klik om los te maak)", - "stickyInactive": "{{key}} (klik om te sluit)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Ontsnapping", "tab": "Oortjie", - "home": "Tuis", + "home": "Home", "end": "Einde", "pageUp": "Bladsy op", "pageDown": "Bladsy af", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Koppel aan gasheer", - "clear": "Duidelik", - "paste": "Plak", - "reconnect": "Herkoppel", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Verbinding verloor", - "connected": "Verbonde", - "clipboardWriteFailed": "Kon nie na knipbord kopieer nie. Maak seker dat die bladsy oor HTTPS of localhost bedien word.", - "clipboardReadFailed": "Kon nie vanaf knipbord lees nie. Maak seker dat knipbordtoestemmings toegestaan is.", - "clipboardHttpWarning": "Plak vereis HTTPS. Gebruik Ctrl+Shift+V of bedien Termix oor HTTPS.", - "unknownError": "Onbekende fout het voorgekom", - "websocketError": "WebSocket-verbindingsfout", - "connecting": "Verbind...", - "noHostSelected": "Geen gasheer gekies nie", - "reconnecting": "Herverbind... ({{attempt}}/{{max}})", - "reconnected": "Herverbind suksesvol", - "tmuxSessionCreated": "tmux-sessie geskep: {{name}}", - "tmuxSessionAttached": "tmux-sessie aangeheg: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux is nie op die afgeleë gasheer geïnstalleer nie, en val terug na die standaard dop.", "tmuxSessionPickerTitle": "tmux-sessies", "tmuxSessionPickerDesc": "Bestaande tmux-sessies is op hierdie gasheer gevind. Kies een om weer aan te heg of skep 'n nuwe sessie.", - "tmuxWindows": "Vensters", - "tmuxWindowCount": "{{count}} venster", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Aangehegte kliënte", - "tmuxAttachedCount": "{{count}} aangeheg", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Laaste aktiwiteit", "tmuxTimeJustNow": "nou net", - "tmuxTimeMinutes": "{{count}}m gelede", - "tmuxTimeHours": "{{count}}uur gelede", - "tmuxTimeDays": "{{count}}dae gelede", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Begin nuwe sessie", "tmuxCopyHint": "Pas seleksie aan en druk Enter om na knipbord te kopieer", "tmuxDetach": "Ontkoppel van tmux-sessie", "tmuxDetached": "Losgemaak van tmux-sessie", - "maxReconnectAttemptsReached": "Maksimum herverbindingspogings bereik", - "closeTab": "Maak toe", - "connectionTimeout": "Verbindingstydverstryking", - "terminalTitle": "Terminaal - {{host}}", - "terminalWithPath": "Terminaal - {{host}}:{{path}}", - "runTitle": "Hardloop {{command}} - {{host}}", - "totpRequired": "Tweefaktor-verifikasie vereis", - "totpCodeLabel": "Verifikasiekode", - "totpVerify": "Verifieer", - "warpgateAuthRequired": "Warpgate-verifikasie vereis", - "warpgateSecurityKey": "Sekuriteitsleutel", - "warpgateAuthUrl": "Verifikasie-URL", - "warpgateOpenBrowser": "Maak oop in blaaier", - "warpgateContinue": "Ek het verifikasie voltooi", - "opksshAuthRequired": "OPKSSH-verifikasie vereis", - "opksshAuthDescription": "Voltooi verifikasie in jou blaaier om voort te gaan. Hierdie sessie sal vir 24 uur geldig bly.", - "opksshOpenBrowser": "Maak blaaier oop om te verifieer", - "opksshWaitingForAuth": "Wag vir verifikasie in blaaier...", - "opksshAuthenticating": "Verwerk verifikasie...", - "opksshTimeout": "Verifikasie het verstryk. Probeer asseblief weer.", - "opksshAuthFailed": "Verifikasie het misluk. Kontroleer asseblief jou geloofsbriewe en probeer weer.", - "opksshSignInWith": "Teken aan met {{provider}}", - "sudoPasswordPopupTitle": "Wagwoord invoeg?", - "websocketAbnormalClose": "Verbinding het onverwags gesluit. Dit kan wees as gevolg van 'n omgekeerde proxy- of SSL-konfigurasieprobleem. Gaan asseblief bedienerlogboeke na.", - "connectionLogTitle": "Verbindingslogboek", - "connectionLogCopy": "Kopieer logs na knipbord", - "connectionLogEmpty": "Geen verbindingslogboeke nog nie", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Oop", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Wag vir verbindingslogboeke...", - "connectionLogCopied": "Verbindingslogboeke na knipbord gekopieer", - "connectionLogCopyFailed": "Kon nie logs na knipbord kopieer nie", - "connectionRejected": "Verbinding deur bediener verwerp. Kontroleer asseblief u verifikasie en netwerkkonfigurasie.", - "hostKeyRejected": "SSH-gasheersleutelverifikasie verwerp. Verbinding gekanselleer.", - "sessionTakenOver": "Sessie is in 'n ander oortjie oopgemaak. Herverbind tans..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Verdeel oortjie", + "addToSplit": "Voeg by Split", + "removeFromSplit": "Verwyder van Split" + } }, "fileManager": { - "noHostSelected": "Geen gasheer gekies nie", + "noHostSelected": "No host selected", "initializingEditor": "Inisialiseer redigeerder...", - "file": "Lêer", - "folder": "Vouer", - "uploadFile": "Laai lêer op", - "downloadFile": "Laai af", - "extractArchive": "Uittrekselargief", - "extractingArchive": "Onttrek tans {{name}}...", - "archiveExtractedSuccessfully": "{{name}} suksesvol onttrek", - "extractFailed": "Uittreksel het misluk", - "compressFile": "Komprimeer lêer", - "compressFiles": "Komprimeer lêers", - "compressFilesDesc": "Kompresseer {{count}} items in 'n argief", - "archiveName": "Argiefnaam", - "enterArchiveName": "Voer argiefnaam in...", - "compressionFormat": "Kompressieformaat", - "selectedFiles": "Geselekteerde lêers", - "andMoreFiles": "en {{count}} meer...", - "compress": "Kompressie", - "compressingFiles": "Komprimering van {{count}} items in {{name}}...", - "filesCompressedSuccessfully": "{{name}} suksesvol geskep", - "compressFailed": "Kompressie het misluk", - "edit": "Wysig", - "preview": "Voorskou", - "previous": "Vorige", - "next": "Volgende", - "pageXOfY": "Bladsy {{current}} van {{total}}", - "zoomOut": "Uitzoom", - "zoomIn": "Inzoem", - "newFile": "Nuwe Lêer", - "newFolder": "Nuwe vouer", - "rename": "Hernoem", - "uploading": "Laai tans op...", - "uploadingFile": "Laai tans {{name}} op ...", - "fileName": "Lêernaam", - "folderName": "Vouernaam", - "fileUploadedSuccessfully": "Lêer \"{{name}}\" is suksesvol opgelaai", - "failedToUploadFile": "Kon nie lêer oplaai nie", - "fileDownloadedSuccessfully": "Lêer \"{{name}}\" is suksesvol afgelaai", - "failedToDownloadFile": "Kon nie lêer aflaai nie", - "fileCreatedSuccessfully": "Lêer \"{{name}}\" suksesvol geskep", - "folderCreatedSuccessfully": "Lêer \"{{name}}\" suksesvol geskep", - "failedToCreateItem": "Kon nie item skep nie", - "operationFailed": "{{operation}} -bewerking het misluk vir {{name}}: {{error}}", - "failedToResolveSymlink": "Kon nie simskakel oplos nie", - "itemsDeletedSuccessfully": "{{count}} items is suksesvol verwyder", - "failedToDeleteItems": "Kon nie items uitvee nie", - "sudoPasswordRequired": "Administrateurwagwoord benodig", - "enterSudoPassword": "Voer die sudo-wagwoord in om hierdie operasie voort te sit", - "sudoPassword": "Sudo-wagwoord", - "sudoOperationFailed": "Sudo-bewerking het misluk", - "sudoAuthFailed": "Sudo-verifikasie het misluk", - "dragFilesToUpload": "Plaas lêers hier om op te laai", - "emptyFolder": "Hierdie vouer is leeg", - "searchFiles": "Soek lêers...", - "upload": "Oplaai", - "selectHostToStart": "Kies 'n gasheer om lêerbestuur te begin", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "Lêerbestuurder benodig SSH. Hierdie gasheer het nie SSH geaktiveer nie.", - "failedToConnect": "Kon nie aan SSH koppel nie", - "failedToLoadDirectory": "Kon nie gids laai nie", - "noSSHConnection": "Geen SSH-verbinding beskikbaar nie", - "copy": "Kopieer", - "cut": "Sny", - "paste": "Plak", - "copyPath": "Kopieer Pad", - "copyPaths": "Kopieer paaie", - "delete": "Vee uit", - "properties": "Eienskappe", - "refresh": "Verfris", - "downloadFiles": "Laai {{count}} lêers na die blaaier af", - "copyFiles": "Kopieer {{count}} items", - "cutFiles": "Sny {{count}} items", - "deleteFiles": "Vee {{count}} items uit", - "filesCopiedToClipboard": "{{count}} items gekopieer na knipbord", - "filesCutToClipboard": "{{count}} items is na knipbord gesny", - "pathCopiedToClipboard": "Pad gekopieer na knipbord", - "pathsCopiedToClipboard": "{{count}} paaie gekopieer na knipbord", - "failedToCopyPath": "Kon nie pad na knipbord kopieer nie", - "movedItems": "Het {{count}} items geskuif", - "failedToDeleteItem": "Kon nie item verwyder nie", - "itemRenamedSuccessfully": "{{type}} suksesvol hernoem", - "failedToRenameItem": "Kon nie item hernoem nie", - "download": "Laai af", - "permissions": "Toestemmings", - "size": "Grootte", - "modified": "Gewysig", - "path": "Pad", - "confirmDelete": "Is jy seker jy wil {{name}} verwyder?", - "permissionDenied": "Toestemming geweier", - "serverError": "Bedienerfout", - "fileSavedSuccessfully": "Lêer suksesvol gestoor", - "failedToSaveFile": "Kon nie lêer stoor nie", - "confirmDeleteSingleItem": "Is jy seker jy wil \"{{name}} \" permanent verwyder?", - "confirmDeleteMultipleItems": "Is jy seker jy wil {{count}} items permanent verwyder?", - "confirmDeleteMultipleItemsWithFolders": "Is jy seker jy wil {{count}} items permanent verwyder? Dit sluit gidse en hul inhoud in.", - "confirmDeleteFolder": "Is jy seker jy wil die vouer \"{{name}}\" en al sy inhoud permanent verwyder?", - "permanentDeleteWarning": "Hierdie aksie kan nie ongedaan gemaak word nie. Die item(s) sal permanent van die bediener verwyder word.", - "recent": "Onlangs", - "pinned": "Vasgepen", - "folderShortcuts": "Vouerkortpaaie", - "failedToReconnectSSH": "Kon nie SSH-sessie herkoppel nie", - "openTerminalHere": "Maak Terminaal Hier Oop", - "run": "Hardloop", - "openTerminalInFolder": "Maak Terminaal in Hierdie Vouer Oop", - "openTerminalInFileLocation": "Maak Terminaal oop by Lêerligging", - "runningFile": "Hardloop - {{file}}", - "onlyRunExecutableFiles": "Kan slegs uitvoerbare lêers uitvoer", - "directories": "Gidse", - "removedFromRecentFiles": "\"{{name}}\" is uit onlangse lêers verwyder", - "removeFailed": "Verwydering het misluk", - "unpinnedSuccessfully": "\"{{name}}\" suksesvol ontspeld", - "unpinFailed": "Ontspeld het misluk", - "removedShortcut": "Kortpad \"{{name}} \" verwyder", - "removeShortcutFailed": "Verwydering van kortpad het misluk", - "clearedAllRecentFiles": "Alle onlangse lêers is uitgevee", - "clearFailed": "Vee uit misluk", - "removeFromRecentFiles": "Verwyder uit onlangse lêers", - "clearAllRecentFiles": "Vee alle onlangse lêers uit", - "unpinFile": "Ontspeld lêer", - "removeShortcut": "Verwyder kortpad", - "pinFile": "Speld lêer vas", - "addToShortcuts": "Voeg by kortpaaie", - "pasteFailed": "Plak het misluk", - "noUndoableActions": "Geen ongedaanbare aksies nie", - "undoCopySuccess": "Kopieerbewerking ongedaan gemaak: Gekopieerde lêers is verwyder {{count}}", - "undoCopyFailedDelete": "Ongedaan maak het misluk: Kon geen gekopieerde lêers verwyder nie", - "undoCopyFailedNoInfo": "Ongedaan maak het misluk: Kon nie gekopieerde lêerinligting vind nie", - "undoMoveSuccess": "Ongedaan gemaak met skuifbewerking: {{count}} lêers teruggeskuif na oorspronklike ligging", - "undoMoveFailedMove": "Ongedaan maak het misluk: Kon geen lêers terugskuif nie", - "undoMoveFailedNoInfo": "Ongedaan maak het misluk: Kon nie inligting oor die verskuifde lêer vind nie", - "undoDeleteNotSupported": "Verwyderingsbewerking kan nie ongedaan gemaak word nie: Lêers is permanent van die bediener verwyder", - "undoTypeNotSupported": "Nie-ondersteunde ongedaanmaak-bewerkingtipe", - "undoOperationFailed": "Ongedaanmaak-bewerking het misluk", - "unknownError": "Onbekende fout", - "confirm": "Bevestig", - "find": "Vind...", - "replace": "Vervang", - "downloadInstead": "Laai eerder af", - "keyboardShortcuts": "Sleutelbordkortpaaie", - "searchAndReplace": "Soek en vervang", - "editing": "Redigering", - "search": "Soek", - "findNext": "Vind Volgende", - "findPrevious": "Vind Vorige", - "save": "Stoor", - "selectAll": "Kies Alles", - "undo": "Ongedaan maak", - "redo": "Herdoen", - "moveLineUp": "Skuif lyn op", - "moveLineDown": "Skuif lyn af", - "toggleComment": "Wissel kommentaar", - "autoComplete": "Outomatiese Voltooiing", - "imageLoadError": "Kon nie beeld laai nie", - "startTyping": "Begin tik...", - "unknownSize": "Onbekende grootte", - "fileIsEmpty": "Lêer is leeg", - "largeFileWarning": "Waarskuwing oor groot lêers", - "largeFileWarningDesc": "Hierdie lêer is {{size}} groot, wat werkverrigtingsprobleme kan veroorsaak wanneer dit as teks oopgemaak word.", - "fileNotFoundAndRemoved": "Lêer \"{{name}}\" nie gevind nie en is verwyder uit onlangse/vasgespelde lêers", - "failedToLoadFile": "Kon nie lêer laai nie: {{error}}", - "serverErrorOccurred": "Bedienerfout het voorgekom. Probeer asseblief later weer.", - "autoSaveFailed": "Outomatiese stoor het misluk", - "fileAutoSaved": "Lêer outomaties gestoor", - "moveFileFailed": "Kon nie {{name}} skuif nie", - "moveOperationFailed": "Skuifbewerking het misluk", - "canOnlyCompareFiles": "Kan slegs twee lêers vergelyk", - "comparingFiles": "Vergelyk lêers: {{file1}} en {{file2}}", - "dragFailed": "Sleepbewerking het misluk", - "filePinnedSuccessfully": "Lêer \"{{name}}\" suksesvol vasgepen", - "pinFileFailed": "Kon nie lêer vaspen nie", - "fileUnpinnedSuccessfully": "Lêer \"{{name}}\" suksesvol ontspeld", - "unpinFileFailed": "Kon nie lêer ontspeld nie", - "shortcutAddedSuccessfully": "Vouerkortpad \"{{name}}\" suksesvol bygevoeg", - "addShortcutFailed": "Kon nie kortpad byvoeg nie", - "operationCompletedSuccessfully": "{{operation}} {{count}} items suksesvol", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", "operationCompleted": "{{operation}} {{count}} items", - "downloadFileSuccess": "Lêer {{name}} suksesvol afgelaai", - "downloadFileFailed": "Aflaai het misluk", - "moveTo": "Skuif na {{name}}", - "diffCompareWith": "Verskil vergelyking met {{name}}", - "dragOutsideToDownload": "Sleep buite die venster om af te laai ({{count}} lêers)", - "newFolderDefault": "NuweVouer", - "newFileDefault": "NuweLêer.txt", - "successfullyMovedItems": "Suksesvol {{count}} items na {{target}} geskuif", - "move": "Beweeg", - "searchInFile": "Soek in lêer (Ctrl+F)", - "showKeyboardShortcuts": "Wys sleutelbordkortpaaie", - "startWritingMarkdown": "Begin om jou afslaginhoud te skryf...", - "loadingFileComparison": "Laai lêervergelyking...", - "reload": "Herlaai", - "compare": "Vergelyk", - "sideBySide": "Sy aan Sy", - "inline": "Inlyn", - "fileComparison": "Lêervergelyking: {{file1}} vs {{file2}}", - "fileTooLarge": "Lêer te groot: {{error}}", - "sshConnectionFailed": "SSH-verbinding het misluk. Kontroleer asseblief jou verbinding met {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Kon nie lêer laai nie: {{error}}", - "connecting": "Verbind...", - "connectedSuccessfully": "Suksesvol gekoppel", - "totpVerificationFailed": "TOTP-verifikasie het misluk", - "warpgateVerificationFailed": "Warpgate-verifikasie het misluk", - "authenticationFailed": "Verifikasie het misluk", - "verificationCodePrompt": "Verifikasiekode:", - "changePermissions": "Verander Toestemmings", - "currentPermissions": "Huidige Toestemmings", - "owner": "Eienaar", - "group": "Groep", - "others": "Ander", - "read": "Lees", - "write": "Skryf", - "execute": "Voer uit", - "permissionsChangedSuccessfully": "Toestemmings suksesvol verander", - "failedToChangePermissions": "Kon nie toestemmings verander nie", - "name": "Naam", - "sortByName": "Naam", - "sortByDate": "Datum Gewysig", - "sortBySize": "Grootte", - "ascending": "Stygend", - "descending": "Dalend", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Wortel", "new": "Nuut", "sortBy": "Sorteer volgens", @@ -1139,20 +1335,20 @@ "editor": "Redakteur", "octal": "Oktaal", "storage": "Berging", - "disk": "Skyf", - "used": "Gebruik", - "of": "van", - "toggleSidebar": "Wissel sybalk", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "Kan nie PDF laai nie", "pdfLoadError": "Daar was 'n fout tydens die laai van hierdie PDF-lêer.", "loadingPdf": "Laai PDF...", "loadingPage": "Laai bladsy..." }, "transfer": { - "copyToHost": "Kopieer na gasheer…", - "moveToHost": "Skuif na gasheer…", - "copyItemsToHost": "Kopieer {{count}} items om… aan te bied", - "moveItemsToHost": "Skuif {{count}} items om… te huisves", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Geen ander lêerbestuurder-gashere beskikbaar nie.", "noHostsConnectedHint": "Voeg nog 'n SSH-gasheer by met Lêerbestuurder geaktiveer in Gasheerbestuurder.", "selectDestinationHost": "Kies bestemmingsgasheer", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Vou onlangse bestemmings uit", "browseFolders": "Blaai deur bestemmingsmappe", "browseDestination": "Blaai of voer pad in", - "confirmCopy": "Kopieer", - "confirmMove": "Beweeg", - "transferring": "Oordra…", - "compressing": "Kompressering…", - "extracting": "Onttrek…", - "transferringItems": "Oordrag van {{current}} van {{total}} items…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Oordrag voltooi", "transferError": "Oordrag het misluk", - "transferPartial": "Oordrag voltooi met {{count}} foute", - "transferPartialHint": "Kon nie oordra nie: {{paths}}", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", "itemsSummary": "{{count}} items", "destMustBeDirectory": "Bestemming moet 'n gids wees vir oordragte van verskeie items", "selectThisFolder": "Kies hierdie vouer", "browsePathWillBeCreated": "Hierdie vouer bestaan nog nie. Dit sal geskep word wanneer die oordrag begin.", "browsePathError": "Kon nie hierdie pad op die bestemmingsgasheer oopmaak nie.", "goUp": "Gaan op", - "copyFolderToHost": "Kopieer lêergids na gasheer…", - "moveFolderToHost": "Skuif vouer na gasheer…", - "hostReady": "Gereed", - "hostConnecting": "Verbind…", - "hostDisconnected": "Nie gekoppel nie", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Verifikasie vereis — maak eers Lêerbestuurder op hierdie gasheer oop", - "hostConnectionFailed": "Verbinding het misluk", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Oordragtye", - "metricsPrepare": "Berei bestemming voor: {{duration}}", - "metricsCompress": "Kompresseer op bron: {{duration}}", - "metricsHopSourceRead": "Bron → bediener: {{throughput}}", - "metricsHopDestSftpWrite": "Bediener → bestemming (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Bediener → bestemming (plaaslik): {{throughput}}", - "metricsTransfer": "Van begin tot einde: {{throughput}} ({{duration}})", - "metricsExtract": "Uittreksel op bestemming: {{duration}}", - "metricsSourceDelete": "Verwyder van bron: {{duration}}", - "metricsTotal": "Totaal: {{duration}}", - "progressCompressing": "Kompressering op brongasheer…", - "progressExtracting": "Onttrek op bestemming…", - "progressTransferring": "Oordrag van data…", - "progressReconnecting": "Herverbind…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Parallelle oordragbane", - "parallelSegmentsOption": "{{count}} bane", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Groot lêers word in 256 MB-stukke verdeel. Verskeie bane gebruik afsonderlike verbindings (soos om verskeie oordragte te begin) vir hoër totale deurset.", - "progressTotalSpeed": "{{speed}} totaal ({{lanes}} bane)", - "progressTransferringItems": "Oordrag van lêers ({{current}} van {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} lêers", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Bronlêers gehou (gedeeltelike oordrag)", "jumpHostLimitation": "Beide gashere moet vanaf die Termix-bediener bereikbaar wees. Direkte gasheer-tot-gasheer-roetering word nie ondersteun nie.", - "cancel": "Kanselleer", + "cancel": "Cancel", "methodLabel": "Oordragmetode", "methodAuto": "Outomaties", "methodTar": "Teer-argief", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Kies tar- of per-lêer SFTP gebaseer op lêertelling, grootte en saampersbaarheid. Enkele lêers gebruik altyd stroom-SFTP.", "methodTarHint": "Komprimeer op bron, dra een argief oor, onttrek op bestemming. Vereis tar op beide Unix-gashere.", "methodItemSftpHint": "Dra elke lêer individueel oor SFTP. Werk op alle gashere, insluitend Windows.", - "methodPreviewLoading": "Berekening van oordragmetode…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Kon nie oordragmetode voorskou nie. Die bediener sal steeds 'n metode kies wanneer jy begin.", "methodPreviewWillUseTar": "Sal gebruik: Tar-argief", "methodPreviewWillUseItemSftp": "Sal gebruik: SFTP per lêer", - "methodPreviewScanSummary": "{{fileCount}} lêers, {{totalSize}} totaal (geskandeer op brongasheer).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Elke lêer gebruik dieselfde SFTP-stroom as 'n enkellêerkopie, een na die ander. Vordering word oor alle lêers gekombineer, so die balk beweeg stadig tydens groot lêers.", "methodReason": { "user_item_sftp": "Jy het SFTP per lêer gekies.", "user_tar": "Jy het teer-argief gekies.", "tar_unavailable": "Teer is nie beskikbaar op een of albei gashere nie — SFTP per lêer sal eerder gebruik word.", "windows_host": "'n Windows-gasheer is betrokke — teer word nie gebruik nie.", - "auto_multi_large": "Outomaties: veelvuldige lêers, insluitend 'n groot lêer ({{largestSize}}) met saampersbare data — teer bundels in een oordrag.", - "auto_single_large_in_archive": "Outomaties: een groot lêer ({{largestSize}}) in hierdie stel — SFTP per lêer.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Outomaties: meestal onsaampersbare data — SFTP per lêer.", - "auto_many_files": "Outomaties: baie lêers ({{fileCount}}) — teer verminder oorhoofse koste per lêer.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Outomaties: SFTP per lêer vir hierdie stel." }, - "progressCancel": "Kanselleer", - "progressCancelling": "Kanselleer…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Vasgevang", "resumedHint": "Herverbind met 'n aktiewe oordrag wat in 'n ander venster begin is.", "transferCancelled": "Oordrag gekanselleer", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Sommige gedeeltelike lêers kon nie verwyder word nie", "cleanupDestFilesNothing": "Niks om op die bestemming skoon te maak nie", "cleanupDestFilesError": "Opruiming het misluk", - "retryTransfer": "Probeer weer", + "retryTransfer": "Retry", "retryTransferError": "Herprobeer het misluk", "transferFailedRetryHint": "Gedeeltelike data is op die bestemming gehou. Herprobeer sal hervat word wanneer die verbinding terug is." }, "tunnels": { - "noSshTunnels": "Geen SSH-tonnels nie", - "createFirstTunnelMessage": "Jy het nog geen SSH-tonnels geskep nie. Konfigureer tonnelverbindings in die Gasheerbestuurder om te begin.", - "connected": "Verbonde", - "disconnected": "Ontkoppel", - "connecting": "Verbind...", - "error": "Fout", - "canceling": "Kanselleer tans...", - "connect": "Verbind", - "disconnect": "Ontkoppel", - "cancel": "Kanselleer", - "port": "Hawe", - "localPort": "Plaaslike Hawe", - "remotePort": "Afstandpoort", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Huidige gasheerpoort", - "endpointPort": "Eindpuntpoort", + "endpointPort": "Endpoint Port", "bindIp": "Plaaslike IP", - "endpointSshConfig": "Eindpunt SSH-konfigurasie", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Eindpunt SSH-gasheer", "endpointSshHostPlaceholder": "Kies 'n gekonfigureerde gasheer", "endpointSshHostRequired": "Kies 'n eindpunt SSH-gasheer vir elke kliënttunnel.", - "attempt": "Poging {{current}} van {{max}}", - "nextRetryIn": "Volgende herprobeer oor {{seconds}} sekondes", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Kliënttonnels", "clientTunnel": "Kliënttonnel", "addClientTunnel": "Voeg kliënttonnel by", "noClientTunnels": "Geen kliënttunnels is op hierdie lessenaar gekonfigureer nie.", - "tunnelName": "Tonnelnaam", - "remoteHost": "Afstandgasheer", - "autoStart": "Outomatiese Begin", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Begin wanneer hierdie rekenaarkliënt oopmaak en gekoppel bly.", "clientManualStartDesc": "Gebruik Begin en Stop vanaf hierdie ry. Termix sal dit nie outomaties oopmaak nie.", "clientRemoteServerNote": "Afstandsaanstuuring mag AllowTcpForwarding en GatewayPorts op die eindpunt SSH-bediener vereis. Die afstandspoort sluit wanneer hierdie lessenaar ontkoppel.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "Afstandpoort moet tussen 1 en 65535 wees.", "invalidLocalTargetPort": "Die plaaslike teikenpoort moet tussen 1 en 65535 wees.", "invalidEndpointPort": "Eindpuntpoort moet tussen 1 en 65535 wees.", - "duplicateAutoStartBind": "Slegs een outomatiese begin-kliënttonnel kan {{bind}} gebruik.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Kon nie tonnelstatus opdateer nie.", - "active": "Aktief", - "start": "Begin", + "active": "Active", + "start": "Start", "stop": "Stop", - "test": "Toets", - "type": "Tonnel Tipe", - "typeLocal": "Plaaslik (-L)", - "typeRemote": "Afstandbeheer (-R)", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Dinamiese (-D)", "typeServerLocalDesc": "Huidige gasheer na eindpunt.", "typeServerRemoteDesc": "Eindpunt terug na huidige gasheer.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Eindpunt terug na plaaslike rekenaar.", "typeClientDynamicDesc": "SOKKE op plaaslike rekenaar.", "typeDynamicDesc": "Stuur SOCKS5 CONNECT-verkeer deur SSH aan", - "forwardDescriptionServerLocal": "Huidige gasheer {{sourcePort}} → eindpunt {{endpointPort}}.", - "forwardDescriptionServerRemote": "Eindpunt {{endpointPort}} → huidige gasheer {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS op huidige gasheer {{sourcePort}}.", - "forwardDescriptionClientLocal": "Plaaslik {{sourcePort}} → afgeleë {{endpointPort}}.", - "forwardDescriptionClientRemote": "Afstand {{sourcePort}} → plaaslik {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS op plaaslike poort {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOKKIES via {{endpoint}}", - "autoNameClientLocal": "Plaaslik {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → plaaslik {{localPort}}", - "autoNameClientDynamic": "SOKKIES {{localPort}} via {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Roete:", "lastStarted": "Laas begin", "lastTested": "Laas getoets", "lastError": "Laaste fout", - "maxRetries": "Maksimum herprobeer", + "maxRetries": "Max Retries", "maxRetriesDescription": "Maksimum aantal herprobeerpogings.", - "retryInterval": "Herprobeerinterval (sekondes)", - "retryIntervalDescription": "Tyd om te wag tussen herpogings.", - "local": "Plaaslik", - "remote": "Afstandsbediening", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Bestemming", "host": "Gasheer", "mode": "Modus", - "noHostSelected": "Geen gasheer gekies nie", + "noHostSelected": "No host selected", "working": "Werk..." }, - "serverStats": { - "cpu": "SVE", - "memory": "Geheue", - "disk": "Skyf", - "network": "Netwerk", - "uptime": "Optyd", - "processes": "Prosesse", - "available": "Beskikbaar", - "free": "Gratis", - "connecting": "Verbind...", - "connectionFailed": "Kon nie aan bediener koppel nie", - "naCpus": "N/A SVE(s)", - "cpuCores_one": "{{count}} Kern", - "cpuCores_other": "{{count}} Kerne", - "cpuUsage": "SVE-gebruik", - "memoryUsage": "Geheuegebruik", - "diskUsage": "Skyfgebruik", - "failedToFetchHostConfig": "Kon nie gasheerkonfigurasie haal nie", - "serverOffline": "Bediener vanlyn", - "cannotFetchMetrics": "Kan nie statistieke van vanlyn bediener haal nie", - "totpFailed": "TOTP-verifikasie het misluk", - "noneAuthNotSupported": "Bedienerstatistieke ondersteun nie die 'geen'-verifikasietipe nie.", - "load": "Laai", - "systemInfo": "Stelselinligting", - "hostname": "Gasheernaam", - "operatingSystem": "Bedryfstelsel", - "kernel": "Kern", - "seconds": "sekondes", - "networkInterfaces": "Netwerkkoppelvlakke", - "noInterfacesFound": "Geen netwerkkoppelvlakke gevind nie", - "noProcessesFound": "Geen prosesse gevind nie", - "loginStats": "SSH-aanmeldingstatistieke", - "noRecentLoginData": "Geen onlangse aanmelddata nie", - "executingQuickAction": "Voer tans {{name}} uit ...", - "quickActionSuccess": "{{name}} suksesvol voltooi", - "quickActionFailed": "{{name}} het misluk", - "quickActionError": "Kon nie {{name}} uitvoer nie", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Luisterpoorte", - "protocol": "Protokol", - "port": "Hawe", - "address": "Adres", - "process": "Proses", - "noData": "Geen luisterpoorte data nie" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Alles", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Onaktief", - "policy": "Beleid", - "rules": "reëls", - "noData": "Geen firewalldata beskikbaar nie", - "action": "Aksie", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Hawe", - "source": "Bron", - "anywhere": "Enige plek" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Laai Gem.", "swap": "Ruil", "architecture": "Argitektuur", - "refresh": "Verfris", - "retry": "Probeer weer" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Werk...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Self-gehoste SSH en afstandrekenaarbestuur", - "loginTitle": "Teken aan by Termix", - "registerTitle": "Skep Rekening", - "forgotPassword": "Wagwoord vergeet?", - "rememberMe": "Onthou toestel vir 30 dae (sluit TOTP in)", - "noAccount": "Het jy nie 'n rekening nie?", - "hasAccount": "Het jy reeds 'n rekening?", - "twoFactorAuth": "Twee-faktor-verifikasie", - "enterCode": "Voer verifikasiekode in", - "backupCode": "Of gebruik rugsteunkode", - "verifyCode": "Verifieer Kode", - "redirectingToApp": "Herlei na toepassing...", - "sshAuthenticationRequired": "SSH-verifikasie vereis", - "sshNoKeyboardInteractive": "Sleutelbord-interaktiewe verifikasie nie beskikbaar nie", - "sshAuthenticationFailed": "Verifikasie het misluk", - "sshAuthenticationTimeout": "Verifikasie-tydverstryking", - "sshNoKeyboardInteractiveDescription": "Die bediener ondersteun nie sleutelbord-interaktiewe verifikasie nie. Verskaf asseblief u wagwoord of SSH-sleutel.", - "sshAuthFailedDescription": "Die verskafde aanmeldbesonderhede was verkeerd. Probeer asseblief weer met geldige aanmeldbesonderhede.", - "sshTimeoutDescription": "Die verifikasiepoging het verstryk. Probeer asseblief weer.", - "sshProvideCredentialsDescription": "Verskaf asseblief u SSH-besonderhede om aan hierdie bediener te koppel.", - "sshPasswordDescription": "Voer die wagwoord vir hierdie SSH-verbinding in.", - "sshKeyPasswordDescription": "As jou SSH-sleutel geïnkripteer is, voer die wagwoordfrase hier in.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Wagwoord vereis", "passphraseRequiredDescription": "Die SSH-sleutel is geïnkripteer. Voer asseblief die wagwoordfrase in om dit te ontsluit.", - "back": "Terug", - "firstUser": "Eerste Gebruiker", - "firstUserMessage": "Jy is die eerste gebruiker en sal 'n administrateur gemaak word. Jy kan administrateurinstellings in die kantbalk se gebruikersaftreklys sien. As jy dink dit is 'n fout, kyk na die docker-logboeke of skep 'n GitHub-probleem.", - "external": "Eksterne", - "loginWithExternal": "Teken aan met eksterne verskaffer", - "loginWithExternalDesc": "Meld aan met jou gekonfigureerde eksterne identiteitsverskaffer", - "externalNotSupportedInElectron": "Eksterne verifikasie word nog nie in die Electron-app ondersteun nie. Gebruik asseblief die webweergawe vir OIDC-aanmelding.", - "resetPasswordButton": "Herstel wagwoord", - "sendResetCode": "Stuur Herstelkode", - "resetCodeDesc": "Voer jou gebruikersnaam in om 'n wagwoordherstelkode te ontvang. Die kode sal in die docker-houerlogboeke aangeteken word.", - "resetCode": "Herstel kode", - "verifyCodeButton": "Verifieer Kode", - "enterResetCode": "Voer die 6-syfer-kode van die docker-houerlogboeke vir die gebruiker in:", - "newPassword": "Nuwe Wagwoord", - "confirmNewPassword": "Bevestig wagwoord", - "enterNewPassword": "Voer jou nuwe wagwoord vir die gebruiker in:", - "signUp": "Registreer", - "desktopApp": "Rekenaartoepassing", - "loggingInToDesktopApp": "Aanmelding by die lessenaar-app", - "loadingServer": "Laai bediener...", - "dataLossWarning": "As jy jou wagwoord op hierdie manier terugstel, sal al jou gestoorde SSH-gashere, geloofsbriewe en ander geïnkripteerde data uitgevee word. Hierdie aksie kan nie ongedaan gemaak word nie. Gebruik dit slegs as jy jou wagwoord vergeet het en nie aangemeld is nie.", - "authenticationDisabled": "Verifikasie gedeaktiveer", - "authenticationDisabledDesc": "Alle verifikasiemetodes is tans gedeaktiveer. Kontak asseblief u administrateur.", - "attemptsRemaining": "{{count}} pogings oor" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifieer SSH-gasheersleutel", - "keyChangedWarning": "SSH-gasheersleutel verander", - "firstConnectionTitle": "Eerste keer dat jy met hierdie gasheer verbind", - "firstConnectionDescription": "Die egtheid van hierdie gasheer kan nie vasgestel word nie. Verifieer dat die vingerafdruk ooreenstem met wat jy verwag.", - "keyChangedDescription": "Die gasheersleutel vir hierdie bediener het verander sedert jou laaste verbinding. Dit kan op 'n sekuriteitsprobleem dui.", - "previousKey": "Vorige Sleutel", - "newFingerprint": "Nuwe vingerafdruk", - "fingerprint": "Vingerafdruk", - "verifyInstructions": "As jy hierdie gasheer vertrou, klik Aanvaar om voort te gaan en hierdie vingerafdruk vir toekomstige verbindings te stoor.", - "securityWarning": "Sekuriteitswaarskuwing", - "acceptAndContinue": "Aanvaar en Gaan voort", - "acceptNewKey": "Aanvaar Nuwe Sleutel & Gaan Voort" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Kon nie aan die databasis koppel nie", - "unknownError": "Onbekende fout", - "loginFailed": "Aanmelding het misluk", - "failedPasswordReset": "Kon nie wagwoordherstel begin nie", - "failedVerifyCode": "Kon nie die terugstelkode verifieer nie", - "failedCompleteReset": "Kon nie wagwoordterugstelling voltooi nie", - "invalidTotpCode": "Ongeldige TOTP-kode", - "failedOidcLogin": "Kon nie OIDC-aanmelding begin nie", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Stille aanmelding is versoek, maar OIDC-aanmelding is nie beskikbaar nie.", "failedUserInfo": "Kon nie gebruikersinligting kry na aanmelding nie", - "oidcAuthFailed": "OIDC-verifikasie het misluk", - "invalidAuthUrl": "Ongeldige magtigings-URL ontvang van backend", - "requiredField": "Hierdie veld is verpligtend", - "minLength": "Minimum lengte is {{min}}", - "passwordMismatch": "Wagwoorde stem nie ooreen nie", - "passwordLoginDisabled": "Gebruikersnaam/wagwoord-aanmelding is tans gedeaktiveer", - "sessionExpired": "Sessie het verstryk - meld asseblief weer aan", - "totpRateLimited": "Tempo beperk: Te veel TOTP-verifikasiepogings. Probeer asseblief later weer.", - "totpRateLimitedWithTime": "Tempo beperk: Te veel TOTP-verifikasiepogings. Wag asseblief {{time}} sekondes voordat u weer probeer.", - "resetCodeRateLimited": "Tempo beperk: Te veel verifikasiepogings. Probeer asseblief later weer.", - "resetCodeRateLimitedWithTime": "Tempo beperk: Te veel verifikasiepogings. Wag asseblief {{time}} sekondes voordat u weer probeer.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Kon nie verifikasietoken stoor nie", "failedToLoadServer": "Kon nie bediener laai nie" }, "messages": { - "registrationDisabled": "Nuwe rekeningregistrasie is tans deur 'n administrateur gedeaktiveer. Meld asseblief aan of kontak 'n administrateur.", - "userNotAllowed": "Jou rekening is nie gemagtig om te registreer nie. Kontak asseblief 'n administrateur.", - "databaseConnectionFailed": "Kon nie aan die databasisbediener koppel nie", - "resetCodeSent": "Herstel kode gestuur na Docker-logboeke", - "codeVerified": "Kode suksesvol geverifieer", - "passwordResetSuccess": "Wagwoord herstel suksesvol", - "loginSuccess": "Aanmelding suksesvol", - "registrationSuccess": "Registrasie suksesvol" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Plaaslike lessenaartunnels wat op gekonfigureerde SSH-gashere fokus.", "c2sTunnelPresets": "Kliënttonnelvoorinstellings", "c2sTunnelPresetsDesc": "Stoor hierdie lessenaarkliënt se plaaslike tonnellys as 'n benoemde bedienervoorinstelling, of laai 'n voorinstelling terug in hierdie kliënt.", "c2sTunnelPresetsUnavailable": "Kliënttunnelvoorinstellings is slegs beskikbaar in die rekenaarkliënt.", - "c2sPresetName": "Voorafingestelde Naam", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Kliëntvooringestelde naam", "c2sPresetToLoad": "Voorafinstelling om te laai", "c2sNoPresetSelected": "Geen voorafinstelling gekies nie", "c2sNoPresets": "Geen voorinstellings gestoor nie", - "c2sLoadPreset": "Laai", - "c2sCurrentLocalConfig": "{{count}} plaaslike kliënttonnel(s) gekonfigureer op hierdie lessenaar.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Voorinstellings is eksplisiete kiekies; die laai van een vervang hierdie lessenaarkliënt se plaaslike kliënttonnellys.", "c2sPresetSaved": "Kliënttonnelvoorinstelling gestoor", "c2sPresetLoaded": "Kliënttonnelvoorinstelling plaaslik gelaai", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Taal", - "keyPassword": "sleutelwagwoord", - "pastePrivateKey": "Plak jou privaat sleutel hier...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (luister plaaslik)", "localTargetHost": "127.0.0.1 (teiken op hierdie rekenaar)", "socksListenerHost": "127.0.0.1 (SOCKS-luisteraar)", - "enterPassword": "Voer jou wagwoord in", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { "title": "Dashboard", - "loading": "Laai paneelbord...", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Ondersteuning", - "discord": "Disharmonie", - "serverOverview": "Bediener Oorsig", - "version": "Weergawe", - "upToDate": "Op datum", - "updateAvailable": "Opdatering beskikbaar", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Optyd", - "database": "Databasis", - "healthy": "Gesond", - "error": "Fout", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "Totale gashere", - "totalTunnels": "Totale tonnels", - "totalCredentials": "Totale geloofsbriewe", - "recentActivity": "Onlangse Aktiwiteit", - "reset": "Herstel", - "loadingRecentActivity": "Laai onlangse aktiwiteit...", - "noRecentActivity": "Geen onlangse aktiwiteit nie", - "quickActions": "Vinnige Aksies", - "addHost": "Voeg gasheer by", - "addCredential": "Voeg geloofsbriewe by", - "adminSettings": "Admin-instellings", - "userProfile": "Gebruikersprofiel", - "serverStats": "Bedienerstatistieke", - "loadingServerStats": "Laai bedienerstatistieke...", - "noServerData": "Geen bedienerdata beskikbaar nie", - "cpu": "SVE", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Pasmaak Dashboard", - "dashboardSettings": "Dashboard-instellings", - "enableDisableCards": "Aktiveer/Deaktiveer Kaarte", - "resetLayout": "Stel terug na verstekwaarde", - "serverOverviewCard": "Bediener Oorsig", - "recentActivityCard": "Onlangse Aktiwiteit", - "networkGraphCard": "Netwerkgrafiek", - "networkGraph": "Netwerkgrafiek", - "quickActionsCard": "Vinnige Aksies", - "serverStatsCard": "Bedienerstatistieke", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Hoof", "panelSide": "Kant", - "justNow": "nou net" + "justNow": "nou net", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABIEL", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "Geen gashere gekonfigureer nie", "online": "AANLYN", "offline": "AFLYN", - "onlineLower": "Aanlyn", - "nodes": "{{count}} nodusse", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Voeg by:", "commandPalette": "Opdragpalet", "done": "Klaar", "editModeInstructions": "Sleep kaarte om te herrangskik · Sleep die kolomverdeler om kolomme se grootte te verander · Sleep die onderste rand van 'n kaart om die hoogte daarvan te verander · Asblik om te verwyder", "empty": "Leeg", - "clear": "Duidelik" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Voeg gasheer by", - "addGroup": "Voeg Groep by", - "addLink": "Voeg skakel by", - "zoomIn": "Inzoem", - "zoomOut": "Uitzoom", - "resetView": "Herstel aansig", - "selectHost": "Kies gasheer", - "chooseHost": "Kies 'n gasheer...", - "parentGroup": "Ouergroep", - "noGroup": "Geen Groep", - "groupName": "Groepnaam", - "color": "Kleur", - "source": "Bron", - "target": "Teiken", - "moveToGroup": "Skuif na Groep", - "selectGroup": "Kies groep...", - "addConnection": "Voeg verbinding by", - "hostDetails": "Gasheerbesonderhede", - "removeFromGroup": "Verwyder uit groep", - "addHostHere": "Voeg gasheer hier by", - "editGroup": "Wysig Groep", - "delete": "Vee uit", - "add": "Voeg by", - "create": "Skep", - "move": "Beweeg", - "connect": "Verbind", - "createGroup": "Skep Groep", - "selectSourcePlaceholder": "Kies Bron...", - "selectTargetPlaceholder": "Kies Teiken...", - "invalidFile": "Ongeldige lêer", - "hostAlreadyExists": "Gasheer is reeds in die topologie", - "connectionExists": "Verbinding bestaan reeds", - "unknown": "Onbekend", - "name": "Naam", - "ip": "IP-adres", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", "status": "Status", - "failedToAddNode": "Kon nie nodus byvoeg nie", - "sourceDifferentFromTarget": "Bron en teiken moet verskillend wees", - "exportJSON": "Voer JSON uit", - "importJSON": "Voer JSON in", - "terminal": "Terminaal", - "fileManager": "Lêerbestuurder", - "tunnel": "Tonnel", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Bedienerstatistieke", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Geen nodusse nog nie" }, "docker": { - "notEnabled": "Docker is nie vir hierdie gasheer geaktiveer nie", - "validating": "Valideer Docker...", - "connecting": "Verbind...", - "error": "Fout", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Kon nie aan Docker koppel nie", - "containerStarted": "Houer {{name}} het begin", - "failedToStartContainer": "Kon nie houer {{name}} begin nie", - "containerStopped": "Houer {{name}} gestop", - "failedToStopContainer": "Kon nie houer {{name}} stop nie", - "containerRestarted": "Houer {{name}} herbegin", - "failedToRestartContainer": "Kon nie houer {{name}} herbegin nie", - "containerPaused": "Houer {{name}} gepouseer", - "containerUnpaused": "Houer {{name}} ontpoos", - "failedToTogglePauseContainer": "Kon nie pousestatus vir houer {{name}} wissel nie", - "containerRemoved": "Houer {{name}} is verwyder", - "failedToRemoveContainer": "Kon nie houer {{name}} verwyder nie", - "image": "Beeld", - "ports": "Hawens", - "noPorts": "Geen poorte nie", - "start": "Begin", - "confirmRemoveContainer": "Is jy seker jy wil die houer '{{name}}' verwyder? Hierdie aksie kan nie ongedaan gemaak word nie.", - "runningContainerWarning": "Waarskuwing: Hierdie houer loop tans. As dit verwyder word, sal die houer eers gestop word.", - "loadingContainers": "Laai houers...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker Bestuurder", - "autoRefresh": "Outomatiese Herlaai", + "autoRefresh": "Auto Refresh", "timestamps": "Tydstempels", "lines": "Lyne", - "filterLogs": "Filtreer logboeke...", - "refresh": "Verfris", - "download": "Laai af", - "clear": "Duidelik", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Logboeke suksesvol afgelaai", "last50": "Laaste 50", "last100": "Laaste 100", "last500": "Laaste 500", "last1000": "Laaste 1000", "allLogs": "Alle logboeke", - "noLogsMatching": "Geen logboeke wat ooreenstem met \"{{query}}\"", - "noLogsAvailable": "Geen logboeke beskikbaar nie", - "noContainersFound": "Geen houers gevind nie", - "noContainersFoundHint": "Geen Docker-houers is op hierdie gasheer beskikbaar nie", - "searchPlaceholder": "Soek houers...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Alle statusse", - "stateRunning": "Hardloop", + "stateRunning": "Running", "statePaused": "Onderbreek", "stateExited": "Uitgegaan", "stateRestarting": "Herbegin", - "noContainersMatchFilters": "Geen houers stem ooreen met jou filters nie", - "noContainersMatchFiltersHint": "Probeer om jou soek- of filterkriteria aan te pas", - "failedToFetchStats": "Kon nie houerstatistieke haal nie", - "containerNotRunning": "Houer loop nie", - "startContainerToViewStats": "Begin die houer om statistieke te sien", - "loadingStats": "Laai statistieke...", - "errorLoadingStats": "Fout by die laai van statistieke", - "noStatsAvailable": "Geen statistieke beskikbaar nie", - "cpuUsage": "SVE-gebruik", - "current": "Huidige", - "memoryUsage": "Geheuegebruik", - "networkIo": "Netwerk I/O", - "input": "Invoer", - "output": "Uitset", - "blockIo": "Blok I/O", - "read": "Lees", - "write": "Skryf", - "pids": "PID's", - "containerInformation": "Houerinligting", - "name": "Naam", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Staat", - "containerMustBeRunning": "Die houer moet loop om toegang tot die konsole te verkry", - "verificationCodePrompt": "Voer verifikasiekode in", - "totpVerificationFailed": "TOTP-verifikasie het misluk. Probeer asseblief weer.", - "warpgateVerificationFailed": "Warpgate-verifikasie het misluk. Probeer asseblief weer.", - "connectedTo": "Gekoppel aan {{containerName}}", - "disconnected": "Ontkoppel", - "consoleError": "Konsolefout", - "errorMessage": "Fout: {{message}}", - "failedToConnect": "Kon nie aan houer koppel nie", - "console": "Konsole", - "selectShell": "Kies dop", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", - "sh": "sj", - "ash": "as", - "connect": "Verbind", - "disconnect": "Ontkoppel", - "notConnected": "Nie gekoppel nie", - "clickToConnect": "Klik verbind om 'n dopsessie te begin", - "connectingTo": "Verbind met {{containerName}}...", - "containerNotFound": "Houer nie gevind nie", - "backToList": "Terug na lys", - "logs": "Logboeke", - "stats": "Statistiek", - "consoleTab": "Konsole", - "startContainerToAccess": "Begin die houer om toegang tot die konsole te verkry" + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Algemeen", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Gebruikers", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Sessies", - "sectionRoles": "Rolle", - "sectionDatabase": "Databasis", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API-sleutels", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Vee filters uit", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Alles", "allowRegistration": "Laat gebruikersregistrasie toe", - "allowRegistrationDesc": "Laat nuwe gebruikers hulself registreer", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Laat Wagwoord Aanmelding Toe", "allowPasswordLoginDesc": "Gebruikersnaam/wagwoord aanmelding", "oidcAutoProvision": "OIDC Outomatiese Voorsiening", - "oidcAutoProvisionDesc": "Skep outomaties rekeninge vir OIDC-gebruikers, selfs wanneer registrasie gedeaktiveer is.", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Laat wagwoordherstel toe", "allowPasswordResetDesc": "Herstel kode via Docker-logboeke", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Sessie-tydsbeperking", - "hours": "ure", + "hours": "hours", "sessionTimeoutRange": "Min 1 uur · Maks 720 uur", - "monitoringDefaults": "Monitering van Standaardwaardes", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Statuskontrole", - "metrics": "Metrieke", + "metrics": "Metrics", "sec": "sek", "logLevel": "Logvlak", "enableGuacamole": "Aktiveer Guacamole", "enableGuacamoleDesc": "RDP/VNC-afstandlessenaar", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd-URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "Konfigureer OpenID Connect vir SSO. Velde gemerk met * is verpligtend.", - "oidcClientId": "Kliënt-ID", - "oidcClientSecret": "Kliëntgeheim", - "oidcAuthUrl": "Magtigings-URL", - "oidcIssuerUrl": "Uitreiker-URL", - "oidcTokenUrl": "Teken-URL", - "oidcUserIdentifier": "Gebruikersidentifiseerderpad", - "oidcDisplayName": "Vertoonnaampad", - "oidcScopes": "Omvangsgebiede", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Oorskryf Gebruikersinligting URL", - "oidcAllowedUsers": "Toegelate Gebruikers", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Een e-pos per reël. Los leeg om alles toe te laat.", - "removeOidc": "Verwyder", - "usersCount": "{{count}} gebruikers", - "createUser": "Skep", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Nuwe Rol", - "roleName": "Naam", - "roleDisplayName": "Vertoonnaam", - "roleDescription": "Beskrywing", - "rolesCount": "{{count}} rolle", - "createRole": "Skep", - "creating": "Skep...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Uitvoer van databasis", "exportDatabaseDesc": "Laai 'n rugsteun van alle gashere, geloofsbriewe en instellings af", - "export": "Uitvoer", - "exporting": "Uitvoer tans...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Voer databasis in", "importDatabaseDesc": "Herstel vanaf 'n .sqlite rugsteunlêer", - "importDatabaseSelected": "Gekies: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Kies Lêer", - "changeFile": "Verandering", - "import": "Invoer", - "importing": "Voer tans in...", - "apiKeysCount": "{{count}} sleutels", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Nuwe API-sleutel", "apiKeyCreatedWarning": "Sleutel geskep - kopieer dit nou, dit sal nie weer gewys word nie.", - "apiKeyName": "Naam", - "apiKeyUser": "Gebruiker", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Kies 'n gebruiker...", - "apiKeyExpiresAt": "Vervaldatum", + "apiKeyExpiresAt": "Expires At", "createKey": "Skep Sleutel", "apiKeyNoExpiry": "Geen vervaldatum", "revokedBadge": "HERROEP", - "authTypeDual": "Dubbele Magtiging", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Plaaslik", - "adminStatusAdministrator": "Administrateur", - "adminStatusRegularUser": "Gereelde Gebruiker", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", "customBadge": "AANGEPAS", "youBadge": "JY", - "sessionsActive": "{{count}} aktief", - "sessionActive": "Aktief: {{time}}", - "sessionExpires": "Vervaldatum: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "Alles", "revokeAllSessionsSuccess": "Alle sessies vir die gebruiker herroep", - "revokeAllSessionsFailed": "Kon nie sessies herroep nie", - "revokeSessionFailed": "Kon nie sessie herroep nie", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Voeg rol by", "noCustomRoles": "Geen persoonlike rolle gedefinieer nie", - "removeRoleFailed": "Kon nie rol verwyder nie", - "assignRoleFailed": "Kon nie rol toewys nie", - "deleteRoleFailed": "Kon nie rol uitvee nie", - "userAdminAccess": "Administrateur", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Volle toegang tot alle administrateurinstellings", - "userRoles": "Rolle", - "revokeAllUserSessions": "Herroep alle sessies", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Forseer heraanmelding op alle toestelle", - "revoke": "Herroep", + "revoke": "Revoke", "deleteUserWarning": "Die verwydering van hierdie gebruiker is permanent.", - "deleteUser": "Vee uit {{username}}", - "deleting": "Vee tans uit...", - "deleteUserFailed": "Kon nie gebruiker verwyder nie", - "deleteUserSuccess": "Gebruiker \"{{username}}\" is uitgevee", - "deleteRoleSuccess": "Rol \"{{name}}\" uitgevee", - "revokeKeySuccess": "Sleutel \"{{name}}\" herroep", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Kon nie sleutel herroep nie", - "copiedToClipboard": "Na knipbord gekopieer", + "copiedToClipboard": "Copied to clipboard", "done": "Klaar", - "createUserTitle": "Skep Gebruiker", + "createUserTitle": "Create User", "createUserDesc": "Skep 'n nuwe plaaslike rekening.", - "createUserUsername": "Gebruikersnaam", - "createUserPassword": "Wagwoord", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Minimum 6 karakters.", - "createUserEnterUsername": "Voer gebruikersnaam in", - "createUserEnterPassword": "Voer wagwoord in", - "createUserSubmit": "Skep Gebruiker", - "editUserTitle": "Bestuur Gebruiker: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Wysig rolle, administrateurstatus, sessies en rekeninginstellings.", - "editUserUsername": "Gebruikersnaam", + "editUserUsername": "Username", "editUserAuthType": "Magtigingsoort", - "editUserAdminStatus": "Adminstatus", - "editUserUserId": "Gebruikers-ID", - "linkAccountTitle": "Koppel OIDC aan wagwoordrekening", - "linkAccountDesc": "Voeg die OIDC-rekening {{username}} saam met 'n bestaande plaaslike rekening.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Dit sal:", "linkAccountEffect1": "Vee die OIDC-enigste rekening uit", "linkAccountEffect2": "Voeg OIDC-aanmelding by die teikenrekening", "linkAccountEffect3": "Laat beide OIDC- en wagwoordaanmelding toe", - "linkAccountTargetUsername": "Teikengebruikersnaam", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Voer die plaaslike rekeninggebruikersnaam in om aan te koppel", - "linkAccounts": "Koppel rekeninge", - "linkAccountSuccess": "OIDC-rekening gekoppel aan \"{{username}}\"", - "linkAccountFailed": "Kon nie OIDC-rekening koppel nie", - "linkAccountInProgress": "Skakel tans...", - "saving": "Stoor...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Kon nie registrasie-instellings opdateer nie", "updatePasswordLoginFailed": "Kon nie wagwoord-aanmeldinstelling opdateer nie", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Kon nie OIDC-outovoorsieningsinstelling opdateer nie", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Kon nie wagwoordterugstellinginstelling opdateer nie", "sessionTimeoutRange2": "Sessie-tydsberekening moet tussen 1 en 720 uur wees", "sessionTimeoutSaved": "Sessie-tydsbeperking gestoor", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Ongeldige intervalwaardes", "monitoringSaved": "Moniteringsinstellings gestoor", "monitoringSaveFailed": "Kon nie moniteringsinstellings stoor nie", - "guacamoleSaved": "Guacamole-instellings gestoor", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Kon nie Guacamole-instellings stoor nie", "guacamoleUpdateFailed": "Kon nie Guacamole-instelling opdateer nie", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Kon nie logvlak opdateer nie", "oidcSaved": "OIDC-konfigurasie gestoor", "oidcSaveFailed": "Kon nie OIDC-konfigurasie stoor nie", "oidcRemoved": "OIDC-konfigurasie verwyder", "oidcRemoveFailed": "Kon nie OIDC-konfigurasie verwyder nie", "createUserRequired": "Gebruikersnaam en wagwoord word vereis", - "createUserPasswordTooShort": "Wagwoord moet ten minste 6 karakters wees", - "createUserSuccess": "Gebruiker \"{{username}}\" geskep", - "createUserFailed": "Kon nie gebruiker skep nie", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Kon nie administrateurstatus opdateer nie", "allSessionsRevoked": "Alle sessies herroep", - "revokeSessionsFailed": "Kon nie sessies herroep nie", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Naam en vertoonnaam word vereis", - "createRoleSuccess": "Rol \"{{name}}\" geskep", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Kon nie rol skep nie", "apiKeyNameRequired": "Sleutelnaam word vereis", "apiKeyUserRequired": "Gebruikers-ID word vereis", - "apiKeyCreatedSuccess": "API-sleutel \"{{name}}\" geskep", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Kon nie API-sleutel skep nie", "exportSuccess": "Databasis suksesvol uitgevoer", "exportFailed": "Databasis-uitvoer het misluk", "importSelectFile": "Kies asseblief eers 'n lêer", - "importCompleted": "Invoer voltooi: {{total}} items ingevoer, {{skipped}} oorgeslaan", - "importFailed": "Invoer het misluk: {{error}}", - "importError": "Databasisinvoer het misluk" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Databasisinvoer het misluk", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Gasheer", - "hostPlaceholder": "192.168.1.1 of example.com", - "portLabel": "Hawe", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Gebruikersnaam", - "usernamePlaceholder": "gebruikersnaam", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Magtiging", - "passwordLabel": "Wagwoord", - "passwordPlaceholder": "wagwoord", - "privateKeyLabel": "Privaat Sleutel", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Plak privaat sleutel...", - "credentialLabel": "Geloofsbrief", + "credentialLabel": "Credential", "credentialPlaceholder": "Kies 'n gestoorde geloofsbrief", - "connectToTerminal": "Koppel aan terminaal", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Koppel aan lêers" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Vee alles uit", "noHistoryEntries": "Geen geskiedenisinskrywings nie", "trackingDisabled": "Geskiedenisopsporing is gedeaktiveer", - "trackingDisabledHint": "Aktiveer dit in jou profielinstellings om bevele op te neem." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Sleutelopname", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Neem op na terminale", "selectAll": "Alles", - "selectNone": "Geen", + "selectNone": "None", "noTerminalTabsOpen": "Geen terminaal-oortjies oop nie", "selectTerminalsAbove": "Kies terminale hierbo", "broadcastInputPlaceholder": "Tik hier om toetsaanslagen uit te saai...", "stopRecording": "Stop opname", "startRecording": "Begin Opname", - "settingsTitle": "Instellings", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Aktiveer regskliek kopieer/plak" }, "splitScreen": { @@ -1970,134 +2427,180 @@ "dashboard": "Dashboard", "clearSplitScreen": "Maak die gesplete skerm skoon", "quickAssign": "Vinnige Toewysing", - "alreadyAssigned": "Ruit {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Verdeel oortjie", "addToSplit": "Voeg by Split", "removeFromSplit": "Verwyder van Split", - "assignToPane": "Toewys aan paneel" + "assignToPane": "Toewys aan paneel", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Skep brokkie", - "createSnippetDescription": "Skep 'n nuwe opdragbrokkie vir vinnige uitvoering", - "nameLabel": "Naam", - "namePlaceholder": "bv., Herbegin Nginx", - "descriptionLabel": "Beskrywing", - "descriptionPlaceholder": "Opsionele beskrywing", - "optional": "Opsioneel", - "folderLabel": "Vouer", - "noFolder": "Geen vouer nie (Ongekategoriseerd)", - "commandLabel": "Bevel", - "commandPlaceholder": "bv. sudo systemctl herbegin nginx", - "cancel": "Kanselleer", - "createSnippetButton": "Skep brokkie", - "createFolderTitle": "Skep vouer", - "createFolderDescription": "Organiseer jou brokkies in dopgehou", - "folderNameLabel": "Vouernaam", - "folderNamePlaceholder": "bv. Stelselopdragte, Docker-skripte", - "folderColorLabel": "Vouerkleur", - "folderIconLabel": "Vouer-ikoon", - "previewLabel": "Voorskou", - "folderNameFallback": "Vouernaam", - "createFolderButton": "Skep vouer", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Teikenterminale", "selectAll": "Alles", - "selectNone": "Geen", + "selectNone": "None", "noTerminalTabsOpen": "Geen terminaal-oortjies oop nie", - "searchPlaceholder": "Soek brokkies...", - "newSnippet": "Nuwe brokkie", - "newFolder": "Nuwe vouer", - "run": "Hardloop", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Geen brokkies in hierdie vouer nie", - "uncategorized": "Ongekategoriseerd", - "editSnippetTitle": "Wysig brokkie", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Dateer hierdie opdragbrokkie op", "saveSnippetButton": "Stoor veranderinge", - "createSuccess": "Brokkie suksesvol geskep", - "createFailed": "Kon nie brokkie skep nie", - "updateSuccess": "Brokkie suksesvol opgedateer", - "updateFailed": "Kon nie die brokkie opdateer nie", - "deleteFailed": "Kon nie fragment uitvee nie", - "folderCreateSuccess": "Vouer suksesvol geskep", - "folderCreateFailed": "Kon nie vouer skep nie", - "editFolderTitle": "Wysig vouer", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Hernoem of verander die voorkoms van hierdie vouer", "saveFolderButton": "Stoor veranderinge", "editFolder": "Wysig vouer", "deleteFolder": "Vee vouer uit", - "folderDeleteSuccess": "Lêer \"{{name}}\" is uitgevee", - "folderDeleteFailed": "Kon nie vouer uitvee nie", - "folderEditSuccess": "Vouer suksesvol opgedateer", - "folderEditFailed": "Kon nie vouer opdateer nie", - "confirmRunMessage": "Begin \"{{name}}\"?", - "confirmRunButton": "Hardloop", - "runSuccess": "Het \"{{name}}\" in {{count}} terminaal(e) uitgevoer", - "copySuccess": "\"{{name}}\" na knipbord gekopieer", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Deel brokkie", - "shareUser": "Gebruiker", - "shareRole": "Rol", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Kies 'n gebruiker...", "selectRole": "Kies 'n rol...", "shareSuccess": "Brokkie suksesvol gedeel", "shareFailed": "Kon nie fragment deel nie", "revokeSuccess": "Toegang herroep", - "revokeFailed": "Kon nie toegang herroep nie", - "currentAccess": "Huidige Toegang", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Kon nie deeldata laai nie", - "loading": "Laai tans...", - "close": "Maak toe", - "reorderFailed": "Kon nie die volgorde van die brokkie stoor nie" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Kon nie die volgorde van die brokkie stoor nie", + "importExport": "Invoer / Uitvoer", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Geen gashere gekonfigureer nie", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Rekening", - "sectionAppearance": "Voorkoms", - "sectionSecurity": "Sekuriteit", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API-sleutels", "sectionC2sTunnels": "C2S-tonnels", - "usernameLabel": "Gebruikersnaam", - "roleLabel": "Rol", - "roleAdministrator": "Administrateur", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Magtigingsmetode", - "authMethodLocal": "Plaaslik", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "Aan", "twoFaOff": "Af", - "versionLabel": "Weergawe", - "deleteAccount": "Vee rekening uit", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Vee jou rekening permanent uit", - "deleteButton": "Vee uit", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Hierdie aksie is permanent en kan nie ongedaan gemaak word nie.", "deleteAccountWarning": "Alle sessies, gashere, geloofsbriewe en instellings sal permanent uitgevee word.", - "confirmPasswordDeletePlaceholder": "Voer jou wagwoord in om te bevestig", - "languageLabel": "Taal", - "themeLabel": "Tema", - "fontSizeLabel": "Lettergrootte", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Aksentkleur", - "settingsTerminal": "Terminaal", - "commandAutocomplete": "Opdrag Outomatiese Voltooiing", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Wys outovoltooiing terwyl jy tik", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Geskiedenisopsporing", "historyTrackingDesc": "Spoor terminaal opdragte", - "syntaxHighlighting": "Sintaksis-uitlig", - "syntaxHighlightingDesc": "Merk terminaaluitvoer", "commandPalette": "Opdragpalet", "commandPaletteDesc": "Aktiveer sleutelbordkortpaaie", "reopenTabsOnLogin": "Heropen oortjies by aanmelding", "reopenTabsOnLoginDesc": "Herstel jou oop oortjies wanneer jy aanmeld of die bladsy verfris, selfs vanaf 'n ander toestel", "confirmTabClose": "Bevestig oortjie-sluiting", "confirmTabCloseDesc": "Vra voordat terminaal-oortjies gesluit word", - "settingsSidebar": "Sybalk", - "showHostTags": "Wys gasheer-etikette", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Wys etikette in gasheerlys", "hostTrayOnClick": "Klik om gasheeraksies uit te brei", "hostTrayOnClickDesc": "Wys altyd verbindingsknoppies; klik om bestuursopsies uit te brei in plaas daarvan om te beweeg", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Speld App-spoor vas", "pinAppRailDesc": "Hou die linkerkantbalk-apprail altyd uitgebrei in plaas daarvan om uit te brei wanneer jy beweeg", - "settingsSnippets": "Brokkies", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Vouers Ingevou", "foldersCollapsedDesc": "Vou vouers standaard in", "confirmExecution": "Bevestig Uitvoering", "confirmExecutionDesc": "Bevestig voordat brokkies uitgevoer word", - "settingsUpdates": "Opdaterings", + "settingsUpdates": "Updates", "disableUpdateChecks": "Deaktiveer opdateringskontroles", "disableUpdateChecksDesc": "Hou op om vir opdaterings te kyk", "totpAuthenticator": "TOTP-verifikasie", @@ -2109,68 +2612,68 @@ "qrCode": "QR-kode", "totpInstructions": "Skandeer QR-kode of voer geheim in jou verifikasie-app in, en voer dan die 6-syferkode in", "totpCodePlaceholder": "000000", - "verify": "Verifieer", - "changePassword": "Verander wagwoord", - "currentPasswordLabel": "Huidige Wagwoord", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Huidige wagwoord", - "newPasswordLabel": "Nuwe Wagwoord", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Nuwe wagwoord", "confirmPasswordLabel": "Bevestig Nuwe Wagwoord", "confirmPasswordPlaceholder": "Bevestig nuwe wagwoord", "updatePassword": "Wagwoord opdateer", "createApiKeyTitle": "Skep API-sleutel", "createApiKeyDescription": "Genereer 'n nuwe API-sleutel vir programmatiese toegang.", - "apiKeyNameLabel": "Naam", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "bv. CI-pyplyn", "expiryDateLabel": "Vervaldatum", "optional": "opsioneel", - "cancel": "Kanselleer", + "cancel": "Cancel", "createKey": "Skep Sleutel", - "apiKeyCount": "{{count}} sleutels", + "apiKeyCount": "{{count}} keys", "newKey": "Nuwe Sleutel", "noApiKeys": "Geen API-sleutels nog nie.", - "apiKeyActive": "Aktief", + "apiKeyActive": "Active", "apiKeyUsageHint": "Sluit jou sleutel in die", "apiKeyUsageHintHeader": "opskrif.", "apiKeyPermissionsHint": "Sleutels erf die regte van die skeppergebruiker.", - "roleUser": "Gebruiker", - "authMethodDual": "Dubbele Magtiging", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Kon nie TOTP-opstelling begin nie", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Voer 'n 6-syferkode in", "totpEnabledSuccess": "Tweefaktor-verifikasie geaktiveer", "totpInvalidCode": "Ongeldige kode, probeer asseblief weer", "totpDisableInputRequired": "Voer jou TOTP-kode of wagwoord in", - "totpDisabledSuccess": "Tweefaktor-verifikasie gedeaktiveer", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "Kon nie 2FA deaktiveer nie", - "totpDisableTitle": "Deaktiveer 2FA", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Voer TOTP-kode of wagwoord in", - "totpDisableConfirm": "Deaktiveer 2FA", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Gaan voort om te verifieer", - "totpVerifyTitle": "Verifieer Kode", - "totpBackupTitle": "Rugsteunkodes", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Laai rugsteunkodes af", "done": "Klaar", "secretCopied": "Geheim gekopieer na knipbord", "apiKeyNameRequired": "Sleutelnaam word vereis", - "apiKeyCreated": "API-sleutel \"{{name}}\" geskep", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Kon nie API-sleutel skep nie", - "apiKeyUser": "Gebruiker", - "apiKeyExpires": "Vervaldatum", - "apiKeyRevoked": "API-sleutel \"{{name}}\" herroep", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "Kon nie API-sleutel herroep nie", "passwordFieldsRequired": "Huidige en nuwe wagwoorde word vereis", - "passwordMismatch": "Wagwoorde stem nie ooreen nie", - "passwordTooShort": "Wagwoord moet ten minste 6 karakters wees", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Wagwoord suksesvol opgedateer", "passwordUpdateFailed": "Kon nie wagwoord opdateer nie", "deletePasswordRequired": "Wagwoord word vereis om jou rekening te verwyder", - "deleteFailed": "Kon nie rekening uitvee nie", - "deleting": "Vee tans uit...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Maak kleurkieser oop", - "themeSystem": "Stelsel", - "themeLight": "Lig", - "themeDark": "Donker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Katppuccin", "themeNord": "Noord", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "nou net", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Oortjie", + "backTab": "⇥", + "arrowUp": "Pyltjie Op", + "arrowDown": "Pyltjie Af", + "arrowLeft": "Pyltjie links", + "arrowRight": "Pyltjie Regs", + "home": "Home", + "end": "Einde", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Klaar" } } diff --git a/src/ui/locales/translated/ar_SA.json b/src/ui/locales/translated/ar_SA.json index 10abe315..8e818c21 100644 --- a/src/ui/locales/translated/ar_SA.json +++ b/src/ui/locales/translated/ar_SA.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "مجلدات", - "folder": "مجلد", + "folders": "Folders", + "folder": "Folder", "password": "كلمة المرور", - "key": "المفتاح", - "sshPrivateKey": "مفتاح SSH الخاص", - "upload": "تحميل", - "keyPassword": "كلمة المرور الرئيسية", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "مفتاح SSH", - "uploadPrivateKeyFile": "تحميل ملف المفتاح الخاص", - "searchCredentials": "البحث عن بيانات التفويض...", - "addCredential": "إضافة بيانات اعتماد", - "caCertificate": "شهادة CA (-cert.pub)", - "caCertificateDescription": "اختياري: تحميل أو لصق ملف الشهادة الموقعة CA-(على سبيل المثال id_ed25519-cert.pub). مطلوب عندما يستخدم خادم SSH الخاص بك الإذن المستند إلى الشهادة.", - "uploadCertFile": "تحميل ملف-cert.pub", - "clearCert": "مسح", - "certLoaded": "تم تحميل الشهادة", - "certPublicKeyLabel": "شهادة CA", - "certTypeLabel": "نوع الشهادة", - "pasteOrUploadCert": "لصق أو تحميل شهادة -cert.pub ...", - "hasCaCert": "حائز على شهادة CA", - "noCaCert": "لا توجد شهادة CA" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "الترتيب الافتراضي", + "sortNameAsc": "الاسم (من الألف إلى الياء)", + "sortNameDesc": "الاسم (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "فلاتر شفافة", + "filterTypeGroup": "Type", + "filterTypePassword": "كلمة المرور", + "filterTypeKey": "مفتاح SSH", + "filterTagsGroup": "الوسوم" }, "homepage": { - "failedToLoadAlerts": "فشل تحميل التنبيهات", - "failedToDismissAlert": "فشل في تجاهل التنبيه" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "تكوين الخادم", - "description": "تكوين عنوان URL للخادم Termix للاتصال بخدمات الخلفية", - "serverUrl": "رابط الخادم", - "enterServerUrl": "الرجاء إدخال رابط الخادم", - "saveFailed": "فشل في حفظ التكوين", - "saveError": "خطأ في حفظ الإعدادات", - "saving": "حفظ...", - "saveConfig": "حفظ الإعدادات", - "helpText": "أدخل عنوان URL حيث يعمل خادم Termix الخاص بك (على سبيل المثال: http://localhost:30001 أو https://your-server.com)", - "changeServer": "تغيير الخادم", - "mustIncludeProtocol": "عنوان URL للخادم يجب أن يبدأ مع http:// أو https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "السماح بشهادة غير صالحة", "allowInvalidCertificateDesc": "استخدمه فقط للخوادم الموثوقة ذاتية الاستضافة التي تحتوي على شهادات موقعة ذاتيًا أو شهادات عناوين IP.", - "useEmbedded": "استخدام الخادم المحلي", - "embeddedDesc": "تشغيل ترميكس مع الخادم المحلي المدمج (لا حاجة للخادم البعيد)", - "embeddedConnecting": "جاري الاتصال بالخادم المحلي...", - "embeddedNotReady": "الخادم المحلي غير جاهز بعد. الرجاء الانتظار لحظة وحاول مرة أخرى.", - "localServer": "الخادم المحلي" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "يزيل" }, "versionCheck": { - "error": "خطأ في التحقق من الإصدار", - "checkFailed": "فشل التحقق من وجود تحديثات", - "upToDate": "التطبيق يصل إلى تاريخ", - "currentVersion": "أنت تقوم بتشغيل الإصدار {{version}}", - "updateAvailable": "تحديث متوفر", - "newVersionAvailable": "يتوفر إصدار جديد! أنت تقوم بتشغيل {{current}}، ولكن {{latest}} متاح.", - "betaVersion": "نسخة بيتا", - "betaVersionDesc": "أنت تقوم بتشغيل {{current}}، وهو أحدث من أحدث إصدار مستقر {{latest}}.", - "releasedOn": "صدر على {{date}}", - "downloadUpdate": "تنزيل التحديث", - "checking": "البحث عن تحديثات...", - "checkUpdates": "التحقق من وجود تحديثات", - "checkingUpdates": "البحث عن تحديثات...", - "updateRequired": "التحديث مطلوب" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "أغلق", + "close": "Close", "minimize": "Minimize", "online": "متصل", - "offline": "غير متصل", - "continue": "متابعة", - "maintenance": "صيانة", - "degraded": "تدهورت", - "error": "خطأ", - "warning": "تحذير", - "unsavedChanges": "التغييرات غير المحفوظة", - "dismiss": "تجاهل", - "loading": "تحميل...", - "optional": "اختياري", - "connect": "الاتصال", - "copied": "منسوخ", - "connecting": "جاري الاتصال...", - "updateAvailable": "تحديث متوفر", - "appName": "تيريمكس", - "openInNewTab": "فتح في علامة تبويب جديدة", - "noReleases": "لا توجد إصدارات", - "updatesAndReleases": "التحديثات والإصدارات", - "newVersionAvailable": "يتوفر إصدار جديد ({{version}}).", - "failedToFetchUpdateInfo": "فشل في جلب معلومات التحديث", - "preRelease": "الإصدار السابق", - "noReleasesFound": "لم يتم العثور على إصدارات", - "cancel": "إلغاء", - "username": "اسم المستخدم", - "login": "تسجيل الدخول", - "register": "تسجيل", + "offline": "غير متصل بالإنترنت", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "يلغي", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "كلمة المرور", - "confirmPassword": "تأكيد كلمة المرور", - "back": "الرجوع", - "save": "حفظ", - "saving": "حفظ...", - "delete": "حذف", - "rename": "إعادة تسمية", - "edit": "تحرير", - "add": "إضافة", - "confirm": "تأكيد", - "no": "لا", - "or": "أو", - "next": "التالي", - "previous": "السابق", - "refresh": "تحديث", - "language": "اللغة", - "checking": "يتحقق...", - "checkingDatabase": "التحقق من اتصال قاعدة البيانات...", - "checkingAuthentication": "التحقق من المصادقة...", - "backendReconnected": "تم استعادة اتصال الخادم", - "connectionDegraded": "فقد اتصال الخادم، واسترداد…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "إزالة", - "create": "إنشاء", - "update": "تحديث", - "copy": "نسخ", - "copyFailed": "فشل النسخ إلى الحافظة", + "remove": "يزيل", + "create": "Create", + "update": "Update", + "copy": "ينسخ", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "إستعادة", - "of": "من" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "المنزل", - "terminal": "المحطة", - "docker": "دوكر", - "tunnels": "أنفاق", + "home": "Home", + "terminal": "صالة", + "docker": "عامل ميناء", + "tunnels": "Tunnels", "fileManager": "مدير الملفات", - "serverStats": "إحصائيات الخادم", - "admin": "المشرف", - "userProfile": "الملف الشخصي للمستخدم", - "splitScreen": "تقسيم الشاشة", - "confirmClose": "إغلاق هذه الجلسة النشطة؟", - "close": "أغلق", - "cancel": "إلغاء", - "sshManager": "مدير SSH", - "cannotSplitTab": "لا يمكن تقسيم هذا التبويب", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "يلغي", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "نسخ كلمة المرور", - "copySudoPassword": "نسخ كلمة مرور سودو", - "passwordCopied": "تم نسخ كلمة المرور إلى الحافظة", - "noPasswordAvailable": "لا توجد كلمة مرور متاحة", - "failedToCopyPassword": "فشل في نسخ كلمة المرور", - "refreshTab": "تحديث الاتصال", - "openFileManager": "فتح مدير الملفات", - "dashboard": "لوحة التحكم", - "networkGraph": "رسم الشبكة", - "quickConnect": "الاتصال السريع", - "sshTools": "أدوات SSH", - "history": "التاريخ", - "hosts": "المضيفون", - "snippets": "كتل الكود", - "hostManager": "مدير المضيف", - "credentials": "وثائق التفويض", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "الاتصالات", - "roleAdministrator": "المدير", - "roleUser": "المستخدم" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "المضيفون", - "noHosts": "لا يوجد مضيفين SSH", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", "retry": "إعادة المحاولة", - "refresh": "تحديث", - "optional": "اختياري", - "downloadSample": "تحميل عينة", - "failedToDeleteHost": "فشل في حذف {{name}}", - "importSkipExisting": "استيراد (تخطي قائم)", - "connectionDetails": "تفاصيل الاتصال", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Telnet", - "remoteDesktop": "سطح المكتب عن بعد", - "port": "المنفذ", - "username": "اسم المستخدم", - "folder": "مجلد", + "telnet": "تيلنت", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "الوسوم", - "pin": "تثبيت", - "addHost": "إضافة مضيف", - "editHost": "تحرير المضيف", - "cloneHost": "استنساخ المضيف", - "enableTerminal": "تمكين المحطة الطرفية", - "enableTunnel": "تمكين النفق", - "enableFileManager": "تمكين مدير الملفات", - "enableDocker": "تمكين Docker", - "defaultPath": "المسار الافتراضي", - "connection": "اتصال", - "upload": "تحميل", - "authentication": "المصادقة", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "كلمة المرور", - "key": "المفتاح", - "credential": "بيانات", - "none": "لا", - "sshPrivateKey": "مفتاح SSH الخاص", - "keyType": "نوع المفتاح", - "uploadFile": "تحميل ملف", - "tabGeneral": "عام", + "key": "Key", + "credential": "بيانات الاعتماد", + "none": "لا أحد", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "صالة", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "أنفاق", - "tabDocker": "دوكر", - "tabFiles": "الملفات", - "tabStats": "إحصائيات", - "tabTelnet": "Telnet", - "tabSharing": "مشاركة", - "tabAuthentication": "المصادقة", - "terminal": "المحطة", + "tabTunnels": "Tunnels", + "tabDocker": "عامل ميناء", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "تيلنت", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "صالة", "tunnel": "نفق", "fileManager": "مدير الملفات", - "serverStats": "إحصائيات الخادم", - "status": "الحالة", - "folderRenamed": "المجلد \"{{oldName}}\" أعيدت تسميته إلى \"{{newName}}\" بنجاح", - "failedToRenameFolder": "فشل في إعادة تسمية المجلد", - "movedToFolder": "نقل إلى \"{{folder}}\"", - "editHostTooltip": "تحرير المضيف", - "statusChecks": "التحقق من الحالة", - "metricsCollection": "مجموعة القياسات", - "metricsInterval": "الفاصل الزمني لمجموعة القياسات", - "metricsIntervalDesc": "كم عدد المرات لجمع إحصائيات الخادم (5s - 1ساعة)", - "behavior": "السلوك", - "themePreview": "معاينة السمة", - "theme": "السمة", - "fontFamily": "عائلة الخط", + "serverStats": "Host Metrics", + "status": "حالة", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "تباعد الحروف", - "lineHeight": "ارتفاع الخط", - "cursorStyle": "نمط المؤشر", - "cursorBlink": "وميض المؤشر", - "scrollbackBuffer": "المخزن المؤقت للتمرير", - "bellStyle": "نمط الجرس", - "rightClickSelectsWord": "النقر الأيمن يحدد الكلمة", - "fastScrollModifier": "تعديل التمرير السريع", - "fastScrollSensitivity": "حساسية التمرير السريع", - "sshAgentForwarding": "إعادة توجيه وكيل SSH", - "backspaceMode": "وضع الفضاء الخلفي", - "startupSnippet": "بدء تشغيل كتلة الكود", - "selectSnippet": "حدد كتلة الكود", - "forceKeyboardInteractive": "تفعيل لوحة المفاتيح", - "overrideCredentialUsername": "تجاوز اسم المستخدم", - "overrideCredentialUsernameDesc": "استخدام اسم المستخدم المحدد أعلاه بدلا من اسم المستخدم للاعتماد", - "jumpHostChain": "اقفز سلسلة المضيف", - "portKnocking": "منصة المنفذ", - "addKnock": "إضافة منفذ", - "addProxyNode": "إضافة عقدة", - "proxyNode": "عقدة الوكيل", - "proxyType": "نوع الوكيل", - "quickActions": "الإجراءات السريعة", - "sudoPasswordAutoFill": "كلمة مرور سودو تلقائية", - "sudoPassword": "كلمة مرور سودو", - "keepaliveInterval": "الفاصل الزمني للحفاظ على (مللي ثانية)", - "moshCommand": "قيادة MOSH", - "environmentVariables": "المتغيرات البيئية", - "addVariable": "إضافة متغير", - "docker": "دوكر", - "copyTerminalUrl": "نسخ رابط المحطة", - "copyFileManagerUrl": "نسخ رابط مدير الملفات", - "copyRemoteDesktopUrl": "نسخ رابط سطح المكتب عن بعد", - "failedToConnect": "فشل الاتصال بوحدة التحكم", - "connect": "الاتصال", - "disconnect": "قطع الاتصال", - "start": "ابدأ", - "enableStatusCheck": "تمكين التحقق من الحالة", - "enableMetrics": "تمكين القياسات", - "bulkUpdateFailed": "فشل التحديث الشامل", - "selectAll": "حدد الكل", - "deselectAll": "إلغاء تحديد الكل", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "عامل ميناء", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "قذيفة آمنة", - "virtualNetwork": "الشبكة الظاهرية", - "unencryptedShell": "قذيفة غير مشفرة", - "addressIp": "العنوان / IP", - "friendlyName": "الاسم الودي", - "folderAndAdvanced": "مجلد و متقدم", - "privateNotes": "ملاحظات خاصة", - "privateNotesPlaceholder": "تفاصيل حول هذا الخادم...", - "pinToTop": "تثبيت إلى الأعلى", - "pinToTopDesc": "إظهار هذا المضيف دائماً في الجزء العلوي من القائمة", - "portKnockingSequence": "تسلسل المنفذ", - "addKnockBtn": "إضافة قرطة", - "noPortKnocking": "لم يتم تكوين منفذ الضرب.", - "knockPort": "منفذ القفص", - "protocol": "Protocol", - "delayAfterMs": "التأخير بعد (مللي ثانية)", - "useSocks5Proxy": "استخدام وكيل SOCKS5", - "useSocks5ProxyDesc": "مسار الاتصال من خلال خادم الوكيل", - "proxyHost": "مضيف الوكيل", - "proxyPort": "منفذ الوكيل", - "proxyUsername": "اسم مستخدم البروكسي", - "proxyPassword": "كلمة مرور الوكيل", - "proxySingleMode": "وكيل واحد", - "proxyChainMode": "سلسلة البروكسي", - "you": "أنت", - "jumpHostChainLabel": "اقفز سلسلة المضيف", - "addJumpBtn": "إضافة قفزة", - "noJumpHosts": "لم يتم تكوين مضيف قفز.", - "selectAServer": "اختر خادم...", - "sshPort": "منفذ SSH", - "authMethod": "طريقة المصادقة", - "storedCredential": "بيانات الاعتماد المخزنة", - "selectACredential": "حدد بيانات الاعتماد...", - "keyTypeLabel": "نوع المفتاح", - "keyTypeAuto": "الكشف التلقائي", - "keyPasteTab": "لصق", - "keyUploadTab": "تحميل", - "keyFileLoaded": "تم تحميل ملف المفتاح", - "keyUploadClick": "انقر لتحميل .pem / .key / .ppk", - "clearKey": "مسح المفتاح", - "keySaved": "تم حفظ مفتاح SSH", - "keyReplaceNotice": "لصق مفتاح جديد أدناه لاستبداله", - "keyPassphraseSaved": "تم حفظ كلمة المرور، اكتب للتغيير", - "replaceKey": "استبدال المفتاح", - "forceKeyboardInteractiveLabel": "فرض تفاعل لوحة المفاتيح", - "forceKeyboardInteractiveShortDesc": "فرض إدخال كلمة المرور يدوياً حتى إذا كانت المفاتيح موجودة", - "terminalAppearance": "مظهر المحطة النهائية", - "colorTheme": "لون السمة", - "fontFamilyLabel": "عائلة الخط", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "بروتوكول", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "نمط المؤشر", - "letterSpacingPx": "تباعد الحروف (px)", - "lineHeightLabel": "ارتفاع الخط", - "bellStyleLabel": "نمط الجرس", - "backspaceModeLabel": "وضع الفضاء الخلفي", - "cursorBlinking": "ربط المؤشر", - "cursorBlinkingDesc": "تمكين الرسوم المتحركة الضوئية للمؤشر الطرفي", - "rightClickSelectsWordLabel": "اختيار الكلمة بالزر الأيمن", - "rightClickSelectsWordShortDesc": "حدد الكلمة تحت المؤشر عند النقر بالزر الأيمن", - "behaviorAndAdvanced": "السلوك والمتقدم", - "scrollbackBufferLabel": "المخزن المؤقت للتمرير", - "scrollbackMaxLines": "الحد الأقصى لعدد الخطوط المحفوظة في التاريخ", - "sshAgentForwardingLabel": "إعادة توجيه وكيل SSH", - "sshAgentForwardingShortDesc": "مرر مفاتيح SSH المحلية إلى هذا المضيف", - "enableAutoMosh": "تمكين الموسم التلقائي", - "enableAutoMoshDesc": "تفضيل موش على SSH إذا كان متوفراً", - "enableAutoTmux": "تمكين Tmux التلقائي", - "enableAutoTmuxDesc": "تشغيل تلقائي أو إرفاق جلسة tmux", - "sudoPasswordAutoFillLabel": "كلمة مرور سودو التلقائية", - "sudoPasswordAutoFillShortDesc": "توفير كلمة مرور sudo تلقائياً عند الطلب", - "sudoPasswordLabel": "كلمة مرور سودو", - "environmentVariablesLabel": "المتغيرات البيئية", - "addVariableBtn": "إضافة متغير", - "noEnvVars": "لا توجد متغيرات بيئية مكوّنة.", - "fastScrollModifierLabel": "تعديل التمرير السريع", - "fastScrollSensitivityLabel": "حساسية التمرير السريع", - "moshCommandLabel": "قيادة موش", - "startupSnippetLabel": "بدء تشغيل كتلة الكود", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "فترة الإبقاء على الاتصال (بالثواني)", - "maxKeepaliveMisses": "الحد الاقصى للاخطاء", - "tunnelSettings": "إعدادات النفق", - "enableTunneling": "تمكين الاتصال النفقي", - "enableTunnelingDesc": "تمكين وظيفة نفق SSH لهذا المضيف", - "serverTunnelsSection": "أنفاق الخادم", - "addTunnelBtn": "إضافة نفق", - "noTunnelsConfigured": "لم يتم تكوين الأنفاق.", - "tunnelLabel": "النفق {{number}}", - "tunnelType": "نوع النفق", - "tunnelModeLocalDesc": "إعادة توجيه منفذ محلي إلى منفذ على الخادم البعيد (أو يمكن الوصول إلى مضيف منه).", - "tunnelModeRemoteDesc": "إعادة توجيه المنفذ على الخادم البعيد إلى منفذ محلي على جهازك.", - "tunnelModeDynamicDesc": "إنشاء وكيل SOCKS5 على منفذ محلي لنقل الميناء الديناميكي.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "هذا المضيف (نفق مباشر)", - "endpointHost": "مضيف نقطة النهاية", - "endpointPort": "منفذ نقطة النهاية", - "bindHost": "ربط المضيف", - "sourcePort": "منفذ المصدر", - "maxRetries": "الحد الاقصى لمحاولات", - "retryIntervalS": "الفاصل الزمني لإعادة المحاولة (ات)", - "autoStartLabel": "بدء التشغيل التلقائي", - "autoStartDesc": "توصيل هذا النفق تلقائياً عند تحميل المضيف", - "tunnelConnecting": "اتصال النفق...", - "tunnelDisconnected": "النفق غير متصل", - "failedToConnectTunnel": "فشل في الاتصال", - "failedToDisconnectTunnel": "فشل في قطع الاتصال", - "dockerIntegration": "تكامل Docker", - "enableDockerMonitor": "تمكين Docker", - "enableDockerMonitorDesc": "مراقبة وإدارة الحاويات على هذا المضيف عبر Docker", - "enableFileManagerMonitor": "تمكين مدير الملفات", - "enableFileManagerMonitorDesc": "تصفح وإدارة الملفات على هذا المضيف عبر SFTP", - "defaultPathLabel": "المسار الافتراضي", - "fileManagerPathHint": "الدليل المراد فتحه عند تشغيل مدير الملفات لهذا المضيف.", - "statusChecksLabel": "التحقق من الحالة", - "enableStatusChecks": "تمكين التحقق من الحالة", - "enableStatusChecksDesc": "ربط هذا المضيف بشكل دوري للتحقق من التوافر", - "useGlobalInterval": "استخدام الفاصل الزمني العالمي", - "useGlobalIntervalDesc": "تجاوز الفاصل الزمني للتحقق من الحالة على نطاق الخادم", - "checkIntervalS": "الفاصل الزمني (ات)", - "checkIntervalDesc": "ثواني بين كل اتصال بينغ", - "metricsCollectionLabel": "مجموعة القياسات", - "enableMetricsLabel": "تمكين القياسات", - "enableMetricsDesc": "اجمع المعالج، ذاكرة الوصول العشوائي، القرص واستخدام الشبكة من هذا المضيف", - "useGlobalMetrics": "استخدام الفاصل الزمني العالمي", - "useGlobalMetricsDesc": "تجاوز الفاصل الزمني للقياسات على نطاق الخادم", - "metricsIntervalS": "فاصل القياسات (ات)", - "metricsIntervalDesc2": "ثواني بين لقطات مترية", - "visibleWidgets": "أدوات مرئية", - "cpuUsageLabel": "استخدام المعالج", - "cpuUsageDesc": "المعالج بالمئة ، تحميل المتوسطات ، الرسم البياني للشرارة", - "memoryLabel": "استخدام الذاكرة", - "memoryDesc": "استخدام ذاكرة الوصول العشوائي، مقايضة، تخزين مؤقت", - "storageLabel": "استخدام القرص", - "storageDesc": "استخدام القرص لكل نقطة تركيب", - "networkLabel": "واجهة الشبكة", - "networkDesc": "قائمة الواجهة وعرض النطاق الترددي", - "uptimeLabel": "وقت التحديث", - "uptimeDesc": "النظام مرة اخرى و وقت التشغيل", - "systemInfoLabel": "معلومات النظام", - "systemInfoDesc": "نظام التشغيل، اسم المضيف، العمارة", - "recentLoginsLabel": "تسجيلات الدخول الأخيرة", - "recentLoginsDesc": "أحداث تسجيل الدخول الناجحة والفاشلة", - "topProcessesLabel": "أعلى العمليات", - "topProcessesDesc": "PID, CPU%, MEM%, الأمر", - "listeningPortsLabel": "منافذ الاستماع", - "listeningPortsDesc": "فتح المنافذ مع العملية والولاية", - "firewallLabel": "جدار الحماية", - "firewallDesc": "جدار ناري، AppArmor، حالة SELinux", - "quickActionsLabel": "الإجراءات السريعة", - "quickActionsToolbar": "الإجراءات السريعة تظهر كأزرار في شريط احصائيات الخادم لتنفيذ الأمر بنقرة واحدة.", - "noQuickActions": "لا توجد إجراءات سريعة حتى الآن.", - "buttonLabel": "تسمية الزر", - "selectSnippetPlaceholder": "حدد كتلة الكود...", - "addActionBtn": "إضافة إجراء", - "hostSharedSuccessfully": "تم مشاركة المضيف بنجاح", - "failedToShareHost": "فشل مشاركة المضيف", - "accessRevoked": "تم إلغاء الوصول", - "failedToRevokeAccess": "فشل في إلغاء الوصول", - "cancelBtn": "إلغاء", - "savingBtn": "حفظ...", - "addHostBtn": "إضافة مضيف", - "hostUpdated": "تم تحديث المضيف", - "hostCreated": "تم إنشاء المضيف", - "failedToSave": "فشل في حفظ المضيف", - "credentialUpdated": "تم تحديث بيانات الاعتماد", - "credentialCreated": "تم إنشاء بيانات الاعتماد", - "failedToSaveCredential": "فشل في حفظ بيانات الاعتماد", - "backToHosts": "العودة إلى المضيفين", - "backToCredentials": "العودة إلى وثائق التفويض", - "pinned": "مثبتة", - "noHostsFound": "لم يتم العثور على مضيف", - "tryDifferentTerm": "جرب مصطلحا مختلفا", - "addFirstHost": "أضف أول مضيف لك للبدء", - "noCredentialsFound": "لا توجد بيانات اعتماد", - "addCredentialBtn": "إضافة بيانات اعتماد", - "updateCredentialBtn": "تحديث بيانات الاعتماد", - "features": "الميزات", - "noFolder": "(بدون مجلد)", - "deleteSelected": "حذف", - "exitSelection": "الخروج من الاختيار", - "importSkip": "استيراد (تخطي قائم)", - "importOverwrite": "الاستيراد (الكتابة)", - "collapseBtn": "تصغير", - "importExportBtn": "استيراد / تصدير", - "hostStatusesRefreshed": "تم تحديث حالات المضيف", - "failedToRefreshHosts": "فشل تحديث المضيفين", - "movedHostTo": "نقل {{host}} إلى \"{{folder}}\"", - "failedToMoveHost": "فشل نقل المضيف", - "folderRenamedTo": "تمت إعادة تسمية المجلد إلى \"{{name}}\"", - "deletedFolder": "المجلد المحذوف\"{{name}}\"", - "failedToDeleteFolder": "فشل في حذف المجلد", - "deleteAllInFolder": "حذف جميع المضيفين في \"{{name}}\"؟ لا يمكن التراجع عن ذلك.", - "deletedHost": "محذوف {{name}}", - "copiedToClipboard": "نسخ إلى الحافظة", - "terminalUrlCopied": "تم نسخ الرابط الطرفي", - "fileManagerUrlCopied": "تم نسخ رابط مدير الملفات", - "tunnelUrlCopied": "تم نسخ رابط النفق", - "dockerUrlCopied": "تم نسخ رابط Docker", - "serverStatsUrlCopied": "تم نسخ رابط إحصائيات الخادم", - "rdpUrlCopied": "تم نسخ رابط RDP", - "vncUrlCopied": "تم نسخ رابط VNC", - "telnetUrlCopied": "تم نسخ رابط الهاتف", - "remoteDesktopUrlCopied": "تم نسخ رابط سطح المكتب عن بعد", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "كلمة المرور", + "authTypeKey": "مفتاح SSH", + "authTypeCredential": "بيانات الاعتماد", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "لا أحد", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "يلغي", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "مثبت", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "سمات", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "يلغي", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "حالة", + "GroupByProtocol": "بروتوكول", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "توسيع الإجراءات", "collapseActions": "إجراءات الانهيار", "wakeOnLanAction": "تشغيل عبر الشبكة المحلية", - "wakeOnLanSuccess": "تم إرسال حزمة سحرية إلى {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "فشل إرسال الحزمة السحرية", - "cloneHostAction": "استنساخ المضيف", - "copyAddress": "نسخ العنوان", - "copyLink": "نسخ الرابط", - "copyTerminalUrlAction": "نسخ رابط المحطة", - "copyFileManagerUrlAction": "نسخ رابط مدير الملفات", - "copyTunnelUrlAction": "نسخ رابط النفق", - "copyDockerUrlAction": "نسخ رابط Docker", - "copyServerStatsUrlAction": "نسخ رابط إحصائيات الخادم", - "copyRdpUrlAction": "نسخ رابط RDP", - "copyVncUrlAction": "نسخ رابط VNC", - "copyTelnetUrlAction": "نسخ رابط Telnet", - "copyRemoteDesktopUrlAction": "نسخ رابط سطح المكتب عن بعد", - "deleteCredentialConfirm": "حذف بيانات الاعتماد\"{{name}}\"؟", - "deletedCredential": "محذوف {{name}}", - "deploySSHKeyTitle": "نشر مفتاح SSH", - "deployingBtn": "النشر...", - "deployBtn": "نشر", - "failedToDeployKey": "فشل نشر المفتاح", - "deleteHostsConfirm": "حذف مضيف {{count}}{{plural}}؟ لا يمكن التراجع عن ذلك.", - "movedToRoot": "نقل إلى الجذر", - "failedToMoveHosts": "فشل في نقل المضيفين", - "enableTerminalFeature": "تمكين المحطة الطرفية", - "disableTerminalFeature": "تعطيل المحطة الطرفية", - "enableFilesFeature": "تمكين الملفات", - "disableFilesFeature": "تعطيل الملفات", - "enableTunnelsFeature": "تمكين الأنفاق", - "disableTunnelsFeature": "تعطيل الأنفاق", - "enableDockerFeature": "تمكين Docker", - "disableDockerFeature": "تعطيل المرفأ", - "addTagsPlaceholder": "إضافة علامات...", - "authDetails": "تفاصيل المصادقة", - "credType": "نوع", - "generateKeyPairDesc": "إنشاء زوج جديد من المفاتيح، الخاصة والعامة، سيتم ملؤها تلقائياً.", - "generatingKey": "توليد ...", - "generateLabel": "توليد {{label}}", - "uploadFileBtn": "تحميل ملف", - "keyPassphraseOptional": "كلمة المرور الرئيسية (اختياري)", - "sshPublicKeyOptional": "مفتاح SSH العمومي (اختياري)", - "publicKeyGenerated": "تم إنشاء المفتاح العمومي", - "failedToGeneratePublicKey": "فشل في اشتقاق المفتاح العمومي", - "publicKeyCopied": "تم نسخ المفتاح العمومي", - "keyPairGenerated": "تم إنشاء زوج المفتاح {{label}}", - "failedToGenerateKeyPair": "فشل في إنشاء زوج المفاتيح", - "searchHostsPlaceholder": "البحث عن المضيفين والعناوين والعلامات…", - "searchCredentialsPlaceholder": "البحث في بيانات الاعتماد…", - "refreshBtn": "تحديث", - "addTag": "إضافة علامات...", - "deleteConfirmBtn": "حذف", - "tunnelRequirementsText": "يجب أن يحتوي خادم SSH على منافذ بوابة نعم ، وسماحةTcpForarding نعم ، و PermitRootLogin عيّن في /etc/ssh/sshd_config.", - "deleteHostConfirm": "حذف \"{{name}}\"؟", - "enableAtLeastOneProtocol": "تمكين بروتوكول واحد على الأقل أعلاه لتهيئة المصادقة وإعدادات الاتصال.", - "keyPassphrase": "كلمة المرور الرئيسية", - "connectBtn": "الاتصال", - "disconnectBtn": "قطع الاتصال", - "basicInformation": "معلومات أساسية", - "authDetailsSection": "تفاصيل المصادقة", - "credTypeLabel": "نوع", - "hostsTab": "المضيفون", - "credentialsTab": "وثائق التفويض", - "selectMultiple": "حدد عدة", - "selectHosts": "حدد المضيفين", - "connectionLabel": "اتصال", - "authenticationLabel": "المصادقة", - "generateKeyPairTitle": "إنشاء اقتران المفتاح", - "generateKeyPairDescription": "إنشاء زوج جديد من المفاتيح، الخاصة والعامة، سيتم ملؤها تلقائياً.", - "generateFromPrivateKey": "توليد من المفتاح الخاص", - "refreshBtn2": "تحديث", - "exitSelectionTitle": "الخروج من الاختيار", - "exportAll": "تصدير الكل", - "addHostBtn2": "إضافة مضيف", - "addCredentialBtn2": "إضافة بيانات اعتماد", - "checkingHostStatuses": "التحقق من أوضاع المضيف...", - "pinnedSection": "مثبتة", - "hostsExported": "تم تصدير المضيفين بنجاح", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "مثبت", + "hostsExported": "Hosts exported successfully", "exportFailed": "فشل تصدير المضيفين", - "sampleDownloaded": "تم تنزيل ملف العينة", - "failedToDeleteCredential2": "فشل في حذف بيانات الاعتماد", - "noFolderOption": "(بدون مجلد)", - "nSelected": "{{count}} تم الاختيار", - "featuresMenu": "الميزات", - "moveMenu": "نقل", - "cancelSelection": "إلغاء", - "deployDialogDesc": "نشر {{name}} في مفتاح_المضيف المصرح به.", - "targetHostLabel": "المضيف المستهدف", - "selectHostOption": "اختر مضيفاً...", - "keyDeployedSuccess": "نشر المفتاح بنجاح", - "failedToDeployKey2": "فشل نشر المفتاح", - "deletedCount": "مضيفين {{count}} محذوفين", - "failedToDeleteCount": "فشل في حذف مضيفين {{count}}", - "duplicatedHost": "مكررة \"{{name}}\"", - "failedToDuplicateHost": "فشل في تكرار المضيف", - "updatedCount": "تم تحديث مستضيفين {{count}}", - "friendlyNameLabel": "الاسم الودي", - "descriptionLabel": "الوصف", - "loadingHost": "جاري تحميل المضيف...", - "loadingHosts": "جاري تحميل المضيفين...", - "loadingCredentials": "جاري تحميل البيانات...", - "noHostsYet": "لا يوجد مضيفين بعد", - "noHostsMatchSearch": "لا يوجد مضيف يطابق بحثك", - "hostNotFound": "لم يتم العثور على المضيف", - "searchHosts": "البحث عن المضيفين...", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "سمات", + "moveMenu": "يتحرك", + "connectSelected": "Connect", + "cancelSelection": "يلغي", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "فرز المضيفين", "sortDefault": "الترتيب الافتراضي", "sortNameAsc": "الاسم (من الألف إلى الياء)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "نفق", "filterFeatureDocker": "عامل ميناء", "filterTagsGroup": "الوسوم", - "shareHost": "مشاركة المضيف", - "shareHostTitle": "مشاركة: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "يجب أن يستخدم هذا المضيف بيانات اعتماد لتمكين المشاركة. تحرير المضيف وتعيين بيانات الاعتماد أولاً." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "اتصال", - "authentication": "المصادقة", - "connectionSettings": "إعدادات الاتصال", - "displaySettings": "اعدادات العرض", - "audioSettings": "إعدادات الصوت", - "rdpPerformance": "أداء RDP", - "deviceRedirection": "إعادة توجيه الجهاز", - "session": "الجلسة", - "gateway": "البوابة", - "remoteApp": "التطبيق البعيد", - "clipboard": "الحافظة", - "sessionRecording": "تسجيل الجلسة", - "wakeOnLan": "إيقاظ-الشبكة المحلية", - "vncSettings": "إعدادات VNC", - "terminalSettings": "إعدادات المحطة الطرفية", - "rdpPort": "منفذ RDP", - "username": "اسم المستخدم", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "بيانات الاعتماد", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "كلمة المرور", - "domain": "النطاق", - "securityMode": "وضع الأمان", - "colorDepth": "عمق اللون", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "الارتفاع", - "dpi": "إدارة", - "resizeMethod": "طريقة تغيير الحجم", - "clientName": "اسم العميل", - "initialProgram": "البرنامج الأولي", - "serverLayout": "تخطيط الخادم", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "منفذ البوابة", - "gatewayUsername": "اسم مستخدم البوابة", - "gatewayPassword": "كلمة مرور البوابة", - "gatewayDomain": "نطاق البوابة", - "remoteAppProgram": "برنامج التطبيقات البعيدة", - "workingDirectory": "دليل العمل", - "arguments": "حجج", - "normalizeLineEndings": "تطبيع نهاية الخط", - "recordingPath": "مسار التسجيل", - "recordingName": "اسم التسجيل", - "macAddress": "عنوان MAC", - "broadcastAddress": "عنوان البث", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "وقت الانتظار (ات)", - "driveName": "اسم القرص", - "drivePath": "مسار القيادة", - "ignoreCertificate": "تجاهل الشهادة", - "ignoreCertificateDesc": "السماح بالاتصالات للمضيفين الذين لديهم شهادات توقيع ذاتي", - "forceLossless": "إجبار بلا خسارة", - "forceLosslessDesc": "فرض ترميز الصور الخاسرة (جودة أعلى، عرض النطاق الترددي)", - "disableAudio": "تعطيل الصوت", - "disableAudioDesc": "كتم كل الصوت من الجلسة البعيدة", - "enableAudioInput": "تمكين إدخال الصوت (الميكروفون)", - "enableAudioInputDesc": "إعادة توجيه الميكروفون المحلي إلى الجلسة البعيدة", - "wallpaper": "الخلفية", - "wallpaperDesc": "إظهار خلفية سطح المكتب (تعطيل تحسين الأداء)", - "theming": "القالب", - "themingDesc": "تمكين السمات والأنماط المرئية", - "fontSmoothing": "تمزيق الخط", - "fontSmoothingDesc": "تمكين عرض خط CleType", - "fullWindowDrag": "سحب النافذة الكاملة", - "fullWindowDragDesc": "إظهار محتويات النافذة أثناء السحب", - "desktopComposition": "تكوين سطح المكتب", - "desktopCompositionDesc": "تمكين تأثيرات الزجاج الهوائي", - "menuAnimations": "الرسوم المتحركة للقائمة", - "menuAnimationsDesc": "تمكين تلاشي القائمة والرسوم المتحركة للشريحة", - "disableBitmapCaching": "تعطيل التخزين المؤقت لخرائط Bitmap", - "disableBitmapCachingDesc": "إيقاف تشغيل ذاكرة التخزين المؤقت للخرائط (قد تساعد في اللقائق)", - "disableOffscreenCaching": "تعطيل التخزين المؤقت لإغلاق الشاشة", - "disableOffscreenCachingDesc": "إيقاف تشغيل ذاكرة التخزين المؤقت", - "disableGlyphCaching": "تعطيل التخزين المؤقت لـ Glyph", - "disableGlyphCachingDesc": "إيقاف تشغيل ذاكرة التخزين المؤقت", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "استخدام خط أنابيب الرسومات عن بعد", - "enablePrinting": "تمكين الطباعة", - "enablePrintingDesc": "إعادة توجيه الطابعات المحلية إلى الجلسة البعيدة", - "enableDriveRedirection": "تمكين إعادة توجيه القرص", - "enableDriveRedirectionDesc": "خريطة مجلد محلي كمحرك أقراص في الجلسة البعيدة", - "createDrivePath": "إنشاء مسار محرك الأقراص", - "createDrivePathDesc": "إنشاء المجلد تلقائياً إذا كان غير موجود", - "disableDownload": "تعطيل التحميل", - "disableDownloadDesc": "منع تحميل الملفات من الجلسة البعيدة", - "disableUpload": "تعطيل التحميل", - "disableUploadDesc": "منع تحميل الملفات إلى الجلسة البعيدة", - "enableTouch": "تمكين اللمس", - "enableTouchDesc": "تمكين إعادة توجيه الإدخال اللمس", - "consoleSession": "وحدة التحكم", - "consoleSessionDesc": "الاتصال بوحدة التحكم (الجلسة 0) بدلاً من جلسة جديدة", - "sendWolPacket": "إرسال حزمة WOL", - "sendWolPacketDesc": "إرسال حزمة سحرية لإيقاظ هذا المضيف قبل الاتصال", - "disableCopy": "تعطيل النسخ", - "disableCopyDesc": "منع نسخ النص من الجلسة البعيدة", - "disablePaste": "تعطيل اللصق", - "disablePasteDesc": "منع لصق النص في الجلسة البعيدة", - "createPathIfMissing": "إنشاء مسار إذا كان مفقودا", - "createPathIfMissingDesc": "إنشاء دليل التسجيل تلقائياً", - "excludeOutput": "استبعاد المخرجات", - "excludeOutputDesc": "عدم تسجيل إخراج الشاشة (بيانات التعريف فقط)", - "excludeMouse": "استبعاد الفأرة", - "excludeMouseDesc": "لا تسجل حركات الماوس", - "includeKeystrokes": "تضمين لوحة المفاتيح", - "includeKeystrokesDesc": "سجل المفاتيح الخام بالإضافة إلى إخراج الشاشة", - "vncPort": "منفذ VNC", - "vncPassword": "كلمة مرور VNC", - "vncUsernameOptional": "اسم المستخدم (اختياري)", - "vncLeaveBlank": "اتركه فارغاً إذا لم يكن مطلوباً", - "cursorMode": "وضع المؤشر", - "swapRedBlue": "مبادلة Red/Bأزرق", - "swapRedBlueDesc": "مبادلة قنوات اللون الأحمر والأزرق (إصلاح بعض مشاكل الألوان)", - "readOnly": "قراءة فقط", - "readOnlyDesc": "عرض الشاشة البعيدة دون إرسال أي إدخال", - "telnetPort": "منفذ شبكة الاتصال", - "terminalType": "نوع المحطة الطرفية", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "مخطط الألوان", - "backspaceKey": "مفتاح الخلفية", - "saveHostFirst": "حفظ المضيف أولاً.", - "sharingOptionsAfterSave": "خيارات المشاركة متاحة بعد أن يتم حفظ المضيف.", - "sharingLoadError": "فشل تحميل البيانات التشاركية. تحقق من اتصالك وحاول مرة أخرى.", - "shareHostSection": "مشاركة المضيف", - "shareWithUser": "مشاركة مع المستخدم", - "shareWithRole": "مشاركة مع الدور", - "selectUser": "حدد المستخدم", - "selectRole": "اختيار دور", - "selectUserOption": "اختر مستخدم...", - "selectRoleOption": "اختر دور...", - "permissionLevel": "مستوى الإذن", - "expiresInHours": "تنتهي في (ساعات)", - "noExpiryPlaceholder": "اتركه فارغاً لعدم انتهاء الصلاحية", - "shareBtn": "مشاركة", - "currentAccess": "الوصول الحالي", - "typeHeader": "نوع", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "الصلاحية", - "grantedByHeader": "ممنوح من قبل", - "expiresHeader": "تنتهي", - "noAccessEntries": "لا توجد إدخالات الدخول حتى الآن.", - "expiredLabel": "منتهية", - "neverLabel": "لا", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "إلغاء", - "savingBtn": "حفظ...", - "updateHostBtn": "تحديث المضيف", - "addHostBtn": "إضافة مضيف" + "cancelBtn": "يلغي", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "البحث عن المضيفين، الأوامر، أو الإعدادات...", - "quickActions": "الإجراءات السريعة", - "hostManager": "مدير المضيف", - "hostManagerDesc": "إدارة أو إضافة أو تحرير المضيفين", - "addNewHost": "إضافة مضيف جديد", - "addNewHostDesc": "تسجيل مضيف جديد", - "adminSettings": "إعدادات المدير", - "adminSettingsDesc": "تهيئة تفضيلات النظام والمستخدمين", - "userProfile": "الملف الشخصي للمستخدم", - "userProfileDesc": "إدارة الحساب والتفضيلات الخاصة بك", - "addCredential": "إضافة بيانات اعتماد", - "addCredentialDesc": "تخزين مفاتيح SSH أو كلمات المرور", - "recentActivity": "النشاط الأخير", - "serversAndHosts": "الخوادم والمستضيفين", - "noHostsFound": "لم يتم العثور على مضيفين مطابقين \"{{search}}\"", - "links": "الروابط", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "حدد", - "toggleWith": "تبديل مع" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "لم يتم تعيين علامة تبويب", + "noTabAssigned": "No tab assigned", "focusedPane": "اللوحة النشطة" }, "connections": { "noConnections": "لا توجد اتصالات", "noConnectionsDesc": "افتح نافذة طرفية أو مدير ملفات أو سطح مكتب بعيد لعرض الاتصالات هنا", - "connectedFor": "متصل لمدة {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "متصل", "disconnected": "غير متصل", "closeTab": "إغلاق علامة التبويب", @@ -801,358 +981,374 @@ "sectionBackground": "خلفية", "backgroundDesc": "تستمر الجلسات لمدة 30 دقيقة بعد قطع الاتصال ويمكن إعادة الاتصال بها.", "persisted": "استمر في الخلفية", - "expiresIn": "تنتهي صلاحيتها في {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "ابحث عن الاتصالات...", - "noSearchResults": "لا توجد نتائج مطابقة لبحثك" + "noSearchResults": "لا توجد نتائج مطابقة لبحثك", + "rename": "Rename session" }, "guacamole": { - "connecting": "جاري الاتصال بجلسة {{type}}...", - "connectionError": "خطأ في الاتصال", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "فشل الاتصال", - "failedToConnect": "فشل الحصول على رمز الاتصال", - "hostNotFound": "لم يتم العثور على المضيف", - "noHostSelected": "لم يتم اختيار مضيف", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "إعادة الاتصال", "retry": "إعادة المحاولة", - "guacdUnavailable": "خدمة سطح المكتب البعيد (guacd) غير متوفرة. الرجاء التأكد من تشغيل guacd وإمكانية الوصول إليه وتكوين بشكل صحيح في إعدادات المسؤول.", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "الفوز +L (شاشة القفل)", - "winKey": "مفتاح Windows", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "تبديل", - "win": "فوز", - "stickyActive": "{{key}} (مزج - انقر للإصدار)", - "stickyInactive": "{{key}} (انقر إلى لاتش)", - "esc": "الهروب", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "المنزل", - "end": "نهاية", - "pageUp": "الصفحة لأعلى", - "pageDown": "أسفل الصفحة", - "arrowUp": "السهم للأعلى", - "arrowDown": "السهم للأسفل", - "arrowLeft": "السهم لليسار", - "arrowRight": "سهم يمين", - "fnToggle": "مفاتيح الدوال", - "reconnect": "جلسة إعادة الاتصال", - "collapse": "طي شريط الأدوات", - "expand": "توسيع شريط الأدوات", - "dragHandle": "اسحب لتغيير الموضع" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "الاتصال بالمضيف", - "clear": "مسح", - "paste": "لصق", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "إعادة الاتصال", - "connectionLost": "تم فقدان الاتصال", + "connectionLost": "Connection lost", "connected": "متصل", - "clipboardWriteFailed": "فشل النسخ إلى الحافظة. تأكد من خدمة الصفحة عبر HTTPS أو localhost.", - "clipboardReadFailed": "فشل في القراءة من الحافظة. تأكد من منح أذونات الحافظة.", - "clipboardHttpWarning": "لصق يتطلب HTTPS. استخدم Ctrl+Shift+V أو خدمة Termix عبر HTTPS.", - "unknownError": "حدث خطأ غير معروف", - "websocketError": "خطأ في اتصال WebSocket", - "connecting": "جاري الاتصال...", - "noHostSelected": "لم يتم اختيار مضيف", - "reconnecting": "إعادة الاتصال... ({{attempt}}/{{max}})", - "reconnected": "تمت إعادة الاتصال بنجاح", - "tmuxSessionCreated": "تم إنشاء جلسة tmux: {{name}}", - "tmuxSessionAttached": "جلسة tmux المرفقة: {{name}}", - "tmuxUnavailable": "لم يتم تثبيت tmux على المضيف البعيد، العودة إلى قذيفة عادية", - "tmuxSessionPickerTitle": "جلسات tmux", - "tmuxSessionPickerDesc": "جلسات tmux الموجودة على هذا المضيف. حدد واحدة لإعادة إرفاق أو إنشاء جلسة جديدة.", - "tmuxWindows": "ويندوز", - "tmuxWindowCount": "{{count}} نافذة", - "tmuxAttached": "العملاء الملحقون", - "tmuxAttachedCount": "مرفق {{count}}", - "tmuxLastActivity": "آخر نشاط", - "tmuxTimeJustNow": "الآن فقط", - "tmuxTimeMinutes": "{{count}}منذ شهر", - "tmuxTimeHours": "{{count}}منذ ساعة", - "tmuxTimeDays": "{{count}}منذ يوم", - "tmuxCreateNew": "بدء جلسة جديدة", - "tmuxCopyHint": "ضبط التحديد واضغط على Enter للنسخ إلى الحافظة", - "tmuxDetach": "فصل من جلسة tmux", - "tmuxDetached": "منفصلة عن جلسة tmux", - "maxReconnectAttemptsReached": "تم بلوغ الحد الأقصى لمحاولات إعادة الاتصال", - "closeTab": "أغلق", - "connectionTimeout": "مهلة الاتصال", - "terminalTitle": "المحطة الطرفية - {{host}}", - "terminalWithPath": "المحطة الطرفية - {{host}}:{{path}}", - "runTitle": "تشغيل {{command}} - {{host}}", - "totpRequired": "المصادقة الثنائية مطلوبة", - "totpCodeLabel": "رمز التحقق", - "totpVerify": "تحقق", - "warpgateAuthRequired": "مطلوب مصادقة التحذير", - "warpgateSecurityKey": "مفتاح الأمان", - "warpgateAuthUrl": "رابط المصادقة", - "warpgateOpenBrowser": "فتح في المتصفح", - "warpgateContinue": "لقد أكملت المصادقة", - "opksshAuthRequired": "المصادقة مفتوحة مطلوبة", - "opksshAuthDescription": "أكمل المصادقة في المتصفح الخاص بك للمتابعة. ستبقى هذه الجلسة صالحة لمدة 24 ساعة.", - "opksshOpenBrowser": "فتح المتصفح للمصادقة", - "opksshWaitingForAuth": "في انتظار المصادقة في المتصفح...", - "opksshAuthenticating": "جاري معالجة المصادقة...", - "opksshTimeout": "انتهت مهلة المصادقة. الرجاء المحاولة مرة أخرى.", - "opksshAuthFailed": "فشلت المصادقة. الرجاء التحقق من بيانات الاعتماد الخاصة بك وحاول مرة أخرى.", - "opksshSignInWith": "تسجيل الدخول باستخدام {{provider}}", - "sudoPasswordPopupTitle": "إدراج كلمة المرور؟", - "websocketAbnormalClose": "تم إغلاق الاتصال بشكل غير متوقع. قد يكون ذلك بسبب مشكلة اعدادات الوكيل العكسي أو SSL. الرجاء التحقق من سجلات الخادم.", - "connectionLogTitle": "سجل الاتصال", - "connectionLogCopy": "نسخ السجلات إلى الحافظة", - "connectionLogEmpty": "لا توجد سجلات اتصال بعد", - "connectionLogWaiting": "في انتظار سجلات الاتصال...", - "connectionLogCopied": "سجلات الاتصال نسخت إلى الحافظة", - "connectionLogCopyFailed": "فشل في نسخ السجلات إلى الحافظة", - "connectionRejected": "تم رفض الاتصال بواسطة الخادم. الرجاء التحقق من المصادقة الخاصة بك وتكوين الشبكة.", - "hostKeyRejected": "تم رفض التحقق من مفتاح المضيف SSH. تم إلغاء الاتصال.", - "sessionTakenOver": "تم فتح الجلسة في علامة تبويب أخرى. إعادة الاتصال..." + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "يفتح", + "linkDialogCopy": "ينسخ", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "علامة تبويب مقسمة", + "addToSplit": "أضف إلى التقسيم", + "removeFromSplit": "أزل من التقسيم" + } }, "fileManager": { - "noHostSelected": "لم يتم اختيار مضيف", - "initializingEditor": "تهيئة المحرر...", - "file": "ملف", - "folder": "مجلد", - "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": "إعادة تسمية", - "uploading": "تحميل...", - "uploadingFile": "تحميل {{name}}...", - "fileName": "اسم الملف", - "folderName": "اسم المجلد", - "fileUploadedSuccessfully": "الملف \"{{name}}تم تحميله بنجاح", - "failedToUploadFile": "فشل في تحميل الملف", - "fileDownloadedSuccessfully": "الملف \"{{name}}تم تنزيله بنجاح", - "failedToDownloadFile": "فشل تنزيل الملف", - "fileCreatedSuccessfully": "تم إنشاء الملف \"{{name}}بنجاح", - "folderCreatedSuccessfully": "المجلد \"{{name}}\" تم إنشاؤه بنجاح", - "failedToCreateItem": "فشل إنشاء العنصر", - "operationFailed": "فشلت العملية {{operation}} ل {{name}}: {{error}}", - "failedToResolveSymlink": "فشل حل الارتباط الرمزي", - "itemsDeletedSuccessfully": "تم حذف {{count}} عنصرًا بنجاح", - "failedToDeleteItems": "فشل حذف العناصر", - "sudoPasswordRequired": "كلمة مرور المسؤول مطلوبة", - "enterSudoPassword": "أدخل كلمة مرور sudo لمتابعة هذه العملية", - "sudoPassword": "كلمة المرور", - "sudoOperationFailed": "فشلت عملية سودو", - "sudoAuthFailed": "فشل مصادقة سودو", - "dragFilesToUpload": "إسقاط الملفات هنا لتحميل", - "emptyFolder": "هذا المجلد فارغ", - "searchFiles": "البحث في الملفات...", - "upload": "تحميل", - "selectHostToStart": "حدد المضيف لبدء إدارة الملفات", - "sshRequiredForFileManager": "مدير الملفات يتطلب SSH. هذا المضيف ليس لديه SSH مفعل.", - "failedToConnect": "فشل الاتصال بSSH", - "failedToLoadDirectory": "فشل تحميل الدليل", - "noSSHConnection": "لا يوجد اتصال SSH متوفر", - "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}}؟", - "permissionDenied": "تم رفض الإذن", - "serverError": "خطأ في الخادم", - "fileSavedSuccessfully": "تم حفظ الملف بنجاح", - "failedToSaveFile": "فشل في حفظ الملف", - "confirmDeleteSingleItem": "هل أنت متأكد من أنك تريد حذف \"{{name}}\" بشكل دائم؟", - "confirmDeleteMultipleItems": "هل أنت متأكد من أنك تريد حذف العناصر {{count}} نهائياً؟", - "confirmDeleteMultipleItemsWithFolders": "هل أنت متأكد من أنك تريد حذف العناصر {{count}} نهائيًا؟ هذا يشمل المجلدات ومحتوياتها.", - "confirmDeleteFolder": "هل أنت متأكد من أنك تريد حذف المجلد \"{{name}}\" و جميع محتوياته؟", - "permanentDeleteWarning": "لا يمكن التراجع عن هذا الإجراء. سيتم حذف العنصر (العناصر) بشكل دائم من الخادم.", - "recent": "حديثاً", - "pinned": "مثبتة", - "folderShortcuts": "اختصارات المجلد", - "failedToReconnectSSH": "فشل في إعادة الاتصال بجلسة SSH", - "openTerminalHere": "فتح المحطة الطرفية هنا", - "run": "تشغيل", - "openTerminalInFolder": "فتح المحطة الطرفية في هذا المجلد", - "openTerminalInFileLocation": "فتح المحطة الطرفية في موقع الملف", - "runningFile": "قيد التشغيل - {{file}}", - "onlyRunExecutableFiles": "يمكن فقط تشغيل الملفات القابلة للتنفيذ", - "directories": "المجلدات", - "removedFromRecentFiles": "إزالة \"{{name}}\" من الملفات الأخيرة", - "removeFailed": "فشل الإزالة", - "unpinnedSuccessfully": "تم إلغاء تثبيت \"{{name}}بنجاح", - "unpinFailed": "فشل إلغاء التثبيت", - "removedShortcut": "إزالة الاختصار\"{{name}}\"", - "removeShortcutFailed": "فشل إزالة الاختصار", - "clearedAllRecentFiles": "مسح جميع الملفات الأخيرة", - "clearFailed": "فشل المسح", - "removeFromRecentFiles": "إزالة من الملفات الأخيرة", - "clearAllRecentFiles": "مسح جميع الملفات الأخيرة", - "unpinFile": "إلغاء تثبيت الملف", - "removeShortcut": "إزالة الاختصار", - "pinFile": "تثبيت ملف", - "addToShortcuts": "إضافة إلى الاختصارات", - "pasteFailed": "فشل اللصق", - "noUndoableActions": "لا إجراءات غير قابلة للإلغاء", - "undoCopySuccess": "عملية نسخ غير منسوخة: الملفات المحذوفة {{count}} منسوخة", - "undoCopyFailedDelete": "فشل التراجع: لا يمكن حذف أي ملفات تم نسخها", - "undoCopyFailedNoInfo": "فشل التراجع: لم يتم العثور على معلومات الملفات المنسوخة", - "undoMoveSuccess": "إلغاء تشغيل النقل: نقل الملفات {{count}} إلى الموقع الأصلي", - "undoMoveFailedMove": "فشل التراجع: لا يمكن نقل أي ملفات إلى الوراء", - "undoMoveFailedNoInfo": "فشل التراجع: تعذر العثور على معلومات الملف المنقولة", - "undoDeleteNotSupported": "لا يمكن التراجع عن عملية الحذف: تم حذف الملفات نهائيا من الخادم", - "undoTypeNotSupported": "نوع عملية التراجع غير مدعوم", - "undoOperationFailed": "فشلت عملية التراجع", - "unknownError": "خطأ غير معروف", - "confirm": "تأكيد", - "find": "العثور على...", - "replace": "استبدل", - "downloadInstead": "تحميل بدلاً من ذلك", - "keyboardShortcuts": "اختصارات لوحة المفاتيح", - "searchAndReplace": "البحث والاستبدال", - "editing": "تحرير", - "search": "البحث", - "findNext": "البحث عن التالي", - "findPrevious": "البحث عن السابق", - "save": "حفظ", - "selectAll": "حدد الكل", - "undo": "التراجع", - "redo": "إعادة", - "moveLineUp": "تحريك الخط للأعلى", - "moveLineDown": "تحريك الخط للأسفل", - "toggleComment": "تبديل التعليق", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "ينسخ", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "مثبت", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "يجري", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "فشل في تحميل الصورة", - "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": "جارٍ تحميل مقارنة الملفات...", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "يتحرك", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "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": "تغيير الأذونات", - "currentPermissions": "الأذونات الحالية", - "owner": "المالك", - "group": "مجموعة", - "others": "أخرى", - "read": "قراءة", - "write": "كتابة", - "execute": "تنفيذ", - "permissionsChangedSuccessfully": "تم تغيير الأذونات بنجاح", - "failedToChangePermissions": "فشل في تغيير الأذونات", - "name": "الاسم", - "sortByName": "الاسم", - "sortByDate": "تاريخ التعديل", - "sortBySize": "الحجم", - "ascending": "تصاعدي", - "descending": "تنازلي", - "root": "جذر", - "new": "جديد", - "sortBy": "الترتيب حسب", - "items": "بنود", - "selected": "محدد", - "editor": "محرر", - "octal": "اغسطس", - "storage": "التخزين", - "disk": "قرص", - "used": "مستخدم", - "of": "من", - "toggleSidebar": "تبديل الشريط الجانبي", - "cannotLoadPdf": "لا يمكن تحميل PDF", - "pdfLoadError": "حدث خطأ أثناء تحميل ملف PDF هذا.", - "loadingPdf": "تحميل PDF...", - "loadingPage": "تحميل الصفحة..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "انسخ إلى المضيف…", - "moveToHost": "انتقل إلى المضيف…", - "copyItemsToHost": "انسخ {{count}} عنصرًا إلى المضيف…", - "moveItemsToHost": "انقل {{count}} عنصرًا إلى المضيف…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "لا توجد مضيفات أخرى لإدارة الملفات متاحة.", "noHostsConnectedHint": "أضف مضيف SSH آخر مع تمكين مدير الملفات في مدير المضيف.", "selectDestinationHost": "حدد المضيف الوجهة", @@ -1164,48 +1360,48 @@ "browseDestination": "تصفح أو أدخل المسار", "confirmCopy": "ينسخ", "confirmMove": "يتحرك", - "transferring": "نقل…", - "compressing": "ضغط…", - "extracting": "استخراج…", - "transferringItems": "نقل {{current}} من {{total}} عنصر…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "اكتملت عملية النقل", "transferError": "فشلت عملية النقل", - "transferPartial": "اكتمل النقل بدون أخطاء {{count}}", - "transferPartialHint": "تعذر التحويل: {{paths}}", - "itemsSummary": "{{count}} عناصر", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "يجب أن تكون الوجهة دليلاً لعمليات نقل العناصر المتعددة", "selectThisFolder": "حدد هذا المجلد", "browsePathWillBeCreated": "هذا المجلد غير موجود بعد. سيتم إنشاؤه عند بدء عملية النقل.", "browsePathError": "تعذر فتح هذا المسار على المضيف الوجهة.", "goUp": "اصعد للأعلى", - "copyFolderToHost": "انسخ المجلد إلى المضيف…", - "moveFolderToHost": "انقل المجلد إلى المضيف…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "مستعد", - "hostConnecting": "جارٍ الاتصال…", + "hostConnecting": "Connecting…", "hostDisconnected": "غير متصل", "hostAuthRequired": "يلزم المصادقة — افتح مدير الملفات على هذا المضيف أولاً", "hostConnectionFailed": "فشل الاتصال", "metricsTitle": "مواعيد الانتقال", - "metricsPrepare": "تجهيز الوجهة: {{duration}}", - "metricsCompress": "الضغط على المصدر: {{duration}}", - "metricsHopSourceRead": "المصدر ← الخادم: {{throughput}}", - "metricsHopDestSftpWrite": "الخادم → الوجهة (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "الخادم → الوجهة (محلي): {{throughput}}", - "metricsTransfer": "من البداية إلى النهاية: {{throughput}} ({{duration}})", - "metricsExtract": "استخراج البيانات في الوجهة: {{duration}}", - "metricsSourceDelete": "إزالة من المصدر: {{duration}}", - "metricsTotal": "المجموع: {{duration}}", - "progressCompressing": "الضغط على المضيف المصدر…", - "progressExtracting": "جارٍ الاستخراج في الوجهة…", - "progressTransferring": "نقل البيانات…", - "progressReconnecting": "إعادة الاتصال…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "مسارات نقل متوازية", - "parallelSegmentsOption": "{{count}} ممرات", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "يتم تقسيم الملفات الكبيرة إلى أجزاء بحجم 256 ميجابايت. تستخدم المسارات المتعددة اتصالات منفصلة (مثل بدء عمليات نقل متعددة) لزيادة الإنتاجية الإجمالية.", - "progressTotalSpeed": "{{speed}} إجمالي ({{lanes}} مسارات)", - "progressTransferringItems": "نقل الملفات ({{current}} من {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} ملفات", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "تم الاحتفاظ بالملفات المصدرية (نقل جزئي)", "jumpHostLimitation": "يجب أن يكون كلا المضيفين قابلين للوصول من خادم Termix. لا يتم دعم التوجيه المباشر بين المضيفين.", "cancel": "يلغي", @@ -1216,25 +1412,25 @@ "methodAutoHint": "يختار بروتوكول tar أو SFTP لكل ملف بناءً على عدد الملفات وحجمها وقابليتها للضغط. أما الملفات المفردة فتستخدم دائمًا بروتوكول SFTP المتدفق.", "methodTarHint": "قم بضغط الملفات في المصدر، وانقل ملفًا واحدًا، ثم استخرجها في الوجهة. يتطلب ذلك استخدام برنامج tar على كلا جهازي Unix.", "methodItemSftpHint": "انقل كل ملف على حدة عبر بروتوكول نقل الملفات الآمن (SFTP). يعمل على جميع الأجهزة بما في ذلك نظام التشغيل ويندوز.", - "methodPreviewLoading": "طريقة حساب التحويل…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "تعذر معاينة طريقة النقل. سيختار الخادم طريقة النقل عند بدء العملية.", "methodPreviewWillUseTar": "سيتم استخدام: أرشيف Tar", "methodPreviewWillUseItemSftp": "سيتم استخدام: بروتوكول نقل الملفات الآمن (SFTP) لكل ملف", - "methodPreviewScanSummary": "{{fileCount}} ملف، {{totalSize}} إجمالي (تم فحصه على المضيف المصدر).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "يستخدم كل ملف نفس قناة SFTP المستخدمة في نسخ الملفات الفردية، واحداً تلو الآخر. يتم تجميع التقدم عبر جميع الملفات، لذا يتحرك الشريط ببطء أثناء نقل الملفات الكبيرة.", "methodReason": { "user_item_sftp": "لقد اخترت بروتوكول نقل الملفات الآمن (SFTP) لكل ملف على حدة.", "user_tar": "لقد اخترت ملف tar.", "tar_unavailable": "برنامج Tar غير متوفر على أحد المضيفين أو كليهما - سيتم استخدام SFTP لكل ملف بدلاً من ذلك.", "windows_host": "يتم استخدام مضيف يعمل بنظام ويندوز - لا يتم استخدام برنامج tar.", - "auto_multi_large": "تلقائي: ملفات متعددة بما في ذلك ملف كبير ({{largestSize}}) مع بيانات قابلة للضغط — حزم tar في عملية نقل واحدة.", - "auto_single_large_in_archive": "تلقائي: ملف واحد كبير ({{largestSize}}) في هذه المجموعة — SFTP لكل ملف.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "تلقائي: بيانات غير قابلة للضغط في الغالب - بروتوكول نقل الملفات الآمن (SFTP) لكل ملف.", - "auto_many_files": "تلقائي: العديد من الملفات ({{fileCount}}) — يقلل tar من الحمل الزائد لكل ملف.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "تلقائي: بروتوكول نقل الملفات الآمن (SFTP) لكل ملف لهذه المجموعة." }, "progressCancel": "يلغي", - "progressCancelling": "إلغاء…", + "progressCancelling": "Cancelling…", "progressStalled": "متوقف", "resumedHint": "تمت إعادة الاتصال بعملية نقل بيانات نشطة بدأت في نافذة أخرى.", "transferCancelled": "تم إلغاء التحويل", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "تم الاحتفاظ ببيانات جزئية على الوجهة. ستُستأنف المحاولة عند عودة الاتصال." }, "tunnels": { - "noSshTunnels": "لا توجد أنفاق SSH", - "createFirstTunnelMessage": "لم تقم بإنشاء أي أنفاق SSH حتى الآن. تكوين اتصالات الأنفاق في مدير المضيف للبدء.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "متصل", - "disconnected": "قطع", - "connecting": "جاري الاتصال...", - "error": "خطأ", - "canceling": "إلغاء...", - "connect": "الاتصال", - "disconnect": "قطع الاتصال", - "cancel": "إلغاء", - "port": "المنفذ", - "localPort": "المنفذ المحلي", - "remotePort": "المنفذ البعيد", - "currentHostPort": "منفذ المضيف الحالي", - "endpointPort": "منفذ نقطة النهاية", - "bindIp": "IP المحلي", - "endpointSshConfig": "تكوين SSH نقطة النهاية", - "endpointSshHost": "مضيف SSH نقطة النهاية", - "endpointSshHostPlaceholder": "حدد مضيف مكون", - "endpointSshHostRequired": "حدد مضيف SSH لنقطة النهاية لكل نفق عميل.", - "attempt": "محاولة {{current}} من {{max}}", - "nextRetryIn": "إعادة المحاولة التالية في {{seconds}} ثانية", - "clientTunnels": "أنفاق العميل", - "clientTunnel": "نفق العميل", - "addClientTunnel": "إضافة نفق للعميل", - "noClientTunnels": "لم يتم تكوين أنفاق العميل على هذا المكتب.", - "tunnelName": "اسم النفق", - "remoteHost": "المضيف البعيد", - "autoStart": "بدء التشغيل التلقائي", - "clientAutoStartDesc": "يبدأ عندما يفتح عميل سطح المكتب هذا ويبقى متصلا.", - "clientManualStartDesc": "استخدام البدء ووقف من هذا الصف. لا تفتحه Terمزيكس تلقائياً.", - "clientRemoteServerNote": "قد تتطلب إعادة التوجيه عن بعد AllowTcpForarding و بوابة المنافذ على خادم SSH نقطة النهائية. المنفذ البعيد يغلق عند قطع اتصال سطح المكتب.", - "clientTunnelStarted": "بدأ نفق العميل", - "clientTunnelStopped": "توقف نفق العميل", - "tunnelTestSucceeded": "نجاح اختبار النفق", - "tunnelTestFailed": "فشل اختبار النفق", - "localSaved": "أنفاق العميل المحفوظة", - "localSaveError": "فشل في حفظ أنفاق العميل المحلي", - "invalidBindIp": "يجب أن يكون IP المحلي عنوان IPv4 صالح.", - "invalidLocalTargetIp": "يجب أن يكون عنوان IP المستهدف المحلي عنوان IPv4 صالح.", - "invalidLocalPort": "يجب أن يكون المنفذ المحلي بين 1 و 65535.", - "invalidRemotePort": "يجب أن يكون المنفذ البعيد بين 1 و 65535.", - "invalidLocalTargetPort": "يجب أن يكون المنفذ المستهدف المحلي بين 1 و 65535.", - "invalidEndpointPort": "منفذ نقطة النهاية يجب أن يكون بين 1 و 65535.", - "duplicateAutoStartBind": "يمكن استخدام نفق عميل واحد لبدء التشغيل التلقائي فقط {{bind}}.", - "manualControlError": "فشل تحديث حالة النفق.", - "active": "نشط", - "start": "ابدأ", - "stop": "توقف", - "test": "اختبار", - "type": "نوع النفق", - "typeLocal": "محلي (-L)", - "typeRemote": "عن بعد (-R)", - "typeDynamic": "ديناميكية (-D)", - "typeServerLocalDesc": "المضيف الحالي إلى نقطة النهاية.", - "typeServerRemoteDesc": "نقطة العودة إلى المضيف الحالي.", - "typeClientLocalDesc": "كمبيوتر محلي لنهاية النقاش.", - "typeClientRemoteDesc": "نهاية العودة إلى الكمبيوتر المحلي.", - "typeClientDynamicDesc": "SOCKS على الكمبيوتر المحلي.", - "typeDynamicDesc": "إعادة توجيه حركة الاتصال SOCKS5 عبر SSH", - "forwardDescriptionServerLocal": "المضيف الحالي {{sourcePort}} → نقطة النهاية {{endpointPort}}.", - "forwardDescriptionServerRemote": "نقطة النهاية {{endpointPort}} → المضيف الحالي {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS على المضيف الحالي {{sourcePort}}.", - "forwardDescriptionClientLocal": "محلي {{sourcePort}} → {{endpointPort}} البعيد.", - "forwardDescriptionClientRemote": "عن بعد {{sourcePort}} → المحلي {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS على المنفذ المحلي {{sourcePort}}.", + "disconnected": "غير متصل", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "يلغي", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → جوارب عبر {{endpoint}}", - "autoNameClientLocal": "محلي {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → المحلي {{localPort}}", - "autoNameClientDynamic": "SOCKS {{localPort}} عبر {{endpoint}}", - "route": "المسار:", - "lastStarted": "بدأت آخر مرة", - "lastTested": "اختبارها الأخير", - "lastError": "آخر خطأ", - "maxRetries": "الحد الاقصى لمحاولات", - "maxRetriesDescription": "الحد الأقصى لمحاولات إعادة المحاولة.", - "retryInterval": "الفاصل الزمني لإعادة المحاولة (بالثواني)", - "retryIntervalDescription": "حان وقت الانتظار بين محاولات إعادة المحاولة.", - "local": "محلي", - "remote": "عن بعد", - "destination": "الوجهة", - "host": "المضيف", - "mode": "الوضع", - "noHostSelected": "لم يتم اختيار مضيف", - "working": "يعمل..." + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "المعالج", - "memory": "الذاكرة", - "disk": "قرص", - "network": "الشبكة", - "uptime": "وقت التحديث", - "processes": "العمليات", - "available": "متوفر", - "free": "مجاني", - "connecting": "جاري الاتصال...", - "connectionFailed": "فشل الاتصال بالخادم", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "{{count}} النواة", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "استخدام المعالج", - "memoryUsage": "استخدام الذاكرة", - "diskUsage": "استخدام القرص", - "failedToFetchHostConfig": "فشل في جلب إعدادات المضيف", - "serverOffline": "الخادم غير متصل", - "cannotFetchMetrics": "لا يمكن جلب المقاييس من الخادم غير متصل", - "totpFailed": "فشل التحقق من TOTP", - "noneAuthNotSupported": "إحصائيات الخادم لا تدعم نوع مصادقة 'لا شيء'.", - "load": "تحميل", - "systemInfo": "معلومات النظام", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "نظام التشغيل", - "kernel": "نواة", - "seconds": "ثواني", - "networkInterfaces": "واجهة الشبكة", - "noInterfacesFound": "لم يتم العثور على واجهات شبكة", - "noProcessesFound": "لم يتم العثور على عمليات", - "loginStats": "إحصائيات تسجيل دخول SSH", - "noRecentLoginData": "لا توجد بيانات تسجيل دخول حديثة", - "executingQuickAction": "تنفيذ {{name}}...", - "quickActionSuccess": "أكمل {{name}} بنجاح", - "quickActionFailed": "فشل {{name}}", - "quickActionError": "فشل في تنفيذ {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "منافذ الاستماع", - "protocol": "Protocol", - "port": "المنفذ", - "address": "العنوان", - "process": "العملية", - "noData": "لا توجد بيانات منافذ الاستماع" + "title": "Listening Ports", + "protocol": "بروتوكول", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "جدار الحماية", - "inactive": "غير نشط", - "policy": "السياسة", - "rules": "القواعد", - "noData": "لا تتوفر بيانات جدار الحماية", - "action": "اجراء", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "المنفذ", - "source": "المصدر", - "anywhere": "في أي مكان" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "متوسط التحميل", - "swap": "تبديل", - "architecture": "معماري", - "refresh": "تحديث", - "retry": "إعادة المحاولة" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "إعادة المحاولة", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "يجري", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "إدارة SSH وسطح المكتب عن بُعد ذاتية الاستضافة", - "loginTitle": "تسجيل الدخول إلى Termix", - "registerTitle": "إنشاء حساب", - "forgotPassword": "نسيت كلمة المرور؟", - "rememberMe": "تذكر الجهاز لمدة 30 يوما (يشمل TOTP)", - "noAccount": "ليس لديك حساب؟", - "hasAccount": "لديك حساب بالفعل؟", - "twoFactorAuth": "المصادقة الثنائية", - "enterCode": "أدخل رمز التحقق", - "backupCode": "أو استخدم رمز النسخ الاحتياطي", - "verifyCode": "التحقق من الرمز", - "redirectingToApp": "إعادة التوجيه إلى التطبيق...", - "sshAuthenticationRequired": "مطلوب مصادقة SSH", - "sshNoKeyboardInteractive": "المصادقة التفاعلية لوحة المفاتيح غير متوفرة", - "sshAuthenticationFailed": "فشل المصادقة", - "sshAuthenticationTimeout": "مهلة المصادقة", - "sshNoKeyboardInteractiveDescription": "الخادم لا يدعم مصادقة لوحة المفاتيح التفاعلية. الرجاء توفير كلمة المرور أو مفتاح SSH الخاص بك.", - "sshAuthFailedDescription": "بيانات الاعتماد المقدمة غير صحيحة. الرجاء المحاولة مرة أخرى باستخدام بيانات اعتماد صالحة.", - "sshTimeoutDescription": "انتهت مهلة محاولة المصادقة. الرجاء المحاولة مرة أخرى.", - "sshProvideCredentialsDescription": "الرجاء تقديم بيانات اعتماد SSH الخاصة بك للاتصال بهذا الخادم.", - "sshPasswordDescription": "أدخل كلمة المرور لهذا الاتصال SSH.", - "sshKeyPasswordDescription": "إذا تم تشفير مفتاح SSH الخاص بك، أدخل كلمة المرور هنا.", - "passphraseRequired": "كلمة المرور مطلوبة", - "passphraseRequiredDescription": "مفتاح SSH مشفر. الرجاء إدخال عبارة المرور لفتحها.", - "back": "الرجوع", - "firstUser": "المستخدم الأول", - "firstUserMessage": "أنت أول مستخدم وسيتم جعله مشرف. يمكنك عرض إعدادات المشرف في القائمة المنسدلة للمستخدم الجانبي. إذا كنت تعتقد أن هذا خطأ، تحقق من سجلات المرفأ، أو قم بإنشاء مشكلة GitHub .", - "external": "خارجي", - "loginWithExternal": "تسجيل الدخول مع المزود الخارجي", - "loginWithExternalDesc": "تسجيل الدخول باستخدام موفر الهوية الخارجي المعد الخاص بك", - "externalNotSupportedInElectron": "المصادقة الخارجية غير مدعومة في تطبيق إلكترون بعد. الرجاء استخدام إصدار الويب لتسجيل الدخول OIDC.", - "resetPasswordButton": "إعادة تعيين كلمة المرور", - "sendResetCode": "إرسال رمز إعادة التعيين", - "resetCodeDesc": "أدخل اسم المستخدم الخاص بك لتلقي رمز إعادة تعيين كلمة المرور. سيتم تسجيل الدخول في سجلات حاويات الجهاز التنزيلي.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "التحقق من الرمز", - "enterResetCode": "أدخل الرمز المكون من 6 أرقام من سجلات حاويات الجهاز للمستخدم:", - "newPassword": "كلمة المرور الجديدة", - "confirmNewPassword": "تأكيد كلمة المرور", - "enterNewPassword": "أدخل كلمة المرور الجديدة للمستخدم:", - "signUp": "تسجيل الدخول", - "desktopApp": "تطبيق سطح المكتب", - "loggingInToDesktopApp": "تسجيل الدخول إلى تطبيق سطح المكتب", - "loadingServer": "جاري تحميل الخادم...", - "dataLossWarning": "إعادة تعيين كلمة المرور بهذه الطريقة ستؤدي إلى حذف جميع مضيفي SSH المحفوظين، والاعتمادات، والبيانات المشفرة الأخرى. لا يمكن التراجع عن هذا الإجراء. استخدم هذا فقط إذا كنت قد نسيت كلمة المرور الخاصة بك ولم يتم تسجيل الدخول.", - "authenticationDisabled": "المصادقة معطلة", - "authenticationDisabledDesc": "جميع طرق المصادقة معطلة حاليا. الرجاء الاتصال بالمسؤول.", - "attemptsRemaining": "عدد المحاولات المتبقية: {{count}}" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "التحقق من مفتاح استضافة SSH", - "keyChangedWarning": "تم تغيير مفتاح المضيف SSH", - "firstConnectionTitle": "أول مرة تتصل بهذا المضيف", - "firstConnectionDescription": "لا يمكن إنشاء صحة هذا المضيف. تحقق من بصمة الإصبع تطابق ما تتوقعه.", - "keyChangedDescription": "مفتاح المضيف لهذا الخادم قد تغير منذ الاتصال الأخير. يمكن أن يشير هذا إلى مشكلة أمنية.", - "previousKey": "المفتاح السابق", - "newFingerprint": "بصمة جديدة", - "fingerprint": "بصمة", - "verifyInstructions": "إذا كنت تثق بهذا المضيف، انقر فوق قبول للمتابعة وحفظ بصمة الإصبع هذه للاتصال في المستقبل.", - "securityWarning": "تحذير الأمان", - "acceptAndContinue": "قبول ومتابعة", - "acceptNewKey": "قبول المفتاح الجديد ومتابعة" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "تعذر الاتصال بقاعدة البيانات", - "unknownError": "خطأ غير معروف", - "loginFailed": "فشل تسجيل الدخول", - "failedPasswordReset": "فشل في بدء إعادة تعيين كلمة المرور", - "failedVerifyCode": "فشل التحقق من إعادة تعيين الرمز", - "failedCompleteReset": "فشل في إكمال إعادة تعيين كلمة المرور", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "فشل في بدء تسجيل الدخول OIDC", - "silentSigninOidcUnavailable": "طلب تسجيل الدخول الصامت, ولكن تسجيل الدخول OIDC غير متوفر.", - "failedUserInfo": "فشل الحصول على معلومات المستخدم بعد تسجيل الدخول", - "oidcAuthFailed": "فشل مصادقة OIDC", - "invalidAuthUrl": "رابط تفويض غير صالح مستلم من الخلفية", - "requiredField": "هذا الحقل مطلوب", - "minLength": "الحد الأدنى للطول هو {{min}}", - "passwordMismatch": "كلمتا المرور غير متطابقتين", - "passwordLoginDisabled": "اسم المستخدم/كلمة المرور غير مفعل حاليا", - "sessionExpired": "انتهت صلاحية الجلسة - الرجاء تسجيل الدخول مرة أخرى", - "totpRateLimited": "معدل محدود: العديد من محاولات التحقق من TOTP. الرجاء المحاولة مرة أخرى لاحقاً.", - "totpRateLimitedWithTime": "تم تجاوز الحد المسموح به: عدد محاولات التحقق من رمز TOTP كبير جدًا. يُرجى الانتظار {{time}} ثانية قبل المحاولة مرة أخرى.", - "resetCodeRateLimited": "معدل محدود: العديد من محاولات التحقق. الرجاء المحاولة مرة أخرى لاحقاً.", - "resetCodeRateLimitedWithTime": "معدل محدود: العديد من محاولات التحقق. الرجاء الانتظار {{time}} ثانية قبل المحاولة مرة أخرى.", - "authTokenSaveFailed": "فشل في حفظ رمز المصادقة", - "failedToLoadServer": "فشل تحميل الخادم" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "تسجيل الحساب الجديد معطل حاليًا من قبل المسؤول. الرجاء تسجيل الدخول أو الاتصال بالمسؤول.", - "userNotAllowed": "حسابك غير مصرح له بالتسجيل. الرجاء الاتصال بالمسؤول.", - "databaseConnectionFailed": "فشل الاتصال بخادم قاعدة البيانات", - "resetCodeSent": "إعادة تعيين التعليمات البرمجية المرسلة إلى سجلات Docker", - "codeVerified": "تم التحقق من الرمز بنجاح", - "passwordResetSuccess": "تم إعادة تعيين كلمة المرور بنجاح", - "loginSuccess": "تم تسجيل الدخول بنجاح", - "registrationSuccess": "تم التسجيل بنجاح" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "أنفاق سطح المكتب المحلية التي تستهدف مضيفي SSH.", - "c2sTunnelPresets": "الإعدادات المسبقة للنفق للعميل", - "c2sTunnelPresetsDesc": "حفظ قائمة النفق المحلية لهذا العميل سطح المكتب كخادم مسبقا، أو تحميل الإعداد المسبق لهذا العميل مرة أخرى.", - "c2sTunnelPresetsUnavailable": "تتوفر الإعدادات المسبقة لنفق العميل فقط في عميل سطح المكتب.", - "c2sPresetName": "اسم الإعداد المسبق", - "c2sPresetNamePlaceholder": "اسم العميل المسبق", - "c2sPresetToLoad": "الإعداد المسبق للتحميل", - "c2sNoPresetSelected": "لم يتم تحديد الإعداد المسبق", - "c2sNoPresets": "لم يتم حفظ أي إعدادات مسبقة", - "c2sLoadPreset": "تحميل", - "c2sCurrentLocalConfig": "{{count}} تم تكوين نفق (أنفاق) العميل المحلي على سطح المكتب هذا.", - "c2sPresetSyncNote": "الإعداد المسبق عبارة عن لقطات واضحة؛ تحميل واحد يحل محل قائمة نفق عميل سطح المكتب هذه.", - "c2sPresetSaved": "تم حفظ الإعداد المسبق لنفق العميل", - "c2sPresetLoaded": "تم تحميل نفق العميل مسبقاً محلياً", - "c2sPresetRenamed": "تم إعادة تسمية نفق العميل مسبقاً", - "c2sPresetDeleted": "تم حذف الضبط المسبق لنفق العميل", - "c2sPresetLoadError": "فشل تحميل الإعدادات المسبقة لنفق العميل" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "اللغة", - "keyPassword": "كلمة مرور المفتاح", - "pastePrivateKey": "لصق المفتاح الخاص بك هنا...", - "localListenerHost": "127.0.0.1 (الاستماع محليا)", - "localTargetHost": "127-0.0.1 (الهدف على هذا الحاسوب)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "أدخل كلمة المرور", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "لوحة التحكم", - "loading": "تحميل لوحة التحكم...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "الدعم", - "discord": "ديسكورد", - "serverOverview": "نظرة عامة على الخادم", - "version": "الإصدار", - "upToDate": "حتى التاريخ", - "updateAvailable": "تحديث متوفر", - "beta": "بيتا", - "uptime": "وقت التحديث", - "database": "قاعدة البيانات", - "healthy": "صحي", - "error": "خطأ", - "totalHosts": "إجمالي المضيفين", - "totalTunnels": "إجمالي الأنفاق", - "totalCredentials": "مجموع بيانات الاعتماد", - "recentActivity": "النشاط الأخير", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "جاري تحميل النشاط الأخير...", - "noRecentActivity": "لا يوجد نشاط حديث", - "quickActions": "الإجراءات السريعة", - "addHost": "إضافة مضيف", - "addCredential": "إضافة بيانات اعتماد", - "adminSettings": "إعدادات المدير", - "userProfile": "الملف الشخصي للمستخدم", - "serverStats": "إحصائيات الخادم", - "loadingServerStats": "تحميل إحصائيات الخادم...", - "noServerData": "لا تتوفر بيانات الخادم", - "cpu": "المعالج", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "تخصيص لوحة التحكم", - "dashboardSettings": "إعدادات لوحة التحكم", - "enableDisableCards": "تمكين/تعطيل البطاقات", - "resetLayout": "إعادة التعيين إلى الافتراضي", - "serverOverviewCard": "نظرة عامة على الخادم", - "recentActivityCard": "النشاط الأخير", - "networkGraphCard": "رسم الشبكة", - "networkGraph": "رسم الشبكة", - "quickActionsCard": "الإجراءات السريعة", - "serverStatsCard": "إحصائيات الخادم", - "panelMain": "الرئيسية", - "panelSide": "جانب", - "justNow": "الآن فقط" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "ابدأ", - "hostsOnline": "المضيفون على الإنترنت", - "activeTunnels": "أنفاق نشطة", - "registerNewServer": "تسجيل خادم جديد", - "storeSshKeysOrPasswords": "تخزين مفاتيح SSH أو كلمات المرور", - "manageUsersAndRoles": "إدارة المستخدمين والأدوار", - "manageYourAccount": "إدارة حسابك", - "hostStatus": "حالة المضيف", - "noHostsConfigured": "لا يوجد مستضيفين تم تكوينهم", - "online": "ابدأ", - "offline": "ممنوع", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", "onlineLower": "متصل", "nodes": "{{count}} nodes", - "add": "إضافة:", - "commandPalette": "لوحة الأوامر", - "done": "تم", - "editModeInstructions": "اسحب البطاقات لإعادة الترتيب · اسحب موفر العمود لتغيير حجم الأعمدة · اسحب الحافة السفلية لبطاقة لتغيير حجم ارتفاعها · سلة المهملات لإزالة", - "empty": "فارغ", - "clear": "مسح" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "ينسخ", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "إضافة مضيف", - "addGroup": "إضافة مجموعة", - "addLink": "إضافة رابط", - "zoomIn": "تكبير في", - "zoomOut": "تكبير خارج", - "resetView": "إعادة تعيين العرض", - "selectHost": "حدد المضيف", - "chooseHost": "اختر مضيفاً...", - "parentGroup": "المجموعة الأصل", - "noGroup": "لا توجد مجموعة", - "groupName": "اسم المجموعة", - "color": "اللون", - "source": "المصدر", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "نقل إلى المجموعة", - "selectGroup": "حدد المجموعة...", - "addConnection": "إضافة اتصال", - "hostDetails": "تفاصيل المضيف", - "removeFromGroup": "إزالة من المجموعة", - "addHostHere": "إضافة مضيف هنا", - "editGroup": "تحرير المجموعة", - "delete": "حذف", - "add": "إضافة", - "create": "إنشاء", - "move": "نقل", - "connect": "الاتصال", - "createGroup": "إنشاء مجموعة", - "selectSourcePlaceholder": "حدد المصدر...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "يتحرك", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "ملف غير صالح", - "hostAlreadyExists": "المضيف موجود بالفعل في التوبولوجيا", - "connectionExists": "الاتصال موجود بالفعل", - "unknown": "غير معروف", - "name": "الاسم", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "الحالة", - "failedToAddNode": "فشل في إضافة العقدة", - "sourceDifferentFromTarget": "يجب أن يكون المصدر والهدف مختلفين", - "exportJSON": "تصدير JSON", - "importJSON": "استيراد JSON", - "terminal": "المحطة", + "status": "حالة", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "صالة", "fileManager": "مدير الملفات", "tunnel": "نفق", - "docker": "دوكر", - "serverStats": "إحصائيات الخادم", - "noNodes": "لا توجد عقدة بعد" + "docker": "عامل ميناء", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker غير مفعل لهذا المضيف", - "validating": "التحقق من دوكر...", - "connecting": "جاري الاتصال...", - "error": "خطأ", - "version": "روكر {{version}}", - "connectionFailed": "فشل الاتصال بـ Docker", - "containerStarted": "بدأ الحاوية {{name}}", - "failedToStartContainer": "فشل بدء تشغيل الحاوية {{name}}", - "containerStopped": "تم إيقاف الحاوية {{name}}", - "failedToStopContainer": "فشل في إيقاف الحاوية {{name}}", - "containerRestarted": "تم إعادة تشغيل الحاوية {{name}}", - "failedToRestartContainer": "فشل في إعادة تشغيل الحاوية {{name}}", - "containerPaused": "الحاوية {{name}} متوقفة مؤقتاً", - "containerUnpaused": "الحاوية {{name}} غير متوقفة مؤقتاً", - "failedToTogglePauseContainer": "فشل تبديل حالة الإيقاف المؤقت للحاوية {{name}}", - "containerRemoved": "تمت إزالة الحاوية {{name}}", - "failedToRemoveContainer": "فشل إزالة الحاوية {{name}}", - "image": "صورة", - "ports": "المنافذ", - "noPorts": "لا توجد منافذ", - "start": "ابدأ", - "confirmRemoveContainer": "هل أنت متأكد من أنك تريد إزالة الحاوية '{{name}}'؟ لا يمكن التراجع عن هذا الإجراء.", - "runningContainerWarning": "تحذير: هذه الحاوية قيد التشغيل حاليا. إزالتها ستوقف الحاوية أولاً.", - "loadingContainers": "تحميل الحاويات...", - "manager": "مدير الدوكر", - "autoRefresh": "تحديث تلقائي", - "timestamps": "الطوابع الزمنية", - "lines": "خطوط", - "filterLogs": "تصفية السجلات...", - "refresh": "تحديث", - "download": "تنزيل", - "clear": "مسح", - "logsDownloaded": "تم تنزيل السجلات بنجاح", - "last50": "آخر 50", - "last100": "آخر 100", - "last500": "آخر 500", - "last1000": "آخر 1000", - "allLogs": "جميع السجلات", - "noLogsMatching": "لا توجد سجلات مطابقة \"{{query}}\"", - "noLogsAvailable": "لا توجد سجلات متاحة", - "noContainersFound": "لم يتم العثور على حاويات", - "noContainersFoundHint": "لا توجد حاويات منصة للدفع متاحة على هذا المضيف", - "searchPlaceholder": "البحث في الحاويات...", - "allStatuses": "جميع الحالات", - "stateRunning": "تشغيل", - "statePaused": "متوقف", - "stateExited": "خروج", - "stateRestarting": "إعادة التشغيل", - "noContainersMatchFilters": "لا توجد حاويات تطابق الفلاتر الخاصة بك", - "noContainersMatchFiltersHint": "حاول تعديل معايير البحث أو التصفية الخاصة بك", - "failedToFetchStats": "فشل في جلب إحصائيات الحاويات", - "containerNotRunning": "الحاوية غير قيد التشغيل", - "startContainerToViewStats": "بدء تشغيل الحاوية لعرض الإحصاءات", - "loadingStats": "جاري تحميل الإحصاءات...", - "errorLoadingStats": "خطأ في تحميل الإحصاءات", - "noStatsAvailable": "لا تتوفر إحصائيات", - "cpuUsage": "استخدام المعالج", - "current": "الحالي", - "memoryUsage": "استخدام الذاكرة", - "networkIo": "الشبكة I/O", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "الناتج", - "blockIo": "حظر I/O", - "read": "قراءة", - "write": "كتابة", - "pids": "أرقام التعريف", - "containerInformation": "معلومات الحاوية", - "name": "الاسم", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "الولاية", - "containerMustBeRunning": "يجب أن يكون الحاوية قيد التشغيل للوصول إلى وحدة التحكم", - "verificationCodePrompt": "أدخل رمز التحقق", - "totpVerificationFailed": "فشل التحقق من TOTP. الرجاء المحاولة مرة أخرى.", - "warpgateVerificationFailed": "فشل مصادقة التحذير. الرجاء المحاولة مرة أخرى.", - "connectedTo": "متصل بـ {{containerName}}", - "disconnected": "قطع", - "consoleError": "خطأ في وحدة التحكم", - "errorMessage": "خطأ: {{message}}", - "failedToConnect": "فشل الاتصال بالحاوية", - "console": "وحدة", - "selectShell": "حدد قذيفة", - "bash": "باش", - "sh": "رماد", - "ash": "رماد", - "connect": "الاتصال", - "disconnect": "قطع الاتصال", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "غير متصل", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "غير متصل", - "clickToConnect": "انقر الاتصال لبدء جلسة قذيفة", - "connectingTo": "جاري الاتصال بـ {{containerName}}...", - "containerNotFound": "الحاوية غير موجودة", - "backToList": "العودة إلى القائمة", - "logs": "السجلات", - "stats": "إحصائيات", - "consoleTab": "وحدة", - "startContainerToAccess": "بدء تشغيل الحاوية للوصول إلى وحدة التحكم" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "عام", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "المستخدمون", - "sectionSessions": "الجلسات", - "sectionRoles": "الأدوار", - "sectionDatabase": "قاعدة البيانات", - "sectionApiKeys": "مفاتيح API", - "allowRegistration": "السماح بتسجيل المستخدم", - "allowRegistrationDesc": "السماح للمستخدمين الجدد بالتسجيل الذاتي", - "allowPasswordLogin": "السماح بتسجيل الدخول لكلمة المرور", - "allowPasswordLoginDesc": "اسم المستخدم/كلمة المرور", - "oidcAutoProvision": "توفير OIDC التلقائي", - "oidcAutoProvisionDesc": "إنشاء حسابات تلقائي لمستخدمي OIDC حتى عند تعطيل التسجيل", - "allowPasswordReset": "السماح بإعادة تعيين كلمة المرور", - "allowPasswordResetDesc": "إعادة تعيين التعليمات البرمجية عبر سجلات Docker", - "sessionTimeout": "مهلة الجلسة", - "hours": "ساعات", - "sessionTimeoutRange": "دقيقة 1 ساعة - الحد الأقصى 720 ساعة", - "monitoringDefaults": "مراقبة الافتراضات", - "statusCheck": "التحقق من الحالة", - "metrics": "القياسات", - "sec": "ثواني", - "logLevel": "مستوى السجل", - "enableGuacamole": "تمكين غواكامول", - "enableGuacamoleDesc": "سطح المكتب البعيد RDP/VNC", - "guacdUrl": "رابط guacd", - "oidcDescription": "تكوين اتصال OpenID لـ SSO. الحقول المعلّمة * مطلوبة.", - "oidcClientId": "معرف العميل", - "oidcClientSecret": "سر العميل", - "oidcAuthUrl": "رابط التخويل", - "oidcIssuerUrl": "رابط المصدر", - "oidcTokenUrl": "رابط الرمز المميز", - "oidcUserIdentifier": "مسار معرف المستخدم", - "oidcDisplayName": "عرض مسار الاسم", - "oidcScopes": "النطاقات", - "oidcUserinfoUrl": "تجاوز رابط معلومات المستخدم", - "oidcAllowedUsers": "المستخدمين المسموح بهم", - "oidcAllowedUsersDesc": "بريد إلكتروني واحد لكل سطر. اتركه فارغاً للسماح للجميع.", - "removeOidc": "إزالة", - "usersCount": "{{count}} مستخدمون", - "createUser": "إنشاء", - "newRole": "دور جديد", - "roleName": "الاسم", - "roleDisplayName": "اسم العرض", - "roleDescription": "الوصف", - "rolesCount": "أدوار {{count}}", - "createRole": "إنشاء", - "creating": "إنشاء...", - "exportDatabase": "تصدير قاعدة البيانات", - "exportDatabaseDesc": "تحميل نسخة احتياطية من جميع المضيفين ووثائق الاعتماد والإعدادات", - "export": "تصدير", - "exporting": "تصدير...", - "importDatabase": "استيراد قاعدة البيانات", - "importDatabaseDesc": "استعادة من ملف النسخ الاحتياطي sqlite", - "importDatabaseSelected": "مختار: {{name}}", - "selectFile": "حدد ملف", - "changeFile": "تغيير", - "import": "استيراد", - "importing": "استيراد...", - "apiKeysCount": "مفاتيح {{count}}", - "newApiKey": "مفتاح API جديد", - "apiKeyCreatedWarning": "تم إنشاء المفتاح - انسخه الآن، لن يظهر مرة أخرى.", - "apiKeyName": "الاسم", - "apiKeyUser": "المستخدم", - "apiKeySelectUser": "اختر مستخدم...", - "apiKeyExpiresAt": "تنتهي في", - "createKey": "إنشاء مفتاح", - "apiKeyNoExpiry": "لا تنتهي", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "فلاتر شفافة", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "حالة", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "يزيل", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "المصادقة المزدوجة", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "محلي", - "adminStatusAdministrator": "المدير", - "adminStatusRegularUser": "مستخدم عادي", - "adminBadge": "ديمين", - "systemBadge": "النظام", - "customBadge": "الكوستوم", - "youBadge": "أنت", - "sessionsActive": "{{count}} نشط", - "sessionActive": "نشط: {{time}}", - "sessionExpires": "التجربة: {{time}}", - "revokeAll": "الكل", - "revokeAllSessionsSuccess": "تم إلغاء جميع جلسات المستخدم", - "revokeAllSessionsFailed": "فشل في إلغاء الجلسات", - "revokeSessionFailed": "فشل في إلغاء الجلسة", - "addRole": "إضافة دور", - "noCustomRoles": "لا توجد أدوار مخصصة", - "removeRoleFailed": "فشل في إزالة الدور", - "assignRoleFailed": "فشل في تعيين الدور", - "deleteRoleFailed": "فشل في حذف الدور", - "userAdminAccess": "المدير", - "userAdminAccessDesc": "الوصول الكامل إلى جميع إعدادات المشرف", - "userRoles": "الأدوار", - "revokeAllUserSessions": "إلغاء جميع الجلسات", - "revokeAllUserSessionsDesc": "فرض إعادة تسجيل الدخول على جميع الأجهزة", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", + "adminBadge": "ADMIN", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "حذف هذا المستخدم دائم.", - "deleteUser": "حذف {{username}}", - "deleting": "حذف...", - "deleteUserFailed": "فشل في حذف المستخدم", - "deleteUserSuccess": "تم حذف المستخدم \"{{username}}\"", - "deleteRoleSuccess": "تم حذف الدور \"{{name}}\"", - "revokeKeySuccess": "تم إلغاء المفتاح \"{{name}}\"", - "revokeKeyFailed": "فشل في إلغاء المفتاح", - "copiedToClipboard": "نسخ إلى الحافظة", - "done": "تم", - "createUserTitle": "إنشاء مستخدم", - "createUserDesc": "إنشاء حساب محلي جديد.", - "createUserUsername": "اسم المستخدم", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "كلمة المرور", - "createUserPasswordHint": "الحد الأدنى 6 أحرف.", - "createUserEnterUsername": "أدخل اسم المستخدم", - "createUserEnterPassword": "أدخل كلمة المرور", - "createUserSubmit": "إنشاء مستخدم", - "editUserTitle": "إدارة المستخدم: {{username}}", - "editUserDesc": "تحرير الأدوار، حالة المشرف والجلسات وإعدادات الحساب.", - "editUserUsername": "اسم المستخدم", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", "editUserAuthType": "نوع المصادقة", - "editUserAdminStatus": "حالة المشرف", - "editUserUserId": "معرف المستخدم", - "linkAccountTitle": "ربط حساب كلمة المرور OIDC", - "linkAccountDesc": "دمج حساب OIDC {{username}} مع حساب محلي موجود.", - "linkAccountWarningTitle": "وسيقوم هذا بما يلي:", - "linkAccountEffect1": "حذف حساب OIDC-فقط", - "linkAccountEffect2": "إضافة تسجيل الدخول OIDC إلى الحساب المستهدف", - "linkAccountEffect3": "السماح لكل من OIDC و كلمة المرور", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "أدخل اسم مستخدم الحساب المحلي للربط به", - "linkAccounts": "ربط الحسابات", - "linkAccountSuccess": "حساب OIDC مرتبط بـ \"{{username}}\"", - "linkAccountFailed": "فشل ربط حساب OIDC", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "جارٍ الربط...", - "saving": "حفظ...", - "updateRegistrationFailed": "فشل تحديث إعدادات التسجيل", - "updatePasswordLoginFailed": "فشل تحديث إعداد تسجيل الدخول لكلمة المرور", - "updateOidcAutoProvisionFailed": "فشل تحديث إعدادات توفير OIDC التلقائي", - "updatePasswordResetFailed": "فشل تحديث إعدادات إعادة تعيين كلمة المرور", - "sessionTimeoutRange2": "مهلة الجلسة يجب أن تكون بين 1 و 720 ساعة", - "sessionTimeoutSaved": "تم حفظ مهلة الجلسة", - "sessionTimeoutSaveFailed": "فشل في حفظ مهلة الجلسة", - "monitoringIntervalInvalid": "قيم الفاصل الزمني غير صالحة", - "monitoringSaved": "تم حفظ إعدادات الرصد", - "monitoringSaveFailed": "فشل في حفظ إعدادات المراقبة", - "guacamoleSaved": "تم حفظ إعدادات غواكامول", - "guacamoleSaveFailed": "فشل في حفظ إعدادات غواكامول", - "guacamoleUpdateFailed": "فشل تحديث إعدادات غواكامول", - "logLevelUpdateFailed": "فشل تحديث مستوى السجل", - "oidcSaved": "تم حفظ إعدادات OIDC", - "oidcSaveFailed": "فشل في حفظ إعدادات OIDC", - "oidcRemoved": "تم حذف إعدادات OIDC", - "oidcRemoveFailed": "فشل في إزالة إعدادات OIDC", - "createUserRequired": "اسم المستخدم وكلمة المرور مطلوبتان", - "createUserPasswordTooShort": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل", - "createUserSuccess": "تم إنشاء المستخدم \"{{username}}\"", - "createUserFailed": "فشل في إنشاء المستخدم", - "updateAdminStatusFailed": "فشل تحديث حالة المشرف", - "allSessionsRevoked": "تم إلغاء جميع الجلسات", - "revokeSessionsFailed": "فشل في إلغاء الجلسات", - "createRoleRequired": "الاسم واسم العرض مطلوبين", - "createRoleSuccess": "تم إنشاء الدور \"{{name}}\"", - "createRoleFailed": "فشل إنشاء الدور", - "apiKeyNameRequired": "اسم المفتاح مطلوب", - "apiKeyUserRequired": "معرف المستخدم مطلوب", - "apiKeyCreatedSuccess": "مفتاح API \"{{name}}\" تم إنشاؤه", - "apiKeyCreateFailed": "فشل إنشاء مفتاح API", - "exportSuccess": "تم تصدير قاعدة البيانات بنجاح", - "exportFailed": "فشل تصدير قاعدة البيانات", - "importSelectFile": "الرجاء تحديد ملف أولاً", - "importCompleted": "اكتمل الاستيراد: تم استيراد {{total}} عنصرًا، وتم تخطي {{skipped}} عنصرًا", - "importFailed": "فشل الاستيراد: {{error}}", - "importError": "فشل استيراد قاعدة البيانات" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "صالة", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "المضيف", - "hostPlaceholder": "192.168.1-1 أو مثال.com", - "portLabel": "المنفذ", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "اسم المستخدم", - "usernamePlaceholder": "اسم المستخدم", - "authLabel": "المصادقة", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "كلمة المرور", - "passwordPlaceholder": "كلمة المرور", - "privateKeyLabel": "المفتاح الخاص", - "privateKeyPlaceholder": "لصق المفتاح الخاص...", - "credentialLabel": "بيانات", - "credentialPlaceholder": "حدد بيانات الاعتماد المحفوظة", - "connectToTerminal": "الاتصال بالمحطة الطرفية", - "connectToFiles": "الاتصال بالملفات" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "بيانات الاعتماد", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "لم يتم تحديد محطة طرفية", - "noTerminalSelectedHint": "فتح علامة تبويب محطة SSH لعرض سجل الأوامر", - "searchPlaceholder": "سجل البحث...", - "clearAll": "مسح الكل", - "noHistoryEntries": "لا توجد إدخالات في السجل", - "trackingDisabled": "تعقب التاريخ معطل", - "trackingDisabledHint": "قم بتمكينه في إعدادات الملف الشخصي لتسجيل الأوامر." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "تسجيل المفتاح", - "recordToTerminals": "تسجيل في المحطات الطرفية", - "selectAll": "الكل", - "selectNone": "لا", - "noTerminalTabsOpen": "لا توجد علامات تبويب طرفية مفتوحة", - "selectTerminalsAbove": "حدد المحطات الطرفية أعلاه", - "broadcastInputPlaceholder": "اكتب هنا لقوائم مفاتيح البث...", - "stopRecording": "إيقاف التسجيل", - "startRecording": "بدء التسجيل", - "settingsTitle": "الإعدادات", - "enableRightClickCopyPaste": "تمكين نسخ/لصق بالزر الأيمن" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "لا أحد", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "تخطيط", - "selectLayoutAbove": "حدد تخطيط أعلاه", - "selectLayoutHint": "اختر عدد الألواح التي سيتم عرضها", - "panesTitle": "لوحات", - "openTabsTitle": "افتح علامات التبويب", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "اسحب علامات التبويب إلى الأجزاء العلوية، أو استخدم خاصية التعيين السريع.", - "dropHere": "إسقاط هنا", - "emptyPane": "فارغ", - "dashboard": "لوحة التحكم", - "clearSplitScreen": "مسح تقسيم الشاشة", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "التعيين السريع", - "alreadyAssigned": "لوحة {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "علامة تبويب مقسمة", "addToSplit": "أضف إلى التقسيم", "removeFromSplit": "أزل من التقسيم", - "assignToPane": "تعيين إلى اللوحة" + "assignToPane": "تعيين إلى اللوحة", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "إنشاء كتلة كتلة", - "createSnippetDescription": "إنشاء كتلة أوامر جديدة للتنفيذ السريع", - "nameLabel": "الاسم", - "namePlaceholder": "على سبيل المثال، إعادة تشغيل Nginx", - "descriptionLabel": "الوصف", - "descriptionPlaceholder": "وصف اختياري", - "optional": "اختياري", - "folderLabel": "مجلد", - "noFolder": "لا يوجد مجلد (غير مصنف)", - "commandLabel": "أمر", - "commandPlaceholder": "على سبيل المثال, sudo systemctl إعادة تشغيل nginx", - "cancel": "إلغاء", - "createSnippetButton": "إنشاء كتلة كتلة", - "createFolderTitle": "إنشاء مجلد", - "createFolderDescription": "تنظيم كتل الكتل في مجلدات", - "folderNameLabel": "اسم المجلد", - "folderNamePlaceholder": "على سبيل المثال أوامر النظام، سكريبتات Docker", - "folderColorLabel": "لون المجلد", - "folderIconLabel": "أيقونة المجلد", - "previewLabel": "معاينة", - "folderNameFallback": "اسم المجلد", - "createFolderButton": "إنشاء مجلد", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "يلغي", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "الكل", - "selectNone": "لا", - "noTerminalTabsOpen": "لا توجد علامات تبويب طرفية مفتوحة", - "searchPlaceholder": "البحث عن كتل الكود...", - "newSnippet": "كتلة جديدة", - "newFolder": "مجلد جديد", - "run": "تشغيل", - "noSnippetsInFolder": "لا يوجد كتل في هذا المجلد", - "uncategorized": "غير مصنف", - "editSnippetTitle": "تعديل كتلة الكود", - "editSnippetDescription": "تحديث كتلة الأوامر", - "saveSnippetButton": "حفظ التغييرات", - "createSuccess": "تم إنشاء كتلة الكود بنجاح", - "createFailed": "فشل في إنشاء كتلة الكود", - "updateSuccess": "تم تحديث كتلة الكود بنجاح", - "updateFailed": "فشل تحديث كتلة الكود", - "deleteFailed": "فشل حذف كتلة الكود", - "folderCreateSuccess": "تم إنشاء المجلد بنجاح", - "folderCreateFailed": "فشل في إنشاء المجلد", - "editFolderTitle": "تعديل المجلد", - "editFolderDescription": "إعادة تسمية أو تغيير مظهر هذا المجلد", - "saveFolderButton": "حفظ التغييرات", - "editFolder": "تحرير المجلد", - "deleteFolder": "حذف المجلد", - "folderDeleteSuccess": "المجلد \"{{name}}محذوف", - "folderDeleteFailed": "فشل في حذف المجلد", - "folderEditSuccess": "تم تحديث المجلد بنجاح", - "folderEditFailed": "فشل تحديث المجلد", - "confirmRunMessage": "تشغيل \"{{name}}\"?", + "selectAll": "All", + "selectNone": "لا أحد", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "يجري", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "يجري", - "runSuccess": "R\"{{name}}\" في المحطة الطرفية {{count}}", - "copySuccess": "تم نسخ \"{{name}}\" إلى الحافظة", - "shareTitle": "مشاركة كتلة الكود", - "shareUser": "المستخدم", - "shareRole": "دور", - "selectUser": "اختر مستخدم...", - "selectRole": "اختر دور...", - "shareSuccess": "تم مشاركة كتلة الكود بنجاح", - "shareFailed": "فشل مشاركة كتلة الكود", - "revokeSuccess": "تم إلغاء الوصول", - "revokeFailed": "فشل في إلغاء الوصول", - "currentAccess": "الوصول الحالي", - "shareLoadError": "فشل تحميل بيانات المشاركة", - "loading": "تحميل...", - "close": "أغلق", - "reorderFailed": "فشل حفظ ترتيب المقتطفات" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "فشل حفظ ترتيب المقتطفات", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "حساب", - "sectionAppearance": "المظهر", - "sectionSecurity": "أمان", - "sectionApiKeys": "مفاتيح API", - "sectionC2sTunnels": "أنفاق C2S", - "usernameLabel": "اسم المستخدم", - "roleLabel": "دور", - "roleAdministrator": "المدير", - "authMethodLabel": "طريقة المصادقة", - "authMethodLocal": "محلي", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "تشغيل", - "twoFaOff": "متوقف", - "versionLabel": "الإصدار", - "deleteAccount": "حذف الحساب", - "deleteAccountDescription": "حذف حسابك بشكل دائم", - "deleteButton": "حذف", - "deleteAccountPermanent": "هذا الإجراء دائم ولا يمكن التراجع عنه.", - "deleteAccountWarning": "سيتم حذف جميع الجلسات والمضيفين ووثائق التفويض والإعدادات بشكل دائم.", - "confirmPasswordDeletePlaceholder": "أدخل كلمة المرور للتأكيد", - "languageLabel": "اللغة", - "themeLabel": "السمة", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "لون اللكنة", - "settingsTerminal": "المحطة", - "commandAutocomplete": "إكمال الأوامر التلقائي", - "commandAutocompleteDesc": "إظهار الإكمال التلقائي أثناء الكتابة", - "historyTracking": "تتبع التاريخ", - "historyTrackingDesc": "تتبع الأوامر الطرفية", - "syntaxHighlighting": "تسليط الضوء على بناء الجملة", - "syntaxHighlightingDesc": "تسليط الضوء على إخراج المحطة", - "commandPalette": "لوحة الأوامر", - "commandPaletteDesc": "تمكين اختصار لوحة المفاتيح", + "accentColorLabel": "Accent Color", + "settingsTerminal": "صالة", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "أعد فتح علامات التبويب عند تسجيل الدخول", "reopenTabsOnLoginDesc": "استعد علامات التبويب المفتوحة عند تسجيل الدخول أو تحديث الصفحة، حتى من جهاز آخر.", - "confirmTabClose": "تأكيد إغلاق علامة التبويب", - "confirmTabCloseDesc": "السؤال قبل إغلاق علامات التبويب الطرفية", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "إظهار الوسوم المضيفة", - "showHostTagsDesc": "عرض العلامات في قائمة المضيف", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "انقر لتوسيع إجراءات المضيف", "hostTrayOnClickDesc": "أظهر أزرار الاتصال دائمًا؛ انقر لتوسيع خيارات الإدارة بدلاً من التمرير فوقها", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "دبوس سكة التطبيق", "pinAppRailDesc": "حافظ على شريط التطبيق الجانبي الأيسر مفتوحًا دائمًا بدلاً من توسيعه عند تمرير المؤشر فوقه.", - "settingsSnippets": "كتل الكود", - "foldersCollapsed": "مجلدات سقطت", - "foldersCollapsedDesc": "طي المجلدات بشكل افتراضي", - "confirmExecution": "تأكيد التنفيذ", - "confirmExecutionDesc": "تأكيد قبل تشغيل كتل الكود", - "settingsUpdates": "التحديثات", - "disableUpdateChecks": "تعطيل التحقق من التحديث", - "disableUpdateChecksDesc": "إيقاف التحقق من وجود تحديثات", - "totpAuthenticator": "مصادقة TOTP", - "totpEnabled": "2FA مفعل", - "totpDisabled": "إضافة أمان تسجيل الدخول الإضافي", - "disable": "تعطيل", - "enable": "تمكين", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "مسح رمز QR أو إدخال سر في تطبيق المصادقة الخاص بك، ثم أدخل الرمز المكون من 6 أرقام", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "تحقق", - "changePassword": "تغيير كلمة المرور", - "currentPasswordLabel": "كلمة المرور الحالية", - "currentPasswordPlaceholder": "كلمة المرور الحالية", - "newPasswordLabel": "كلمة المرور الجديدة", - "newPasswordPlaceholder": "كلمة مرور جديدة", - "confirmPasswordLabel": "تأكيد كلمة المرور الجديدة", - "confirmPasswordPlaceholder": "تأكيد كلمة المرور الجديدة", - "updatePassword": "تحديث كلمة المرور", - "createApiKeyTitle": "إنشاء مفتاح API", - "createApiKeyDescription": "إنشاء مفتاح API جديد للوصول إلى البرامج.", - "apiKeyNameLabel": "الاسم", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "اختياري", - "cancel": "إلغاء", - "createKey": "إنشاء مفتاح", - "apiKeyCount": "مفاتيح {{count}}", - "newKey": "مفتاح جديد", - "noApiKeys": "لا توجد مفاتيح API حتى الآن.", - "apiKeyActive": "نشط", - "apiKeyUsageHint": "تضمين المفتاح الخاص بك في", - "apiKeyUsageHintHeader": "الرأس.", - "apiKeyPermissionsHint": "المفاتيح ترث أذونات المستخدم المنشئ.", - "roleUser": "المستخدم", - "authMethodDual": "المصادقة المزدوجة", + "optional": "optional", + "cancel": "يلغي", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "فشل في بدء إعداد TOTP", - "totpEnter6Digits": "أدخل رمز من 6 أرقام", - "totpEnabledSuccess": "المصادقة الثنائية مفعلة", - "totpInvalidCode": "الرمز غير صالح، الرجاء المحاولة مرة أخرى", - "totpDisableInputRequired": "أدخل رمز TOTP أو كلمة المرور", - "totpDisabledSuccess": "المصادقة الثنائية معطلة", - "totpDisableFailed": "فشل في تعطيل 2FA", - "totpDisableTitle": "تعطيل 2FA", - "totpDisablePlaceholder": "أدخل رمز TOTP أو كلمة المرور", - "totpDisableConfirm": "تعطيل 2FA", - "totpContinueVerify": "مواصلة التحقق", - "totpVerifyTitle": "التحقق من الرمز", - "totpBackupTitle": "رموز النسخ الاحتياطي", - "totpDownloadBackup": "تنزيل رموز النسخ الاحتياطي", - "done": "تم", - "secretCopied": "تم نسخ السر إلى الحافظة", - "apiKeyNameRequired": "اسم المفتاح مطلوب", - "apiKeyCreated": "مفتاح API \"{{name}}\" تم إنشاؤه", - "apiKeyCreateFailed": "فشل إنشاء مفتاح API", - "apiKeyUser": "المستخدم", - "apiKeyExpires": "تنتهي", - "apiKeyRevoked": "تم إلغاء مفتاح API \"{{name}}\"", - "apiKeyRevokeFailed": "فشل في إلغاء مفتاح API", - "passwordFieldsRequired": "كلمات المرور الحالية والجديدة مطلوبة", - "passwordMismatch": "كلمتا المرور غير متطابقتين", - "passwordTooShort": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل", - "passwordUpdated": "تم تحديث كلمة المرور بنجاح", - "passwordUpdateFailed": "فشل تحديث كلمة المرور", - "deletePasswordRequired": "كلمة المرور مطلوبة لحذف حسابك", - "deleteFailed": "فشل في حذف الحساب", - "deleting": "حذف...", - "colorPickerTooltip": "فتح منتقي الألوان", - "themeSystem": "النظام", - "themeLight": "فاتح", - "themeDark": "داكن", - "themeDracula": "دراكولا", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "متشمس", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "داكن واحد", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "الوسوم", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "إعادة المحاولة", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "يزيل", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/bg_BG.json b/src/ui/locales/translated/bg_BG.json index c1aec9ce..aee5cfe5 100644 --- a/src/ui/locales/translated/bg_BG.json +++ b/src/ui/locales/translated/bg_BG.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Папки", - "folder": "Папка", - "password": "Парола", - "key": "Ключ", - "sshPrivateKey": "SSH частен ключ", - "upload": "Качване", - "keyPassword": "Ключова парола", - "sshKey": "SSH ключ", - "uploadPrivateKeyFile": "Качване на файл с частен ключ", - "searchCredentials": "Търсене на идентификационни данни...", - "addCredential": "Добавяне на идентификационни данни", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "Сертификат на CA (-cert.pub)", "caCertificateDescription": "По избор: Качете или поставете файла със сертификат, подписан от CA (напр. id_ed25519-cert.pub). Задължително, когато вашият SSH сървър използва оторизация, базирана на сертификат.", "uploadCertFile": "Качване на файл -cert.pub", - "clearCert": "Изчисти", + "clearCert": "Clear", "certLoaded": "Сертификатът е зареден", "certPublicKeyLabel": "Сертификат за CA", "certTypeLabel": "Тип сертификат", "pasteOrUploadCert": "Поставете или качете сертификат -cert.pub...", "hasCaCert": "Има CA сертификат", - "noCaCert": "Няма сертификат за CA" + "noCaCert": "Няма сертификат за CA", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "По подразбиране ред", + "sortNameAsc": "Име (А → Я)", + "sortNameDesc": "Име (Я → А)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Изчистване на филтрите", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Зареждането на известията не бе успешно", - "failedToDismissAlert": "Отхвърлянето на предупреждението не бе успешно" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Конфигурация на сървъра", - "description": "Конфигурирайте URL адреса на Termix сървъра, за да се свържете с вашите backend услуги", - "serverUrl": "URL адрес на сървъра", - "enterServerUrl": "Моля, въведете URL адрес на сървъра", - "saveFailed": "Запазването на конфигурацията не бе успешно", - "saveError": "Грешка при запазване на конфигурацията", - "saving": "Запазване...", - "saveConfig": "Запазване на конфигурацията", - "helpText": "Въведете URL адреса, където работи вашият Termix сървър (напр. http://localhost:30001 или https://your-server.com)", - "changeServer": "Промяна на сървъра", - "mustIncludeProtocol": "URL адресът на сървъра трябва да започва с http:// или https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Разрешаване на невалиден сертификат", "allowInvalidCertificateDesc": "Използвайте само за надеждни самостоятелно хоствани сървъри със самоподписани или IP-адресни сертификати.", - "useEmbedded": "Използване на локален сървър", - "embeddedDesc": "Стартирайте Termix с вградения локален сървър (не е необходим отдалечен сървър)", - "embeddedConnecting": "Свързване с локален сървър...", - "embeddedNotReady": "Локалният сървър все още не е готов. Моля, изчакайте малко и опитайте отново.", - "localServer": "Локален сървър" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Локален сървър", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Грешка при проверка на версията", - "checkFailed": "Проверката за актуализации не бе успешна", - "upToDate": "Приложението е актуално", - "currentVersion": "Използвате версия {{version}}", - "updateAvailable": "Налична е актуализация", - "newVersionAvailable": "Налична е нова версия! Използвате {{current}}, но {{latest}} е налична.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Бета версия", - "betaVersionDesc": "Изпълнявате {{current}}, която е по-нова от последната стабилна версия {{latest}}.", - "releasedOn": "Публикувано на {{date}}", - "downloadUpdate": "Изтегляне на актуализация", - "checking": "Проверка за актуализации...", - "checkUpdates": "Проверка за актуализации", - "checkingUpdates": "Проверка за актуализации...", - "updateRequired": "Необходима е актуализация" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Затвори", - "minimize": "Минимизиране", - "online": "Онлайн", - "offline": "Офлайн", - "continue": "Продължи", - "maintenance": "Поддръжка", - "degraded": "Деградирал", - "error": "Грешка", - "warning": "Предупреждение", - "unsavedChanges": "Незапазени промени", - "dismiss": "Отхвърляне", - "loading": "Зареждане...", - "optional": "По избор", - "connect": "Свържете се", - "copied": "Копирано", - "connecting": "Свързване...", - "updateAvailable": "Налична е актуализация", - "appName": "Термикс", - "openInNewTab": "Отваряне в нов раздел", - "noReleases": "Няма издания", - "updatesAndReleases": "Актуализации и издания", - "newVersionAvailable": "Налична е нова версия ({{version}}).", - "failedToFetchUpdateInfo": "Неуспешно извличане на информация за актуализацията", - "preRelease": "Предварително издание", - "noReleasesFound": "Не са намерени издания.", - "cancel": "Отказ", - "username": "Потребителско име", - "login": "Вход", - "register": "Регистрация", - "password": "Парола", - "confirmPassword": "Потвърдете паролата", - "back": "Обратно", - "save": "Запазване", - "saving": "Запазване...", - "delete": "Изтриване", - "rename": "Преименуване", - "edit": "Редактиране", - "add": "Добавяне", - "confirm": "Потвърди", - "no": "Не", - "or": "ИЛИ", - "next": "Следващо", - "previous": "Предишен", - "refresh": "Обновяване", - "language": "Език", - "checking": "Проверка...", - "checkingDatabase": "Проверка на връзката с базата данни...", - "checkingAuthentication": "Проверка на удостоверяването...", - "backendReconnected": "Връзката със сървъра е възстановена", - "connectionDegraded": "Връзката със сървъра е прекъсната, възстановяване…", - "reload": "Презареждане", - "remove": "Премахване", - "create": "Създаване", - "update": "Актуализация", - "copy": "Копиране", - "copyFailed": "Копирането в буферната памет не бе успешно", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Максимизиране", "restore": "Възстановяване", - "of": "от" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Дом", - "terminal": "Терминал", - "docker": "Докер", - "tunnels": "Тунели", - "fileManager": "Файлов мениджър", - "serverStats": "Статистика на сървъра", - "admin": "Администратор", - "userProfile": "Потребителски профил", - "splitScreen": "Разделен екран", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Да се затвори ли тази активна сесия?", - "close": "Затвори", - "cancel": "Отказ", - "sshManager": "SSH мениджър", - "cannotSplitTab": "Този раздел не може да бъде разделен", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Копиране на парола", - "copySudoPassword": "Копиране на парола за Sudo", - "passwordCopied": "Паролата е копирана в клипборда", - "noPasswordAvailable": "Няма налична парола", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "Копирането на паролата не бе успешно", "refreshTab": "Обновяване на връзката", - "openFileManager": "Отворете файловия мениджър", - "dashboard": "Табло за управление", - "networkGraph": "Мрежова графика", - "quickConnect": "Бързо свързване", - "sshTools": "SSH инструменти", - "history": "История", - "hosts": "Домакини", - "snippets": "Откъси", - "hostManager": "Мениджър на домакини", - "credentials": "Пълномощия", - "connections": "Връзки", - "roleAdministrator": "Администратор", - "roleUser": "Потребител" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Домакини", - "noHosts": "Няма SSH хостове", - "retry": "Опитай отново", - "refresh": "Обновяване", - "optional": "По избор", - "downloadSample": "Изтегляне на пример", - "failedToDeleteHost": "Неуспешно изтриване на {{name}}", - "importSkipExisting": "Импортиране (пропускане на съществуващото)", - "connectionDetails": "Детайли за връзката", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Телнет", - "remoteDesktop": "Отдалечен работен плот", - "port": "Порт", - "username": "Потребителско име", - "folder": "Папка", - "tags": "Етикети", - "pin": "Закачи", - "addHost": "Добавяне на хост", - "editHost": "Редактиране на хост", - "cloneHost": "Клониране на хост", - "enableTerminal": "Активиране на терминала", - "enableTunnel": "Активиране на тунел", - "enableFileManager": "Активиране на файловия мениджър", - "enableDocker": "Активиране на Докер", - "defaultPath": "Път по подразбиране", - "connection": "Връзка", - "upload": "Качване", - "authentication": "Удостоверяване", - "password": "Парола", - "key": "Ключ", - "credential": "Пълномощия", - "none": "Няма", - "sshPrivateKey": "SSH частен ключ", - "keyType": "Тип ключ", - "uploadFile": "Качване на файл", - "tabGeneral": "Общи", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "ПРСР", + "tabTerminal": "Terminal", + "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Тунели", - "tabDocker": "Докер", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "Файлове", - "tabStats": "Статистика", - "tabTelnet": "Телнет", - "tabSharing": "Споделяне", - "tabAuthentication": "Удостоверяване", - "terminal": "Терминал", - "tunnel": "Тунел", - "fileManager": "Файлов мениджър", - "serverStats": "Статистика на сървъра", - "status": "Статус", - "folderRenamed": "Папка „{{oldName}}“ е преименувана успешно на „{{newName}}“", - "failedToRenameFolder": "Преименуването на папката не бе успешно", - "movedToFolder": "Преместено в „{{folder}}“", - "editHostTooltip": "Редактиране на хоста", - "statusChecks": "Проверки на състоянието", - "metricsCollection": "Колекция от показатели", - "metricsInterval": "Интервал на събиране на показатели", - "metricsIntervalDesc": "Колко често да се събира статистика за сървъра (5 секунди - 1 час)", - "behavior": "Поведение", - "themePreview": "Преглед на темата", - "theme": "Тема", - "fontFamily": "Семейство шрифтове", - "fontSize": "Размер на шрифта", - "letterSpacing": "Разстояние между буквите", - "lineHeight": "Височина на реда", - "cursorStyle": "Стил на курсора", - "cursorBlink": "Мигане на курсора", - "scrollbackBuffer": "Буфер за превъртане назад", - "bellStyle": "Стил на камбаната", - "rightClickSelectsWord": "Щракване с десен бутон Избира дума", - "fastScrollModifier": "Модификатор за бързо превъртане", - "fastScrollSensitivity": "Чувствителност на бързото превъртане", - "sshAgentForwarding": "Пренасочване на SSH агент", - "backspaceMode": "Режим на връщане назад", - "startupSnippet": "Стартов фрагмент", - "selectSnippet": "Изберете фрагмент", - "forceKeyboardInteractive": "Принудително интерактивно с клавиатура", - "overrideCredentialUsername": "Замяна на потребителско име за идентификационни данни", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Използвайте посоченото по-горе потребителско име вместо потребителското име от идентификационните данни", - "jumpHostChain": "Верига за прескачане на хост", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Порт Нокинг", "addKnock": "Добавяне на порт", "addProxyNode": "Добавяне на възел", - "proxyNode": "Прокси възел", - "proxyType": "Тип прокси", - "quickActions": "Бързи действия", - "sudoPasswordAutoFill": "Автоматично попълване на парола за Sudo", - "sudoPassword": "Парола за Sudo", - "keepaliveInterval": "Интервал на поддържане на активността (ms)", - "moshCommand": "MOSH команда", - "environmentVariables": "Променливи на средата", - "addVariable": "Добавяне на променлива", - "docker": "Докер", - "copyTerminalUrl": "Копиране на URL адреса на терминала", - "copyFileManagerUrl": "Копиране на URL адреса на файловия мениджър", - "copyRemoteDesktopUrl": "Копиране на URL адреса на отдалечен работен плот", - "failedToConnect": "Неуспешно свързване с конзолата", - "connect": "Свържете се", - "disconnect": "Изключване", - "start": "Старт", - "enableStatusCheck": "Активиране на проверка на състоянието", - "enableMetrics": "Активиране на показатели", - "bulkUpdateFailed": "Груповата актуализация не бе успешна", - "selectAll": "Избери всички", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Премахни избора от всички", "protocols": "Протоколи", "secureShell": "Защитена обвивка", @@ -272,6 +303,9 @@ "unencryptedShell": "Некриптирана обвивка", "addressIp": "Адрес / IP адрес", "friendlyName": "Приятелско име", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Папка и разширени", "privateNotes": "Лични бележки", "privateNotesPlaceholder": "Подробности за този сървър...", @@ -281,18 +315,18 @@ "addKnockBtn": "Добави Knock", "noPortKnocking": "Не е конфигурирано „порт детониране“.", "knockPort": "Нок Порт", - "protocol": "Протокол", + "protocol": "Protocol", "delayAfterMs": "Закъснение след (ms)", "useSocks5Proxy": "Използвайте SOCKS5 прокси", "useSocks5ProxyDesc": "Маршрутизиране на връзката през прокси сървър", - "proxyHost": "Прокси хост", - "proxyPort": "Прокси порт", - "proxyUsername": "Потребителско име на прокси", - "proxyPassword": "Парола за прокси сървър", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Единичен прокси", - "proxyChainMode": "Прокси верига", + "proxyChainMode": "Proxy Chain", "you": "Ти", - "jumpHostChainLabel": "Верига за прескачане на хост", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Добавяне на скок", "noJumpHosts": "Няма конфигурирани хостове за преходи.", "selectAServer": "Изберете сървър...", @@ -300,10 +334,10 @@ "authMethod": "Метод за удостоверяване", "storedCredential": "Съхранени идентификационни данни", "selectACredential": "Изберете идентификационен номер...", - "keyTypeLabel": "Тип ключ", - "keyTypeAuto": "Автоматично откриване", - "keyPasteTab": "Паста", - "keyUploadTab": "Качване", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Ключовият файл е зареден", "keyUploadClick": "Кликнете, за да качите .pem / .key / .ppk", "clearKey": "Клавиш за изчистване", @@ -311,59 +345,105 @@ "keyReplaceNotice": "поставете нов ключ по-долу, за да го замените", "keyPassphraseSaved": "Паролата е запазена, въведете, за да я промените", "replaceKey": "Сменете ключа", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Принудителна интерактивна клавиатура", "forceKeyboardInteractiveShortDesc": "Принудително въвеждане на парола ръчно, дори ако са налични ключове", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Външен вид на терминала", "colorTheme": "Цветова тема", - "fontFamilyLabel": "Семейство шрифтове", - "fontSizeLabel": "Размер на шрифта", - "cursorStyleLabel": "Стил на курсора", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Разстояние между буквите (px)", - "lineHeightLabel": "Височина на реда", - "bellStyleLabel": "Стил на камбаната", - "backspaceModeLabel": "Режим на връщане назад", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Мигане на курсора", "cursorBlinkingDesc": "Активиране на мигаща анимация за курсора на терминала", "rightClickSelectsWordLabel": "Щракване с десен бутон Избира дума", "rightClickSelectsWordShortDesc": "Изберете думата под курсора при щракване с десния бутон", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Подчертаване на синтаксиса", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Времеви печати", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Поведение и напреднали", - "scrollbackBufferLabel": "Буфер за превъртане назад", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Максимален брой редове, съхранявани в историята", - "sshAgentForwardingLabel": "Пренасочване на SSH агент", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Предайте локалните си SSH ключове на този хост", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Активиране на Auto-Mosh", "enableAutoMoshDesc": "Предпочитайте Mosh пред SSH, ако е наличен", "enableAutoTmux": "Активиране на Auto-Tmux", "enableAutoTmuxDesc": "Автоматично стартиране или прикачване към tmux сесия", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Автоматично попълване на парола за Sudo", "sudoPasswordAutoFillShortDesc": "Автоматично предоставяне на парола за sudo при подкана", - "sudoPasswordLabel": "Парола за Sudo", - "environmentVariablesLabel": "Променливи на средата", - "addVariableBtn": "Добавяне на променлива", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Няма конфигурирани променливи на средата.", - "fastScrollModifierLabel": "Модификатор за бързо превъртане", - "fastScrollSensitivityLabel": "Чувствителност на бързото превъртане", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Команда Мош", - "startupSnippetLabel": "Стартов фрагмент", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Интервал за поддържане на активност (секунди)", "maxKeepaliveMisses": "Максимални пропуски на Keepalive", "tunnelSettings": "Настройки на тунела", "enableTunneling": "Активиране на тунелиране", "enableTunnelingDesc": "Активиране на SSH тунелната функционалност за този хост", "serverTunnelsSection": "Сървърни тунели", - "addTunnelBtn": "Добавяне на тунел", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Няма конфигурирани тунели.", - "tunnelLabel": "Тунел {{number}}", - "tunnelType": "Тип тунел", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Пренасочване на локален порт към порт на отдалечения сървър (или хост, достъпен от него).", "tunnelModeRemoteDesc": "Пренасочете порт на отдалечения сървър обратно към локален порт на вашата машина.", "tunnelModeDynamicDesc": "Създайте SOCKS5 прокси на локален порт за динамично пренасочване на портове.", "sameHost": "Този хост (директен тунел)", "endpointHost": "Краен хост", - "endpointPort": "Порт за крайна точка", + "endpointPort": "Endpoint Port", "bindHost": "Свързване на хост", - "sourcePort": "Източник Порт", - "maxRetries": "Максимален брой повторни опити", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Интервал на повторен опит (и)", "autoStartLabel": "Автоматично стартиране", "autoStartDesc": "Автоматично свързване на този тунел при зареждане на хоста", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Свързването не бе успешно", "failedToDisconnectTunnel": "Прекъсването не бе успешно", "dockerIntegration": "Интеграция на Docker", - "enableDockerMonitor": "Активиране на Докер", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Наблюдавайте и управлявайте контейнери на този хост чрез Docker", - "enableFileManagerMonitor": "Активиране на файловия мениджър", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Преглеждайте и управлявайте файлове на този хост през SFTP", - "defaultPathLabel": "Път по подразбиране", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "Директорията, която да се отвори при стартиране на файловия мениджър за този хост.", - "statusChecksLabel": "Проверки на състоянието", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Активиране на проверки на състоянието", "enableStatusChecksDesc": "Периодично проверявайте наличността на този хост чрез ping.", "useGlobalInterval": "Използване на глобален интервал", "useGlobalIntervalDesc": "Замяна с интервала за проверка на състоянието на целия сървър", "checkIntervalS": "Интервал(и) на проверка", "checkIntervalDesc": "Секунди между всеки ping за свързване", - "metricsCollectionLabel": "Колекция от показатели", - "enableMetricsLabel": "Активиране на показатели", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Събиране на данни за използването на процесора, RAM, диска и мрежата от този хост", "useGlobalMetrics": "Използване на глобален интервал", "useGlobalMetricsDesc": "Замяна с интервала на показателите за целия сървър", "metricsIntervalS": "Интервал(и) на показателите", "metricsIntervalDesc2": "Секунди между моментните снимки на показателите", "visibleWidgets": "Видими джаджи", - "cpuUsageLabel": "Използване на процесора", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "Процент на процесора, средни стойности на натоварването, sparkline графика", - "memoryLabel": "Използване на паметта", + "memoryLabel": "Memory Usage", "memoryDesc": "Използване на RAM, суап, кеширана памет", - "storageLabel": "Използване на диска", + "storageLabel": "Disk Usage", "storageDesc": "Използване на дисково пространство за точка на монтиране", - "networkLabel": "Мрежови интерфейси", + "networkLabel": "Network Interfaces", "networkDesc": "Списък с интерфейси и честотна лента", - "uptimeLabel": "Време на работа", + "uptimeLabel": "Uptime", "uptimeDesc": "Време за работа на системата и време за зареждане", "systemInfoLabel": "Информация за системата", "systemInfoDesc": "ОС, ядро, име на хост, архитектура", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Успешни и неуспешни събития за влизане", "topProcessesLabel": "Най-важни процеси", "topProcessesDesc": "PID, CPU%, MEM%, команда", - "listeningPortsLabel": "Портове за слушане", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Отворени портове с процес и състояние", - "firewallLabel": "Защитна стена", + "firewallLabel": "Firewall", "firewallDesc": "Състояние на защитната стена, AppArmor, SELinux", - "quickActionsLabel": "Бързи действия", - "quickActionsToolbar": "Бързите действия се показват като бутони в лентата с инструменти „Статистика на сървъра“ за изпълнение на команди с едно щракване.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Все още няма бързи действия.", "buttonLabel": "Етикет на бутона", "selectSnippetPlaceholder": "Изберете фрагмент...", "addActionBtn": "Добавяне на действие", "hostSharedSuccessfully": "Хостът е споделен успешно", - "failedToShareHost": "Споделянето на хоста не бе успешно", + "failedToShareHost": "Failed to share host", "accessRevoked": "Достъпът е отменен", - "failedToRevokeAccess": "Неуспешно отменяне на достъпа", - "cancelBtn": "Отказ", - "savingBtn": "Запазване...", - "addHostBtn": "Добавяне на хост", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Хостът е актуализиран", "hostCreated": "Хостът е създаден", "failedToSave": "Запазването на хоста не бе успешно", "credentialUpdated": "Пълномощията са актуализирани", "credentialCreated": "Идентификационните данни са създадени", - "failedToSaveCredential": "Запазването на идентификационните данни не бе успешно", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Обратно към Домакини", "backToCredentials": "Обратно към удостоверенията", - "pinned": "Закачено", - "noHostsFound": "Не са намерени хостове", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Опитайте с друг термин", "addFirstHost": "Добавете първия си хост, за да започнете", "noCredentialsFound": "Не са намерени идентификационни данни", - "addCredentialBtn": "Добавяне на идентификационни данни", - "updateCredentialBtn": "Актуализиране на идентификационните данни", - "features": "Характеристики", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Няма папка)", - "deleteSelected": "Изтриване", + "deleteSelected": "Delete", "exitSelection": "Изход от селекцията", - "importSkip": "Импортиране (пропускане на съществуващото)", + "importSkip": "Import (skip existing)", "importOverwrite": "Импортиране (презаписване)", "collapseBtn": "Свиване", "importExportBtn": "Внос / Износ", "hostStatusesRefreshed": "Състоянията на хоста са обновени", "failedToRefreshHosts": "Неуспешно обновяване на хостовете", - "movedHostTo": "Преместено {{host}} в „{{folder}}“", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Преместването на хоста не бе успешно", - "folderRenamedTo": "Папката е преименувана на „{{name}}“", - "deletedFolder": "Изтрита папка „{{name}}“", - "failedToDeleteFolder": "Изтриването на папката не бе успешно", - "deleteAllInFolder": "Да се изтрият ли всички хостове в „{{name}}“? Това не може да се отмени.", - "deletedHost": "Изтрито {{name}}", - "copiedToClipboard": "Копирано в буферната памет", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Редактиране на папка", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Редактиране на папка", + "deleteFolder": "Изтриване на папка", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Преместването на хостовете не бе успешно", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "URL адресът на терминала е копиран", "fileManagerUrlCopied": "URL адресът на файловия мениджър е копиран", "tunnelUrlCopied": "URL адресът на тунела е копиран", "dockerUrlCopied": "URL адресът на Docker е копиран", - "serverStatsUrlCopied": "URL адресът за статистика на сървъра е копиран", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP URL адресът е копиран", "vncUrlCopied": "VNC URL адресът е копиран", "telnetUrlCopied": "URL адресът на Telnet е копиран", @@ -471,109 +633,112 @@ "expandActions": "Разгъване на действията", "collapseActions": "Свиване на действията", "wakeOnLanAction": "Събуждане по LAN", - "wakeOnLanSuccess": "Магически пакет, изпратен до {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Изпращането на магически пакет не бе успешно", - "cloneHostAction": "Клониране на хост", + "cloneHostAction": "Clone Host", "copyAddress": "Копиране на адрес", "copyLink": "Копиране на връзката", - "copyTerminalUrlAction": "Копиране на URL адреса на терминала", - "copyFileManagerUrlAction": "Копиране на URL адреса на файловия мениджър", - "copyTunnelUrlAction": "Копиране на URL адреса на тунела", - "copyDockerUrlAction": "Копиране на URL адреса на Docker", - "copyServerStatsUrlAction": "Копиране на URL адреса за статистика на сървъра", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "Копиране на RDP URL адрес", "copyVncUrlAction": "Копиране на VNC URL адрес", "copyTelnetUrlAction": "Копиране на Telnet URL адрес", - "copyRemoteDesktopUrlAction": "Копиране на URL адреса на отдалечен работен плот", - "deleteCredentialConfirm": "Изтриване на идентификационните данни „{{name}}“?", - "deletedCredential": "Изтрито {{name}}", - "deploySSHKeyTitle": "Разполагане на SSH ключ", - "deployingBtn": "Разгръщане...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Разгръщане", "failedToDeployKey": "Разгръщането на ключа не бе успешно", - "deleteHostsConfirm": "Изтриване на {{count}} хост{{plural}}? Това не може да бъде отменено.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Преместено в корена", - "failedToMoveHosts": "Преместването на хостовете не бе успешно", - "enableTerminalFeature": "Активиране на терминала", - "disableTerminalFeature": "Деактивиране на терминала", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Активиране на файлове", "disableFilesFeature": "Деактивиране на файлове", "enableTunnelsFeature": "Активиране на тунели", "disableTunnelsFeature": "Деактивиране на тунелите", - "enableDockerFeature": "Активиране на Докер", - "disableDockerFeature": "Деактивиране на Докер", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Добавяне на етикети...", "authDetails": "Детайли за удостоверяване", - "credType": "Тип", + "credType": "Type", "generateKeyPairDesc": "Генерирайте нова двойка ключове, като както частните, така и публичните ключове ще бъдат попълнени автоматично.", "generatingKey": "Генериране...", - "generateLabel": "Генериране {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Качване на файл", "keyPassphraseOptional": "Ключова парола (по избор)", "sshPublicKeyOptional": "SSH публичен ключ (по избор)", "publicKeyGenerated": "Генериран публичен ключ", "failedToGeneratePublicKey": "Неуспешно извличане на публичен ключ", "publicKeyCopied": "Публичният ключ е копиран", - "keyPairGenerated": "{{label}} генерирана двойка ключове", - "failedToGenerateKeyPair": "Неуспешно генериране на двойка ключове", - "searchHostsPlaceholder": "Търсене на хостове, адреси, тагове…", - "searchCredentialsPlaceholder": "Търсене на идентификационни данни…", - "refreshBtn": "Обновяване", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Добавяне на етикети...", - "deleteConfirmBtn": "Изтриване", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH сървърът трябва да има зададени стойности за GatewayPorts (да), AllowTcpForwarding (да) и PermitRootLogin (да) в /etc/ssh/sshd_config.", - "deleteHostConfirm": "Да се изтрие ли „{{name}}“?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Активирайте поне един протокол по-горе, за да конфигурирате настройките за удостоверяване и връзка.", - "keyPassphrase": "Ключова парола", - "connectBtn": "Свържете се", - "disconnectBtn": "Изключване", - "basicInformation": "Основна информация", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Детайли за удостоверяване", - "credTypeLabel": "Тип", - "hostsTab": "Домакини", - "credentialsTab": "Пълномощия", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Изберете няколко", "selectHosts": "Изберете хостове", - "connectionLabel": "Връзка", - "authenticationLabel": "Удостоверяване", - "generateKeyPairTitle": "Генериране на двойка ключове", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Генерирайте нова двойка ключове, като както частните, така и публичните ключове ще бъдат попълнени автоматично.", - "generateFromPrivateKey": "Генериране от частен ключ", - "refreshBtn2": "Обновяване", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Изход от селекцията", "exportAll": "Експортиране на всички", - "addHostBtn2": "Добавяне на хост", - "addCredentialBtn2": "Добавяне на идентификационни данни", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Проверка на състоянието на хоста...", - "pinnedSection": "Закачено", + "pinnedSection": "Pinned", "hostsExported": "Хостовете са експортирани успешно", "exportFailed": "Експортирането на хостове не бе успешно", "sampleDownloaded": "Примерен файл е изтеглен", - "failedToDeleteCredential2": "Неуспешно изтриване на идентификационните данни", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Няма папка)", - "nSelected": "{{count}} избрано", - "featuresMenu": "Характеристики", - "moveMenu": "Преместване", - "cancelSelection": "Отказ", - "deployDialogDesc": "Разположи {{name}} в authorized_keys на хоста.", - "targetHostLabel": "Целевият хост", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Изберете хост...", "keyDeployedSuccess": "Ключът е внедрен успешно", "failedToDeployKey2": "Разгръщането на ключа не бе успешно", - "deletedCount": "Изтрити {{count}} хостове", - "failedToDeleteCount": "Неуспешно изтриване на {{count}} хостове", - "duplicatedHost": "Дублирано „{{name}}“", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Дублирането на хоста не бе успешно", - "updatedCount": "Актуализирани {{count}} хостове", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Приятелско име", - "descriptionLabel": "Описание", + "descriptionLabel": "Description", "loadingHost": "Зареждане на хоста...", - "loadingHosts": "Зареждане на хостове...", - "loadingCredentials": "Зареждане на идентификационни данни...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Все още няма домакини", - "noHostsMatchSearch": "Няма хостове, които да отговарят на вашето търсене", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Хостът не е намерен", - "searchHosts": "Търсене на хостове...", + "searchHosts": "Search hosts...", "sortHosts": "Сортиране на хостове", "sortDefault": "По подразбиране ред", "sortNameAsc": "Име (А → Я)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "Първо закачено", "filterHosts": "Филтриране на хостове", "filterClearAll": "Изчистване на филтрите", - "filterStatusGroup": "Статус", - "filterOnline": "Онлайн", - "filterOffline": "Офлайн", - "filterPinned": "Закачено", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "Тип оторизация", - "filterAuthPassword": "Парола", - "filterAuthKey": "SSH ключ", - "filterAuthCredential": "Пълномощия", - "filterAuthNone": "Няма", - "filterAuthOpkssh": "ОПКСШ", - "filterProtocolGroup": "Протокол", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", + "filterAuthOpkssh": "OPKSSH", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", - "filterProtocolRdp": "ПРСР", + "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", - "filterProtocolTelnet": "Телнет", - "filterFeaturesGroup": "Характеристики", - "filterFeatureTerminal": "Терминал", - "filterFeatureFileManager": "Файлов мениджър", - "filterFeatureTunnel": "Тунел", - "filterFeatureDocker": "Докер", - "filterTagsGroup": "Етикети", - "shareHost": "Споделяне на хост", - "shareHostTitle": "Споделяне: {{name}}", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Този хост трябва да използва идентификационни данни, за да активира споделянето. Първо редактирайте хоста и задайте идентификационни данни." }, "guac": { - "connection": "Връзка", - "authentication": "Удостоверяване", - "connectionSettings": "Настройки за връзка", - "displaySettings": "Настройки на дисплея", - "audioSettings": "Аудио настройки", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Съхранени идентификационни данни", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Метод за удостоверяване", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Изберете идентификационен номер...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "Производителност на RDP", - "deviceRedirection": "Пренасочване на устройството", - "session": "Сесия", - "gateway": "Портал", - "remoteApp": "Отдалечено приложение", - "clipboard": "Клипборд", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "Запис на сесия", - "wakeOnLan": "Събуждане по локална мрежа", - "vncSettings": "VNC настройки", - "terminalSettings": "Настройки на терминала", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "RDP порт", - "username": "Потребителско име", - "password": "Парола", - "domain": "Домейн", - "securityMode": "Режим на сигурност", - "colorDepth": "Дълбочина на цвета", - "width": "Ширина", - "height": "Височина", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Метод за преоразмеряване", - "clientName": "Име на клиента", - "initialProgram": "Първоначална програма", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Разположение на сървъра", - "timezone": "Часова зона", - "gatewayHostname": "Име на хост на шлюз", - "gatewayPort": "Порт на шлюза", - "gatewayUsername": "Потребителско име на шлюз", - "gatewayPassword": "Парола за шлюз", - "gatewayDomain": "Домейн на шлюз", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "Програма за отдалечено приложение", "workingDirectory": "Работна директория", "arguments": "Аргументи", "normalizeLineEndings": "Нормализиране на края на редовете", - "recordingPath": "Път на запис", - "recordingName": "Име на записа", - "macAddress": "MAC адрес", - "broadcastAddress": "Адрес за излъчване", - "udpPort": "UDP порт", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Време за изчакване (и)", - "driveName": "Име на устройството", - "drivePath": "Път на устройството", - "ignoreCertificate": "Игнориране на сертификата", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Разрешаване на връзки към хостове със самоподписани сертификати", - "forceLossless": "Принудително беззагубно", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Принудително кодиране на изображения без загуби (по-високо качество, по-голяма честотна лента)", - "disableAudio": "Деактивиране на звука", + "disableAudio": "Disable Audio", "disableAudioDesc": "Изключване на звука от отдалечената сесия", "enableAudioInput": "Активиране на аудио вход (микрофон)", "enableAudioInputDesc": "Пренасочване на локалния микрофон към отдалечената сесия", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Активиране на ефектите на Aero Glass", "menuAnimations": "Анимации на менюто", "menuAnimationsDesc": "Активиране на анимации за избледняване на менюта и слайдове", - "disableBitmapCaching": "Деактивиране на кеширането на растерни изображения", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Изключете кеша на растерните изображения (може да помогне с проблеми)", - "disableOffscreenCaching": "Деактивиране на кеширането извън екрана", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Изключване на кеша извън екрана", - "disableGlyphCaching": "Деактивиране на кеширането на глифи", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Изключване на кеша на глифове", - "enableGfx": "Активиране на графични ефекти", + "enableGfx": "Enable GFX", "enableGfxDesc": "Използвайте графичен конвейер RemoteFX", - "enablePrinting": "Активиране на печат", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Пренасочване на локални принтери към отдалечена сесия", - "enableDriveRedirection": "Активиране на пренасочване на устройството", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Карта на локална папка като устройство в отдалечена сесия", - "createDrivePath": "Създаване на път за устройство", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Автоматично създаване на папката, ако тя не съществува", - "disableDownload": "Деактивиране на изтеглянето", + "disableDownload": "Disable Download", "disableDownloadDesc": "Предотвратяване на изтеглянето на файлове от отдалечената сесия", - "disableUpload": "Деактивиране на качването", + "disableUpload": "Disable Upload", "disableUploadDesc": "Предотвратяване на качването на файлове към отдалечената сесия", - "enableTouch": "Активиране на докосване", + "enableTouch": "Enable Touch", "enableTouchDesc": "Активиране на пренасочване на сензорен вход", - "consoleSession": "Конзолна сесия", + "consoleSession": "Console Session", "consoleSessionDesc": "Свържете се с конзолата (сесия 0) вместо с нова сесия", "sendWolPacket": "Изпращане на WOL пакет", "sendWolPacketDesc": "Изпратете магически пакет, за да събудите този хост преди свързване", - "disableCopy": "Деактивиране на копирането", + "disableCopy": "Disable Copy", "disableCopyDesc": "Предотвратяване на копирането на текст от отдалечената сесия", - "disablePaste": "Деактивиране на поставянето", + "disablePaste": "Disable Paste", "disablePasteDesc": "Предотвратяване на поставянето на текст в отдалечената сесия", "createPathIfMissing": "Създаване на път, ако липсва", "createPathIfMissingDesc": "Автоматично създаване на директорията за записи", - "excludeOutput": "Изключване на изхода", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Не записвайте изхода на екрана (само метаданни)", - "excludeMouse": "Изключване на мишката", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Не записвайте движенията на мишката", "includeKeystrokes": "Включи клавишни комбинации", "includeKeystrokesDesc": "Записвайте сурови натискания на клавиши в допълнение към изхода на екрана", @@ -718,102 +896,105 @@ "vncPassword": "VNC парола", "vncUsernameOptional": "Потребителско име (по избор)", "vncLeaveBlank": "Оставете празно, ако не е необходимо", - "cursorMode": "Режим на курсора", - "swapRedBlue": "Разменете червено/синьо", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Разменете червените и сините цветови канали (коригира някои проблеми с цветовете)", "readOnly": "Само за четене", "readOnlyDesc": "Преглед на отдалечения екран без изпращане на каквито и да било входни данни", "telnetPort": "Telnet порт", - "terminalType": "Тип терминал", - "fontName": "Име на шрифта", - "fontSize": "Размер на шрифта", - "colorScheme": "Цветова схема", - "backspaceKey": "Клавиш Backspace", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Първо запазете хоста.", "sharingOptionsAfterSave": "Опциите за споделяне са налични след запазване на хоста.", "sharingLoadError": "Зареждането на данните за споделяне не бе успешно. Проверете връзката си и опитайте отново.", - "shareHostSection": "Споделяне на хост", - "shareWithUser": "Споделяне с потребителя", - "shareWithRole": "Споделяне с роля", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Изберете потребител", - "selectRole": "Изберете роля", + "selectRole": "Select Role", "selectUserOption": "Изберете потребител...", "selectRoleOption": "Изберете роля...", - "permissionLevel": "Ниво на разрешение", + "permissionLevel": "Permission Level", "expiresInHours": "Изтича след (часове)", "noExpiryPlaceholder": "Оставете празно за дата без срок на валидност", - "shareBtn": "Споделяне", - "currentAccess": "Текущ достъп", - "typeHeader": "Тип", - "targetHeader": "Цел", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "Разрешение", - "grantedByHeader": "Предоставено от", - "expiresHeader": "Изтича", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Все още няма записи за достъп.", - "expiredLabel": "Изтекъл", - "neverLabel": "Никога", - "revokeBtn": "Отмяна", - "cancelBtn": "Отказ", - "savingBtn": "Запазване...", - "updateHostBtn": "Актуализиране на хоста", - "addHostBtn": "Добавяне на хост" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Търсене на хостове, команди или настройки...", - "quickActions": "Бързи действия", - "hostManager": "Мениджър на домакини", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Управление, добавяне или редактиране на хостове", "addNewHost": "Добавяне на нов хост", "addNewHostDesc": "Регистрирайте нов хост", - "adminSettings": "Административни настройки", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Конфигуриране на системни предпочитания и потребители", - "userProfile": "Потребителски профил", + "userProfile": "User Profile", "userProfileDesc": "Управлявайте профила и предпочитанията си", - "addCredential": "Добавяне на идентификационни данни", + "addCredential": "Add Credential", "addCredentialDesc": "Съхранявайте SSH ключове или пароли", - "recentActivity": "Последна активност", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Сървъри и хостове", - "noHostsFound": "Не са намерени хостове, съответстващи на „{{search}}“", - "links": "Връзки", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Навигиране", - "select": "Изберете", + "select": "Select", "toggleWith": "Превключване с" }, "splitScreen": { - "paneEmpty": "Панел {{index}} - празен", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Няма зададен раздел", "focusedPane": "Активен панел" }, "connections": { "noConnections": "Няма връзки", "noConnectionsDesc": "Отворете терминал, файлов мениджър или отдалечен работен плот, за да видите връзките тук", - "connectedFor": "Свързано за {{duration}}", - "connected": "Свързан", - "disconnected": "Изключен", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Затвори раздела", "closeConnection": "Затвори връзката", "forgetTab": "Забрави", - "removeBackground": "Премахване", - "reconnect": "Свържете се отново", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Отвори отново", "sectionOpen": "Отворено", "sectionBackground": "Предистория", "backgroundDesc": "Сесиите продължават 30 минути след прекъсване на връзката и могат да бъдат свързани отново.", "persisted": "Продължава във фонов режим", - "expiresIn": "Изтича след {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Търсене на връзки...", - "noSearchResults": "Няма връзки, които да отговарят на търсенето ви" + "noSearchResults": "Няма връзки, които да отговарят на търсенето ви", + "rename": "Rename session" }, "guacamole": { - "connecting": "Свързване към сесия {{type}}...", - "connectionError": "Грешка при свързване", - "connectionFailed": "Връзката не бе успешна", - "failedToConnect": "Неуспешно получаване на токен за връзка", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Хостът не е намерен", - "noHostSelected": "Няма избран хост", - "reconnect": "Свържете се отново", - "retry": "Опитай отново", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "Услугата за отдалечен работен плот (guacd) не е налична. Моля, уверете се, че guacd работи, е достъпна и е конфигурирана правилно в администраторските настройки.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "Win+L (Заключен екран)", "winKey": "Клавиш за Windows", "ctrl": "Ctrl", - "alt": "Алтернативно", - "shift": "Изместване", + "alt": "Alt", + "shift": "Shift", "win": "Спечелете", - "stickyActive": "{{key}} (заключено - щракнете за освобождаване)", - "stickyInactive": "{{key}} (щракнете, за да заключите)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Бягство", "tab": "Раздел", - "home": "Дом", + "home": "Home", "end": "Край", "pageUp": "Страница нагоре", "pageDown": "Страница надолу", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Свързване с хоста", - "clear": "Изчисти", - "paste": "Паста", - "reconnect": "Свържете се отново", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Връзката е прекъсната", - "connected": "Свързан", - "clipboardWriteFailed": "Копирането в клипборда не бе успешно. Уверете се, че страницата се предоставя през HTTPS или localhost.", - "clipboardReadFailed": "Четенето от клипборда не бе успешно. Уверете се, че са предоставени разрешения за достъп до клипборда.", - "clipboardHttpWarning": "Поставянето изисква HTTPS. Използвайте Ctrl+Shift+V или обслужвайте Termix през HTTPS.", - "unknownError": "Възникна неизвестна грешка", - "websocketError": "Грешка при свързване с WebSocket", - "connecting": "Свързване...", - "noHostSelected": "Няма избран хост", - "reconnecting": "Повторно свързване... ({{attempt}}/{{max}})", - "reconnected": "Успешно повторно свързване", - "tmuxSessionCreated": "tmux сесия, създадена: {{name}}", - "tmuxSessionAttached": "Прикачена tmux сесия: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux не е инсталиран на отдалечения хост, връща се към стандартната обвивка", "tmuxSessionPickerTitle": "tmux сесии", "tmuxSessionPickerDesc": "На този хост са открити съществуващи tmux сесии. Изберете една, за да я свържете отново или да създадете нова сесия.", - "tmuxWindows": "Прозорци", - "tmuxWindowCount": "{{count}} прозорец", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Прикачени клиенти", - "tmuxAttachedCount": "{{count}} прикачен", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Последна активност", "tmuxTimeJustNow": "точно сега", - "tmuxTimeMinutes": "преди {{count}}мин.", - "tmuxTimeHours": "преди {{count}}ч", - "tmuxTimeDays": "преди {{count}}дни", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Започнете нова сесия", "tmuxCopyHint": "Променете селекцията и натиснете Enter, за да я копирате в клипборда", "tmuxDetach": "Отделяне от tmux сесия", "tmuxDetached": "Отделен от tmux сесията", - "maxReconnectAttemptsReached": "Достигнат е максималният брой опити за повторно свързване", - "closeTab": "Затвори", - "connectionTimeout": "Време за изчакване на връзката", - "terminalTitle": "Терминал - {{host}}", - "terminalWithPath": "Терминал - {{host}}:{{path}}", - "runTitle": "Изпълнява се {{command}} - {{host}}", - "totpRequired": "Изисква се двуфакторно удостоверяване", - "totpCodeLabel": "Код за потвърждение", - "totpVerify": "Проверка", - "warpgateAuthRequired": "Изисква се удостоверяване на Warpgate", - "warpgateSecurityKey": "Ключ за сигурност", - "warpgateAuthUrl": "URL адрес за удостоверяване", - "warpgateOpenBrowser": "Отваряне в браузъра", - "warpgateContinue": "Завърших удостоверяването", - "opksshAuthRequired": "Изисква се удостоверяване на OPKSSH", - "opksshAuthDescription": "За да продължите, завършете удостоверяването в браузъра си. Тази сесия ще остане валидна 24 часа.", - "opksshOpenBrowser": "Отворете браузъра за удостоверяване", - "opksshWaitingForAuth": "Чака се удостоверяване в браузъра...", - "opksshAuthenticating": "Обработва се удостоверяване...", - "opksshTimeout": "Времето за изчакване на удостоверяването изтече. Моля, опитайте отново.", - "opksshAuthFailed": "Удостоверяването не бе успешно. Моля, проверете идентификационните си данни и опитайте отново.", - "opksshSignInWith": "Влезте с {{provider}}", - "sudoPasswordPopupTitle": "Въвеждане на парола?", - "websocketAbnormalClose": "Връзката се прекъсна неочаквано. Това може да се дължи на проблем с обратен прокси или SSL конфигурация. Моля, проверете лог файловете на сървъра.", - "connectionLogTitle": "Дневник на връзките", - "connectionLogCopy": "Копиране на лог файлове в клипборда", - "connectionLogEmpty": "Все още няма регистрационни файлове за връзка", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Отворено", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Чакат се регистрационни файлове за връзка...", - "connectionLogCopied": "Дневниците на връзките са копирани в клипборда", - "connectionLogCopyFailed": "Копирането на регистрационните файлове в буфера не бе успешно", - "connectionRejected": "Връзката е отхвърлена от сървъра. Моля, проверете удостоверяването и мрежовата си конфигурация.", - "hostKeyRejected": "Проверката на SSH ключа за хост е отхвърлена. Връзката е прекратена.", - "sessionTakenOver": "Сесията беше отворена в друг раздел. Повторно свързване..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Разделяне на раздела", + "addToSplit": "Добави към Сплит", + "removeFromSplit": "Премахване от Сплит" + } }, "fileManager": { - "noHostSelected": "Няма избран хост", + "noHostSelected": "No host selected", "initializingEditor": "Инициализиране на редактора...", - "file": "Файл", - "folder": "Папка", - "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": "Преименуване", - "uploading": "Качване...", - "uploadingFile": "Качване {{name}}...", - "fileName": "Име на файл", - "folderName": "Име на папката", - "fileUploadedSuccessfully": "Файлът „{{name}}“ е качен успешно", - "failedToUploadFile": "Качването на файла не бе успешно", - "fileDownloadedSuccessfully": "Файлът „{{name}}“ е изтеглен успешно", - "failedToDownloadFile": "Изтеглянето на файла не бе успешно", - "fileCreatedSuccessfully": "Файлът „{{name}}“ е създаден успешно", - "folderCreatedSuccessfully": "Папка „{{name}}“ е създадена успешно", - "failedToCreateItem": "Създаването на елемент не бе успешно", - "operationFailed": "Операцията {{operation}} е неуспешна за {{name}}: {{error}}", - "failedToResolveSymlink": "Неуспешно разрешаване на символната връзка", - "itemsDeletedSuccessfully": "{{count}} елементи са изтрити успешно", - "failedToDeleteItems": "Изтриването на елементи не бе успешно", - "sudoPasswordRequired": "Изисква се администраторска парола", - "enterSudoPassword": "Въведете паролата за sudo, за да продължите тази операция", - "sudoPassword": "Парола за Sudo", - "sudoOperationFailed": "Sudo операцията не беше успешна", - "sudoAuthFailed": "Sudo удостоверяването не беше успешно", - "dragFilesToUpload": "Пуснете файлове тук, за да ги качите", - "emptyFolder": "Тази папка е празна", - "searchFiles": "Търсене на файлове...", - "upload": "Качване", - "selectHostToStart": "Изберете хост, за да започнете управлението на файлове", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "Файловият мениджър изисква SSH. Този хост не е активиран за SSH.", - "failedToConnect": "Неуспешно свързване към SSH", - "failedToLoadDirectory": "Неуспешно зареждане на директорията", - "noSSHConnection": "Няма налична SSH връзка", - "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}}?", - "permissionDenied": "Разрешението е отказано", - "serverError": "Грешка на сървъра", - "fileSavedSuccessfully": "Файлът е запазен успешно", - "failedToSaveFile": "Запазването на файла не бе успешно", - "confirmDeleteSingleItem": "Сигурни ли сте, че искате да изтриете за постоянно „{{name}}“?", - "confirmDeleteMultipleItems": "Сигурни ли сте, че искате да изтриете за постоянно {{count}} елементи?", - "confirmDeleteMultipleItemsWithFolders": "Наистина ли искате да изтриете за постоянно {{count}} елементи? Това включва папки и тяхното съдържание.", - "confirmDeleteFolder": "Сигурни ли сте, че искате да изтриете окончателно папката „{{name}}“ и цялото ѝ съдържание?", - "permanentDeleteWarning": "Това действие не може да бъде отменено. Елементът(ите) ще бъдат изтрити за постоянно от сървъра.", - "recent": "Скорошни", - "pinned": "Закачено", - "folderShortcuts": "Преки пътища към папки", - "failedToReconnectSSH": "Неуспешно повторно свързване на SSH сесията", - "openTerminalHere": "Отворете терминала тук", - "run": "Бягане", - "openTerminalInFolder": "Отвори терминала в тази папка", - "openTerminalInFileLocation": "Отваряне на терминала на местоположението на файла", - "runningFile": "Бягане - {{file}}", - "onlyRunExecutableFiles": "Може да изпълнява само изпълними файлове", - "directories": "Директории", - "removedFromRecentFiles": "Премахнато е „{{name}}“ от последните файлове", - "removeFailed": "Премахването не бе успешно", - "unpinnedSuccessfully": "Откачено е успешно „{{name}}“", - "unpinFailed": "Откачването не бе успешно", - "removedShortcut": "Премахнат е пряк път „{{name}}“", - "removeShortcutFailed": "Премахването на пряк път не бе успешно", - "clearedAllRecentFiles": "Изчистени са всички скорошни файлове", - "clearFailed": "Изчистването не бе успешно", - "removeFromRecentFiles": "Премахване от скорошни файлове", - "clearAllRecentFiles": "Изчистване на всички скорошни файлове", - "unpinFile": "Откачи файл", - "removeShortcut": "Премахване на пряк път", - "pinFile": "Закачи файл", - "addToShortcuts": "Добавяне към преките пътища", - "pasteFailed": "Поставянето не бе успешно", - "noUndoableActions": "Няма отменими действия", - "undoCopySuccess": "Отменено копиране: Изтрити {{count}} копирани файлове", - "undoCopyFailedDelete": "Отмяната не бе успешна: Не можаха да бъдат изтрити копирани файлове", - "undoCopyFailedNoInfo": "Отмяната не бе успешна: Не можа да бъде намерена информация за копирания файл", - "undoMoveSuccess": "Отменена операция по преместване: {{count}} файлове са преместени обратно в оригиналното местоположение", - "undoMoveFailedMove": "Отмяната не бе успешна: Не можах да преместя файловете обратно", - "undoMoveFailedNoInfo": "Отмяната не бе успешна: Не можа да бъде намерена информация за преместения файл", - "undoDeleteNotSupported": "Операцията по изтриване не може да бъде отменена: Файловете са изтрити за постоянно от сървъра", - "undoTypeNotSupported": "Неподдържан тип операция за отмяна", - "undoOperationFailed": "Отмяната не бе успешна", - "unknownError": "Неизвестна грешка", - "confirm": "Потвърди", - "find": "Намерете...", - "replace": "Замяна", - "downloadInstead": "Изтегляне вместо това", - "keyboardShortcuts": "Клавишни комбинации", - "searchAndReplace": "Търсене и замяна", - "editing": "Редактиране", - "search": "Търсене", - "findNext": "Намери следващото", - "findPrevious": "Намери предишното", - "save": "Запазване", - "selectAll": "Избери всички", - "undo": "Отмяна", - "redo": "Преработи", - "moveLineUp": "Премести линията нагоре", - "moveLineDown": "Премести реда надолу", - "toggleComment": "Превключване на коментара", - "autoComplete": "Автоматично завършване", - "imageLoadError": "Зареждането на изображението не бе успешно", - "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": "НоваПапка", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Успешно преместени {{count}} елементи в {{target}}", - "move": "Преместване", - "searchInFile": "Търсене във файл (Ctrl+F)", - "showKeyboardShortcuts": "Показване на клавишни комбинации", - "startWritingMarkdown": "Започнете да пишете съдържанието си за markdown...", - "loadingFileComparison": "Зареждане на сравнението на файлове...", - "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": "Промяна на разрешенията", - "currentPermissions": "Текущи разрешения", - "owner": "Собственик", - "group": "Група", - "others": "Други", - "read": "Прочетете", - "write": "Пишете", - "execute": "Изпълнение", - "permissionsChangedSuccessfully": "Разрешенията са променени успешно", - "failedToChangePermissions": "Промяната на разрешенията не бе успешна", - "name": "Име", - "sortByName": "Име", - "sortByDate": "Дата на промяна", - "sortBySize": "Размер", - "ascending": "Възходящ", - "descending": "Низходящо", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Корен", "new": "Ново", "sortBy": "Сортиране по", @@ -1139,20 +1335,20 @@ "editor": "Редактор", "octal": "Осмичен", "storage": "Съхранение", - "disk": "Диск", - "used": "Използван", - "of": "от", - "toggleSidebar": "Превключване на страничната лента", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "Не може да се зареди PDF файл", "pdfLoadError": "Възникна грешка при зареждането на този PDF файл.", "loadingPdf": "Зареждане на PDF файл...", "loadingPage": "Зареждане на страницата..." }, "transfer": { - "copyToHost": "Копиране към хост…", - "moveToHost": "Преместване към хост…", - "copyItemsToHost": "Копиране на {{count}} елементи за хостване на…", - "moveItemsToHost": "Преместете {{count}} елементи, за да хоствате…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Няма други налични хостове за файлови мениджъри.", "noHostsConnectedHint": "Добавете друг SSH хост с активиран файлов мениджър в Host Manager.", "selectDestinationHost": "Изберете целеви хост", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Разгъване на скорошни дестинации", "browseFolders": "Преглед на целевите папки", "browseDestination": "Преглед или въвеждане на път", - "confirmCopy": "Копиране", - "confirmMove": "Преместване", - "transferring": "Прехвърляне…", - "compressing": "Компресиране…", - "extracting": "Извличане…", - "transferringItems": "Прехвърляне на {{current}} от {{total}} елементи…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Прехвърлянето е завършено", "transferError": "Прехвърлянето не бе успешно", - "transferPartial": "Прехвърлянето е завършено с {{count}} грешки", - "transferPartialHint": "Не можа да се прехвърли: {{paths}}", - "itemsSummary": "{{count}} артикули", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Дестинацията трябва да е директория за прехвърляне на множество елементи", "selectThisFolder": "Изберете тази папка", "browsePathWillBeCreated": "Тази папка все още не съществува. Тя ще бъде създадена, когато започне прехвърлянето.", "browsePathError": "Не можа да се отвори този път на целевия хост.", "goUp": "Качи се нагоре", - "copyFolderToHost": "Копиране на папката на хост…", - "moveFolderToHost": "Преместване на папката на хост…", - "hostReady": "Готов", - "hostConnecting": "Свързване…", - "hostDisconnected": "Няма връзка", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Изисква се удостоверяване — първо отворете Файловия мениджър на този хост", - "hostConnectionFailed": "Връзката не бе успешна", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Времетраене на трансферите", - "metricsPrepare": "Подготовка на дестинацията: {{duration}}", - "metricsCompress": "Компресиране при източника: {{duration}}", - "metricsHopSourceRead": "Източник → сървър: {{throughput}}", - "metricsHopDestSftpWrite": "Сървър → дестинация (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Сървър → дестинация (локална): {{throughput}}", - "metricsTransfer": "От край до край: {{throughput}} ({{duration}})", - "metricsExtract": "Извличане в местоназначението: {{duration}}", - "metricsSourceDelete": "Премахване от източника: {{duration}}", - "metricsTotal": "Общо: {{duration}}", - "progressCompressing": "Компресиране на изходния хост…", - "progressExtracting": "Извличане в местоназначението…", - "progressTransferring": "Прехвърляне на данни…", - "progressReconnecting": "Повторно свързване…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Паралелни трансферни ленти", - "parallelSegmentsOption": "{{count}} ленти", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Големите файлове се разделят на парчета от 256 MB. Няколко канала използват отделни връзки (като стартиране на няколко трансфера) за по-висока обща пропускателна способност.", - "progressTotalSpeed": "{{speed}} общо ({{lanes}} ленти)", - "progressTransferringItems": "Прехвърляне на файлове ({{current}} от {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} файлове", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Изходните файлове са запазени (частично прехвърляне)", "jumpHostLimitation": "И двата хоста трябва да са достъпни от Termix сървъра. Директното маршрутизиране от хост към хост не се поддържа.", - "cancel": "Отказ", + "cancel": "Cancel", "methodLabel": "Метод на прехвърляне", "methodAuto": "Автоматично", "methodTar": "Тар архив", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Избира tar или SFTP за всеки файл въз основа на броя, размера и компресируемостта на файловете. Отделните файлове винаги използват стрийминг SFTP.", "methodTarHint": "Компресиране при източника, прехвърляне на един архив, разархивиране при местоназначението. Изисква tar и на двата Unix хоста.", "methodItemSftpHint": "Прехвърляйте всеки файл поотделно през SFTP. Работи на всички хостове, включително Windows.", - "methodPreviewLoading": "Метод за изчисляване на трансфер…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Не можа да се прегледа методът за прехвърляне. Сървърът все пак ще избере метод, когато стартирате.", "methodPreviewWillUseTar": "Ще използвам: Tar архив", "methodPreviewWillUseItemSftp": "Ще използва: SFTP за всеки файл", - "methodPreviewScanSummary": "{{fileCount}} файлове, {{totalSize}} общо (сканирани на изходния хост).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Всеки файл използва същия SFTP поток като копие на един файл, следвани един след друг. Напредъкът се комбинира във всички файлове, така че лентата се движи бавно при големи файлове.", "methodReason": { "user_item_sftp": "Избрали сте SFTP за всеки файл.", "user_tar": "Избрахте tar архив.", "tar_unavailable": "Tar не е наличен на единия или и на двата хоста — вместо това ще се използва SFTP за всеки файл.", "windows_host": "Включен е хост на Windows — tar не се използва.", - "auto_multi_large": "Автоматично: множество файлове, включително голям файл ({{largestSize}}) със свиваеми данни — tar пакети в един трансфер.", - "auto_single_large_in_archive": "Автоматично: един голям файл ({{largestSize}}) в този набор — SFTP за всеки файл.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Автоматично: предимно некомпресируеми данни — SFTP за всеки файл.", - "auto_many_files": "Автоматично: много файлове ({{fileCount}}) — tar намалява натоварването на всеки файл.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Автоматично: SFTP за всеки файл за този набор." }, - "progressCancel": "Отказ", - "progressCancelling": "Анулиране…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Застоял", "resumedHint": "Възстановена е връзка с активно прехвърляне, започнато в друг прозорец.", "transferCancelled": "Прехвърлянето е анулирано", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Някои частични файлове не можаха да бъдат премахнати", "cleanupDestFilesNothing": "Няма нищо за почистване на дестинацията", "cleanupDestFilesError": "Почистването не бе успешно", - "retryTransfer": "Опитай отново", + "retryTransfer": "Retry", "retryTransferError": "Повторният опит не бе успешен", "transferFailedRetryHint": "В местоназначението са запазени частични данни. Повторният опит ще се възобнови, когато връзката се възстанови." }, "tunnels": { - "noSshTunnels": "Няма SSH тунели", - "createFirstTunnelMessage": "Все още не сте създали SSH тунели. Конфигурирайте тунелни връзки в Host Manager, за да започнете.", - "connected": "Свързан", - "disconnected": "Изключен", - "connecting": "Свързване...", - "error": "Грешка", - "canceling": "Анулиране...", - "connect": "Свържете се", - "disconnect": "Изключване", - "cancel": "Отказ", - "port": "Порт", - "localPort": "Локален порт", - "remotePort": "Отдалечен порт", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Текущ хост порт", - "endpointPort": "Порт за крайна точка", + "endpointPort": "Endpoint Port", "bindIp": "Локален IP адрес", - "endpointSshConfig": "SSH конфигурация на крайна точка", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "SSH хост за крайна точка", "endpointSshHostPlaceholder": "Изберете конфигуриран хост", "endpointSshHostRequired": "Изберете SSH хост за крайна точка за всеки клиентски тунел.", - "attempt": "Опит {{current}} от {{max}}", - "nextRetryIn": "Следващ опит след {{seconds}} секунди", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Клиентски тунели", "clientTunnel": "Клиентски тунел", "addClientTunnel": "Добавяне на клиентски тунел", "noClientTunnels": "Няма конфигурирани клиентски тунели на този работен плот.", - "tunnelName": "Име на тунела", - "remoteHost": "Отдалечен хост", - "autoStart": "Автоматично стартиране", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Стартира, когато този настолен клиент се отвори и остане свързан.", "clientManualStartDesc": "Използвайте „Старт“ и „Стоп“ от този ред. Termix няма да го отвори автоматично.", "clientRemoteServerNote": "Отдалеченото пренасочване може да изисква AllowTcpForwarding и GatewayPorts на SSH сървъра на крайната точка. Отдалеченият порт се затваря, когато този работен плот се изключи.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "Отдалеченият порт трябва да е между 1 и 65535.", "invalidLocalTargetPort": "Локалният целеви порт трябва да е между 1 и 65535.", "invalidEndpointPort": "Портът на крайната точка трябва да е между 1 и 65535.", - "duplicateAutoStartBind": "Само един тунел за автоматично стартиране на клиент може да използва {{bind}}.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Актуализирането на състоянието на тунела не бе успешно.", - "active": "Активен", - "start": "Старт", - "stop": "Спри", - "test": "Тест", - "type": "Тип тунел", - "typeLocal": "Местен (-L)", - "typeRemote": "Дистанционно (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Динамичен (-D)", "typeServerLocalDesc": "Текущ хост към крайна точка.", "typeServerRemoteDesc": "Крайна точка обратно към текущия хост.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Крайна точка обратно към локалния компютър.", "typeClientDynamicDesc": "SOCKS на локален компютър.", "typeDynamicDesc": "Пренасочване на SOCKS5 CONNECT трафик през SSH", - "forwardDescriptionServerLocal": "Текущ хост {{sourcePort}} → крайна точка {{endpointPort}}.", - "forwardDescriptionServerRemote": "Крайна точка {{endpointPort}} → текущ хост {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS на текущия хост {{sourcePort}}.", - "forwardDescriptionClientLocal": "Локален {{sourcePort}} → отдалечен {{endpointPort}}.", - "forwardDescriptionClientRemote": "Отдалечено {{sourcePort}} → локално {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS на локален порт {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → ЧОРАПИ чрез {{endpoint}}", - "autoNameClientLocal": "Местно {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → местен {{localPort}}", - "autoNameClientDynamic": "ЧОРАПИ {{localPort}} чрез {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Маршрут:", "lastStarted": "Последно стартирано", "lastTested": "Последно тествано", "lastError": "Последна грешка", - "maxRetries": "Максимален брой повторни опити", + "maxRetries": "Max Retries", "maxRetriesDescription": "Максимален брой опити за повторно опитване.", - "retryInterval": "Интервал на повторен опит (секунди)", - "retryIntervalDescription": "Време за изчакване между опитите за повторен опит.", - "local": "Местно", - "remote": "Дистанционно", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Дестинация", "host": "Домакин", "mode": "Режим", - "noHostSelected": "Няма избран хост", + "noHostSelected": "No host selected", "working": "Работа..." }, - "serverStats": { - "cpu": "Процесор", - "memory": "Памет", - "disk": "Диск", - "network": "Мрежа", - "uptime": "Време на работа", - "processes": "Процеси", - "available": "Налично", - "free": "Безплатно", - "connecting": "Свързване...", - "connectionFailed": "Неуспешно свързване със сървъра", - "naCpus": "Няма процесор(и)", - "cpuCores_one": "{{count}} Ядро", - "cpuCores_other": "{{count}} Ядра", - "cpuUsage": "Използване на процесора", - "memoryUsage": "Използване на паметта", - "diskUsage": "Използване на диска", - "failedToFetchHostConfig": "Неуспешно извличане на конфигурацията на хоста", - "serverOffline": "Сървърът е офлайн", - "cannotFetchMetrics": "Не могат да се извлекат показатели от офлайн сървър", - "totpFailed": "Проверката на TOTP не бе успешна", - "noneAuthNotSupported": "Статистиката на сървъра не поддържа тип удостоверяване „няма“.", - "load": "Зареждане", - "systemInfo": "Системна информация", - "hostname": "Име на хост", - "operatingSystem": "Операционна система", - "kernel": "Ядро", - "seconds": "секунди", - "networkInterfaces": "Мрежови интерфейси", - "noInterfacesFound": "Не са намерени мрежови интерфейси", - "noProcessesFound": "Не са намерени процеси", - "loginStats": "Статистика за SSH вход", - "noRecentLoginData": "Няма скорошни данни за вход", - "executingQuickAction": "Изпълнява се {{name}}...", - "quickActionSuccess": "{{name}} завършено успешно", - "quickActionFailed": "{{name}} неуспешно", - "quickActionError": "Неуспешно изпълнение на {{name}}", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Портове за слушане", - "protocol": "Протокол", - "port": "Порт", - "address": "Адрес", - "process": "Процес", - "noData": "Няма данни за портове за слушане" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Всички", + "noData": "No listening ports data" }, "firewall": { - "title": "Защитна стена", - "inactive": "Неактивен", - "policy": "Политика", - "rules": "правила", - "noData": "Няма налични данни за защитната стена", - "action": "Действие", - "protocol": "Прото", - "port": "Порт", - "source": "Източник", - "anywhere": "Навсякъде" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Зареждане на средно", "swap": "Размяна", "architecture": "Архитектура", - "refresh": "Обновяване", - "retry": "Опитай отново" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Работа...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Самостоятелно хоствано SSH и управление на отдалечен работен плот", - "loginTitle": "Вход в Termix", - "registerTitle": "Създаване на акаунт", - "forgotPassword": "Забравена парола?", - "rememberMe": "Запомни устройството за 30 дни (включва TOTP)", - "noAccount": "Нямате акаунт?", - "hasAccount": "Вече имате акаунт?", - "twoFactorAuth": "Двуфакторно удостоверяване", - "enterCode": "Въведете код за потвърждение", - "backupCode": "Или използвайте резервен код", - "verifyCode": "Код за проверка", - "redirectingToApp": "Пренасочване към приложението...", - "sshAuthenticationRequired": "Изисква се SSH удостоверяване", - "sshNoKeyboardInteractive": "Интерактивно удостоверяване с клавиатура не е налично", - "sshAuthenticationFailed": "Удостоверяването не бе успешно", - "sshAuthenticationTimeout": "Време за изчакване на удостоверяване", - "sshNoKeyboardInteractiveDescription": "Сървърът не поддържа интерактивно удостоверяване с клавиатура. Моля, въведете паролата или SSH ключа си.", - "sshAuthFailedDescription": "Предоставените идентификационни данни бяха неправилни. Моля, опитайте отново с валидни идентификационни данни.", - "sshTimeoutDescription": "Времето за изчакване на опита за удостоверяване изтече. Моля, опитайте отново.", - "sshProvideCredentialsDescription": "Моля, предоставете вашите SSH идентификационни данни, за да се свържете с този сървър.", - "sshPasswordDescription": "Въведете паролата за тази SSH връзка.", - "sshKeyPasswordDescription": "Ако вашият SSH ключ е криптиран, въведете паролата тук.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Изисква се парола", "passphraseRequiredDescription": "SSH ключът е криптиран. Моля, въведете паролата, за да го отключите.", - "back": "Обратно", - "firstUser": "Първи потребител", - "firstUserMessage": "Вие сте първият потребител и ще бъдете назначен за администратор. Можете да видите настройките на администратора в падащото меню за потребители в страничната лента. Ако смятате, че това е грешка, проверете лог файловете на Docker или създайте проблем в GitHub.", - "external": "Външен", - "loginWithExternal": "Вход с външен доставчик", - "loginWithExternalDesc": "Влезте, използвайки вашия конфигуриран външен доставчик на самоличност", - "externalNotSupportedInElectron": "Външното удостоверяване все още не се поддържа в приложението Electron. Моля, използвайте уеб версията за вход в OIDC.", - "resetPasswordButton": "Нулиране на парола", - "sendResetCode": "Изпрати код за нулиране", - "resetCodeDesc": "Въведете потребителското си име, за да получите код за нулиране на паролата. Кодът ще бъде записан в лог файловете на Docker контейнера.", - "resetCode": "Код за нулиране", - "verifyCodeButton": "Код за проверка", - "enterResetCode": "Въведете 6-цифрения код от лог файловете на Docker контейнера за потребителя:", - "newPassword": "Нова парола", - "confirmNewPassword": "Потвърдете паролата", - "enterNewPassword": "Въведете новата си парола за потребителя:", - "signUp": "Регистрация", - "desktopApp": "Настолно приложение", - "loggingInToDesktopApp": "Влизане в настолното приложение", - "loadingServer": "Зареждане на сървъра...", - "dataLossWarning": "Нулирането на паролата ви по този начин ще изтрие всички ваши запазени SSH хостове, идентификационни данни и други криптирани данни. Това действие не може да бъде отменено. Използвайте това само ако сте забравили паролата си и не сте влезли в системата.", - "authenticationDisabled": "Удостоверяването е деактивирано", - "authenticationDisabledDesc": "Всички методи за удостоверяване са деактивирани. Моля, свържете се с вашия администратор.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Проверете SSH хост ключа", - "keyChangedWarning": "SSH ключът на хоста е променен", - "firstConnectionTitle": "Първо свързване с този хост", - "firstConnectionDescription": "Автентичността на този хост не може да бъде установена. Проверете дали пръстовият отпечатък съответства на очакванията ви.", - "keyChangedDescription": "Ключът на хоста за този сървър се е променил от последното ви свързване. Това може да показва проблем със сигурността.", - "previousKey": "Предишен ключ", - "newFingerprint": "Нов пръстов отпечатък", - "fingerprint": "Пръстов отпечатък", - "verifyInstructions": "Ако имате доверие на този хост, щракнете върху „Приемам“, за да продължите и да запазите този пръстов отпечатък за бъдещи връзки.", - "securityWarning": "Предупреждение за сигурност", - "acceptAndContinue": "Приемам и продължавам", - "acceptNewKey": "Приемете новия ключ и продължете" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Не можа да се свърже с базата данни", - "unknownError": "Неизвестна грешка", - "loginFailed": "Влизането не бе успешно", - "failedPasswordReset": "Неуспешно стартиране на нулиране на паролата", - "failedVerifyCode": "Неуспешно потвърждаване на кода за нулиране", - "failedCompleteReset": "Неуспешно завършване на нулирането на паролата", - "invalidTotpCode": "Невалиден TOTP код", - "failedOidcLogin": "Стартирането на входа в OIDC не бе успешно", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Заявено е безшумно влизане, но влизането в OIDC не е налично.", "failedUserInfo": "Неуспешно получаване на потребителска информация след влизане", - "oidcAuthFailed": "OIDC удостоверяването не беше успешно", - "invalidAuthUrl": "Невалиден URL адрес за оторизация, получен от бекенд системата", - "requiredField": "Това поле е задължително", - "minLength": "Минималната дължина е {{min}}", - "passwordMismatch": "Паролите не съвпадат", - "passwordLoginDisabled": "Входът с потребителско име/парола е деактивиран в момента", - "sessionExpired": "Сесията е изтекла - моля, влезте отново", - "totpRateLimited": "Ограничена скорост: Твърде много опити за проверка на TOTP. Моля, опитайте отново по-късно.", - "totpRateLimitedWithTime": "Ограничена скорост: Твърде много опити за проверка на TOTP. Моля, изчакайте {{time}} секунди, преди да опитате отново.", - "resetCodeRateLimited": "Ограничена скорост: Твърде много опити за потвърждение. Моля, опитайте отново по-късно.", - "resetCodeRateLimitedWithTime": "Ограничена скорост: Твърде много опити за потвърждение. Моля, изчакайте {{time}} секунди, преди да опитате отново.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Запазването на токена за удостоверяване не бе успешно", "failedToLoadServer": "Зареждането на сървъра не бе успешно" }, "messages": { - "registrationDisabled": "Регистрацията на нов акаунт в момента е деактивирана от администратор. Моля, влезте или се свържете с администратор.", - "userNotAllowed": "Вашият акаунт не е оторизиран за регистрация. Моля, свържете се с администратор.", - "databaseConnectionFailed": "Неуспешно свързване със сървъра на базата данни", - "resetCodeSent": "Кодът за нулиране е изпратен до лог файловете на Docker", - "codeVerified": "Кодът е успешно потвърден", - "passwordResetSuccess": "Успешно възстановяване на паролата", - "loginSuccess": "Влизането е успешно", - "registrationSuccess": "Регистрацията е успешна" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Локални тунели за настолни компютри, насочени към конфигурирани SSH хостове.", "c2sTunnelPresets": "Предварителни настройки на клиентския тунел", "c2sTunnelPresetsDesc": "Запазете локалния списък с тунели на този настолен клиент като именуван предварително зададен сървър или заредете предварително зададена настройка обратно в този клиент.", "c2sTunnelPresetsUnavailable": "Предварителните настройки на клиентските тунели са налични само в настолния клиент.", - "c2sPresetName": "Име на предварително зададена настройка", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Име на предварително зададена настройка на клиента", "c2sPresetToLoad": "Предварително зададено зареждане", "c2sNoPresetSelected": "Няма избрана предварително зададена настройка", "c2sNoPresets": "Няма запазени предварително зададени настройки", - "c2sLoadPreset": "Зареждане", - "c2sCurrentLocalConfig": "{{count}} локални клиентски тунели, конфигурирани на този работен плот.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Предварителните настройки са изрични снимки; зареждането на такава замества списъка с локални клиентски тунели на този настолен клиент.", "c2sPresetSaved": "Предварително зададена настройка за тунел на клиента е запазена", "c2sPresetLoaded": "Предварително зададена настройка за тунел на клиента, заредена локално", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Език", - "keyPassword": "ключова парола", - "pastePrivateKey": "Поставете личния си ключ тук...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (слушане локално)", "localTargetHost": "127.0.0.1 (цел на този компютър)", "socksListenerHost": "127.0.0.1 (SOCKS слушател)", - "enterPassword": "Въведете паролата си", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Табло за управление", - "loading": "Зареждане на таблото за управление...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Поддръжка", - "discord": "Дискорд", - "serverOverview": "Преглед на сървъра", - "version": "Версия", - "upToDate": "Актуално", - "updateAvailable": "Налична е актуализация", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Бета", - "uptime": "Време на работа", - "database": "База данни", - "healthy": "Здравословен", - "error": "Грешка", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "Общо хостове", - "totalTunnels": "Общо тунели", - "totalCredentials": "Общо пълномощия", - "recentActivity": "Последна активност", - "reset": "Нулиране", - "loadingRecentActivity": "Зареждане на скорошна активност...", - "noRecentActivity": "Няма скорошна активност", - "quickActions": "Бързи действия", - "addHost": "Добавяне на хост", - "addCredential": "Добавяне на идентификационни данни", - "adminSettings": "Административни настройки", - "userProfile": "Потребителски профил", - "serverStats": "Статистика на сървъра", - "loadingServerStats": "Зареждане на статистиката на сървъра...", - "noServerData": "Няма налични данни от сървъра", - "cpu": "Процесор", - "ram": "RAM памет", - "customizeLayout": "Персонализиране на таблото за управление", - "dashboardSettings": "Настройки на таблото за управление", - "enableDisableCards": "Активиране/деактивиране на карти", - "resetLayout": "Възстановяване на фабричните настройки", - "serverOverviewCard": "Преглед на сървъра", - "recentActivityCard": "Последна активност", - "networkGraphCard": "Мрежова графика", - "networkGraph": "Мрежова графика", - "quickActionsCard": "Бързи действия", - "serverStatsCard": "Статистика на сървъра", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Главно", "panelSide": "Страна", - "justNow": "точно сега" + "justNow": "точно сега", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "СТАБИЛЕН", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "Няма конфигурирани хостове", "online": "ОНЛАЙН", "offline": "ОФЛАЙН", - "onlineLower": "Онлайн", - "nodes": "{{count}} възли", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Добави:", "commandPalette": "Палитра с команди", "done": "Готово", "editModeInstructions": "Плъзнете картите, за да ги пренаредите · Плъзнете разделителя на колоните, за да промените размера на колоните · Плъзнете долния ръб на картата, за да промените размера на височината ѝ · Изтрийте картата от кошчето", "empty": "Празно", - "clear": "Изчисти" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Добавяне на хост", - "addGroup": "Добавяне на група", - "addLink": "Добавяне на връзка", - "zoomIn": "Увеличаване на мащаба", - "zoomOut": "Намаляване на мащаба", - "resetView": "Нулиране на изгледа", - "selectHost": "Изберете хост", - "chooseHost": "Изберете хост...", - "parentGroup": "Родителска група", - "noGroup": "Няма група", - "groupName": "Име на групата", - "color": "Цвят", - "source": "Източник", - "target": "Цел", - "moveToGroup": "Преместване в група", - "selectGroup": "Изберете група...", - "addConnection": "Добавяне на връзка", - "hostDetails": "Детайли за хоста", - "removeFromGroup": "Премахване от групата", - "addHostHere": "Добавете хост тук", - "editGroup": "Редактиране на група", - "delete": "Изтриване", - "add": "Добавяне", - "create": "Създаване", - "move": "Преместване", - "connect": "Свържете се", - "createGroup": "Създаване на група", - "selectSourcePlaceholder": "Изберете източник...", - "selectTargetPlaceholder": "Изберете цел...", - "invalidFile": "Невалиден файл", - "hostAlreadyExists": "Хостът вече е в топологията", - "connectionExists": "Връзката вече съществува", - "unknown": "Неизвестен", - "name": "Име", - "ip": "ИП", - "status": "Статус", - "failedToAddNode": "Добавянето на възел не бе успешно", - "sourceDifferentFromTarget": "Източникът и целта трябва да са различни", - "exportJSON": "Експортиране на JSON", - "importJSON": "Импортиране на JSON", - "terminal": "Терминал", - "fileManager": "Файлов мениджър", - "tunnel": "Тунел", - "docker": "Докер", - "serverStats": "Статистика на сървъра", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Все още няма възли" }, "docker": { - "notEnabled": "Docker не е активиран за този хост", - "validating": "Валидиране на Docker...", - "connecting": "Свързване...", - "error": "Грешка", - "version": "Докер {{version}}", - "connectionFailed": "Неуспешно свързване с Docker", - "containerStarted": "Контейнерът {{name}} е стартиран", - "failedToStartContainer": "Неуспешно стартиране на контейнера {{name}}", - "containerStopped": "Контейнерът {{name}} е спрян", - "failedToStopContainer": "Неуспешно спиране на контейнера {{name}}", - "containerRestarted": "Контейнерът {{name}} е рестартиран", - "failedToRestartContainer": "Рестартирането на контейнера не бе успешно {{name}}", - "containerPaused": "Контейнерът {{name}} е на пауза", - "containerUnpaused": "Контейнерът {{name}} е възстановен", - "failedToTogglePauseContainer": "Неуспешно превключване на състоянието на пауза за контейнер {{name}}", - "containerRemoved": "Контейнерът {{name}} е премахнат", - "failedToRemoveContainer": "Неуспешно премахване на контейнера {{name}}", - "image": "Изображение", - "ports": "Портове", - "noPorts": "Няма портове", - "start": "Старт", - "confirmRemoveContainer": "Сигурни ли сте, че искате да премахнете контейнера „{{name}}“? Това действие не може да бъде отменено.", - "runningContainerWarning": "Предупреждение: Този контейнер в момента работи. Премахването му първо ще спре контейнера.", - "loadingContainers": "Зареждане на контейнери...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Докер мениджър", - "autoRefresh": "Автоматично опресняване", + "autoRefresh": "Auto Refresh", "timestamps": "Времеви печати", "lines": "Линии", - "filterLogs": "Филтриране на лог файлове...", - "refresh": "Обновяване", - "download": "Изтегляне", - "clear": "Изчисти", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Логовете са изтеглени успешно", "last50": "Последните 50", "last100": "Последните 100", "last500": "Последните 500", "last1000": "Последни 1000", "allLogs": "Всички лог файлове", - "noLogsMatching": "Няма регистрационни файлове, съответстващи на „{{query}}“", - "noLogsAvailable": "Няма налични лог файлове", - "noContainersFound": "Не са намерени контейнери", - "noContainersFoundHint": "На този хост няма налични Docker контейнери", - "searchPlaceholder": "Търсене на контейнери...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Всички статуси", - "stateRunning": "Бягане", + "stateRunning": "Running", "statePaused": "На пауза", "stateExited": "Излязох", "stateRestarting": "Рестартиране", - "noContainersMatchFilters": "Няма контейнери, които да отговарят на вашите филтри", - "noContainersMatchFiltersHint": "Опитайте да коригирате критериите си за търсене или филтриране", - "failedToFetchStats": "Извличането на статистически данни за контейнера не бе успешно", - "containerNotRunning": "Контейнерът не работи", - "startContainerToViewStats": "Стартирайте контейнера, за да видите статистиката", - "loadingStats": "Зареждане на статистика...", - "errorLoadingStats": "Грешка при зареждане на статистиката", - "noStatsAvailable": "Няма налична статистика", - "cpuUsage": "Използване на процесора", - "current": "Текущ", - "memoryUsage": "Използване на паметта", - "networkIo": "Мрежов вход/изход", - "input": "Вход", - "output": "Изход", - "blockIo": "Блокиране на входно/изходни данни", - "read": "Прочетете", - "write": "Пишете", - "pids": "PID-ове", - "containerInformation": "Информация за контейнера", - "name": "Име", - "id": "Идентификационен номер", - "state": "Щат", - "containerMustBeRunning": "Контейнерът трябва да е работещ, за да има достъп до конзолата", - "verificationCodePrompt": "Въведете код за потвърждение", - "totpVerificationFailed": "Проверката на TOTP не бе успешна. Моля, опитайте отново.", - "warpgateVerificationFailed": "Удостоверяването на Warpgate не бе успешно. Моля, опитайте отново.", - "connectedTo": "Свързано с {{containerName}}", - "disconnected": "Изключен", - "consoleError": "Грешка в конзолата", - "errorMessage": "Грешка: {{message}}", - "failedToConnect": "Неуспешно свързване с контейнера", - "console": "Конзола", - "selectShell": "Изберете черупка", - "bash": "Баш", - "sh": "ш", - "ash": "пепел", - "connect": "Свържете се", - "disconnect": "Изключване", - "notConnected": "Няма връзка", - "clickToConnect": "Щракнете върху „Свързване“, за да стартирате сесия на shell", - "connectingTo": "Свързване към {{containerName}}...", - "containerNotFound": "Контейнерът не е намерен", - "backToList": "Обратно към списъка", - "logs": "Дневници", - "stats": "Статистика", - "consoleTab": "Конзола", - "startContainerToAccess": "Стартирайте контейнера, за да получите достъп до конзолата" + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Общи", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Потребители", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Сесии", - "sectionRoles": "Роли", - "sectionDatabase": "База данни", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API ключове", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Изчистване на филтрите", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Всички", "allowRegistration": "Разрешаване на регистрация на потребител", - "allowRegistrationDesc": "Позволете на новите потребители да се регистрират сами", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Разрешаване на вход с парола", "allowPasswordLoginDesc": "Вход с потребителско име/парола", "oidcAutoProvision": "Автоматично осигуряване на OIDC", - "oidcAutoProvisionDesc": "Автоматично създаване на акаунти за потребители на OIDC, дори когато регистрацията е деактивирана", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Разрешаване на нулиране на паролата", "allowPasswordResetDesc": "Нулиране на кода чрез Docker логове", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Време за изчакване на сесията", - "hours": "часове", + "hours": "hours", "sessionTimeoutRange": "Мин. 1 ч. · Макс. 720 ч.", - "monitoringDefaults": "Мониторинг на настройки по подразбиране", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Проверка на състоянието", - "metrics": "Метрики", + "metrics": "Metrics", "sec": "сек", "logLevel": "Ниво на лога", "enableGuacamole": "Активиране на гуакамоле", "enableGuacamoleDesc": "RDP/VNC отдалечен работен плот", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "URL адрес на GUACD", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "Конфигурирайте OpenID Connect за SSO. Полетата, маркирани с *, са задължителни.", - "oidcClientId": "Идентификационен номер на клиента", - "oidcClientSecret": "Клиентска тайна", - "oidcAuthUrl": "URL адрес за оторизация", - "oidcIssuerUrl": "URL адрес на издателя", - "oidcTokenUrl": "URL адрес на токена", - "oidcUserIdentifier": "Път на потребителския идентификатор", - "oidcDisplayName": "Път на показваното име", - "oidcScopes": "Обхвати", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Замяна на URL адреса на потребителската информация", - "oidcAllowedUsers": "Разрешени потребители", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "По един имейл на ред. Оставете празно, за да разрешите всички.", - "removeOidc": "Премахване", - "usersCount": "{{count}} потребители", - "createUser": "Създаване", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Нова роля", - "roleName": "Име", - "roleDisplayName": "Показвано име", - "roleDescription": "Описание", - "rolesCount": "{{count}} роли", - "createRole": "Създаване", - "creating": "Създаване...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Експортиране на база данни", "exportDatabaseDesc": "Изтеглете резервно копие на всички хостове, идентификационни данни и настройки", - "export": "Експорт", - "exporting": "Експортиране...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Импортиране на база данни", "importDatabaseDesc": "Възстановяване от .sqlite архивен файл", - "importDatabaseSelected": "Избрано: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Изберете файл", - "changeFile": "Промяна", - "import": "Внос", - "importing": "Импортиране...", - "apiKeysCount": "{{count}} клавиши", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Нов API ключ", "apiKeyCreatedWarning": "Ключът е създаден - копирайте го сега, няма да се показва отново.", - "apiKeyName": "Име", - "apiKeyUser": "Потребител", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Изберете потребител...", - "apiKeyExpiresAt": "Изтича в", + "apiKeyExpiresAt": "Expires At", "createKey": "Създаване на ключ", "apiKeyNoExpiry": "Без срок на годност", "revokedBadge": "ОТМЕНЕНО", - "authTypeDual": "Двойно удостоверяване", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Местно", - "adminStatusAdministrator": "Администратор", - "adminStatusRegularUser": "Редовен потребител", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "АДМИНИСТРАТОР", "systemBadge": "СИСТЕМА", "customBadge": "ПЕРСОНАЛИЗИРАН", "youBadge": "ТИ", - "sessionsActive": "{{count}} активен", - "sessionActive": "Активен: {{time}}", - "sessionExpires": "Валидност: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "Всички", "revokeAllSessionsSuccess": "Всички сесии за потребителя са отменени", - "revokeAllSessionsFailed": "Неуспешно отменяне на сесиите", - "revokeSessionFailed": "Неуспешно отменяне на сесията", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Добавяне на роля", "noCustomRoles": "Няма дефинирани персонализирани роли", - "removeRoleFailed": "Премахването на ролята не бе успешно", - "assignRoleFailed": "Присвояването на роля не бе успешно", - "deleteRoleFailed": "Изтриването на ролята не бе успешно", - "userAdminAccess": "Администратор", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Пълен достъп до всички администраторски настройки", - "userRoles": "Роли", - "revokeAllUserSessions": "Отмяна на всички сесии", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Принудително повторно влизане на всички устройства", - "revoke": "Отмяна", + "revoke": "Revoke", "deleteUserWarning": "Изтриването на този потребител е окончателно.", - "deleteUser": "Изтриване {{username}}", - "deleting": "Изтриване...", - "deleteUserFailed": "Изтриването на потребителя не бе успешно", - "deleteUserSuccess": "Потребителят „{{username}}“ е изтрит", - "deleteRoleSuccess": "Ролята „{{name}}“ е изтрита", - "revokeKeySuccess": "Ключ „{{name}}“ е отменен", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Неуспешно отменяне на ключа", - "copiedToClipboard": "Копирано в буферната памет", + "copiedToClipboard": "Copied to clipboard", "done": "Готово", - "createUserTitle": "Създаване на потребител", + "createUserTitle": "Create User", "createUserDesc": "Създайте нов локален акаунт.", - "createUserUsername": "Потребителско име", - "createUserPassword": "Парола", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Минимум 6 знака.", - "createUserEnterUsername": "Въведете потребителско име", - "createUserEnterPassword": "Въведете парола", - "createUserSubmit": "Създаване на потребител", - "editUserTitle": "Управление на потребител: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Редактиране на роли, администраторски статус, сесии и настройки на акаунта.", - "editUserUsername": "Потребителско име", + "editUserUsername": "Username", "editUserAuthType": "Тип оторизация", - "editUserAdminStatus": "Статус на администратора", - "editUserUserId": "Потребителски идентификатор", - "linkAccountTitle": "Свързване на OIDC с акаунт с парола", - "linkAccountDesc": "Обединете OIDC акаунта {{username}} със съществуващ локален акаунт.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Това ще:", "linkAccountEffect1": "Изтриване на акаунт само за OIDC", "linkAccountEffect2": "Добавете OIDC вход към целевия акаунт", "linkAccountEffect3": "Позволете влизане както с OIDC, така и с парола", - "linkAccountTargetUsername": "Целево потребителско име", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Въведете потребителското име на локалния акаунт, към който да се свърже", - "linkAccounts": "Свързване на акаунти", - "linkAccountSuccess": "OIDC акаунт, свързан с „{{username}}“", - "linkAccountFailed": "Свързването на OIDC акаунт не бе успешно", - "linkAccountInProgress": "Свързване...", - "saving": "Запазване...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Актуализирането на настройката за регистрация не бе успешно", "updatePasswordLoginFailed": "Актуализирането на настройката за вход с парола не бе успешно", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Актуализирането на настройката за автоматично предоставяне на OIDC не бе успешно", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Актуализирането на настройката за нулиране на паролата не бе успешно", "sessionTimeoutRange2": "Времето за изчакване на сесията трябва да е между 1 и 720 часа", "sessionTimeoutSaved": "Времето за изчакване на сесията е запазено", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Невалидни интервални стойности", "monitoringSaved": "Настройките за наблюдение са запазени", "monitoringSaveFailed": "Запазването на настройките за наблюдение не бе успешно", - "guacamoleSaved": "Настройките за гуакамоле са запазени", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Запазването на настройките за гуакамоле не бе успешно", "guacamoleUpdateFailed": "Актуализирането на настройката за гуакамоле не бе успешно", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Актуализирането на нивото на лога не бе успешно", "oidcSaved": "OIDC конфигурацията е запазена", "oidcSaveFailed": "Запазването на OIDC конфигурацията не бе успешно", "oidcRemoved": "OIDC конфигурацията е премахната", "oidcRemoveFailed": "Неуспешно премахване на OIDC конфигурацията", "createUserRequired": "Потребителско име и парола са задължителни", - "createUserPasswordTooShort": "Паролата трябва да е поне 6 знака", - "createUserSuccess": "Потребителят „{{username}}“ е създаден", - "createUserFailed": "Създаването на потребител не бе успешно", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Актуализирането на администраторския статус не бе успешно", "allSessionsRevoked": "Всички сесии са отменени", - "revokeSessionsFailed": "Неуспешно отменяне на сесиите", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Името и показваното име са задължителни", - "createRoleSuccess": "Ролята „{{name}}“ е създадена", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Създаването на роля не бе успешно", "apiKeyNameRequired": "Името на ключа е задължително", "apiKeyUserRequired": "Изисква се потребителско име", - "apiKeyCreatedSuccess": "API ключът „{{name}}“ е създаден", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Създаването на API ключ не бе успешно", "exportSuccess": "Базата данни е експортирана успешно", "exportFailed": "Експортирането на базата данни не бе успешно", "importSelectFile": "Моля, първо изберете файл", - "importCompleted": "Импортирането е завършено: {{total}} елемента са импортирани, {{skipped}} са пропуснати", - "importFailed": "Импортирането не бе успешно: {{error}}", - "importError": "Импортирането на базата данни не бе успешно" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Импортирането на базата данни не бе успешно", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Домакин", - "hostPlaceholder": "192.168.1.1 или example.com", - "portLabel": "Порт", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Потребителско име", - "usernamePlaceholder": "потребителско име", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Авторизация", - "passwordLabel": "Парола", - "passwordPlaceholder": "парола", - "privateKeyLabel": "Частен ключ", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Поставяне на личен ключ...", - "credentialLabel": "Пълномощия", + "credentialLabel": "Credential", "credentialPlaceholder": "Изберете запазени идентификационни данни", - "connectToTerminal": "Свързване с терминала", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Свързване с файлове" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Изчисти всички", "noHistoryEntries": "Няма записи в историята", "trackingDisabled": "Проследяването на историята е деактивирано", - "trackingDisabledHint": "Активирайте го в настройките на профила си, за да записвате команди." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Запис на ключове", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Записване към терминали", "selectAll": "Всички", - "selectNone": "Няма", + "selectNone": "None", "noTerminalTabsOpen": "Няма отворени раздели на терминала", "selectTerminalsAbove": "Изберете терминали по-горе", "broadcastInputPlaceholder": "Въведете тук, за да излъчвате натисканията на клавиши...", "stopRecording": "Спиране на записа", "startRecording": "Стартиране на запис", - "settingsTitle": "Настройки", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Активиране на копиране/поставяне чрез щракване с десен бутон" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "Плъзнете раздели в панелите по-горе или използвайте „Бързо присвояване“", "dropHere": "Пуснете тук", "emptyPane": "Празно", - "dashboard": "Табло за управление", + "dashboard": "Dashboard", "clearSplitScreen": "Изчистване на разделения екран", "quickAssign": "Бързо присвояване", - "alreadyAssigned": "Панел {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Разделяне на раздела", "addToSplit": "Добави към Сплит", "removeFromSplit": "Премахване от Сплит", - "assignToPane": "Присвояване към панела" + "assignToPane": "Присвояване към панела", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Създаване на фрагмент", - "createSnippetDescription": "Създайте нов фрагмент от команда за бързо изпълнение", - "nameLabel": "Име", - "namePlaceholder": "например, рестартирайте Nginx", - "descriptionLabel": "Описание", - "descriptionPlaceholder": "Незадължително описание", - "optional": "По избор", - "folderLabel": "Папка", - "noFolder": "Няма папка (Без категория)", - "commandLabel": "Команда", - "commandPlaceholder": "например, sudo systemctl рестартиране на nginx", - "cancel": "Отказ", - "createSnippetButton": "Създаване на фрагмент", - "createFolderTitle": "Създаване на папка", - "createFolderDescription": "Организирайте фрагментите си в папки", - "folderNameLabel": "Име на папката", - "folderNamePlaceholder": "напр. системни команди, Docker скриптове", - "folderColorLabel": "Цвят на папката", - "folderIconLabel": "Икона на папка", - "previewLabel": "Преглед", - "folderNameFallback": "Име на папката", - "createFolderButton": "Създаване на папка", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Целеви терминали", "selectAll": "Всички", - "selectNone": "Няма", + "selectNone": "None", "noTerminalTabsOpen": "Няма отворени раздели на терминала", - "searchPlaceholder": "Търсене на фрагменти...", - "newSnippet": "Нов фрагмент", - "newFolder": "Нова папка", - "run": "Бягане", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Няма фрагменти в тази папка", - "uncategorized": "Некатегоризирано", - "editSnippetTitle": "Редактиране на фрагмент", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Актуализирайте този фрагмент от командата", "saveSnippetButton": "Запазване на промените", - "createSuccess": "Фрагментът е създаден успешно", - "createFailed": "Създаването на фрагмент не бе успешно", - "updateSuccess": "Фрагментът е актуализиран успешно", - "updateFailed": "Актуализирането на фрагмента не бе успешно", - "deleteFailed": "Изтриването на фрагмента не бе успешно", - "folderCreateSuccess": "Папката е създадена успешно", - "folderCreateFailed": "Създаването на папка не бе успешно", - "editFolderTitle": "Редактиране на папка", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Преименувайте или променете външния вид на тази папка", "saveFolderButton": "Запазване на промените", "editFolder": "Редактиране на папка", "deleteFolder": "Изтриване на папка", - "folderDeleteSuccess": "Папка „{{name}}“ е изтрита", - "folderDeleteFailed": "Изтриването на папката не бе успешно", - "folderEditSuccess": "Папката е актуализирана успешно", - "folderEditFailed": "Актуализирането на папката не бе успешно", - "confirmRunMessage": "Изпълни „{{name}}“?", - "confirmRunButton": "Бягане", - "runSuccess": "Изпълни „{{name}}“ в {{count}} терминал(и)", - "copySuccess": "Копирано „{{name}}“ в клипборда", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Споделяне на фрагмент", - "shareUser": "Потребител", - "shareRole": "Роля", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Изберете потребител...", "selectRole": "Изберете роля...", "shareSuccess": "Фрагментът е споделен успешно", "shareFailed": "Споделянето на фрагмента не бе успешно", "revokeSuccess": "Достъпът е отменен", - "revokeFailed": "Неуспешно отменяне на достъпа", - "currentAccess": "Текущ достъп", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Зареждането на данните за споделяне не бе успешно", - "loading": "Зареждане...", - "close": "Затвори", - "reorderFailed": "Запазването на реда на фрагмента не бе успешно" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Запазването на реда на фрагмента не бе успешно", + "importExport": "Внос / Износ", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Няма конфигурирани хостове", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Профил", - "sectionAppearance": "Външен вид", - "sectionSecurity": "Сигурност", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API ключове", "sectionC2sTunnels": "Тунели C2S", - "usernameLabel": "Потребителско име", - "roleLabel": "Роля", - "roleAdministrator": "Администратор", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Метод за удостоверяване", - "authMethodLocal": "Местно", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "Включено", "twoFaOff": "Изключено", - "versionLabel": "Версия", - "deleteAccount": "Изтриване на акаунт", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Изтрийте профила си завинаги", - "deleteButton": "Изтриване", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Това действие е постоянно и не може да бъде отменено.", "deleteAccountWarning": "Всички сесии, хостове, идентификационни данни и настройки ще бъдат изтрити за постоянно.", - "confirmPasswordDeletePlaceholder": "Въведете паролата си за потвърждение", - "languageLabel": "Език", - "themeLabel": "Тема", - "fontSizeLabel": "Размер на шрифта", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Акцентен цвят", - "settingsTerminal": "Терминал", - "commandAutocomplete": "Автоматично довършване на команди", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Показване на автоматично довършване при въвеждане", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Проследяване на историята", "historyTrackingDesc": "Проследяване на команди на терминала", - "syntaxHighlighting": "Подчертаване на синтаксиса", - "syntaxHighlightingDesc": "Маркирайте изхода на терминала", "commandPalette": "Палитра с команди", "commandPaletteDesc": "Активиране на клавишна комбинация", "reopenTabsOnLogin": "Отваряне на раздели отново при влизане", "reopenTabsOnLoginDesc": "Възстановете отворените си раздели, когато влезете или обновите страницата, дори от друго устройство", "confirmTabClose": "Потвърждаване на затваряне на раздела", "confirmTabCloseDesc": "Попитай преди затваряне на раздели на терминала", - "settingsSidebar": "Странична лента", - "showHostTags": "Показване на етикети на хоста", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Показване на тагове в списъка с хостове", "hostTrayOnClick": "Щракнете, за да разгънете действията на хоста", "hostTrayOnClickDesc": "Винаги показвайте бутоните за връзка; щракнете, за да разгънете опциите за управление, вместо да задържите курсора на мишката върху тях.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Поддържайте релсата на приложението в лявата странична лента винаги разгъната, вместо да се разширява при задържане на курсора на мишката", - "settingsSnippets": "Откъси", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Папките са свити", "foldersCollapsedDesc": "Свиване на папките по подразбиране", "confirmExecution": "Потвърждаване на изпълнението", "confirmExecutionDesc": "Потвърдете преди изпълнение на фрагменти", - "settingsUpdates": "Актуализации", + "settingsUpdates": "Updates", "disableUpdateChecks": "Деактивиране на проверките за актуализации", "disableUpdateChecksDesc": "Спрете проверката за актуализации", "totpAuthenticator": "TOTP удостоверител", @@ -2109,68 +2612,68 @@ "qrCode": "QR код", "totpInstructions": "Сканирайте QR кода или въведете секретния код в приложението си за удостоверяване, след което въведете 6-цифрения код", "totpCodePlaceholder": "000000", - "verify": "Проверка", - "changePassword": "Промяна на паролата", - "currentPasswordLabel": "Текуща парола", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Текуща парола", - "newPasswordLabel": "Нова парола", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Нова парола", "confirmPasswordLabel": "Потвърдете новата парола", "confirmPasswordPlaceholder": "Потвърдете новата парола", "updatePassword": "Актуализиране на паролата", "createApiKeyTitle": "Създаване на API ключ", "createApiKeyDescription": "Генерирайте нов API ключ за програмен достъп.", - "apiKeyNameLabel": "Име", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "напр. CI тръбопровод", "expiryDateLabel": "Дата на изтичане", "optional": "по избор", - "cancel": "Отказ", + "cancel": "Cancel", "createKey": "Създаване на ключ", - "apiKeyCount": "{{count}} клавиши", + "apiKeyCount": "{{count}} keys", "newKey": "Нов ключ", "noApiKeys": "Все още няма API ключове.", - "apiKeyActive": "Активен", + "apiKeyActive": "Active", "apiKeyUsageHint": "Включете ключа си в", "apiKeyUsageHintHeader": "заглавка.", "apiKeyPermissionsHint": "Ключовете наследяват разрешенията на потребителя, който ги е създал.", - "roleUser": "Потребител", - "authMethodDual": "Двойно удостоверяване", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Неуспешно стартиране на настройката на TOTP", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Въведете 6-цифрен код", "totpEnabledSuccess": "Двуфакторно удостоверяване е активирано", "totpInvalidCode": "Невалиден код, моля опитайте отново", "totpDisableInputRequired": "Въведете вашия TOTP код или парола", - "totpDisabledSuccess": "Двуфакторното удостоверяване е деактивирано", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "Деактивирането на 2FA не бе успешно", - "totpDisableTitle": "Деактивиране на 2FA", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Въведете TOTP код или парола", - "totpDisableConfirm": "Деактивиране на 2FA", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Продължете с проверката", - "totpVerifyTitle": "Код за проверка", - "totpBackupTitle": "Резервни кодове", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Изтегляне на резервни кодове", "done": "Готово", "secretCopied": "Тайната е копирана в клипборда", "apiKeyNameRequired": "Името на ключа е задължително", - "apiKeyCreated": "API ключът „{{name}}“ е създаден", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Създаването на API ключ не бе успешно", - "apiKeyUser": "Потребител", - "apiKeyExpires": "Изтича", - "apiKeyRevoked": "API ключът „{{name}}“ е отменен", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "Неуспешно отменяне на API ключа", "passwordFieldsRequired": "Изискват се текуща и нова парола", - "passwordMismatch": "Паролите не съвпадат", - "passwordTooShort": "Паролата трябва да е поне 6 знака", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Паролата е актуализирана успешно", "passwordUpdateFailed": "Актуализирането на паролата не бе успешно", "deletePasswordRequired": "Изисква се парола за изтриване на акаунта ви", - "deleteFailed": "Изтриването на акаунта не бе успешно", - "deleting": "Изтриване...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Отваряне на инструмента за избор на цвят", - "themeSystem": "Система", - "themeLight": "Светлина", - "themeDark": "Тъмно", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Дракула", "themeCatppuccin": "Катпучин", "themeNord": "Норд", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Грувбокс" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "точно сега", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Раздел", + "backTab": "⇥", + "arrowUp": "Стрелка нагоре", + "arrowDown": "Стрелка надолу", + "arrowLeft": "Стрелка наляво", + "arrowRight": "Стрелка надясно", + "home": "Home", + "end": "Край", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Готово" } } diff --git a/src/ui/locales/translated/bn_BD.json b/src/ui/locales/translated/bn_BD.json index 8e273fca..3c45a3e8 100644 --- a/src/ui/locales/translated/bn_BD.json +++ b/src/ui/locales/translated/bn_BD.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "ফোল্ডার", - "folder": "ফোল্ডার", - "password": "পাসওয়ার্ড", - "key": "চাবি", - "sshPrivateKey": "SSH ব্যক্তিগত কী", - "upload": "আপলোড", - "keyPassword": "চাবি পাসওয়ার্ড", - "sshKey": "SSH কী", - "uploadPrivateKeyFile": "প্রাইভেট কী ফাইল আপলোড করুন", - "searchCredentials": "ক্রেডেনশিয়াল অনুসন্ধান করুন...", - "addCredential": "পরিচয়পত্র যোগ করুন", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "সিএ সার্টিফিকেট (-cert.pub)", "caCertificateDescription": "ঐচ্ছিক: CA-স্বাক্ষরিত সার্টিফিকেট ফাইলটি (যেমন id_ed25519-cert.pub) আপলোড বা পেস্ট করুন। আপনার SSH সার্ভার সার্টিফিকেট-ভিত্তিক অনুমোদন ব্যবহার করলে এটি আবশ্যক।", "uploadCertFile": "আপলোড -cert.pub ফাইল", - "clearCert": "পরিষ্কার", + "clearCert": "Clear", "certLoaded": "সার্টিফিকেট লোড করা হয়েছে", "certPublicKeyLabel": "সিএ সার্টিফিকেট", "certTypeLabel": "সার্টিফিকেটের ধরন", "pasteOrUploadCert": "একটি -cert.pub সার্টিফিকেট পেস্ট বা আপলোড করুন...", "hasCaCert": "সিএ সার্টিফিকেট আছে", - "noCaCert": "কোন CA সার্টিফিকেট নেই" + "noCaCert": "কোন CA সার্টিফিকেট নেই", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "ডিফল্ট অর্ডার", + "sortNameAsc": "নাম (A → Z)", + "sortNameDesc": "নাম (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "ফিল্টার পরিষ্কার করুন", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "সতর্কতা লোড করতে ব্যর্থ হয়েছে", - "failedToDismissAlert": "সতর্কতা খারিজ করতে ব্যর্থ হয়েছে" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "সার্ভার কনফিগারেশন", - "description": "আপনার ব্যাকএন্ড পরিষেবাগুলির সাথে সংযোগ করতে Termix সার্ভার URL কনফিগার করুন।", - "serverUrl": "সার্ভার ইউআরএল", - "enterServerUrl": "অনুগ্রহ করে একটি সার্ভার URL লিখুন", - "saveFailed": "কনফিগারেশন সংরক্ষণ করতে ব্যর্থ হয়েছে", - "saveError": "কনফিগারেশন সংরক্ষণ করতে ত্রুটি হয়েছে", - "saving": "সঞ্চয়...", - "saveConfig": "কনফিগারেশন সংরক্ষণ করুন", - "helpText": "আপনার Termix সার্ভারটি যেখানে চলছে সেই URL-টি লিখুন (যেমন, http://localhost:30001 অথবা https://your-server.com)", - "changeServer": "সার্ভার পরিবর্তন করুন", - "mustIncludeProtocol": "সার্ভার URL অবশ্যই http:// অথবা https:// দিয়ে শুরু হতে হবে।", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "অবৈধ সার্টিফিকেট অনুমোদন করুন", "allowInvalidCertificateDesc": "শুধুমাত্র সেলফ-সাইন্ড বা আইপি-অ্যাড্রেস সার্টিফিকেটযুক্ত বিশ্বস্ত সেলফ-হোস্টেড সার্ভারের জন্য ব্যবহার করুন।", - "useEmbedded": "স্থানীয় সার্ভার ব্যবহার করুন", - "embeddedDesc": "অন্তর্নির্মিত স্থানীয় সার্ভার দিয়ে টারমিক্স চালান (কোন রিমোট সার্ভারের প্রয়োজন নেই)।", - "embeddedConnecting": "স্থানীয় সার্ভারের সাথে সংযোগ স্থাপন করা হচ্ছে...", - "embeddedNotReady": "স্থানীয় সার্ভার এখনও প্রস্তুত নয়। অনুগ্রহ করে কিছুক্ষণ অপেক্ষা করে আবার চেষ্টা করুন।", - "localServer": "স্থানীয় সার্ভার" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "স্থানীয় সার্ভার", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "সংস্করণ যাচাই ত্রুটি", - "checkFailed": "আপডেট পরীক্ষা করতে ব্যর্থ হয়েছে", - "upToDate": "অ্যাপটি হালনাগাদ করা হয়েছে", - "currentVersion": "আপনি {{version}} সংস্করণটি চালাচ্ছেন।", - "updateAvailable": "আপডেট উপলব্ধ", - "newVersionAvailable": "একটি নতুন সংস্করণ উপলব্ধ! আপনি {{current}}ব্যবহার করছেন, কিন্তু {{latest}} উপলব্ধ আছে।", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "বিটা সংস্করণ", - "betaVersionDesc": "আপনি {{current}}ব্যবহার করছেন, যা সর্বশেষ স্থিতিশীল রিলিজ {{latest}} এর চেয়ে নতুন।", - "releasedOn": "{{date}} তারিখে প্রকাশিত।", - "downloadUpdate": "আপডেট ডাউনলোড করুন", - "checking": "আপডেট যাচাই করা হচ্ছে...", - "checkUpdates": "আপডেটগুলির জন্য পরীক্ষা করুন", - "checkingUpdates": "আপডেট যাচাই করা হচ্ছে...", - "updateRequired": "আপডেট প্রয়োজন" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "বন্ধ করুন", - "minimize": "ন্যূনতম করুন", - "online": "অনলাইন", - "offline": "অফলাইন", - "continue": "চালিয়ে যান", - "maintenance": "রক্ষণাবেক্ষণ", - "degraded": "অবনমিত", - "error": "ত্রুটি", - "warning": "সতর্কতা", - "unsavedChanges": "সংরক্ষিত নয় এমন পরিবর্তন", - "dismiss": "খারিজ করুন", - "loading": "লোড হচ্ছে...", - "optional": "ঐচ্ছিক", - "connect": "সংযোগ করুন", - "copied": "অনুলিপি করা হয়েছে", - "connecting": "সংযোগ স্থাপন...", - "updateAvailable": "আপডেট উপলব্ধ", - "appName": "টার্মিক্স", - "openInNewTab": "নতুন ট্যাবে খুলুন", - "noReleases": "কোন রিলিজ নেই", - "updatesAndReleases": "আপডেট এবং রিলিজ", - "newVersionAvailable": "একটি নতুন সংস্করণ ({{version}}) পাওয়া যাচ্ছে।", - "failedToFetchUpdateInfo": "আপডেট তথ্য আনতে ব্যর্থ হয়েছে", - "preRelease": "প্রি-রিলিজ", - "noReleasesFound": "কোনো রিলিজ খুঁজে পাওয়া যায়নি।", - "cancel": "বাতিল করুন", - "username": "ব্যবহারকারীর নাম", - "login": "লগইন", - "register": "নিবন্ধন করুন", - "password": "পাসওয়ার্ড", - "confirmPassword": "পাসওয়ার্ড নিশ্চিত করুন", - "back": "ফিরে যান", - "save": "সংরক্ষণ করুন", - "saving": "সঞ্চয়...", - "delete": "মুছে ফেলুন", - "rename": "নাম পরিবর্তন", - "edit": "সম্পাদনা", - "add": "যোগ করুন", - "confirm": "নিশ্চিত করুন", - "no": "না", - "or": "অথবা", - "next": "পরবর্তী", - "previous": "পূর্ববর্তী", - "refresh": "রিফ্রেশ", - "language": "ভাষা", - "checking": "যাচাই করা হচ্ছে...", - "checkingDatabase": "ডাটাবেস সংযোগ পরীক্ষা করা হচ্ছে...", - "checkingAuthentication": "প্রমাণীকরণ যাচাই করা হচ্ছে...", - "backendReconnected": "সার্ভার সংযোগ পুনরুদ্ধার করা হয়েছে", - "connectionDegraded": "সার্ভার সংযোগ বিচ্ছিন্ন, পুনরুদ্ধার করা হচ্ছে…", - "reload": "পুনরায় লোড করুন", - "remove": "অপসারণ করুন", - "create": "তৈরি করুন", - "update": "আপডেট", - "copy": "অনুলিপি", - "copyFailed": "ক্লিপবোর্ডে কপি করতে ব্যর্থ হয়েছে", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "সর্বাধিক করুন", "restore": "পুনরুদ্ধার করুন", - "of": "এর" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "হোম", - "terminal": "টার্মিনাল", - "docker": "ডকার", - "tunnels": "টানেল", - "fileManager": "ফাইল ম্যানেজার", - "serverStats": "সার্ভার পরিসংখ্যান", - "admin": "প্রশাসক", - "userProfile": "ব্যবহারকারীর প্রোফাইল", - "splitScreen": "স্প্লিট স্ক্রিন", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "এই সক্রিয় সেশনটি বন্ধ করবেন?", - "close": "বন্ধ করুন", - "cancel": "বাতিল করুন", - "sshManager": "এসএসএইচ ম্যানেজার", - "cannotSplitTab": "এই ট্যাবটি ভাগ করা যাবে না", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "পাসওয়ার্ড কপি করুন", - "copySudoPassword": "Sudo পাসওয়ার্ড কপি করুন", - "passwordCopied": "পাসওয়ার্ড ক্লিপবোর্ডে কপি করা হয়েছে", - "noPasswordAvailable": "কোনো পাসওয়ার্ড উপলব্ধ নেই", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "পাসওয়ার্ড কপি করতে ব্যর্থ হয়েছে", "refreshTab": "সংযোগ রিফ্রেশ করুন", - "openFileManager": "ফাইল ম্যানেজার খুলুন", - "dashboard": "ড্যাশবোর্ড", - "networkGraph": "নেটওয়ার্ক গ্রাফ", - "quickConnect": "কুইক কানেক্ট", - "sshTools": "SSH টুলস", - "history": "ইতিহাস", - "hosts": "হোস্টরা", - "snippets": "খণ্ডাংশ", - "hostManager": "হোস্ট ম্যানেজার", - "credentials": "যোগ্যতা", - "connections": "সংযোগ", - "roleAdministrator": "প্রশাসক", - "roleUser": "ব্যবহারকারী" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "হোস্টরা", - "noHosts": "কোন SSH হোস্ট নেই", - "retry": "পুনরায় চেষ্টা করুন", - "refresh": "রিফ্রেশ", - "optional": "ঐচ্ছিক", - "downloadSample": "নমুনা ডাউনলোড করুন", - "failedToDeleteHost": "{{name}} মুছে ফেলতে ব্যর্থ হয়েছে", - "importSkipExisting": "আমদানি করুন (বিদ্যমানটি বাদ দিন)", - "connectionDetails": "সংযোগের বিবরণ", - "ssh": "এসএসএইচ", - "telnet": "টেলনেট", - "remoteDesktop": "রিমোট ডেস্কটপ", - "port": "বন্দর", - "username": "ব্যবহারকারীর নাম", - "folder": "ফোল্ডার", - "tags": "ট্যাগ", - "pin": "পিন", - "addHost": "হোস্ট যোগ করুন", - "editHost": "হোস্ট সম্পাদনা করুন", - "cloneHost": "ক্লোন হোস্ট", - "enableTerminal": "টার্মিনাল সক্রিয় করুন", - "enableTunnel": "টানেল সক্রিয় করুন", - "enableFileManager": "ফাইল ম্যানেজার সক্রিয় করুন", - "enableDocker": "ডকার সক্রিয় করুন", - "defaultPath": "ডিফল্ট পথ", - "connection": "সংযোগ", - "upload": "আপলোড", - "authentication": "প্রমাণীকরণ", - "password": "পাসওয়ার্ড", - "key": "চাবি", - "credential": "শংসাপত্র", - "none": "কোনোটিই না", - "sshPrivateKey": "SSH ব্যক্তিগত কী", - "keyType": "চাবির ধরন", - "uploadFile": "ফাইল আপলোড করুন", - "tabGeneral": "সাধারণ", - "tabSsh": "এসএসএইচ", - "tabRdp": "আরডিপি", - "tabVnc": "ভিএনসি", - "tabTunnels": "টানেল", - "tabDocker": "ডকার", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", + "ssh": "SSH", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", + "tabSsh": "SSH", + "tabTerminal": "Terminal", + "tabRdp": "RDP", + "tabVnc": "VNC", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "ফাইল", - "tabStats": "পরিসংখ্যান", - "tabTelnet": "টেলনেট", - "tabSharing": "শেয়ারিং", - "tabAuthentication": "প্রমাণীকরণ", - "terminal": "টার্মিনাল", - "tunnel": "টানেল", - "fileManager": "ফাইল ম্যানেজার", - "serverStats": "সার্ভার পরিসংখ্যান", - "status": "অবস্থা", - "folderRenamed": "\"{{oldName}}\" ফোল্ডারটির নাম সফলভাবে \"{{newName}}\" রাখা হয়েছে।", - "failedToRenameFolder": "ফোল্ডারের নাম পরিবর্তন করতে ব্যর্থ হয়েছে", - "movedToFolder": "\"{{folder}} \" এ স্থানান্তরিত হয়েছে", - "editHostTooltip": "হোস্ট সম্পাদনা করুন", - "statusChecks": "অবস্থা যাচাই", - "metricsCollection": "মেট্রিক্স সংগ্রহ", - "metricsInterval": "মেট্রিক্স সংগ্রহের ব্যবধান", - "metricsIntervalDesc": "কত ঘন ঘন সার্ভার পরিসংখ্যান সংগ্রহ করতে হবে (৫ সেকেন্ড - ১ ঘণ্টা)", - "behavior": "আচরণ", - "themePreview": "থিম প্রিভিউ", - "theme": "থিম", - "fontFamily": "ফন্ট পরিবার", - "fontSize": "ফন্ট সাইজ", - "letterSpacing": "চিঠির ব্যবধান", - "lineHeight": "লাইন উচ্চতা", - "cursorStyle": "কার্সার স্টাইল", - "cursorBlink": "কার্সার ব্লিঙ্ক", - "scrollbackBuffer": "স্ক্রোলব্যাক বাফার", - "bellStyle": "বেল স্টাইল", - "rightClickSelectsWord": "ডান ক্লিক করলে ওয়ার্ড নির্বাচিত হয়।", - "fastScrollModifier": "দ্রুত স্ক্রোল মডিফায়ার", - "fastScrollSensitivity": "দ্রুত স্ক্রোল সংবেদনশীলতা", - "sshAgentForwarding": "SSH এজেন্ট ফরওয়ার্ডিং", - "backspaceMode": "ব্যাকস্পেস মোড", - "startupSnippet": "স্টার্টআপ স্নিপেট", - "selectSnippet": "স্নিপেট নির্বাচন করুন", - "forceKeyboardInteractive": "ফোর্স কীবোর্ড-ইন্টারেক্টিভ", - "overrideCredentialUsername": "ক্রেডেনশিয়াল ব্যবহারকারীর নাম ওভাররাইড করুন", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "ক্রেডেনশিয়ালের ইউজারনেমের পরিবর্তে উপরে উল্লেখিত ইউজারনেমটি ব্যবহার করুন।", - "jumpHostChain": "জাম্প হোস্ট চেইন", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "পোর্ট নকিং", "addKnock": "পোর্ট যোগ করুন", "addProxyNode": "নোড যোগ করুন", - "proxyNode": "প্রক্সি নোড", - "proxyType": "প্রক্সি টাইপ", - "quickActions": "দ্রুত পদক্ষেপ", - "sudoPasswordAutoFill": "সুডো পাসওয়ার্ড স্বয়ংক্রিয়ভাবে পূরণ", - "sudoPassword": "সুডো পাসওয়ার্ড", - "keepaliveInterval": "কিপঅ্যালাইভ ব্যবধান (মিলিসেকেন্ড)", - "moshCommand": "মোশ কমান্ড", - "environmentVariables": "পরিবেশগত পরিবর্তনশীল", - "addVariable": "ভেরিয়েবল যোগ করুন", - "docker": "ডকার", - "copyTerminalUrl": "টার্মিনাল ইউআরএল কপি করুন", - "copyFileManagerUrl": "ফাইল ম্যানেজার ইউআরএল কপি করুন", - "copyRemoteDesktopUrl": "রিমোট ডেস্কটপ ইউআরএল কপি করুন", - "failedToConnect": "কনসোলে সংযোগ করতে ব্যর্থ হয়েছে", - "connect": "সংযোগ করুন", - "disconnect": "সংযোগ বিচ্ছিন্ন করুন", - "start": "শুরু করুন", - "enableStatusCheck": "স্ট্যাটাস চেক সক্ষম করুন", - "enableMetrics": "মেট্রিক্স সক্ষম করুন", - "bulkUpdateFailed": "বাল্ক আপডেট ব্যর্থ হয়েছে", - "selectAll": "সব নির্বাচন করুন", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "সবগুলো নির্বাচন বাতিল করুন", "protocols": "প্রোটোকল", "secureShell": "সুরক্ষিত খোলস", @@ -272,6 +303,9 @@ "unencryptedShell": "এনক্রিপ্টবিহীন শেল", "addressIp": "ঠিকানা / আইপি", "friendlyName": "বন্ধুত্বপূর্ণ নাম", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "ফোল্ডার এবং উন্নত", "privateNotes": "ব্যক্তিগত নোট", "privateNotesPlaceholder": "এই সার্ভার সম্পর্কে বিস্তারিত...", @@ -281,18 +315,18 @@ "addKnockBtn": "নক যোগ করুন", "noPortKnocking": "কোন পোর্ট নকিং কনফিগার করা নেই।", "knockPort": "নক পোর্ট", - "protocol": "প্রোটোকল", + "protocol": "Protocol", "delayAfterMs": "বিলম্বের পর (মিলিসেকেন্ড)", "useSocks5Proxy": "SOCKS5 প্রক্সি ব্যবহার করুন", "useSocks5ProxyDesc": "প্রক্সি সার্ভারের মাধ্যমে সংযোগ স্থাপন করুন", - "proxyHost": "প্রক্সি হোস্ট", - "proxyPort": "প্রক্সি পোর্ট", - "proxyUsername": "প্রক্সি ব্যবহারকারীর নাম", - "proxyPassword": "প্রক্সি পাসওয়ার্ড", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "একক প্রক্সি", - "proxyChainMode": "প্রক্সি চেইন", + "proxyChainMode": "Proxy Chain", "you": "তুমি", - "jumpHostChainLabel": "জাম্প হোস্ট চেইন", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "জাম্প যোগ করুন", "noJumpHosts": "কোনো জাম্প হোস্ট কনফিগার করা নেই।", "selectAServer": "একটি সার্ভার নির্বাচন করুন...", @@ -300,10 +334,10 @@ "authMethod": "প্রমাণীকরণ পদ্ধতি", "storedCredential": "সংরক্ষিত পরিচয়পত্র", "selectACredential": "একটি শংসাপত্র নির্বাচন করুন...", - "keyTypeLabel": "চাবির ধরন", - "keyTypeAuto": "স্বয়ংক্রিয়ভাবে সনাক্ত করুন", - "keyPasteTab": "পেস্ট", - "keyUploadTab": "আপলোড", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "মূল ফাইল লোড করা হয়েছে", "keyUploadClick": ".pem / .key / .ppk আপলোড করতে ক্লিক করুন", "clearKey": "পরিষ্কার চাবি", @@ -311,59 +345,105 @@ "keyReplaceNotice": "এটি প্রতিস্থাপন করতে নিচে একটি নতুন কী পেস্ট করুন", "keyPassphraseSaved": "পাসফ্রেজ সংরক্ষিত হয়েছে, পরিবর্তন করতে টাইপ করুন", "replaceKey": "চাবি প্রতিস্থাপন করুন", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "ফোর্স কীবোর্ড ইন্টারঅ্যাক্টিভ", "forceKeyboardInteractiveShortDesc": "চাবি উপস্থিত থাকলেও ম্যানুয়াল পাসওয়ার্ড এন্ট্রি বাধ্যতামূলক করুন।", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "টার্মিনাল চেহারা", "colorTheme": "রঙের থিম", - "fontFamilyLabel": "ফন্ট পরিবার", - "fontSizeLabel": "ফন্ট সাইজ", - "cursorStyleLabel": "কার্সার স্টাইল", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "অক্ষরের ব্যবধান (পিক্সেল)", - "lineHeightLabel": "লাইন উচ্চতা", - "bellStyleLabel": "বেল স্টাইল", - "backspaceModeLabel": "ব্যাকস্পেস মোড", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "কার্সার মিটমিট করা", "cursorBlinkingDesc": "টার্মিনাল কার্সারের জন্য ব্লিংকিং অ্যানিমেশন সক্রিয় করুন।", "rightClickSelectsWordLabel": "ডান-ক্লিক করলে Word নির্বাচিত হয়।", "rightClickSelectsWordShortDesc": "কার্সরের নিচে থাকা শব্দটি ডান-ক্লিক করে নির্বাচন করুন।", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "সিনট্যাক্স হাইলাইটিং", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "টাইমস্ট্যাম্প", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "আচরণ ও উন্নত", - "scrollbackBufferLabel": "স্ক্রোলব্যাক বাফার", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "ইতিহাসে সংরক্ষিত সর্বাধিক সংখ্যক লাইন", - "sshAgentForwardingLabel": "SSH এজেন্ট ফরওয়ার্ডিং", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "আপনার স্থানীয় SSH কীগুলি এই হোস্টে পাঠান।", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "অটো-মোশ সক্রিয় করুন", "enableAutoMoshDesc": "উপলব্ধ থাকলে SSH-এর চেয়ে Mosh ব্যবহার করা শ্রেয়।", "enableAutoTmux": "অটো-Tmux সক্রিয় করুন", "enableAutoTmuxDesc": "স্বয়ংক্রিয়ভাবে tmux সেশন চালু করুন বা সংযুক্ত করুন", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "সুডো পাসওয়ার্ড স্বয়ংক্রিয়ভাবে পূরণ", "sudoPasswordAutoFillShortDesc": "অনুরোধ করা হলে স্বয়ংক্রিয়ভাবে sudo পাসওয়ার্ড প্রদান করুন।", - "sudoPasswordLabel": "সুডো পাসওয়ার্ড", - "environmentVariablesLabel": "পরিবেশগত পরিবর্তনশীল", - "addVariableBtn": "ভেরিয়েবল যোগ করুন", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "কোনো এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করা নেই।", - "fastScrollModifierLabel": "দ্রুত স্ক্রোল মডিফায়ার", - "fastScrollSensitivityLabel": "দ্রুত স্ক্রোল সংবেদনশীলতা", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "মোশ কমান্ড", - "startupSnippetLabel": "স্টার্টআপ স্নিপেট", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "কিপঅ্যালাইভ ব্যবধান (সেকেন্ড)", "maxKeepaliveMisses": "ম্যাক্স কিপঅ্যালাইভ মিস করে", "tunnelSettings": "টানেল সেটিংস", "enableTunneling": "টানেলিং সক্ষম করুন", "enableTunnelingDesc": "এই হোস্টের জন্য SSH টানেল কার্যকারিতা সক্রিয় করুন", "serverTunnelsSection": "সার্ভার টানেল", - "addTunnelBtn": "টানেল যোগ করুন", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "কোনো টানেল কনফিগার করা নেই।", - "tunnelLabel": "টানেল {{number}}", - "tunnelType": "টানেল টাইপ", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "একটি স্থানীয় পোর্টকে রিমোট সার্ভারের (বা সেখান থেকে পৌঁছানো যায় এমন কোনো হোস্টের) একটি পোর্টে ফরওয়ার্ড করুন।", "tunnelModeRemoteDesc": "রিমোট সার্ভারের একটি পোর্ট আপনার মেশিনের লোকাল পোর্টে ফরওয়ার্ড করুন।", "tunnelModeDynamicDesc": "ডাইনামিক পোর্ট ফরওয়ার্ডিংয়ের জন্য লোকাল পোর্টে একটি SOCKS5 প্রক্সি তৈরি করুন।", "sameHost": "এই হোস্ট (সরাসরি টানেল)", "endpointHost": "এন্ডপয়েন্ট হোস্ট", - "endpointPort": "এন্ডপয়েন্ট পোর্ট", + "endpointPort": "Endpoint Port", "bindHost": "হোস্টকে বাঁধুন", - "sourcePort": "উৎস বন্দর", - "maxRetries": "সর্বোচ্চ পুনঃপ্রচেষ্টা", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "পুনরায় চেষ্টার ব্যবধান (সেকেন্ড)", "autoStartLabel": "স্বয়ংক্রিয়-শুরু", "autoStartDesc": "হোস্ট লোড হলে এই টানেলটি স্বয়ংক্রিয়ভাবে সংযুক্ত করুন।", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "সংযোগ করতে ব্যর্থ হয়েছে", "failedToDisconnectTunnel": "সংযোগ বিচ্ছিন্ন করতে ব্যর্থ হয়েছে", "dockerIntegration": "ডকার ইন্টিগ্রেশন", - "enableDockerMonitor": "ডকার সক্রিয় করুন", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "ডকারের মাধ্যমে এই হোস্টে কন্টেইনারগুলি নিরীক্ষণ ও পরিচালনা করুন।", - "enableFileManagerMonitor": "ফাইল ম্যানেজার সক্রিয় করুন", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "SFTP-এর মাধ্যমে এই হোস্টের ফাইলগুলি ব্রাউজ ও পরিচালনা করুন।", - "defaultPathLabel": "ডিফল্ট পথ", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "এই হোস্টের জন্য ফাইল ম্যানেজার চালু হলে যে ডিরেক্টরিটি খুলবে।", - "statusChecksLabel": "অবস্থা যাচাই", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "স্ট্যাটাস চেক সক্ষম করুন", "enableStatusChecksDesc": "প্রাপ্যতা যাচাই করতে পর্যায়ক্রমে এই হোস্টটিকে পিং করুন।", "useGlobalInterval": "গ্লোবাল ইন্টারভাল ব্যবহার করুন", "useGlobalIntervalDesc": "সার্ভার-ব্যাপী স্ট্যাটাস চেক ব্যবধান দিয়ে ওভাররাইড করুন", "checkIntervalS": "চেক ব্যবধান (গুলি)", "checkIntervalDesc": "প্রতিটি সংযোগ পিং এর মধ্যে সেকেন্ড", - "metricsCollectionLabel": "মেট্রিক্স সংগ্রহ", - "enableMetricsLabel": "মেট্রিক্স সক্ষম করুন", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "এই হোস্ট থেকে সিপিইউ, র‍্যাম, ডিস্ক এবং নেটওয়ার্ক ব্যবহারের তথ্য সংগ্রহ করুন।", "useGlobalMetrics": "গ্লোবাল ইন্টারভাল ব্যবহার করুন", "useGlobalMetricsDesc": "সার্ভার-ব্যাপী মেট্রিক্স ব্যবধান দিয়ে ওভাররাইড করুন", "metricsIntervalS": "মেট্রিক্স ব্যবধান (সেকেন্ড)", "metricsIntervalDesc2": "মেট্রিক স্ন্যাপশটগুলির মধ্যে সেকেন্ডের ব্যবধান", "visibleWidgets": "দৃশ্যমান উইজেট", - "cpuUsageLabel": "সিপিইউ ব্যবহার", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "সিপিইউ শতাংশ, লোড গড়, স্পার্কলাইন গ্রাফ", - "memoryLabel": "মেমরি ব্যবহার", + "memoryLabel": "Memory Usage", "memoryDesc": "র‍্যাম ব্যবহার, সোয়াপ, ক্যাশড", - "storageLabel": "ডিস্ক ব্যবহার", + "storageLabel": "Disk Usage", "storageDesc": "প্রতি মাউন্ট পয়েন্টে ডিস্কের ব্যবহার", - "networkLabel": "নেটওয়ার্ক ইন্টারফেস", + "networkLabel": "Network Interfaces", "networkDesc": "ইন্টারফেস তালিকা এবং ব্যান্ডউইথ", - "uptimeLabel": "আপটাইম", + "uptimeLabel": "Uptime", "uptimeDesc": "সিস্টেম আপটাইম এবং বুট টাইম", "systemInfoLabel": "সিস্টেমের তথ্য", "systemInfoDesc": "ওএস, কার্নেল, হোস্টনেম, আর্কিটেকচার", @@ -409,61 +532,100 @@ "recentLoginsDesc": "সফল এবং ব্যর্থ লগইন ইভেন্ট", "topProcessesLabel": "শীর্ষ প্রক্রিয়া", "topProcessesDesc": "পিআইডি, সিপিইউ%, মেম%, কমান্ড", - "listeningPortsLabel": "লিসেনিং পোর্ট", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "প্রসেস এবং স্টেট দিয়ে পোর্টগুলো খুলুন।", - "firewallLabel": "ফায়ারওয়াল", + "firewallLabel": "Firewall", "firewallDesc": "ফায়ারওয়াল, অ্যাপআর্মর, এসইলিনাক্স স্ট্যাটাস", - "quickActionsLabel": "দ্রুত পদক্ষেপ", - "quickActionsToolbar": "এক ক্লিকে কমান্ড কার্যকর করার জন্য কুইক অ্যাকশনগুলো সার্ভার স্ট্যাটস টুলবারে বাটন হিসেবে প্রদর্শিত হয়।", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "এখনো কোনো দ্রুত পদক্ষেপ নেওয়া হয়নি।", "buttonLabel": "বোতাম লেবেল", "selectSnippetPlaceholder": "স্নিপেট নির্বাচন করুন...", "addActionBtn": "অ্যাকশন যোগ করুন", "hostSharedSuccessfully": "হোস্ট সফলভাবে শেয়ার করেছে", - "failedToShareHost": "হোস্ট শেয়ার করতে ব্যর্থ হয়েছে", + "failedToShareHost": "Failed to share host", "accessRevoked": "প্রবেশাধিকার বাতিল করা হয়েছে", - "failedToRevokeAccess": "অ্যাক্সেস প্রত্যাহার করতে ব্যর্থ হয়েছে", - "cancelBtn": "বাতিল করুন", - "savingBtn": "সঞ্চয়...", - "addHostBtn": "হোস্ট যোগ করুন", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "হোস্ট আপডেট করা হয়েছে", "hostCreated": "হোস্ট তৈরি করেছে", "failedToSave": "হোস্ট সংরক্ষণ করতে ব্যর্থ হয়েছে", "credentialUpdated": "পরিচয়পত্র আপডেট করা হয়েছে", "credentialCreated": "পরিচয়পত্র তৈরি করা হয়েছে", - "failedToSaveCredential": "পরিচয়পত্র সংরক্ষণ করতে ব্যর্থ হয়েছে", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "হোস্টদের কাছে ফিরে যান", "backToCredentials": "পরিচয়পত্রে ফিরে যান", - "pinned": "পিন করা", - "noHostsFound": "কোন হোস্ট খুঁজে পাওয়া যায়নি", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "অন্য একটি শব্দ ব্যবহার করে দেখুন", "addFirstHost": "শুরু করার জন্য আপনার প্রথম হোস্ট যোগ করুন।", "noCredentialsFound": "কোনো পরিচয়পত্র খুঁজে পাওয়া যায়নি", - "addCredentialBtn": "পরিচয়পত্র যোগ করুন", - "updateCredentialBtn": "পরিচয়পত্র আপডেট করুন", - "features": "বৈশিষ্ট্য", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(কোন ফোল্ডার নেই)", - "deleteSelected": "মুছে ফেলুন", + "deleteSelected": "Delete", "exitSelection": "প্রস্থান নির্বাচন", - "importSkip": "আমদানি করুন (বিদ্যমানটি বাদ দিন)", + "importSkip": "Import (skip existing)", "importOverwrite": "আমদানি (ওভাররাইট)", "collapseBtn": "ভেঙে পড়া", "importExportBtn": "আমদানি / রপ্তানি", "hostStatusesRefreshed": "হোস্টের স্ট্যাটাস রিফ্রেশ করা হয়েছে", "failedToRefreshHosts": "হোস্টগুলি রিফ্রেশ করতে ব্যর্থ হয়েছে", - "movedHostTo": "{{host}} কে \"{{folder}} \" এ সরানো হয়েছে", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "হোস্ট স্থানান্তর করতে ব্যর্থ হয়েছে", - "folderRenamedTo": "ফোল্ডারের নাম পরিবর্তন করে \"{{name}} \" রাখা হয়েছে", - "deletedFolder": "মুছে ফেলা ফোল্ডার \"{{name}}\"", - "failedToDeleteFolder": "ফোল্ডারটি মুছে ফেলা ব্যর্থ হয়েছে", - "deleteAllInFolder": "\"{{name}}\" এর মধ্যে থাকা সমস্ত হোস্ট মুছে ফেলবেন? এটি আর পূর্বাবস্থায় ফেরানো যাবে না।", - "deletedHost": "মুছে ফেলা হয়েছে {{name}}", - "copiedToClipboard": "ক্লিপবোর্ডে কপি করা হয়েছে", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "ফোল্ডার সম্পাদনা করুন", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "ফোল্ডার সম্পাদনা করুন", + "deleteFolder": "ফোল্ডারটি মুছে ফেলুন", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "হোস্ট স্থানান্তর করতে ব্যর্থ হয়েছে", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "টার্মিনাল ইউআরএল কপি করা হয়েছে", "fileManagerUrlCopied": "ফাইল ম্যানেজার ইউআরএল কপি করা হয়েছে", "tunnelUrlCopied": "টানেল ইউআরএল কপি করা হয়েছে", "dockerUrlCopied": "ডকার ইউআরএল কপি করা হয়েছে", - "serverStatsUrlCopied": "সার্ভার পরিসংখ্যান ইউআরএল কপি করা হয়েছে", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP URL কপি করা হয়েছে", "vncUrlCopied": "VNC URL কপি করা হয়েছে", "telnetUrlCopied": "টেলনেট ইউআরএল কপি করা হয়েছে", @@ -471,109 +633,112 @@ "expandActions": "ক্রিয়া প্রসারিত করুন", "collapseActions": "ভেঙে পড়ার ক্রিয়া", "wakeOnLanAction": "ওয়েক অন ল্যান", - "wakeOnLanSuccess": "{{name}}-এ জাদুর প্যাকেট পাঠানো হয়েছে", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "ম্যাজিক প্যাকেট পাঠাতে ব্যর্থ হয়েছে", - "cloneHostAction": "ক্লোন হোস্ট", + "cloneHostAction": "Clone Host", "copyAddress": "ঠিকানা কপি করুন", "copyLink": "লিঙ্ক কপি করুন", - "copyTerminalUrlAction": "টার্মিনাল ইউআরএল কপি করুন", - "copyFileManagerUrlAction": "ফাইল ম্যানেজার ইউআরএল কপি করুন", - "copyTunnelUrlAction": "টানেল ইউআরএল কপি করুন", - "copyDockerUrlAction": "ডকার ইউআরএল কপি করুন", - "copyServerStatsUrlAction": "সার্ভার পরিসংখ্যান URL কপি করুন", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "RDP URL কপি করুন", "copyVncUrlAction": "VNC URL কপি করুন", "copyTelnetUrlAction": "টেলনেট ইউআরএল কপি করুন", - "copyRemoteDesktopUrlAction": "রিমোট ডেস্কটপ ইউআরএল কপি করুন", - "deleteCredentialConfirm": "ক্রেডেনশিয়াল \"{{name}} \" মুছে ফেলুন?", - "deletedCredential": "মুছে ফেলা হয়েছে {{name}}", - "deploySSHKeyTitle": "SSH কী স্থাপন করুন", - "deployingBtn": "মোতায়েন করা হচ্ছে...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "মোতায়েন করুন", "failedToDeployKey": "কী স্থাপন করতে ব্যর্থ হয়েছে", - "deleteHostsConfirm": "{{count}} হোস্ট{{plural}}মুছে ফেলবেন? এটি পূর্বাবস্থায় ফেরানো যাবে না।", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "রুটে স্থানান্তরিত হয়েছে", - "failedToMoveHosts": "হোস্ট স্থানান্তর করতে ব্যর্থ হয়েছে", - "enableTerminalFeature": "টার্মিনাল সক্রিয় করুন", - "disableTerminalFeature": "টার্মিনাল নিষ্ক্রিয় করুন", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "ফাইলগুলি সক্ষম করুন", "disableFilesFeature": "ফাইলগুলি নিষ্ক্রিয় করুন", "enableTunnelsFeature": "টানেলগুলি সক্ষম করুন", "disableTunnelsFeature": "টানেল নিষ্ক্রিয় করুন", - "enableDockerFeature": "ডকার সক্রিয় করুন", - "disableDockerFeature": "ডকার নিষ্ক্রিয় করুন", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "ট্যাগ যোগ করুন...", "authDetails": "প্রমাণীকরণের বিবরণ", - "credType": "প্রকার", + "credType": "Type", "generateKeyPairDesc": "একটি নতুন কী পেয়ার তৈরি করুন, প্রাইভেট এবং পাবলিক কী উভয়ই স্বয়ংক্রিয়ভাবে পূরণ হয়ে যাবে।", "generatingKey": "তৈরি হচ্ছে...", - "generateLabel": "{{label}} তৈরি করুন", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "ফাইল আপলোড করুন", "keyPassphraseOptional": "মূল পাসফ্রেজ (ঐচ্ছিক)", "sshPublicKeyOptional": "SSH পাবলিক কী (ঐচ্ছিক)", "publicKeyGenerated": "পাবলিক কী তৈরি করা হয়েছে", "failedToGeneratePublicKey": "পাবলিক কী বের করতে ব্যর্থ হয়েছে", "publicKeyCopied": "পাবলিক কী কপি করা হয়েছে", - "keyPairGenerated": "{{label}} কী পেয়ার তৈরি হয়েছে", - "failedToGenerateKeyPair": "কী পেয়ার তৈরি করতে ব্যর্থ হয়েছে", - "searchHostsPlaceholder": "হোস্ট, ঠিকানা, ট্যাগ অনুসন্ধান করুন…", - "searchCredentialsPlaceholder": "অনুসন্ধানের প্রমাণপত্র…", - "refreshBtn": "রিফ্রেশ", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "ট্যাগ যোগ করুন...", - "deleteConfirmBtn": "মুছে ফেলুন", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH সার্ভারের /etc/ssh/sshd_config ফাইলে GatewayPorts yes, AllowTcpForwarding yes, এবং PermitRootLogin yes সেট করা থাকতে হবে।", - "deleteHostConfirm": "\"{{name}} \" মুছে ফেলুন?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "প্রমাণীকরণ এবং সংযোগ সেটিংস কনফিগার করতে উপরের প্রোটোকলগুলোর মধ্যে অন্তত একটি সক্রিয় করুন।", - "keyPassphrase": "মূল পাসফ্রেজ", - "connectBtn": "সংযোগ করুন", - "disconnectBtn": "সংযোগ বিচ্ছিন্ন করুন", - "basicInformation": "মৌলিক তথ্য", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "প্রমাণীকরণের বিবরণ", - "credTypeLabel": "প্রকার", - "hostsTab": "হোস্টরা", - "credentialsTab": "যোগ্যতা", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "একাধিক নির্বাচন করুন", "selectHosts": "হোস্ট নির্বাচন করুন", - "connectionLabel": "সংযোগ", - "authenticationLabel": "প্রমাণীকরণ", - "generateKeyPairTitle": "কী পেয়ার তৈরি করুন", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "একটি নতুন কী পেয়ার তৈরি করুন, প্রাইভেট এবং পাবলিক কী উভয়ই স্বয়ংক্রিয়ভাবে পূরণ হয়ে যাবে।", - "generateFromPrivateKey": "প্রাইভেট কী থেকে তৈরি করুন", - "refreshBtn2": "রিফ্রেশ", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "প্রস্থান নির্বাচন", "exportAll": "সব রপ্তানি করুন", - "addHostBtn2": "হোস্ট যোগ করুন", - "addCredentialBtn2": "পরিচয়পত্র যোগ করুন", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "হোস্টের অবস্থা যাচাই করা হচ্ছে...", - "pinnedSection": "পিন করা", + "pinnedSection": "Pinned", "hostsExported": "হোস্টগুলি সফলভাবে রপ্তানি করা হয়েছে", "exportFailed": "হোস্ট রপ্তানি করতে ব্যর্থ হয়েছে", "sampleDownloaded": "নমুনা ফাইল ডাউনলোড করা হয়েছে", - "failedToDeleteCredential2": "ক্রেডেনশিয়াল মুছে ফেলতে ব্যর্থ হয়েছে", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(কোন ফোল্ডার নেই)", - "nSelected": "{{count}} নির্বাচিত", - "featuresMenu": "বৈশিষ্ট্য", - "moveMenu": "স্থানান্তর", - "cancelSelection": "বাতিল করুন", - "deployDialogDesc": "একটি হোস্টের অনুমোদিত কী-গুলিতে {{name}} স্থাপন করুন।", - "targetHostLabel": "টার্গেট হোস্ট", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "একজন হোস্ট নির্বাচন করুন...", "keyDeployedSuccess": "কী সফলভাবে স্থাপন করা হয়েছে", "failedToDeployKey2": "কী স্থাপন করতে ব্যর্থ হয়েছে", - "deletedCount": "মুছে ফেলা {{count}} হোস্ট", - "failedToDeleteCount": "{{count}} হোস্ট মুছে ফেলা ব্যর্থ হয়েছে", - "duplicatedHost": "নকল \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "হোস্ট নকল করতে ব্যর্থ হয়েছে", - "updatedCount": "আপডেট করা {{count}} হোস্ট", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "বন্ধুত্বপূর্ণ নাম", - "descriptionLabel": "বর্ণনা", + "descriptionLabel": "Description", "loadingHost": "হোস্ট লোড হচ্ছে...", - "loadingHosts": "হোস্ট লোড হচ্ছে...", - "loadingCredentials": "পরিচয়পত্র লোড হচ্ছে...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "এখনো কোনো হোস্ট নেই", - "noHostsMatchSearch": "আপনার অনুসন্ধানের সাথে কোনো হোস্ট মেলে না।", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "হোস্ট খুঁজে পাওয়া যায়নি", - "searchHosts": "হোস্ট অনুসন্ধান করুন...", + "searchHosts": "Search hosts...", "sortHosts": "হোস্ট বাছাই করুন", "sortDefault": "ডিফল্ট অর্ডার", "sortNameAsc": "নাম (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "প্রথমে পিন করা হয়েছে", "filterHosts": "হোস্ট ফিল্টার করুন", "filterClearAll": "ফিল্টার পরিষ্কার করুন", - "filterStatusGroup": "অবস্থা", - "filterOnline": "অনলাইন", - "filterOffline": "অফলাইন", - "filterPinned": "পিন করা", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "প্রমাণীকরণ প্রকার", - "filterAuthPassword": "পাসওয়ার্ড", - "filterAuthKey": "SSH কী", - "filterAuthCredential": "শংসাপত্র", - "filterAuthNone": "কোনোটিই না", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "প্রোটোকল", - "filterProtocolSsh": "এসএসএইচ", - "filterProtocolRdp": "আরডিপি", - "filterProtocolVnc": "ভিএনসি", - "filterProtocolTelnet": "টেলনেট", - "filterFeaturesGroup": "বৈশিষ্ট্য", - "filterFeatureTerminal": "টার্মিনাল", - "filterFeatureFileManager": "ফাইল ম্যানেজার", - "filterFeatureTunnel": "টানেল", - "filterFeatureDocker": "ডকার", - "filterTagsGroup": "ট্যাগ", - "shareHost": "হোস্ট শেয়ার করুন", - "shareHostTitle": "শেয়ার করুন: {{name}}", + "filterProtocolGroup": "Protocol", + "filterProtocolSsh": "SSH", + "filterProtocolRdp": "RDP", + "filterProtocolVnc": "VNC", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "শেয়ারিং সক্ষম করতে এই হোস্টকে অবশ্যই একটি ক্রেডেনশিয়াল ব্যবহার করতে হবে। প্রথমে হোস্টটি সম্পাদনা করুন এবং একটি ক্রেডেনশিয়াল নির্ধারণ করুন।" }, "guac": { - "connection": "সংযোগ", - "authentication": "প্রমাণীকরণ", - "connectionSettings": "সংযোগ সেটিংস", - "displaySettings": "ডিসপ্লে সেটিংস", - "audioSettings": "অডিও সেটিংস", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "সংরক্ষিত পরিচয়পত্র", + "noCredential": "No credential (direct credentials below)", + "authMethod": "প্রমাণীকরণ পদ্ধতি", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "একটি শংসাপত্র নির্বাচন করুন...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "আরডিপি পারফরম্যান্স", - "deviceRedirection": "ডিভাইস পুনঃনির্দেশনা", - "session": "অধিবেশন", - "gateway": "গেটওয়ে", - "remoteApp": "রিমোটঅ্যাপ", - "clipboard": "ক্লিপবোর্ড", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "সেশন রেকর্ডিং", - "wakeOnLan": "ওয়েক-অন-ল্যান", - "vncSettings": "VNC সেটিংস", - "terminalSettings": "টার্মিনাল সেটিংস", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "আরডিপি পোর্ট", - "username": "ব্যবহারকারীর নাম", - "password": "পাসওয়ার্ড", - "domain": "ডোমেইন", - "securityMode": "নিরাপত্তা মোড", - "colorDepth": "রঙের গভীরতা", - "width": "প্রস্থ", - "height": "উচ্চতা", - "dpi": "ডিপিআই", - "resizeMethod": "আকার পরিবর্তন পদ্ধতি", - "clientName": "ক্লায়েন্টের নাম", - "initialProgram": "প্রাথমিক প্রোগ্রাম", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "সার্ভার লেআউট", - "timezone": "সময় অঞ্চল", - "gatewayHostname": "গেটওয়ে হোস্টনাম", - "gatewayPort": "গেটওয়ে পোর্ট", - "gatewayUsername": "গেটওয়ে ব্যবহারকারীর নাম", - "gatewayPassword": "গেটওয়ে পাসওয়ার্ড", - "gatewayDomain": "গেটওয়ে ডোমেইন", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "রিমোটঅ্যাপ প্রোগ্রাম", "workingDirectory": "কর্ম ডিরেক্টরি", "arguments": "যুক্তি", "normalizeLineEndings": "লাইনের শেষাংশ স্বাভাবিক করুন", - "recordingPath": "রেকর্ডিং পথ", - "recordingName": "রেকর্ডিং নাম", - "macAddress": "MAC ঠিকানা", - "broadcastAddress": "সম্প্রচার ঠিকানা", - "udpPort": "ইউডিপি পোর্ট", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "অপেক্ষার সময় (সেকেন্ড)", - "driveName": "ড্রাইভের নাম", - "drivePath": "ড্রাইভ পাথ", - "ignoreCertificate": "সার্টিফিকেট উপেক্ষা করুন", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "স্ব-স্বাক্ষরিত শংসাপত্র সহ হোস্টগুলিতে সংযোগের অনুমতি দিন", - "forceLossless": "বল ক্ষয়হীন", + "forceLossless": "Force Lossless", "forceLosslessDesc": "লসলেস ইমেজ এনকোডিং বাধ্যতামূলক করুন (উচ্চতর গুণমান, বেশি ব্যান্ডউইথ)", - "disableAudio": "অডিও নিষ্ক্রিয় করুন", + "disableAudio": "Disable Audio", "disableAudioDesc": "রিমোট সেশন থেকে সমস্ত অডিও মিউট করুন", "enableAudioInput": "অডিও ইনপুট (মাইক্রোফোন) সক্রিয় করুন", "enableAudioInputDesc": "স্থানীয় মাইক্রোফোনটি রিমোট সেশনে ফরোয়ার্ড করুন", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "এরো গ্লাস এফেক্টস সক্রিয় করুন", "menuAnimations": "মেনু অ্যানিমেশন", "menuAnimationsDesc": "মেনু ফেড এবং স্লাইড অ্যানিমেশন সক্রিয় করুন", - "disableBitmapCaching": "বিটম্যাপ ক্যাশিং নিষ্ক্রিয় করুন", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "বিটম্যাপ ক্যাশে বন্ধ করুন (এটি গ্লিচ কমাতে সাহায্য করতে পারে)।", - "disableOffscreenCaching": "অফস্ক্রিন ক্যাশিং নিষ্ক্রিয় করুন", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "অফস্ক্রিন ক্যাশে বন্ধ করুন", - "disableGlyphCaching": "গ্লিফ ক্যাশিং নিষ্ক্রিয় করুন", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "গ্লিফ ক্যাশে বন্ধ করুন", - "enableGfx": "GFX সক্ষম করুন", + "enableGfx": "Enable GFX", "enableGfxDesc": "RemoteFX গ্রাফিক্স পাইপলাইন ব্যবহার করুন", - "enablePrinting": "প্রিন্টিং সক্ষম করুন", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "স্থানীয় প্রিন্টারগুলিকে রিমোট সেশনে পুনঃনির্দেশিত করুন", - "enableDriveRedirection": "ড্রাইভ পুনঃনির্দেশনা সক্ষম করুন", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "রিমোট সেশনে একটি স্থানীয় ফোল্ডারকে ড্রাইভ হিসেবে ম্যাপ করুন।", - "createDrivePath": "ড্রাইভ পাথ তৈরি করুন", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "ফোল্ডারটি বিদ্যমান না থাকলে স্বয়ংক্রিয়ভাবে তৈরি করুন।", - "disableDownload": "ডাউনলোড নিষ্ক্রিয় করুন", + "disableDownload": "Disable Download", "disableDownloadDesc": "রিমোট সেশন থেকে ফাইল ডাউনলোড করা প্রতিরোধ করুন", - "disableUpload": "আপলোড নিষ্ক্রিয় করুন", + "disableUpload": "Disable Upload", "disableUploadDesc": "রিমোট সেশনে ফাইল আপলোড করা প্রতিরোধ করুন", - "enableTouch": "টাচ সক্ষম করুন", + "enableTouch": "Enable Touch", "enableTouchDesc": "টাচ ইনপুট ফরওয়ার্ডিং সক্ষম করুন", - "consoleSession": "কনসোল সেশন", + "consoleSession": "Console Session", "consoleSessionDesc": "নতুন সেশন শুরু করার পরিবর্তে কনসোলে (সেশন ০) সংযোগ করুন।", "sendWolPacket": "WOL প্যাকেট পাঠান", "sendWolPacketDesc": "সংযোগ করার আগে এই হোস্টকে জাগিয়ে তুলতে একটি ম্যাজিক প্যাকেট পাঠান।", - "disableCopy": "কপি নিষ্ক্রিয় করুন", + "disableCopy": "Disable Copy", "disableCopyDesc": "রিমোট সেশন থেকে টেক্সট কপি করা প্রতিরোধ করুন", - "disablePaste": "পেস্ট নিষ্ক্রিয় করুন", + "disablePaste": "Disable Paste", "disablePasteDesc": "রিমোট সেশনে টেক্সট পেস্ট করা প্রতিরোধ করুন", "createPathIfMissing": "অনুপস্থিত থাকলে পাথ তৈরি করুন", "createPathIfMissingDesc": "স্বয়ংক্রিয়ভাবে রেকর্ডিং ডিরেক্টরি তৈরি করুন", - "excludeOutput": "আউটপুট বাদ দিন", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "স্ক্রিন আউটপুট রেকর্ড করবেন না (শুধুমাত্র মেটাডেটা)", - "excludeMouse": "মাউস বাদ দিন", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "মাউসের নড়াচড়া রেকর্ড করবেন না।", "includeKeystrokes": "কীস্ট্রোক অন্তর্ভুক্ত করুন", "includeKeystrokesDesc": "স্ক্রিন আউটপুটের পাশাপাশি সরাসরি কীস্ট্রোক রেকর্ড করুন।", @@ -718,102 +896,105 @@ "vncPassword": "VNC পাসওয়ার্ড", "vncUsernameOptional": "ব্যবহারকারীর নাম (ঐচ্ছিক)", "vncLeaveBlank": "প্রয়োজন না হলে খালি রাখুন", - "cursorMode": "কার্সার মোড", - "swapRedBlue": "লাল/নীল অদলবদল করুন", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "লাল এবং নীল রঙের চ্যানেলগুলি অদলবদল করুন (কিছু রঙের সমস্যা সমাধান করে)", "readOnly": "শুধুমাত্র পঠনযোগ্য", "readOnlyDesc": "কোনো ইনপুট না পাঠিয়ে রিমোট স্ক্রিন দেখুন।", "telnetPort": "টেলনেট পোর্ট", - "terminalType": "টার্মিনাল টাইপ", - "fontName": "ফন্টের নাম", - "fontSize": "ফন্ট সাইজ", - "colorScheme": "রঙের পরিকল্পনা", - "backspaceKey": "ব্যাকস্পেস কী", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "প্রথমে হোস্টটি সংরক্ষণ করুন।", "sharingOptionsAfterSave": "হোস্ট সংরক্ষণ করার পর শেয়ার করার বিকল্পগুলো পাওয়া যাবে।", "sharingLoadError": "শেয়ারিং ডেটা লোড করা সম্ভব হয়নি। আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন।", - "shareHostSection": "হোস্ট শেয়ার করুন", - "shareWithUser": "ব্যবহারকারীর সাথে শেয়ার করুন", - "shareWithRole": "ভূমিকার সাথে শেয়ার করুন", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "ব্যবহারকারী নির্বাচন করুন", - "selectRole": "ভূমিকা নির্বাচন করুন", + "selectRole": "Select Role", "selectUserOption": "একজন ব্যবহারকারী নির্বাচন করুন...", "selectRoleOption": "একটি ভূমিকা নির্বাচন করুন...", - "permissionLevel": "অনুমতি স্তর", + "permissionLevel": "Permission Level", "expiresInHours": "(ঘন্টায়) মেয়াদ শেষ হবে", "noExpiryPlaceholder": "মেয়াদ শেষ না হওয়ার জন্য খালি রাখুন।", - "shareBtn": "শেয়ার", - "currentAccess": "বর্তমান অ্যাক্সেস", - "typeHeader": "প্রকার", - "targetHeader": "লক্ষ্য", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "অনুমতি", - "grantedByHeader": "মঞ্জুর করেছেন", - "expiresHeader": "মেয়াদ শেষ", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "এখনো কোনো প্রবেশাধিকার দেওয়া হয়নি।", - "expiredLabel": "মেয়াদোত্তীর্ণ", - "neverLabel": "কখনো না", - "revokeBtn": "বাতিল করুন", - "cancelBtn": "বাতিল করুন", - "savingBtn": "সঞ্চয়...", - "updateHostBtn": "হোস্ট আপডেট করুন", - "addHostBtn": "হোস্ট যোগ করুন" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "হোস্ট, কমান্ড বা সেটিংস অনুসন্ধান করুন...", - "quickActions": "দ্রুত পদক্ষেপ", - "hostManager": "হোস্ট ম্যানেজার", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "হোস্ট পরিচালনা করুন, যোগ করুন বা সম্পাদনা করুন", "addNewHost": "নতুন হোস্ট যোগ করুন", "addNewHostDesc": "একজন নতুন হোস্ট নিবন্ধন করুন", - "adminSettings": "অ্যাডমিন সেটিংস", + "adminSettings": "Admin Settings", "adminSettingsDesc": "সিস্টেম পছন্দ এবং ব্যবহারকারীদের কনফিগার করুন", - "userProfile": "ব্যবহারকারীর প্রোফাইল", + "userProfile": "User Profile", "userProfileDesc": "আপনার অ্যাকাউন্ট ও পছন্দসমূহ পরিচালনা করুন", - "addCredential": "পরিচয়পত্র যোগ করুন", + "addCredential": "Add Credential", "addCredentialDesc": "SSH কী বা পাসওয়ার্ড সংরক্ষণ করুন", - "recentActivity": "সাম্প্রতিক কার্যকলাপ", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "সার্ভার এবং হোস্ট", - "noHostsFound": "\"{{search}} \" এর সাথে মেলে এমন কোনো হোস্ট খুঁজে পাওয়া যায়নি।", - "links": "লিঙ্ক", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "নেভিগেট করুন", - "select": "নির্বাচন করুন", + "select": "Select", "toggleWith": "টগল করুন" }, "splitScreen": { - "paneEmpty": "প্যান {{index}} - খালি", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "কোন ট্যাব বরাদ্দ করা হয়নি", "focusedPane": "সক্রিয় প্যানে" }, "connections": { "noConnections": "কোন সংযোগ নেই", "noConnectionsDesc": "এখানে সংযোগগুলি দেখতে একটি টার্মিনাল, ফাইল ম্যানেজার বা রিমোট ডেস্কটপ খুলুন।", - "connectedFor": "{{duration}} এর জন্য সংযুক্ত", - "connected": "সংযুক্ত", - "disconnected": "বিচ্ছিন্ন", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "ট্যাব বন্ধ করুন", "closeConnection": "ঘনিষ্ঠ সংযোগ", "forgetTab": "ভুলে যান", - "removeBackground": "অপসারণ করুন", - "reconnect": "পুনরায় সংযোগ করুন", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "পুনরায় খুলুন", "sectionOpen": "খোলা", "sectionBackground": "পটভূমি", "backgroundDesc": "সংযোগ বিচ্ছিন্ন হওয়ার পরেও সেশন ৩০ মিনিট পর্যন্ত স্থায়ী থাকে এবং পুনরায় সংযোগ করা যায়।", "persisted": "পটভূমিতে অব্যাহত ছিল", - "expiresIn": "{{duration}}-এ মেয়াদ শেষ হবে", + "expiresIn": "Expires in {{duration}}", "search": "সংযোগগুলি অনুসন্ধান করুন...", - "noSearchResults": "আপনার অনুসন্ধানের সাথে কোনো সংযোগ মেলেনি।" + "noSearchResults": "আপনার অনুসন্ধানের সাথে কোনো সংযোগ মেলেনি।", + "rename": "Rename session" }, "guacamole": { - "connecting": "{{type}} সেশনে সংযোগ স্থাপন করা হচ্ছে...", - "connectionError": "সংযোগ ত্রুটি", - "connectionFailed": "সংযোগ ব্যর্থ হয়েছে", - "failedToConnect": "সংযোগ টোকেন পেতে ব্যর্থ হয়েছে", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "হোস্ট খুঁজে পাওয়া যায়নি", - "noHostSelected": "কোন হোস্ট নির্বাচন করা হয়নি", - "reconnect": "পুনরায় সংযোগ করুন", - "retry": "পুনরায় চেষ্টা করুন", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "রিমোট ডেস্কটপ সার্ভিস (guacd) উপলব্ধ নেই। অনুগ্রহ করে নিশ্চিত করুন যে guacd চালু ও অ্যাক্সেসযোগ্য আছে এবং অ্যাডমিন সেটিংসে সঠিকভাবে কনফিগার করা আছে।", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "উইন+এল (লক স্ক্রিন)", "winKey": "উইন্ডোজ কী", "ctrl": "Ctrl", - "alt": "বিকল্প", - "shift": "শিফট", + "alt": "Alt", + "shift": "Shift", "win": "জয়", - "stickyActive": "{{key}} (আটকানো - খুলতে ক্লিক করুন)", - "stickyInactive": "{{key}} (আটকাতে ক্লিক করুন)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "পালানো", "tab": "ট্যাব", - "home": "হোম", + "home": "Home", "end": "শেষ", "pageUp": "পৃষ্ঠা উপরে", "pageDown": "পৃষ্ঠা নিচে", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "হোস্টের সাথে সংযোগ করুন", - "clear": "পরিষ্কার", - "paste": "পেস্ট", - "reconnect": "পুনরায় সংযোগ করুন", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "সংযোগ বিচ্ছিন্ন", - "connected": "সংযুক্ত", - "clipboardWriteFailed": "ক্লিপবোর্ডে কপি করা সম্ভব হয়নি। নিশ্চিত করুন যে পৃষ্ঠাটি HTTPS বা লোকালহোস্টের মাধ্যমে পরিবেশিত হচ্ছে।", - "clipboardReadFailed": "ক্লিপবোর্ড থেকে পড়তে ব্যর্থ হয়েছে। নিশ্চিত করুন যে ক্লিপবোর্ডের অনুমতি দেওয়া আছে।", - "clipboardHttpWarning": "পেস্ট করার জন্য HTTPS প্রয়োজন। Ctrl+Shift+V ব্যবহার করুন অথবা HTTPS-এর মাধ্যমে Termix পরিবেশন করুন।", - "unknownError": "অজানা ত্রুটি ঘটেছে", - "websocketError": "ওয়েবসকেট সংযোগ ত্রুটি", - "connecting": "সংযোগ স্থাপন...", - "noHostSelected": "কোন হোস্ট নির্বাচন করা হয়নি", - "reconnecting": "পুনরায় সংযোগ স্থাপন করা হচ্ছে... ({{attempt}}/{{max}})", - "reconnected": "সফলভাবে পুনরায় সংযুক্ত হয়েছে", - "tmuxSessionCreated": "tmux সেশন তৈরি হয়েছে: {{name}}", - "tmuxSessionAttached": "tmux সেশন সংযুক্ত হয়েছে: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "রিমোট হোস্টে tmux ইনস্টল করা নেই, তাই স্ট্যান্ডার্ড শেল ব্যবহার করা হচ্ছে।", "tmuxSessionPickerTitle": "tmux সেশন", "tmuxSessionPickerDesc": "এই হোস্টে বিদ্যমান tmux সেশন পাওয়া গেছে। পুনরায় সংযুক্ত হতে বা একটি নতুন সেশন তৈরি করতে যেকোনো একটি নির্বাচন করুন।", - "tmuxWindows": "উইন্ডোজ", - "tmuxWindowCount": "{{count}} জানালা", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "সংযুক্ত ক্লায়েন্ট", - "tmuxAttachedCount": "{{count}} সংযুক্ত", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "শেষ কার্যকলাপ", "tmuxTimeJustNow": "এইমাত্র", - "tmuxTimeMinutes": "{{count}}মিনিট আগে", - "tmuxTimeHours": "{{count}}ঘণ্টা আগে", - "tmuxTimeDays": "{{count}}দিন আগে", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "নতুন সেশন শুরু করুন", "tmuxCopyHint": "নির্বাচনটি ঠিক করুন এবং ক্লিপবোর্ডে কপি করতে এন্টার চাপুন।", "tmuxDetach": "tmux সেশন থেকে বিচ্ছিন্ন করুন", "tmuxDetached": "tmux সেশন থেকে বিচ্ছিন্ন", - "maxReconnectAttemptsReached": "পুনঃসংযোগের সর্বোচ্চ প্রচেষ্টা শেষ হয়েছে", - "closeTab": "বন্ধ করুন", - "connectionTimeout": "সংযোগের সময়সীমা শেষ", - "terminalTitle": "টার্মিনাল - {{host}}", - "terminalWithPath": "টার্মিনাল - {{host}}:{{path}}", - "runTitle": "দৌড়ানো {{command}} - {{host}}", - "totpRequired": "দ্বি-স্তরীয় প্রমাণীকরণ আবশ্যক", - "totpCodeLabel": "যাচাইকরণ কোড", - "totpVerify": "যাচাই করুন", - "warpgateAuthRequired": "ওয়ার্পগেট প্রমাণীকরণ আবশ্যক", - "warpgateSecurityKey": "নিরাপত্তা চাবি", - "warpgateAuthUrl": "প্রমাণীকরণ ইউআরএল", - "warpgateOpenBrowser": "ব্রাউজারে খুলুন", - "warpgateContinue": "আমি প্রমাণীকরণ সম্পন্ন করেছি।", - "opksshAuthRequired": "OPKSSH প্রমাণীকরণ আবশ্যক", - "opksshAuthDescription": "চালিয়ে যাওয়ার জন্য আপনার ব্রাউজারে প্রমাণীকরণ সম্পন্ন করুন। এই সেশনটি ২৪ ঘণ্টার জন্য বৈধ থাকবে।", - "opksshOpenBrowser": "প্রমাণীকরণের জন্য ব্রাউজার খুলুন", - "opksshWaitingForAuth": "ব্রাউজারে প্রমাণীকরণের জন্য অপেক্ষা করা হচ্ছে...", - "opksshAuthenticating": "প্রমাণীকরণ প্রক্রিয়া চলছে...", - "opksshTimeout": "প্রমাণীকরণের সময়সীমা শেষ হয়ে গেছে। অনুগ্রহ করে আবার চেষ্টা করুন।", - "opksshAuthFailed": "প্রমাণীকরণ ব্যর্থ হয়েছে। অনুগ্রহ করে আপনার পরিচয়পত্র যাচাই করে আবার চেষ্টা করুন।", - "opksshSignInWith": "{{provider}} দিয়ে সাইন ইন করুন", - "sudoPasswordPopupTitle": "পাসওয়ার্ড দিন?", - "websocketAbnormalClose": "সংযোগটি অপ্রত্যাশিতভাবে বন্ধ হয়ে গেছে। এটি রিভার্স প্রক্সি বা SSL কনফিগারেশন সংক্রান্ত সমস্যার কারণে হতে পারে। অনুগ্রহ করে সার্ভার লগ পরীক্ষা করুন।", - "connectionLogTitle": "সংযোগ লগ", - "connectionLogCopy": "লগগুলি ক্লিপবোর্ডে কপি করুন", - "connectionLogEmpty": "এখনো কোনো সংযোগ লগ নেই", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "খোলা", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "সংযোগ লগগুলির জন্য অপেক্ষা করা হচ্ছে...", - "connectionLogCopied": "সংযোগ লগগুলি ক্লিপবোর্ডে কপি করা হয়েছে", - "connectionLogCopyFailed": "লগগুলি ক্লিপবোর্ডে কপি করতে ব্যর্থ হয়েছে", - "connectionRejected": "সার্ভার কর্তৃক সংযোগ প্রত্যাখ্যাত হয়েছে। অনুগ্রহ করে আপনার প্রমাণীকরণ এবং নেটওয়ার্ক কনফিগারেশন যাচাই করুন।", - "hostKeyRejected": "SSH হোস্ট কী যাচাইকরণ প্রত্যাখ্যাত হয়েছে। সংযোগ বাতিল করা হয়েছে।", - "sessionTakenOver": "সেশনটি অন্য একটি ট্যাবে খোলা হয়েছিল। পুনরায় সংযোগ করা হচ্ছে..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "স্প্লিট ট্যাব", + "addToSplit": "স্প্লিটে যোগ করুন", + "removeFromSplit": "স্প্লিট থেকে সরান" + } }, "fileManager": { - "noHostSelected": "কোন হোস্ট নির্বাচন করা হয়নি", + "noHostSelected": "No host selected", "initializingEditor": "এডিটর চালু করা হচ্ছে...", - "file": "ফাইল", - "folder": "ফোল্ডার", - "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": "নাম পরিবর্তন", - "uploading": "আপলোড হচ্ছে...", - "uploadingFile": "{{name}} আপলোড হচ্ছে ...", - "fileName": "ফাইলের নাম", - "folderName": "ফোল্ডারের নাম", - "fileUploadedSuccessfully": "ফাইল \"{{name}}\" সফলভাবে আপলোড হয়েছে", - "failedToUploadFile": "ফাইল আপলোড করতে ব্যর্থ হয়েছে", - "fileDownloadedSuccessfully": "ফাইল \"{{name}}\" সফলভাবে ডাউনলোড হয়েছে", - "failedToDownloadFile": "ফাইল ডাউনলোড করতে ব্যর্থ হয়েছে", - "fileCreatedSuccessfully": "ফাইল \"{{name}}\" সফলভাবে তৈরি হয়েছে", - "folderCreatedSuccessfully": "\"{{name}}\" ফোল্ডারটি সফলভাবে তৈরি করা হয়েছে", - "failedToCreateItem": "আইটেম তৈরি করতে ব্যর্থ হয়েছে", - "operationFailed": "{{operation}} অপারেশনটি {{name}}এর জন্য ব্যর্থ হয়েছে: {{error}}", - "failedToResolveSymlink": "সিমলিঙ্ক সমাধান করতে ব্যর্থ হয়েছে", - "itemsDeletedSuccessfully": "{{count}} আইটেম সফলভাবে মুছে ফেলা হয়েছে", - "failedToDeleteItems": "আইটেমগুলি মুছে ফেলতে ব্যর্থ হয়েছে", - "sudoPasswordRequired": "প্রশাসক পাসওয়ার্ড আবশ্যক", - "enterSudoPassword": "এই অপারেশনটি চালিয়ে যেতে sudo পাসওয়ার্ড দিন।", - "sudoPassword": "সুডো পাসওয়ার্ড", - "sudoOperationFailed": "Sudo অপারেশন ব্যর্থ হয়েছে", - "sudoAuthFailed": "Sudo প্রমাণীকরণ ব্যর্থ হয়েছে", - "dragFilesToUpload": "আপলোড করার জন্য ফাইলগুলো এখানে রাখুন।", - "emptyFolder": "এই ফোল্ডারটি খালি", - "searchFiles": "ফাইলগুলি অনুসন্ধান করুন...", - "upload": "আপলোড", - "selectHostToStart": "ফাইল ব্যবস্থাপনা শুরু করতে একটি হোস্ট নির্বাচন করুন", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "ফাইল ম্যানেজারের জন্য SSH প্রয়োজন। এই হোস্টে SSH সক্রিয় করা নেই।", - "failedToConnect": "SSH-এর সাথে সংযোগ করতে ব্যর্থ হয়েছে", - "failedToLoadDirectory": "ডিরেক্টরি লোড করতে ব্যর্থ হয়েছে", - "noSSHConnection": "কোন SSH সংযোগ উপলব্ধ নেই", - "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}} মুছে ফেলতে নিশ্চিত?", - "permissionDenied": "অনুমতি প্রত্যাখ্যান করা হয়েছে", - "serverError": "সার্ভার ত্রুটি", - "fileSavedSuccessfully": "ফাইল সফলভাবে সংরক্ষিত হয়েছে।", - "failedToSaveFile": "ফাইল সংরক্ষণ করতে ব্যর্থ হয়েছে", - "confirmDeleteSingleItem": "আপনি কি \"{{name}} \" স্থায়ীভাবে মুছে ফেলতে চান?", - "confirmDeleteMultipleItems": "আপনি কি {{count}} টি আইটেম স্থায়ীভাবে মুছে ফেলতে চান?", - "confirmDeleteMultipleItemsWithFolders": "আপনি কি {{count}} টি আইটেম স্থায়ীভাবে মুছে ফেলতে নিশ্চিত? এর মধ্যে ফোল্ডার এবং তার ভেতরের সবকিছু অন্তর্ভুক্ত।", - "confirmDeleteFolder": "আপনি কি \"{{name}}\" ফোল্ডারটি এবং এর ভেতরের সবকিছু স্থায়ীভাবে মুছে ফেলতে চান?", - "permanentDeleteWarning": "এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না। আইটেম(গুলি) সার্ভার থেকে স্থায়ীভাবে মুছে ফেলা হবে।", - "recent": "সাম্প্রতিক", - "pinned": "পিন করা", - "folderShortcuts": "ফোল্ডার শর্টকাট", - "failedToReconnectSSH": "SSH সেশন পুনরায় সংযোগ করতে ব্যর্থ হয়েছে", - "openTerminalHere": "এখানে টার্মিনাল খুলুন", - "run": "দৌড়", - "openTerminalInFolder": "এই ফোল্ডারে টার্মিনাল খুলুন", - "openTerminalInFileLocation": "ফাইল লোকেশনে টার্মিনাল খুলুন", - "runningFile": "দৌড়ানো - {{file}}", - "onlyRunExecutableFiles": "শুধুমাত্র এক্সিকিউটেবল ফাইল চালানো যাবে", - "directories": "ডিরেক্টরি", - "removedFromRecentFiles": "সাম্প্রতিক ফাইলগুলি থেকে \"{{name}}\" সরানো হয়েছে", - "removeFailed": "ব্যর্থ অপসারণ", - "unpinnedSuccessfully": "\"{{name}}\" সফলভাবে আনপিন করা হয়েছে", - "unpinFailed": "আনপিন ব্যর্থ হয়েছে", - "removedShortcut": "\"{{name}} \" শর্টকাটটি সরানো হয়েছে", - "removeShortcutFailed": "শর্টকাট অপসারণ ব্যর্থ হয়েছে", - "clearedAllRecentFiles": "সাম্প্রতিক সমস্ত ফাইল মুছে ফেলা হয়েছে", - "clearFailed": "পরিষ্কার করতে ব্যর্থ হয়েছে", - "removeFromRecentFiles": "সাম্প্রতিক ফাইলগুলি থেকে সরান", - "clearAllRecentFiles": "সাম্প্রতিক সমস্ত ফাইল মুছে ফেলুন", - "unpinFile": "ফাইলটি আনপিন করুন", - "removeShortcut": "শর্টকাট সরান", - "pinFile": "পিন ফাইল", - "addToShortcuts": "শর্টকাটে যোগ করুন", - "pasteFailed": "পেস্ট ব্যর্থ হয়েছে", - "noUndoableActions": "কোনো পূর্বাবস্থায় ফেরানো যায় না এমন কাজ নেই।", - "undoCopySuccess": "কপি অপারেশন বাতিল করা হয়েছে: {{count}} টি কপি করা ফাইল মুছে ফেলা হয়েছে", - "undoCopyFailedDelete": "পূর্বাবস্থায় ফেরানো ব্যর্থ হয়েছে: কপি করা কোনো ফাইল মুছে ফেলা সম্ভব হয়নি", - "undoCopyFailedNoInfo": "পূর্বাবস্থায় ফেরানো ব্যর্থ হয়েছে: কপি করা ফাইলের তথ্য খুঁজে পাওয়া যায়নি", - "undoMoveSuccess": "স্থানান্তর প্রক্রিয়া বাতিল করা হয়েছে: {{count}} টি ফাইল মূল অবস্থানে ফিরিয়ে আনা হয়েছে", - "undoMoveFailedMove": "পূর্বাবস্থায় ফেরানো ব্যর্থ হয়েছে: কোনো ফাইল আগের জায়গায় সরানো সম্ভব হয়নি", - "undoMoveFailedNoInfo": "পূর্বাবস্থায় ফেরানো ব্যর্থ হয়েছে: স্থানান্তরিত ফাইলের তথ্য খুঁজে পাওয়া যায়নি", - "undoDeleteNotSupported": "মুছে ফেলার প্রক্রিয়াটি পূর্বাবস্থায় ফেরানো যাবে না: ফাইলগুলো সার্ভার থেকে স্থায়ীভাবে মুছে ফেলা হয়েছে।", - "undoTypeNotSupported": "অসমর্থিত পূর্বাবস্থায় ফেরানোর অপারেশনের ধরণ", - "undoOperationFailed": "পূর্বাবস্থায় ফেরানো ব্যর্থ হয়েছে", - "unknownError": "অজানা ত্রুটি", - "confirm": "নিশ্চিত করুন", - "find": "খুঁজুন...", - "replace": "প্রতিস্থাপন করুন", - "downloadInstead": "পরিবর্তে ডাউনলোড করুন", - "keyboardShortcuts": "কীবোর্ড শর্টকাট", - "searchAndReplace": "অনুসন্ধান ও প্রতিস্থাপন", - "editing": "সম্পাদনা", - "search": "অনুসন্ধান", - "findNext": "পরবর্তী খুঁজুন", - "findPrevious": "পূর্ববর্তী খুঁজুন", - "save": "সংরক্ষণ করুন", - "selectAll": "সব নির্বাচন করুন", - "undo": "পূর্বাবস্থায় ফেরান", - "redo": "পুনরায় করুন", - "moveLineUp": "লাইন আপ সরান", - "moveLineDown": "লাইন নিচে সরান", - "toggleComment": "মন্তব্য টগল করুন", - "autoComplete": "স্বয়ংক্রিয়ভাবে সম্পূর্ণ", - "imageLoadError": "ছবি লোড করতে ব্যর্থ হয়েছে", - "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": "নতুন ফোল্ডার", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "{{count}} টি আইটেম সফলভাবে {{target}} টি আইটেমে সরানো হয়েছে", - "move": "স্থানান্তর", - "searchInFile": "ফাইলে অনুসন্ধান করুন (Ctrl+F)", - "showKeyboardShortcuts": "কিবোর্ড শর্টকাট দেখান", - "startWritingMarkdown": "আপনার মার্কডাউন কন্টেন্ট লেখা শুরু করুন...", - "loadingFileComparison": "ফাইল তুলনা লোড হচ্ছে...", - "reload": "পুনরায় লোড করুন", - "compare": "তুলনা করুন", - "sideBySide": "পাশাপাশি", - "inline": "ইনলাইন", - "fileComparison": "ফাইল তুলনা: {{file1}} বনাম {{file2}}", - "fileTooLarge": "ফাইলের আকার অনেক বড়: {{error}}", - "sshConnectionFailed": "SSH সংযোগ ব্যর্থ হয়েছে। অনুগ্রহ করে {{name}} ({{ip}}:{{port}} ) -এ আপনার সংযোগ পরীক্ষা করুন।", - "loadFileFailed": "ফাইল লোড করতে ব্যর্থ: {{error}}", - "connecting": "সংযোগ স্থাপন...", - "connectedSuccessfully": "সফলভাবে সংযুক্ত হয়েছে", - "totpVerificationFailed": "TOTP যাচাইকরণ ব্যর্থ হয়েছে", - "warpgateVerificationFailed": "ওয়ার্পগেট প্রমাণীকরণ ব্যর্থ হয়েছে", - "authenticationFailed": "প্রমাণীকরণ ব্যর্থ হয়েছে", - "verificationCodePrompt": "যাচাইকরণ কোড:", - "changePermissions": "অনুমতি পরিবর্তন করুন", - "currentPermissions": "বর্তমান অনুমতি", - "owner": "মালিক", - "group": "গ্রুপ", - "others": "অন্যান্য", - "read": "পড়ুন", - "write": "লিখুন", - "execute": "কার্যকর করুন", - "permissionsChangedSuccessfully": "অনুমতি সফলভাবে পরিবর্তন করা হয়েছে", - "failedToChangePermissions": "অনুমতি পরিবর্তন করতে ব্যর্থ হয়েছে", - "name": "নাম", - "sortByName": "নাম", - "sortByDate": "পরিবর্তিত তারিখ", - "sortBySize": "আকার", - "ascending": "আরোহী", - "descending": "অবতরণ", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "মূল", "new": "নতুন", "sortBy": "অনুসারে সাজান", @@ -1139,20 +1335,20 @@ "editor": "সম্পাদক", "octal": "অক্টাল", "storage": "স্টোরেজ", - "disk": "ডিস্ক", - "used": "ব্যবহৃত", - "of": "এর", - "toggleSidebar": "সাইডবার টগল করুন", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "পিডিএফ লোড করা যাচ্ছে না", "pdfLoadError": "এই পিডিএফ ফাইলটি লোড করতে ত্রুটি হয়েছে।", "loadingPdf": "পিডিএফ লোড হচ্ছে...", "loadingPage": "পৃষ্ঠা লোড হচ্ছে..." }, "transfer": { - "copyToHost": "হোস্টে কপি করুন…", - "moveToHost": "হোস্টে যান…", - "copyItemsToHost": "{{count}} টি আইটেম হোস্টে কপি করুন…", - "moveItemsToHost": "{{count}} টি আইটেম… টি হোস্টে সরান", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "অন্য কোনো ফাইল-ম্যানেজার হোস্ট উপলব্ধ নেই।", "noHostsConnectedHint": "হোস্ট ম্যানেজারে ফাইল ম্যানেজার সক্রিয় করা আছে এমন আরেকটি SSH হোস্ট যোগ করুন।", "selectDestinationHost": "গন্তব্য হোস্ট নির্বাচন করুন", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "সাম্প্রতিক গন্তব্যস্থলগুলি প্রসারিত করুন", "browseFolders": "গন্তব্য ফোল্ডারগুলি ব্রাউজ করুন", "browseDestination": "ব্রাউজ করুন অথবা পথ লিখুন", - "confirmCopy": "অনুলিপি", - "confirmMove": "স্থানান্তর", - "transferring": "… স্থানান্তর করা হচ্ছে", - "compressing": "… সংকুচিত করা হচ্ছে", - "extracting": "… নিষ্কাশন করা হচ্ছে", - "transferringItems": "{{current}} টি {{total}} টি আইটেম… টি স্থানান্তর করা হচ্ছে", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "স্থানান্তর সম্পন্ন হয়েছে", "transferError": "স্থানান্তর ব্যর্থ হয়েছে", - "transferPartial": "{{count}} টি ত্রুটি সহ স্থানান্তর সম্পন্ন হয়েছে।", - "transferPartialHint": "স্থানান্তর করা যায়নি: {{paths}}", - "itemsSummary": "{{count}} আইটেম", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "একাধিক আইটেম স্থানান্তরের জন্য গন্তব্য অবশ্যই একটি ডিরেক্টরি হতে হবে।", "selectThisFolder": "এই ফোল্ডারটি নির্বাচন করুন", "browsePathWillBeCreated": "এই ফোল্ডারটি এখনও তৈরি হয়নি। স্থানান্তর শুরু হলে এটি তৈরি হয়ে যাবে।", "browsePathError": "গন্তব্য হোস্টে এই পাথটি খোলা সম্ভব হয়নি।", "goUp": "উপরে যান", - "copyFolderToHost": "ফোল্ডারটি হোস্টে কপি করুন…", - "moveFolderToHost": "ফোল্ডারটি হোস্টে সরান…", - "hostReady": "প্রস্তুত", - "hostConnecting": "… সংযোগ করা হচ্ছে", - "hostDisconnected": "সংযুক্ত নয়", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "প্রমাণীকরণ আবশ্যক — প্রথমে এই হোস্টে ফাইল ম্যানেজার খুলুন।", - "hostConnectionFailed": "সংযোগ ব্যর্থ হয়েছে", + "hostConnectionFailed": "Connection failed", "metricsTitle": "স্থানান্তর সময়", - "metricsPrepare": "গন্তব্য প্রস্তুত করুন: {{duration}}", - "metricsCompress": "উৎস থেকে সংকুচিত করুন: {{duration}}", - "metricsHopSourceRead": "উৎস → সার্ভার: {{throughput}}", - "metricsHopDestSftpWrite": "সার্ভার → গন্তব্য (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "সার্ভার → গন্তব্য (স্থানীয়): {{throughput}}", - "metricsTransfer": "প্রান্ত থেকে প্রান্ত: {{throughput}} ({{duration}})", - "metricsExtract": "গন্তব্যে নিষ্কাশন: {{duration}}", - "metricsSourceDelete": "উৎস থেকে সরান: {{duration}}", - "metricsTotal": "মোট: {{duration}}", - "progressCompressing": "উৎস হোস্টে সংকুচিত করা হচ্ছে…", - "progressExtracting": "গন্তব্য… থেকে নিষ্কাশন করা হচ্ছে", - "progressTransferring": "ডেটা স্থানান্তর করা হচ্ছে…", - "progressReconnecting": "পুনরায় সংযোগ স্থাপন…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "সমান্তরাল স্থানান্তর লেন", - "parallelSegmentsOption": "{{count}} লেন", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "বড় ফাইলগুলোকে ২৫৬ মেগাবাইটের খণ্ডে ভাগ করা হয়। মোট থ্রুপুট বাড়ানোর জন্য একাধিক লেন আলাদা সংযোগ ব্যবহার করে (যেমন কয়েকটি ট্রান্সফার শুরু করা)।", - "progressTotalSpeed": "{{speed}} মোট ({{lanes}} লেন)", - "progressTransferringItems": "ফাইল স্থানান্তর করা হচ্ছে ({{current}} {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} ফাইল", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "উৎস ফাইলগুলি রাখা হয়েছে (আংশিক স্থানান্তর)", "jumpHostLimitation": "উভয় হোস্টকেই টারমিক্স সার্ভার থেকে পৌঁছানো সম্ভব হতে হবে। সরাসরি হোস্ট-টু-হোস্ট রাউটিং সমর্থিত নয়।", - "cancel": "বাতিল করুন", + "cancel": "Cancel", "methodLabel": "স্থানান্তর পদ্ধতি", "methodAuto": "অটো", "methodTar": "টার আর্কাইভ", @@ -1216,25 +1412,25 @@ "methodAutoHint": "ফাইলের সংখ্যা, আকার এবং সংকোচনযোগ্যতার উপর ভিত্তি করে tar অথবা ফাইল-ভিত্তিক SFTP নির্বাচন করে। একক ফাইলের ক্ষেত্রে সর্বদা স্ট্রিমিং SFTP ব্যবহৃত হয়।", "methodTarHint": "উৎসস্থলে কম্প্রেস করুন, একটি আর্কাইভ স্থানান্তর করুন, এবং গন্তব্যে এক্সট্র্যাক্ট করুন। উভয় ইউনিক্স হোস্টে tar প্রয়োজন।", "methodItemSftpHint": "SFTP-এর মাধ্যমে প্রতিটি ফাইল আলাদাভাবে স্থানান্তর করুন। উইন্ডোজ সহ সকল হোস্টে কাজ করে।", - "methodPreviewLoading": "স্থানান্তর পদ্ধতি গণনা করা হচ্ছে…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "স্থানান্তর পদ্ধতির প্রিভিউ দেখা সম্ভব হয়নি। আপনি চালু করার সময় সার্ভার নিজেই একটি পদ্ধতি বেছে নেবে।", "methodPreviewWillUseTar": "ব্যবহৃত হবে: টার আর্কাইভ", "methodPreviewWillUseItemSftp": "ব্যবহার করা হবে: প্রতি-ফাইল এসএফটিপি", - "methodPreviewScanSummary": "{{fileCount}} টি ফাইল, {{totalSize}} টি মোট (উৎস হোস্টে স্ক্যান করা হয়েছে)।", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "প্রতিটি ফাইল একই SFTP স্ট্রিম ব্যবহার করে একটির পর একটি একক-ফাইল কপি হিসেবে তৈরি হয়। সমস্ত ফাইলের অগ্রগতি একত্রিত করা হয়, তাই বড় ফাইলের ক্ষেত্রে বারটি ধীরে চলে।", "methodReason": { "user_item_sftp": "আপনি ফাইল-ভিত্তিক এসএফটিপি বেছে নিয়েছেন।", "user_tar": "আপনি tar আর্কাইভটি বেছে নিয়েছেন।", "tar_unavailable": "এক বা উভয় হোস্টে Tar উপলব্ধ না থাকায়, এর পরিবর্তে ফাইল-ভিত্তিক SFTP ব্যবহার করা হবে।", "windows_host": "এখানে একটি উইন্ডোজ হোস্ট জড়িত — tar ব্যবহৃত হয় না।", - "auto_multi_large": "স্বয়ংক্রিয়: সংকোচনযোগ্য ডেটা সহ একটি বড় ফাইল ({{largestSize}}) সহ একাধিক ফাইল — tar বান্ডেল করে একটি একক স্থানান্তরে পাঠানো হয়।", - "auto_single_large_in_archive": "স্বয়ংক্রিয়: এই সেটে একটি বড় ফাইল ({{largestSize}}) — ফাইল-ভিত্তিক SFTP।", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "স্বয়ংক্রিয়: প্রধানত অসংকোচনযোগ্য ডেটা — ফাইল-ভিত্তিক এসএফটিপি।", - "auto_many_files": "স্বয়ংক্রিয়: একাধিক ফাইল ({{fileCount}}) — tar প্রতি-ফাইল ওভারহেড কমায়।", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "স্বয়ংক্রিয়: এই সেটের জন্য প্রতি-ফাইল এসএফটিপি।" }, - "progressCancel": "বাতিল করুন", - "progressCancelling": "বাতিল করা হচ্ছে…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "স্থবির", "resumedHint": "অন্য একটি উইন্ডোতে শুরু হওয়া একটি সক্রিয় ট্রান্সফারের সাথে পুনরায় সংযুক্ত হওয়া গেছে।", "transferCancelled": "স্থানান্তর বাতিল করা হয়েছে", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "কিছু আংশিক ফাইল সরানো যায়নি", "cleanupDestFilesNothing": "গন্তব্যে পরিষ্কার করার কিছু নেই।", "cleanupDestFilesError": "পরিষ্কার করা ব্যর্থ হয়েছে", - "retryTransfer": "পুনরায় চেষ্টা করুন", + "retryTransfer": "Retry", "retryTransferError": "পুনরায় চেষ্টা ব্যর্থ হয়েছে", "transferFailedRetryHint": "গন্তব্যে আংশিক ডেটা সংরক্ষিত হয়েছে। সংযোগ ফিরে এলে পুনরায় চেষ্টা শুরু হবে।" }, "tunnels": { - "noSshTunnels": "কোন SSH টানেল নেই", - "createFirstTunnelMessage": "আপনি এখনও কোনো SSH টানেল তৈরি করেননি। শুরু করার জন্য হোস্ট ম্যানেজারে টানেল সংযোগগুলি কনফিগার করুন।", - "connected": "সংযুক্ত", - "disconnected": "বিচ্ছিন্ন", - "connecting": "সংযোগ স্থাপন...", - "error": "ত্রুটি", - "canceling": "বাতিল করা হচ্ছে...", - "connect": "সংযোগ করুন", - "disconnect": "সংযোগ বিচ্ছিন্ন করুন", - "cancel": "বাতিল করুন", - "port": "বন্দর", - "localPort": "স্থানীয় বন্দর", - "remotePort": "রিমোট পোর্ট", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "বর্তমান হোস্ট পোর্ট", - "endpointPort": "এন্ডপয়েন্ট পোর্ট", + "endpointPort": "Endpoint Port", "bindIp": "স্থানীয় আইপি", - "endpointSshConfig": "এন্ডপয়েন্ট SSH কনফিগারেশন", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "এন্ডপয়েন্ট SSH হোস্ট", "endpointSshHostPlaceholder": "একটি কনফিগার করা হোস্ট নির্বাচন করুন", "endpointSshHostRequired": "প্রতিটি ক্লায়েন্ট টানেলের জন্য একটি এন্ডপয়েন্ট SSH হোস্ট নির্বাচন করুন।", - "attempt": "{{max}} এর {{current}} প্রচেষ্টা", - "nextRetryIn": "{{seconds}} সেকেন্ড পর আবার চেষ্টা করা হবে।", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "ক্লায়েন্ট টানেল", "clientTunnel": "ক্লায়েন্ট টানেল", "addClientTunnel": "ক্লায়েন্ট টানেল যোগ করুন", "noClientTunnels": "এই ডেস্কটপে কোনো ক্লায়েন্ট টানেল কনফিগার করা নেই।", - "tunnelName": "টানেলের নাম", - "remoteHost": "রিমোট হোস্ট", - "autoStart": "অটো স্টার্ট", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "এই ডেস্কটপ ক্লায়েন্টটি খুললে এটি চালু হয় এবং সংযুক্ত থাকে।", "clientManualStartDesc": "এই সারি থেকে স্টার্ট এবং স্টপ ব্যবহার করুন। টারমিক্স এটি স্বয়ংক্রিয়ভাবে খুলবে না।", "clientRemoteServerNote": "রিমোট ফরওয়ার্ডিংয়ের জন্য এন্ডপয়েন্ট SSH সার্ভারে AllowTcpForwarding এবং GatewayPorts চালু করার প্রয়োজন হতে পারে। এই ডেস্কটপটি সংযোগ বিচ্ছিন্ন করলে রিমোট পোর্টটি বন্ধ হয়ে যায়।", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "রিমোট পোর্ট অবশ্যই ১ থেকে ৬৫৫৩৫-এর মধ্যে হতে হবে।", "invalidLocalTargetPort": "স্থানীয় টার্গেট পোর্ট অবশ্যই ১ থেকে ৬৫৫৩৫-এর মধ্যে হতে হবে।", "invalidEndpointPort": "এন্ডপয়েন্ট পোর্ট অবশ্যই ১ থেকে ৬৫৫৩৫-এর মধ্যে হতে হবে।", - "duplicateAutoStartBind": "শুধুমাত্র একটি অটো-স্টার্ট ক্লায়েন্ট টানেল {{bind}} ব্যবহার করতে পারে।", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "টানেলের অবস্থা আপডেট করতে ব্যর্থ হয়েছে।", - "active": "সক্রিয়", - "start": "শুরু করুন", - "stop": "থামুন", - "test": "পরীক্ষা", - "type": "টানেল টাইপ", - "typeLocal": "স্থানীয় (-L)", - "typeRemote": "রিমোট (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "গতিশীল (-D)", "typeServerLocalDesc": "বর্তমান হোস্ট থেকে এন্ডপয়েন্ট।", "typeServerRemoteDesc": "এন্ডপয়েন্টটি বর্তমান হোস্টে ফিরে যাচ্ছে।", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "এন্ডপয়েন্টটি স্থানীয় কম্পিউটারে ফিরে যাচ্ছে।", "typeClientDynamicDesc": "স্থানীয় কম্পিউটারে SOCKS।", "typeDynamicDesc": "SSH এর মাধ্যমে SOCKS5 CONNECT ট্র্যাফিক ফরওয়ার্ড করুন", - "forwardDescriptionServerLocal": "বর্তমান হোস্ট {{sourcePort}} → শেষ বিন্দু {{endpointPort}}.", - "forwardDescriptionServerRemote": "এন্ডপয়েন্ট {{endpointPort}} → বর্তমান হোস্ট {{sourcePort}}.", - "forwardDescriptionServerDynamic": "বর্তমান হোস্টে SOCKS {{sourcePort}}।", - "forwardDescriptionClientLocal": "স্থানীয় {{sourcePort}} → দূরবর্তী {{endpointPort}}.", - "forwardDescriptionClientRemote": "রিমোট {{sourcePort}} → লোকাল {{endpointPort}}.", - "forwardDescriptionClientDynamic": "স্থানীয় পোর্ট {{sourcePort}}-এ SOCKS।", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "স্থানীয় {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → স্থানীয় {{localPort}}", - "autoNameClientDynamic": "মোজা {{localPort}} {{endpoint}} এর মাধ্যমে", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "পথ:", "lastStarted": "সর্বশেষ শুরু হয়েছে", "lastTested": "সর্বশেষ পরীক্ষা করা হয়েছে", "lastError": "শেষ ত্রুটি", - "maxRetries": "সর্বোচ্চ পুনঃপ্রচেষ্টা", + "maxRetries": "Max Retries", "maxRetriesDescription": "পুনরায় চেষ্টার সর্বোচ্চ সংখ্যা।", - "retryInterval": "পুনরায় চেষ্টার ব্যবধান (সেকেন্ড)", - "retryIntervalDescription": "পুনরায় চেষ্টার মাঝে অপেক্ষার সময়।", - "local": "স্থানীয়", - "remote": "দূরবর্তী", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "গন্তব্য", "host": "হোস্ট", "mode": "মোড", - "noHostSelected": "কোন হোস্ট নির্বাচন করা হয়নি", + "noHostSelected": "No host selected", "working": "কাজ চলছে..." }, - "serverStats": { - "cpu": "সিপিইউ", - "memory": "স্মৃতি", - "disk": "ডিস্ক", - "network": "নেটওয়ার্ক", - "uptime": "আপটাইম", - "processes": "প্রক্রিয়া", - "available": "উপলব্ধ", - "free": "বিনামূল্যে", - "connecting": "সংযোগ স্থাপন...", - "connectionFailed": "সার্ভারের সাথে সংযোগ করতে ব্যর্থ হয়েছে", - "naCpus": "প্রযোজ্য নয় সিপিইউ(গুলি)", - "cpuCores_one": "{{count}} কোর", - "cpuCores_other": "{{count}} কোর", - "cpuUsage": "সিপিইউ ব্যবহার", - "memoryUsage": "মেমরি ব্যবহার", - "diskUsage": "ডিস্ক ব্যবহার", - "failedToFetchHostConfig": "হোস্ট কনফিগারেশন আনতে ব্যর্থ হয়েছে", - "serverOffline": "সার্ভার অফলাইন", - "cannotFetchMetrics": "অফলাইন সার্ভার থেকে মেট্রিক্স সংগ্রহ করা যাচ্ছে না", - "totpFailed": "TOTP যাচাইকরণ ব্যর্থ হয়েছে", - "noneAuthNotSupported": "সার্ভার স্ট্যাটস 'none' অথেনটিকেশন টাইপ সমর্থন করে না।", - "load": "লোড", - "systemInfo": "সিস্টেমের তথ্য", - "hostname": "হোস্টনাম", - "operatingSystem": "অপারেটিং সিস্টেম", - "kernel": "কার্নেল", - "seconds": "সেকেন্ড", - "networkInterfaces": "নেটওয়ার্ক ইন্টারফেস", - "noInterfacesFound": "কোন নেটওয়ার্ক ইন্টারফেস খুঁজে পাওয়া যায়নি", - "noProcessesFound": "কোন প্রক্রিয়া খুঁজে পাওয়া যায়নি", - "loginStats": "SSH লগইন পরিসংখ্যান", - "noRecentLoginData": "সাম্প্রতিক কোনো লগইন ডেটা নেই", - "executingQuickAction": "{{name}} কার্যকর করা হচ্ছে ...", - "quickActionSuccess": "{{name}} সফলভাবে সম্পন্ন হয়েছে", - "quickActionFailed": "{{name}} ব্যর্থ হয়েছে", - "quickActionError": "{{name}} কার্যকর করতে ব্যর্থ হয়েছে", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "লিসেনিং পোর্ট", - "protocol": "প্রোটোকল", - "port": "বন্দর", - "address": "ঠিকানা", - "process": "প্রক্রিয়া", - "noData": "কোন লিসেনিং পোর্ট ডেটা নেই" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "সব", + "noData": "No listening ports data" }, "firewall": { - "title": "ফায়ারওয়াল", - "inactive": "নিষ্ক্রিয়", - "policy": "নীতি", - "rules": "নিয়ম", - "noData": "কোন ফায়ারওয়াল ডেটা উপলব্ধ নেই", - "action": "পদক্ষেপ", - "protocol": "প্রোটো", - "port": "বন্দর", - "source": "উৎস", - "anywhere": "যেকোনো জায়গায়" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "গড় লোড", "swap": "অদলবদল", "architecture": "স্থাপত্য", - "refresh": "রিফ্রেশ", - "retry": "পুনরায় চেষ্টা করুন" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "কাজ চলছে...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "সেলফ-হোস্টেড SSH এবং রিমোট ডেস্কটপ ম্যানেজমেন্ট", - "loginTitle": "Termix-এ লগইন করুন", - "registerTitle": "অ্যাকাউন্ট তৈরি করুন", - "forgotPassword": "পাসওয়ার্ড ভুলে গেছেন?", - "rememberMe": "৩০ দিনের জন্য ডিভাইস মনে রাখুন (TOTP অন্তর্ভুক্ত)", - "noAccount": "আপনার কি অ্যাকাউন্ট নেই?", - "hasAccount": "আপনার কি ইতিমধ্যেই একটি অ্যাকাউন্ট আছে?", - "twoFactorAuth": "দ্বি-স্তরীয় প্রমাণীকরণ", - "enterCode": "যাচাইকরণ কোড প্রবেশ করান", - "backupCode": "অথবা ব্যাকআপ কোড ব্যবহার করুন", - "verifyCode": "কোড যাচাই করুন", - "redirectingToApp": "অ্যাপে পুনঃনির্দেশিত করা হচ্ছে...", - "sshAuthenticationRequired": "SSH প্রমাণীকরণ আবশ্যক", - "sshNoKeyboardInteractive": "কিবোর্ড-ভিত্তিক প্রমাণীকরণ অনুপলব্ধ", - "sshAuthenticationFailed": "প্রমাণীকরণ ব্যর্থ হয়েছে", - "sshAuthenticationTimeout": "প্রমাণীকরণ সময়সীমা", - "sshNoKeyboardInteractiveDescription": "সার্ভারটি কিবোর্ড-ভিত্তিক প্রমাণীকরণ সমর্থন করে না। অনুগ্রহ করে আপনার পাসওয়ার্ড অথবা SSH কী প্রদান করুন।", - "sshAuthFailedDescription": "প্রদত্ত তথ্য ভুল ছিল। অনুগ্রহ করে সঠিক তথ্য দিয়ে আবার চেষ্টা করুন।", - "sshTimeoutDescription": "প্রমাণীকরণের প্রচেষ্টাটির সময়সীমা শেষ হয়ে গেছে। অনুগ্রহ করে আবার চেষ্টা করুন।", - "sshProvideCredentialsDescription": "এই সার্ভারে সংযোগ করতে অনুগ্রহ করে আপনার SSH ক্রেডেনশিয়াল প্রদান করুন।", - "sshPasswordDescription": "এই SSH সংযোগের জন্য পাসওয়ার্ডটি প্রবেশ করান।", - "sshKeyPasswordDescription": "আপনার SSH কী এনক্রিপ্ট করা থাকলে, এখানে পাসফ্রেজটি লিখুন।", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "পাসফ্রেজ আবশ্যক", "passphraseRequiredDescription": "SSH কী-টি এনক্রিপ্ট করা আছে। এটি আনলক করতে অনুগ্রহ করে পাসফ্রেজটি প্রবেশ করান।", - "back": "ফিরে যান", - "firstUser": "প্রথম ব্যবহারকারী", - "firstUserMessage": "আপনি প্রথম ব্যবহারকারী এবং আপনাকে অ্যাডমিন করা হবে। আপনি সাইডবারের ইউজার ড্রপডাউনে অ্যাডমিন সেটিংস দেখতে পারেন। যদি আপনার মনে হয় এটি একটি ভুল, তাহলে ডকার লগ চেক করুন, অথবা একটি গিটহাব ইস্যু তৈরি করুন।", - "external": "বাহ্যিক", - "loginWithExternal": "বাহ্যিক সরবরাহকারী দিয়ে লগইন করুন", - "loginWithExternalDesc": "আপনার কনফিগার করা বাহ্যিক পরিচয় প্রদানকারী ব্যবহার করে লগইন করুন।", - "externalNotSupportedInElectron": "ইলেকট্রন অ্যাপে এখনও বাহ্যিক প্রমাণীকরণ সমর্থিত নয়। OIDC লগইনের জন্য অনুগ্রহ করে ওয়েব সংস্করণ ব্যবহার করুন।", - "resetPasswordButton": "পাসওয়ার্ড রিসেট করুন", - "sendResetCode": "রিসেট কোড পাঠান", - "resetCodeDesc": "পাসওয়ার্ড রিসেট কোড পেতে আপনার ইউজারনেম লিখুন। কোডটি ডকার কন্টেইনার লগে নথিভুক্ত করা হবে।", - "resetCode": "রিসেট কোড", - "verifyCodeButton": "কোড যাচাই করুন", - "enterResetCode": "ব্যবহারকারীর জন্য ডকার কন্টেইনার লগ থেকে ৬-সংখ্যার কোডটি প্রবেশ করান:", - "newPassword": "নতুন পাসওয়ার্ড", - "confirmNewPassword": "পাসওয়ার্ড নিশ্চিত করুন", - "enterNewPassword": "ব্যবহারকারীর জন্য আপনার নতুন পাসওয়ার্ড লিখুন:", - "signUp": "সাইন আপ করুন", - "desktopApp": "ডেস্কটপ অ্যাপ", - "loggingInToDesktopApp": "ডেস্কটপ অ্যাপে লগ ইন করা", - "loadingServer": "সার্ভার লোড হচ্ছে...", - "dataLossWarning": "এইভাবে আপনার পাসওয়ার্ড রিসেট করলে আপনার সেভ করা সমস্ত SSH হোস্ট, ক্রেডেনশিয়াল এবং অন্যান্য এনক্রিপ্টেড ডেটা মুছে যাবে। এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না। শুধুমাত্র তখনই এটি ব্যবহার করুন যখন আপনি আপনার পাসওয়ার্ড ভুলে গেছেন এবং লগ ইন করা অবস্থায় নেই।", - "authenticationDisabled": "প্রমাণীকরণ নিষ্ক্রিয় করা হয়েছে", - "authenticationDisabledDesc": "সকল প্রমাণীকরণ পদ্ধতি বর্তমানে নিষ্ক্রিয় রয়েছে। অনুগ্রহ করে আপনার প্রশাসকের সাথে যোগাযোগ করুন।", - "attemptsRemaining": "{{count}} টি প্রচেষ্টা বাকি" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSH হোস্ট কী যাচাই করুন", - "keyChangedWarning": "SSH হোস্ট কী পরিবর্তন করা হয়েছে", - "firstConnectionTitle": "এই হোস্টে প্রথমবার সংযোগ করছি", - "firstConnectionDescription": "এই হোস্টের সত্যতা যাচাই করা যাচ্ছে না। ফিঙ্গারপ্রিন্টটি আপনার প্রত্যাশার সাথে মেলে কিনা তা যাচাই করুন।", - "keyChangedDescription": "আপনার শেষ সংযোগের পর এই সার্ভারের হোস্ট কী পরিবর্তিত হয়েছে। এটি একটি নিরাপত্তা সমস্যার ইঙ্গিত হতে পারে।", - "previousKey": "পূর্ববর্তী চাবি", - "newFingerprint": "নতুন আঙুলের ছাপ", - "fingerprint": "আঙুলের ছাপ", - "verifyInstructions": "আপনি যদি এই হোস্টকে বিশ্বাস করেন, তবে চালিয়ে যেতে 'স্বীকার করুন' (Accept) এ ক্লিক করুন এবং ভবিষ্যতের সংযোগের জন্য এই ফিঙ্গারপ্রিন্টটি সংরক্ষণ করুন।", - "securityWarning": "নিরাপত্তা সতর্কতা", - "acceptAndContinue": "গ্রহণ করুন এবং চালিয়ে যান", - "acceptNewKey": "নতুন কী গ্রহণ করুন এবং চালিয়ে যান" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "ডাটাবেসের সাথে সংযোগ করা যায়নি", - "unknownError": "অজানা ত্রুটি", - "loginFailed": "লগইন ব্যর্থ হয়েছে", - "failedPasswordReset": "পাসওয়ার্ড রিসেট শুরু করতে ব্যর্থ হয়েছে", - "failedVerifyCode": "রিসেট কোড যাচাই করতে ব্যর্থ হয়েছে", - "failedCompleteReset": "পাসওয়ার্ড রিসেট সম্পন্ন করা যায়নি", - "invalidTotpCode": "অবৈধ TOTP কোড", - "failedOidcLogin": "OIDC লগইন শুরু করতে ব্যর্থ হয়েছে", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "নীরব সাইন-ইন করার অনুরোধ করা হয়েছিল, কিন্তু OIDC লগইন উপলব্ধ নেই।", "failedUserInfo": "লগইন করার পর ব্যবহারকারীর তথ্য পেতে ব্যর্থ হয়েছে", - "oidcAuthFailed": "OIDC প্রমাণীকরণ ব্যর্থ হয়েছে", - "invalidAuthUrl": "ব্যাকএন্ড থেকে প্রাপ্ত অনুমোদন URLটি অবৈধ।", - "requiredField": "এই ক্ষেত্রটি আবশ্যক", - "minLength": "সর্বনিম্ন দৈর্ঘ্য হল {{min}}", - "passwordMismatch": "পাসওয়ার্ডগুলো মিলছে না।", - "passwordLoginDisabled": "ইউজারনেম/পাসওয়ার্ড লগইন বর্তমানে নিষ্ক্রিয় রয়েছে।", - "sessionExpired": "সেশনের মেয়াদ শেষ হয়ে গেছে - অনুগ্রহ করে আবার লগ ইন করুন।", - "totpRateLimited": "রেট সীমিত: অনেক বেশি TOTP যাচাইকরণের চেষ্টা করা হয়েছে। অনুগ্রহ করে পরে আবার চেষ্টা করুন।", - "totpRateLimitedWithTime": "রেট সীমিত: TOTP যাচাইকরণের জন্য অনেক বেশিবার চেষ্টা করা হয়েছে। অনুগ্রহ করে আবার চেষ্টা করার আগে {{time}} সেকেন্ড অপেক্ষা করুন।", - "resetCodeRateLimited": "রেট সীমিত: অনেক বেশি যাচাইকরণ প্রচেষ্টা করা হয়েছে। অনুগ্রহ করে পরে আবার চেষ্টা করুন।", - "resetCodeRateLimitedWithTime": "রেট সীমিত: অনেক বেশি যাচাইকরণ প্রচেষ্টা করা হয়েছে। অনুগ্রহ করে আবার চেষ্টা করার আগে {{time}} সেকেন্ড অপেক্ষা করুন।", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "প্রমাণীকরণ টোকেন সংরক্ষণ করতে ব্যর্থ হয়েছে", "failedToLoadServer": "সার্ভার লোড করতে ব্যর্থ হয়েছে" }, "messages": { - "registrationDisabled": "অ্যাডমিন কর্তৃক নতুন অ্যাকাউন্ট নিবন্ধন বর্তমানে বন্ধ রাখা হয়েছে। অনুগ্রহ করে লগ ইন করুন অথবা কোনো প্রশাসকের সাথে যোগাযোগ করুন।", - "userNotAllowed": "আপনার অ্যাকাউন্টটি নিবন্ধনের জন্য অনুমোদিত নয়। অনুগ্রহ করে একজন প্রশাসকের সাথে যোগাযোগ করুন।", - "databaseConnectionFailed": "ডাটাবেস সার্ভারের সাথে সংযোগ স্থাপন করা যায়নি", - "resetCodeSent": "ডকার লগে রিসেট কোড পাঠানো হয়েছে", - "codeVerified": "কোড সফলভাবে যাচাই করা হয়েছে", - "passwordResetSuccess": "পাসওয়ার্ড সফলভাবে রিসেট করা হয়েছে", - "loginSuccess": "লগইন সফল হয়েছে", - "registrationSuccess": "নিবন্ধন সফল হয়েছে" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "কনফিগার করা SSH হোস্টগুলোকে লক্ষ্য করে স্থানীয় ডেস্কটপ টানেল।", "c2sTunnelPresets": "ক্লায়েন্ট টানেল প্রিসেট", "c2sTunnelPresetsDesc": "এই ডেস্কটপ ক্লায়েন্টের স্থানীয় টানেল তালিকাটিকে একটি নামযুক্ত সার্ভার প্রিসেট হিসাবে সংরক্ষণ করুন, অথবা এই ক্লায়েন্টে একটি প্রিসেট পুনরায় লোড করুন।", "c2sTunnelPresetsUnavailable": "ক্লায়েন্ট টানেল প্রিসেটগুলো শুধুমাত্র ডেস্কটপ ক্লায়েন্টে পাওয়া যায়।", - "c2sPresetName": "পূর্বনির্ধারিত নাম", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "ক্লায়েন্টের পূর্বনির্ধারিত নাম", "c2sPresetToLoad": "লোড করার জন্য প্রিসেট", "c2sNoPresetSelected": "কোনো পূর্বনির্ধারিত সেট নির্বাচন করা হয়নি", "c2sNoPresets": "কোন প্রিসেট সংরক্ষণ করা হয়নি", - "c2sLoadPreset": "লোড", - "c2sCurrentLocalConfig": "এই ডেস্কটপে {{count}} টি স্থানীয় ক্লায়েন্ট টানেল কনফিগার করা হয়েছে।", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "প্রিসেটগুলি হলো সুনির্দিষ্ট স্ন্যাপশট; এর কোনো একটি লোড করলে এই ডেস্কটপ ক্লায়েন্টের স্থানীয় ক্লায়েন্ট টানেল তালিকা প্রতিস্থাপিত হয়।", "c2sPresetSaved": "ক্লায়েন্ট টানেল প্রিসেট সংরক্ষিত", "c2sPresetLoaded": "ক্লায়েন্ট টানেল প্রিসেট স্থানীয়ভাবে লোড করা হয়েছে", @@ -1520,63 +1818,65 @@ "c2sPresetLoadError": "ক্লায়েন্ট টানেল প্রিসেট লোড করতে ব্যর্থ হয়েছে" }, "placeholders": { - "maxRetries": "৩", - "retryInterval": "১০", - "language": "ভাষা", - "keyPassword": "কী পাসওয়ার্ড", - "pastePrivateKey": "আপনার প্রাইভেট কী এখানে পেস্ট করুন...", + "maxRetries": "3", + "retryInterval": "10", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "১২৭.০.০.১ (স্থানীয়ভাবে শুনুন)", "localTargetHost": "১২৭.০.০.১ (এই কম্পিউটারে লক্ষ্যবস্তু)", "socksListenerHost": "১২৭.০.০.১ (SOCKS লিসেনার)", - "enterPassword": "আপনার পাসওয়ার্ড লিখুন", - "defaultPort": "২২", - "defaultEndpointPort": "২২৪" + "enterPassword": "Enter your password", + "defaultPort": "22", + "defaultEndpointPort": "224" }, "dashboard": { - "title": "ড্যাশবোর্ড", - "loading": "ড্যাশবোর্ড লোড হচ্ছে...", - "github": "গিটহাব", - "support": "সমর্থন", - "discord": "ডিসকর্ড", - "serverOverview": "সার্ভার ওভারভিউ", - "version": "সংস্করণ", - "upToDate": "হালনাগাদ", - "updateAvailable": "আপডেট উপলব্ধ", + "title": "Dashboard", + "loading": "Loading dashboard...", + "github": "GitHub", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "বিটা", - "uptime": "আপটাইম", - "database": "ডাটাবেস", - "healthy": "স্বাস্থ্যকর", - "error": "ত্রুটি", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "মোট হোস্ট", - "totalTunnels": "মোট টানেল", - "totalCredentials": "মোট যোগ্যতা", - "recentActivity": "সাম্প্রতিক কার্যকলাপ", - "reset": "রিসেট", - "loadingRecentActivity": "সাম্প্রতিক কার্যকলাপ লোড হচ্ছে...", - "noRecentActivity": "সাম্প্রতিক কোনো কার্যকলাপ নেই", - "quickActions": "দ্রুত পদক্ষেপ", - "addHost": "হোস্ট যোগ করুন", - "addCredential": "পরিচয়পত্র যোগ করুন", - "adminSettings": "অ্যাডমিন সেটিংস", - "userProfile": "ব্যবহারকারীর প্রোফাইল", - "serverStats": "সার্ভার পরিসংখ্যান", - "loadingServerStats": "সার্ভারের পরিসংখ্যান লোড হচ্ছে...", - "noServerData": "কোন সার্ভার ডেটা উপলব্ধ নেই", - "cpu": "সিপিইউ", - "ram": "রাম", - "customizeLayout": "ড্যাশবোর্ড কাস্টমাইজ করুন", - "dashboardSettings": "ড্যাশবোর্ড সেটিংস", - "enableDisableCards": "কার্ডগুলি সক্রিয়/নিষ্ক্রিয় করুন", - "resetLayout": "ডিফল্টে রিসেট করুন", - "serverOverviewCard": "সার্ভার ওভারভিউ", - "recentActivityCard": "সাম্প্রতিক কার্যকলাপ", - "networkGraphCard": "নেটওয়ার্ক গ্রাফ", - "networkGraph": "নেটওয়ার্ক গ্রাফ", - "quickActionsCard": "দ্রুত পদক্ষেপ", - "serverStatsCard": "সার্ভার পরিসংখ্যান", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "প্রধান", "panelSide": "পাশ", - "justNow": "এইমাত্র" + "justNow": "এইমাত্র", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "স্থিতিশীল", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "কোন হোস্ট কনফিগার করা নেই", "online": "অনলাইন", "offline": "অফলাইন", - "onlineLower": "অনলাইন", - "nodes": "{{count}} নোড", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "যোগ করুন:", "commandPalette": "কমান্ড প্যালেট", "done": "সম্পন্ন হয়েছে", "editModeInstructions": "কার্ডগুলোর ক্রম পরিবর্তন করতে টেনে আনুন · কলামের আকার পরিবর্তন করতে কলাম বিভাজকটি টেনে আনুন · কার্ডের উচ্চতার পরিবর্তন করতে এর নিচের প্রান্তটি টেনে আনুন · মুছে ফেলতে ট্র্যাশ ব্যবহার করুন", "empty": "খালি", - "clear": "পরিষ্কার" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "হোস্ট যোগ করুন", - "addGroup": "গ্রুপ যোগ করুন", - "addLink": "লিঙ্ক যোগ করুন", - "zoomIn": "জুম ইন", - "zoomOut": "জুম আউট", - "resetView": "দৃশ্য রিসেট করুন", - "selectHost": "হোস্ট নির্বাচন করুন", - "chooseHost": "একজন হোস্ট বেছে নিন...", - "parentGroup": "অভিভাবক গোষ্ঠী", - "noGroup": "কোন গ্রুপ নেই", - "groupName": "গ্রুপের নাম", - "color": "রঙ", - "source": "উৎস", - "target": "লক্ষ্য", - "moveToGroup": "গ্রুপে যান", - "selectGroup": "দল নির্বাচন করুন...", - "addConnection": "সংযোগ যোগ করুন", - "hostDetails": "হোস্টের বিবরণ", - "removeFromGroup": "গ্রুপ থেকে অপসারণ করুন", - "addHostHere": "এখানে হোস্ট যোগ করুন", - "editGroup": "সম্পাদনা গ্রুপ", - "delete": "মুছে ফেলুন", - "add": "যোগ করুন", - "create": "তৈরি করুন", - "move": "স্থানান্তর", - "connect": "সংযোগ করুন", - "createGroup": "গ্রুপ তৈরি করুন", - "selectSourcePlaceholder": "উৎস নির্বাচন করুন...", - "selectTargetPlaceholder": "লক্ষ্য নির্বাচন করুন...", - "invalidFile": "অবৈধ ফাইল", - "hostAlreadyExists": "হোস্ট ইতিমধ্যে টপোলজিতে আছে", - "connectionExists": "সংযোগটি ইতিমধ্যেই বিদ্যমান আছে", - "unknown": "অজানা", - "name": "নাম", - "ip": "আইপি", - "status": "অবস্থা", - "failedToAddNode": "নোড যোগ করতে ব্যর্থ হয়েছে", - "sourceDifferentFromTarget": "উৎস এবং লক্ষ্য অবশ্যই ভিন্ন হতে হবে", - "exportJSON": "JSON রপ্তানি করুন", - "importJSON": "JSON আমদানি করুন", - "terminal": "টার্মিনাল", - "fileManager": "ফাইল ম্যানেজার", - "tunnel": "টানেল", - "docker": "ডকার", - "serverStats": "সার্ভার পরিসংখ্যান", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "এখনো কোনো নোড নেই" }, "docker": { - "notEnabled": "এই হোস্টের জন্য ডকার সক্রিয় করা নেই।", - "validating": "ডকার যাচাই করা হচ্ছে...", - "connecting": "সংযোগ স্থাপন...", - "error": "ত্রুটি", - "version": "ডকার {{version}}", - "connectionFailed": "ডকারের সাথে সংযোগ করতে ব্যর্থ হয়েছে", - "containerStarted": "কন্টেইনার {{name}} চালু হয়েছে", - "failedToStartContainer": "{{name}} কন্টেইনারটি শুরু করতে ব্যর্থ হয়েছে", - "containerStopped": "কন্টেইনার {{name}} থেমে গেছে", - "failedToStopContainer": "কন্টেইনার বন্ধ করতে ব্যর্থ {{name}}", - "containerRestarted": "কন্টেইনার {{name}} পুনরায় চালু হয়েছে", - "failedToRestartContainer": "কন্টেইনার পুনরায় চালু করতে ব্যর্থ {{name}}", - "containerPaused": "কন্টেইনার {{name}} থামানো হয়েছে", - "containerUnpaused": "কন্টেইনার {{name}} বিরতিহীন", - "failedToTogglePauseContainer": "কন্টেইনার {{name}} এর জন্য বিরতি অবস্থা টগল করতে ব্যর্থ হয়েছে", - "containerRemoved": "কন্টেইনার {{name}} সরানো হয়েছে", - "failedToRemoveContainer": "কন্টেইনার অপসারণ করা সম্ভব হয়নি {{name}}", - "image": "ছবি", - "ports": "বন্দর", - "noPorts": "কোন পোর্ট নেই", - "start": "শুরু করুন", - "confirmRemoveContainer": "আপনি কি '{{name}}' কন্টেইনারটি সরাতে নিশ্চিত? এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না।", - "runningContainerWarning": "সতর্কীকরণ: এই কন্টেইনারটি বর্তমানে চালু আছে। এটি অপসারণ করলে প্রথমে কন্টেইনারটি বন্ধ হবে।", - "loadingContainers": "কন্টেইনার লোড করা হচ্ছে...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "ডকার ম্যানেজার", - "autoRefresh": "স্বয়ংক্রিয় রিফ্রেশ", + "autoRefresh": "Auto Refresh", "timestamps": "টাইমস্ট্যাম্প", "lines": "লাইন", - "filterLogs": "লগ ফিল্টার করুন...", - "refresh": "রিফ্রেশ", - "download": "ডাউনলোড করুন", - "clear": "পরিষ্কার", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "লগগুলি সফলভাবে ডাউনলোড করা হয়েছে।", "last50": "শেষ ৫০", "last100": "শেষ ১০০", "last500": "শেষ ৫০০", "last1000": "শেষ ১০০০", "allLogs": "সমস্ত লগ", - "noLogsMatching": "\"{{query}} \" এর সাথে মেলে এমন কোনও লগ নেই", - "noLogsAvailable": "কোন লগ উপলব্ধ নেই", - "noContainersFound": "কোন কন্টেইনার পাওয়া যায়নি", - "noContainersFoundHint": "এই হোস্টে কোনো ডকার কন্টেইনার উপলব্ধ নেই।", - "searchPlaceholder": "কন্টেইনারগুলি অনুসন্ধান করুন...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "সমস্ত স্ট্যাটাস", - "stateRunning": "দৌড়ানো", + "stateRunning": "Running", "statePaused": "বিরতি দেওয়া হয়েছে", "stateExited": "উত্তেজিত", "stateRestarting": "পুনরায় চালু করা", - "noContainersMatchFilters": "আপনার ফিল্টারগুলির সাথে কোনও কন্টেইনার মেলে না", - "noContainersMatchFiltersHint": "আপনার অনুসন্ধান বা ফিল্টারের শর্তাবলী পরিবর্তন করে দেখুন।", - "failedToFetchStats": "কন্টেইনার পরিসংখ্যান আনতে ব্যর্থ হয়েছে", - "containerNotRunning": "কন্টেইনারটি চলছে না", - "startContainerToViewStats": "পরিসংখ্যান দেখতে কন্টেইনারটি চালু করুন।", - "loadingStats": "পরিসংখ্যান লোড হচ্ছে...", - "errorLoadingStats": "পরিসংখ্যান লোড করতে ত্রুটি", - "noStatsAvailable": "কোন পরিসংখ্যান উপলব্ধ নেই", - "cpuUsage": "সিপিইউ ব্যবহার", - "current": "বর্তমান", - "memoryUsage": "মেমরি ব্যবহার", - "networkIo": "নেটওয়ার্ক আই/ও", - "input": "ইনপুট", - "output": "আউটপুট", - "blockIo": "ব্লক আই/ও", - "read": "পড়ুন", - "write": "লিখুন", - "pids": "পিআইডি", - "containerInformation": "কন্টেইনারের তথ্য", - "name": "নাম", - "id": "আইডি", - "state": "রাজ্য", - "containerMustBeRunning": "কনসোল অ্যাক্সেস করতে হলে কন্টেইনারটি অবশ্যই চালু থাকতে হবে।", - "verificationCodePrompt": "যাচাইকরণ কোড প্রবেশ করান", - "totpVerificationFailed": "TOTP যাচাইকরণ ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", - "warpgateVerificationFailed": "ওয়ার্পগেট প্রমাণীকরণ ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", - "connectedTo": "{{containerName}} এর সাথে সংযুক্ত", - "disconnected": "বিচ্ছিন্ন", - "consoleError": "কনসোল ত্রুটি", - "errorMessage": "ত্রুটি: {{message}}", - "failedToConnect": "কন্টেইনারের সাথে সংযোগ করতে ব্যর্থ হয়েছে", - "console": "কনসোল", - "selectShell": "শেল নির্বাচন করুন", - "bash": "ব্যাশ", - "sh": "শ", - "ash": "ছাই", - "connect": "সংযোগ করুন", - "disconnect": "সংযোগ বিচ্ছিন্ন করুন", - "notConnected": "সংযুক্ত নয়", - "clickToConnect": "শেল সেশন শুরু করতে কানেক্ট-এ ক্লিক করুন।", - "connectingTo": "{{containerName}} এর সাথে সংযোগ স্থাপন করা হচ্ছে...", - "containerNotFound": "কন্টেইনারটি খুঁজে পাওয়া যায়নি", - "backToList": "তালিকায় ফিরে যান", - "logs": "লগ", - "stats": "পরিসংখ্যান", - "consoleTab": "কনসোল", - "startContainerToAccess": "কনসোল অ্যাক্সেস করতে কন্টেইনারটি চালু করুন।" + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "সাধারণ", - "sectionOidc": "ওআইডিসি", - "sectionUsers": "ব্যবহারকারীরা", + "sectionGeneral": "General", + "sectionOidc": "OIDC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "অধিবেশন", - "sectionRoles": "ভূমিকা", - "sectionDatabase": "ডাটাবেস", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "এপিআই কী", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "ফিল্টার পরিষ্কার করুন", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "সব", "allowRegistration": "ব্যবহারকারী নিবন্ধনের অনুমতি দিন", - "allowRegistrationDesc": "নতুন ব্যবহারকারীদের স্ব-নিবন্ধন করতে দিন", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "পাসওয়ার্ড লগইনের অনুমতি দিন", "allowPasswordLoginDesc": "ব্যবহারকারীর নাম/পাসওয়ার্ড লগইন", "oidcAutoProvision": "OIDC অটো-প্রভিশন", - "oidcAutoProvisionDesc": "নিবন্ধন নিষ্ক্রিয় থাকলেও OIDC ব্যবহারকারীদের জন্য স্বয়ংক্রিয়ভাবে অ্যাকাউন্ট তৈরি করুন।", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "পাসওয়ার্ড রিসেট করার অনুমতি দিন", "allowPasswordResetDesc": "ডকার লগের মাধ্যমে কোড রিসেট করুন", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "সেশন টাইমআউট", - "hours": "ঘন্টা", + "hours": "hours", "sessionTimeoutRange": "সর্বনিম্ন ১ ঘণ্টা · সর্বোচ্চ ৭২০ ঘণ্টা", - "monitoringDefaults": "ডিফল্ট নিরীক্ষণ", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "অবস্থা যাচাই", - "metrics": "মেট্রিক্স", + "metrics": "Metrics", "sec": "সেকেন্ড", "logLevel": "লগ স্তর", "enableGuacamole": "গুয়াকামোল সক্রিয় করুন", "enableGuacamoleDesc": "RDP/VNC রিমোট ডেস্কটপ", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "SSO-এর জন্য OpenID Connect কনফিগার করুন। * চিহ্নিত ফিল্ডগুলো পূরণ করা আবশ্যক।", - "oidcClientId": "ক্লায়েন্ট আইডি", - "oidcClientSecret": "ক্লায়েন্ট গোপনীয়", - "oidcAuthUrl": "অনুমোদন ইউআরএল", - "oidcIssuerUrl": "ইস্যুকারী ইউআরএল", - "oidcTokenUrl": "টোকেন ইউআরএল", - "oidcUserIdentifier": "ব্যবহারকারী শনাক্তকারী পথ", - "oidcDisplayName": "ডিসপ্লে নেম পাথ", - "oidcScopes": "স্কোপ", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "ব্যবহারকারীর তথ্য ইউআরএল ওভাররাইড করুন", - "oidcAllowedUsers": "অনুমোদিত ব্যবহারকারী", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "প্রতি লাইনে একটি ইমেল। সবগুলো দেখানোর জন্য খালি রাখুন।", - "removeOidc": "অপসারণ করুন", - "usersCount": "{{count}} ব্যবহারকারীরা", - "createUser": "তৈরি করুন", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "নতুন ভূমিকা", - "roleName": "নাম", - "roleDisplayName": "প্রদর্শনের নাম", - "roleDescription": "বর্ণনা", - "rolesCount": "{{count}} ভূমিকা", - "createRole": "তৈরি করুন", - "creating": "তৈরি করা হচ্ছে...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "ডেটাবেস রপ্তানি করুন", "exportDatabaseDesc": "সমস্ত হোস্ট, ক্রেডেনশিয়াল এবং সেটিংসের একটি ব্যাকআপ ডাউনলোড করুন।", - "export": "রপ্তানি", - "exporting": "রপ্তানি করা হচ্ছে...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "ডেটাবেস আমদানি করুন", "importDatabaseDesc": "একটি .sqlite ব্যাকআপ ফাইল থেকে পুনরুদ্ধার করুন", - "importDatabaseSelected": "নির্বাচিত: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "ফাইল নির্বাচন করুন", - "changeFile": "পরিবর্তন", - "import": "আমদানি", - "importing": "আমদানি করা হচ্ছে...", - "apiKeysCount": "{{count}} কী", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "নতুন এপিআই কী", "apiKeyCreatedWarning": "কী তৈরি হয়েছে - এখনই এটি কপি করুন, এটি আর দেখানো হবে না।", - "apiKeyName": "নাম", - "apiKeyUser": "ব্যবহারকারী", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "একজন ব্যবহারকারী নির্বাচন করুন...", - "apiKeyExpiresAt": "মেয়াদ শেষ হবে", + "apiKeyExpiresAt": "Expires At", "createKey": "চাবি তৈরি করুন", "apiKeyNoExpiry": "কোনো মেয়াদ নেই", "revokedBadge": "বাতিল করা হয়েছে", - "authTypeDual": "দ্বৈত প্রমাণীকরণ", - "authTypeOidc": "ওআইডিসি", - "authTypeLocal": "স্থানীয়", - "adminStatusAdministrator": "প্রশাসক", - "adminStatusRegularUser": "নিয়মিত ব্যবহারকারী", + "authTypeDual": "Dual Auth", + "authTypeOidc": "OIDC", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "অ্যাডমিন", "systemBadge": "সিস্টেম", "customBadge": "কাস্টম", "youBadge": "তুমি", - "sessionsActive": "{{count}} সক্রিয়", - "sessionActive": "সক্রিয়: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "সব", "revokeAllSessionsSuccess": "ব্যবহারকারীর সমস্ত সেশন বাতিল করা হয়েছে", - "revokeAllSessionsFailed": "সেশন বাতিল করতে ব্যর্থ হয়েছে", - "revokeSessionFailed": "সেশন বাতিল করতে ব্যর্থ হয়েছে", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "ভূমিকা যোগ করুন", "noCustomRoles": "কোনো কাস্টম ভূমিকা সংজ্ঞায়িত করা হয়নি", - "removeRoleFailed": "ভূমিকা অপসারণ করতে ব্যর্থ হয়েছে", - "assignRoleFailed": "ভূমিকা নির্ধারণ করতে ব্যর্থ হয়েছে", - "deleteRoleFailed": "ভূমিকা মুছে ফেলতে ব্যর্থ হয়েছে", - "userAdminAccess": "প্রশাসক", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "সমস্ত অ্যাডমিন সেটিংসে সম্পূর্ণ অ্যাক্সেস", - "userRoles": "ভূমিকা", - "revokeAllUserSessions": "সমস্ত সেশন বাতিল করুন", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "সমস্ত ডিভাইসে পুনরায় লগইন করতে বাধ্য করুন", - "revoke": "বাতিল করুন", + "revoke": "Revoke", "deleteUserWarning": "এই ব্যবহারকারীকে মুছে ফেলা স্থায়ী।", - "deleteUser": "মুছে ফেলুন {{username}}", - "deleting": "মুছে ফেলা হচ্ছে...", - "deleteUserFailed": "ব্যবহারকারীকে মুছে ফেলতে ব্যর্থ হয়েছে", - "deleteUserSuccess": "ব্যবহারকারী \"{{username}}\" মুছে ফেলা হয়েছে", - "deleteRoleSuccess": "ভূমিকা \"{{name}}\" মুছে ফেলা হয়েছে", - "revokeKeySuccess": "কী \"{{name}}\" বাতিল করা হয়েছে", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "কী প্রত্যাহার করতে ব্যর্থ হয়েছে", - "copiedToClipboard": "ক্লিপবোর্ডে কপি করা হয়েছে", + "copiedToClipboard": "Copied to clipboard", "done": "সম্পন্ন হয়েছে", - "createUserTitle": "ব্যবহারকারী তৈরি করুন", + "createUserTitle": "Create User", "createUserDesc": "একটি নতুন স্থানীয় অ্যাকাউন্ট তৈরি করুন।", - "createUserUsername": "ব্যবহারকারীর নাম", - "createUserPassword": "পাসওয়ার্ড", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "সর্বনিম্ন ৬টি অক্ষর।", - "createUserEnterUsername": "ব্যবহারকারীর নাম লিখুন", - "createUserEnterPassword": "পাসওয়ার্ড লিখুন", - "createUserSubmit": "ব্যবহারকারী তৈরি করুন", - "editUserTitle": "ব্যবহারকারী পরিচালনা করুন: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "ভূমিকা, অ্যাডমিন স্ট্যাটাস, সেশন এবং অ্যাকাউন্ট সেটিংস সম্পাদনা করুন।", - "editUserUsername": "ব্যবহারকারীর নাম", + "editUserUsername": "Username", "editUserAuthType": "প্রমাণীকরণ প্রকার", - "editUserAdminStatus": "প্রশাসক অবস্থা", - "editUserUserId": "ব্যবহারকারীর আইডি", - "linkAccountTitle": "OIDC-কে পাসওয়ার্ড অ্যাকাউন্টের সাথে লিঙ্ক করুন", - "linkAccountDesc": "OIDC অ্যাকাউন্ট {{username}} -কে একটি বিদ্যমান স্থানীয় অ্যাকাউন্টের সাথে একীভূত করুন।", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "এর ফলে:", "linkAccountEffect1": "শুধুমাত্র OIDC-এর জন্য নির্ধারিত অ্যাকাউন্টটি মুছে ফেলুন", "linkAccountEffect2": "টার্গেট অ্যাকাউন্টে OIDC লগইন যোগ করুন", "linkAccountEffect3": "OIDC এবং পাসওয়ার্ড উভয় লগইনের অনুমতি দিন", - "linkAccountTargetUsername": "লক্ষ্য ব্যবহারকারীর নাম", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "লিঙ্ক করার জন্য স্থানীয় অ্যাকাউন্টের ইউজারনেম লিখুন", - "linkAccounts": "অ্যাকাউন্ট লিঙ্ক করুন", - "linkAccountSuccess": "OIDC অ্যাকাউন্ট \"{{username}} \" এর সাথে সংযুক্ত", - "linkAccountFailed": "OIDC অ্যাকাউন্ট লিঙ্ক করতে ব্যর্থ হয়েছে", - "linkAccountInProgress": "সংযোগ স্থাপন...", - "saving": "সঞ্চয়...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "নিবন্ধন সেটিং আপডেট করতে ব্যর্থ হয়েছে", "updatePasswordLoginFailed": "পাসওয়ার্ড লগইন সেটিং আপডেট করতে ব্যর্থ হয়েছে", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "OIDC অটো-প্রভিশন সেটিং আপডেট করতে ব্যর্থ হয়েছে", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "পাসওয়ার্ড রিসেট সেটিং আপডেট করতে ব্যর্থ হয়েছে", "sessionTimeoutRange2": "সেশন টাইমআউট অবশ্যই ১ থেকে ৭২০ ঘণ্টার মধ্যে হতে হবে।", "sessionTimeoutSaved": "সেশন টাইমআউট সংরক্ষিত হয়েছে", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "অবৈধ ব্যবধান মান", "monitoringSaved": "পর্যবেক্ষণ সেটিংস সংরক্ষিত হয়েছে", "monitoringSaveFailed": "মনিটরিং সেটিংস সংরক্ষণ করতে ব্যর্থ হয়েছে", - "guacamoleSaved": "গুয়াকামোল সেটিংস সংরক্ষিত হয়েছে", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "গুয়াকামোল সেটিংস সংরক্ষণ করা যায়নি", "guacamoleUpdateFailed": "গুয়াকামোল সেটিং আপডেট করতে ব্যর্থ হয়েছে", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "লগ স্তর আপডেট করতে ব্যর্থ হয়েছে", "oidcSaved": "OIDC কনফিগারেশন সংরক্ষিত হয়েছে", "oidcSaveFailed": "OIDC কনফিগারেশন সংরক্ষণ করতে ব্যর্থ হয়েছে", "oidcRemoved": "OIDC কনফিগারেশন সরানো হয়েছে", "oidcRemoveFailed": "OIDC কনফিগারেশন অপসারণ করতে ব্যর্থ হয়েছে", "createUserRequired": "ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রয়োজন", - "createUserPasswordTooShort": "পাসওয়ার্ডটি কমপক্ষে ৬ অক্ষরের হতে হবে।", - "createUserSuccess": "ব্যবহারকারী \"{{username}}\" তৈরি করেছেন", - "createUserFailed": "ব্যবহারকারী তৈরি করতে ব্যর্থ হয়েছে", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "অ্যাডমিন স্ট্যাটাস আপডেট করতে ব্যর্থ হয়েছে", "allSessionsRevoked": "সকল অধিবেশন বাতিল করা হয়েছে", - "revokeSessionsFailed": "সেশন বাতিল করতে ব্যর্থ হয়েছে", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "নাম এবং প্রদর্শিত নাম আবশ্যক", - "createRoleSuccess": "ভূমিকা \"{{name}}\" তৈরি করা হয়েছে", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "ভূমিকা তৈরি করতে ব্যর্থ হয়েছে", "apiKeyNameRequired": "কী-এর নাম আবশ্যক।", "apiKeyUserRequired": "ব্যবহারকারী আইডি প্রয়োজন", - "apiKeyCreatedSuccess": "এপিআই কী \"{{name}}\" তৈরি করা হয়েছে", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "এপিআই কী তৈরি করতে ব্যর্থ হয়েছে", "exportSuccess": "ডাটাবেস সফলভাবে রপ্তানি করা হয়েছে", "exportFailed": "ডাটাবেস রপ্তানি ব্যর্থ হয়েছে", "importSelectFile": "অনুগ্রহ করে প্রথমে একটি ফাইল নির্বাচন করুন।", - "importCompleted": "আমদানি সম্পন্ন হয়েছে: {{total}} টি আইটেম আমদানি করা হয়েছে, {{skipped}} টি বাদ দেওয়া হয়েছে", - "importFailed": "আমদানি ব্যর্থ হয়েছে: {{error}}", - "importError": "ডাটাবেস আমদানি ব্যর্থ হয়েছে" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "ডাটাবেস আমদানি ব্যর্থ হয়েছে", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "হোস্ট", - "hostPlaceholder": "192.168.1.1 অথবা example.com", - "portLabel": "বন্দর", - "portPlaceholder": "২২", - "usernameLabel": "ব্যবহারকারীর নাম", - "usernamePlaceholder": "ব্যবহারকারীর নাম", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", + "portPlaceholder": "22", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "প্রমাণীকরণ", - "passwordLabel": "পাসওয়ার্ড", - "passwordPlaceholder": "পাসওয়ার্ড", - "privateKeyLabel": "ব্যক্তিগত চাবি", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "প্রাইভেট কী পেস্ট করুন...", - "credentialLabel": "শংসাপত্র", + "credentialLabel": "Credential", "credentialPlaceholder": "একটি সংরক্ষিত পরিচয়পত্র নির্বাচন করুন", - "connectToTerminal": "টার্মিনালের সাথে সংযোগ করুন", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "ফাইলগুলির সাথে সংযোগ করুন" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "সব পরিষ্কার করুন", "noHistoryEntries": "ইতিহাসের কোন এন্ট্রি নেই", "trackingDisabled": "ইতিহাস ট্র্যাকিং নিষ্ক্রিয় করা হয়েছে", - "trackingDisabledHint": "কমান্ড রেকর্ড করতে আপনার প্রোফাইল সেটিংসে এটি চালু করুন।" + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "মূল রেকর্ডিং", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "টার্মিনালে রেকর্ড", "selectAll": "সব", - "selectNone": "কোনোটিই না", + "selectNone": "None", "noTerminalTabsOpen": "কোন টার্মিনাল ট্যাব খোলা নেই", "selectTerminalsAbove": "উপরের টার্মিনালগুলি নির্বাচন করুন", "broadcastInputPlaceholder": "কীস্ট্রোক সম্প্রচার করতে এখানে টাইপ করুন...", "stopRecording": "রেকর্ডিং বন্ধ করুন", "startRecording": "রেকর্ডিং শুরু করুন", - "settingsTitle": "সেটিংস", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "ডান-ক্লিক কপি/পেস্ট সক্ষম করুন" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "ট্যাবগুলিকে উপরের প্যানে টেনে আনুন, অথবা কুইক অ্যাসাইন ব্যবহার করুন।", "dropHere": "এখানে নেমে যান", "emptyPane": "খালি", - "dashboard": "ড্যাশবোর্ড", + "dashboard": "Dashboard", "clearSplitScreen": "ক্লিয়ার স্প্লিট স্ক্রিন", "quickAssign": "দ্রুত বরাদ্দ করুন", - "alreadyAssigned": "প্যান {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "স্প্লিট ট্যাব", "addToSplit": "স্প্লিটে যোগ করুন", "removeFromSplit": "স্প্লিট থেকে সরান", - "assignToPane": "প্যানে বরাদ্দ করুন" + "assignToPane": "প্যানে বরাদ্দ করুন", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "স্নিপেট তৈরি করুন", - "createSnippetDescription": "দ্রুত কার্যকর করার জন্য একটি নতুন কমান্ড স্নিপেট তৈরি করুন", - "nameLabel": "নাম", - "namePlaceholder": "যেমন, Nginx রিস্টার্ট করুন", - "descriptionLabel": "বর্ণনা", - "descriptionPlaceholder": "ঐচ্ছিক বিবরণ", - "optional": "ঐচ্ছিক", - "folderLabel": "ফোল্ডার", - "noFolder": "কোন ফোল্ডার নেই (শ্রেণীবিহীন)", - "commandLabel": "আদেশ", - "commandPlaceholder": "যেমন, sudo systemctl restart nginx", - "cancel": "বাতিল করুন", - "createSnippetButton": "স্নিপেট তৈরি করুন", - "createFolderTitle": "ফোল্ডার তৈরি করুন", - "createFolderDescription": "আপনার স্নিপেটগুলো ফোল্ডারে সাজিয়ে নিন।", - "folderNameLabel": "ফোল্ডারের নাম", - "folderNamePlaceholder": "যেমন, সিস্টেম কমান্ড, ডকার স্ক্রিপ্ট", - "folderColorLabel": "ফোল্ডারের রঙ", - "folderIconLabel": "ফোল্ডার আইকন", - "previewLabel": "প্রিভিউ", - "folderNameFallback": "ফোল্ডারের নাম", - "createFolderButton": "ফোল্ডার তৈরি করুন", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "টার্গেট টার্মিনাল", "selectAll": "সব", - "selectNone": "কোনোটিই না", + "selectNone": "None", "noTerminalTabsOpen": "কোন টার্মিনাল ট্যাব খোলা নেই", - "searchPlaceholder": "অনুসন্ধানের অংশবিশেষ...", - "newSnippet": "নতুন স্নিপেট", - "newFolder": "নতুন ফোল্ডার", - "run": "দৌড়", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "এই ফোল্ডারে কোনো স্নিপেট নেই", - "uncategorized": "অশ্রেণীবদ্ধ", - "editSnippetTitle": "সম্পাদনা স্নিপেট", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "এই কমান্ড স্নিপেটটি আপডেট করুন", "saveSnippetButton": "পরিবর্তনগুলি সংরক্ষণ করুন", - "createSuccess": "স্নিপেট সফলভাবে তৈরি করা হয়েছে", - "createFailed": "স্নিপেট তৈরি করতে ব্যর্থ হয়েছে", - "updateSuccess": "স্নিপেট সফলভাবে আপডেট করা হয়েছে", - "updateFailed": "স্নিপেট আপডেট করতে ব্যর্থ হয়েছে", - "deleteFailed": "স্নিপেট মুছে ফেলা ব্যর্থ হয়েছে", - "folderCreateSuccess": "ফোল্ডারটি সফলভাবে তৈরি করা হয়েছে।", - "folderCreateFailed": "ফোল্ডার তৈরি করতে ব্যর্থ হয়েছে", - "editFolderTitle": "ফোল্ডার সম্পাদনা করুন", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "এই ফোল্ডারটির নাম পরিবর্তন করুন বা এর চেহারা বদলে দিন।", "saveFolderButton": "পরিবর্তনগুলি সংরক্ষণ করুন", "editFolder": "ফোল্ডার সম্পাদনা করুন", "deleteFolder": "ফোল্ডারটি মুছে ফেলুন", - "folderDeleteSuccess": "ফোল্ডার \"{{name}}\" মুছে ফেলা হয়েছে", - "folderDeleteFailed": "ফোল্ডারটি মুছে ফেলা ব্যর্থ হয়েছে", - "folderEditSuccess": "ফোল্ডারটি সফলভাবে আপডেট করা হয়েছে", - "folderEditFailed": "ফোল্ডার আপডেট করতে ব্যর্থ হয়েছে", - "confirmRunMessage": "\"{{name}} \" চালান?", - "confirmRunButton": "দৌড়", - "runSuccess": "{{count}} টার্মিনালে \"{{name}}\" চালানো হয়েছে", - "copySuccess": "\"{{name}}\" ক্লিপবোর্ডে কপি করা হয়েছে", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "স্নিপেট শেয়ার করুন", - "shareUser": "ব্যবহারকারী", - "shareRole": "ভূমিকা", + "shareUser": "User", + "shareRole": "Role", "selectUser": "একজন ব্যবহারকারী নির্বাচন করুন...", "selectRole": "একটি ভূমিকা নির্বাচন করুন...", "shareSuccess": "স্নিপেট সফলভাবে শেয়ার করা হয়েছে", "shareFailed": "স্নিপেট শেয়ার করতে ব্যর্থ হয়েছে", "revokeSuccess": "প্রবেশাধিকার বাতিল করা হয়েছে", - "revokeFailed": "অ্যাক্সেস প্রত্যাহার করতে ব্যর্থ হয়েছে", - "currentAccess": "বর্তমান অ্যাক্সেস", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "শেয়ার ডেটা লোড করতে ব্যর্থ হয়েছে", - "loading": "লোড হচ্ছে...", - "close": "বন্ধ করুন", - "reorderFailed": "স্নিপেটের ক্রম সংরক্ষণ করতে ব্যর্থ হয়েছে" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "স্নিপেটের ক্রম সংরক্ষণ করতে ব্যর্থ হয়েছে", + "importExport": "আমদানি / রপ্তানি", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "কোন হোস্ট কনফিগার করা নেই", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "অ্যাকাউন্ট", - "sectionAppearance": "চেহারা", - "sectionSecurity": "নিরাপত্তা", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "এপিআই কী", "sectionC2sTunnels": "সি২এস টানেল", - "usernameLabel": "ব্যবহারকারীর নাম", - "roleLabel": "ভূমিকা", - "roleAdministrator": "প্রশাসক", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "প্রমাণীকরণ পদ্ধতি", - "authMethodLocal": "স্থানীয়", + "authMethodLocal": "Local", "twoFaLabel": "২এফএ", "twoFaOn": "চালু", "twoFaOff": "বন্ধ", - "versionLabel": "সংস্করণ", - "deleteAccount": "অ্যাকাউন্ট মুছে ফেলুন", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "আপনার অ্যাকাউন্ট স্থায়ীভাবে মুছে ফেলুন", - "deleteButton": "মুছে ফেলুন", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "এই পদক্ষেপটি স্থায়ী এবং এটি পূর্বাবস্থায় ফেরানো যাবে না।", "deleteAccountWarning": "সমস্ত সেশন, হোস্ট, ক্রেডেনশিয়াল এবং সেটিংস স্থায়ীভাবে মুছে ফেলা হবে।", - "confirmPasswordDeletePlaceholder": "নিশ্চিত করতে আপনার পাসওয়ার্ড লিখুন", - "languageLabel": "ভাষা", - "themeLabel": "থিম", - "fontSizeLabel": "ফন্ট সাইজ", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "অ্যাকসেন্ট রঙ", - "settingsTerminal": "টার্মিনাল", - "commandAutocomplete": "কমান্ড অটোকমপ্লিট", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "টাইপ করার সময় স্বয়ংক্রিয় সম্পূর্ণতা দেখান", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "ইতিহাস ট্র্যাকিং", "historyTrackingDesc": "টার্মিনাল কমান্ড ট্র্যাক করুন", - "syntaxHighlighting": "সিনট্যাক্স হাইলাইটিং", - "syntaxHighlightingDesc": "টার্মিনাল আউটপুট হাইলাইট করুন", "commandPalette": "কমান্ড প্যালেট", "commandPaletteDesc": "কিবোর্ড শর্টকাট সক্রিয় করুন", "reopenTabsOnLogin": "লগইন করার সময় ট্যাবগুলি পুনরায় খুলুন", "reopenTabsOnLoginDesc": "লগ ইন করলে বা পৃষ্ঠা রিফ্রেশ করলে, এমনকি অন্য ডিভাইস থেকেও আপনার খোলা ট্যাবগুলি পুনরুদ্ধার করুন।", "confirmTabClose": "ট্যাব বন্ধ নিশ্চিত করুন", "confirmTabCloseDesc": "টার্মিনাল ট্যাব বন্ধ করার আগে জিজ্ঞাসা করুন।", - "settingsSidebar": "সাইডবার", - "showHostTags": "হোস্ট ট্যাগগুলি দেখান", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "হোস্ট তালিকায় ট্যাগগুলি প্রদর্শন করুন", "hostTrayOnClick": "হোস্ট অ্যাকশনগুলি প্রসারিত করতে ক্লিক করুন", "hostTrayOnClickDesc": "সর্বদা সংযোগ বাটনগুলো দেখান; ম্যানেজমেন্ট অপশনগুলো প্রসারিত করতে হোভার করার পরিবর্তে ক্লিক করুন।", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "পিন অ্যাপ রেল", "pinAppRailDesc": "হোভার করার সময় প্রসারিত না হয়ে, বাম সাইডবারের অ্যাপ রেলটিকে সর্বদা প্রসারিত রাখুন।", - "settingsSnippets": "খণ্ডাংশ", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "ফোল্ডারগুলো ভেঙে গেছে", "foldersCollapsedDesc": "ডিফল্টরূপে ফোল্ডারগুলি সংকুচিত করুন", "confirmExecution": "কার্যকর করা নিশ্চিত করুন", "confirmExecutionDesc": "স্নিপেট চালানোর আগে নিশ্চিত করুন।", - "settingsUpdates": "আপডেট", + "settingsUpdates": "Updates", "disableUpdateChecks": "আপডেট চেক নিষ্ক্রিয় করুন", "disableUpdateChecksDesc": "আপডেট চেক করা বন্ধ করুন", "totpAuthenticator": "TOTP প্রমাণীকরণকারী", @@ -2109,68 +2612,68 @@ "qrCode": "কিউআর কোড", "totpInstructions": "আপনার অথেন্টিকেটর অ্যাপে কিউআর কোড স্ক্যান করুন অথবা সিক্রেটটি প্রবেশ করান, তারপর ৬-সংখ্যার কোডটি লিখুন।", "totpCodePlaceholder": "000000", - "verify": "যাচাই করুন", - "changePassword": "পাসওয়ার্ড পরিবর্তন করুন", - "currentPasswordLabel": "বর্তমান পাসওয়ার্ড", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "বর্তমান পাসওয়ার্ড", - "newPasswordLabel": "নতুন পাসওয়ার্ড", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "নতুন পাসওয়ার্ড", "confirmPasswordLabel": "নতুন পাসওয়ার্ড নিশ্চিত করুন", "confirmPasswordPlaceholder": "নতুন পাসওয়ার্ড নিশ্চিত করুন", "updatePassword": "পাসওয়ার্ড আপডেট করুন", "createApiKeyTitle": "এপিআই কী তৈরি করুন", "createApiKeyDescription": "প্রোগ্রাম্যাটিক অ্যাক্সেসের জন্য একটি নতুন এপিআই কী তৈরি করুন।", - "apiKeyNameLabel": "নাম", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "যেমন সিআই পাইপলাইন", "expiryDateLabel": "মেয়াদ শেষ হওয়ার তারিখ", "optional": "ঐচ্ছিক", - "cancel": "বাতিল করুন", + "cancel": "Cancel", "createKey": "চাবি তৈরি করুন", - "apiKeyCount": "{{count}} কী", + "apiKeyCount": "{{count}} keys", "newKey": "নতুন চাবি", "noApiKeys": "এখনো কোনো এপিআই কী নেই।", - "apiKeyActive": "সক্রিয়", + "apiKeyActive": "Active", "apiKeyUsageHint": "আপনার চাবিটি অন্তর্ভুক্ত করুন", "apiKeyUsageHintHeader": "হেডার।", "apiKeyPermissionsHint": "কী-গুলো সৃষ্টিকারী ব্যবহারকারীর অনুমতি উত্তরাধিকারসূত্রে লাভ করে।", - "roleUser": "ব্যবহারকারী", - "authMethodDual": "দ্বৈত প্রমাণীকরণ", - "authMethodOidc": "ওআইডিসি", - "totpSetupFailed": "TOTP সেটআপ শুরু করতে ব্যর্থ হয়েছে", + "roleUser": "User", + "authMethodDual": "Dual Auth", + "authMethodOidc": "OIDC", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "একটি ৬-সংখ্যার কোড প্রবেশ করান", "totpEnabledSuccess": "দ্বি-স্তর প্রমাণীকরণ সক্রিয় করা হয়েছে", "totpInvalidCode": "কোডটি ভুল, অনুগ্রহ করে আবার চেষ্টা করুন।", "totpDisableInputRequired": "আপনার TOTP কোড বা পাসওয়ার্ড লিখুন", - "totpDisabledSuccess": "দ্বি-স্তর প্রমাণীকরণ নিষ্ক্রিয় করা হয়েছে", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "2FA নিষ্ক্রিয় করতে ব্যর্থ হয়েছে", - "totpDisableTitle": "2FA নিষ্ক্রিয় করুন", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "TOTP কোড বা পাসওয়ার্ড প্রবেশ করান", - "totpDisableConfirm": "2FA নিষ্ক্রিয় করুন", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "যাচাই চালিয়ে যান", - "totpVerifyTitle": "কোড যাচাই করুন", - "totpBackupTitle": "ব্যাকআপ কোড", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "ব্যাকআপ কোড ডাউনলোড করুন", "done": "সম্পন্ন হয়েছে", "secretCopied": "গোপনীয় তথ্য ক্লিপবোর্ডে কপি করা হয়েছে", "apiKeyNameRequired": "কী-এর নাম আবশ্যক।", - "apiKeyCreated": "এপিআই কী \"{{name}}\" তৈরি করা হয়েছে", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "এপিআই কী তৈরি করতে ব্যর্থ হয়েছে", - "apiKeyUser": "ব্যবহারকারী", - "apiKeyExpires": "মেয়াদ শেষ", - "apiKeyRevoked": "এপিআই কী \"{{name}}\" বাতিল করা হয়েছে", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "এপিআই কী প্রত্যাহার করতে ব্যর্থ হয়েছে", "passwordFieldsRequired": "বর্তমান এবং নতুন পাসওয়ার্ড প্রয়োজন।", - "passwordMismatch": "পাসওয়ার্ডগুলো মিলছে না।", - "passwordTooShort": "পাসওয়ার্ডটি কমপক্ষে ৬ অক্ষরের হতে হবে।", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "পাসওয়ার্ড সফলভাবে আপডেট করা হয়েছে", "passwordUpdateFailed": "পাসওয়ার্ড আপডেট করতে ব্যর্থ হয়েছে", "deletePasswordRequired": "আপনার অ্যাকাউন্ট মুছে ফেলার জন্য পাসওয়ার্ড প্রয়োজন।", - "deleteFailed": "অ্যাকাউন্ট মুছে ফেলতে ব্যর্থ হয়েছে", - "deleting": "মুছে ফেলা হচ্ছে...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "রঙ বাছাইকারী খুলুন", - "themeSystem": "সিস্টেম", - "themeLight": "আলো", - "themeDark": "অন্ধকার", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "ড্রাকুলা", "themeCatppuccin": "ক্যাটপুচিন", "themeNord": "নর্ড", @@ -2180,5 +2683,105 @@ "themeGruvbox": "গ্রুভবক্স" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "এইমাত্র", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "ট্যাব", + "backTab": "⇥", + "arrowUp": "তীর ঊর্ধ্বমুখী", + "arrowDown": "অ্যারো ডাউন", + "arrowLeft": "বাম তীর", + "arrowRight": "ডান তীরচিহ্ন", + "home": "Home", + "end": "শেষ", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "সম্পন্ন হয়েছে" } } diff --git a/src/ui/locales/translated/ca_ES.json b/src/ui/locales/translated/ca_ES.json index 82d6878c..acc2ef80 100644 --- a/src/ui/locales/translated/ca_ES.json +++ b/src/ui/locales/translated/ca_ES.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Carpetes", - "folder": "Carpeta", - "password": "Contrasenya", - "key": "Clau", - "sshPrivateKey": "Clau privada SSH", - "upload": "Pujada", - "keyPassword": "Contrasenya clau", - "sshKey": "Clau SSH", - "uploadPrivateKeyFile": "Puja el fitxer de clau privada", - "searchCredentials": "Cerca credencials...", - "addCredential": "Afegeix credencials", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "Certificat CA (-cert.pub)", "caCertificateDescription": "Opcional: Puja o enganxa el fitxer de certificat signat per l'autoritat de certificació (per exemple, id_ed25519-cert.pub). Obligatori quan el servidor SSH utilitza l'autorització basada en certificats.", "uploadCertFile": "Puja el fitxer -cert.pub", - "clearCert": "Clar", + "clearCert": "Clear", "certLoaded": "Certificat carregat", "certPublicKeyLabel": "Certificat de CA", "certTypeLabel": "Tipus de certificat", "pasteOrUploadCert": "Enganxa o puja un certificat -cert.pub...", "hasCaCert": "Té un certificat de CA", - "noCaCert": "Sense certificat de CA" + "noCaCert": "Sense certificat de CA", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Ordre per defecte", + "sortNameAsc": "Nom (A → Z)", + "sortNameDesc": "Nom (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Esborra els filtres", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "No s'han pogut carregar les alertes", - "failedToDismissAlert": "No s'ha pogut ignorar l'alerta" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Configuració del servidor", - "description": "Configureu l'URL del servidor Termix per connectar-vos als vostres serveis de backend", - "serverUrl": "URL del servidor", - "enterServerUrl": "Si us plau, introduïu una URL de servidor", - "saveFailed": "No s'ha pogut desar la configuració", - "saveError": "S'ha produït un error en desar la configuració", - "saving": "Desant...", - "saveConfig": "Desa la configuració", - "helpText": "Introduïu l'URL on s'executa el vostre servidor Termix (per exemple, http://localhost:30001 o https://el-vostre-servidor.com)", - "changeServer": "Canviar servidor", - "mustIncludeProtocol": "L'URL del servidor ha de començar per http:// o https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Permetre certificat no vàlid", "allowInvalidCertificateDesc": "Utilitzeu-ho només per a servidors autoallotjats de confiança amb certificats autosignats o d'adreça IP.", - "useEmbedded": "Utilitza el servidor local", - "embeddedDesc": "Executeu Termix amb el servidor local integrat (no cal cap servidor remot)", - "embeddedConnecting": "Connectant al servidor local...", - "embeddedNotReady": "El servidor local encara no està a punt. Espereu un moment i torneu-ho a intentar.", - "localServer": "Servidor local" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Servidor local", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Error de comprovació de versió", - "checkFailed": "No s'ha pogut comprovar si hi ha actualitzacions", - "upToDate": "L'aplicació està actualitzada", - "currentVersion": "Esteu executant la versió {{version}}", - "updateAvailable": "Actualització disponible", - "newVersionAvailable": "Hi ha una nova versió disponible! Esteu executant {{current}}, però {{latest}} està disponible.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Versió beta", - "betaVersionDesc": "Esteu executant {{current}}, que és més recent que l'última versió estable {{latest}}.", - "releasedOn": "Publicat el {{date}}", - "downloadUpdate": "Descarrega l'actualització", - "checking": "S'estan buscant actualitzacions...", - "checkUpdates": "Comprova si hi ha actualitzacions", - "checkingUpdates": "S'estan buscant actualitzacions...", - "updateRequired": "Actualització necessària" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Tanca", - "minimize": "Minimitzar", - "online": "En línia", - "offline": "Fora de línia", - "continue": "Continua", - "maintenance": "Manteniment", - "degraded": "Degradat", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", "error": "Error", - "warning": "Avís", - "unsavedChanges": "Canvis no desats", - "dismiss": "Ignora", - "loading": "S'està carregant...", - "optional": "Opcional", - "connect": "Connecta", - "copied": "Copiat", - "connecting": "Connectant...", - "updateAvailable": "Actualització disponible", - "appName": "Tèrmix", - "openInNewTab": "Obre en una pestanya nova", - "noReleases": "Sense llançaments", - "updatesAndReleases": "Actualitzacions i llançaments", - "newVersionAvailable": "Hi ha disponible una nova versió ({{version}}).", - "failedToFetchUpdateInfo": "No s'ha pogut obtenir la informació d'actualització", - "preRelease": "Preestrena", - "noReleasesFound": "No s'han trobat llançaments.", - "cancel": "Cancel·la", - "username": "Nom d'usuari", - "login": "Inicia la sessió", - "register": "Registra't", - "password": "Contrasenya", - "confirmPassword": "Confirma la contrasenya", - "back": "Enrere", - "save": "Desa", - "saving": "Desant...", - "delete": "Suprimeix", - "rename": "Canvia el nom", - "edit": "Edita", - "add": "Afegeix", - "confirm": "Confirma", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", "no": "No", - "or": "O", - "next": "Següent", - "previous": "Anterior", - "refresh": "Actualitza", - "language": "Llengua", - "checking": "S'està comprovant...", - "checkingDatabase": "S'està comprovant la connexió a la base de dades...", - "checkingAuthentication": "S'està comprovant l'autenticació...", - "backendReconnected": "Connexió al servidor restaurada", - "connectionDegraded": "Connexió al servidor perduda, recuperació…", - "reload": "Torna a carregar", - "remove": "Elimina", - "create": "Crea", - "update": "Actualització", - "copy": "Còpia", - "copyFailed": "No s'ha pogut copiar al porta-retalls", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximitzar", "restore": "Restaurar", - "of": "de" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Inici", + "home": "Home", "terminal": "Terminal", "docker": "Docker", - "tunnels": "Túnels", - "fileManager": "Gestor de fitxers", - "serverStats": "Estadístiques del servidor", - "admin": "Administrador", - "userProfile": "Perfil d'usuari", - "splitScreen": "Pantalla dividida", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Voleu tancar aquesta sessió activa?", - "close": "Tanca", - "cancel": "Cancel·la", - "sshManager": "Gestor d'SSH", - "cannotSplitTab": "No es pot dividir aquesta pestanya", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Copia la contrasenya", - "copySudoPassword": "Copia la contrasenya de Sudo", - "passwordCopied": "La contrasenya s'ha copiat al porta-retalls", - "noPasswordAvailable": "No hi ha cap contrasenya disponible", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "No s'ha pogut copiar la contrasenya", "refreshTab": "Actualitza la connexió", - "openFileManager": "Obre el gestor de fitxers", - "dashboard": "Tauler de control", - "networkGraph": "Gràfic de xarxa", - "quickConnect": "Connexió ràpida", - "sshTools": "Eines SSH", - "history": "Història", - "hosts": "Amfitrions", - "snippets": "Fragments", - "hostManager": "Gestor d'amfitrions", - "credentials": "Credencials", - "connections": "Connexions", - "roleAdministrator": "Administrador/a", - "roleUser": "Usuari" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Amfitrions", - "noHosts": "Sense amfitrions SSH", - "retry": "Torna-ho a intentar", - "refresh": "Actualitza", - "optional": "Opcional", - "downloadSample": "Descarrega la mostra", - "failedToDeleteHost": "No s'ha pogut suprimir {{name}}", - "importSkipExisting": "Importa (omet els existents)", - "connectionDetails": "Detalls de la connexió", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Escriptori remot", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Nom d'usuari", - "folder": "Carpeta", - "tags": "Etiquetes", - "pin": "Fixar", - "addHost": "Afegeix amfitrió", - "editHost": "Edita l'amfitrió", - "cloneHost": "Host clonat", - "enableTerminal": "Habilita el terminal", - "enableTunnel": "Habilita el túnel", - "enableFileManager": "Habilita el gestor de fitxers", - "enableDocker": "Activa Docker", - "defaultPath": "Camí predeterminat", - "connection": "Connexió", - "upload": "Pujada", - "authentication": "Autenticació", - "password": "Contrasenya", - "key": "Clau", - "credential": "Credencial", - "none": "Cap", - "sshPrivateKey": "Clau privada SSH", - "keyType": "Tipus de clau", - "uploadFile": "Puja el fitxer", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Túnels", + "tabTunnels": "Tunnels", "tabDocker": "Docker", "tabFiles": "Fitxers", - "tabStats": "Estadístiques", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Compartir", - "tabAuthentication": "Autenticació", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", - "tunnel": "Túnel", - "fileManager": "Gestor de fitxers", - "serverStats": "Estadístiques del servidor", - "status": "Estat", - "folderRenamed": "La carpeta \"{{oldName}}\" s'ha canviat de nom a \"{{newName}}\" correctament", - "failedToRenameFolder": "No s'ha pogut canviar el nom de la carpeta", - "movedToFolder": "Mogut a \"{{folder}}\"", - "editHostTooltip": "Edita l'amfitrió", - "statusChecks": "Comprovacions d'estat", - "metricsCollection": "Col·lecció de mètriques", - "metricsInterval": "Interval de recopilació de mètriques", - "metricsIntervalDesc": "Amb quina freqüència s'han de recopilar estadístiques del servidor (5 segons - 1 hora)", - "behavior": "Comportament", - "themePreview": "Vista prèvia del tema", - "theme": "Tema", - "fontFamily": "Família tipogràfica", - "fontSize": "Mida de la lletra", - "letterSpacing": "Espaiat entre lletres", - "lineHeight": "Alçada de la línia", - "cursorStyle": "Estil del cursor", - "cursorBlink": "Parpelleig del cursor", - "scrollbackBuffer": "Buffer de desplaçament enrere", - "bellStyle": "Estil de campana", - "rightClickSelectsWord": "Clic dret Selecciona Word", - "fastScrollModifier": "Modificador de desplaçament ràpid", - "fastScrollSensitivity": "Sensibilitat de desplaçament ràpid", - "sshAgentForwarding": "Reenviament d'agents SSH", - "backspaceMode": "Mode de retrocés", - "startupSnippet": "Fragment d'inici", - "selectSnippet": "Selecciona un fragment", - "forceKeyboardInteractive": "Forçar la interacció del teclat", - "overrideCredentialUsername": "Substitueix les credencials i el nom d'usuari", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Feu servir el nom d'usuari especificat anteriorment en comptes del nom d'usuari de la credencial", - "jumpHostChain": "Cadena d'amfitrió de salt", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Cop de port", "addKnock": "Afegeix un port", "addProxyNode": "Afegeix un node", - "proxyNode": "Node intermediari", - "proxyType": "Tipus de proxy", - "quickActions": "Accions ràpides", - "sudoPasswordAutoFill": "Emplenament automàtic de contrasenya de Sudo", - "sudoPassword": "Contrasenya de Sudo", - "keepaliveInterval": "Interval de manteniment (ms)", - "moshCommand": "Comandament MOSH", - "environmentVariables": "Variables d'entorn", - "addVariable": "Afegeix una variable", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Copia l'URL del terminal", - "copyFileManagerUrl": "Copia l'URL del gestor de fitxers", - "copyRemoteDesktopUrl": "Copia l'URL de l'escriptori remot", - "failedToConnect": "No s'ha pogut connectar a la consola", - "connect": "Connecta", - "disconnect": "Desconnecta", - "start": "Inici", - "enableStatusCheck": "Activa la comprovació d'estat", - "enableMetrics": "Activa les mètriques", - "bulkUpdateFailed": "L'actualització massiva ha fallat", - "selectAll": "Selecciona-ho tot", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Desselecciona-ho tot", "protocols": "Protocols", "secureShell": "Shell segur", @@ -272,6 +303,9 @@ "unencryptedShell": "Shell sense xifrar", "addressIp": "Adreça / IP", "friendlyName": "Nom amigable", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Carpeta i avançat", "privateNotes": "Notes privades", "privateNotesPlaceholder": "Detalls sobre aquest servidor...", @@ -285,14 +319,14 @@ "delayAfterMs": "Retard després (ms)", "useSocks5Proxy": "Utilitza el servidor intermediari SOCKS5", "useSocks5ProxyDesc": "Enrutar la connexió a través d'un servidor proxy", - "proxyHost": "Amfitrió intermediari", - "proxyPort": "Port de proxy", - "proxyUsername": "Nom d'usuari del proxy", - "proxyPassword": "Contrasenya del servidor intermediari", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Proxy únic", - "proxyChainMode": "Cadena de proxy", + "proxyChainMode": "Proxy Chain", "you": "Tu", - "jumpHostChainLabel": "Cadena d'amfitrió de salt", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Afegeix un salt", "noJumpHosts": "No hi ha cap amfitrió de salt configurat.", "selectAServer": "Seleccioneu un servidor...", @@ -300,10 +334,10 @@ "authMethod": "Mètode d'autenticació", "storedCredential": "Credencial emmagatzemada", "selectACredential": "Selecciona una credencial...", - "keyTypeLabel": "Tipus de clau", - "keyTypeAuto": "Detecció automàtica", - "keyPasteTab": "Enganxa", - "keyUploadTab": "Pujada", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "S'ha carregat el fitxer clau", "keyUploadClick": "Feu clic per carregar .pem / .key / .ppk", "clearKey": "Tecla Esborra", @@ -311,59 +345,105 @@ "keyReplaceNotice": "enganxa una nova clau a continuació per substituir-la", "keyPassphraseSaved": "Contrasenya desada, escriu per canviar-la", "replaceKey": "Substitueix la clau", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Força el teclat interactiu", "forceKeyboardInteractiveShortDesc": "Força l'entrada manual de la contrasenya fins i tot si hi ha claus presents", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Aspecte del terminal", "colorTheme": "Tema de color", - "fontFamilyLabel": "Família tipogràfica", - "fontSizeLabel": "Mida de la lletra", - "cursorStyleLabel": "Estil del cursor", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Espaiat entre lletres (px)", - "lineHeightLabel": "Alçada de la línia", - "bellStyleLabel": "Estil de campana", - "backspaceModeLabel": "Mode de retrocés", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Cursor parpellejant", "cursorBlinkingDesc": "Habilita l'animació intermitent per al cursor del terminal", "rightClickSelectsWordLabel": "Feu clic amb el botó dret Selecciona Word", "rightClickSelectsWordShortDesc": "Seleccioneu la paraula sota el cursor en fer clic amb el botó dret", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Ressaltat de sintaxi", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Marques de temps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Comportament i avançat", - "scrollbackBufferLabel": "Buffer de desplaçament enrere", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Nombre màxim de línies que es conserven a l'historial", - "sshAgentForwardingLabel": "Reenviament d'agents SSH", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Passa les teves claus SSH locals a aquest amfitrió", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Activa l'Auto-Mosh", "enableAutoMoshDesc": "Prefereix Mosh a SSH si està disponible", "enableAutoTmux": "Activa la transmissió automàtica", "enableAutoTmuxDesc": "Inicia o connecta automàticament a la sessió de tmux", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Autoemplenament de contrasenya de Sudo", "sudoPasswordAutoFillShortDesc": "Proporciona automàticament la contrasenya sudo quan se li demani", - "sudoPasswordLabel": "Contrasenya de Sudo", - "environmentVariablesLabel": "Variables d'entorn", - "addVariableBtn": "Afegeix una variable", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "No hi ha cap variable d'entorn configurada.", - "fastScrollModifierLabel": "Modificador de desplaçament ràpid", - "fastScrollSensitivityLabel": "Sensibilitat de desplaçament ràpid", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Comandament Mosh", - "startupSnippetLabel": "Fragment d'inici", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Interval de manteniment (segons)", "maxKeepaliveMisses": "Màxims errors de manteniment en directe", "tunnelSettings": "Configuració del túnel", "enableTunneling": "Activa la tunelització", "enableTunnelingDesc": "Habilita la funcionalitat del túnel SSH per a aquest amfitrió", "serverTunnelsSection": "Túnels de servidor", - "addTunnelBtn": "Afegeix un túnel", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "No hi ha túnels configurats.", - "tunnelLabel": "Túnel {{number}}", - "tunnelType": "Tipus de túnel", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Reenvia un port local a un port del servidor remot (o a un host accessible des d'aquest).", "tunnelModeRemoteDesc": "Reenvia un port del servidor remot a un port local de la teva màquina.", "tunnelModeDynamicDesc": "Crea un proxy SOCKS5 en un port local per al reenviament dinàmic de ports.", "sameHost": "Aquest host (túnel directe)", "endpointHost": "Amfitrió de punt final", - "endpointPort": "Port de punt final", + "endpointPort": "Endpoint Port", "bindHost": "Vincula l'amfitrió", - "sourcePort": "Port d'origen", - "maxRetries": "Màxim d'intents", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Interval de reintent (s)", "autoStartLabel": "Inici automàtic", "autoStartDesc": "Connecta automàticament aquest túnel quan es carregui l'amfitrió", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "No s'ha pogut connectar", "failedToDisconnectTunnel": "No s'ha pogut desconnectar", "dockerIntegration": "Integració de Docker", - "enableDockerMonitor": "Activa Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Supervisar i gestionar els contenidors d'aquest amfitrió mitjançant Docker", - "enableFileManagerMonitor": "Habilita el gestor de fitxers", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Navega i gestiona fitxers en aquest amfitrió mitjançant SFTP", - "defaultPathLabel": "Camí predeterminat", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "El directori que s'obrirà quan s'iniciï el gestor de fitxers per a aquest amfitrió.", - "statusChecksLabel": "Comprovacions d'estat", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Activa les comprovacions d'estat", "enableStatusChecksDesc": "Fes ping periòdicament a aquest host per verificar la disponibilitat", "useGlobalInterval": "Utilitza l'interval global", "useGlobalIntervalDesc": "Substitueix amb l'interval de comprovació d'estat de tot el servidor", "checkIntervalS": "Interval (s) de comprovació", "checkIntervalDesc": "Segons entre cada ping de connectivitat", - "metricsCollectionLabel": "Col·lecció de mètriques", - "enableMetricsLabel": "Activa les mètriques", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Recopila l'ús de CPU, RAM, disc i xarxa d'aquest amfitrió", "useGlobalMetrics": "Utilitza l'interval global", "useGlobalMetricsDesc": "Substitueix amb l'interval de mètriques de tot el servidor", "metricsIntervalS": "Interval de mètriques (s)", "metricsIntervalDesc2": "Segons entre instantànies de mètriques", "visibleWidgets": "Widgets visibles", - "cpuUsageLabel": "Ús de la CPU", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "Percentatge de CPU, mitjanes de càrrega, gràfic miniàlgic", - "memoryLabel": "Ús de memòria", + "memoryLabel": "Memory Usage", "memoryDesc": "Ús de RAM, swap, memòria cau", - "storageLabel": "Ús del disc", + "storageLabel": "Disk Usage", "storageDesc": "Ús del disc per punt de muntatge", - "networkLabel": "Interfícies de xarxa", + "networkLabel": "Network Interfaces", "networkDesc": "Llista d'interfícies i amplada de banda", - "uptimeLabel": "Temps de funcionament", + "uptimeLabel": "Uptime", "uptimeDesc": "Temps de funcionament i temps d'arrencada del sistema", "systemInfoLabel": "Informació del sistema", "systemInfoDesc": "Sistema operatiu, nucli, nom d'amfitrió, arquitectura", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Esdeveniments d'inici de sessió correcte i fallit", "topProcessesLabel": "Processos principals", "topProcessesDesc": "PID, CPU%, MEM%, comanda", - "listeningPortsLabel": "Ports d'escolta", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Ports oberts amb procés i estat", - "firewallLabel": "Tallafocs", + "firewallLabel": "Firewall", "firewallDesc": "Estat del tallafocs, AppArmor i SELinux", - "quickActionsLabel": "Accions ràpides", - "quickActionsToolbar": "Les accions ràpides apareixen com a botons a la barra d'eines d'estadístiques del servidor per executar ordres amb un sol clic.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Encara no hi ha accions ràpides.", "buttonLabel": "Etiqueta del botó", "selectSnippetPlaceholder": "Selecciona un fragment...", "addActionBtn": "Afegeix una acció", "hostSharedSuccessfully": "L'amfitrió s'ha compartit correctament", - "failedToShareHost": "No s'ha pogut compartir l'amfitrió", + "failedToShareHost": "Failed to share host", "accessRevoked": "Accés revocat", - "failedToRevokeAccess": "No s'ha pogut revocar l'accés", - "cancelBtn": "Cancel·la", - "savingBtn": "Desant...", - "addHostBtn": "Afegeix amfitrió", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "L'amfitrió s'ha actualitzat", "hostCreated": "Amfitrió creat", "failedToSave": "No s'ha pogut desar l'amfitrió", "credentialUpdated": "Credencial actualitzada", "credentialCreated": "Credencial creada", - "failedToSaveCredential": "No s'ha pogut desar la credencial", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Torna a Amfitrions", "backToCredentials": "Torna a les credencials", - "pinned": "Fixat", - "noHostsFound": "No s'han trobat amfitrions", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Prova un terme diferent", "addFirstHost": "Afegeix el teu primer amfitrió per començar", "noCredentialsFound": "No s'han trobat credencials", - "addCredentialBtn": "Afegeix credencials", - "updateCredentialBtn": "Actualitza les credencials", - "features": "Característiques", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Sense carpeta)", - "deleteSelected": "Suprimeix", + "deleteSelected": "Delete", "exitSelection": "Sortir de la selecció", - "importSkip": "Importa (omet els existents)", + "importSkip": "Import (skip existing)", "importOverwrite": "Importa (sobreescriu)", "collapseBtn": "Replegar", "importExportBtn": "Importació / Exportació", "hostStatusesRefreshed": "Estats de l'amfitrió actualitzats", "failedToRefreshHosts": "No s'han pogut actualitzar els amfitrions", - "movedHostTo": "S'ha mogut {{host}} a \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "No s'ha pogut moure l'amfitrió", - "folderRenamedTo": "La carpeta s'ha rebatejat com a \"{{name}}\"", - "deletedFolder": "Carpeta suprimida \"{{name}}\"", - "failedToDeleteFolder": "No s'ha pogut suprimir la carpeta", - "deleteAllInFolder": "Voleu suprimir tots els hosts de \"{{name}}\"? Això no es pot desfer.", - "deletedHost": "Suprimit {{name}}", - "copiedToClipboard": "Copiat al porta-retalls", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edita la carpeta", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edita la carpeta", + "deleteFolder": "Suprimeix la carpeta", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "No s'han pogut moure els amfitrions", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "S'ha copiat l'URL del terminal", "fileManagerUrlCopied": "S'ha copiat l'URL del gestor de fitxers", "tunnelUrlCopied": "S'ha copiat l'URL del túnel", "dockerUrlCopied": "S'ha copiat l'URL de Docker", - "serverStatsUrlCopied": "URL d'estadístiques del servidor copiada", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "URL RDP copiada", "vncUrlCopied": "URL de VNC copiada", "telnetUrlCopied": "S'ha copiat l'URL de Telnet", @@ -471,109 +633,112 @@ "expandActions": "Expandeix accions", "collapseActions": "Accions de plegament", "wakeOnLanAction": "Despertar-se en LAN", - "wakeOnLanSuccess": "Paquet màgic enviat a {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "No s'ha pogut enviar el paquet màgic", - "cloneHostAction": "Host clonat", + "cloneHostAction": "Clone Host", "copyAddress": "Copiar adreça", "copyLink": "Copia l'enllaç", - "copyTerminalUrlAction": "Copia l'URL del terminal", - "copyFileManagerUrlAction": "Copia l'URL del gestor de fitxers", - "copyTunnelUrlAction": "Copia l'URL del túnel", - "copyDockerUrlAction": "Copia l'URL de Docker", - "copyServerStatsUrlAction": "Copia l'URL de les estadístiques del servidor", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "Copia l'URL de l'RDP", "copyVncUrlAction": "Copia l'URL de VNC", "copyTelnetUrlAction": "Copia l'URL de Telnet", - "copyRemoteDesktopUrlAction": "Copia l'URL de l'escriptori remot", - "deleteCredentialConfirm": "Voleu suprimir la credencial \"{{name}}\"?", - "deletedCredential": "Suprimit {{name}}", - "deploySSHKeyTitle": "Implementa la clau SSH", - "deployingBtn": "S'està desplegant...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Implementa", "failedToDeployKey": "No s'ha pogut implementar la clau", - "deleteHostsConfirm": "Voleu suprimir l'amfitrió {{count}}{{plural}}? Això no es pot desfer.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Mogut a l'arrel", - "failedToMoveHosts": "No s'han pogut moure els amfitrions", - "enableTerminalFeature": "Habilita el terminal", - "disableTerminalFeature": "Desactiva el terminal", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Habilita els fitxers", "disableFilesFeature": "Desactiva els fitxers", "enableTunnelsFeature": "Habilita els túnels", "disableTunnelsFeature": "Desactiva els túnels", - "enableDockerFeature": "Activa Docker", - "disableDockerFeature": "Desactiva Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Afegeix etiquetes...", "authDetails": "Detalls d'autenticació", - "credType": "Tipus", + "credType": "Type", "generateKeyPairDesc": "Genereu un nou parell de claus, tant les claus privades com les públiques s'ompliran automàticament.", "generatingKey": "Generant...", - "generateLabel": "Genera {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Puja el fitxer", "keyPassphraseOptional": "Contrasenya de clau (opcional)", "sshPublicKeyOptional": "Clau pública SSH (opcional)", "publicKeyGenerated": "Clau pública generada", "failedToGeneratePublicKey": "No s'ha pogut obtenir la clau pública", "publicKeyCopied": "Clau pública copiada", - "keyPairGenerated": "Parell de claus generat {{label}}", - "failedToGenerateKeyPair": "No s'ha pogut generar el parell de claus", - "searchHostsPlaceholder": "Cerca amfitrions, adreces, etiquetes…", - "searchCredentialsPlaceholder": "Cerca credencials…", - "refreshBtn": "Actualitza", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Afegeix etiquetes...", - "deleteConfirmBtn": "Suprimeix", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "El servidor SSH ha de tenir definits GatewayPorts sí, AllowTcpForwarding sí i PermitRootLogin sí a /etc/ssh/sshd_config.", - "deleteHostConfirm": "Voleu suprimir \"{{name}}\"?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Activeu com a mínim un dels protocols anteriors per configurar l'autenticació i la connexió.", - "keyPassphrase": "Contrasenya de clau", - "connectBtn": "Connecta", - "disconnectBtn": "Desconnecta", - "basicInformation": "Informació bàsica", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Detalls d'autenticació", - "credTypeLabel": "Tipus", - "hostsTab": "Amfitrions", - "credentialsTab": "Credencials", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Selecciona diversos", "selectHosts": "Selecciona els amfitrions", - "connectionLabel": "Connexió", - "authenticationLabel": "Autenticació", - "generateKeyPairTitle": "Genera un parell de claus", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Genereu un nou parell de claus, tant les claus privades com les públiques s'ompliran automàticament.", - "generateFromPrivateKey": "Generar a partir de la clau privada", - "refreshBtn2": "Actualitza", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Sortir de la selecció", "exportAll": "Exporta-ho tot", - "addHostBtn2": "Afegeix amfitrió", - "addCredentialBtn2": "Afegeix credencials", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Comprovant els estats de l'amfitrió...", - "pinnedSection": "Fixat", + "pinnedSection": "Pinned", "hostsExported": "Els amfitrions s'han exportat correctament", "exportFailed": "No s'han pogut exportar els amfitrions", "sampleDownloaded": "Fitxer de mostra descarregat", - "failedToDeleteCredential2": "No s'ha pogut suprimir la credencial", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Sense carpeta)", - "nSelected": "{{count}} seleccionat", - "featuresMenu": "Característiques", - "moveMenu": "Moure", - "cancelSelection": "Cancel·la", - "deployDialogDesc": "Implementa {{name}} a les claus_autoritzades d'un host.", - "targetHostLabel": "Amfitrió de destinació", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Seleccioneu un amfitrió...", "keyDeployedSuccess": "La clau s'ha desplegat correctament", "failedToDeployKey2": "No s'ha pogut implementar la clau", - "deletedCount": "S'han suprimit els amfitrions {{count}}", - "failedToDeleteCount": "No s'han pogut suprimir els amfitrions {{count}}", - "duplicatedHost": "Duplicat \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "No s'ha pogut duplicar l'amfitrió", - "updatedCount": "Amfitrions {{count}} actualitzats", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Nom amigable", - "descriptionLabel": "Descripció", + "descriptionLabel": "Description", "loadingHost": "S'està carregant l'amfitrió...", - "loadingHosts": "S'estan carregant els amfitrions...", - "loadingCredentials": "S'estan carregant les credencials...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Encara no hi ha amfitrions", - "noHostsMatchSearch": "No hi ha amfitrions que coincideixin amb la teva cerca", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "No s'ha trobat l'amfitrió", - "searchHosts": "Cerca amfitrions...", + "searchHosts": "Search hosts...", "sortHosts": "Ordena els hosts", "sortDefault": "Ordre per defecte", "sortNameAsc": "Nom (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "Fixat primer", "filterHosts": "Filtra els amfitrions", "filterClearAll": "Esborra els filtres", - "filterStatusGroup": "Estat", - "filterOnline": "En línia", - "filterOffline": "Fora de línia", - "filterPinned": "Fixat", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "Tipus d'autorització", - "filterAuthPassword": "Contrasenya", - "filterAuthKey": "Clau SSH", - "filterAuthCredential": "Credencial", - "filterAuthNone": "Cap", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "Característiques", + "filterFeaturesGroup": "Features", "filterFeatureTerminal": "Terminal", - "filterFeatureFileManager": "Gestor de fitxers", - "filterFeatureTunnel": "Túnel", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", - "filterTagsGroup": "Etiquetes", - "shareHost": "Comparteix l'amfitrió", - "shareHostTitle": "Comparteix: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Aquest amfitrió ha d'utilitzar una credencial per habilitar la compartició. Editeu l'amfitrió i assigneu-li primer una credencial." }, "guac": { - "connection": "Connexió", - "authentication": "Autenticació", - "connectionSettings": "Configuració de connexió", - "displaySettings": "Configuració de la pantalla", - "audioSettings": "Configuració d'àudio", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Credencial emmagatzemada", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Mètode d'autenticació", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Selecciona una credencial...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "Rendiment de l'RDP", - "deviceRedirection": "Redirecció de dispositius", - "session": "Sessió", - "gateway": "Porta d'entrada", - "remoteApp": "Aplicació remota", - "clipboard": "Porta-retalls", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "Gravació de sessions", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Configuració de VNC", - "terminalSettings": "Configuració del terminal", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "Port RDP", - "username": "Nom d'usuari", - "password": "Contrasenya", - "domain": "Domini", - "securityMode": "Mode de seguretat", - "colorDepth": "Profunditat de color", - "width": "Amplada", - "height": "Alçada", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Mètode de redimensionament", - "clientName": "Nom del client", - "initialProgram": "Programa inicial", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Disseny del servidor", - "timezone": "Zona horària", - "gatewayHostname": "Nom de l'amfitrió de la passarel·la", - "gatewayPort": "Port de passarel·la", - "gatewayUsername": "Nom d'usuari de la passarel·la", - "gatewayPassword": "Contrasenya de la passarel·la", - "gatewayDomain": "Domini de passarel·la", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "Programa RemoteApp", "workingDirectory": "Directori de treball", "arguments": "Arguments", "normalizeLineEndings": "Normalitzar els finals de línia", - "recordingPath": "Ruta d'enregistrament", - "recordingName": "Nom de l'enregistrament", - "macAddress": "Adreça MAC", - "broadcastAddress": "Adreça de difusió", - "udpPort": "Port UDP", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Temps d'espera (s)", - "driveName": "Nom de la unitat", - "drivePath": "Camí de conducció", - "ignoreCertificate": "Ignora el certificat", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Permet connexions a amfitrions amb certificats autosignats", - "forceLossless": "Força sense pèrdues", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Força la codificació d'imatges sense pèrdues (més qualitat, més amplada de banda)", - "disableAudio": "Desactiva l'àudio", + "disableAudio": "Disable Audio", "disableAudioDesc": "Silencia tot l'àudio de la sessió remota", "enableAudioInput": "Activa l'entrada d'àudio (micròfon)", "enableAudioInputDesc": "Reenvia el micròfon local a la sessió remota", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Activa els efectes Aero Glass", "menuAnimations": "Animacions de menú", "menuAnimationsDesc": "Activa les animacions de diapositives i esvaïment del menú", - "disableBitmapCaching": "Desactiva la memòria cau de mapes de bits", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Desactiva la memòria cau de mapes de bits (pot ajudar amb errors)", - "disableOffscreenCaching": "Desactiva la memòria cau fora de pantalla", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Desactiva la memòria cau fora de pantalla", - "disableGlyphCaching": "Desactiva la memòria cau de glifs", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Desactiva la memòria cau de glifos", - "enableGfx": "Activa els efectes especials", + "enableGfx": "Enable GFX", "enableGfxDesc": "Utilitza el canal de gràfics RemoteFX", - "enablePrinting": "Habilita la impressió", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Redirigir les impressores locals a la sessió remota", - "enableDriveRedirection": "Activa la redirecció de la unitat", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Assignar una carpeta local com a unitat a la sessió remota", - "createDrivePath": "Crea una ruta de conducció", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Crea automàticament la carpeta si no existeix", - "disableDownload": "Desactiva la descàrrega", + "disableDownload": "Disable Download", "disableDownloadDesc": "Impedir la descàrrega de fitxers des de la sessió remota", - "disableUpload": "Desactiva la càrrega", + "disableUpload": "Disable Upload", "disableUploadDesc": "Impedir la càrrega de fitxers a la sessió remota", - "enableTouch": "Activa el tacte", + "enableTouch": "Enable Touch", "enableTouchDesc": "Activa el reenviament d'entrada tàctil", - "consoleSession": "Sessió de consola", + "consoleSession": "Console Session", "consoleSessionDesc": "Connecta't a la consola (sessió 0) en comptes d'una nova sessió", "sendWolPacket": "Enviar paquet WOL", "sendWolPacketDesc": "Envia un paquet màgic per despertar aquest host abans de connectar-se", - "disableCopy": "Desactiva la còpia", + "disableCopy": "Disable Copy", "disableCopyDesc": "Impedir la còpia de text des de la sessió remota", - "disablePaste": "Desactiva l'enganxament", + "disablePaste": "Disable Paste", "disablePasteDesc": "Impedir enganxar text a la sessió remota", "createPathIfMissing": "Crea un camí si falta", "createPathIfMissingDesc": "Crea automàticament el directori d'enregistrament", - "excludeOutput": "Exclou la sortida", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "No enregistrar la sortida de pantalla (només metadades)", - "excludeMouse": "Exclou el ratolí", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "No enregistreu els moviments del ratolí", "includeKeystrokes": "Inclou les pulsacions de tecles", "includeKeystrokesDesc": "Enregistra les pulsacions de tecles en brut a més de la sortida de la pantalla", @@ -718,102 +896,105 @@ "vncPassword": "Contrasenya de VNC", "vncUsernameOptional": "Nom d'usuari (opcional)", "vncLeaveBlank": "Deixeu-ho en blanc si no és necessari", - "cursorMode": "Mode del cursor", - "swapRedBlue": "Intercanvia vermell/blau", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Intercanvia els canals de color vermell i blau (corregeix alguns problemes de color)", "readOnly": "Només lectura", "readOnlyDesc": "Visualitza la pantalla remota sense enviar cap entrada", "telnetPort": "Port Telnet", - "terminalType": "Tipus de terminal", - "fontName": "Nom de la font", - "fontSize": "Mida de la lletra", - "colorScheme": "Esquema de colors", - "backspaceKey": "Tecla Retrocés", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Primer desa l'amfitrió.", "sharingOptionsAfterSave": "Les opcions de compartició estan disponibles després que s'hagi desat l'amfitrió.", "sharingLoadError": "No s'han pogut carregar les dades de compartició. Comprova la connexió i torna-ho a provar.", - "shareHostSection": "Comparteix l'amfitrió", - "shareWithUser": "Comparteix amb l'usuari", - "shareWithRole": "Comparteix amb el rol", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Selecciona l'usuari", - "selectRole": "Selecciona un rol", + "selectRole": "Select Role", "selectUserOption": "Selecciona un usuari...", "selectRoleOption": "Selecciona un rol...", - "permissionLevel": "Nivell de permís", + "permissionLevel": "Permission Level", "expiresInHours": "Caduca en (hores)", "noExpiryPlaceholder": "Deixeu-ho en blanc si no hi ha caducitat", - "shareBtn": "Comparteix", - "currentAccess": "Accés actual", - "typeHeader": "Tipus", - "targetHeader": "Objectiu", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "Permís", - "grantedByHeader": "Atorgat per", - "expiresHeader": "Caduca", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Encara no hi ha entrades d'accés.", - "expiredLabel": "Caducat", - "neverLabel": "Mai", - "revokeBtn": "Revocar", - "cancelBtn": "Cancel·la", - "savingBtn": "Desant...", - "updateHostBtn": "Actualitza l'amfitrió", - "addHostBtn": "Afegeix amfitrió" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Cerca hosts, ordres o configuracions...", - "quickActions": "Accions ràpides", - "hostManager": "Gestor d'amfitrions", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Gestionar, afegir o editar amfitrions", "addNewHost": "Afegeix un nou amfitrió", "addNewHostDesc": "Registra un nou amfitrió", - "adminSettings": "Configuració de l'administrador", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Configura les preferències del sistema i els usuaris", - "userProfile": "Perfil d'usuari", + "userProfile": "User Profile", "userProfileDesc": "Gestiona el teu compte i les teves preferències", - "addCredential": "Afegeix credencials", + "addCredential": "Add Credential", "addCredentialDesc": "Emmagatzemar claus o contrasenyes SSH", - "recentActivity": "Activitat recent", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Servidors i amfitrions", - "noHostsFound": "No s'han trobat hosts que coincideixin amb \"{{search}}\"", - "links": "Enllaços", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navega", - "select": "Selecciona", + "select": "Select", "toggleWith": "Commuta amb" }, "splitScreen": { - "paneEmpty": "Panell {{index}} - buit", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Cap pestanya assignada", "focusedPane": "Panell actiu" }, "connections": { "noConnections": "Sense connexions", "noConnectionsDesc": "Obriu un terminal, un gestor de fitxers o un escriptori remot per veure les connexions aquí", - "connectedFor": "Connectat per {{duration}}", - "connected": "Connectat", - "disconnected": "Desconnectat", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Tanca la pestanya", "closeConnection": "Connexió propera", "forgetTab": "Oblidar", - "removeBackground": "Elimina", - "reconnect": "Reconnecta", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Reobrir", "sectionOpen": "Obre", "sectionBackground": "Fons", "backgroundDesc": "Les sessions persisteixen durant 30 minuts després de la desconnexió i es poden tornar a connectar.", "persisted": "Persistia en segon pla", - "expiresIn": "Caduca en {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Cerca connexions...", - "noSearchResults": "No hi ha connexions que coincideixin amb la teva cerca" + "noSearchResults": "No hi ha connexions que coincideixin amb la teva cerca", + "rename": "Rename session" }, "guacamole": { - "connecting": "Connectant a la sessió {{type}}...", - "connectionError": "Error de connexió", - "connectionFailed": "La connexió ha fallat", - "failedToConnect": "No s'ha pogut obtenir el testimoni de connexió", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "No s'ha trobat l'amfitrió", - "noHostSelected": "No s'ha seleccionat cap amfitrió", - "reconnect": "Reconnecta", - "retry": "Torna-ho a intentar", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "El servei d'escriptori remot (guacd) no està disponible. Assegureu-vos que guacd estigui en execució, sigui accessible i estigui configurat correctament a la configuració d'administrador.", "ctrlAltDel": "Ctrl+Alt+Supr", "toolbar": { @@ -822,13 +1003,13 @@ "winKey": "Clau de Windows", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Majúscules", + "shift": "Shift", "win": "Guanyar", - "stickyActive": "{{key}} (bloquejat - feu clic per alliberar)", - "stickyInactive": "{{key}} (feu clic per bloquejar)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Escapada", "tab": "Pestanya", - "home": "Inici", + "home": "Home", "end": "Final", "pageUp": "Pàgina amunt", "pageDown": "Pàgina avall", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Connecta't a l'amfitrió", - "clear": "Clar", - "paste": "Enganxa", - "reconnect": "Reconnecta", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Connexió perduda", - "connected": "Connectat", - "clipboardWriteFailed": "No s'ha pogut copiar al porta-retalls. Assegureu-vos que la pàgina es serveix per HTTPS o localhost.", - "clipboardReadFailed": "No s'ha pogut llegir del porta-retalls. Assegureu-vos que els permisos del porta-retalls estiguin concedits.", - "clipboardHttpWarning": "Per enganxar cal HTTPS. Feu servir Ctrl+Maj+V o publiqueu Termix sobre HTTPS.", - "unknownError": "S'ha produït un error desconegut", - "websocketError": "Error de connexió de WebSocket", - "connecting": "Connectant...", - "noHostSelected": "No s'ha seleccionat cap amfitrió", - "reconnecting": "Reconnectant... ({{attempt}}/{{max}})", - "reconnected": "S'ha reconnectat correctament", - "tmuxSessionCreated": "Sessió tmux creada: {{name}}", - "tmuxSessionAttached": "sessió tmux adjunta: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux no està instal·lat a l'amfitrió remot, tornant a l'intèrpret d'ordres estàndard", "tmuxSessionPickerTitle": "Sessions de tmux", "tmuxSessionPickerDesc": "S'han trobat sessions tmux existents en aquest amfitrió. Seleccioneu-ne una per tornar-la a adjuntar o crear una sessió nova.", - "tmuxWindows": "Finestres", - "tmuxWindowCount": "finestra {{count}}", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Clients adjunts", - "tmuxAttachedCount": "{{count}} adjunt", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Darrera activitat", "tmuxTimeJustNow": "ara mateix", - "tmuxTimeMinutes": "fa {{count}}minuts", - "tmuxTimeHours": "fa {{count}}h", - "tmuxTimeDays": "fa {{count}}dies", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Inicia una nova sessió", "tmuxCopyHint": "Ajusta la selecció i prem Intro per copiar al porta-retalls", "tmuxDetach": "Desconnecta de la sessió de tmux", "tmuxDetached": "Desconnectat de la sessió tmux", - "maxReconnectAttemptsReached": "S'ha arribat al màxim d'intents de reconnexió", - "closeTab": "Tanca", - "connectionTimeout": "Temps d'espera de connexió", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Executant {{command}} - {{host}}", - "totpRequired": "Cal autenticació de dos factors", - "totpCodeLabel": "Codi de verificació", - "totpVerify": "Verifica", - "warpgateAuthRequired": "Cal autenticació de Warpgate", - "warpgateSecurityKey": "Clau de seguretat", - "warpgateAuthUrl": "URL d'autenticació", - "warpgateOpenBrowser": "Obre al navegador", - "warpgateContinue": "He completat l'autenticació", - "opksshAuthRequired": "Cal autenticació OPKSSH", - "opksshAuthDescription": "Completeu l'autenticació al navegador per continuar. Aquesta sessió serà vàlida durant 24 hores.", - "opksshOpenBrowser": "Obre el navegador per autenticar-te", - "opksshWaitingForAuth": "Esperant l'autenticació al navegador...", - "opksshAuthenticating": "Processant l'autenticació...", - "opksshTimeout": "S'ha esgotat el temps d'autenticació. Torna-ho a provar.", - "opksshAuthFailed": "L'autenticació ha fallat. Si us plau, comproveu les vostres credencials i torneu-ho a intentar.", - "opksshSignInWith": "Inicia la sessió amb {{provider}}", - "sudoPasswordPopupTitle": "Voleu inserir la contrasenya?", - "websocketAbnormalClose": "La connexió s'ha tancat inesperadament. Això pot ser degut a un problema de configuració del proxy invers o de l'SSL. Si us plau, reviseu els registres del servidor.", - "connectionLogTitle": "Registre de connexió", - "connectionLogCopy": "Copia els registres al porta-retalls", - "connectionLogEmpty": "Encara no hi ha registres de connexió", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Obre", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Esperant els registres de connexió...", - "connectionLogCopied": "Registres de connexió copiats al porta-retalls", - "connectionLogCopyFailed": "No s'han pogut copiar els registres al porta-retalls", - "connectionRejected": "Connexió rebutjada pel servidor. Si us plau, comproveu l'autenticació i la configuració de xarxa.", - "hostKeyRejected": "Verificació de la clau de l'amfitrió SSH rebutjada. Connexió cancel·lada.", - "sessionTakenOver": "La sessió s'ha obert en una altra pestanya. S'està tornant a connectar..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Pestanya dividida", + "addToSplit": "Afegeix a Dividir", + "removeFromSplit": "Elimina de Split" + } }, "fileManager": { - "noHostSelected": "No s'ha seleccionat cap amfitrió", + "noHostSelected": "No host selected", "initializingEditor": "Inicialitzant l'editor...", - "file": "Fitxer", - "folder": "Carpeta", - "uploadFile": "Puja el fitxer", - "downloadFile": "Descarrega", - "extractArchive": "Extreure l'arxiu", - "extractingArchive": "Extraient {{name}}...", - "archiveExtractedSuccessfully": "{{name}} s'ha extret correctament", - "extractFailed": "L'extracció ha fallat", - "compressFile": "Comprimir fitxer", - "compressFiles": "Comprimir fitxers", - "compressFilesDesc": "Comprimir elements {{count}} en un arxiu", - "archiveName": "Nom de l'arxiu", - "enterArchiveName": "Introduïu el nom de l'arxiu...", - "compressionFormat": "Format de compressió", - "selectedFiles": "Fitxers seleccionats", - "andMoreFiles": "i {{count}} més...", - "compress": "Comprimir", - "compressingFiles": "Comprimint elements {{count}} en {{name}}...", - "filesCompressedSuccessfully": "{{name}} creat correctament", - "compressFailed": "La compressió ha fallat", - "edit": "Edita", - "preview": "Vista prèvia", - "previous": "Anterior", - "next": "Següent", - "pageXOfY": "Pàgina {{current}} de {{total}}", - "zoomOut": "Allunyar", - "zoomIn": "Ampliar zoom", - "newFile": "Fitxer nou", - "newFolder": "Nova carpeta", - "rename": "Canvia el nom", - "uploading": "S'està carregant...", - "uploadingFile": "S'està carregant {{name}}...", - "fileName": "Nom del fitxer", - "folderName": "Nom de la carpeta", - "fileUploadedSuccessfully": "El fitxer \"{{name}}\" s'ha carregat correctament", - "failedToUploadFile": "No s'ha pogut carregar el fitxer", - "fileDownloadedSuccessfully": "Fitxer \"{{name}}\" descarregat correctament", - "failedToDownloadFile": "No s'ha pogut descarregar el fitxer", - "fileCreatedSuccessfully": "Fitxer \"{{name}}\" creat correctament", - "folderCreatedSuccessfully": "La carpeta \"{{name}}\" s'ha creat correctament", - "failedToCreateItem": "No s'ha pogut crear l'element", - "operationFailed": "L'operació {{operation}} ha fallat per a {{name}}: {{error}}", - "failedToResolveSymlink": "No s'ha pogut resoldre l'enllaç simbòlic", - "itemsDeletedSuccessfully": "{{count}} elements suprimits correctament", - "failedToDeleteItems": "No s'han pogut suprimir els elements", - "sudoPasswordRequired": "Contrasenya d'administrador requerida", - "enterSudoPassword": "Introduïu la contrasenya sudo per continuar amb aquesta operació", - "sudoPassword": "Contrasenya de Sudo", - "sudoOperationFailed": "L'operació Sudo ha fallat.", - "sudoAuthFailed": "L'autenticació del Sudo ha fallat.", - "dragFilesToUpload": "Deixa anar els fitxers aquí per pujar-los", - "emptyFolder": "Aquesta carpeta està buida", - "searchFiles": "Cerca fitxers...", - "upload": "Pujada", - "selectHostToStart": "Seleccioneu un amfitrió per iniciar la gestió de fitxers", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "El gestor de fitxers requereix SSH. Aquest amfitrió no té SSH habilitat.", - "failedToConnect": "No s'ha pogut connectar a SSH", - "failedToLoadDirectory": "No s'ha pogut carregar el directori", - "noSSHConnection": "No hi ha connexió SSH disponible", - "copy": "Còpia", - "cut": "Tallar", - "paste": "Enganxa", - "copyPath": "Copia la ruta", - "copyPaths": "Copiar camins", - "delete": "Suprimeix", - "properties": "Propietats", - "refresh": "Actualitza", - "downloadFiles": "Baixeu els fitxers {{count}} al navegador", - "copyFiles": "Copia elements {{count}}", - "cutFiles": "Retalla elements {{count}}", - "deleteFiles": "Suprimeix elements {{count}}", - "filesCopiedToClipboard": "{{count}} elements copiats al porta-retalls", - "filesCutToClipboard": "{{count}} elements retallats al porta-retalls", - "pathCopiedToClipboard": "La ruta s'ha copiat al porta-retalls", - "pathsCopiedToClipboard": "{{count}} camins copiats al porta-retalls", - "failedToCopyPath": "No s'ha pogut copiar la ruta al porta-retalls", - "movedItems": "Elements moguts {{count}}", - "failedToDeleteItem": "No s'ha pogut suprimir l'element", - "itemRenamedSuccessfully": "{{type}} s'ha canviat el nom correctament", - "failedToRenameItem": "No s'ha pogut canviar el nom de l'element", - "download": "Descarrega", - "permissions": "Permisos", - "size": "Mida", - "modified": "Modificat", - "path": "Camí", - "confirmDelete": "Esteu segur que voleu suprimir {{name}}?", - "permissionDenied": "Permís denegat", - "serverError": "Error del servidor", - "fileSavedSuccessfully": "Fitxer desat correctament", - "failedToSaveFile": "No s'ha pogut desar el fitxer", - "confirmDeleteSingleItem": "Esteu segur que voleu suprimir permanentment \"{{name}}\"?", - "confirmDeleteMultipleItems": "Esteu segur que voleu suprimir permanentment els elements {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Esteu segur que voleu suprimir permanentment els elements {{count}} ? Això inclou les carpetes i el seu contingut.", - "confirmDeleteFolder": "Esteu segur que voleu suprimir permanentment la carpeta \"{{name}}\" i tot el seu contingut?", - "permanentDeleteWarning": "Aquesta acció no es pot desfer. Els elements s'eliminaran permanentment del servidor.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", "recent": "Recent", - "pinned": "Fixat", - "folderShortcuts": "Dreceres de carpeta", - "failedToReconnectSSH": "No s'ha pogut reconnectar la sessió SSH", - "openTerminalHere": "Obre el terminal aquí", - "run": "Corre", - "openTerminalInFolder": "Obre el terminal en aquesta carpeta", - "openTerminalInFileLocation": "Obre el terminal a la ubicació del fitxer", - "runningFile": "Córrer - {{file}}", - "onlyRunExecutableFiles": "Només pot executar fitxers executables", - "directories": "Directoris", - "removedFromRecentFiles": "S'ha eliminat \"{{name}}\" dels fitxers recents", - "removeFailed": "No s'ha pogut eliminar l'opció.", - "unpinnedSuccessfully": "S'ha desfixat \"{{name}}\" correctament", - "unpinFailed": "No s'ha pogut desancorar la fixació.", - "removedShortcut": "S'ha eliminat la drecera \"{{name}}\"", - "removeShortcutFailed": "No s'ha pogut eliminar la drecera.", - "clearedAllRecentFiles": "S'han esborrat tots els fitxers recents", - "clearFailed": "Error en esborrar", - "removeFromRecentFiles": "Elimina dels fitxers recents", - "clearAllRecentFiles": "Esborra tots els fitxers recents", - "unpinFile": "Desfixar fitxer", - "removeShortcut": "Elimina la drecera", - "pinFile": "Fitxer fixat", - "addToShortcuts": "Afegeix a les dreceres", - "pasteFailed": "No s'ha pogut enganxar", - "noUndoableActions": "Sense accions desfaibles", - "undoCopySuccess": "Operació de còpia desfeta: S'han suprimit {{count}} fitxers copiats", - "undoCopyFailedDelete": "Error en desfer: no s'han pogut suprimir els fitxers copiats.", - "undoCopyFailedNoInfo": "Error en desfer: no s'ha pogut trobar la informació del fitxer copiat", - "undoMoveSuccess": "Operació de moviment desfeta: S'han tornat a moure els fitxers {{count}} a la ubicació original.", - "undoMoveFailedMove": "Desfer ha fallat: no s'han pogut moure cap fitxer enrere", - "undoMoveFailedNoInfo": "Desfer ha fallat: no s'ha pogut trobar la informació del fitxer mogut", - "undoDeleteNotSupported": "L'operació de supressió no es pot desfer: els fitxers s'han suprimit permanentment del servidor.", - "undoTypeNotSupported": "Tipus d'operació de desfer no compatible", - "undoOperationFailed": "L'operació de desfer ha fallat", - "unknownError": "Error desconegut", - "confirm": "Confirma", - "find": "Troba...", - "replace": "Substitueix", - "downloadInstead": "Descarrega en comptes d'això", - "keyboardShortcuts": "Dreceres de teclat", - "searchAndReplace": "Cerca i substitueix", - "editing": "Edició", - "search": "Cerca", - "findNext": "Cerca el següent", - "findPrevious": "Cerca anterior", - "save": "Desa", - "selectAll": "Selecciona-ho tot", - "undo": "Desfer", - "redo": "Refer", - "moveLineUp": "Mou la línia cap amunt", - "moveLineDown": "Mou la línia cap avall", - "toggleComment": "Activa/desactiva el comentari", - "autoComplete": "Completar automàticament", - "imageLoadError": "No s'ha pogut carregar la imatge", - "startTyping": "Comença a escriure...", - "unknownSize": "Mida desconeguda", - "fileIsEmpty": "El fitxer està buit", - "largeFileWarning": "Avís de fitxer gran", - "largeFileWarningDesc": "Aquest fitxer té una mida de {{size}} , cosa que pot causar problemes de rendiment quan s'obre com a text.", - "fileNotFoundAndRemoved": "No s'ha trobat el fitxer \"{{name}}\" i s'ha eliminat dels fitxers recents/fixats.", - "failedToLoadFile": "No s'ha pogut carregar el fitxer: {{error}}", - "serverErrorOccurred": "S'ha produït un error del servidor. Torna-ho a provar més tard.", - "autoSaveFailed": "El desament automàtic ha fallat", - "fileAutoSaved": "Fitxer desat automàticament", - "moveFileFailed": "No s'ha pogut moure {{name}}", - "moveOperationFailed": "L'operació de moviment ha fallat", - "canOnlyCompareFiles": "Només es poden comparar dos fitxers", - "comparingFiles": "Comparació de fitxers: {{file1}} i {{file2}}", - "dragFailed": "L'operació d'arrossegament ha fallat", - "filePinnedSuccessfully": "Fitxer \"{{name}}\" fixat correctament", - "pinFileFailed": "No s'ha pogut fixar el fitxer", - "fileUnpinnedSuccessfully": "El fitxer \"{{name}}\" s'ha desanclat correctament", - "unpinFileFailed": "No s'ha pogut desancorar el fitxer", - "shortcutAddedSuccessfully": "Drecera de carpeta \"{{name}}\" afegida correctament", - "addShortcutFailed": "No s'ha pogut afegir la drecera", - "operationCompletedSuccessfully": "{{operation}} {{count}} elements correctament", - "operationCompleted": "{{operation}} {{count}} elements", - "downloadFileSuccess": "Fitxer {{name}} descarregat correctament", - "downloadFileFailed": "La descàrrega ha fallat", - "moveTo": "Mou a {{name}}", - "diffCompareWith": "Comparació de diferències amb {{name}}", - "dragOutsideToDownload": "Arrossega fora de la finestra per descarregar (fitxers{{count}})", - "newFolderDefault": "NovaCarpeta", - "newFileDefault": "NouFitxer.txt", - "successfullyMovedItems": "S'han mogut correctament {{count}} elements a {{target}}", - "move": "Moure", - "searchInFile": "Cerca en un fitxer (Ctrl+F)", - "showKeyboardShortcuts": "Mostra les dreceres de teclat", - "startWritingMarkdown": "Comença a escriure el teu contingut de rebaixes...", - "loadingFileComparison": "S'està carregant la comparació de fitxers...", - "reload": "Torna a carregar", - "compare": "Comparar", - "sideBySide": "Costat al costat", - "inline": "En línia", - "fileComparison": "Comparació de fitxers: {{file1}} vs {{file2}}", - "fileTooLarge": "Fitxer massa gran: {{error}}", - "sshConnectionFailed": "La connexió SSH ha fallat. Si us plau, comproveu la connexió a {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "No s'ha pogut carregar el fitxer: {{error}}", - "connecting": "Connectant...", - "connectedSuccessfully": "Connexió correcta", - "totpVerificationFailed": "La verificació TOTP ha fallat", - "warpgateVerificationFailed": "L'autenticació de Warpgate ha fallat", - "authenticationFailed": "L'autenticació ha fallat", - "verificationCodePrompt": "Codi de verificació:", - "changePermissions": "Canvia els permisos", - "currentPermissions": "Permisos actuals", - "owner": "propietari", - "group": "Grup", - "others": "Altres", - "read": "Llegir", - "write": "Escriure", - "execute": "Executar", - "permissionsChangedSuccessfully": "Els permisos s'han canviat correctament", - "failedToChangePermissions": "No s'han pogut canviar els permisos", - "name": "Nom", - "sortByName": "Nom", - "sortByDate": "Data de modificació", - "sortBySize": "Mida", - "ascending": "Ascendent", - "descending": "Descendent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Arrel", "new": "Nou", "sortBy": "Ordena per", @@ -1139,20 +1335,20 @@ "editor": "Editor", "octal": "Octal", "storage": "Emmagatzematge", - "disk": "Disc", - "used": "Usat", - "of": "de", - "toggleSidebar": "Obre/tanca la barra lateral", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "No es pot carregar el PDF", "pdfLoadError": "S'ha produït un error en carregar aquest fitxer PDF.", "loadingPdf": "S'està carregant el PDF...", "loadingPage": "S'està carregant la pàgina..." }, "transfer": { - "copyToHost": "Copia a l'amfitrió…", - "moveToHost": "Moure a l'amfitrió…", - "copyItemsToHost": "Copia els elements {{count}} a l'amfitrió…", - "moveItemsToHost": "Mou elements {{count}} a l'amfitrió…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "No hi ha altres amfitrions de gestors de fitxers disponibles.", "noHostsConnectedHint": "Afegiu un altre amfitrió SSH amb el Gestor de fitxers habilitat al Gestor d'amfitrions.", "selectDestinationHost": "Selecciona l'amfitrió de destinació", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Expandeix les destinacions recents", "browseFolders": "Navega per les carpetes de destinació", "browseDestination": "Navega o introdueix la ruta", - "confirmCopy": "Còpia", - "confirmMove": "Moure", - "transferring": "Transferint…", - "compressing": "Comprimint…", - "extracting": "Extraient…", - "transferringItems": "Transferint {{current}} de {{total}} elements…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transferència completada", "transferError": "La transferència ha fallat", - "transferPartial": "Transferència completada amb errors {{count}}", - "transferPartialHint": "No s'ha pogut transferir: {{paths}}", - "itemsSummary": "{{count}} elements", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "La destinació ha de ser un directori per a transferències de diversos elements", "selectThisFolder": "Selecciona aquesta carpeta", "browsePathWillBeCreated": "Aquesta carpeta encara no existeix. Es crearà quan comenci la transferència.", "browsePathError": "No s'ha pogut obrir aquesta ruta a l'amfitrió de destinació.", "goUp": "Puja", - "copyFolderToHost": "Copia la carpeta a l'amfitrió…", - "moveFolderToHost": "Mou la carpeta a l'amfitrió…", - "hostReady": "Llest", - "hostConnecting": "Connectant…", - "hostDisconnected": "No connectat", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Cal autenticació: obriu primer el Gestor de fitxers en aquest amfitrió.", - "hostConnectionFailed": "La connexió ha fallat", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Horaris de transferència", - "metricsPrepare": "Prepara la destinació: {{duration}}", - "metricsCompress": "Comprimir a la font: {{duration}}", - "metricsHopSourceRead": "Font → servidor: {{throughput}}", - "metricsHopDestSftpWrite": "Servidor → destí (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Servidor → destí (local): {{throughput}}", - "metricsTransfer": "Extrem a extrem: {{throughput}} ({{duration}})", - "metricsExtract": "Extracte a la destinació: {{duration}}", - "metricsSourceDelete": "Elimina de la font: {{duration}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", "metricsTotal": "Total: {{duration}}", - "progressCompressing": "Compressió a l'amfitrió d'origen…", - "progressExtracting": "Extraient a la destinació…", - "progressTransferring": "Transferència de dades…", - "progressReconnecting": "Reconnectant…", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Carrils de transferència paral·lels", - "parallelSegmentsOption": "carrils {{count}}", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Els fitxers grans es divideixen en blocs de 256 MB. Els carrils múltiples utilitzen connexions separades (com ara iniciar diverses transferències) per a un rendiment total més alt.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} carrils)", - "progressTransferringItems": "Transferència de fitxers ({{current}} de {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} fitxers", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Fitxers font conservats (transferència parcial)", "jumpHostLimitation": "Tots dos hosts han de ser accessibles des del servidor Termix. No s'admet l'encaminament directe d'host a host.", - "cancel": "Cancel·la", + "cancel": "Cancel", "methodLabel": "Mètode de transferència", "methodAuto": "Automàtic", "methodTar": "Arxiu Tar", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Tria SFTP tar o per fitxer en funció del nombre de fitxers, la mida i la compressibilitat. Els fitxers individuals sempre utilitzen SFTP en temps real.", "methodTarHint": "Comprimir a l'origen, transferir un arxiu, extreure a la destinació. Requereix tar en ambdós hosts Unix.", "methodItemSftpHint": "Transfereix cada fitxer individualment per SFTP. Funciona en tots els hosts, inclòs Windows.", - "methodPreviewLoading": "Càlcul del mètode de transferència…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "No s'ha pogut previsualitzar el mètode de transferència. El servidor encara triarà un mètode quan l'inicieu.", "methodPreviewWillUseTar": "Utilitzarà: Arxiu Tar", "methodPreviewWillUseItemSftp": "Utilitzarà: SFTP per fitxer", - "methodPreviewScanSummary": "{{fileCount}} fitxers, {{totalSize}} total (escanejats a l'amfitrió d'origen).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Cada fitxer utilitza el mateix flux SFTP com una còpia d'un sol fitxer, un darrere l'altre. El progrés es combina en tots els fitxers, de manera que la barra es mou lentament durant els fitxers grans.", "methodReason": { "user_item_sftp": "Heu triat SFTP per fitxer.", "user_tar": "Has triat l'arxiu tar.", "tar_unavailable": "Tar no està disponible en un o tots dos hosts; s'utilitzarà SFTP per fitxer.", "windows_host": "Hi ha un host de Windows implicat; no s'utilitza tar.", - "auto_multi_large": "Automàtic: diversos fitxers, inclòs un fitxer gran ({{largestSize}}) amb dades compressibles: paquets de fitxers tar en una sola transferència.", - "auto_single_large_in_archive": "Automàtic: un fitxer gran ({{largestSize}}) en aquest conjunt — SFTP per fitxer.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automàtic: dades majoritàriament incompressibles — SFTP per fitxer.", - "auto_many_files": "Automàtic: molts fitxers ({{fileCount}}) — tar redueix la sobrecàrrega per fitxer.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automàtic: SFTP per fitxer per a aquest conjunt." }, - "progressCancel": "Cancel·la", - "progressCancelling": "Cancel·lant…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Estancat", "resumedHint": "S'ha tornat a connectar a una transferència activa iniciada en una altra finestra.", "transferCancelled": "Transferència cancel·lada", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "No s'han pogut eliminar alguns fitxers parcials", "cleanupDestFilesNothing": "Res a netejar a la destinació", "cleanupDestFilesError": "La neteja ha fallat", - "retryTransfer": "Torna-ho a intentar", + "retryTransfer": "Retry", "retryTransferError": "No s'ha pogut reintentar.", "transferFailedRetryHint": "S'han conservat dades parcials a la destinació. El reintent es reprendrà quan es restableixi la connexió." }, "tunnels": { - "noSshTunnels": "Sense túnels SSH", - "createFirstTunnelMessage": "Encara no has creat cap túnel SSH. Configureu les connexions del túnel al Gestor d'amfitrions per començar.", - "connected": "Connectat", - "disconnected": "Desconnectat", - "connecting": "Connectant...", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", "error": "Error", - "canceling": "Cancel·lant...", - "connect": "Connecta", - "disconnect": "Desconnecta", - "cancel": "Cancel·la", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", "port": "Port", - "localPort": "Port local", - "remotePort": "Port remot", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Port d'amfitrió actual", - "endpointPort": "Port de punt final", + "endpointPort": "Endpoint Port", "bindIp": "IP local", - "endpointSshConfig": "Configuració SSH del punt final", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Amfitrió SSH de punt final", "endpointSshHostPlaceholder": "Seleccioneu un amfitrió configurat", "endpointSshHostRequired": "Seleccioneu un host SSH de punt final per a cada túnel de client.", - "attempt": "Intent {{current}} de {{max}}", - "nextRetryIn": "Proper intent en {{seconds}} segons", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Túnels de client", "clientTunnel": "Túnel del client", "addClientTunnel": "Afegeix un túnel de client", "noClientTunnels": "No hi ha túnels de client configurats en aquest escriptori.", - "tunnelName": "Nom del túnel", - "remoteHost": "Amfitrió remot", - "autoStart": "Inici automàtic", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "S'inicia quan s'obre aquest client d'escriptori i roman connectat.", "clientManualStartDesc": "Feu servir Start i Stop des d'aquesta fila. Termix no l'obrirà automàticament.", "clientRemoteServerNote": "El reenviament remot pot requerir AllowTcpForwarding i GatewayPorts al servidor SSH del punt final. El port remot es tanca quan aquest escriptori es desconnecta.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "El port remot ha d'estar entre 1 i 65535.", "invalidLocalTargetPort": "El port de destinació local ha d'estar entre 1 i 65535.", "invalidEndpointPort": "El port del punt final ha d'estar entre 1 i 65535.", - "duplicateAutoStartBind": "Només un túnel de client d'inici automàtic pot utilitzar {{bind}}.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "No s'ha pogut actualitzar l'estat del túnel.", - "active": "Actiu", - "start": "Inici", - "stop": "Atura", - "test": "Prova", - "type": "Tipus de túnel", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", "typeLocal": "Local (-L)", - "typeRemote": "Comandament a distància (-R)", + "typeRemote": "Remote (-R)", "typeDynamic": "Dinàmic (-D)", "typeServerLocalDesc": "De l'amfitrió actual al punt final.", "typeServerRemoteDesc": "Punt final torna a l'amfitrió actual.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Punt final de tornada a l'ordinador local.", "typeClientDynamicDesc": "SOCKS a l'ordinador local.", "typeDynamicDesc": "Reenvia el trànsit de SOCKS5 CONNECT a través de SSH", - "forwardDescriptionServerLocal": "Amfitrió actual {{sourcePort}} → punt final {{endpointPort}}.", - "forwardDescriptionServerRemote": "Punt final {{endpointPort}} → amfitrió actual {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS a l'amfitrió actual {{sourcePort}}.", - "forwardDescriptionClientLocal": "Local {{sourcePort}} → remot {{endpointPort}}.", - "forwardDescriptionClientRemote": "Remot {{sourcePort}} → local {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS al port local {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → MITJONS via {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", - "autoNameClientDynamic": "MITJONS {{localPort}} via {{endpoint}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Ruta:", "lastStarted": "Últim inici", "lastTested": "Última prova", "lastError": "Últim error", - "maxRetries": "Màxim d'intents", + "maxRetries": "Max Retries", "maxRetriesDescription": "Nombre màxim d'intents de reintent.", - "retryInterval": "Interval de reintent (segons)", - "retryIntervalDescription": "Temps d'espera entre intents de reintent.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", "local": "Local", - "remote": "Remot", + "remote": "Remote", "destination": "Destinació", "host": "Amfitrió", "mode": "Mode", - "noHostSelected": "No s'ha seleccionat cap amfitrió", + "noHostSelected": "No host selected", "working": "Treballant..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Memòria", - "disk": "Disc", - "network": "Xarxa", - "uptime": "Temps de funcionament", - "processes": "Processos", - "available": "Disponible", - "free": "Gratuït", - "connecting": "Connectant...", - "connectionFailed": "No s'ha pogut connectar al servidor", - "naCpus": "CPU(s) N/A", - "cpuCores_one": "{{count}} Nucli", - "cpuCores_other": "{{count}} Nuclis", - "cpuUsage": "Ús de la CPU", - "memoryUsage": "Ús de memòria", - "diskUsage": "Ús del disc", - "failedToFetchHostConfig": "No s'ha pogut obtenir la configuració de l'amfitrió", - "serverOffline": "Servidor fora de línia", - "cannotFetchMetrics": "No es poden obtenir mètriques del servidor fora de línia", - "totpFailed": "La verificació TOTP ha fallat", - "noneAuthNotSupported": "Les estadístiques del servidor no admeten el tipus d'autenticació \"cap\".", - "load": "Carrega", - "systemInfo": "Informació del sistema", - "hostname": "Nom d'amfitrió", - "operatingSystem": "Sistema operatiu", - "kernel": "Nucli", - "seconds": "segons", - "networkInterfaces": "Interfícies de xarxa", - "noInterfacesFound": "No s'han trobat interfícies de xarxa", - "noProcessesFound": "No s'han trobat processos", - "loginStats": "Estadístiques d'inici de sessió SSH", - "noRecentLoginData": "Sense dades d'inici de sessió recents", - "executingQuickAction": "Executant {{name}}...", - "quickActionSuccess": "{{name}} s'ha completat correctament", - "quickActionFailed": "{{name}} ha fallat", - "quickActionError": "No s'ha pogut executar {{name}}", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Ports d'escolta", + "title": "Listening Ports", "protocol": "Protocol", "port": "Port", - "address": "Adreça", - "process": "Procés", - "noData": "No hi ha dades de ports d'escolta" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Tot", + "noData": "No listening ports data" }, "firewall": { - "title": "Tallafocs", - "inactive": "Inactiu", - "policy": "Política", - "rules": "regles", - "noData": "No hi ha dades de tallafocs disponibles", - "action": "Acció", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Font", - "anywhere": "A qualsevol lloc" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Mitjana de càrrega", "swap": "Intercanvi", "architecture": "Arquitectura", - "refresh": "Actualitza", - "retry": "Torna-ho a intentar" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Treballant...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "SSH autoallotjat i gestió d'escriptori remot", - "loginTitle": "Inicia la sessió a Termix", - "registerTitle": "Crea un compte", - "forgotPassword": "Has oblidat la contrasenya?", - "rememberMe": "Recorda el dispositiu durant 30 dies (inclou TOTP)", - "noAccount": "No tens un compte?", - "hasAccount": "Ja tens un compte?", - "twoFactorAuth": "Autenticació de dos factors", - "enterCode": "Introduïu el codi de verificació", - "backupCode": "O bé feu servir un codi de còpia de seguretat", - "verifyCode": "Verifica el codi", - "redirectingToApp": "Redireccionant a l'aplicació...", - "sshAuthenticationRequired": "Autenticació SSH requerida", - "sshNoKeyboardInteractive": "Autenticació interactiva amb teclat no disponible", - "sshAuthenticationFailed": "Error d'autenticació", - "sshAuthenticationTimeout": "Temps d'espera d'autenticació", - "sshNoKeyboardInteractiveDescription": "El servidor no admet l'autenticació interactiva amb teclat. Si us plau, proporcioneu la vostra contrasenya o clau SSH.", - "sshAuthFailedDescription": "Les credencials proporcionades eren incorrectes. Torneu-ho a provar amb credencials vàlides.", - "sshTimeoutDescription": "S'ha esgotat el temps d'espera de l'intent d'autenticació. Torna-ho a intentar.", - "sshProvideCredentialsDescription": "Si us plau, proporcioneu les vostres credencials SSH per connectar-vos a aquest servidor.", - "sshPasswordDescription": "Introduïu la contrasenya per a aquesta connexió SSH.", - "sshKeyPasswordDescription": "Si la clau SSH està xifrada, introduïu la contrasenya aquí.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Contrasenya obligatòria", "passphraseRequiredDescription": "La clau SSH està xifrada. Introduïu la contrasenya per desbloquejar-la.", - "back": "Enrere", - "firstUser": "Primer usuari", - "firstUserMessage": "Ets el primer usuari i se't nomenarà administrador. Pots veure la configuració d'administrador al menú desplegable d'usuaris de la barra lateral. Si creus que es tracta d'un error, consulta els registres de Docker o crea una incidència de GitHub.", - "external": "Extern", - "loginWithExternal": "Inicia la sessió amb un proveïdor extern", - "loginWithExternalDesc": "Inicia la sessió amb el proveïdor d'identitat extern configurat", - "externalNotSupportedInElectron": "L'autenticació externa encara no és compatible amb l'aplicació Electron. Si us plau, utilitzeu la versió web per iniciar sessió a OIDC.", - "resetPasswordButton": "Restablir contrasenya", - "sendResetCode": "Enviar codi de restabliment", - "resetCodeDesc": "Introdueix el teu nom d'usuari per rebre un codi de restabliment de contrasenya. El codi es registrarà als registres del contenidor Docker.", - "resetCode": "Restableix el codi", - "verifyCodeButton": "Verifica el codi", - "enterResetCode": "Introduïu el codi de 6 dígits dels registres del contenidor Docker per a l'usuari:", - "newPassword": "Nova contrasenya", - "confirmNewPassword": "Confirma la contrasenya", - "enterNewPassword": "Introduïu la nova contrasenya per a l'usuari:", - "signUp": "Registra't", - "desktopApp": "Aplicació d'escriptori", - "loggingInToDesktopApp": "Inici de sessió a l'aplicació d'escriptori", - "loadingServer": "S'està carregant el servidor...", - "dataLossWarning": "Si restableixes la contrasenya d'aquesta manera, s'eliminaran tots els hosts SSH, les credencials i altres dades xifrades que hagis desat. Aquesta acció no es pot desfer. Només fes servir aquesta opció si has oblidat la contrasenya i no has iniciat la sessió.", - "authenticationDisabled": "Autenticació desactivada", - "authenticationDisabledDesc": "Tots els mètodes d'autenticació estan actualment desactivats. Poseu-vos en contacte amb el vostre administrador.", - "attemptsRemaining": "{{count}} intents restants" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifica la clau d'amfitrió SSH", - "keyChangedWarning": "Clau d'amfitrió SSH canviada", - "firstConnectionTitle": "Primera vegada que em connecto a aquest amfitrió", - "firstConnectionDescription": "No es pot establir l'autenticitat d'aquest amfitrió. Verifiqueu que l'empremta digital coincideixi amb el que espereu.", - "keyChangedDescription": "La clau d'amfitrió d'aquest servidor ha canviat des de la vostra última connexió. Això podria indicar un problema de seguretat.", - "previousKey": "Clau anterior", - "newFingerprint": "Nova empremta digital", - "fingerprint": "Empremta digital", - "verifyInstructions": "Si confieu en aquest amfitrió, feu clic a Accepta per continuar i desar aquesta empremta digital per a futures connexions.", - "securityWarning": "Avís de seguretat", - "acceptAndContinue": "Accepta i continua", - "acceptNewKey": "Accepta la clau nova i continua" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "No s'ha pogut connectar a la base de dades", - "unknownError": "Error desconegut", - "loginFailed": "Error d'inici de sessió", - "failedPasswordReset": "No s'ha pogut iniciar el restabliment de la contrasenya", - "failedVerifyCode": "No s'ha pogut verificar el codi de restabliment", - "failedCompleteReset": "No s'ha pogut completar el restabliment de la contrasenya", - "invalidTotpCode": "Codi TOTP no vàlid", - "failedOidcLogin": "No s'ha pogut iniciar l'inici de sessió a l'OIDC.", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "S'ha sol·licitat l'inici de sessió silenciós, però l'inici de sessió a l'OIDC no està disponible.", "failedUserInfo": "No s'ha pogut obtenir la informació de l'usuari després de l'inici de sessió", - "oidcAuthFailed": "L'autenticació OIDC ha fallat", - "invalidAuthUrl": "URL d'autorització no vàlida rebuda del backend", - "requiredField": "Aquest camp és obligatori", - "minLength": "La longitud mínima és {{min}}", - "passwordMismatch": "Les contrasenyes no coincideixen", - "passwordLoginDisabled": "L'inici de sessió amb nom d'usuari i contrasenya està actualment desactivat", - "sessionExpired": "La sessió ha caducat; si us plau, torneu a iniciar la sessió.", - "totpRateLimited": "Tarifa limitada: massa intents de verificació TOTP. Torna-ho a provar més tard.", - "totpRateLimitedWithTime": "Tarifa limitada: massa intents de verificació TOTP. Espereu {{time}} segons abans de tornar-ho a intentar.", - "resetCodeRateLimited": "Tarifa limitada: massa intents de verificació. Torna-ho a provar més tard.", - "resetCodeRateLimitedWithTime": "Taxa limitada: massa intents de verificació. Espereu {{time}} segons abans de tornar-ho a intentar.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "No s'ha pogut desar el testimoni d'autenticació", "failedToLoadServer": "No s'ha pogut carregar el servidor" }, "messages": { - "registrationDisabled": "El registre de comptes nous està desactivat actualment per un administrador. Si us plau, inicia la sessió o contacta amb un administrador.", - "userNotAllowed": "El vostre compte no està autoritzat per registrar-se. Poseu-vos en contacte amb un administrador.", - "databaseConnectionFailed": "No s'ha pogut connectar al servidor de la base de dades", - "resetCodeSent": "Restableix el codi enviat als registres de Docker", - "codeVerified": "Codi verificat correctament", - "passwordResetSuccess": "La contrasenya s'ha restablert correctament", - "loginSuccess": "Inici de sessió correcte", - "registrationSuccess": "Registre correcte" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Túnels d'escriptori locals dirigits a hosts SSH configurats.", "c2sTunnelPresets": "Preajustos del túnel del client", "c2sTunnelPresetsDesc": "Desa la llista de túnels locals d'aquest client d'escriptori com a predefinició de servidor amb nom o torna a carregar una predefinició en aquest client.", "c2sTunnelPresetsUnavailable": "Els preajustos del túnel del client només estan disponibles al client d'escriptori.", - "c2sPresetName": "Nom predefinit", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Nom predefinit del client", "c2sPresetToLoad": "Predefinició per carregar", "c2sNoPresetSelected": "No s'ha seleccionat cap predefinició", "c2sNoPresets": "No s'han desat presets", - "c2sLoadPreset": "Carrega", - "c2sCurrentLocalConfig": "{{count}} túnel(s) de client local configurat(s) en aquest escriptori.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Els preajustaments són instantànies explícites; carregar-ne una substitueix la llista de túnels de clients locals d'aquest client d'escriptori.", "c2sPresetSaved": "S'ha desat la configuració predefinida del túnel del client", "c2sPresetLoaded": "Predefinició del túnel del client carregada localment", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Llengua", - "keyPassword": "contrasenya clau", - "pastePrivateKey": "Enganxa la teva clau privada aquí...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (escolta localment)", "localTargetHost": "127.0.0.1 (objectiu en aquest ordinador)", "socksListenerHost": "127.0.0.1 (escoltador de SOCKS)", - "enterPassword": "Introdueix la teva contrasenya", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Tauler de control", - "loading": "S'està carregant el tauler de control...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Suport", - "discord": "Discòrdia", - "serverOverview": "Visió general del servidor", - "version": "Versió", - "upToDate": "Actualitzat", - "updateAvailable": "Actualització disponible", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Temps de funcionament", - "database": "Base de dades", - "healthy": "Saludable", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", "error": "Error", "totalHosts": "Total d'amfitrions", - "totalTunnels": "Túnels totals", - "totalCredentials": "Credencials totals", - "recentActivity": "Activitat recent", - "reset": "Restablir", - "loadingRecentActivity": "S'està carregant l'activitat recent...", - "noRecentActivity": "Sense activitat recent", - "quickActions": "Accions ràpides", - "addHost": "Afegeix amfitrió", - "addCredential": "Afegeix credencials", - "adminSettings": "Configuració de l'administrador", - "userProfile": "Perfil d'usuari", - "serverStats": "Estadístiques del servidor", - "loadingServerStats": "S'estan carregant les estadístiques del servidor...", - "noServerData": "No hi ha dades del servidor disponibles", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personalitza el tauler de control", - "dashboardSettings": "Configuració del tauler de control", - "enableDisableCards": "Activa/Desactiva les targetes", - "resetLayout": "Restableix els valors predeterminats", - "serverOverviewCard": "Visió general del servidor", - "recentActivityCard": "Activitat recent", - "networkGraphCard": "Gràfic de xarxa", - "networkGraph": "Gràfic de xarxa", - "quickActionsCard": "Accions ràpides", - "serverStatsCard": "Estadístiques del servidor", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Principal", "panelSide": "Costat", - "justNow": "ara mateix" + "justNow": "ara mateix", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "ESTABLE", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "No hi ha cap amfitrió configurat", "online": "EN LÍNIA", "offline": "FORA DE LÍNIA", - "onlineLower": "En línia", - "nodes": "nodes {{count}}", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Afegeix:", "commandPalette": "Paleta d'ordres", "done": "Fet", "editModeInstructions": "Arrossegueu les targetes per reordenar · Arrossegueu el divisor de columnes per canviar la mida de les columnes · Arrossegueu la vora inferior d'una targeta per canviar-ne l'alçada · Paperera per eliminar-la", "empty": "Buit", - "clear": "Clar" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Afegeix amfitrió", - "addGroup": "Afegeix un grup", - "addLink": "Afegeix un enllaç", - "zoomIn": "Ampliar zoom", - "zoomOut": "Allunyar", - "resetView": "Restableix la vista", - "selectHost": "Selecciona l'amfitrió", - "chooseHost": "Trieu un amfitrió...", - "parentGroup": "Grup de pares", - "noGroup": "Sense grup", - "groupName": "Nom del grup", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", "color": "Color", - "source": "Font", - "target": "Objectiu", - "moveToGroup": "Moure al grup", - "selectGroup": "Selecciona el grup...", - "addConnection": "Afegeix una connexió", - "hostDetails": "Detalls de l'amfitrió", - "removeFromGroup": "Elimina del grup", - "addHostHere": "Afegeix l'amfitrió aquí", - "editGroup": "Edita el grup", - "delete": "Suprimeix", - "add": "Afegeix", - "create": "Crea", - "move": "Moure", - "connect": "Connecta", - "createGroup": "Crea un grup", - "selectSourcePlaceholder": "Selecciona la font...", - "selectTargetPlaceholder": "Selecciona l'objectiu...", - "invalidFile": "Fitxer no vàlid", - "hostAlreadyExists": "L'amfitrió ja és a la topologia", - "connectionExists": "La connexió ja existeix", - "unknown": "Desconegut", - "name": "Nom", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "Estat", - "failedToAddNode": "No s'ha pogut afegir el node", - "sourceDifferentFromTarget": "La font i la destinació han de ser diferents", - "exportJSON": "Exporta JSON", - "importJSON": "Importa JSON", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Gestor de fitxers", - "tunnel": "Túnel", + "fileManager": "File Manager", + "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Estadístiques del servidor", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Encara no hi ha nodes" }, "docker": { - "notEnabled": "Docker no està habilitat per a aquest amfitrió", - "validating": "Validant Docker...", - "connecting": "Connectant...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "No s'ha pogut connectar a Docker", - "containerStarted": "Contenidor {{name}} iniciat", - "failedToStartContainer": "No s'ha pogut iniciar el contenidor {{name}}", - "containerStopped": "El contenidor {{name}} s'ha aturat", - "failedToStopContainer": "No s'ha pogut aturar el contenidor {{name}}", - "containerRestarted": "El contenidor {{name}} s'ha reiniciat", - "failedToRestartContainer": "No s'ha pogut reiniciar el contenidor {{name}}", - "containerPaused": "Contenidor {{name}} en pausa", - "containerUnpaused": "Contenidor {{name}} reactivat", - "failedToTogglePauseContainer": "No s'ha pogut activar o desactivar l'estat de pausa per al contenidor {{name}}", - "containerRemoved": "Contenidor {{name}} eliminat", - "failedToRemoveContainer": "No s'ha pogut eliminar el contenidor {{name}}", - "image": "Imatge", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", "ports": "Ports", - "noPorts": "Sense ports", - "start": "Inici", - "confirmRemoveContainer": "Esteu segur que voleu eliminar el contenidor '{{name}}'? Aquesta acció no es pot desfer.", - "runningContainerWarning": "Avís: Aquest contenidor està en execució. Si el suprimiu, primer s'aturarà el contenidor.", - "loadingContainers": "Carregant contenidors...", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Gestor de Docker", - "autoRefresh": "Actualització automàtica", + "autoRefresh": "Auto Refresh", "timestamps": "Marques de temps", "lines": "Línies", - "filterLogs": "Filtra els registres...", - "refresh": "Actualitza", - "download": "Descarrega", - "clear": "Clar", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Registres descarregats correctament", "last50": "Últims 50", "last100": "Últims 100", "last500": "Últims 500", "last1000": "Últims 1000", "allLogs": "Tots els registres", - "noLogsMatching": "No hi ha registres que coincideixin amb \"{{query}}\"", - "noLogsAvailable": "No hi ha registres disponibles", - "noContainersFound": "No s'han trobat contenidors", - "noContainersFoundHint": "No hi ha contenidors Docker disponibles en aquest amfitrió.", - "searchPlaceholder": "Cerca contenidors...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Tots els estats", - "stateRunning": "Córrer", + "stateRunning": "Running", "statePaused": "En pausa", "stateExited": "Sortit", "stateRestarting": "Reinici", - "noContainersMatchFilters": "No hi ha contenidors que coincideixin amb els vostres filtres", - "noContainersMatchFiltersHint": "Prova d'ajustar els criteris de cerca o de filtre", - "failedToFetchStats": "No s'han pogut obtenir les estadístiques del contenidor", - "containerNotRunning": "El contenidor no funciona", - "startContainerToViewStats": "Inicia el contenidor per veure les estadístiques", - "loadingStats": "S'estan carregant les estadístiques...", - "errorLoadingStats": "S'ha produït un error en carregar les estadístiques", - "noStatsAvailable": "No hi ha estadístiques disponibles", - "cpuUsage": "Ús de la CPU", - "current": "Actual", - "memoryUsage": "Ús de memòria", - "networkIo": "E/S de xarxa", - "input": "Entrada", - "output": "Sortida", - "blockIo": "Bloc d'E/S", - "read": "Llegir", - "write": "Escriure", - "pids": "PID", - "containerInformation": "Informació del contenidor", - "name": "Nom", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Estat", - "containerMustBeRunning": "El contenidor ha d'estar en execució per accedir a la consola.", - "verificationCodePrompt": "Introduïu el codi de verificació", - "totpVerificationFailed": "La verificació TOTP ha fallat. Torna-ho a provar.", - "warpgateVerificationFailed": "L'autenticació de Warpgate ha fallat. Torna-ho a intentar.", - "connectedTo": "Connectat a {{containerName}}", - "disconnected": "Desconnectat", - "consoleError": "Error de consola", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", "errorMessage": "Error: {{message}}", - "failedToConnect": "No s'ha pogut connectar al contenidor", - "console": "Consola", - "selectShell": "Selecciona l'intèrpret d'ordres", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "cendra", - "connect": "Connecta", - "disconnect": "Desconnecta", - "notConnected": "No connectat", - "clickToConnect": "Feu clic a Connecta per iniciar una sessió de shell", - "connectingTo": "Connectant a {{containerName}}...", - "containerNotFound": "No s'ha trobat el contenidor", - "backToList": "Torna a la llista", - "logs": "Registres", - "stats": "Estadístiques", - "consoleTab": "Consola", - "startContainerToAccess": "Inicieu el contenidor per accedir a la consola" + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Usuaris", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Sessions", - "sectionRoles": "Rols", - "sectionDatabase": "Base de dades", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "Claus API", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Esborra els filtres", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Tot", "allowRegistration": "Permetre el registre d'usuaris", - "allowRegistrationDesc": "Permet que els nous usuaris s'autoregistrin", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Permet l'inici de sessió amb contrasenya", "allowPasswordLoginDesc": "Inici de sessió amb nom d'usuari/contrasenya", "oidcAutoProvision": "Autoprovisió OIDC", - "oidcAutoProvisionDesc": "Crea comptes automàticament per a usuaris d'OIDC fins i tot quan el registre està desactivat", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Permet el restabliment de la contrasenya", "allowPasswordResetDesc": "Restableix el codi a través dels registres de Docker", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Temps d'espera de la sessió", - "hours": "hores", + "hours": "hours", "sessionTimeoutRange": "Mín 1 h · Màx 720 h", - "monitoringDefaults": "Monitorització dels valors predeterminats", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Comprovació d'estat", - "metrics": "Mètriques", + "metrics": "Metrics", "sec": "segons", "logLevel": "Nivell de registre", "enableGuacamole": "Activa el guacamole", "enableGuacamoleDesc": "Escriptori remot RDP/VNC", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "URL de guacd", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "Configura OpenID Connect per a SSO. Els camps marcats amb un * són obligatoris.", - "oidcClientId": "ID de client", - "oidcClientSecret": "Secret del client", - "oidcAuthUrl": "URL d'autorització", - "oidcIssuerUrl": "URL de l'emissor", - "oidcTokenUrl": "URL del testimoni", - "oidcUserIdentifier": "Ruta d'identificació d'usuari", - "oidcDisplayName": "Camí del nom de visualització", - "oidcScopes": "Àmbits", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Substitueix l'URL d'informació de l'usuari", - "oidcAllowedUsers": "Usuaris permesos", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Un correu electrònic per línia. Deixeu-ho en blanc per permetre-ho tot.", - "removeOidc": "Elimina", - "usersCount": "{{count}} usuaris", - "createUser": "Crea", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Nou rol", - "roleName": "Nom", - "roleDisplayName": "Nom de visualització", - "roleDescription": "Descripció", - "rolesCount": "rols {{count}}", - "createRole": "Crea", - "creating": "Creant...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Exporta la base de dades", "exportDatabaseDesc": "Baixeu una còpia de seguretat de tots els hosts, credencials i configuracions", - "export": "Exporta", - "exporting": "Exportant...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Importa la base de dades", "importDatabaseDesc": "Restaurar des d'un fitxer de còpia de seguretat .sqlite", - "importDatabaseSelected": "Seleccionat: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Selecciona un fitxer", - "changeFile": "Canvi", - "import": "Importa", - "importing": "Important...", - "apiKeysCount": "tecles {{count}}", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Nova clau API", "apiKeyCreatedWarning": "Clau creada: copia-la ara, no es tornarà a mostrar.", - "apiKeyName": "Nom", - "apiKeyUser": "Usuari", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Selecciona un usuari...", - "apiKeyExpiresAt": "Caduca a", + "apiKeyExpiresAt": "Expires At", "createKey": "Crea una clau", "apiKeyNoExpiry": "Sense caducitat", "revokedBadge": "REVOCAT", - "authTypeDual": "Doble autenticació", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", "authTypeLocal": "Local", - "adminStatusAdministrator": "Administrador/a", - "adminStatusRegularUser": "Usuari habitual", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMINISTRADOR", "systemBadge": "SYS", "customBadge": "PERSONALITZAT", "youBadge": "TU", - "sessionsActive": "{{count}} actiu", - "sessionActive": "Actiu: {{time}}", - "sessionExpires": "Caducitat: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "Tot", "revokeAllSessionsSuccess": "Totes les sessions per a l'usuari revocades", - "revokeAllSessionsFailed": "No s'han pogut revocar les sessions", - "revokeSessionFailed": "No s'ha pogut revocar la sessió", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Afegeix un rol", "noCustomRoles": "No s'han definit rols personalitzats", - "removeRoleFailed": "No s'ha pogut eliminar el rol", - "assignRoleFailed": "No s'ha pogut assignar el rol", - "deleteRoleFailed": "No s'ha pogut suprimir el rol", - "userAdminAccess": "Administrador/a", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Accés complet a tots els paràmetres d'administració", - "userRoles": "Rols", - "revokeAllUserSessions": "Revoca totes les sessions", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Forçar el reinici de sessió en tots els dispositius", - "revoke": "Revocar", + "revoke": "Revoke", "deleteUserWarning": "Eliminar aquest usuari és permanent.", - "deleteUser": "Suprimeix {{username}}", - "deleting": "S'està suprimint...", - "deleteUserFailed": "No s'ha pogut suprimir l'usuari", - "deleteUserSuccess": "L'usuari \"{{username}}\" s'ha suprimit", - "deleteRoleSuccess": "Rol \"{{name}}\" suprimit", - "revokeKeySuccess": "Clau \"{{name}}\" revocada", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "No s'ha pogut revocar la clau", - "copiedToClipboard": "Copiat al porta-retalls", + "copiedToClipboard": "Copied to clipboard", "done": "Fet", - "createUserTitle": "Crea un usuari", + "createUserTitle": "Create User", "createUserDesc": "Crea un compte local nou.", - "createUserUsername": "Nom d'usuari", - "createUserPassword": "Contrasenya", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Mínim 6 caràcters.", - "createUserEnterUsername": "Introdueix el nom d'usuari", - "createUserEnterPassword": "Introdueix la contrasenya", - "createUserSubmit": "Crea un usuari", - "editUserTitle": "Gestiona l'usuari: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Edita els rols, l'estat d'administrador, les sessions i la configuració del compte.", - "editUserUsername": "Nom d'usuari", + "editUserUsername": "Username", "editUserAuthType": "Tipus d'autorització", - "editUserAdminStatus": "Estat d'administrador", - "editUserUserId": "ID d'usuari", - "linkAccountTitle": "Enllaça l'OIDC al compte de contrasenya", - "linkAccountDesc": "Fusiona el compte OIDC {{username}} amb un compte local existent.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Això farà:", "linkAccountEffect1": "Suprimeix el compte només d'OIDC", "linkAccountEffect2": "Afegeix l'inici de sessió OIDC al compte de destinació", "linkAccountEffect3": "Permet l'inici de sessió amb OIDC i contrasenya", - "linkAccountTargetUsername": "Nom d'usuari de destinació", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Introduïu el nom d'usuari del compte local al qual voleu enllaçar", - "linkAccounts": "Enllaçar comptes", - "linkAccountSuccess": "Compte OIDC vinculat a \"{{username}}\"", - "linkAccountFailed": "No s'ha pogut enllaçar el compte OIDC", - "linkAccountInProgress": "Enllaçant...", - "saving": "Desant...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "No s'ha pogut actualitzar la configuració del registre", "updatePasswordLoginFailed": "No s'ha pogut actualitzar la configuració d'inici de sessió amb contrasenya", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "No s'ha pogut actualitzar la configuració d'aprovisionament automàtic d'OIDC.", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "No s'ha pogut actualitzar la configuració de restabliment de la contrasenya", "sessionTimeoutRange2": "El temps d'espera de la sessió ha d'estar entre 1 i 720 hores", "sessionTimeoutSaved": "S'ha desat el temps d'espera de la sessió", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Valors d'interval no vàlids", "monitoringSaved": "Configuració de monitorització desada", "monitoringSaveFailed": "No s'ha pogut desar la configuració de monitorització", - "guacamoleSaved": "Configuració del guacamole desada", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "No s'ha pogut desar la configuració del guacamole", "guacamoleUpdateFailed": "No s'ha pogut actualitzar la configuració del guacamole", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "No s'ha pogut actualitzar el nivell de registre", "oidcSaved": "Configuració OIDC desada", "oidcSaveFailed": "No s'ha pogut desar la configuració OIDC.", "oidcRemoved": "Configuració OIDC eliminada", "oidcRemoveFailed": "No s'ha pogut eliminar la configuració OIDC.", "createUserRequired": "Cal un nom d'usuari i una contrasenya", - "createUserPasswordTooShort": "La contrasenya ha de tenir com a mínim 6 caràcters", - "createUserSuccess": "L'usuari \"{{username}}\" ha estat creat", - "createUserFailed": "No s'ha pogut crear l'usuari", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "No s'ha pogut actualitzar l'estat de l'administrador", "allSessionsRevoked": "Totes les sessions revocades", - "revokeSessionsFailed": "No s'han pogut revocar les sessions", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "El nom i el nom de visualització són obligatoris", - "createRoleSuccess": "S'ha creat el rol \"{{name}}\"", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "No s'ha pogut crear el rol", "apiKeyNameRequired": "El nom de la clau és obligatori", "apiKeyUserRequired": "Cal l'ID d'usuari", - "apiKeyCreatedSuccess": "Clau API \"{{name}}\" creada", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "No s'ha pogut crear la clau de l'API", "exportSuccess": "La base de dades s'ha exportat correctament", "exportFailed": "L'exportació de la base de dades ha fallat", "importSelectFile": "Si us plau, seleccioneu primer un fitxer", - "importCompleted": "Importació completada: {{total}} elements importats, {{skipped}} omesos", - "importFailed": "La importació ha fallat: {{error}}", - "importError": "La importació de la base de dades ha fallat" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "La importació de la base de dades ha fallat", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Amfitrió", - "hostPlaceholder": "192.168.1.1 o example.com", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Nom d'usuari", - "usernamePlaceholder": "nom d'usuari", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Aut.", - "passwordLabel": "Contrasenya", - "passwordPlaceholder": "contrasenya", - "privateKeyLabel": "Clau privada", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Enganxa la clau privada...", - "credentialLabel": "Credencial", + "credentialLabel": "Credential", "credentialPlaceholder": "Selecciona una credencial desada", - "connectToTerminal": "Connecta't al terminal", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Connecta't a fitxers" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Esborra-ho tot", "noHistoryEntries": "Sense entrades a l'historial", "trackingDisabled": "El seguiment de l'historial està desactivat", - "trackingDisabledHint": "Activa-ho a la configuració del teu perfil per enregistrar ordres." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Enregistrament de claus", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Registre als terminals", "selectAll": "Tot", - "selectNone": "Cap", + "selectNone": "None", "noTerminalTabsOpen": "No hi ha pestanyes de terminal obertes", "selectTerminalsAbove": "Seleccioneu els terminals anteriors", "broadcastInputPlaceholder": "Escriu aquí per emetre les pulsacions de tecles...", "stopRecording": "Atura l'enregistrament", "startRecording": "Comença a gravar", - "settingsTitle": "Configuració", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Activa la funció de copiar/enganxar amb el clic dret" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "Arrossegueu pestanyes als panells superiors o feu servir Assignació ràpida", "dropHere": "Deixa anar aquí", "emptyPane": "Buit", - "dashboard": "Tauler de control", + "dashboard": "Dashboard", "clearSplitScreen": "Pantalla dividida clara", "quickAssign": "Assignació ràpida", - "alreadyAssigned": "Panell {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Pestanya dividida", "addToSplit": "Afegeix a Dividir", "removeFromSplit": "Elimina de Split", - "assignToPane": "Assigna al panell" + "assignToPane": "Assigna al panell", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Crea un fragment", - "createSnippetDescription": "Crea un nou fragment d'ordre per a una execució ràpida", - "nameLabel": "Nom", - "namePlaceholder": "p. ex., reiniciar Nginx", - "descriptionLabel": "Descripció", - "descriptionPlaceholder": "Descripció opcional", - "optional": "Opcional", - "folderLabel": "Carpeta", - "noFolder": "Sense carpeta (Sense categoria)", - "commandLabel": "Comandament", - "commandPlaceholder": "p. ex., sudo systemctl reinicia nginx", - "cancel": "Cancel·la", - "createSnippetButton": "Crea un fragment", - "createFolderTitle": "Crea una carpeta", - "createFolderDescription": "Organitza els teus fragments en carpetes", - "folderNameLabel": "Nom de la carpeta", - "folderNamePlaceholder": "p. ex., ordres del sistema, scripts de Docker", - "folderColorLabel": "Color de la carpeta", - "folderIconLabel": "Icona de carpeta", - "previewLabel": "Vista prèvia", - "folderNameFallback": "Nom de la carpeta", - "createFolderButton": "Crea una carpeta", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Terminals de destinació", "selectAll": "Tot", - "selectNone": "Cap", + "selectNone": "None", "noTerminalTabsOpen": "No hi ha pestanyes de terminal obertes", - "searchPlaceholder": "Fragments de cerca...", - "newSnippet": "Nou fragment", - "newFolder": "Nova carpeta", - "run": "Corre", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "No hi ha fragments en aquesta carpeta", - "uncategorized": "Sense categoria", - "editSnippetTitle": "Edita el fragment", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Actualitza aquest fragment d'ordres", "saveSnippetButton": "Desa els canvis", - "createSuccess": "Fragment creat correctament", - "createFailed": "No s'ha pogut crear el fragment", - "updateSuccess": "Fragment actualitzat correctament", - "updateFailed": "No s'ha pogut actualitzar el fragment", - "deleteFailed": "No s'ha pogut suprimir el fragment", - "folderCreateSuccess": "Carpeta creada correctament", - "folderCreateFailed": "No s'ha pogut crear la carpeta", - "editFolderTitle": "Edita la carpeta", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Canvia el nom o l'aspecte d'aquesta carpeta", "saveFolderButton": "Desa els canvis", "editFolder": "Edita la carpeta", "deleteFolder": "Suprimeix la carpeta", - "folderDeleteSuccess": "S'ha suprimit la carpeta \"{{name}}\"", - "folderDeleteFailed": "No s'ha pogut suprimir la carpeta", - "folderEditSuccess": "La carpeta s'ha actualitzat correctament", - "folderEditFailed": "No s'ha pogut actualitzar la carpeta", - "confirmRunMessage": "Executar \"{{name}}\"?", - "confirmRunButton": "Corre", - "runSuccess": "Ha executat \"{{name}}\" en terminals {{count}}", - "copySuccess": "S'ha copiat \"{{name}}\" al porta-retalls", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Compartir fragment", - "shareUser": "Usuari", - "shareRole": "Rol", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Selecciona un usuari...", "selectRole": "Selecciona un rol...", "shareSuccess": "Fragment compartit correctament", "shareFailed": "No s'ha pogut compartir el fragment", "revokeSuccess": "Accés revocat", - "revokeFailed": "No s'ha pogut revocar l'accés", - "currentAccess": "Accés actual", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "No s'han pogut carregar les dades compartides", - "loading": "S'està carregant...", - "close": "Tanca", - "reorderFailed": "No s'ha pogut desar l'ordre del fragment" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "No s'ha pogut desar l'ordre del fragment", + "importExport": "Importació / Exportació", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hi ha cap amfitrió configurat", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Compte", - "sectionAppearance": "Aspecte", - "sectionSecurity": "Seguretat", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "Claus API", "sectionC2sTunnels": "Túnels C2S", - "usernameLabel": "Nom d'usuari", - "roleLabel": "Rol", - "roleAdministrator": "Administrador/a", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Mètode d'autenticació", "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "Activat", "twoFaOff": "Desactivat", - "versionLabel": "Versió", - "deleteAccount": "Suprimeix el compte", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Elimina el teu compte permanentment", - "deleteButton": "Suprimeix", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Aquesta acció és permanent i no es pot desfer.", "deleteAccountWarning": "Totes les sessions, els amfitrions, les credencials i la configuració s'eliminaran permanentment.", - "confirmPasswordDeletePlaceholder": "Introdueix la teva contrasenya per confirmar", - "languageLabel": "Llengua", - "themeLabel": "Tema", - "fontSizeLabel": "Mida de la lletra", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Color d'accent", "settingsTerminal": "Terminal", - "commandAutocomplete": "Autocompletar ordres", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Mostra l'autocompleció mentre s'escriu", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Seguiment de l'historial", "historyTrackingDesc": "Comandes del terminal de pista", - "syntaxHighlighting": "Ressaltat de sintaxi", - "syntaxHighlightingDesc": "Ressaltar la sortida del terminal", "commandPalette": "Paleta d'ordres", "commandPaletteDesc": "Activa la drecera de teclat", "reopenTabsOnLogin": "Reobrir pestanyes en iniciar sessió", "reopenTabsOnLoginDesc": "Restaura les pestanyes obertes quan inicies la sessió o actualitzes la pàgina, fins i tot des d'un altre dispositiu", "confirmTabClose": "Confirma el tancament de la pestanya", "confirmTabCloseDesc": "Pregunta abans de tancar pestanyes del terminal", - "settingsSidebar": "Barra lateral", - "showHostTags": "Mostra les etiquetes de l'amfitrió", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Mostra les etiquetes a la llista d'amfitrions", "hostTrayOnClick": "Feu clic per expandir les accions de l'amfitrió", "hostTrayOnClickDesc": "Mostra sempre els botons de connexió; fes clic per ampliar les opcions de gestió en comptes de passar el cursor per sobre", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Mantingueu el rail de l'aplicació de la barra lateral esquerra sempre expandit en comptes d'expandir-se en passar el cursor per sobre", - "settingsSnippets": "Fragments", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Carpetes replegades", "foldersCollapsedDesc": "Replega les carpetes per defecte", "confirmExecution": "Confirma l'execució", "confirmExecutionDesc": "Confirma abans d'executar fragments", - "settingsUpdates": "Actualitzacions", + "settingsUpdates": "Updates", "disableUpdateChecks": "Desactiva les comprovacions d'actualització", "disableUpdateChecksDesc": "Deixa de buscar actualitzacions", "totpAuthenticator": "Autenticador TOTP", @@ -2109,68 +2612,68 @@ "qrCode": "Codi QR", "totpInstructions": "Escaneja el codi QR o introdueix el secret a l'aplicació d'autenticació i, a continuació, introdueix el codi de 6 dígits.", "totpCodePlaceholder": "000000", - "verify": "Verifica", - "changePassword": "Canvia la contrasenya", - "currentPasswordLabel": "Contrasenya actual", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Contrasenya actual", - "newPasswordLabel": "Nova contrasenya", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Nova contrasenya", "confirmPasswordLabel": "Confirma la nova contrasenya", "confirmPasswordPlaceholder": "Confirma la nova contrasenya", "updatePassword": "Actualitza la contrasenya", "createApiKeyTitle": "Crea una clau API", "createApiKeyDescription": "Genera una nova clau API per a l'accés programàtic.", - "apiKeyNameLabel": "Nom", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "p. ex., canonada de CI", "expiryDateLabel": "Data de caducitat", "optional": "opcional", - "cancel": "Cancel·la", + "cancel": "Cancel", "createKey": "Crea una clau", - "apiKeyCount": "tecles {{count}}", + "apiKeyCount": "{{count}} keys", "newKey": "Nova clau", "noApiKeys": "Encara no hi ha claus API.", - "apiKeyActive": "Actiu", + "apiKeyActive": "Active", "apiKeyUsageHint": "Inclou la teva clau a la", "apiKeyUsageHintHeader": "capçalera.", "apiKeyPermissionsHint": "Les claus hereten els permisos de l'usuari que les crea.", - "roleUser": "Usuari", - "authMethodDual": "Doble autenticació", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "No s'ha pogut iniciar la configuració del TOTP", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Introduïu un codi de 6 dígits", "totpEnabledSuccess": "Autenticació de dos factors activada", "totpInvalidCode": "Codi no vàlid, si us plau, torna-ho a intentar.", "totpDisableInputRequired": "Introdueix el teu codi TOTP o contrasenya", - "totpDisabledSuccess": "Autenticació de dos factors desactivada", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "No s'ha pogut desactivar la 2FA", - "totpDisableTitle": "Desactiva la 2FA", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Introduïu el codi TOTP o la contrasenya", - "totpDisableConfirm": "Desactiva la 2FA", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Continua a verificar", - "totpVerifyTitle": "Verifica el codi", - "totpBackupTitle": "Codis de còpia de seguretat", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Baixa els codis de còpia de seguretat", "done": "Fet", "secretCopied": "Secret copiat al porta-retalls", "apiKeyNameRequired": "El nom de la clau és obligatori", - "apiKeyCreated": "Clau API \"{{name}}\" creada", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "No s'ha pogut crear la clau de l'API", - "apiKeyUser": "Usuari", - "apiKeyExpires": "Caduca", - "apiKeyRevoked": "Clau API \"{{name}}\" revocada", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "No s'ha pogut revocar la clau de l'API", "passwordFieldsRequired": "Calen contrasenyes actuals i noves", - "passwordMismatch": "Les contrasenyes no coincideixen", - "passwordTooShort": "La contrasenya ha de tenir com a mínim 6 caràcters", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "La contrasenya s'ha actualitzat correctament", "passwordUpdateFailed": "No s'ha pogut actualitzar la contrasenya", "deletePasswordRequired": "Cal una contrasenya per eliminar el vostre compte", - "deleteFailed": "No s'ha pogut suprimir el compte", - "deleting": "S'està suprimint...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Obre el selector de colors", - "themeSystem": "Sistema", - "themeLight": "Llum", - "themeDark": "Fosc", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dràcula", "themeCatppuccin": "Catpuccina", "themeNord": "Nord", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "ara mateix", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Pestanya", + "backTab": "⇥", + "arrowUp": "Fletxa amunt", + "arrowDown": "Fletxa avall", + "arrowLeft": "Fletxa esquerra", + "arrowRight": "Fletxa dreta", + "home": "Home", + "end": "Final", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Fet" } } diff --git a/src/ui/locales/translated/cs_CZ.json b/src/ui/locales/translated/cs_CZ.json index 0ff93c6c..f357ceba 100644 --- a/src/ui/locales/translated/cs_CZ.json +++ b/src/ui/locales/translated/cs_CZ.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Složky", - "folder": "Složka", - "password": "Heslo", - "key": "Klíč", - "sshPrivateKey": "Soukromý klíč SSH", - "upload": "Nahrát", - "keyPassword": "Heslo klíče", - "sshKey": "Klíč SSH", - "uploadPrivateKeyFile": "Nahrát soubor soukromého klíče", - "searchCredentials": "Hledat přihlašovací údaje…", - "addCredential": "Přidat přihlašovací údaje", - "caCertificate": "Certifikát CA (-cert.pub)", - "caCertificateDescription": "Volitelně: Nahrajte nebo vložte soubor certifikátu podepsaný CA (např. id_ed25519-cert.pub). Vyžadováno, pokud váš SSH server používá autorizaci založenou na certifikátech.", - "uploadCertFile": "Nahrát -cert.pub soubor", - "clearCert": "Vyčistit", - "certLoaded": "Certifikát načten", - "certPublicKeyLabel": "Certifikát CA", - "certTypeLabel": "Typ certifikátu", - "pasteOrUploadCert": "Vložit nebo nahrát certifikát -cert.pub...", - "hasCaCert": "Má CA certifikát", - "noCaCert": "Žádný certifikát CA" + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Výchozí pořadí", + "sortNameAsc": "Jméno (A → Z)", + "sortNameDesc": "Jméno (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Vymazat filtry", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Nepodařilo se načíst upozornění", - "failedToDismissAlert": "Nepodařilo se zrušit výstrahu" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Konfigurace serveru", - "description": "Konfigurace URL serveru Termix pro připojení k vašim službám backendu", - "serverUrl": "URL serveru", - "enterServerUrl": "Zadejte adresu URL serveru", - "saveFailed": "Nepodařilo se uložit konfiguraci", - "saveError": "Chyba při ukládání konfigurace", - "saving": "Ukládání...", - "saveConfig": "Uložit konfiguraci", - "helpText": "Zadejte URL, kde běží váš Termix server (např. http://localhost:30001 nebo https://your-server.com)", - "changeServer": "Změnit server", - "mustIncludeProtocol": "Adresa URL serveru musí začínat http:// nebo https:////", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Povolit neplatný certifikát", "allowInvalidCertificateDesc": "Používejte pouze pro důvěryhodné servery s vlastním hostováním a certifikáty s vlastním podpisem nebo certifikáty IP adresy.", - "useEmbedded": "Použít místní server", - "embeddedDesc": "Spustit Termix s vestavěným lokálním serverem (nepotřebujete vzdálený server)", - "embeddedConnecting": "Připojování k lokálnímu serveru...", - "embeddedNotReady": "Místní server není ještě připravený. Počkejte prosím chvíli a zkuste to znovu.", - "localServer": "Místní server" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Odstranit" }, "versionCheck": { - "error": "Chyba kontroly verze", - "checkFailed": "Nepodařilo se zkontrolovat aktualizace", - "upToDate": "Aplikace je aktuální", - "currentVersion": "Používáte verzi {{version}}", - "updateAvailable": "Dostupná aktualizace", - "newVersionAvailable": "Je dostupná nová verze! Používáte {{current}}, ale {{latest}} je k dispozici.", - "betaVersion": "Beta verze", - "betaVersionDesc": "Používáte {{current}}, což je novější než poslední stabilní vydání {{latest}}.", - "releasedOn": "Vydáno v {{date}}", - "downloadUpdate": "Stáhnout aktualizaci", - "checking": "Kontrola aktualizací...", - "checkUpdates": "Zkontrolovat aktualizace", - "checkingUpdates": "Kontrola aktualizací...", - "updateRequired": "Vyžadována aktualizace" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Zavřít", + "close": "Close", "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Pokračovat", - "maintenance": "Údržba", - "degraded": "Rozklad", - "error": "Chyba", - "warning": "Varování", - "unsavedChanges": "Neuložené změny", - "dismiss": "Odmítnout", - "loading": "Načítám...", - "optional": "Nepovinné", - "connect": "Připojit", - "copied": "Zkopírováno", - "connecting": "Připojování...", - "updateAvailable": "Dostupná aktualizace", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Otevřít v nové kartě", - "noReleases": "Žádné vydání", - "updatesAndReleases": "Aktualizace a vydání", - "newVersionAvailable": "Je k dispozici nová verze ({{version}}).", - "failedToFetchUpdateInfo": "Nepodařilo se načíst informace o aktualizaci", - "preRelease": "Předběžné vydání", - "noReleasesFound": "Nebyly nalezeny žádné verze.", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", "cancel": "Zrušit", - "username": "Uživatelské jméno", - "login": "Přihlásit se", - "register": "Registrovat se", - "password": "Heslo", - "confirmPassword": "Potvrzení hesla", - "back": "Zpět", - "save": "Uložit", - "saving": "Ukládání...", - "delete": "Vymazat", - "rename": "Přejmenovat", - "edit": "Upravit", - "add": "Přidat", - "confirm": "Potvrdit", - "no": "Ne", - "or": "NEBO", - "next": "Další", - "previous": "Předchozí", - "refresh": "Aktualizovat", - "language": "Jazyk", - "checking": "Kontroluje...", - "checkingDatabase": "Kontrola připojení k databázi...", - "checkingAuthentication": "Kontrola ověřování...", - "backendReconnected": "Připojení k serveru obnoveno", - "connectionDegraded": "Připojení k serveru bylo ztraceno, obnovuje se…", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Odebrat", - "create": "Vytvořit", - "update": "Aktualizovat", - "copy": "Kopírovat", - "copyFailed": "Kopírování do schránky se nezdařilo", + "remove": "Odstranit", + "create": "Create", + "update": "Update", + "copy": "Kopie", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Obnovit", - "of": "z" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Domů", + "home": "Home", "terminal": "Terminál", - "docker": "Dokovací modul", - "tunnels": "Tunely", + "docker": "Přístavní dělník", + "tunnels": "Tunnels", "fileManager": "Správce souborů", - "serverStats": "Statistiky serveru", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "admin": "Admin", - "userProfile": "Profil uživatele", - "splitScreen": "Rozdělit obrazovku", - "confirmClose": "Zavřít tuto aktivní relaci?", - "close": "Zavřít", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", "cancel": "Zrušit", - "sshManager": "Správce SSH", - "cannotSplitTab": "Nelze rozdělit tuto kartu", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Kopírovat heslo", - "copySudoPassword": "Kopírovat heslo Sudo", - "passwordCopied": "Heslo zkopírováno do schránky", - "noPasswordAvailable": "Žádné heslo není k dispozici", - "failedToCopyPassword": "Kopírování hesla se nezdařilo", - "refreshTab": "Aktualizovat připojení", - "openFileManager": "Otevřít správce souborů", - "dashboard": "Nástěnka", - "networkGraph": "Graf sítě", - "quickConnect": "Rychlé připojení", - "sshTools": "Nástroje SSH", - "history": "Historie", - "hosts": "Hostitelé", - "snippets": "Úryvky", - "hostManager": "Správce hostitelů", - "credentials": "Pověření", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Připojení", - "roleAdministrator": "Administrátor", - "roleUser": "Uživatel" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Hostitelé", - "noHosts": "Žádné SSH hostitele", - "retry": "Opakovat", - "refresh": "Aktualizovat", - "optional": "Nepovinné", - "downloadSample": "Stáhnout vzorek", - "failedToDeleteHost": "Nepodařilo se odstranit {{name}}", - "importSkipExisting": "Import (existující přeskočení)", - "connectionDetails": "Detaily připojení", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Vzdálená plocha", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Uživatelské jméno", - "folder": "Složka", - "tags": "Štítky", - "pin": "Připnout", - "addHost": "Přidat hostitele", - "editHost": "Upravit hostitele", - "cloneHost": "Klonovat hostitele", - "enableTerminal": "Povolit terminál", - "enableTunnel": "Povolit tunel", - "enableFileManager": "Povolit správce souborů", - "enableDocker": "Povolit Docker", - "defaultPath": "Výchozí cesta", - "connection": "Připojení", - "upload": "Nahrát", - "authentication": "Ověření", - "password": "Heslo", - "key": "Klíč", - "credential": "Pověření", - "none": "Nic", - "sshPrivateKey": "SSH soukromý klíč", - "keyType": "Typ klíče", - "uploadFile": "Nahrát soubor", - "tabGeneral": "Obecná ustanovení", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", + "tabTerminal": "Terminál", + "tabRdp": "PRV", "tabVnc": "VNC", - "tabTunnels": "Tunely", - "tabDocker": "Dokovací modul", - "tabFiles": "Soubory", - "tabStats": "Statistiky", + "tabTunnels": "Tunnels", + "tabDocker": "Přístavní dělník", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Sdílení", - "tabAuthentication": "Ověření", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminál", "tunnel": "Tunel", "fileManager": "Správce souborů", - "serverStats": "Statistiky serveru", - "status": "Stav", - "folderRenamed": "Složka \"{{oldName}}\" byla úspěšně přejmenována na \"{{newName}}\"", - "failedToRenameFolder": "Složku se nepodařilo přejmenovat", - "movedToFolder": "Přesunuto do \"{{folder}}\"", - "editHostTooltip": "Upravit hostitele", - "statusChecks": "Kontrola stavu", - "metricsCollection": "Metrika kolekce", - "metricsInterval": "Interval sběru metrik", - "metricsIntervalDesc": "Jak často shromažďovat statistiky serveru (5s - 1h)", - "behavior": "Chování", - "themePreview": "Náhled vzhledu", - "theme": "Téma", - "fontFamily": "Rodina písma", + "serverStats": "Host Metrics", + "status": "Postavení", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Mezery písmen", - "lineHeight": "Výška řádku", - "cursorStyle": "Styl kurzoru", - "cursorBlink": "Blikání kurzoru", - "scrollbackBuffer": "Posunovací vyrovnávací paměť", - "bellStyle": "Styl zvonku", - "rightClickSelectsWord": "Slovo vybere pravým tlačítkem", - "fastScrollModifier": "Rychlý modifikátor rolování", - "fastScrollSensitivity": "Citlivost rychlého rolování", - "sshAgentForwarding": "SSH Agent přesměrování", - "backspaceMode": "Režim Backspace", - "startupSnippet": "Spustit úryvek", - "selectSnippet": "Vybrat úryvek", - "forceKeyboardInteractive": "Vynutit interaktivní klávesnici", - "overrideCredentialUsername": "Přepsat pověření uživatelské jméno", - "overrideCredentialUsernameDesc": "Použij výše uvedené uživatelské jméno místo uživatelského jména", - "jumpHostChain": "Poštovní řetězec skoku", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", - "addKnock": "Přidat port", - "addProxyNode": "Přidat uzel", - "proxyNode": "Proxy uzel", - "proxyType": "Typ proxy", - "quickActions": "Rychlé akce", - "sudoPasswordAutoFill": "Sudo heslo automatické vyplňování", - "sudoPassword": "Sudo heslo", - "keepaliveInterval": "Interval Keepalive (ms)", - "moshCommand": "Příkaz MOSH", - "environmentVariables": "Proměnné prostředí", - "addVariable": "Přidat proměnnou", - "docker": "Dokovací modul", - "copyTerminalUrl": "Kopírovat URL terminálu", - "copyFileManagerUrl": "Kopírovat URL správce souborů", - "copyRemoteDesktopUrl": "Kopírovat URL vzdálené plochy", - "failedToConnect": "Nepodařilo se připojit k konzoli", - "connect": "Připojit", - "disconnect": "Odpojit", - "start": "Začít", - "enableStatusCheck": "Povolit kontrolu stavu", - "enableMetrics": "Povolit metriku", - "bulkUpdateFailed": "Hromadná aktualizace selhala", - "selectAll": "Vybrat vše", - "deselectAll": "Zrušit výběr všech", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Přístavní dělník", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Bezpečná skořepina", - "virtualNetwork": "Virtuální síť", - "unencryptedShell": "Nešifrovaný shell", - "addressIp": "Adresa / IP", - "friendlyName": "Název přátel", - "folderAndAdvanced": "Složka & Rozšířené", - "privateNotes": "Soukromé poznámky", - "privateNotesPlaceholder": "Podrobnosti o tomto serveru...", - "pinToTop": "Připnout nahoru", - "pinToTopDesc": "Vždy zobrazit tohoto hostitele v horní části seznamu", - "portKnockingSequence": "Posloupnost portu Knocking", - "addKnockBtn": "Přidat Knock", - "noPortKnocking": "Není nakonfigurován žádný port.", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", "knockPort": "Knock Port", - "protocol": "Protocol", - "delayAfterMs": "Zpoždění po (ms)", - "useSocks5Proxy": "Použít SOCKS5 Proxy", - "useSocks5ProxyDesc": "Trasa připojení přes proxy server", - "proxyHost": "Proxy server", - "proxyPort": "Port proxy serveru", - "proxyUsername": "Proxy uživatelské jméno", - "proxyPassword": "Proxy heslo", - "proxySingleMode": "Jediný proxy", - "proxyChainMode": "Proxy řetězec", - "you": "Vy", - "jumpHostChainLabel": "Poštovní řetězec skoku", - "addJumpBtn": "Přidat skok", - "noJumpHosts": "Není nakonfigurován žádný skokový hostitel.", - "selectAServer": "Vyberte server...", - "sshPort": "SSH port", - "authMethod": "Metoda ověření", - "storedCredential": "Uložený autor", - "selectACredential": "Vyberte pověření...", - "keyTypeLabel": "Typ klíče", - "keyTypeAuto": "Automatické rozpoznání", - "keyPasteTab": "Vložit", - "keyUploadTab": "Nahrát", - "keyFileLoaded": "Klíčový soubor byl načten", - "keyUploadClick": "Klikněte pro nahrání .pem / .key / .ppk", - "clearKey": "Vymazat klíč", - "keySaved": "SSH klíč uložen", - "keyReplaceNotice": "pro nahrazení vložte nový klíč níže", - "keyPassphraseSaved": "Heslo bylo uloženo, zadejte pro změnu", - "replaceKey": "Nahradit klíč", - "forceKeyboardInteractiveLabel": "Vynutit interaktivitu klávesnice", - "forceKeyboardInteractiveShortDesc": "Vynutit zadání manuálního hesla, i když jsou přítomny klíče", - "terminalAppearance": "Vzhled terminálu", - "colorTheme": "Barevný motiv", - "fontFamilyLabel": "Rodina písma", + "protocol": "Protokol", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Styl kurzoru", - "letterSpacingPx": "Mezery písmen (px)", - "lineHeightLabel": "Výška řádku", - "bellStyleLabel": "Styl zvonku", - "backspaceModeLabel": "Režim Backspace", - "cursorBlinking": "Blikání kurzoru", - "cursorBlinkingDesc": "Povolit blikání animace pro koncový kurzor", - "rightClickSelectsWordLabel": "Vybere slovo pravým tlačítkem myši", - "rightClickSelectsWordShortDesc": "Vyberte slovo pod kurzorem na pravé tlačítko myši", - "behaviorAndAdvanced": "Chování a pokročilé", - "scrollbackBufferLabel": "Posunovací vyrovnávací paměť", - "scrollbackMaxLines": "Maximální počet řádků v historii", - "sshAgentForwardingLabel": "SSH Agent přesměrování", - "sshAgentForwardingShortDesc": "Předat lokální SSH klíče tomuto hostiteli", - "enableAutoMosh": "Povolit Auto-Mosh", - "enableAutoMoshDesc": "Preferovat Mosh nad SSH, pokud je k dispozici", - "enableAutoTmux": "Povolit Auto-Tmux", - "enableAutoTmuxDesc": "Automaticky spustit nebo připojit k tmux relaci", - "sudoPasswordAutoFillLabel": "Automatické vyplnění hesel Sudo", - "sudoPasswordAutoFillShortDesc": "Automaticky zadat heslo při vyzvání", - "sudoPasswordLabel": "Sudo heslo", - "environmentVariablesLabel": "Proměnné prostředí", - "addVariableBtn": "Přidat proměnnou", - "noEnvVars": "Nejsou nastaveny žádné proměnné prostředí.", - "fastScrollModifierLabel": "Rychlý modifikátor rolování", - "fastScrollSensitivityLabel": "Citlivost rychlého rolování", - "moshCommandLabel": "Příkaz Mosh", - "startupSnippetLabel": "Spustit snippet", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Interval udržování aktivity (sekundy)", - "maxKeepaliveMisses": "Maximální počet neúspěšných", - "tunnelSettings": "Nastavení tunelu", - "enableTunneling": "Povolit tunely", - "enableTunnelingDesc": "Povolit SSH tunelu pro tohoto hostitele", - "serverTunnelsSection": "Tuny serveru", - "addTunnelBtn": "Přidat tunel", - "noTunnelsConfigured": "Žádné tunely nastaveny.", - "tunnelLabel": "Tunel {{number}}", - "tunnelType": "Typ tunelu", - "tunnelModeLocalDesc": "Přeposlat lokální port na port na vzdáleném serveru (nebo hostiteli dosažitelný).", - "tunnelModeRemoteDesc": "Přeposlat port na vzdálený server zpět na místní port na vašem počítači.", - "tunnelModeDynamicDesc": "Vytvořte SOCKS5 proxy na místním portu pro dynamické přesměrování portů.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Tento hostitel (přímý tunel)", - "endpointHost": "Hostitel koncových bodů", - "endpointPort": "Port koncového bodu", - "bindHost": "Svázat hostitele", - "sourcePort": "Zdrojový port", - "maxRetries": "Maximální počet opakování", - "retryIntervalS": "Opakovat interval (s)", - "autoStartLabel": "Automatické spuštění", - "autoStartDesc": "Automaticky připojit tento tunel po načtení hostitele", - "tunnelConnecting": "Připojování tunelu...", - "tunnelDisconnected": "Tunel odpojen", - "failedToConnectTunnel": "Připojení se nezdařilo", - "failedToDisconnectTunnel": "Nepodařilo se odpojit", - "dockerIntegration": "Integrace Dockeru", - "enableDockerMonitor": "Povolit Docker", - "enableDockerMonitorDesc": "Sledovat a spravovat kontejnery na tomto hostiteli pomocí Dockeru", - "enableFileManagerMonitor": "Povolit správce souborů", - "enableFileManagerMonitorDesc": "Procházet a spravovat soubory na tomto hostiteli přes SFTP", - "defaultPathLabel": "Výchozí cesta", - "fileManagerPathHint": "Adresář, který se otevře při spuštění správce souborů pro tohoto hostitele.", - "statusChecksLabel": "Kontrola stavu", - "enableStatusChecks": "Povolit kontrolu stavu", - "enableStatusChecksDesc": "Pravidelně ping tohoto hostitele k ověření dostupnosti", - "useGlobalInterval": "Použít globální Interval", - "useGlobalIntervalDesc": "Přepsat interval kontroly stavu na serveru", - "checkIntervalS": "Interval kontroly (s)", - "checkIntervalDesc": "Sekund mezi každým pingem připojení", - "metricsCollectionLabel": "Metrika kolekce", - "enableMetricsLabel": "Povolit metriku", - "enableMetricsDesc": "Sbírat CPU, RAM, disky a využití sítě od tohoto hostitele", - "useGlobalMetrics": "Použít globální Interval", - "useGlobalMetricsDesc": "Přepsat metrický interval celého serveru", - "metricsIntervalS": "Interval (intervaly)", - "metricsIntervalDesc2": "Vteřiny mezi metrickými snímky", - "visibleWidgets": "Viditelné widgety", - "cpuUsageLabel": "Využití CPU", - "cpuUsageDesc": "Procenta CPU, průměrné zatížení, sparkline graf", - "memoryLabel": "Využití paměti", - "memoryDesc": "Použití RAM, výměna v mezipaměti", - "storageLabel": "Využití disku", - "storageDesc": "Využití disku na přípojný bod", - "networkLabel": "Síťová rozhraní", - "networkDesc": "Seznam rozhraní a šířka pásma", - "uptimeLabel": "Doba provozu", - "uptimeDesc": "Doba provozu a doba spuštění systému", - "systemInfoLabel": "Systémové informace", - "systemInfoDesc": "OS, jádro, název hostitele, architektura", - "recentLoginsLabel": "Poslední přihlášení", - "recentLoginsDesc": "Úspěšné a neúspěšné přihlášení", - "topProcessesLabel": "Nejlepší procesy", - "topProcessesDesc": "PID, CPU%, MEM%, příkaz", - "listeningPortsLabel": "Přístavy poslech", - "listeningPortsDesc": "Otevřít porty s procesem a stavem", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, status SELinux", - "quickActionsLabel": "Rychlé akce", - "quickActionsToolbar": "Rychlé akce se zobrazí jako tlačítka ve stavové liště serveru pro provedení příkazu jedním kliknutím.", - "noQuickActions": "Zatím žádné rychlé akce.", - "buttonLabel": "Popisek tlačítka", - "selectSnippetPlaceholder": "Vybrat snippet...", - "addActionBtn": "Přidat akci", - "hostSharedSuccessfully": "Hostitel úspěšně sdílen", - "failedToShareHost": "Nepodařilo se sdílet hostitele", - "accessRevoked": "Přístup zrušen", - "failedToRevokeAccess": "Nepodařilo se zrušit přístup", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", "cancelBtn": "Zrušit", - "savingBtn": "Ukládání...", - "addHostBtn": "Přidat hostitele", - "hostUpdated": "Hostitel byl aktualizován", - "hostCreated": "Hostitel vytvořen", - "failedToSave": "Nepodařilo se uložit hostitele", - "credentialUpdated": "Útvar aktualizován", - "credentialCreated": "Pověření vytvořeno", - "failedToSaveCredential": "Nepodařilo se uložit pověření", - "backToHosts": "Zpět na hostitele", - "backToCredentials": "Zpět na pověření", - "pinned": "Připnuté", - "noHostsFound": "Nenalezeny žádné hostitele", - "tryDifferentTerm": "Vyzkoušejte jiný výraz", - "addFirstHost": "Pro začátek přidejte svého prvního hostitele", - "noCredentialsFound": "Nebyly nalezeny žádné přihlašovací údaje", - "addCredentialBtn": "Přidat pověření", - "updateCredentialBtn": "Aktualizovat pověření", - "features": "Vlastnosti", - "noFolder": "(Žádná složka)", - "deleteSelected": "Vymazat", - "exitSelection": "Ukončit výběr", - "importSkip": "Import (existující přeskočení)", - "importOverwrite": "Importovat (přepsat)", - "collapseBtn": "Sbalit", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Připnuto", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Funkce", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", "importExportBtn": "Import / Export", - "hostStatusesRefreshed": "Stav hostitele obnoven", - "failedToRefreshHosts": "Nepodařilo se obnovit hostitele", - "movedHostTo": "Přesunuto {{host}} do \"{{folder}}\"", - "failedToMoveHost": "Přesun hostitele se nezdařil", - "folderRenamedTo": "Složka přejmenována na \"{{name}}\"", - "deletedFolder": "Smazaná složka \"{{name}}\"", - "failedToDeleteFolder": "Nepodařilo se odstranit složku", - "deleteAllInFolder": "Odstranit všechny hostitele v \"{{name}}\"? Tuto akci nelze vrátit zpět.", - "deletedHost": "Smazáno {{name}}", - "copiedToClipboard": "Zkopírováno do schránky", - "terminalUrlCopied": "URL adresa terminálu byla zkopírována", - "fileManagerUrlCopied": "URL správce souborů zkopírováno", - "tunnelUrlCopied": "URL tunelu zkopírována", - "dockerUrlCopied": "Adresa URL doku zkopírována", - "serverStatsUrlCopied": "URL statistiky serveru zkopírováno", - "rdpUrlCopied": "RDP URL zkopírováno", - "vncUrlCopied": "VNC URL zkopírováno", - "telnetUrlCopied": "URL adresa Telnet zkopírována", - "remoteDesktopUrlCopied": "URL vzdálené plochy zkopírována", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Zrušit", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Postavení", + "GroupByProtocol": "Protokol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Rozbalit akce", "collapseActions": "Akce sbalení", "wakeOnLanAction": "Probuzení přes LAN", - "wakeOnLanSuccess": "Magický balíček odeslán na {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Nepodařilo se odeslat magický paket", - "cloneHostAction": "Klonovat hostitele", - "copyAddress": "Kopírovat adresu", - "copyLink": "Kopírovat odkaz", - "copyTerminalUrlAction": "Kopírovat URL terminálu", - "copyFileManagerUrlAction": "Kopírovat URL správce souborů", - "copyTunnelUrlAction": "Kopírovat URL tunelu", - "copyDockerUrlAction": "Kopírovat URL Dockeru", - "copyServerStatsUrlAction": "Kopírovat URL statistiky serveru", - "copyRdpUrlAction": "Kopírovat URL RDP", - "copyVncUrlAction": "Kopírovat VNC URL", - "copyTelnetUrlAction": "Kopírovat URL Telnet", - "copyRemoteDesktopUrlAction": "Kopírovat URL vzdálené plochy", - "deleteCredentialConfirm": "Smazat pověření \"{{name}}\"?", - "deletedCredential": "Smazáno {{name}}", - "deploySSHKeyTitle": "Nasadit SSH klíč", - "deployingBtn": "Nasazování...", - "deployBtn": "Publikovat", - "failedToDeployKey": "Nepodařilo se nasadit klíč", - "deleteHostsConfirm": "Odstranit {{count}} hostitele{{plural}}? Tuto akci nelze vrátit zpět.", - "movedToRoot": "Přesunuto do root", - "failedToMoveHosts": "Přesunutí hostitelů se nezdařilo", - "enableTerminalFeature": "Povolit terminál", - "disableTerminalFeature": "Zakázat terminál", - "enableFilesFeature": "Povolit soubory", - "disableFilesFeature": "Zakázat soubory", - "enableTunnelsFeature": "Povolit tunely", - "disableTunnelsFeature": "Zakázat tunely", - "enableDockerFeature": "Povolit Docker", - "disableDockerFeature": "Zakázat Docker", - "addTagsPlaceholder": "Přidat štítky...", - "authDetails": "Podrobnosti o ověření", - "credType": "Typ", - "generateKeyPairDesc": "Generovat nové páry klíčů, soukromé i veřejné klíče budou vyplněny automaticky.", - "generatingKey": "Generování", - "generateLabel": "Generovat {{label}}", - "uploadFileBtn": "Nahrát soubor", - "keyPassphraseOptional": "Heslo klíče (volitelné)", - "sshPublicKeyOptional": "Veřejný klíč SSH (nepovinný)", - "publicKeyGenerated": "Vygenerovaný veřejný klíč", - "failedToGeneratePublicKey": "Nepodařilo se odvodit veřejný klíč", - "publicKeyCopied": "Veřejný klíč byl zkopírován", - "keyPairGenerated": "{{label}} vygenerovaný pár klíčů", - "failedToGenerateKeyPair": "Nepodařilo se vygenerovat pár klíčů", - "searchHostsPlaceholder": "Hledat hostitele, adresy, značky…", - "searchCredentialsPlaceholder": "Hledat přístupové údaje…", - "refreshBtn": "Aktualizovat", - "addTag": "Přidat štítky...", - "deleteConfirmBtn": "Vymazat", - "tunnelRequirementsText": "Server SSH musí mít GatewayPorts ano, AllowTcpForwarding ano a PermitRootLogin yes nastaveno v /etc/ssh/sshd_config.", - "deleteHostConfirm": "Smazat \"{{name}}\"?", - "enableAtLeastOneProtocol": "Povolte alespoň jeden protokol výše pro nastavení ověřování a připojení.", - "keyPassphrase": "Heslo klíče", - "connectBtn": "Připojit", - "disconnectBtn": "Odpojit", - "basicInformation": "Základní informace", - "authDetailsSection": "Podrobnosti o ověření", - "credTypeLabel": "Typ", - "hostsTab": "Hostitelé", - "credentialsTab": "Pověření", - "selectMultiple": "Vybrat více", - "selectHosts": "Vybrat hostitele", - "connectionLabel": "Připojení", - "authenticationLabel": "Ověření", - "generateKeyPairTitle": "Generovat párování klíče", - "generateKeyPairDescription": "Generovat nové páry klíčů, soukromé i veřejné klíče budou vyplněny automaticky.", - "generateFromPrivateKey": "Generovat ze soukromého klíče", - "refreshBtn2": "Aktualizovat", - "exitSelectionTitle": "Ukončit výběr", - "exportAll": "Exportovat vše", - "addHostBtn2": "Přidat hostitele", - "addCredentialBtn2": "Přidat pověření", - "checkingHostStatuses": "Kontrola stavu hostitele...", - "pinnedSection": "Připnuté", - "hostsExported": "Hostitelé úspěšně exportováni", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Připnuto", + "hostsExported": "Hosts exported successfully", "exportFailed": "Export hostitelů se nezdařilo", - "sampleDownloaded": "Ukázkový soubor stažen", - "failedToDeleteCredential2": "Nepodařilo se odstranit pověření", - "noFolderOption": "(Žádná složka)", - "nSelected": "{{count}} vybrán", - "featuresMenu": "Vlastnosti", - "moveMenu": "Přesunout", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Funkce", + "moveMenu": "Pohyb", + "connectSelected": "Connect", "cancelSelection": "Zrušit", - "deployDialogDesc": "Nasadit {{name}} do autorizovaných klíčů hostitele.", - "targetHostLabel": "Hostitel cíle", - "selectHostOption": "Vyberte hostitele...", - "keyDeployedSuccess": "Klíč byl úspěšně vložen", - "failedToDeployKey2": "Nepodařilo se nasadit klíč", - "deletedCount": "Smazáno {{count}} hostitelů", - "failedToDeleteCount": "Nepodařilo se odstranit {{count}} hostitele", - "duplicatedHost": "Duplikováno \"{{name}} \" \"", - "failedToDuplicateHost": "Duplikace hostitele se nezdařila", - "updatedCount": "Aktualizováno {{count}} hostitelů", - "friendlyNameLabel": "Název přátel", - "descriptionLabel": "L 343, 22.12.2009, s. 1).", - "loadingHost": "Načítání hostitele...", - "loadingHosts": "Načítání hostitelů...", - "loadingCredentials": "Načítání pověření...", - "noHostsYet": "Zatím žádné hostitele", - "noHostsMatchSearch": "Žádné hostitele neodpovídají vašemu hledání", - "hostNotFound": "Hostitel nenalezen", - "searchHosts": "Hledat v hostech...", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Seřadit hostitele", "sortDefault": "Výchozí pořadí", "sortNameAsc": "Jméno (A → Z)", @@ -590,10 +755,10 @@ "filterOffline": "Offline", "filterPinned": "Připnuto", "filterAuthGroup": "Typ autorizace", - "filterAuthPassword": "Heslo", - "filterAuthKey": "SSH klíč", - "filterAuthCredential": "Pověření", - "filterAuthNone": "Žádný", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", "filterProtocolGroup": "Protokol", "filterProtocolSsh": "SSH", @@ -605,190 +770,205 @@ "filterFeatureFileManager": "Správce souborů", "filterFeatureTunnel": "Tunel", "filterFeatureDocker": "Přístavní dělník", - "filterTagsGroup": "Štítky", - "shareHost": "Sdílet hostitele", - "shareHostTitle": "Sdílet: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Tento hostitel musí použít pověření k povolení sdílení. Upravte hostitele a nejprve přiřaďte pověření jako první." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Připojení", - "authentication": "Ověření", - "connectionSettings": "Nastavení připojení", - "displaySettings": "Nastavení zobrazení", - "audioSettings": "Nastavení zvuku", - "rdpPerformance": "Výkon RDP", - "deviceRedirection": "Přesměrování zařízení", - "session": "Relace", - "gateway": "Brána", - "remoteApp": "Vzdálená aplikace", - "clipboard": "Schránka", - "sessionRecording": "Záznam relace", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Nastavení VNC", - "terminalSettings": "Nastavení terminálu", - "rdpPort": "RDP port", - "username": "Uživatelské jméno", - "password": "Heslo", - "domain": "Doména", - "securityMode": "Bezpečnostní režim", - "colorDepth": "Hloubka barev", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Výška", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Metoda změny velikosti", - "clientName": "Název klienta", - "initialProgram": "Počáteční program", - "serverLayout": "Rozložení serveru", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Port brány", - "gatewayUsername": "Uživatelské jméno brány", - "gatewayPassword": "Heslo brány", - "gatewayDomain": "Doména brány", - "remoteAppProgram": "Program RemoteApp", - "workingDirectory": "Pracovní adresář", - "arguments": "Argumenty", - "normalizeLineEndings": "Normalizovat konce řádků", - "recordingPath": "Cesta k nahrávání", - "recordingName": "Název záznamu", - "macAddress": "MAC adresa", - "broadcastAddress": "Vysílací adresa", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Čas čekání (s)", - "driveName": "Název disku", - "drivePath": "Cesta k disku", - "ignoreCertificate": "Ignorovat certifikát", - "ignoreCertificateDesc": "Povolit spojení hostiteli s certifikáty podepsanými vlastními", - "forceLossless": "Vynutit ztrátu", - "forceLosslessDesc": "Vynutit bezztrátové kódování obrázků (vyšší kvalita, větší šířka pásma)", - "disableAudio": "Zakázat zvuk", - "disableAudioDesc": "Ztlumit všechny zvuky ze vzdálené relace", - "enableAudioInput": "Povolit vstup zvuku (Micropfon)", - "enableAudioInputDesc": "Přeposlat lokální mikrofon do vzdálené relace", - "wallpaper": "Tapeta", - "wallpaperDesc": "Zobrazit tapetu plochy (vypnutí zlepšuje výkon)", - "theming": "Motivy", - "themingDesc": "Povolit vizuální motivy a styly", - "fontSmoothing": "Vyhlazování písma", - "fontSmoothingDesc": "Povolit vykreslování písma ClearType", - "fullWindowDrag": "Přetažení celého okna", - "fullWindowDragDesc": "Zobrazit obsah okna při přetažení", - "desktopComposition": "Složení plochy", - "desktopCompositionDesc": "Povolit efekty Aero skla", - "menuAnimations": "Animace menu", - "menuAnimationsDesc": "Povolit prolínání nabídky a animace snímků", - "disableBitmapCaching": "Vypnout mezipaměť bitmap", - "disableBitmapCachingDesc": "Vypnout vyrovnávací paměť bitmap (může pomoci s rukávy)", - "disableOffscreenCaching": "Zakázat ukládání do mezipaměti mimo obrazovku", - "disableOffscreenCachingDesc": "Vypnout vyrovnávací paměť mimo obrazovku", - "disableGlyphCaching": "Zakázat ukládání do mezipaměti Glyph", - "disableGlyphCachingDesc": "Vypnout cache glyph", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Použít vzdálené grafické potrubí", - "enablePrinting": "Povolit tisk", - "enablePrintingDesc": "Přesměrovat místní tiskárny na vzdálenou relaci", - "enableDriveRedirection": "Povolit přesměrování disku", - "enableDriveRedirectionDesc": "Mapa místní složky jako disk ve vzdálené relaci", - "createDrivePath": "Vytvořit cestu k disku", - "createDrivePathDesc": "Automaticky vytvořit složku, pokud neexistuje", - "disableDownload": "Zakázat stahování", - "disableDownloadDesc": "Zabránit stahování souborů ze vzdálené relace", - "disableUpload": "Zakázat nahrávání", - "disableUploadDesc": "Zabránit nahrávání souborů do vzdálené relace", - "enableTouch": "Povolit dotyk", - "enableTouchDesc": "Povolit přesměrování dotyku", - "consoleSession": "Relace konzole", - "consoleSessionDesc": "Připojit ke konzoli (relace 0) místo nové relace", - "sendWolPacket": "Poslat WOL paket", - "sendWolPacketDesc": "Poslat kouzelný paket probudit tohoto hostitele před připojením", - "disableCopy": "Zakázat kopírování", - "disableCopyDesc": "Zabránit kopírování textu ze vzdálené relace", - "disablePaste": "Zakázat vložení", - "disablePasteDesc": "Zabránit vkládání textu do vzdálené relace", - "createPathIfMissing": "Vytvořit cestu, pokud chybí", - "createPathIfMissingDesc": "Automaticky vytvořit adresář pro nahrávání", - "excludeOutput": "Vynechat výstup", - "excludeOutputDesc": "Nezaznamenávat výstup obrazovky (pouze metadata)", - "excludeMouse": "Vyloučit myš", - "excludeMouseDesc": "Nezaznamenávat pohyby myší", - "includeKeystrokes": "Zahrnout čáry kláves", - "includeKeystrokesDesc": "Zaznamenávat kromě výstupu obrazovky tahy kláves", - "vncPort": "VNC port", - "vncPassword": "VNC heslo", - "vncUsernameOptional": "Uživatelské jméno (volitelné)", - "vncLeaveBlank": "Ponechte prázdné, pokud není požadováno", - "cursorMode": "Režim kurzoru", - "swapRedBlue": "Prohodit červenou/modrou", - "swapRedBlueDesc": "Prohodit kanály červené a modré barvy (opraví některé problémy s barvou)", - "readOnly": "Pouze pro čtení", - "readOnlyDesc": "Zobrazit vzdálenou obrazovku bez odeslání vstupu", - "telnetPort": "Port Telnet", - "terminalType": "Typ terminálu", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Barevné schéma", - "backspaceKey": "Klíč Backspace", - "saveHostFirst": "Nejdříve uložte hostitele.", - "sharingOptionsAfterSave": "Možnosti sdílení jsou dostupné po uložení hostitele.", - "sharingLoadError": "Nepodařilo se načíst sdílená data. Zkontrolujte připojení a zkuste to znovu.", - "shareHostSection": "Sdílet hostitele", - "shareWithUser": "Sdílet s uživatelem", - "shareWithRole": "Sdílet s rolí", - "selectUser": "Vybrat uživatele", - "selectRole": "Vybrat roli", - "selectUserOption": "Vyberte uživatele...", - "selectRoleOption": "Vyberte roli...", - "permissionLevel": "Úroveň oprávnění", - "expiresInHours": "Vyprší za hodiny", - "noExpiryPlaceholder": "Ponechte prázdné pro vypršení platnosti", - "shareBtn": "Sdílet", - "currentAccess": "Aktuální přístup", - "typeHeader": "Typ", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Právo", - "grantedByHeader": "Uděleno", - "expiresHeader": "Vyprší", - "noAccessEntries": "Zatím žádné přístupové položky.", - "expiredLabel": "Vypršela platnost", - "neverLabel": "Nikdy", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", "cancelBtn": "Zrušit", - "savingBtn": "Ukládání...", - "updateHostBtn": "Hostitel aktualizace", - "addHostBtn": "Přidat hostitele" + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Hledat hostitele, příkazy nebo nastavení...", - "quickActions": "Rychlé akce", - "hostManager": "Správce hostitelů", - "hostManagerDesc": "Spravovat, přidávat nebo upravovat hostitele", - "addNewHost": "Přidat nového hostitele", - "addNewHostDesc": "Registrovat nového hostitele", - "adminSettings": "Nastavení správce", - "adminSettingsDesc": "Konfigurace systémových preferencí a uživatelů", - "userProfile": "Profil uživatele", - "userProfileDesc": "Spravujte svůj účet a nastavení", - "addCredential": "Přidat pověření", - "addCredentialDesc": "Uložit SSH klíče nebo hesla", - "recentActivity": "Nedávná aktivita", - "serversAndHosts": "Servery a hostitelé", - "noHostsFound": "Nenalezen žádný hostitel \"{{search}}\"", - "links": "Odkazy", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Vybrat", - "toggleWith": "Přepnout na" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Žádná karta nebyla přiřazena", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktivní panel" }, "connections": { "noConnections": "Žádné spojení", "noConnectionsDesc": "Otevřete terminál, správce souborů nebo vzdálenou plochu a zobrazte zde připojení.", - "connectedFor": "Připojeno pro {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Připojeno", "disconnected": "Odpojeno", "closeTab": "Zavřít kartu", @@ -801,358 +981,374 @@ "sectionBackground": "Pozadí", "backgroundDesc": "Relace přetrvávají 30 minut po odpojení a lze je znovu připojit.", "persisted": "Přetrvává v pozadí", - "expiresIn": "Platnost vyprší za {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Hledat spojení...", - "noSearchResults": "Vašemu vyhledávání neodpovídají žádná spojení" + "noSearchResults": "Vašemu vyhledávání neodpovídají žádná spojení", + "rename": "Rename session" }, "guacamole": { - "connecting": "Připojování k {{type}} relaci...", - "connectionError": "Chyba připojení", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Připojení se nezdařilo", - "failedToConnect": "Nepodařilo se získat token pro připojení", - "hostNotFound": "Hostitel nenalezen", - "noHostSelected": "Nebyl vybrán žádný hostitel", - "reconnect": "Znovu připojit", - "retry": "Opakovat", - "guacdUnavailable": "Vzdálená stolní služba (guacd) není k dispozici. Ujistěte se, že guacd běží a je správně dostupný a konfigurovaný v nastavení správce.", - "ctrlAltDel": "Ctrl + Alt+Del", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Znovu se připojte", + "retry": "Retry", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", + "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { - "ctrlAltDel": "Ctrl + Alt+Del", - "winL": "Win+L (nárazová obrazovka)", - "winKey": "Windows klíč", + "ctrlAltDel": "Ctrl+Alt+Del", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Přesunout", - "win": "Výhra", - "stickyActive": "{{key}} (zavřeno - klikněte pro vydání)", - "stickyInactive": "{{key}} (klikněte pro lati)", - "esc": "Úniky", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Domů", - "end": "Ukončit", - "pageUp": "Stránka nahoru", - "pageDown": "Stránka dolů", - "arrowUp": "Šipka nahoru", - "arrowDown": "Šipka dolů", - "arrowLeft": "Šipka vlevo", - "arrowRight": "Šipka vpravo", - "fnToggle": "Funkční klíče", - "reconnect": "Znovu připojit relaci", - "collapse": "Sbalit panel nástrojů", - "expand": "Rozbalit panel nástrojů", - "dragHandle": "Přetažením změnit pozici" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Připojit k hostiteli", - "clear": "Vyčistit", - "paste": "Vložit", - "reconnect": "Znovu připojit", - "connectionLost": "Spojení ztraceno", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Znovu se připojte", + "connectionLost": "Connection lost", "connected": "Připojeno", - "clipboardWriteFailed": "Kopírování do schránky se nezdařilo. Ujistěte se, že stránka je vedena přes HTTPS nebo localhost.", - "clipboardReadFailed": "Nepodařilo se přečíst ze schránky. Ujistěte se, že máte oprávnění na schránku.", - "clipboardHttpWarning": "Vložit vyžaduje HTTPS. Použijte Ctrl+Shift+V nebo použijte Termix přes HTTPS.", - "unknownError": "Došlo k neznámé chybě", - "websocketError": "Chyba připojení k WebSocket", - "connecting": "Připojování...", - "noHostSelected": "Nebyl vybrán žádný hostitel", - "reconnecting": "Znovu se připojuji... ({{attempt}}/{{max}})", - "reconnected": "Znovu připojeno", - "tmuxSessionCreated": "Tmux relace vytvořena: {{name}}", - "tmuxSessionAttached": "připojena relace tmuxu: {{name}}", - "tmuxUnavailable": "tmux není na vzdáleném hostiteli nainstalován, vrátí se zpět na standardní shell", - "tmuxSessionPickerTitle": "tmux relace", - "tmuxSessionPickerDesc": "Existující tmux relace nalezeny na tomto hostiteli. Vyberte jednu pro připojení nebo vytvoření nové relace.", - "tmuxWindows": "Okna", - "tmuxWindowCount": "Okno {{count}}", - "tmuxAttached": "Připojení klienti", - "tmuxAttachedCount": "{{count}} připojeno", - "tmuxLastActivity": "Poslední aktivita", - "tmuxTimeJustNow": "právě teď", - "tmuxTimeMinutes": "{{count}}před m", - "tmuxTimeHours": "{{count}}před hodinami", - "tmuxTimeDays": "Před {{count}}dny", - "tmuxCreateNew": "Začít novou relaci", - "tmuxCopyHint": "Upravte výběr a stiskněte klávesu Enter pro kopírování do schránky", - "tmuxDetach": "Odpojit od tmux relace", - "tmuxDetached": "Odpojeno od tmux relace", - "maxReconnectAttemptsReached": "Dosažen maximální počet pokusů o opětovné připojení", - "closeTab": "Zavřít", - "connectionTimeout": "Časový limit připojení", - "terminalTitle": "Terminál - {{host}}", - "terminalWithPath": "Terminál - {{host}}:{{path}}", - "runTitle": "Běží {{command}} - {{host}}", - "totpRequired": "Vyžadováno dvoufaktorové ověření", - "totpCodeLabel": "Ověřovací kód", - "totpVerify": "Ověřit", - "warpgateAuthRequired": "Vyžadováno ověření Warpgate", - "warpgateSecurityKey": "Bezpečnostní klíč", - "warpgateAuthUrl": "Ověřovací URL", - "warpgateOpenBrowser": "Otevřít v prohlížeči", - "warpgateContinue": "Dokončil jsem ověření", - "opksshAuthRequired": "Vyžadováno ověření OPKSSH", - "opksshAuthDescription": "Dokončete ověření ve vašem prohlížeči, abyste mohli pokračovat. Tato relace zůstane v platnosti 24 hodin.", - "opksshOpenBrowser": "Otevřete prohlížeč pro ověření", - "opksshWaitingForAuth": "Čekání na ověřování v prohlížeči...", - "opksshAuthenticating": "Zpracovávání ověřování...", - "opksshTimeout": "Vypršel časový limit ověření. Zkuste to prosím znovu.", - "opksshAuthFailed": "Ověření se nezdařilo. Zkontrolujte prosím vaše přihlašovací údaje a zkuste to znovu.", - "opksshSignInWith": "Přihlásit se pomocí {{provider}}", - "sudoPasswordPopupTitle": "Vložit heslo?", - "websocketAbnormalClose": "Připojení bylo neočekávaně uzavřeno. Může to být způsobeno problémy s konfigurací reverzního proxy nebo SSL. Zkontrolujte protokoly serveru.", - "connectionLogTitle": "Protokol připojení", - "connectionLogCopy": "Kopírovat protokoly do schránky", - "connectionLogEmpty": "Zatím žádné protokoly připojení", - "connectionLogWaiting": "Čekání na protokoly připojení...", - "connectionLogCopied": "Záznamy kontaktů zkopírovány do schránky", - "connectionLogCopyFailed": "Kopírování protokolů do schránky se nezdařilo", - "connectionRejected": "Připojení odmítnuto serverem. Zkontrolujte prosím ověření a nastavení sítě.", - "hostKeyRejected": "Ověření SSH hostitele bylo zamítnuto. Připojení bylo zrušeno.", - "sessionTakenOver": "Relace byla otevřena v jiné kartě. Znovu připojuji..." + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "OTEVŘENO", + "linkDialogCopy": "Kopie", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Rozdělit kartu", + "addToSplit": "Přidat do Splitu", + "removeFromSplit": "Odebrat ze Splitu" + } }, "fileManager": { - "noHostSelected": "Nebyl vybrán žádný hostitel", - "initializingEditor": "Inicializace editoru...", - "file": "Soubor", - "folder": "Složka", - "uploadFile": "Nahrát soubor", - "downloadFile": "Stáhnout", - "extractArchive": "Rozbalit archiv", - "extractingArchive": "Rozbaluji {{name}}...", - "archiveExtractedSuccessfully": "{{name}} byla úspěšně extrahována", - "extractFailed": "Extrahování se nezdařilo", - "compressFile": "Komprimovat soubor", - "compressFiles": "Komprimovat soubory", - "compressFilesDesc": "Komprimovat {{count}} položky do archivu", - "archiveName": "Název archivu", - "enterArchiveName": "Zadejte název archivu...", - "compressionFormat": "Formát komprese", - "selectedFiles": "Vybrané soubory", - "andMoreFiles": "a {{count}} další...", - "compress": "Komprimovat", - "compressingFiles": "Komprimování {{count}} položek do {{name}}...", - "filesCompressedSuccessfully": "{{name}} úspěšně vytvořen", - "compressFailed": "Komprese selhala", - "edit": "Upravit", - "preview": "Náhled", - "previous": "Předchozí", - "next": "Další", - "pageXOfY": "Strana {{current}} z {{total}}", - "zoomOut": "Oddálit", - "zoomIn": "Přiblížit", - "newFile": "Nový soubor", - "newFolder": "Nová složka", - "rename": "Přejmenovat", - "uploading": "Nahrávám...", - "uploadingFile": "Nahrávání {{name}}...", - "fileName": "Název souboru", - "folderName": "Název složky", - "fileUploadedSuccessfully": "Soubor \"{{name}}\" byl úspěšně nahrán", - "failedToUploadFile": "Nepodařilo se nahrát soubor", - "fileDownloadedSuccessfully": "Soubor \"{{name}}\" byl úspěšně stažen", - "failedToDownloadFile": "Nepodařilo se stáhnout soubor", - "fileCreatedSuccessfully": "Soubor \"{{name}}\" byl úspěšně vytvořen", - "folderCreatedSuccessfully": "Složka \"{{name}}\" byla úspěšně vytvořena", - "failedToCreateItem": "Nepodařilo se vytvořit položku", - "operationFailed": "Operace {{operation}} se nezdařila pro {{name}}: {{error}}", - "failedToResolveSymlink": "Nepodařilo se vyřešit symbolický odkaz", - "itemsDeletedSuccessfully": "{{count}} položky byly úspěšně odstraněny", - "failedToDeleteItems": "Odstranění položek se nezdařilo", - "sudoPasswordRequired": "Vyžadováno heslo administrátora", - "enterSudoPassword": "Pro pokračování v této operaci zadejte heslo", - "sudoPassword": "Sudo heslo", - "sudoOperationFailed": "Operace Sudo selhala", - "sudoAuthFailed": "Sudo ověření se nezdařilo", - "dragFilesToUpload": "Pro nahrání přetáhněte soubory sem", - "emptyFolder": "Tato složka je prázdná", - "searchFiles": "Hledat soubory...", - "upload": "Nahrát", - "selectHostToStart": "Vyberte hostitele pro spuštění správy souborů", - "sshRequiredForFileManager": "Správce souborů vyžaduje SSH. Tento server nemá povoleno SSH.", - "failedToConnect": "Nepodařilo se připojit k SSH", - "failedToLoadDirectory": "Nepodařilo se načíst adresář", - "noSSHConnection": "Není k dispozici žádné SSH připojení", - "copy": "Kopírovat", - "cut": "Vyjmout", - "paste": "Vložit", - "copyPath": "Kopírovat cestu", - "copyPaths": "Kopírovat cesty", - "delete": "Vymazat", - "properties": "Vlastnosti", - "refresh": "Aktualizovat", - "downloadFiles": "Stáhnout {{count}} soubory do prohlížeče", - "copyFiles": "Kopírovat {{count}} položky", - "cutFiles": "Vyjmout {{count}} položek", - "deleteFiles": "Odstranit položky {{count}}", - "filesCopiedToClipboard": "{{count}} položky zkopírovány do schránky", - "filesCutToClipboard": "{{count}} položky oříznuty do schránky", - "pathCopiedToClipboard": "Cesta zkopírována do schránky", - "pathsCopiedToClipboard": "{{count}} cesty zkopírovány do schránky", - "failedToCopyPath": "Nepodařilo se zkopírovat cestu do schránky", - "movedItems": "Přesunuto {{count}} položek", - "failedToDeleteItem": "Odstranění položky se nezdařilo", - "itemRenamedSuccessfully": "{{type}} úspěšně přejmenován", - "failedToRenameItem": "Nepodařilo se přejmenovat položku", - "download": "Stáhnout", - "permissions": "Práva", - "size": "Velikost", - "modified": "Upraveno", - "path": "Cesta", - "confirmDelete": "Jste si jisti, že chcete odstranit {{name}}?", - "permissionDenied": "Oprávnění odepřeno", - "serverError": "Chyba serveru", - "fileSavedSuccessfully": "Soubor byl úspěšně uložen", - "failedToSaveFile": "Nepodařilo se uložit soubor", - "confirmDeleteSingleItem": "Jste si jisti, že chcete trvale odstranit \"{{name}}\"?", - "confirmDeleteMultipleItems": "Jste si jisti, že chcete trvale odstranit {{count}} položky?", - "confirmDeleteMultipleItemsWithFolders": "Opravdu chcete trvale odstranit {{count}} položky? To zahrnuje složky a jejich obsah.", - "confirmDeleteFolder": "Jste si jisti, že chcete trvale odstranit složku \"{{name}}\" a její obsah?", - "permanentDeleteWarning": "Tuto akci nelze vrátit zpět. Položka (položky) bude trvale odstraněna ze serveru.", - "recent": "Nedávné", - "pinned": "Připnuté", - "folderShortcuts": "Zástupce složky", - "failedToReconnectSSH": "Nepodařilo se znovu připojit SSH relaci", - "openTerminalHere": "Otevřít terminál", - "run": "Spustit", - "openTerminalInFolder": "Otevřít terminál v této složce", - "openTerminalInFileLocation": "Otevřít terminál v umístění souboru", - "runningFile": "Spuštěno - {{file}}", - "onlyRunExecutableFiles": "Spouštěcí soubory lze spustit pouze", - "directories": "Adresáře", - "removedFromRecentFiles": "Odstraněno \"{{name}}\" z nedávných souborů", - "removeFailed": "Odstranění se nezdařilo", - "unpinnedSuccessfully": "Zrušeno \"{{name}}\" úspěšně", - "unpinFailed": "Odepnutí se nezdařilo", - "removedShortcut": "Odstraněný zástupce \"{{name}} \" \" \"", - "removeShortcutFailed": "Odstranění zástupce se nezdařilo", - "clearedAllRecentFiles": "Vymazány všechny nedávné soubory", - "clearFailed": "Vymazání se nezdařilo", - "removeFromRecentFiles": "Odstranit z nedávných souborů", - "clearAllRecentFiles": "Vymazat všechny nedávné soubory", - "unpinFile": "Odepnout soubor", - "removeShortcut": "Odstranit zástupce", - "pinFile": "Připnout soubor", - "addToShortcuts": "Přidat do zkratek", - "pasteFailed": "Vložení se nezdařilo", - "noUndoableActions": "Žádné nedělitelné akce", - "undoCopySuccess": "Chyba kopírování: Odstraněno {{count}} zkopírováno soubory", - "undoCopyFailedDelete": "Zpět se nezdařilo: Nelze odstranit žádné zkopírované soubory", - "undoCopyFailedNoInfo": "Zpět se nezdařilo: Nelze najít zkopírované informace", - "undoMoveSuccess": "Neprovedená operace: Přesunuto {{count}} soubory zpět do původního umístění", - "undoMoveFailedMove": "Zpět se nezdařilo: Nelze přesunout žádné soubory zpět", - "undoMoveFailedNoInfo": "Zpět se nezdařilo: Informace o přesunu souboru nelze najít", - "undoDeleteNotSupported": "Nelze vrátit zpět: Soubory byly trvale odstraněny ze serveru", - "undoTypeNotSupported": "Nepodporovaný typ operace", - "undoOperationFailed": "Vrátit zpět operaci selhala", - "unknownError": "Neznámá chyba", - "confirm": "Potvrdit", - "find": "Najít...", - "replace": "Nahradit", - "downloadInstead": "Stáhnout místo", - "keyboardShortcuts": "Klávesové zkratky", - "searchAndReplace": "Hledat a nahradit", - "editing": "Úprava", - "search": "Hledat", - "findNext": "Najít další", - "findPrevious": "Najít předchozí", - "save": "Uložit", - "selectAll": "Vybrat vše", - "undo": "Zpět", - "redo": "Znovu", - "moveLineUp": "Posunout řádek nahoru", - "moveLineDown": "Posunout řádek dolů", - "toggleComment": "Přepnout komentář", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Kopie", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Připnuto", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Nepodařilo se načíst obrázek", - "startTyping": "Začněte psát...", - "unknownSize": "Neznámá velikost", - "fileIsEmpty": "Soubor je prázdný", - "largeFileWarning": "Varování o velkém souboru", - "largeFileWarningDesc": "Tento soubor má velikost {{size}} , což může způsobit problémy s výkonem při otevření jako text.", - "fileNotFoundAndRemoved": "Soubor \"{{name}}\" nebyl nalezen a byl odstraněn z nedávných/připnutých souborů", - "failedToLoadFile": "Nepodařilo se načíst soubor: {{error}}", - "serverErrorOccurred": "Došlo k chybě serveru. Opakujte akci později.", - "autoSaveFailed": "Automatické ukládání se nezdařilo", - "fileAutoSaved": "Soubor automaticky uložen", - "moveFileFailed": "Přesun {{name}} se nezdařil", - "moveOperationFailed": "Přesunutí se nezdařilo", - "canOnlyCompareFiles": "Lze porovnat pouze dva soubory", - "comparingFiles": "Srovnávací soubory: {{file1}} a {{file2}}", - "dragFailed": "Přetažení se nezdařilo", - "filePinnedSuccessfully": "Soubor \"{{name}}\" byl úspěšně připnut", - "pinFileFailed": "Nepodařilo se připnout soubor", - "fileUnpinnedSuccessfully": "Soubor \"{{name}}\" byl úspěšně odepnut", - "unpinFileFailed": "Nepodařilo se uvolnit soubor", - "shortcutAddedSuccessfully": "Zástupce složky \"{{name}}\" byl úspěšně přidán", - "addShortcutFailed": "Nepodařilo se přidat zástupce", - "operationCompletedSuccessfully": "{{operation}} {{count}} položek úspěšně", - "operationCompleted": "{{operation}} {{count}} položek", - "downloadFileSuccess": "Soubor {{name}} byl úspěšně stažen", - "downloadFileFailed": "Stahování se nezdařilo", - "moveTo": "Přesunout do {{name}}", - "diffCompareWith": "Diff porovnání s {{name}}", - "dragOutsideToDownload": "Přetáhněte mimo okno ke stažení ({{count}} souborů)", - "newFolderDefault": "Nová složka", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Položky {{count}} byly úspěšně přesunuty do {{target}}", - "move": "Přesunout", - "searchInFile": "Hledat v souboru (Ctrl+F)", - "showKeyboardShortcuts": "Zobrazit klávesové zkratky", - "startWritingMarkdown": "Začněte psát svůj markdown obsah...", - "loadingFileComparison": "Načítání porovnání souborů...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Pohyb", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Porovnat", - "sideBySide": "Boční strana", - "inline": "Řádek", - "fileComparison": "Porovnání souborů: {{file1}} vs {{file2}}", - "fileTooLarge": "Soubor je příliš velký: {{error}}", - "sshConnectionFailed": "Připojení SSH se nezdařilo. Zkontrolujte připojení k {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Nepodařilo se načíst soubor: {{error}}", - "connecting": "Připojování...", - "connectedSuccessfully": "Úspěšně připojeno", - "totpVerificationFailed": "Ověření TOTP se nezdařilo", - "warpgateVerificationFailed": "Ověření Warpgatu se nezdařilo", - "authenticationFailed": "Ověření se nezdařilo", - "verificationCodePrompt": "Ověřovací kód:", - "changePermissions": "Změnit oprávnění", - "currentPermissions": "Aktuální oprávnění", - "owner": "Vlastník", - "group": "Skupina", - "others": "Okurky salátové", - "read": "Číst", - "write": "Napsat", - "execute": "Spustit", - "permissionsChangedSuccessfully": "Oprávnění úspěšně změněna", - "failedToChangePermissions": "Změna oprávnění se nezdařila", - "name": "Název", - "sortByName": "Název", - "sortByDate": "Datum úpravy", - "sortBySize": "Velikost", - "ascending": "Vzestupně", - "descending": "sestupně", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Root", - "new": "Nové", - "sortBy": "Seřadit podle", - "items": "Položky", - "selected": "Vybrané", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", "editor": "Editor", - "octal": "Októra", - "storage": "Úložiště", + "octal": "Octal", + "storage": "Storage", "disk": "Disk", - "used": "Použité", - "of": "z", - "toggleSidebar": "Přepnout postranní panel", - "cannotLoadPdf": "Nelze načíst PDF", - "pdfLoadError": "Při načítání tohoto PDF souboru došlo k chybě.", - "loadingPdf": "Načítání PDF...", - "loadingPage": "Načítání stránky..." + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopírovat na hostitele…", - "moveToHost": "Přesunout na hostitele…", - "copyItemsToHost": "Zkopírovat {{count}} položek pro hostování…", - "moveItemsToHost": "Přesunout {{count}} položek na hostitele…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Žádní další hostitelé souborů nejsou k dispozici.", "noHostsConnectedHint": "Přidejte dalšího hostitele SSH s povoleným Správcem souborů ve Správci hostitelů.", "selectDestinationHost": "Vyberte cílového hostitele", @@ -1164,48 +1360,48 @@ "browseDestination": "Procházet nebo zadat cestu", "confirmCopy": "Kopie", "confirmMove": "Pohyb", - "transferring": "Přenos…", - "compressing": "Komprese…", - "extracting": "Extrahování…", - "transferringItems": "Přenos {{current}} z {{total}} položek…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Převod dokončen", "transferError": "Přenos se nezdařil", - "transferPartial": "Přenos dokončen s {{count}} chybami", - "transferPartialHint": "Nepodařilo se přenést: {{paths}}", - "itemsSummary": "{{count}} položek", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Cíl musí být adresář pro přenosy více položek.", "selectThisFolder": "Vyberte tuto složku", "browsePathWillBeCreated": "Tato složka zatím neexistuje. Bude vytvořena po zahájení přenosu.", "browsePathError": "Tuto cestu se nepodařilo otevřít na cílovém hostiteli.", "goUp": "Jdi nahoru", - "copyFolderToHost": "Zkopírovat složku na hostitele…", - "moveFolderToHost": "Přesunout složku na hostitele…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Připraveno", - "hostConnecting": "Připojování…", + "hostConnecting": "Connecting…", "hostDisconnected": "Nepřipojeno", "hostAuthRequired": "Vyžadováno ověření – nejprve otevřete Správce souborů na tomto hostiteli.", "hostConnectionFailed": "Připojení se nezdařilo", "metricsTitle": "Časy přestupů", - "metricsPrepare": "Připravit cíl: {{duration}}", - "metricsCompress": "Komprimovat u zdroje: {{duration}}", - "metricsHopSourceRead": "Zdroj → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → cíl (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → cíl (lokální): {{throughput}}", - "metricsTransfer": "Konec od konce: {{throughput}} ({{duration}})", - "metricsExtract": "Extrahovat v cíli: {{duration}}", - "metricsSourceDelete": "Odebrat ze zdroje: {{duration}}", - "metricsTotal": "Celkem: {{duration}}", - "progressCompressing": "Komprese na zdrojovém hostiteli…", - "progressExtracting": "Extrahování v cíli…", - "progressTransferring": "Přenos dat…", - "progressReconnecting": "Opětovné připojení…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Paralelní přestupní pruhy", - "parallelSegmentsOption": "{{count}} jízdních pruhů", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Velké soubory jsou rozděleny na bloky o velikosti 256 MB. Více linek používá samostatná připojení (například spuštění několika přenosů) pro vyšší celkovou propustnost.", - "progressTotalSpeed": "{{speed}} celkem ({{lanes}} pruhů)", - "progressTransferringItems": "Přenos souborů ({{current}} z {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} souborů", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Zdrojové soubory zachovány (částečný přenos)", "jumpHostLimitation": "Oba hostitelé musí být dosažitelné ze serveru Termix. Přímé směrování mezi hostiteli není podporováno.", "cancel": "Zrušit", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Vybírá tar nebo SFTP pro jednotlivé soubory na základě počtu souborů, velikosti a komprimovatelnosti. Jednotlivé soubory vždy používají streamovaný SFTP.", "methodTarHint": "Komprimace ve zdroji, přenos jednoho archivu, extrakce v cíli. Vyžaduje tar na obou unixových hostitelích.", "methodItemSftpHint": "Přeneste každý soubor jednotlivě přes SFTP. Funguje na všech hostitelích včetně Windows.", - "methodPreviewLoading": "Výpočet metody převodu…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Nepodařilo se zobrazit náhled metody přenosu. Server si metodu vybere i po spuštění.", "methodPreviewWillUseTar": "Použiji: archiv Tar", "methodPreviewWillUseItemSftp": "Použije se: SFTP pro jednotlivé soubory", - "methodPreviewScanSummary": "{{fileCount}} souborů, {{totalSize}} celkem (naskenováno na zdrojovém hostiteli).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Každý soubor používá stejný SFTP stream jako kopie jednoho souboru, jeden po druhém. Průběh je sloučen napříč všemi soubory, takže se ukazatel u velkých souborů pohybuje pomalu.", "methodReason": { "user_item_sftp": "Zvolili jste SFTP pro jednotlivé soubory.", "user_tar": "Zvolili jste archiv tar.", "tar_unavailable": "Tar není k dispozici na jednom nebo obou hostitelích — místo toho bude použit protokol SFTP pro jednotlivé soubory.", "windows_host": "Je zapojen hostitelský systém Windows – tar se nepoužívá.", - "auto_multi_large": "Automaticky: více souborů včetně velkého souboru ({{largestSize}}) s komprimovatelnými daty — tar se sbalí do jednoho přenosu.", - "auto_single_large_in_archive": "Automaticky: jeden velký soubor ({{largestSize}}) v této sadě – SFTP pro každý soubor.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto: většinou nekomprimovatelná data – SFTP pro jednotlivé soubory.", - "auto_many_files": "Auto: mnoho souborů ({{fileCount}}) – tar snižuje režii pro každý soubor.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automaticky: SFTP pro jednotlivé soubory pro tuto sadu." }, "progressCancel": "Zrušit", - "progressCancelling": "Zrušení…", + "progressCancelling": "Cancelling…", "progressStalled": "Zastaveno", "resumedHint": "Znovu připojeno k aktivnímu přenosu zahájenému v jiném okně.", "transferCancelled": "Převod zrušen", @@ -1245,940 +1441,1347 @@ "cleanupDestFilesPartial": "Některé částečné soubory se nepodařilo odstranit.", "cleanupDestFilesNothing": "Na cílové destinaci není co uklízet", "cleanupDestFilesError": "Vyčištění se nezdařilo", - "retryTransfer": "Zkusit znovu", + "retryTransfer": "Retry", "retryTransferError": "Opakovaný pokus se nezdařil", "transferFailedRetryHint": "V cíli byla uložena částečná data. Pokus bude obnoven po obnovení připojení." }, "tunnels": { - "noSshTunnels": "Žádné SSH tunely", - "createFirstTunnelMessage": "Zatím jste nevytvořili žádné SSH tunely. Nakonfigurujte připojení tunelu v hostitelském manažeru, abyste mohli začít.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Připojeno", "disconnected": "Odpojeno", - "connecting": "Připojování...", - "error": "Chyba", - "canceling": "Rušení...", - "connect": "Připojit", - "disconnect": "Odpojit", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", "cancel": "Zrušit", "port": "Port", - "localPort": "Místní port", - "remotePort": "Vzdálený port", - "currentHostPort": "Aktuální port hostitele", - "endpointPort": "Přístav koncového bodu", - "bindIp": "Místní IP", - "endpointSshConfig": "Konfigurace koncového bodu SSH", - "endpointSshHost": "Koncový bod SSH hostitel", - "endpointSshHostPlaceholder": "Vyberte nakonfigurovaného hostitele", - "endpointSshHostRequired": "Vyberte koncový SSH hostitele pro každý klientský tunel.", - "attempt": "Pokusit se {{current}} o {{max}}", - "nextRetryIn": "Další opakování za {{seconds}} sekund", - "clientTunnels": "Tunely klienta", - "clientTunnel": "Zákaznický tunel", - "addClientTunnel": "Přidat klientský tunel", - "noClientTunnels": "Na této ploše nejsou nakonfigurovány žádné tunely klienta.", - "tunnelName": "Název tunelu", - "remoteHost": "Vzdálený server", - "autoStart": "Automatický start", - "clientAutoStartDesc": "Začne, když se tento desktopový klient otevře a zůstane připojen.", - "clientManualStartDesc": "Používejte Start a Zastavit z tohoto řádku. Termix jej automaticky neotevře.", - "clientRemoteServerNote": "Vzdálené přesměrování může vyžadovat AllowTcpForwarding a GatewayPorts na serveru SSH serveru. Vzdálený port se uzavře, když se tato plocha odpojí.", - "clientTunnelStarted": "Klientský tunel spuštěn", - "clientTunnelStopped": "Klientský tunel zastaven", - "tunnelTestSucceeded": "Test tunelu byl úspěšný", - "tunnelTestFailed": "Test tunelu selhal", - "localSaved": "Klientské tunely uloženy", - "localSaveError": "Nepodařilo se uložit místní klientské tunely", - "invalidBindIp": "Místní IP adresa musí být platná IPv4 adresa.", - "invalidLocalTargetIp": "Místní cílová IP musí být platná IPv4 adresa.", - "invalidLocalPort": "Místní port musí být mezi 1 a 65535.", - "invalidRemotePort": "Vzdálený port musí být mezi 1 a 65535.", - "invalidLocalTargetPort": "Místní cílový port musí být mezi 1 a 65535.", - "invalidEndpointPort": "Přístav koncových bodů musí být mezi 1 a 65535.", - "duplicateAutoStartBind": "Pouze jeden klientský tunel s automatickým startem může používat {{bind}}.", - "manualControlError": "Aktualizace stavu tunelu se nezdařila.", - "active": "Aktivní", - "start": "Začít", - "stop": "Zastavit", - "test": "Zkouška", - "type": "Typ tunelu", - "typeLocal": "Místní (-L)", - "typeRemote": "Vzdálené (-R)", - "typeDynamic": "Dynamické (-D)", - "typeServerLocalDesc": "Aktuální hostitel ke koncovce.", - "typeServerRemoteDesc": "Koncový bod zpět do aktuálního hostitele.", - "typeClientLocalDesc": "Lokální počítač ke koncovce.", - "typeClientRemoteDesc": "Koncový bod zpět do lokálního počítače.", - "typeClientDynamicDesc": "SOCKS na místním počítači.", - "typeDynamicDesc": "Přesměrování SOCKS5 KONNECT provozu přes SSH", - "forwardDescriptionServerLocal": "Aktuální host {{sourcePort}} → koncový bod {{endpointPort}}.", - "forwardDescriptionServerRemote": "Koncový bod {{endpointPort}} → aktuální host {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS na aktuálním hostiteli {{sourcePort}}.", - "forwardDescriptionClientLocal": "Místní {{sourcePort}} → vzdálené {{endpointPort}}.", - "forwardDescriptionClientRemote": "Vzdálená {{sourcePort}} → lokální {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS na místním portu {{sourcePort}}.", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS prostřednictvím {{endpoint}}", - "autoNameClientLocal": "Místní {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → místní {{localPort}}", - "autoNameClientDynamic": "SOCKS {{localPort}} prostřednictvím {{endpoint}}", - "route": "Trasa:", - "lastStarted": "Naposledy spuštěno", - "lastTested": "Poslední test", - "lastError": "Poslední chyba", - "maxRetries": "Maximální počet opakování", - "maxRetriesDescription": "Maximální počet pokusů o opakování.", - "retryInterval": "Interval opakovat (sekundy)", - "retryIntervalDescription": "Čas čekat mezi pokusy opakovat.", - "local": "Místní", - "remote": "Vzdálené", - "destination": "Místo určení", - "host": "Hostitel", - "mode": "Režim", - "noHostSelected": "Nebyl vybrán žádný hostitel", - "working": "Zpracovávám..." + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Paměť", + "memory": "Memory", "disk": "Disk", - "network": "Síť", - "uptime": "Doba provozu", - "processes": "Proces", - "available": "Dostupné", - "free": "Zdarma", - "connecting": "Připojování...", - "connectionFailed": "Nepodařilo se připojit k serveru", - "naCpus": "Nepřichází v úvahu procesor", - "cpuCores_one": "Jádro {{count}}", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Využití CPU", - "memoryUsage": "Využití paměti", - "diskUsage": "Využití disku", - "failedToFetchHostConfig": "Nepodařilo se načíst konfiguraci hostitele", - "serverOffline": "Server je offline", - "cannotFetchMetrics": "Nelze načíst metriku z offline serveru", - "totpFailed": "Ověření TOTP se nezdařilo", - "noneAuthNotSupported": "Statistiky serveru nepodporují typ ověřování 'žádné'.", - "load": "Načíst", - "systemInfo": "Systémové informace", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Operační systém", - "kernel": "Jádro", - "seconds": "sekundy", - "networkInterfaces": "Síťová rozhraní", - "noInterfacesFound": "Nebyla nalezena žádná síťová rozhraní", - "noProcessesFound": "Nebyly nalezeny žádné procesy", - "loginStats": "SSH přihlašovací statistiky", - "noRecentLoginData": "Žádné nedávné přihlašovací údaje", - "executingQuickAction": "Provádění {{name}}...", - "quickActionSuccess": "{{name}} úspěšně dokončeno", - "quickActionFailed": "{{name}} selhal", - "quickActionError": "Provedení {{name}} se nezdařilo", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Naslouchající porty", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protokol", "port": "Port", - "address": "Adresa", - "process": "Proces", - "noData": "Žádná data naslouchajících portů" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Neaktivní", - "policy": "Zásady", - "rules": "pravidla", - "noData": "Nejsou k dispozici žádná data firewallu", - "action": "Akce", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Zdroj", - "anywhere": "Kdekoliv" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Zatížení Prg", - "swap": "Prohodit", - "architecture": "Architektura", - "refresh": "Aktualizovat", - "retry": "Opakovat" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Samostatně hostované SSH a správa vzdálené plochy", - "loginTitle": "Přihlásit se do Termix", - "registerTitle": "Vytvořit účet", - "forgotPassword": "Zapomněli jste heslo?", - "rememberMe": "Zapamatovat zařízení na 30 dní (včetně TOTP)", - "noAccount": "Nemáte účet?", - "hasAccount": "Již máte účet?", - "twoFactorAuth": "Dvoufaktorové ověření", - "enterCode": "Zadejte ověřovací kód", - "backupCode": "Nebo použijte záložní kód", - "verifyCode": "Ověřit kód", - "redirectingToApp": "Přesměrování do aplikace...", - "sshAuthenticationRequired": "Vyžadováno ověření SSH", - "sshNoKeyboardInteractive": "Klávesnice - Interaktivní ověření není k dispozici", - "sshAuthenticationFailed": "Ověření se nezdařilo", - "sshAuthenticationTimeout": "Časový limit ověření", - "sshNoKeyboardInteractiveDescription": "Server nepodporuje interaktivní ověřování klávesnice. Zadejte prosím své heslo nebo SSH klíč.", - "sshAuthFailedDescription": "Zadané přihlašovací údaje jsou nesprávné. Zkuste to prosím znovu s platnými pověřeními.", - "sshTimeoutDescription": "Vypršel časový limit pokusu o ověření. Zkuste to znovu.", - "sshProvideCredentialsDescription": "Zadejte prosím vaše SSH přihlašovací údaje pro připojení k tomuto serveru.", - "sshPasswordDescription": "Zadejte heslo pro toto SSH připojení.", - "sshKeyPasswordDescription": "Pokud je váš SSH klíč šifrován, zadejte heslo zde.", - "passphraseRequired": "Vyžadována přístupová fráze", - "passphraseRequiredDescription": "SSH klíč je šifrován. Zadejte prosím heslo pro odemknutí.", - "back": "Zpět", - "firstUser": "První uživatel", - "firstUserMessage": "Jste první uživatel a bude vytvořen správce. Nastavení admin můžete zobrazit v rozevíracím menu postranního panelu. Pokud si myslíte, že je to chyba, zkontrolujte logy doku, nebo vytvořte GitHub.", - "external": "Externí", - "loginWithExternal": "Přihlásit se s externím poskytovatelem", - "loginWithExternalDesc": "Přihlášení pomocí vašeho nakonfigurovaného externího poskytovatele identity", - "externalNotSupportedInElectron": "Externí ověřování zatím není v aplikaci Electron podporováno. Použijte prosím webovou verzi pro OIDC přihlášení.", - "resetPasswordButton": "Obnovit heslo", - "sendResetCode": "Odeslat kód pro obnovení", - "resetCodeDesc": "Zadejte své uživatelské jméno pro získání kódu pro obnovení hesla. Kód bude přihlášen do logů v dokovacím kontejneru.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Ověřit kód", - "enterResetCode": "Zadejte šestimístný kód z logů kontejneru dockeru pro uživatele:", - "newPassword": "Nové heslo", - "confirmNewPassword": "Potvrzení hesla", - "enterNewPassword": "Zadejte své nové heslo pro uživatele:", - "signUp": "Zaregistrovat se", - "desktopApp": "Stolní aplikace", - "loggingInToDesktopApp": "Přihlášení do desktopové aplikace", - "loadingServer": "Načítání serveru...", - "dataLossWarning": "Obnovením hesla smažete všechny uložené SSH hostitele, přihlašovací údaje a další šifrovaná data. Tuto akci nelze vrátit zpět. Použijte pouze v případě, že jste zapomněli své heslo a nejste přihlášeni.", - "authenticationDisabled": "Autentizace zakázána", - "authenticationDisabledDesc": "Všechny metody ověřování jsou momentálně zakázány. Obraťte se na správce.", - "attemptsRemaining": "Zbývá {{count}} pokusů" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Ověřit klíč SSH hostitele", - "keyChangedWarning": "SSH klíč hostitele změněn", - "firstConnectionTitle": "První připojení k tomuto hostiteli", - "firstConnectionDescription": "Nelze určit pravost tohoto hostitele. Ověřte shodu s tím, co očekáváte.", - "keyChangedDescription": "Hostitelský klíč pro tento server se změnil od vašeho posledního připojení. To by mohlo znamenat bezpečnostní problém.", - "previousKey": "Předchozí klíč", - "newFingerprint": "Nový otisk prstu", - "fingerprint": "Otisk prstu", - "verifyInstructions": "Pokud tomuto hostiteli důvěřujete, klepněte na tlačítko Přijmout pro pokračování a uložení tohoto otisku pro budoucí připojení.", - "securityWarning": "Bezpečnostní varování", - "acceptAndContinue": "Přijmout a pokračovat", - "acceptNewKey": "Přijmout nový klíč a pokračovat" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Nelze se připojit k databázi", - "unknownError": "Neznámá chyba", - "loginFailed": "Přihlášení se nezdařilo", - "failedPasswordReset": "Nepodařilo se spustit obnovení hesla", - "failedVerifyCode": "Nepodařilo se ověřit kód pro obnovení", - "failedCompleteReset": "Obnovení hesla se nezdařilo", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Nepodařilo se spustit OIDC přihlášení", - "silentSigninOidcUnavailable": "Bylo požadováno tiché přihlášení, ale OIDC přihlášení není k dispozici.", - "failedUserInfo": "Nepodařilo se získat informace o uživateli po přihlášení", - "oidcAuthFailed": "OIDC ověření se nezdařilo", - "invalidAuthUrl": "Z backendu obdržena neplatná autorizační URL", - "requiredField": "Toto pole je povinné", - "minLength": "Minimální délka je {{min}}", - "passwordMismatch": "Hesla se neshodují", - "passwordLoginDisabled": "Uživatelské jméno/heslo přihlášení je momentálně zakázáno", - "sessionExpired": "Relace vypršela - přihlaste se prosím znovu", - "totpRateLimited": "Omezená hodnota: Příliš mnoho pokusů o ověření TOTP. Opakujte akci později.", - "totpRateLimitedWithTime": "Omezená hodnota: Příliš mnoho pokusů o ověření TOTP. Počkejte prosím {{time}} sekund před dalším pokusem.", - "resetCodeRateLimited": "Omezená hodnota: Příliš mnoho pokusů o ověření. Opakujte akci později.", - "resetCodeRateLimitedWithTime": "Omezená hodnota: Příliš mnoho pokusů o ověření. Počkejte prosím {{time}} sekund před dalším pokusem.", - "authTokenSaveFailed": "Nepodařilo se uložit ověřovací token", - "failedToLoadServer": "Nepodařilo se načíst server" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Registrace nového účtu je v současné době zakázána administrátorem. Přihlaste se nebo kontaktujte správce.", - "userNotAllowed": "Váš účet nemá oprávnění k registraci. Obraťte se na správce.", - "databaseConnectionFailed": "Nepodařilo se připojit k databázovému serveru", - "resetCodeSent": "Resetovat kód odeslaný do Docker logů", - "codeVerified": "Kód byl úspěšně ověřen", - "passwordResetSuccess": "Obnovení hesla bylo úspěšné", - "loginSuccess": "Přihlášení bylo úspěšné", - "registrationSuccess": "Registrace úspěšná" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Místní stolní tunely zaměřující nastavené SSH hostitele.", - "c2sTunnelPresets": "Předvolby klientského tunelu", - "c2sTunnelPresetsDesc": "Uložte místní seznam tunelů tohoto desktopového klienta jako pojmenovanou předvolbu serveru, nebo nahrajte předvolbu zpět do tohoto klienta.", - "c2sTunnelPresetsUnavailable": "Předvolby klientského tunelu jsou k dispozici pouze v desktopovém klientovi.", - "c2sPresetName": "Název předvolby", - "c2sPresetNamePlaceholder": "Název předvolby klienta", - "c2sPresetToLoad": "Předvolba k načtení", - "c2sNoPresetSelected": "Nebyla vybrána žádná předvolba", - "c2sNoPresets": "Žádná přednastavení nebyla uložena", - "c2sLoadPreset": "Načíst", - "c2sCurrentLocalConfig": "{{count}} lokální klientské tunely nakonfigurovány na tomto počítači.", - "c2sPresetSyncNote": "Předvolby jsou explicitní snímky; načítání jednoho nahradí lokální klientský seznam klientských tunelů.", - "c2sPresetSaved": "Předvolba klientského tunelu byla uložena", - "c2sPresetLoaded": "Předvolba klientského tunelu byla načtena lokálně", - "c2sPresetRenamed": "Předvolba klientského tunelu přejmenována", - "c2sPresetDeleted": "Předvolba klientského tunelu byla smazána", - "c2sPresetLoadError": "Nepodařilo se načíst přednastavení klientského tunelu" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Jazyk", - "keyPassword": "heslo klíče", - "pastePrivateKey": "Sem vložte svůj soukromý klíč...", - "localListenerHost": "127.0.0.1 (poslouchejte lokálně)", - "localTargetHost": "127.0.0.1 (cíl na tomto počítači)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Zadejte své heslo", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Nástěnka", - "loading": "Načítání řídicího panelu...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Podpora", + "support": "Support", "discord": "Discord", - "serverOverview": "Přehled serveru", - "version": "Verze", - "upToDate": "Aktuální", - "updateAvailable": "Dostupná aktualizace", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Doba provozu", - "database": "Databáze", - "healthy": "Zdravé", - "error": "Chyba", - "totalHosts": "Celkem hostitelů", - "totalTunnels": "Celkem tunelů", - "totalCredentials": "Pověření celkem", - "recentActivity": "Nedávná aktivita", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Načítání nedávné aktivity...", - "noRecentActivity": "Žádná poslední aktivita", - "quickActions": "Rychlé akce", - "addHost": "Přidat hostitele", - "addCredential": "Přidat pověření", - "adminSettings": "Nastavení správce", - "userProfile": "Profil uživatele", - "serverStats": "Statistiky serveru", - "loadingServerStats": "Načítání statistik serveru...", - "noServerData": "Nejsou k dispozici žádná data serveru", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Přizpůsobit nástěnku", - "dashboardSettings": "Nastavení hlavního panelu", - "enableDisableCards": "Povolit/zakázat karty", - "resetLayout": "Obnovit výchozí", - "serverOverviewCard": "Přehled serveru", - "recentActivityCard": "Nedávná aktivita", - "networkGraphCard": "Graf sítě", - "networkGraph": "Graf sítě", - "quickActionsCard": "Rychlé akce", - "serverStatsCard": "Statistiky serveru", - "panelMain": "Hlavní", - "panelSide": "Boční", - "justNow": "právě teď" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "STABILNÍ", - "hostsOnline": "Hosté online", - "activeTunnels": "Aktivní tunely", - "registerNewServer": "Registrovat nový server", - "storeSshKeysOrPasswords": "Uložit SSH klíče nebo hesla", - "manageUsersAndRoles": "Správa uživatelů a rolí", - "manageYourAccount": "Spravovat svůj účet", - "hostStatus": "Stav hostitele", - "noHostsConfigured": "Nejsou nakonfigurováni žádní hostitelé", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Přidat:", - "commandPalette": "Paleta příkazu", - "done": "Hotovo", - "editModeInstructions": "Přetažením karet změníte pořadí · Dělič sloupců pro změnu velikosti sloupců · Přetažením dolního okraje karty změníte jeho výšku · Koš pro odstranění", - "empty": "Prázdné", - "clear": "Vyčistit" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopie", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Přidat hostitele", - "addGroup": "Přidat skupinu", - "addLink": "Přidat odkaz", - "zoomIn": "Přiblížit", - "zoomOut": "Oddálit", - "resetView": "Obnovit zobrazení", - "selectHost": "Vybrat hostitele", - "chooseHost": "Vyberte hostitele...", - "parentGroup": "Nadřazená skupina", - "noGroup": "Žádná skupina", - "groupName": "Název skupiny", - "color": "Barva", - "source": "Zdroj", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Přesunout do skupiny", - "selectGroup": "Vybrat skupinu...", - "addConnection": "Přidat připojení", - "hostDetails": "Podrobnosti hostitele", - "removeFromGroup": "Odstranit ze skupiny", - "addHostHere": "Přidat hostitele", - "editGroup": "Upravit skupinu", - "delete": "Vymazat", - "add": "Přidat", - "create": "Vytvořit", - "move": "Přesunout", - "connect": "Připojit", - "createGroup": "Vytvořit skupinu", - "selectSourcePlaceholder": "Vyberte zdroj...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Pohyb", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Neplatný soubor", - "hostAlreadyExists": "Hostitel je již v topologii", - "connectionExists": "Připojení již existuje", - "unknown": "Neznámý", - "name": "Název", - "ip": "IP adresa", - "status": "Stav", - "failedToAddNode": "Přidání uzlu se nezdařilo", - "sourceDifferentFromTarget": "Zdroj a cíl musí být jiný", - "exportJSON": "Exportovat JSON", - "importJSON": "Importovat JSON", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Postavení", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminál", "fileManager": "Správce souborů", "tunnel": "Tunel", - "docker": "Dokovací modul", - "serverStats": "Statistiky serveru", - "noNodes": "Zatím žádné uzly" + "docker": "Přístavní dělník", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker není pro tohoto hostitele povolen", - "validating": "Ověřování Dockeru...", - "connecting": "Připojování...", - "error": "Chyba", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Nepodařilo se připojit k Dockeru", - "containerStarted": "Kontejner {{name}} spuštěn", - "failedToStartContainer": "Nepodařilo se spustit kontejner {{name}}", - "containerStopped": "Kontejner {{name}} zastaven", - "failedToStopContainer": "Nepodařilo se zastavit kontejner {{name}}", - "containerRestarted": "Kontejner {{name}} restartován", - "failedToRestartContainer": "Restartování kontejneru {{name}} se nezdařilo", - "containerPaused": "Kontejner {{name}} pozastaven", - "containerUnpaused": "Kontejner {{name}} nepozastaven", - "failedToTogglePauseContainer": "Nepodařilo se přepnout stav pozastavení pro kontejner {{name}}", - "containerRemoved": "Kontejner {{name}} byl odstraněn", - "failedToRemoveContainer": "Odstranění kontejneru {{name}} se nezdařilo", - "image": "Obrázek", - "ports": "Porty", - "noPorts": "Žádné porty", - "start": "Začít", - "confirmRemoveContainer": "Opravdu chcete odstranit kontejner '{{name}}'? Tuto akci nelze vrátit zpět.", - "runningContainerWarning": "Varování: Tento kontejner je v současné době spuštěn. Odstranění jej nejdříve zastaví.", - "loadingContainers": "Načítání kontejnerů...", - "manager": "Správce Dockerů", - "autoRefresh": "Automatické obnovení", - "timestamps": "Časová razítka", - "lines": "Řádky", - "filterLogs": "Filtrovat logy...", - "refresh": "Aktualizovat", - "download": "Stáhnout", - "clear": "Vyčistit", - "logsDownloaded": "Protokoly byly úspěšně staženy", - "last50": "Posledních 50", - "last100": "Posledních 100", - "last500": "Posledních 500", - "last1000": "Posledních 1000", - "allLogs": "Všechny logy", - "noLogsMatching": "Žádné logy odpovídající \"{{query}}\"", - "noLogsAvailable": "Žádné logy nejsou k dispozici", - "noContainersFound": "Nebyly nalezeny žádné kontejnery", - "noContainersFoundHint": "Na tomto hostiteli nejsou k dispozici žádné kontejnery v Dockeru", - "searchPlaceholder": "Hledat kontejnery...", - "allStatuses": "Všechny stavy", - "stateRunning": "Běh", - "statePaused": "Pozastaveno", - "stateExited": "Ukončeno", - "stateRestarting": "Restartování", - "noContainersMatchFilters": "Žádné kontejnery neodpovídají vašim filtrům", - "noContainersMatchFiltersHint": "Zkuste upravit vyhledávací kritéria nebo kritéria filtru", - "failedToFetchStats": "Nepodařilo se načíst statistiky kontejneru", - "containerNotRunning": "Kontejner není spuštěn", - "startContainerToViewStats": "Spustit kontejner pro zobrazení statistik", - "loadingStats": "Načítání statistik...", - "errorLoadingStats": "Chyba při načítání statistik", - "noStatsAvailable": "Žádné statistiky nejsou k dispozici", - "cpuUsage": "Využití CPU", - "current": "Aktuální", - "memoryUsage": "Využití paměti", - "networkIo": "Síť I/O", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Výstup", - "blockIo": "Blok I/O", - "read": "Číst", - "write": "Napsat", - "pids": "PID", - "containerInformation": "Informace o kontejneru", - "name": "Název", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Stát", - "containerMustBeRunning": "Kontejner musí být spuštěn pro přístup do konzole", - "verificationCodePrompt": "Zadejte ověřovací kód", - "totpVerificationFailed": "Ověření TOTP se nezdařilo. Zkuste to prosím znovu.", - "warpgateVerificationFailed": "Ověření Warpgate se nezdařilo. Zkuste to prosím znovu.", - "connectedTo": "Připojeno k {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Odpojeno", - "consoleError": "Chyba konzole", - "errorMessage": "Chyba: {{message}}", - "failedToConnect": "Nepodařilo se připojit k kontejneru", - "console": "Konzole", - "selectShell": "Vybrat shell", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "Popel", - "connect": "Připojit", - "disconnect": "Odpojit", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Nepřipojeno", - "clickToConnect": "Klepněte na tlačítko připojit pro spuštění relace", - "connectingTo": "Připojuji se k {{containerName}}...", - "containerNotFound": "Kontejner nebyl nalezen", - "backToList": "Zpět na seznam", - "logs": "Logy", - "stats": "Statistiky", - "consoleTab": "Konzole", - "startContainerToAccess": "Spusťte kontejner pro přístup do konzole" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Obecná ustanovení", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Uživatelé", - "sectionSessions": "Relace", - "sectionRoles": "Role", - "sectionDatabase": "Databáze", - "sectionApiKeys": "API klíče", - "allowRegistration": "Povolit registraci uživatele", - "allowRegistrationDesc": "Nechat nové uživatele se registrovat", - "allowPasswordLogin": "Povolit přihlášení k heslu", - "allowPasswordLoginDesc": "Uživatelské jméno/heslo přihlášení", - "oidcAutoProvision": "Automatické poskytování OIDC", - "oidcAutoProvisionDesc": "Automatické vytváření účtů pro OIDC uživatele i když je registrace zakázána", - "allowPasswordReset": "Povolit obnovení hesla", - "allowPasswordResetDesc": "Resetovat kód pomocí Docker logů", - "sessionTimeout": "Časový limit relace", - "hours": "hodiny", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Vymazat filtry", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Postavení", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "Výchozí nastavení sledování", - "statusCheck": "Kontrola stavu", - "metrics": "Metrika", - "sec": "sekunda", - "logLevel": "Úroveň logu", - "enableGuacamole": "Povolit Guacamol", - "enableGuacamoleDesc": "RDP/VNC vzdálená plocha", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "Konfigurace OpenID Connect pro SSO. Pole označená * jsou povinná.", - "oidcClientId": "ID klienta", - "oidcClientSecret": "Tajný klíč klienta", - "oidcAuthUrl": "Autorizační URL", - "oidcIssuerUrl": "URL vydavatele", - "oidcTokenUrl": "URL tokenu", - "oidcUserIdentifier": "Cesta identifikátoru uživatele", - "oidcDisplayName": "Zobrazit název cesty", - "oidcScopes": "Rozsah", - "oidcUserinfoUrl": "Přepsat URL uživatelských informací", - "oidcAllowedUsers": "Povolení uživatelé", - "oidcAllowedUsersDesc": "Jeden e-mail na řádek. Ponechte prázdné pro povolení všech.", - "removeOidc": "Odebrat", - "usersCount": "{{count}} uživatelé", - "createUser": "Vytvořit", - "newRole": "Nová role", - "roleName": "Název", - "roleDisplayName": "Zobrazované jméno", - "roleDescription": "L 343, 22.12.2009, s. 1).", - "rolesCount": "{{count}} role", - "createRole": "Vytvořit", - "creating": "Vytváření...", - "exportDatabase": "Exportovat databázi", - "exportDatabaseDesc": "Stáhnout zálohu všech hostitelů, přihlašovacích údajů a nastavení", - "export": "Exportovat", - "exporting": "Exportování...", - "importDatabase": "Importovat databázi", - "importDatabaseDesc": "Obnovit ze záložního souboru .sqlite", - "importDatabaseSelected": "Vybráno: {{name}}", - "selectFile": "Vybrat soubor", - "changeFile": "Změnit", - "import": "Importovat", - "importing": "Importování...", - "apiKeysCount": "Klávesy {{count}}", - "newApiKey": "Nový API klíč", - "apiKeyCreatedWarning": "Klíč byl vytvořen - zkopírujte jej, nebude znovu zobrazen.", - "apiKeyName": "Název", - "apiKeyUser": "Uživatel", - "apiKeySelectUser": "Vyberte uživatele...", - "apiKeyExpiresAt": "Vyprší v", - "createKey": "Vytvořit klíč", - "apiKeyNoExpiry": "Bez vypršení platnosti", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Odstranit", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Duální ověření", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Místní", - "adminStatusAdministrator": "Administrátor", - "adminStatusRegularUser": "Běžný uživatel", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "VLASTNÍ", - "youBadge": "VÁŠ", - "sessionsActive": "{{count}} aktivní", - "sessionActive": "Aktivní: {{time}}", - "sessionExpires": "Rozbalit: {{time}}", - "revokeAll": "Vše", - "revokeAllSessionsSuccess": "Všechny relace pro uživatele odebrány", - "revokeAllSessionsFailed": "Nepodařilo se zrušit relace", - "revokeSessionFailed": "Nepodařilo se zrušit relaci", - "addRole": "Přidat roli", - "noCustomRoles": "Nebyly definovány žádné vlastní role", - "removeRoleFailed": "Nepodařilo se odstranit roli", - "assignRoleFailed": "Přiřazení role se nezdařilo", - "deleteRoleFailed": "Nepodařilo se odstranit roli", - "userAdminAccess": "Administrátor", - "userAdminAccessDesc": "Úplný přístup ke všem nastavením administrátora", - "userRoles": "Role", - "revokeAllUserSessions": "Zrušit všechny relace", - "revokeAllUserSessionsDesc": "Vynutit opětovné přihlášení na všech zařízeních", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Smazání tohoto uživatele je trvalé.", - "deleteUser": "Odstranit {{username}}", - "deleting": "Odstraňování...", - "deleteUserFailed": "Odstranění uživatele se nezdařilo", - "deleteUserSuccess": "Uživatel \"{{username}}\" byl smazán", - "deleteRoleSuccess": "Role \"{{name}}\" smazána", - "revokeKeySuccess": "Klíč \"{{name}}\" odvolán", - "revokeKeyFailed": "Nepodařilo se zrušit klíč", - "copiedToClipboard": "Zkopírováno do schránky", - "done": "Hotovo", - "createUserTitle": "Vytvořit uživatele", - "createUserDesc": "Vytvořit nový místní účet.", - "createUserUsername": "Uživatelské jméno", - "createUserPassword": "Heslo", - "createUserPasswordHint": "Minimálně 6 znaků.", - "createUserEnterUsername": "Zadejte uživatelské jméno", - "createUserEnterPassword": "Zadejte heslo", - "createUserSubmit": "Vytvořit uživatele", - "editUserTitle": "Spravovat uživatele: {{username}}", - "editUserDesc": "Upravit role, stav správce, relace a nastavení účtu.", - "editUserUsername": "Uživatelské jméno", - "editUserAuthType": "Typ ověření", - "editUserAdminStatus": "Stav administrace", - "editUserUserId": "ID uživatele", - "linkAccountTitle": "Propojit OIDC s účtem hesel", - "linkAccountDesc": "Sloučit OIDC účet {{username}} s existujícím lokálním účtem.", - "linkAccountWarningTitle": "To bude:", - "linkAccountEffect1": "Odstranit pouze OIDC účet", - "linkAccountEffect2": "Přidat OIDC přihlášení do cílového účtu", - "linkAccountEffect3": "Povolit přihlášení OIDC i heslem", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Zadejte místní uživatelské jméno pro propojení s", - "linkAccounts": "Propojit účty", - "linkAccountSuccess": "Účet OIDC propojený s „{{username}}“", - "linkAccountFailed": "Nepodařilo se propojit účet OIDC", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", + "createUserPassword": "Password", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Typ autorizace", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Propojování...", - "saving": "Ukládání...", - "updateRegistrationFailed": "Nepodařilo se aktualizovat nastavení registrace", - "updatePasswordLoginFailed": "Nepodařilo se aktualizovat nastavení přihlášení k heslu", - "updateOidcAutoProvisionFailed": "Nepodařilo se aktualizovat nastavení automatického poskytování OIDC", - "updatePasswordResetFailed": "Aktualizace nastavení obnovení hesla se nezdařila", - "sessionTimeoutRange2": "Časový limit relace musí být mezi 1 a 720 hodinami", - "sessionTimeoutSaved": "Časový limit relace uložen", - "sessionTimeoutSaveFailed": "Nepodařilo se uložit časový limit relace", - "monitoringIntervalInvalid": "Neplatné hodnoty intervalu", - "monitoringSaved": "Nastavení sledování uloženo", - "monitoringSaveFailed": "Nepodařilo se uložit nastavení monitorování", - "guacamoleSaved": "Nastavení Guacamole uloženo", - "guacamoleSaveFailed": "Nepodařilo se uložit nastavení Guacamole", - "guacamoleUpdateFailed": "Nepodařilo se aktualizovat nastavení Guacamole", - "logLevelUpdateFailed": "Aktualizace úrovně protokolu se nezdařila", - "oidcSaved": "OIDC konfigurace uložena", - "oidcSaveFailed": "Nepodařilo se uložit OIDC konfiguraci", - "oidcRemoved": "OIDC konfigurace odstraněna", - "oidcRemoveFailed": "Nepodařilo se odstranit OIDC konfiguraci", - "createUserRequired": "Uživatelské jméno a heslo jsou povinné", - "createUserPasswordTooShort": "Heslo musí mít alespoň 6 znaků", - "createUserSuccess": "Uživatel \"{{username}}\" byl vytvořen", - "createUserFailed": "Nepodařilo se vytvořit uživatele", - "updateAdminStatusFailed": "Aktualizace stavu administrátora se nezdařila", - "allSessionsRevoked": "Všechny relace byly zrušeny", - "revokeSessionsFailed": "Nepodařilo se zrušit relace", - "createRoleRequired": "Jméno a zobrazované jméno jsou povinné", - "createRoleSuccess": "Role \"{{name}}\" byla vytvořena", - "createRoleFailed": "Nepodařilo se vytvořit roli", - "apiKeyNameRequired": "Je vyžadován název klíče", - "apiKeyUserRequired": "Je vyžadováno ID uživatele", - "apiKeyCreatedSuccess": "API klíč \"{{name}}\" byl vytvořen", - "apiKeyCreateFailed": "Nepodařilo se vytvořit API klíč", - "exportSuccess": "Databáze úspěšně exportována", - "exportFailed": "Export databáze selhal", - "importSelectFile": "Nejprve prosím vyberte soubor", - "importCompleted": "Import dokončen: {{total}} položky importováno, {{skipped}} přeskočeno", - "importFailed": "Import se nezdařil: {{error}}", - "importError": "Import databáze se nezdařil" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminál", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Hostitel", - "hostPlaceholder": "192.168.1.1 nebo příklad.com", - "portLabel": "Přístav", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Uživatelské jméno", - "usernamePlaceholder": "uživatelské jméno", - "authLabel": "Ověření", - "passwordLabel": "Heslo", - "passwordPlaceholder": "heslo", - "privateKeyLabel": "Soukromý klíč", - "privateKeyPlaceholder": "Vložit soukromý klíč...", - "credentialLabel": "Pověření", - "credentialPlaceholder": "Vyberte uložené pověření", - "connectToTerminal": "Připojit k terminálu", - "connectToFiles": "Připojit k souborům" + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Credential", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Nebyl vybrán žádný terminál", - "noTerminalSelectedHint": "Otevřete kartu SSH terminálu pro zobrazení jeho historie příkazů", - "searchPlaceholder": "Hledat historii...", - "clearAll": "Vymazat vše", - "noHistoryEntries": "Žádné záznamy historie", - "trackingDisabled": "Sledování historie je zakázáno", - "trackingDisabledHint": "Pro nahrávání příkazů povolte v nastavení profilu." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Záznam klíčů", - "recordToTerminals": "Zaznamenat do terminálů", - "selectAll": "Vše", - "selectNone": "Nic", - "noTerminalTabsOpen": "Nebyly otevřeny žádné karty terminálu", - "selectTerminalsAbove": "Vyberte terminály nad", - "broadcastInputPlaceholder": "Napište sem pro vysílání klíčové...", - "stopRecording": "Zastavit nahrávání", - "startRecording": "Začít nahrávat", - "settingsTitle": "Nastavení", - "enableRightClickCopyPaste": "Povolit kopírování/vkládání pravým tlačítkem myši" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "None", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Rozložení", - "selectLayoutAbove": "Vyberte rozložení výše", - "selectLayoutHint": "Vyberte počet panelů k zobrazení", - "panesTitle": "Panely", - "openTabsTitle": "Otevřené panely", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Přetáhněte záložky do panelů výše nebo použijte Rychlé přiřazení", - "dropHere": "Přetáhněte sem", - "emptyPane": "Prázdné", - "dashboard": "Nástěnka", - "clearSplitScreen": "Vymazat rozdělenou obrazovku", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Rychlé přiřazení", - "alreadyAssigned": "Podokno {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Rozdělit kartu", "addToSplit": "Přidat do Splitu", "removeFromSplit": "Odebrat ze Splitu", - "assignToPane": "Přiřadit k podoknu" + "assignToPane": "Přiřadit k podoknu", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Vytvořit snippet", - "createSnippetDescription": "Vytvořit nový snippet příkazu pro rychlé spuštění", - "nameLabel": "Název", - "namePlaceholder": "např. Restartovat Nginx", - "descriptionLabel": "L 343, 22.12.2009, s. 1).", - "descriptionPlaceholder": "Volitelný popis", - "optional": "Nepovinné", - "folderLabel": "Složka", - "noFolder": "Žádná složka (nekategorizovaná)", - "commandLabel": "Příkaz", - "commandPlaceholder": "Např. sudo systemctl restart nginx", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", "cancel": "Zrušit", - "createSnippetButton": "Vytvořit snippet", - "createFolderTitle": "Vytvořit složku", - "createFolderDescription": "Uspořádat úryvky do složek", - "folderNameLabel": "Název složky", - "folderNamePlaceholder": "Např. systémové příkazy, Docker skripty", - "folderColorLabel": "Barva složky", - "folderIconLabel": "Ikona složky", - "previewLabel": "Náhled", - "folderNameFallback": "Název složky", - "createFolderButton": "Vytvořit složku", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Vše", - "selectNone": "Nic", - "noTerminalTabsOpen": "Nebyly otevřeny žádné karty terminálu", - "searchPlaceholder": "Hledat snippety...", - "newSnippet": "Nový snippet", - "newFolder": "Nová složka", - "run": "Spustit", - "noSnippetsInFolder": "V této složce nejsou žádné textové bloky", - "uncategorized": "Nezařazené", - "editSnippetTitle": "Upravit snippet", - "editSnippetDescription": "Aktualizovat tento snippet příkazu", - "saveSnippetButton": "Uložit změny", - "createSuccess": "Výstřižek byl úspěšně vytvořen", - "createFailed": "Nepodařilo se vytvořit snippet", - "updateSuccess": "Úryvek byl úspěšně aktualizován", - "updateFailed": "Nepodařilo se aktualizovat snippet", - "deleteFailed": "Nepodařilo se odstranit snippet", - "folderCreateSuccess": "Složka byla úspěšně vytvořena", - "folderCreateFailed": "Nepodařilo se vytvořit složku", - "editFolderTitle": "Upravit složku", - "editFolderDescription": "Přejmenovat nebo změnit vzhled této složky", - "saveFolderButton": "Uložit změny", - "editFolder": "Upravit složku", - "deleteFolder": "Odstranit složku", - "folderDeleteSuccess": "Složka \"{{name}}\" byla smazána", - "folderDeleteFailed": "Nepodařilo se odstranit složku", - "folderEditSuccess": "Složka byla úspěšně aktualizována", - "folderEditFailed": "Nepodařilo se aktualizovat složku", - "confirmRunMessage": "Spustit „{{name}}“?", - "confirmRunButton": "Běh", - "runSuccess": "Ano \"{{name}}\" v {{count}} terminálech", - "copySuccess": "Zkopírováno \"{{name}}\" do schránky", - "shareTitle": "Sdílet snippet", - "shareUser": "Uživatel", + "selectAll": "All", + "selectNone": "None", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", "shareRole": "Role", - "selectUser": "Vyberte uživatele...", - "selectRole": "Vyberte roli...", - "shareSuccess": "Úryvek byl úspěšně sdílen", - "shareFailed": "Sdílení snippetu se nezdařilo", - "revokeSuccess": "Přístup zrušen", - "revokeFailed": "Nepodařilo se zrušit přístup", - "currentAccess": "Aktuální přístup", - "shareLoadError": "Nepodařilo se načíst sdílená data", - "loading": "Načítám...", - "close": "Zavřít", - "reorderFailed": "Nepodařilo se uložit pořadí úryvků" + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Nepodařilo se uložit pořadí úryvků", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Účet", - "sectionAppearance": "Vzhled", - "sectionSecurity": "Zabezpečení", - "sectionApiKeys": "API klíče", - "sectionC2sTunnels": "C2S tunely", - "usernameLabel": "Uživatelské jméno", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", "roleLabel": "Role", - "roleAdministrator": "Administrátor", - "authMethodLabel": "Metoda ověření", - "authMethodLocal": "Místní", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "Zapnuto", - "twoFaOff": "Vypnuto", - "versionLabel": "Verze", - "deleteAccount": "Odstranit účet", - "deleteAccountDescription": "Trvale smazat váš účet", - "deleteButton": "Vymazat", - "deleteAccountPermanent": "Tato akce je trvalá a nelze ji vrátit zpět.", - "deleteAccountWarning": "Všechny relace, hosting, přihlašovací údaje a nastavení budou trvale odstraněny.", - "confirmPasswordDeletePlaceholder": "Pro potvrzení zadejte své heslo", - "languageLabel": "Jazyk", - "themeLabel": "Téma", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Barva zvýraznění", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminál", - "commandAutocomplete": "Automatické dokončování příkazu", - "commandAutocompleteDesc": "Zobrazit automatické dokončování při psaní", - "historyTracking": "Sledování historie", - "historyTrackingDesc": "Sledovat příkazy terminálu", - "syntaxHighlighting": "Zvýraznění syntaxe", - "syntaxHighlightingDesc": "Zvýraznit výstup terminálu", - "commandPalette": "Paleta příkazu", - "commandPaletteDesc": "Povolit klávesovou zkratku", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Znovu otevřít karty po přihlášení", "reopenTabsOnLoginDesc": "Obnovte otevřené karty po přihlášení nebo obnovení stránky, a to i z jiného zařízení", - "confirmTabClose": "Potvrdit zavření záložky", - "confirmTabCloseDesc": "Zeptat se před zavřením karet terminálu", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Zobrazit štítky hostitele", - "showHostTagsDesc": "Zobrazit tagy v seznamu hostitelů", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Kliknutím rozbalíte Akce hostitele", "hostTrayOnClickDesc": "Vždy zobrazovat tlačítka pro připojení; kliknutím rozbalíte možnosti správy, místo abyste na něj nasadili myš.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Udržovat levý postranní panel aplikace vždy rozbalený, místo aby se rozbaloval při najetí myší", - "settingsSnippets": "Výstřižky bloků", - "foldersCollapsed": "Sbalené složky", - "foldersCollapsedDesc": "Sbalit složky ve výchozím nastavení", - "confirmExecution": "Potvrdit provedení", - "confirmExecutionDesc": "Potvrdit před spuštěním textových bloků", - "settingsUpdates": "Aktualizace", - "disableUpdateChecks": "Zakázat kontroly aktualizací", - "disableUpdateChecksDesc": "Zastavit kontrolu aktualizací", - "totpAuthenticator": "TOTP autentifikátor", - "totpEnabled": "2FA je povoleno", - "totpDisabled": "Přidat zabezpečení přihlášení", - "disable": "Zakázat", - "enable": "Povolit", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Naskenujte QR kód nebo zadejte tajný klíč ve vaší ověřovací aplikaci, pak zadejte 6místný kód", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Ověřit", - "changePassword": "Změnit heslo", - "currentPasswordLabel": "Aktuální heslo", - "currentPasswordPlaceholder": "Aktuální heslo", - "newPasswordLabel": "Nové heslo", - "newPasswordPlaceholder": "Nové heslo", - "confirmPasswordLabel": "Potvrdit nové heslo", - "confirmPasswordPlaceholder": "Potvrdit nové heslo", - "updatePassword": "Aktualizovat heslo", - "createApiKeyTitle": "Vytvořit klíč API", - "createApiKeyDescription": "Generovat nový API klíč pro programový přístup.", - "apiKeyNameLabel": "Název", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "volitelné", + "optional": "optional", "cancel": "Zrušit", - "createKey": "Vytvořit klíč", - "apiKeyCount": "Klávesy {{count}}", - "newKey": "Nový klíč", - "noApiKeys": "Zatím žádné klíče API.", - "apiKeyActive": "Aktivní", - "apiKeyUsageHint": "Zahrnout váš klíč do", - "apiKeyUsageHintHeader": "záhlaví.", - "apiKeyPermissionsHint": "Klíče dědí oprávnění vytvářejícího uživatele.", - "roleUser": "Uživatel", - "authMethodDual": "Duální ověření", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Nepodařilo se spustit nastavení TOTP", - "totpEnter6Digits": "Zadejte 6místný kód", - "totpEnabledSuccess": "Dvoufaktorové ověřování povoleno", - "totpInvalidCode": "Neplatný kód, zkuste to prosím znovu", - "totpDisableInputRequired": "Zadejte váš TOTP kód nebo heslo", - "totpDisabledSuccess": "Dvoufaktorové ověření zakázáno", - "totpDisableFailed": "Nepodařilo se zakázat 2FA", - "totpDisableTitle": "Zakázat 2FA", - "totpDisablePlaceholder": "Zadejte TOTP kód nebo heslo", - "totpDisableConfirm": "Zakázat 2FA", - "totpContinueVerify": "Pokračovat k ověření", - "totpVerifyTitle": "Ověřit kód", - "totpBackupTitle": "Záložní kódy", - "totpDownloadBackup": "Stáhnout záložní kódy", - "done": "Hotovo", - "secretCopied": "Tajný klíč zkopírován do schránky", - "apiKeyNameRequired": "Je vyžadován název klíče", - "apiKeyCreated": "API klíč \"{{name}}\" byl vytvořen", - "apiKeyCreateFailed": "Nepodařilo se vytvořit API klíč", - "apiKeyUser": "Uživatel", - "apiKeyExpires": "Vyprší", - "apiKeyRevoked": "API klíč \"{{name}}\" odvolán", - "apiKeyRevokeFailed": "Nepodařilo se zrušit klíč API", - "passwordFieldsRequired": "Aktuální a nová hesla jsou vyžadována", - "passwordMismatch": "Hesla se neshodují", - "passwordTooShort": "Heslo musí mít alespoň 6 znaků", - "passwordUpdated": "Heslo úspěšně aktualizováno", - "passwordUpdateFailed": "Aktualizace hesla se nezdařila", - "deletePasswordRequired": "Pro smazání účtu je vyžadováno heslo", - "deleteFailed": "Nepodařilo se odstranit účet", - "deleting": "Odstraňování...", - "colorPickerTooltip": "Otevřít výběr barev", - "themeSystem": "Systém", - "themeLight": "Světlý", - "themeDark": "Tmavý", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarizovaný", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Tmavý", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Odstranit", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/da_DK.json b/src/ui/locales/translated/da_DK.json index f39a46d3..833572f3 100644 --- a/src/ui/locales/translated/da_DK.json +++ b/src/ui/locales/translated/da_DK.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Mapper", - "folder": "Mappe", + "folders": "Folders", + "folder": "Folder", "password": "Adgangskode", - "key": "Nøgle", - "sshPrivateKey": "SSH Privat Nøgle", + "key": "Key", + "sshPrivateKey": "SSH Private Key", "upload": "Upload", - "keyPassword": "Adgangskode Til Nøgle", - "sshKey": "SSH Nøgle", - "uploadPrivateKeyFile": "Upload Privat Nøglefil", - "searchCredentials": "Søg efter legitimationsoplysninger...", - "addCredential": "Tilføj Credential", - "caCertificate": "CA-certifikat (-cert.pub)", - "caCertificateDescription": "Valgfri: Upload eller indsæt CA-signeret certifikatfil (f.eks. id_ed25519-cert.pub). Påkrævet når din SSH-server bruger certifikatbaseret godkendelse.", - "uploadCertFile": "Upload -cert.pub fil", - "clearCert": "Ryd", - "certLoaded": "Certifikat indlæst", - "certPublicKeyLabel": "CA- Certifikat", - "certTypeLabel": "Certifikatets type", - "pasteOrUploadCert": "Indsæt eller upload et -cert.pub certifikat...", - "hasCaCert": "Har CA-certifikat", - "noCaCert": "Intet CA-certifikat" + "keyPassword": "Key Password", + "sshKey": "SSH-nøgle", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Standardordre", + "sortNameAsc": "Navn (A → Å)", + "sortNameDesc": "Navn (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Ryd filtre", + "filterTypeGroup": "Type", + "filterTypePassword": "Adgangskode", + "filterTypeKey": "SSH-nøgle", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Kunne ikke indlæse advarsler", - "failedToDismissAlert": "Mislykkedes at afvise advarsel" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Server Konfiguration", - "description": "Konfigurer Termix-serverens URL til at oprette forbindelse til dine backend-tjenester", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", "serverUrl": "Server URL", - "enterServerUrl": "Indtast venligst en server URL", - "saveFailed": "Konfigurationen kunne ikke gemmes", - "saveError": "Fejl under lagring af konfiguration", - "saving": "Gemmer...", - "saveConfig": "Gem Konfiguration", - "helpText": "Angiv URL'en hvor din Termix-server kører (f.eks. http://localhost:30001 eller https://your-server.com)", - "changeServer": "Skift Server", - "mustIncludeProtocol": "Server URL skal starte med http:// eller https://", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Tillad ugyldigt certifikat", "allowInvalidCertificateDesc": "Brug kun til betroede, selvhostede servere med selvsignerede certifikater eller IP-adressecertifikater.", - "useEmbedded": "Brug Lokal Server", - "embeddedDesc": "Kør Termix med den indbyggede lokale server (ingen fjernserver er nødvendig)", - "embeddedConnecting": "Forbinder til lokal server...", - "embeddedNotReady": "Lokal server er ikke klar endnu. Vent et øjeblik og prøv igen.", - "localServer": "Lokal Server" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Fjerne" }, "versionCheck": { - "error": "Fejl Ved Versionskontrol", - "checkFailed": "Mislykkedes at tjekke for opdateringer", - "upToDate": "App er opdateret", - "currentVersion": "Du kører version {{version}}", - "updateAvailable": "Opdatering Tilgængelig", - "newVersionAvailable": "En ny version er tilgængelig! Du kører {{current}}, men {{latest}} er tilgængelig.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Beta Version", - "betaVersionDesc": "Du kører {{current}}, som er nyere end den seneste stabile udgave {{latest}}.", - "releasedOn": "Udgivet til {{date}}", - "downloadUpdate": "Download Opdatering", - "checking": "Søger efter opdateringer...", - "checkUpdates": "Søg efter opdateringer", - "checkingUpdates": "Søger efter opdateringer...", - "updateRequired": "Opdatering Påkrævet" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Luk", + "close": "Close", "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Fortsæt", - "maintenance": "Vedligeholdelse", - "degraded": "Fortyndet", - "error": "Fejl", - "warning": "Advarsel", - "unsavedChanges": "Ikke-gemte ændringer", - "dismiss": "Afvis", - "loading": "Indlæser...", - "optional": "Valgfri", - "connect": "Forbind", - "copied": "Kopieret", - "connecting": "Forbinder...", - "updateAvailable": "Opdatering Tilgængelig", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Åbn i nyt faneblad", - "noReleases": "Ingen Udgivelser", - "updatesAndReleases": "Opdaterer & Udgivelser", - "newVersionAvailable": "En ny version ({{version}}) er tilgængelig.", - "failedToFetchUpdateInfo": "Mislykkedes at hente opdateringsinformation", - "preRelease": "Forudløsning", - "noReleasesFound": "Ingen udgivelser fundet.", - "cancel": "Annuller", - "username": "Brugernavn", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Ophæve", + "username": "Username", "login": "Login", - "register": "Registrer", + "logout": "Logout", + "register": "Register", "password": "Adgangskode", - "confirmPassword": "Bekræft Adgangskode", - "back": "Tilbage", - "save": "Gem", - "saving": "Gemmer...", - "delete": "Slet", - "rename": "Omdøb", - "edit": "Rediger", - "add": "Tilføj", - "confirm": "Bekræft", - "no": "Nej", - "or": "ELLER", - "next": "Næste", - "previous": "Forrige", - "refresh": "Opdater", - "language": "Sprog", - "checking": "Kontrollerer...", - "checkingDatabase": "Kontrollerer databaseforbindelse...", - "checkingAuthentication": "Kontrollerer godkendelse...", - "backendReconnected": "Server forbindelse gendannet", - "connectionDegraded": "Serverforbindelse tabt, genoprette…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Fjern", - "create": "Opret", - "update": "Opdater", - "copy": "Kopiér", - "copyFailed": "Kunne ikke kopiere til udklipsholder", + "remove": "Fjerne", + "create": "Create", + "update": "Update", + "copy": "Kopi", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Gendan", - "of": "af" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Hjem", + "home": "Home", "terminal": "Terminal", "docker": "Docker", - "tunnels": "Tunneler", + "tunnels": "Tunnels", "fileManager": "Filhåndtering", - "serverStats": "Server Statistik", - "admin": "Administrator", - "userProfile": "Bruger Profil", - "splitScreen": "Opdel Skærm", - "confirmClose": "Luk denne aktive session?", - "close": "Luk", - "cancel": "Annuller", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Ophæve", "sshManager": "SSH Manager", - "cannotSplitTab": "Kan ikke dele dette faneblad", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Kopier Adgangskode", - "copySudoPassword": "Kopier Sudo Adgangskode", - "passwordCopied": "Adgangskode kopieret til udklipsholder", - "noPasswordAvailable": "Ingen adgangskode tilgængelig", - "failedToCopyPassword": "Kunne ikke kopiere adgangskode", - "refreshTab": "Opdater forbindelse", - "openFileManager": "Åbn Filhåndtering", - "dashboard": "Instrumentbræt", - "networkGraph": "Netværk Graf", - "quickConnect": "Hurtig Forbindelse", - "sshTools": "SSH Værktøjer", - "history": "Historik", - "hosts": "Værter", - "snippets": "Stumper", - "hostManager": "Vært Manager", - "credentials": "Legitimation", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Forbindelser", "roleAdministrator": "Administrator", - "roleUser": "Bruger" + "roleUser": "User" }, "hosts": { - "hosts": "Værter", - "noHosts": "Ingen SSH værter", - "retry": "Forsøg igen", - "refresh": "Opdater", - "optional": "Valgfri", - "downloadSample": "Hent Eksempel", - "failedToDeleteHost": "Kunne ikke slette {{name}}", - "importSkipExisting": "Import (spring over eksisterende)", - "connectionDetails": "Forbindelse Detaljer", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Prøv igen", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Fjernskrivebord", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Brugernavn", - "folder": "Mappe", - "tags": "Mærker", - "pin": "Fastgør", - "addHost": "Tilføj Vært", - "editHost": "Rediger Vært", - "cloneHost": "Klon Vært", - "enableTerminal": "Aktiver Terminal", - "enableTunnel": "Aktiver Tunnel", - "enableFileManager": "Aktiver Filhåndtering", - "enableDocker": "Aktiver Docker", - "defaultPath": "Standard Sti", - "connection": "Forbindelse", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", "upload": "Upload", - "authentication": "Godkendelse", + "authentication": "Authentication", "password": "Adgangskode", - "key": "Nøgle", - "credential": "Credential", + "key": "Key", + "credential": "Legitimationsoplysninger", "none": "Ingen", - "sshPrivateKey": "SSH Privat Nøgle", - "keyType": "Nøgle Type", - "uploadFile": "Upload Fil", - "tabGeneral": "Generelt", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", + "tabTerminal": "Terminal", + "tabRdp": "Landdistriktsudviklingsplan", "tabVnc": "VNC", - "tabTunnels": "Tunneler", + "tabTunnels": "Tunnels", "tabDocker": "Docker", - "tabFiles": "Filer", - "tabStats": "Statistik", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Deling", - "tabAuthentication": "Godkendelse", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunnel", "fileManager": "Filhåndtering", - "serverStats": "Server Statistik", + "serverStats": "Host Metrics", "status": "Status", - "folderRenamed": "Mappe \"{{oldName}}\" omdøbt til \"{{newName}}\" lykkedes", - "failedToRenameFolder": "Kunne ikke omdøbe mappe", - "movedToFolder": "Flyttet til \"{{folder}}\"", - "editHostTooltip": "Rediger vært", - "statusChecks": "Status Kontrol", - "metricsCollection": "Metrik Samling", - "metricsInterval": "Interval For Metrikelsamling", - "metricsIntervalDesc": "Hvor ofte at indsamle server statistik (5s - 1h)", - "behavior": "Opførsel", - "themePreview": "Tema Forhåndsvisning", - "theme": "Tema", - "fontFamily": "Skrifttype Familie", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Bogstav Afstand", - "lineHeight": "Linje Højde", - "cursorStyle": "Markør Stil", - "cursorBlink": "Markør Blink", - "scrollbackBuffer": "Rullback Buffer", - "bellStyle": "Klokke Stil", - "rightClickSelectsWord": "Højreklik Vælger Ord", - "fastScrollModifier": "Hurtig Scroll Modifikator", - "fastScrollSensitivity": "Hurtig Rul Følsomhed", - "sshAgentForwarding": "SSH Agent Videresend", - "backspaceMode": "Backspace Tilstand", - "startupSnippet": "Opstart Snippet", - "selectSnippet": "Vælg snippet", - "forceKeyboardInteractive": "Tving Tastatur-Interaktiv", - "overrideCredentialUsername": "Tilsidesæt Credential Brugernavn", - "overrideCredentialUsernameDesc": "Brug brugernavnet angivet ovenfor i stedet for legitimationsoplysningens brugernavn", - "jumpHostChain": "Hop Host Kæde", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", - "addKnock": "Tilføj Port", - "addProxyNode": "Tilføj Node", + "addKnock": "Add Port", + "addProxyNode": "Add Node", "proxyNode": "Proxy Node", - "proxyType": "Proxy- Type", - "quickActions": "Hurtige Handlinger", - "sudoPasswordAutoFill": "Sudo Password AutoFyld", - "sudoPassword": "Sudo Adgangskode", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", "keepaliveInterval": "Keepalive Interval (ms)", - "moshCommand": "MOSH Kommando", - "environmentVariables": "Miljø Variabler", - "addVariable": "Tilføj Variabel", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Kopier Terminal- URL", - "copyFileManagerUrl": "Kopiér Filhåndterings URL", - "copyRemoteDesktopUrl": "Kopiér Fjernskrivebords URL", - "failedToConnect": "Kunne ikke forbinde til konsollen", - "connect": "Forbind", - "disconnect": "Afbryd", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", "start": "Start", - "enableStatusCheck": "Aktiver Status Tjek", - "enableMetrics": "Aktiver Metrics", - "bulkUpdateFailed": "Masse opdatering mislykkedes", - "selectAll": "Vælg Alle", - "deselectAll": "Fravælg Alle", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Sikker Skal", - "virtualNetwork": "Virtuelt Netværk", - "unencryptedShell": "Ukrypteret skal", - "addressIp": "Adresse / IP", - "friendlyName": "Venligt Navn", - "folderAndAdvanced": "Mappe & Avanceret", - "privateNotes": "Private Noter", - "privateNotesPlaceholder": "Detaljer om denne server...", - "pinToTop": "Fastgør til toppen", - "pinToTopDesc": "Vis altid denne vært øverst på listen", - "portKnockingSequence": "Port Knocking Sekvens", - "addKnockBtn": "Tilføj Knock", - "noPortKnocking": "Ingen port knocking konfigureret.", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", "knockPort": "Knock Port", - "protocol": "Protocol", - "delayAfterMs": "Forsinkelse Efter (ms)", - "useSocks5Proxy": "Brug SOCKS5 Proxy", - "useSocks5ProxyDesc": "Rute forbindelse via en proxyserver", + "protocol": "Protokol", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", "proxyHost": "Proxy Host", "proxyPort": "Proxy Port", - "proxyUsername": "Proxy Brugernavn", - "proxyPassword": "Proxy Adgangskode", - "proxySingleMode": "Enkelt Proxy", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", "proxyChainMode": "Proxy Chain", - "you": "Dig", - "jumpHostChainLabel": "Hop Host Kæde", - "addJumpBtn": "Tilføj Hop", - "noJumpHosts": "Ingen hop værter konfigureret.", - "selectAServer": "Vælg en server...", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", "sshPort": "SSH Port", - "authMethod": "Auth Metode", - "storedCredential": "Gemte Credential", - "selectACredential": "Vælg en legitimationsoplysning...", - "keyTypeLabel": "Nøgle Type", - "keyTypeAuto": "Automatisk Detektering", - "keyPasteTab": "Indsæt", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", "keyUploadTab": "Upload", - "keyFileLoaded": "Nøgle fil indlæst", - "keyUploadClick": "Klik for at uploade .pem / .key / .ppk", - "clearKey": "Ryd nøgle", - "keySaved": "SSH-nøgle gemt", - "keyReplaceNotice": "indsæt en ny nøgle nedenfor for at erstatte den", - "keyPassphraseSaved": "Adgangssætning gemt, type for at ændre", - "replaceKey": "Erstat nøgle", - "forceKeyboardInteractiveLabel": "Tving Tastatur Interaktiv", - "forceKeyboardInteractiveShortDesc": "Gennemtving manuel adgangskodeindtastning, selvom nøgler er til stede", - "terminalAppearance": "Terminal Udseende", - "colorTheme": "Farve Tema", - "fontFamilyLabel": "Skrifttype Familie", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Markør Stil", - "letterSpacingPx": "Bogstavafstand (px)", - "lineHeightLabel": "Linje Højde", - "bellStyleLabel": "Klokke Stil", - "backspaceModeLabel": "Backspace Tilstand", - "cursorBlinking": "Markør Blinker", - "cursorBlinkingDesc": "Aktivér blinkende animation for terminalmarkøren", - "rightClickSelectsWordLabel": "Højreklik Vælger Ord", - "rightClickSelectsWordShortDesc": "Vælg ordet under markøren ved højreklik", - "behaviorAndAdvanced": "Opførsel Og Avanceret", - "scrollbackBufferLabel": "Rullback Buffer", - "scrollbackMaxLines": "Maksimalt antal linjer i historikken", - "sshAgentForwardingLabel": "SSH Agent Videresend", - "sshAgentForwardingShortDesc": "Kassér dine lokale SSH-nøgler til denne vært", - "enableAutoMosh": "Aktivér Auto-Mosh", - "enableAutoMoshDesc": "Foretræk Mosh frem for SSH hvis tilgængelig", - "enableAutoTmux": "Aktivér Auto-Tmux", - "enableAutoTmuxDesc": "Start eller vedhæft automatisk til tmux session", - "sudoPasswordAutoFillLabel": "Sudo Adgangskode Auto-Udfyld", - "sudoPasswordAutoFillShortDesc": "Angiv automatisk sudo adgangskode, når du bliver spurgt", - "sudoPasswordLabel": "Sudo Adgangskode", - "environmentVariablesLabel": "Miljø Variabler", - "addVariableBtn": "Tilføj Variabel", - "noEnvVars": "Ingen miljøvariabler konfigureret.", - "fastScrollModifierLabel": "Hurtig Scroll Modifikator", - "fastScrollSensitivityLabel": "Hurtig Rul Følsomhed", - "moshCommandLabel": "Mosh Kommando", - "startupSnippetLabel": "Opstart Snippet", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Keepalive-interval (sekunder)", - "maxKeepaliveMisses": "Maks. Keepalive Mangler", - "tunnelSettings": "Tunnel Indstillinger", - "enableTunneling": "Aktiver Tunneling", - "enableTunnelingDesc": "Aktiver SSH-tunnelfunktionalitet for denne vært", - "serverTunnelsSection": "Servertunneler", - "addTunnelBtn": "Tilføj Tunnel", - "noTunnelsConfigured": "Ingen tunneler konfigureret.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", "tunnelType": "Tunnel Type", - "tunnelModeLocalDesc": "Videresend en lokal port til en port på den eksterne server (eller en vært, der kan nås fra den).", - "tunnelModeRemoteDesc": "Videresend en port på den eksterne server tilbage til en lokal port på din maskine.", - "tunnelModeDynamicDesc": "Opret en SOCKS5 proxy på en lokal port til dynamisk port viderestilling.", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Denne vært (direkte tunnel)", - "endpointHost": "Endepunkt Vært", - "endpointPort": "Endepunkt Port", - "bindHost": "Bind Vært", - "sourcePort": "Kilde Port", - "maxRetries": "Maks. Forsøg", - "retryIntervalS": "Forsøg Interval (s)", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", "autoStartLabel": "Auto-start", - "autoStartDesc": "Tilslut automatisk denne tunnel når værten indlæses", - "tunnelConnecting": "Tunnel forbinder...", - "tunnelDisconnected": "Tunnel afbrudt", - "failedToConnectTunnel": "Kunne ikke forbinde", - "failedToDisconnectTunnel": "Afbrydelse af forbindelse mislykkedes", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", "dockerIntegration": "Docker Integration", - "enableDockerMonitor": "Aktiver Docker", - "enableDockerMonitorDesc": "Overvåg og administrere containere på denne vært via Docker", - "enableFileManagerMonitor": "Aktiver Filhåndtering", - "enableFileManagerMonitorDesc": "Gennemse og administrere filer på denne vært over SFTP", - "defaultPathLabel": "Standard Sti", - "fileManagerPathHint": "Mappen der skal åbnes når filhåndteringen starter for denne vært.", - "statusChecksLabel": "Status Kontrol", - "enableStatusChecks": "Aktiver Statuskontrol", - "enableStatusChecksDesc": "Periodisk ping af denne vært for at bekræfte tilgængelighed", - "useGlobalInterval": "Brug Globalt Interval", - "useGlobalIntervalDesc": "Tilsidesæt med intervallet for statuscheck for hele serveren", - "checkIntervalS": "Kontroller Interval (s)", - "checkIntervalDesc": "Sekunder mellem hver tilslutning ping", - "metricsCollectionLabel": "Metrik Samling", - "enableMetricsLabel": "Aktiver Metrics", - "enableMetricsDesc": "Indsaml CPU, RAM, disk, og netværksbrug fra denne vært", - "useGlobalMetrics": "Brug Globalt Interval", - "useGlobalMetricsDesc": "Tilsidesæt med serverens måleinterval", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Adgangskode", + "authTypeKey": "SSH-nøgle", + "authTypeCredential": "Legitimationsoplysninger", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Ingen", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", "metricsIntervalS": "Metrics Interval (s)", - "metricsIntervalDesc2": "Sekunder mellem metriske snapshots", - "visibleWidgets": "Synlige Widgets", - "cpuUsageLabel": "CPU Forbrug", - "cpuUsageDesc": "CPU procent, load gennemsnit, sparkline graf", - "memoryLabel": "Hukommelsesforbrug", - "memoryDesc": "RAM-forbrug, swap, cachet", - "storageLabel": "Diskforbrug", - "storageDesc": "Diskforbrug pr. monteringspunkt", - "networkLabel": "Netværksgrænseflader", - "networkDesc": "Grænseflade liste og båndbredde", - "uptimeLabel": "Oppetid", - "uptimeDesc": "Systemets oppetid og starttid", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", "systemInfoLabel": "System Info", - "systemInfoDesc": "OS, kerne, værtsnavn, arkitektur", - "recentLoginsLabel": "Seneste Logins", - "recentLoginsDesc": "Succesfulde og mislykkede login begivenheder", - "topProcessesLabel": "Top Processer", - "topProcessesDesc": "PID, CPU%, MEM%, kommando", - "listeningPortsLabel": "Lytter Havne", - "listeningPortsDesc": "Åbne porte med proces og tilstand", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, SELinux-status", - "quickActionsLabel": "Hurtige Handlinger", - "quickActionsToolbar": "Hurtige handlinger vises som knapper i serveren statistik værktøjslinjen for et enkelt klik kommando udførelse.", - "noQuickActions": "Ingen hurtige handlinger endnu.", - "buttonLabel": "Knap etiket", - "selectSnippetPlaceholder": "Vælg snippet...", - "addActionBtn": "Tilføj Handling", - "hostSharedSuccessfully": "Vært delt med succes", - "failedToShareHost": "Kunne ikke dele vært", - "accessRevoked": "Adgang tilbagekaldt", - "failedToRevokeAccess": "Mislykkedes at tilbagekalde adgang", - "cancelBtn": "Annuller", - "savingBtn": "Gemmer...", - "addHostBtn": "Tilføj Vært", - "hostUpdated": "Vært opdateret", - "hostCreated": "Vært oprettet", - "failedToSave": "Kunne ikke gemme vært", - "credentialUpdated": "Credential opdateret", - "credentialCreated": "Credential oprettet", - "failedToSaveCredential": "Kunne ikke gemme legitimationsoplysninger", - "backToHosts": "Tilbage til værter", - "backToCredentials": "Tilbage til legitimationsoplysninger", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Ophæve", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Fastgjort", - "noHostsFound": "Ingen værter fundet", - "tryDifferentTerm": "Prøv et andet udtryk", - "addFirstHost": "Tilføj din første vært for at komme i gang", - "noCredentialsFound": "Ingen legitimationsoplysninger fundet", - "addCredentialBtn": "Tilføj Credential", - "updateCredentialBtn": "Opdater Credential", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Funktioner", - "noFolder": "(Ingen mappe)", - "deleteSelected": "Slet", - "exitSelection": "Afslut markering", - "importSkip": "Import (spring over eksisterende)", - "importOverwrite": "Import (overskrivning)", - "collapseBtn": "Sammenfold", - "importExportBtn": "Import / Eksport", - "hostStatusesRefreshed": "Værtsstatusser opdateret", - "failedToRefreshHosts": "Kunne ikke genopfriske værter", - "movedHostTo": "Flyttet {{host}} til \"{{folder}}\"", - "failedToMoveHost": "Kunne ikke flytte vært", - "folderRenamedTo": "Mappe omdøbt til \"{{name}}\"", - "deletedFolder": "Slettede mappe \"{{name}}\"", - "failedToDeleteFolder": "Kunne ikke slette mappe", - "deleteAllInFolder": "Slet alle værter i \"{{name}}\"? Dette kan ikke fortrydes.", - "deletedHost": "Slettede {{name}}", - "copiedToClipboard": "Kopieret til udklipsholder", - "terminalUrlCopied": "Terminal URL kopieret", - "fileManagerUrlCopied": "Filhåndterings URL kopieret", - "tunnelUrlCopied": "Tunnel URL kopieret", - "dockerUrlCopied": "Docker URL kopieret", - "serverStatsUrlCopied": "Server statistik URL kopieret", - "rdpUrlCopied": "RDP- URL kopieret", - "vncUrlCopied": "VNC URL kopieret", - "telnetUrlCopied": "Telnet URL kopieret", - "remoteDesktopUrlCopied": "Fjernskrivebords URL kopieret", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Ophæve", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protokol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Udvid handlinger", "collapseActions": "Skjul handlinger", "wakeOnLanAction": "Vågn på LAN", - "wakeOnLanSuccess": "Magisk pakke sendt til {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Kunne ikke sende magisk pakke", - "cloneHostAction": "Klon Vært", - "copyAddress": "Kopiér Adresse", - "copyLink": "Kopier Link", - "copyTerminalUrlAction": "Kopier Terminal- URL", - "copyFileManagerUrlAction": "Kopiér Filhåndterings URL", - "copyTunnelUrlAction": "Kopier Tunnel URL", - "copyDockerUrlAction": "Kopier Docker-URL", - "copyServerStatsUrlAction": "Kopier Server Statistik URL", - "copyRdpUrlAction": "Kopier RDP- URL", - "copyVncUrlAction": "Kopier VNC URL", - "copyTelnetUrlAction": "Kopier Telnet Url", - "copyRemoteDesktopUrlAction": "Kopiér Fjernskrivebords URL", - "deleteCredentialConfirm": "Slet legitimationsoplysninger \"{{name}}\"?", - "deletedCredential": "Slettede {{name}}", - "deploySSHKeyTitle": "Deploy SSH-nøgle", - "deployingBtn": "Implementerer...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Deploy", - "failedToDeployKey": "Kunne ikke implementere nøgle", - "deleteHostsConfirm": "Slet {{count}} vært{{plural}}? Dette kan ikke fortrydes.", - "movedToRoot": "Flyttet til rod", - "failedToMoveHosts": "Flytning af værter mislykkedes", - "enableTerminalFeature": "Aktiver Terminal", - "disableTerminalFeature": "Deaktivér Terminal", - "enableFilesFeature": "Aktiver Filer", - "disableFilesFeature": "Deaktivér Filer", - "enableTunnelsFeature": "Aktiver Tunneler", - "disableTunnelsFeature": "Deaktivér Tunneler", - "enableDockerFeature": "Aktiver Docker", - "disableDockerFeature": "Deaktivér Docker", - "addTagsPlaceholder": "Tilføj tags...", - "authDetails": "Autentificeringsoplysninger", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", "credType": "Type", - "generateKeyPairDesc": "Generer et nyt nøglepar, vil både private og offentlige nøgler blive udfyldt automatisk.", - "generatingKey": "Genererer...", - "generateLabel": "Generer {{label}}", - "uploadFileBtn": "Upload fil", - "keyPassphraseOptional": "Nøglekodeord (valgfri)", - "sshPublicKeyOptional": "Offentlig SSH Nøgle (Valgfri)", - "publicKeyGenerated": "Offentlig nøgle genereret", - "failedToGeneratePublicKey": "Kunne ikke udlede offentlig nøgle", - "publicKeyCopied": "Offentlig nøgle kopieret", - "keyPairGenerated": "{{label}} nøglepar genereret", - "failedToGenerateKeyPair": "Kunne ikke generere nøglepar", - "searchHostsPlaceholder": "Søg efter værter, adresser, tags…", - "searchCredentialsPlaceholder": "Søg efter legitimationsoplysninger…", - "refreshBtn": "Opdater", - "addTag": "Tilføj tags...", - "deleteConfirmBtn": "Slet", - "tunnelRequirementsText": "SSH-serveren skal have GatewayPorts ja, AllowTcpForwarding yes, og PermitRootLogin ja sat i /etc/ssh/sshd_config.", - "deleteHostConfirm": "Slet \"{{name}}\"?", - "enableAtLeastOneProtocol": "Aktivér mindst én protokol ovenfor for at konfigurere godkendelse og forbindelsesindstillinger.", - "keyPassphrase": "Nøglekodeord", - "connectBtn": "Forbind", - "disconnectBtn": "Afbryd", - "basicInformation": "Grundlæggende Oplysninger", - "authDetailsSection": "Autentificeringsoplysninger", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", "credTypeLabel": "Type", - "hostsTab": "Værter", - "credentialsTab": "Legitimation", - "selectMultiple": "Vælg flere", - "selectHosts": "Vælg værter", - "connectionLabel": "Forbindelse", - "authenticationLabel": "Godkendelse", - "generateKeyPairTitle": "Generer Nøglepar", - "generateKeyPairDescription": "Generer et nyt nøglepar, vil både private og offentlige nøgler blive udfyldt automatisk.", - "generateFromPrivateKey": "Generer fra privat nøgle", - "refreshBtn2": "Opdater", - "exitSelectionTitle": "Afslut markering", - "exportAll": "Eksporter Alle", - "addHostBtn2": "Tilføj Vært", - "addCredentialBtn2": "Tilføj Credential", - "checkingHostStatuses": "Kontrollerer værtsstatusser...", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Fastgjort", - "hostsExported": "Værter eksporteret succesfuldt", + "hostsExported": "Hosts exported successfully", "exportFailed": "Kunne ikke eksportere værter", - "sampleDownloaded": "Eksempel fil downloadet", - "failedToDeleteCredential2": "Kunne ikke slette legitimationsoplysninger", - "noFolderOption": "(Ingen mappe)", - "nSelected": "{{count}} valgt", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Funktioner", - "moveMenu": "Flyt", - "cancelSelection": "Annuller", - "deployDialogDesc": "Deploy {{name}} til en værts autoriserede_keys.", - "targetHostLabel": "Mål Vært", - "selectHostOption": "Vælg en vært...", - "keyDeployedSuccess": "Nøgle implementeret med succes", - "failedToDeployKey2": "Kunne ikke implementere nøgle", - "deletedCount": "Slettede {{count}} værter", - "failedToDeleteCount": "Kunne ikke slette {{count}} værter", - "duplicatedHost": "Duplikeret \"{{name}}\"", - "failedToDuplicateHost": "Kunne ikke duplikere vært", - "updatedCount": "Opdateret {{count}} værter", - "friendlyNameLabel": "Venligt Navn", - "descriptionLabel": "Varebeskrivelse", - "loadingHost": "Indlæser vært...", - "loadingHosts": "Indlæser værter...", - "loadingCredentials": "Indlæser legitimationsoplysninger...", - "noHostsYet": "Ingen værter endnu", - "noHostsMatchSearch": "Ingen værter matcher din søgning", - "hostNotFound": "Vært ikke fundet", - "searchHosts": "Søg efter værter...", + "moveMenu": "Flytte", + "connectSelected": "Connect", + "cancelSelection": "Ophæve", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Sortér værter", "sortDefault": "Standardordre", "sortNameAsc": "Navn (A → Å)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "Tags", - "shareHost": "Del Vært", - "shareHostTitle": "Del: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Denne vært skal bruge legitimationsoplysninger for at aktivere deling. Redigér værten og tildel et legitimationsoplysninger først." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Forbindelse", - "authentication": "Godkendelse", - "connectionSettings": "Forbindelsesindstillinger", - "displaySettings": "Vis Indstillinger", - "audioSettings": "Indstillinger For Lyd", - "rdpPerformance": "RDP- Ydelse", - "deviceRedirection": "Enhed Omdirigering", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Legitimationsoplysninger", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", "session": "Session", - "gateway": "Port", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Udklipsholder", - "sessionRecording": "Session Optagelse", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Vnc Indstillinger", - "terminalSettings": "Terminalindstillinger", - "rdpPort": "Rdp Port", - "username": "Brugernavn", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Adgangskode", - "domain": "Domæne", - "securityMode": "Sikkerheds Tilstand", - "colorDepth": "Farve Dybde", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Højde", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Ændr Størrelsesmetode", - "clientName": "Klient Navn", - "initialProgram": "Oprindeligt Program", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Port Til Port", - "gatewayUsername": "Gateway Brugernavn", - "gatewayPassword": "Gateway Adgangskode", - "gatewayDomain": "Gateway Domæne", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "RemoteApp Program", - "workingDirectory": "Arbejdsmappe", - "arguments": "Argumenter", - "normalizeLineEndings": "Normalisér Linjeafslutninger", - "recordingPath": "Optagelsessti", - "recordingName": "Optagelses Navn", - "macAddress": "MAC- Adresse", - "broadcastAddress": "Broadcast- Adresse", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Vent Tid (r)", - "driveName": "Drev Navn", - "drivePath": "Kør Sti", - "ignoreCertificate": "Ignorer Certifikat", - "ignoreCertificateDesc": "Tillad forbindelser til værter med selvsignerede certifikater", - "forceLossless": "Gennemtving Tabsfri", - "forceLosslessDesc": "Gennemtving tabsfri billedkodning (højere kvalitet, mere båndbredde)", - "disableAudio": "Deaktivér Lyd", - "disableAudioDesc": "Lydløs al lyd fra den eksterne session", - "enableAudioInput": "Aktiver Audio Input (Mikrofon)", - "enableAudioInputDesc": "Videresend lokal mikrofon til den eksterne session", - "wallpaper": "Baggrund", - "wallpaperDesc": "Vis skrivebordsbaggrund (deaktivering forbedrer ydeevnen)", - "theming": "Temaer", - "themingDesc": "Aktiver visuelle temaer og stilarter", - "fontSmoothing": "Skrifttype Udjævning", - "fontSmoothingDesc": "Aktiver ClearType skrifttype rendering", - "fullWindowDrag": "Fuldt Vindue Træk", - "fullWindowDragDesc": "Vis vindueindhold under trækning", - "desktopComposition": "Skrivebords Sammensætning", - "desktopCompositionDesc": "Aktiver Aero glas effekter", - "menuAnimations": "Menu Animationer", - "menuAnimationsDesc": "Aktiver menu fade og dias-animationer", - "disableBitmapCaching": "Deaktivér Bitmap- Caching", - "disableBitmapCachingDesc": "Slå bitmap-cache fra (kan hjælpe med glitches)", - "disableOffscreenCaching": "Deaktivér Offscreen Caching", - "disableOffscreenCachingDesc": "Slå offscreen cache fra", - "disableGlyphCaching": "Deaktivér Symbol Caching", - "disableGlyphCachingDesc": "Slå glyph cache fra", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Brug RemoteFX grafik pipeline", - "enablePrinting": "Aktiver Udskrivning", - "enablePrintingDesc": "Omdiriger lokale printere til fjernsessionen", - "enableDriveRedirection": "Aktiver Drev Omdirigering", - "enableDriveRedirectionDesc": "Kortlæg en lokal mappe som et drev i den eksterne session", - "createDrivePath": "Opret Kørselssti", - "createDrivePathDesc": "Opret automatisk mappen, hvis den ikke findes", - "disableDownload": "Deaktivér Download", - "disableDownloadDesc": "Undgå at downloade filer fra den eksterne session", - "disableUpload": "Deaktivér Upload", - "disableUploadDesc": "Forhindr upload af filer til den eksterne session", - "enableTouch": "Aktivér Touch", - "enableTouchDesc": "Aktiver berørings-input-videresendelse", - "consoleSession": "Konsol Session", - "consoleSessionDesc": "Opret forbindelse til konsollen (session 0) i stedet for en ny session", - "sendWolPacket": "Send WOL Pakke", - "sendWolPacketDesc": "Send en magisk pakke til at vække denne vært før tilslutning", - "disableCopy": "Deaktivér Kopiering", - "disableCopyDesc": "Forhindr kopiering af tekst fra den eksterne session", - "disablePaste": "Deaktivér Indsæt", - "disablePasteDesc": "Forhindre indsættelse af tekst i den eksterne session", - "createPathIfMissing": "Opret sti, hvis der mangler", - "createPathIfMissingDesc": "Opret automatisk optagelsesmappen", - "excludeOutput": "Udeluk Output", - "excludeOutputDesc": "Optag ikke skærmoutput (kun metadata)", - "excludeMouse": "Udeluk Mus", - "excludeMouseDesc": "Optag ikke musebevægelser", - "includeKeystrokes": "Inkludér Nøglestreger", - "includeKeystrokesDesc": "Optag rå tastetryk ud over skærmoutput", - "vncPort": "Vnc Port", - "vncPassword": "VNC Adgangskode", - "vncUsernameOptional": "Brugernavn (valgfrit)", - "vncLeaveBlank": "Efterlad blank, hvis ikke påkrævet", - "cursorMode": "Markør Tilstand", - "swapRedBlue": "Byt Rød/Blå", - "swapRedBlueDesc": "Byt de røde og blå farvekanaler (løser nogle farveproblemer)", - "readOnly": "Skrivebeskyttet", - "readOnlyDesc": "Se fjernskærmen uden at sende input", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", "telnetPort": "Telnet Port", - "terminalType": "Terminaltype", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Farvesammensætning", - "backspaceKey": "Backspace Nøgle", - "saveHostFirst": "Gem værten først.", - "sharingOptionsAfterSave": "Delingsindstillinger er tilgængelige, efter at værten er blevet gemt.", - "sharingLoadError": "Kunne ikke indlæse delingsdata. Tjek din forbindelse og prøv igen.", - "shareHostSection": "Del Vært", - "shareWithUser": "Del med bruger", - "shareWithRole": "Del med Rolle", - "selectUser": "Vælg Bruger", - "selectRole": "Vælg Rolle", - "selectUserOption": "Vælg en bruger...", - "selectRoleOption": "Vælg en rolle...", - "permissionLevel": "Tilladelsesniveau", - "expiresInHours": "Udløber om (timer)", - "noExpiryPlaceholder": "Lad være tom for ingen udløbsdato", - "shareBtn": "Del", - "currentAccess": "Nuværende Adgang", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Tilladelse", - "grantedByHeader": "Tildelt Af", - "expiresHeader": "Udløber", - "noAccessEntries": "Ingen adgangsposter endnu.", - "expiredLabel": "Udløbet", - "neverLabel": "Aldrig", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Annuller", - "savingBtn": "Gemmer...", - "updateHostBtn": "Opdater Vært", - "addHostBtn": "Tilføj Vært" + "cancelBtn": "Ophæve", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Søg efter værter, kommandoer eller indstillinger...", - "quickActions": "Hurtige Handlinger", - "hostManager": "Vært Manager", - "hostManagerDesc": "Håndtere, tilføje eller redigere værter", - "addNewHost": "Tilføj Ny Vært", - "addNewHostDesc": "Registrer en ny vært", - "adminSettings": "Admin Indstillinger", - "adminSettingsDesc": "Konfigurere systempræferencer og brugere", - "userProfile": "Bruger Profil", - "userProfileDesc": "Administrer din konto og præferencer", - "addCredential": "Tilføj Credential", - "addCredentialDesc": "Gem SSH-nøgler eller adgangskoder", - "recentActivity": "Seneste Aktivitet", - "serversAndHosts": "Servere Og Værter", - "noHostsFound": "Ingen værter fundet matchende \"{{search}}\"", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", "links": "Links", "navigate": "Navigate", - "select": "Vælg", - "toggleWith": "Skift med" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Ingen fane tildelt", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktiv rude" }, "connections": { "noConnections": "Ingen forbindelser", "noConnectionsDesc": "Åbn en terminal, filhåndtering eller fjernskrivebord for at se forbindelser her", - "connectedFor": "Forbundet for {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Forbundet", "disconnected": "Afbrudt", "closeTab": "Luk faneblad", @@ -801,358 +981,374 @@ "sectionBackground": "Baggrund", "backgroundDesc": "Sessioner fortsætter i 30 minutter efter afbrydelse og kan genoprettes.", "persisted": "Fortsatte i baggrunden", - "expiresIn": "Udløber om {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Søg efter forbindelser...", - "noSearchResults": "Ingen forbindelser matcher din søgning" + "noSearchResults": "Ingen forbindelser matcher din søgning", + "rename": "Rename session" }, "guacamole": { - "connecting": "Forbinder til {{type}} session...", - "connectionError": "Forbindelsesfejl", - "connectionFailed": "Forbindelse mislykkedes", - "failedToConnect": "Kunne ikke hente forbindelsestoken", - "hostNotFound": "Vært ikke fundet", - "noHostSelected": "Ingen vært valgt", - "reconnect": "Genopret", - "retry": "Forsøg igen", - "guacdUnavailable": "Fjernskrivebordstjeneste (guacd) er ikke tilgængelig. Sørg for, at guacd kører og er tilgængelig og konfigureret korrekt i administratorindstillinger.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Forbindelsen mislykkedes", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Genopret forbindelse", + "retry": "Prøv igen", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Låseskærm)", - "winKey": "Windows Nøgle", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Skift", - "win": "Vind", - "stickyActive": "{{key}} (låset - klik for at slippe)", - "stickyInactive": "{{key}} (klik for at låse)", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Escape", "tab": "Tab", - "home": "Hjem", - "end": "Slut", - "pageUp": "Side Op", - "pageDown": "Side Ned", - "arrowUp": "Pil Op", - "arrowDown": "Pil Ned", - "arrowLeft": "Pil Til Venstre", - "arrowRight": "Pil Til Højre", - "fnToggle": "Funktionsnøgler", - "reconnect": "Genforbind Session", - "collapse": "Skjul værktøjslinje", - "expand": "Udvid værktøjslinje", - "dragHandle": "Træk for at flytte" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Opret forbindelse til vært", - "clear": "Ryd", - "paste": "Indsæt", - "reconnect": "Genopret", - "connectionLost": "Forbindelse tabt", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Genopret forbindelse", + "connectionLost": "Connection lost", "connected": "Forbundet", - "clipboardWriteFailed": "Kunne ikke kopiere til udklipsholderen. Sørg for, at siden er serveret over HTTPS eller localhost.", - "clipboardReadFailed": "Kunne ikke læse fra udklipsholderen. Sørg for, at udklipsholdertilladelser er tildelt.", - "clipboardHttpWarning": "Indsæt kræver HTTPS. Brug Ctrl + Shift + V eller servere Termix over HTTPS.", - "unknownError": "Ukendt fejl opstod", - "websocketError": "WebSocket forbindelsesfejl", - "connecting": "Forbinder...", - "noHostSelected": "Ingen vært valgt", - "reconnecting": "Genforbindelse... ({{attempt}}/{{max}})", - "reconnected": "Genoprettet succesfuldt", - "tmuxSessionCreated": "tmux session oprettet: {{name}}", - "tmuxSessionAttached": "tmux session vedhæftet: {{name}}", - "tmuxUnavailable": "tmux er ikke installeret på den eksterne vært, falder tilbage til standard shell", - "tmuxSessionPickerTitle": "tmux sessioner", - "tmuxSessionPickerDesc": "Eksisterende tmux sessioner fundet på denne vært. Vælg en for at vedhæfte eller oprette en ny session.", - "tmuxWindows": "Vinduer", - "tmuxWindowCount": "{{count}} vindue", - "tmuxAttached": "Vedhæftede klienter", - "tmuxAttachedCount": "{{count}} vedhæftet", - "tmuxLastActivity": "Seneste aktivitet", - "tmuxTimeJustNow": "lige nu", - "tmuxTimeMinutes": "{{count}}m siden", - "tmuxTimeHours": "{{count}}h siden", - "tmuxTimeDays": "{{count}}d siden", - "tmuxCreateNew": "Start ny session", - "tmuxCopyHint": "Justér markering og tryk på Enter for at kopiere til udklipsholder", - "tmuxDetach": "Frigør fra tmux session", - "tmuxDetached": "Detached fra tmux session", - "maxReconnectAttemptsReached": "Maksimal genforbindelsesforsøg nået", - "closeTab": "Luk", - "connectionTimeout": "Forbindelse timeout", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Kører {{command}} - {{host}}", - "totpRequired": "To-Faktor Godkendelse Kræves", - "totpCodeLabel": "Bekræftelseskode", - "totpVerify": "Verificér", - "warpgateAuthRequired": "Warpgate Authentication Påkrævet", - "warpgateSecurityKey": "Sikkerhed Nøgle", - "warpgateAuthUrl": "Godkendelses-URL", - "warpgateOpenBrowser": "Åbn i browser", - "warpgateContinue": "Jeg Er Afsluttet Godkendelse", - "opksshAuthRequired": "OPKSSH Godkendelse Kræves", - "opksshAuthDescription": "Komplet godkendelse i din browser for at fortsætte. Denne session vil forblive gyldig i 24 timer.", - "opksshOpenBrowser": "Åbn browser for at godkende", - "opksshWaitingForAuth": "Venter på godkendelse i browser...", - "opksshAuthenticating": "Behandler godkendelse...", - "opksshTimeout": "Godkendelse fik timeout. Prøv venligst igen.", - "opksshAuthFailed": "Godkendelse mislykkedes. Kontroller dine legitimationsoplysninger og prøv igen.", - "opksshSignInWith": "Log ind med {{provider}}", - "sudoPasswordPopupTitle": "Indsæt Adgangskode?", - "websocketAbnormalClose": "Forbindelsen lukkes uventet. Dette kan skyldes et problem med omvendt proxy eller SSL-konfiguration. Kontroller serverlogs.", - "connectionLogTitle": "Forbindelses Log", - "connectionLogCopy": "Kopier logs til udklipsholder", - "connectionLogEmpty": "Ingen forbindelses logs endnu", - "connectionLogWaiting": "Venter på forbindelseslogger...", - "connectionLogCopied": "Forbindelseslogs kopieret til udklipsholder", - "connectionLogCopyFailed": "Kunne ikke kopiere logfiler til udklipsholder", - "connectionRejected": "Forbindelse afvist af serveren. Tjek venligst din godkendelse og netværkskonfiguration.", - "hostKeyRejected": "SSH-værtnøglebekræftelse afvist. Forbindelse annulleret.", - "sessionTakenOver": "Session blev åbnet i et andet faneblad. Genjusterer..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Åben", + "linkDialogCopy": "Kopi", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Opdel faneblad", + "addToSplit": "Tilføj til Opdeling", + "removeFromSplit": "Fjern fra Split" + } }, "fileManager": { - "noHostSelected": "Ingen vært valgt", - "initializingEditor": "Initialiserer editor...", - "file": "Fil", - "folder": "Mappe", - "uploadFile": "Upload Fil", - "downloadFile": "Hent", - "extractArchive": "Udpak Arkiv", - "extractingArchive": "Udtrækker {{name}}...", - "archiveExtractedSuccessfully": "{{name}} udtrukket succesfuldt", - "extractFailed": "Udpak mislykkedes", - "compressFile": "Komprimer Fil", - "compressFiles": "Komprimer Filer", - "compressFilesDesc": "Komprimer {{count}} elementer i et arkiv", - "archiveName": "Arkivets Navn", - "enterArchiveName": "Indtast arkivnavn...", - "compressionFormat": "Komprimeringsformat", - "selectedFiles": "Valgte filer", - "andMoreFiles": "og {{count}} mere...", - "compress": "Komprimér", - "compressingFiles": "Komprimering af {{count}} elementer til {{name}}...", - "filesCompressedSuccessfully": "{{name}} oprettet", - "compressFailed": "Komprimering mislykkedes", - "edit": "Rediger", - "preview": "Eksempelvisning", - "previous": "Forrige", - "next": "Næste", - "pageXOfY": "Side {{current}} af {{total}}", - "zoomOut": "Zoom Ud", - "zoomIn": "Zoom Ind", - "newFile": "Ny Fil", - "newFolder": "Ny Mappe", - "rename": "Omdøb", - "uploading": "Uploader...", - "uploadingFile": "Uploader {{name}}...", - "fileName": "Fil Navn", - "folderName": "Mappe Navn", - "fileUploadedSuccessfully": "Filen \"{{name}}\" blev uploadet", - "failedToUploadFile": "Upload af fil mislykkedes", - "fileDownloadedSuccessfully": "Fil \"{{name}}\" downloadet med succes", - "failedToDownloadFile": "Download af fil mislykkedes", - "fileCreatedSuccessfully": "Fil \"{{name}}\" oprettet", - "folderCreatedSuccessfully": "Mappe \"{{name}}\" oprettet", - "failedToCreateItem": "Kunne ikke oprette element", - "operationFailed": "{{operation}} operation mislykkedes for {{name}}: {{error}}", - "failedToResolveSymlink": "Kunne ikke løse symlink", - "itemsDeletedSuccessfully": "{{count}} elementer slettet", - "failedToDeleteItems": "Kunne ikke slette elementer", - "sudoPasswordRequired": "Administrator Adgangskode Kræves", - "enterSudoPassword": "Indtast sudo adgangskode for at fortsætte denne handling", - "sudoPassword": "Sudo adgangskode", - "sudoOperationFailed": "Sudo operation mislykkedes", - "sudoAuthFailed": "Sudo godkendelse mislykkedes", - "dragFilesToUpload": "Slip filer her for at uploade", - "emptyFolder": "Denne mappe er tom", - "searchFiles": "Søg i filer...", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", "upload": "Upload", - "selectHostToStart": "Vælg en vært for at starte filhåndtering", - "sshRequiredForFileManager": "Filhåndtering kræver SSH. Denne vært har ikke SSH aktiveret.", - "failedToConnect": "Kunne ikke forbinde til SSH", - "failedToLoadDirectory": "Kunne ikke indlæse mappe", - "noSSHConnection": "Ingen SSH-forbindelse tilgængelig", - "copy": "Kopiér", - "cut": "Klip", - "paste": "Indsæt", - "copyPath": "Kopiér Sti", - "copyPaths": "Kopiér Stier", - "delete": "Slet", - "properties": "Egenskaber", - "refresh": "Opdater", - "downloadFiles": "Download {{count}} filer til Browser", - "copyFiles": "Kopier {{count}} elementer", - "cutFiles": "Klip {{count}} elementer", - "deleteFiles": "Slet {{count}} elementer", - "filesCopiedToClipboard": "{{count}} elementer kopieret til udklipsholder", - "filesCutToClipboard": "{{count}} elementer klippet til udklipsholder", - "pathCopiedToClipboard": "Sti kopieret til udklipsholder", - "pathsCopiedToClipboard": "{{count}} stier kopieret til udklipsholder", - "failedToCopyPath": "Kunne ikke kopiere sti til udklipsholder", - "movedItems": "Flyttede {{count}} elementer", - "failedToDeleteItem": "Kunne ikke slette element", - "itemRenamedSuccessfully": "{{type}} omdøbt med succes", - "failedToRenameItem": "Kunne ikke omdøbe element", - "download": "Hent", - "permissions": "Rettigheder", - "size": "Størrelse", - "modified": "Ændret", - "path": "Sti", - "confirmDelete": "Er du sikker på, at du vil slette {{name}}?", - "permissionDenied": "Tilladelse nægtet", - "serverError": "Serverfejl", - "fileSavedSuccessfully": "Filen er gemt", - "failedToSaveFile": "Kunne ikke gemme filen", - "confirmDeleteSingleItem": "Er du sikker på, at du vil slette \"{{name}}\"?", - "confirmDeleteMultipleItems": "Er du sikker på du vil slette {{count}} elementer permanent?", - "confirmDeleteMultipleItemsWithFolders": "Er du sikker på, at du vil slette {{count}} elementer? Dette inkluderer mapper og deres indhold.", - "confirmDeleteFolder": "Er du sikker på, at du vil slette mappen \"{{name}}\" og alt dens indhold?", - "permanentDeleteWarning": "Denne handling kan ikke fortrydes. Elementerne slettes permanent fra serveren.", - "recent": "Seneste", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Kopi", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Fastgjort", - "folderShortcuts": "Mappe Genveje", - "failedToReconnectSSH": "Kunne ikke genforbinde SSH session", - "openTerminalHere": "Åbn Terminal Her", - "run": "Kør", - "openTerminalInFolder": "Åbn terminal i denne mappe", - "openTerminalInFileLocation": "Åbn terminal på filplacering", - "runningFile": "Kører - {{file}}", - "onlyRunExecutableFiles": "Kan kun køre eksekverbare filer", - "directories": "Mapper", - "removedFromRecentFiles": "Fjernet \"{{name}}\" fra de seneste filer", - "removeFailed": "Fjernelse mislykkedes", - "unpinnedSuccessfully": "Ufastgjort \"{{name}}\" lykkedes", - "unpinFailed": "Frigørelse mislykkedes", - "removedShortcut": "Fjernet genvej \"{{name}}\"", - "removeShortcutFailed": "Fjernelse af genvej mislykkedes", - "clearedAllRecentFiles": "Ryddede alle seneste filer", - "clearFailed": "Ryd mislykkedes", - "removeFromRecentFiles": "Fjern fra seneste filer", - "clearAllRecentFiles": "Ryd alle seneste filer", - "unpinFile": "Frigør fil", - "removeShortcut": "Fjern genvej", - "pinFile": "Fastgør fil", - "addToShortcuts": "Føj til genveje", - "pasteFailed": "Indsæt mislykkedes", - "noUndoableActions": "Ingen fortrydelige handlinger", - "undoCopySuccess": "Ugjort kopiering: Slettede {{count}} kopierede filer", - "undoCopyFailedDelete": "Fortryd mislykkedes: Kunne ikke slette kopierede filer", - "undoCopyFailedNoInfo": "Fortryd mislykkedes: Kunne ikke finde kopieret filinformation", - "undoMoveSuccess": "Undid flytning operation: Flyttede {{count}} filer tilbage til den oprindelige placering", - "undoMoveFailedMove": "Fortryd mislykkedes: Kunne ikke flytte nogen filer tilbage", - "undoMoveFailedNoInfo": "Fortryd mislykkedes: Kunne ikke finde flyttede filoplysninger", - "undoDeleteNotSupported": "Sletning kan ikke fortrydes: Filer er blevet slettet permanent fra serveren", - "undoTypeNotSupported": "Ikke-understøttet fortryd operationstype", - "undoOperationFailed": "Fortryd handling mislykkedes", - "unknownError": "Ukendt fejl", - "confirm": "Bekræft", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Løbe", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", "find": "Find...", - "replace": "Erstat", - "downloadInstead": "Download I stedet", - "keyboardShortcuts": "Tastaturgenveje", - "searchAndReplace": "Søg & Erstat", - "editing": "Redigering", - "search": "Søg", - "findNext": "Find Næste", - "findPrevious": "Find Forrige", - "save": "Gem", - "selectAll": "Vælg Alle", - "undo": "Fortryd", - "redo": "Gendan", - "moveLineUp": "Flyt Linje Op", - "moveLineDown": "Flyt Linje Ned", - "toggleComment": "Skift Kommentar", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Kunne ikke indlæse billede", - "startTyping": "Begynd at skrive...", - "unknownSize": "Ukendt størrelse", - "fileIsEmpty": "Filen er tom", - "largeFileWarning": "Advarsel Om Stor Fil", - "largeFileWarningDesc": "Denne fil er {{size}} i størrelse, hvilket kan forårsage problemer med ydeevnen når den åbnes som tekst.", - "fileNotFoundAndRemoved": "Fil \"{{name}}\" ikke fundet og er blevet fjernet fra de seneste / fastgjorte filer", - "failedToLoadFile": "Kunne ikke indlæse fil: {{error}}", - "serverErrorOccurred": "Serverfejl opstod. Prøv igen senere.", - "autoSaveFailed": "Auto-lagring mislykkedes", - "fileAutoSaved": "Fil auto-gemt", - "moveFileFailed": "Kunne ikke flytte {{name}}", - "moveOperationFailed": "Flytning mislykkedes", - "canOnlyCompareFiles": "Kan kun sammenligne to filer", - "comparingFiles": "Sammenligner filer: {{file1}} og {{file2}}", - "dragFailed": "Træk handling mislykkedes", - "filePinnedSuccessfully": "Filen \"{{name}}\" fastgjort", - "pinFileFailed": "Kunne ikke fastgøre fil", - "fileUnpinnedSuccessfully": "Filen \"{{name}}\" blev fjernet", - "unpinFileFailed": "Kunne ikke frigøre filen", - "shortcutAddedSuccessfully": "Mappegenvej \"{{name}}\" blev tilføjet", - "addShortcutFailed": "Mislykkedes at tilføje genvej", - "operationCompletedSuccessfully": "{{operation}} {{count}} elementer lykkedes", - "operationCompleted": "{{operation}} {{count}} varer", - "downloadFileSuccess": "Fil {{name}} downloadet med succes", - "downloadFileFailed": "Download mislykkedes", - "moveTo": "Flyt til {{name}}", - "diffCompareWith": "Sammenlign sammenligninger med {{name}}", - "dragOutsideToDownload": "Træk udenfor vindue for at downloade ({{count}} filer)", - "newFolderDefault": "Nyhedsmappe", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Flyttede {{count}} elementer til {{target}}", - "move": "Flyt", - "searchInFile": "Søg i fil (Ctrl+F)", - "showKeyboardShortcuts": "Vis tastaturgenveje", - "startWritingMarkdown": "Begynd at skrive dit markdown indhold...", - "loadingFileComparison": "Indlæser filsammenligning...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Flytte", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Sammenlign", - "sideBySide": "Side om side", - "inline": "Indlejret", - "fileComparison": "Fil sammenligning: {{file1}} vs {{file2}}", - "fileTooLarge": "Filen er for stor: {{error}}", - "sshConnectionFailed": "SSH-forbindelsen mislykkedes. Tjek venligst din forbindelse til {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Kunne ikke indlæse fil: {{error}}", - "connecting": "Forbinder...", - "connectedSuccessfully": "Forbundet med succes", - "totpVerificationFailed": "TOTP verifikation mislykkedes", - "warpgateVerificationFailed": "Godkendelse af Warpgate mislykkedes", - "authenticationFailed": "Godkendelse mislykkedes", - "verificationCodePrompt": "Bekræftelseskode:", - "changePermissions": "Skift Tilladelser", - "currentPermissions": "Nuværende Tilladelser", - "owner": "Ejer", - "group": "Gruppe", - "others": "Andre", - "read": "Læs", - "write": "Skriv", - "execute": "Udfør", - "permissionsChangedSuccessfully": "Tilladelser ændret", - "failedToChangePermissions": "Mislykkedes at ændre tilladelser", - "name": "Navn", - "sortByName": "Navn", - "sortByDate": "Ændret Dato", - "sortBySize": "Størrelse", - "ascending": "Stigende", - "descending": "Faldende", - "root": "Rod", - "new": "Ny", - "sortBy": "Sortér Efter", - "items": "Varer", - "selected": "Valgt", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", "editor": "Editor", - "octal": "Oktal", - "storage": "Lagerplads", + "octal": "Octal", + "storage": "Storage", "disk": "Disk", - "used": "Brugt", - "of": "af", - "toggleSidebar": "Slå Sidebjælke Til/Fra", - "cannotLoadPdf": "Kan ikke indlæse PDF", - "pdfLoadError": "Der opstod en fejl under indlæsning af denne PDF-fil.", - "loadingPdf": "Indlæser PDF...", - "loadingPage": "Indlæser side..." + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopiér til vært…", - "moveToHost": "Flyt til vært…", - "copyItemsToHost": "Kopiér {{count}} elementer til at være vært for…", - "moveItemsToHost": "Flyt {{count}} elementer til at være vært for…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Ingen andre filhåndteringsværter tilgængelige.", "noHostsConnectedHint": "Tilføj en anden SSH-vært med Filhåndtering aktiveret i Værtshåndtering.", "selectDestinationHost": "Vælg destinationsvært", @@ -1164,48 +1360,48 @@ "browseDestination": "Gennemse eller indtast sti", "confirmCopy": "Kopi", "confirmMove": "Flytte", - "transferring": "Overfører…", - "compressing": "Komprimering…", - "extracting": "Udtrækker…", - "transferringItems": "Overførsel af {{current}} af {{total}} elementer…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Overførsel fuldført", "transferError": "Overførslen mislykkedes", - "transferPartial": "Overførsel fuldført med {{count}} fejl", - "transferPartialHint": "Kunne ikke overføre: {{paths}}", - "itemsSummary": "{{count}} elementer", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Destinationen skal være en mappe for overførsler af flere elementer", "selectThisFolder": "Vælg denne mappe", "browsePathWillBeCreated": "Denne mappe findes ikke endnu. Den vil blive oprettet, når overførslen starter.", "browsePathError": "Kunne ikke åbne denne sti på destinationsværten.", "goUp": "Gå op", - "copyFolderToHost": "Kopiér mappe til vært…", - "moveFolderToHost": "Flyt mappe til vært…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Parat", - "hostConnecting": "Forbinder…", + "hostConnecting": "Connecting…", "hostDisconnected": "Ikke forbundet", "hostAuthRequired": "Godkendelse kræves — åbn først Filhåndtering på denne vært", "hostConnectionFailed": "Forbindelsen mislykkedes", "metricsTitle": "Overførselstider", - "metricsPrepare": "Forbered destination: {{duration}}", - "metricsCompress": "Komprimer på kilde: {{duration}}", - "metricsHopSourceRead": "Kilde → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → destination (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → destination (lokal): {{throughput}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", - "metricsExtract": "Udtræk på destination: {{duration}}", - "metricsSourceDelete": "Fjern fra kilde: {{duration}}", - "metricsTotal": "I alt: {{duration}}", - "progressCompressing": "Komprimering på kildevært…", - "progressExtracting": "Udpakning på destination…", - "progressTransferring": "Overførsel af data…", - "progressReconnecting": "Genopretter forbindelse…", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Parallelle overførselsbaner", - "parallelSegmentsOption": "{{count}} baner", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Store filer opdeles i bidder på 256 MB. Flere baner bruger separate forbindelser (f.eks. at starte flere overførsler) for at opnå en højere samlet gennemløbshastighed.", - "progressTotalSpeed": "{{speed}} i alt ({{lanes}} baner)", - "progressTransferringItems": "Overførsel af filer ({{current}} af {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} filer", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Kildefiler gemt (delvis overførsel)", "jumpHostLimitation": "Begge værter skal kunne nås fra Termix-serveren. Direkte vært-til-vært-routing understøttes ikke.", "cancel": "Ophæve", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Vælger tar eller SFTP pr. fil baseret på antal filer, størrelse og komprimerbarhed. Enkeltfiler bruger altid streaming SFTP.", "methodTarHint": "Komprimer ved kildekode, overfør ét arkiv, udpak ved destination. Kræver tar på begge Unix-værter.", "methodItemSftpHint": "Overfør hver fil individuelt via SFTP. Fungerer på alle værter, inklusive Windows.", - "methodPreviewLoading": "Beregning af overførselsmetode…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Kunne ikke forhåndsvise overførselsmetoden. Serveren vil stadig vælge en metode, når du starter.", "methodPreviewWillUseTar": "Vil bruge: Tar-arkiv", "methodPreviewWillUseItemSftp": "Vil bruge: SFTP pr. fil", - "methodPreviewScanSummary": "{{fileCount}} filer, {{totalSize}} i alt (scannet på kildevært).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Hver fil bruger den samme SFTP-strøm som en enkelt filkopi, én efter én. Status kombineres på tværs af alle filer, så bjælken bevæger sig langsomt under store filer.", "methodReason": { "user_item_sftp": "Du valgte SFTP pr. fil.", "user_tar": "Du valgte tar-arkivet.", "tar_unavailable": "Tar er ikke tilgængelig på en eller begge værter — SFTP pr. fil vil blive brugt i stedet.", "windows_host": "En Windows-vært er involveret — tar bruges ikke.", - "auto_multi_large": "Auto: flere filer inklusive en stor fil ({{largestSize}}) med komprimerbare data — tar samler filer i én overførsel.", - "auto_single_large_in_archive": "Auto: én stor fil ({{largestSize}}) i dette sæt — SFTP pr. fil.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto: for det meste inkomprimerbare data — SFTP pr. fil.", - "auto_many_files": "Auto: mange filer ({{fileCount}}) — tar reducerer overhead pr. fil.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Auto: SFTP pr. fil for dette sæt." }, "progressCancel": "Ophæve", - "progressCancelling": "Annullerer…", + "progressCancelling": "Cancelling…", "progressStalled": "Standset", "resumedHint": "Genoprettet forbindelse til en aktiv overførsel, der er startet i et andet vindue.", "transferCancelled": "Overførsel annulleret", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Delvise data blev gemt på destinationen. Forsøget genoptages, når forbindelsen er tilbage." }, "tunnels": { - "noSshTunnels": "Ingen SSH-tunneler", - "createFirstTunnelMessage": "Du har endnu ikke oprettet nogen SSH-tunneler. Konfigurer tunnelforbindelser i værtshåndteringen for at komme i gang.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Forbundet", "disconnected": "Afbrudt", - "connecting": "Forbinder...", - "error": "Fejl", - "canceling": "Annullerer...", - "connect": "Forbind", - "disconnect": "Afbryd", - "cancel": "Annuller", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Ophæve", "port": "Port", - "localPort": "Lokal Port", - "remotePort": "Ekstern Port", - "currentHostPort": "Nuværende Værts Port", - "endpointPort": "Endepunkt Port", - "bindIp": "Lokal IP", - "endpointSshConfig": "Indstilling Af Endepunkt SSH", - "endpointSshHost": "Endepunkt SSH Host", - "endpointSshHostPlaceholder": "Vælg en konfigureret vært", - "endpointSshHostRequired": "Vælg en SSH-vært for hver klienttunnel.", - "attempt": "Forsøg {{current}} af {{max}}", - "nextRetryIn": "Næste forsøg igen i {{seconds}} sekunder", - "clientTunnels": "Klient Tunneler", - "clientTunnel": "Klient Tunnel", - "addClientTunnel": "Tilføj Klienttunnel", - "noClientTunnels": "Ingen klienttunneler konfigureret på dette skrivebord.", - "tunnelName": "Tunnel Navn", - "remoteHost": "Ekstern Vært", - "autoStart": "Automatisk Start", - "clientAutoStartDesc": "Starter når denne desktop klient åbner og forbliver tilsluttet.", - "clientManualStartDesc": "Brug Start og Stop fra denne række. Termix vil ikke åbne den automatisk.", - "clientRemoteServerNote": "Fjernvideresendelse kan kræve AllowTcpForwarding og GatewayPorts på SSH-slutserveren. Fjernporten lukker, når skrivebordet afbryder.", - "clientTunnelStarted": "Klienttunnel startet", - "clientTunnelStopped": "Klient tunnel stoppet", - "tunnelTestSucceeded": "Tunneltesten lykkedes", - "tunnelTestFailed": "Tunneltest mislykkedes", - "localSaved": "Klienttunneler gemt", - "localSaveError": "Kunne ikke gemme lokale klienttunneler", - "invalidBindIp": "Lokal IP skal være en gyldig IPv4-adresse.", - "invalidLocalTargetIp": "Lokalt mål IP skal være en gyldig IPv4-adresse.", - "invalidLocalPort": "Lokal port skal være mellem 1 og 65535.", - "invalidRemotePort": "Fjernport skal være mellem 1 og 65535.", - "invalidLocalTargetPort": "Lokal målport skal være mellem 1 og 65535.", - "invalidEndpointPort": "Endepunkthavn skal være mellem 1 og 65535.", - "duplicateAutoStartBind": "Kun én auto-start klienttunnel kan bruge {{bind}}.", - "manualControlError": "Mislykkedes at opdatere tunneltilstand.", - "active": "Aktiv", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", "start": "Start", "stop": "Stop", "test": "Test", "type": "Tunnel Type", - "typeLocal": "Lokal (-L)", - "typeRemote": "Fjernbetjening (-R)", - "typeDynamic": "Dynamisk (-D)", - "typeServerLocalDesc": "Nuværende vært for slutpunktet.", - "typeServerRemoteDesc": "Endepunkt tilbage til nuværende vært.", - "typeClientLocalDesc": "Lokal computer til slutpunkt.", - "typeClientRemoteDesc": "Slutpunkt tilbage til lokal computer.", - "typeClientDynamicDesc": "SOCKS på lokal computer.", - "typeDynamicDesc": "Videresend SOCKS5 CONNECT trafik gennem SSH", - "forwardDescriptionServerLocal": "Nuværende vært {{sourcePort}} → endpoint {{endpointPort}}.", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS på nuværende vært {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokal {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS på lokal port {{sourcePort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "Lokal {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → Lokal {{localPort}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", - "route": "Rute:", - "lastStarted": "Sidst startet", - "lastTested": "Sidst testet", - "lastError": "Seneste fejl", - "maxRetries": "Maks. Forsøg", - "maxRetriesDescription": "Maksimal mængde af forsøg igen.", - "retryInterval": "Forsøg Interval (sekunder)", - "retryIntervalDescription": "Tid til at vente mellem forsøg igen.", - "local": "Lokal", - "remote": "Fjernbetjening", - "destination": "Bestemmelse", - "host": "Vært", - "mode": "Tilstand", - "noHostSelected": "Ingen vært valgt", - "working": "Arbejder..." + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Hukommelse", + "memory": "Memory", "disk": "Disk", - "network": "Netværk", - "uptime": "Oppetid", - "processes": "Processer", - "available": "Tilgængelig", - "free": "Gratis", - "connecting": "Forbinder...", - "connectionFailed": "Kunne ikke forbinde til serveren", - "naCpus": "N/A CPU(er)", - "cpuCores_one": "{{count}} Kerne", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU Forbrug", - "memoryUsage": "Hukommelsesforbrug", - "diskUsage": "Diskforbrug", - "failedToFetchHostConfig": "Kunne ikke hente værtskonfiguration", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", "serverOffline": "Server Offline", - "cannotFetchMetrics": "Kan ikke hente målinger fra offline server", - "totpFailed": "TOTP verifikation mislykkedes", - "noneAuthNotSupported": "Serverstatistik understøtter ikke 'intet' godkendelsestype.", - "load": "Indlæs", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Operativsystem", - "kernel": "Kerne", - "seconds": "sekunder", - "networkInterfaces": "Netværksgrænseflader", - "noInterfacesFound": "Ingen netværksgrænseflader fundet", - "noProcessesFound": "Ingen processer fundet", - "loginStats": "SSH Login Statistik", - "noRecentLoginData": "Ingen seneste login-data", - "executingQuickAction": "Udfører {{name}}...", - "quickActionSuccess": "{{name}} fuldført", - "quickActionFailed": "{{name}} mislykkedes", - "quickActionError": "Kunne ikke udføre {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Lytter Havne", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protokol", "port": "Port", - "address": "Adresse", - "process": "Proces", - "noData": "Ingen lytter porte data" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inaktiv", - "policy": "Politik", - "rules": "regler", - "noData": "Ingen firewall-data tilgængelige", - "action": "Handling", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Kilde", - "anywhere": "Overalt" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Indlæs Gns.", - "swap": "Byt", - "architecture": "Arkitektur", - "refresh": "Opdater", - "retry": "Forsøg igen" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Prøv igen", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Løbe", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Selvhostet SSH og fjernskrivebordsadministration", - "loginTitle": "Log ind på Termix", - "registerTitle": "Opret Konto", - "forgotPassword": "Glemt Adgangskode?", - "rememberMe": "Husk enheden for 30 dage (inkluderer TOTP)", - "noAccount": "Har du ikke en konto?", - "hasAccount": "Har du allerede en konto?", - "twoFactorAuth": "To-Faktor Godkendelse", - "enterCode": "Indtast bekræftelseskode", - "backupCode": "Eller brug sikkerhedskode", - "verifyCode": "Verificér Kode", - "redirectingToApp": "Omdirigerer til app...", - "sshAuthenticationRequired": "SSH Godkendelse Kræves", - "sshNoKeyboardInteractive": "Tastatur-Interaktiv Godkendelse Ikke Tilgængelig", - "sshAuthenticationFailed": "Godkendelse Mislykkedes", - "sshAuthenticationTimeout": "Godkendelse Timeout", - "sshNoKeyboardInteractiveDescription": "Serveren understøtter ikke tastaturinteraktiv godkendelse. Angiv venligst din adgangskode eller SSH-nøgle.", - "sshAuthFailedDescription": "De angivne legitimationsoplysninger var forkert. Prøv igen med gyldige legitimationsoplysninger.", - "sshTimeoutDescription": "Godkendelsesforsøget fik timeout. Prøv venligst igen.", - "sshProvideCredentialsDescription": "Angiv venligst dine SSH-legitimationsoplysninger for at oprette forbindelse til denne server.", - "sshPasswordDescription": "Indtast adgangskoden til denne SSH-forbindelse.", - "sshKeyPasswordDescription": "Hvis din SSH-nøgle er krypteret, så skriv adgangskoden her.", - "passphraseRequired": "Kodeord Kræves", - "passphraseRequiredDescription": "SSH-tasten er krypteret. Indtast kodeord for at låse den op.", - "back": "Tilbage", - "firstUser": "Første Bruger", - "firstUserMessage": "Du er den første bruger og vil blive lavet en admin. Du kan se admin indstillinger i sidebar bruger dropdown. Hvis du mener, at dette er en fejl, tjek docker logs, eller opret et GitHub problem.", - "external": "Ekstern", - "loginWithExternal": "Log ind med ekstern udbyder", - "loginWithExternalDesc": "Login ved hjælp af din konfigurerede eksterne identitetsudbyder", - "externalNotSupportedInElectron": "Ekstern godkendelse er endnu ikke understøttet i Electron appen. Brug venligst webversionen til OIDC login.", - "resetPasswordButton": "Nulstil Adgangskode", - "sendResetCode": "Send Nulstillingskode", - "resetCodeDesc": "Indtast dit brugernavn for at modtage en adgangskode nulstillingskode. Koden vil blive logget i docker container logs.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verificér Kode", - "enterResetCode": "Indtast den 6-cifrede kode fra docker container logger for brugeren:", - "newPassword": "Ny Adgangskode", - "confirmNewPassword": "Bekræft Adgangskode", - "enterNewPassword": "Indtast din nye adgangskode for brugeren:", - "signUp": "Tilmeld Dig", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", "desktopApp": "Desktop App", - "loggingInToDesktopApp": "Logger ind på skrivebords-appen", - "loadingServer": "Indlæser server...", - "dataLossWarning": "Nulstilling af din adgangskode på denne måde vil slette alle dine gemte SSH værter, legitimationsoplysninger og andre krypterede data. Denne handling kan ikke fortrydes. Brug kun dette, hvis du har glemt din adgangskode og ikke er logget ind.", - "authenticationDisabled": "Godkendelse Deaktiveret", - "authenticationDisabledDesc": "Alle godkendelsesmetoder er i øjeblikket deaktiveret. Kontakt venligst din administrator.", - "attemptsRemaining": "{{count}} forsøg tilbage" + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verificér SSH-værtnøgle", - "keyChangedWarning": "SSH Værtsnøgle Ændret", - "firstConnectionTitle": "Første gang der oprettes forbindelse til værten", - "firstConnectionDescription": "Denne værts ægthed kan ikke fastslås. Kontrollér, at fingeraftrykket matcher det, du forventer.", - "keyChangedDescription": "Værtsnøglen for denne server er ændret siden din sidste forbindelse. Dette kan indikere et sikkerhedsproblem.", - "previousKey": "Forrige Nøgle", - "newFingerprint": "Nyt Fingeraftryk", - "fingerprint": "Fingeraftryk", - "verifyInstructions": "Hvis du stoler på denne vært, skal du klikke på Accepter for at fortsætte og gemme dette fingeraftryk til fremtidige forbindelser.", - "securityWarning": "Advarsel Om Sikkerhed", - "acceptAndContinue": "Accepter & Fortsæt", - "acceptNewKey": "Accepter Ny Nøgle Og Fortsæt" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Kunne ikke forbinde til databasen", - "unknownError": "Ukendt fejl", - "loginFailed": "Login mislykkedes", - "failedPasswordReset": "Kunne ikke starte nulstilling af adgangskode", - "failedVerifyCode": "Kunne ikke bekræfte nulstillingskode", - "failedCompleteReset": "Kunne ikke fuldføre nulstilling af adgangskode", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Mislykkedes at starte OIDC login", - "silentSigninOidcUnavailable": "Der blev anmodet om lydløs login, men OIDC-login er ikke tilgængeligt.", - "failedUserInfo": "Kunne ikke hente brugerinfo efter login", - "oidcAuthFailed": "OIDC godkendelse mislykkedes", - "invalidAuthUrl": "Ugyldig autorisation URL modtaget fra backend", - "requiredField": "Dette felt er påkrævet", - "minLength": "Minimum længde er {{min}}", - "passwordMismatch": "Adgangskoder stemmer ikke overens", - "passwordLoginDisabled": "Brugernavn/adgangskode login er i øjeblikket deaktiveret", - "sessionExpired": "Session udløbet - log venligst ind igen", - "totpRateLimited": "Begrænset hastighed: For mange TOTP-bekræftelsesforsøg. Prøv igen senere.", - "totpRateLimitedWithTime": "Begrænset hastighed: For mange TOTP-bekræftelsesforsøg. Vent venligst {{time}} sekunder, før du prøver igen.", - "resetCodeRateLimited": "Begrænset sats: For mange bekræftelsesforsøg. Prøv igen senere.", - "resetCodeRateLimitedWithTime": "Begrænset sats: For mange bekræftelsesforsøg. Vent venligst {{time}} sekunder, før du prøver igen.", - "authTokenSaveFailed": "Kunne ikke gemme godkendelsestoken", - "failedToLoadServer": "Kunne ikke indlæse server" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Ny konto registrering er i øjeblikket deaktiveret af en administrator. Log ind eller kontakt en administrator.", - "userNotAllowed": "Din konto er ikke autoriseret til at registrere. Kontakt venligst en administrator.", - "databaseConnectionFailed": "Kunne ikke forbinde til databaseserveren", - "resetCodeSent": "Nulstil kode sendt til Docker logs", - "codeVerified": "Kode bekræftet", - "passwordResetSuccess": "Adgangskode nulstillet", - "loginSuccess": "Login lykkedes", - "registrationSuccess": "Registrering gennemført" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Lokale stationære tunneler rettet mod konfigurerede SSH-værter.", - "c2sTunnelPresets": "Klient Tunnel Forudindstillinger", - "c2sTunnelPresetsDesc": "Gem denne desktop klients lokale tunnelliste som en navngiven server forudindstilling, eller indlæs en forudindstillet tilbage i denne klient.", - "c2sTunnelPresetsUnavailable": "Klienttunnelforudindstillinger er kun tilgængelige i skrivebordsklienten.", - "c2sPresetName": "Forudindstillet Navn", - "c2sPresetNamePlaceholder": "Klient forudindstillede navn", - "c2sPresetToLoad": "Forudindstilling For At Indlæse", - "c2sNoPresetSelected": "Ingen forudindstilling valgt", - "c2sNoPresets": "Ingen forudindstillinger gemt", - "c2sLoadPreset": "Indlæs", - "c2sCurrentLocalConfig": "{{count}} lokal klienttunnel(er) konfigureret på dette skrivebord.", - "c2sPresetSyncNote": "Forudindstillinger er eksplicitte snapshots; indlæsning af en erstatter denne desktop klients lokale klienttunnelliste.", - "c2sPresetSaved": "Klient tunnel forudindstilling gemt", - "c2sPresetLoaded": "Forudindstillede klienttunnel indlæst lokalt", - "c2sPresetRenamed": "Klient tunnel forudindstillet omdøbt", - "c2sPresetDeleted": "Klient tunnel forudindstilling slettet", - "c2sPresetLoadError": "Kunne ikke indlæse klienttunnelforudindstillinger" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Sprog", - "keyPassword": "nøgleadgangskode", - "pastePrivateKey": "Indsæt din private nøgle her...", - "localListenerHost": "127.0.0.1 (lyt lokalt)", - "localTargetHost": "127.0.0.1 (mål på denne computer)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Indtast din adgangskode", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Instrumentbræt", - "loading": "Indlæser dashboard...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", "support": "Support", - "discord": "Uenighed", - "serverOverview": "Server Oversigt", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", "version": "Version", - "upToDate": "Op til dato", - "updateAvailable": "Opdatering Tilgængelig", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Oppetid", + "uptime": "Uptime", "database": "Database", - "healthy": "Sunde", - "error": "Fejl", - "totalHosts": "Total Værter", - "totalTunnels": "Tunneler I Alt", - "totalCredentials": "Total Legitimationsoplysninger", - "recentActivity": "Seneste Aktivitet", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Indlæser seneste aktivitet...", - "noRecentActivity": "Ingen seneste aktivitet", - "quickActions": "Hurtige Handlinger", - "addHost": "Tilføj Vært", - "addCredential": "Tilføj Credential", - "adminSettings": "Admin Indstillinger", - "userProfile": "Bruger Profil", - "serverStats": "Server Statistik", - "loadingServerStats": "Indlæser serverstatistik...", - "noServerData": "Ingen tilgængelige serverdata", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Tilpas Dashboard", - "dashboardSettings": "Indstillinger For Kontrolpanel", - "enableDisableCards": "Aktiver/Deaktiver Kort", - "resetLayout": "Nulstil til standard", - "serverOverviewCard": "Server Oversigt", - "recentActivityCard": "Seneste Aktivitet", - "networkGraphCard": "Netværk Graf", - "networkGraph": "Netværk Graf", - "quickActionsCard": "Hurtige Handlinger", - "serverStatsCard": "Server Statistik", - "panelMain": "Hoved", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", "panelSide": "Side", - "justNow": "lige nu" + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "STABEL", - "hostsOnline": "Værter Online", - "activeTunnels": "Aktive Tunneler", - "registerNewServer": "Registrer en ny server", - "storeSshKeysOrPasswords": "Gem SSH-nøgler eller adgangskoder", - "manageUsersAndRoles": "Administrer brugere og roller", - "manageYourAccount": "Administrer din konto", - "hostStatus": "Værts Status", - "noHostsConfigured": "Ingen værter konfigureret", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Tilføj:", - "commandPalette": "Kommando Palet", - "done": "Udført", - "editModeInstructions": "Træk kort for at omarrangere · Træk kolonneskillefeltet for at ændre størrelse kolonner · Træk den nederste kant af et kort for at ændre størrelsen på dets højde · Papirkurv for at fjerne", - "empty": "Tom", - "clear": "Ryd" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopi", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Tilføj Vært", - "addGroup": "Tilføj Gruppe", - "addLink": "Tilføj Link", - "zoomIn": "Zoom Ind", - "zoomOut": "Zoom Ud", - "resetView": "Nulstil Visning", - "selectHost": "Vælg Vært", - "chooseHost": "Vælg en vært...", - "parentGroup": "Overordnet Gruppe", - "noGroup": "Ingen Gruppe", - "groupName": "Gruppens Navn", - "color": "Farve", - "source": "Kilde", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Flyt til gruppe", - "selectGroup": "Vælg gruppe...", - "addConnection": "Tilføj Forbindelse", - "hostDetails": "Vært Detaljer", - "removeFromGroup": "Fjern fra gruppe", - "addHostHere": "Tilføj Vært Her", - "editGroup": "Rediger Gruppe", - "delete": "Slet", - "add": "Tilføj", - "create": "Opret", - "move": "Flyt", - "connect": "Forbind", - "createGroup": "Opret Gruppe", - "selectSourcePlaceholder": "Vælg Kilde...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Flytte", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Ugyldig Fil", - "hostAlreadyExists": "Værten er allerede i topologien", - "connectionExists": "Forbindelsen findes allerede", - "unknown": "Ukendt", - "name": "Navn", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Status", - "failedToAddNode": "Kunne ikke tilføje indholdselement", - "sourceDifferentFromTarget": "Kilde og mål skal være forskellige", - "exportJSON": "Eksporter JSON", - "importJSON": "Importér JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", "fileManager": "Filhåndtering", "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Server Statistik", - "noNodes": "Ingen indholdselementer endnu" + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker er ikke aktiveret for denne vært", - "validating": "Validerer Docker...", - "connecting": "Forbinder...", - "error": "Fejl", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Kunne ikke forbinde til Docker", - "containerStarted": "Container {{name}} startet", - "failedToStartContainer": "Kunne ikke starte container {{name}}", - "containerStopped": "Container {{name}} stoppet", - "failedToStopContainer": "Kunne ikke stoppe containeren {{name}}", - "containerRestarted": "Container {{name}} genstartet", - "failedToRestartContainer": "Kunne ikke genstarte container {{name}}", - "containerPaused": "Container {{name}} sat på pause", - "containerUnpaused": "Container {{name}} ikke sat på pause", - "failedToTogglePauseContainer": "Kunne ikke skifte pausetilstand for beholder {{name}}", - "containerRemoved": "Container {{name}} fjernet", - "failedToRemoveContainer": "Kunne ikke fjerne container {{name}}", - "image": "Billede", - "ports": "Havne", - "noPorts": "Ingen porte", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", "start": "Start", - "confirmRemoveContainer": "Er du sikker på, at du vil fjerne beholderen '{{name}}'? Denne handling kan ikke fortrydes.", - "runningContainerWarning": "Advarsel: Denne beholder kører i øjeblikket. Fjernelse af den vil først stoppe beholderen.", - "loadingContainers": "Indlæser containere...", - "manager": "Håndtering Af Docker", - "autoRefresh": "Opdater Automatisk", - "timestamps": "Tidsstempler", - "lines": "Linjer", - "filterLogs": "Filtrer logger...", - "refresh": "Opdater", - "download": "Hent", - "clear": "Ryd", - "logsDownloaded": "Logs downloadet", - "last50": "Sidste 50", - "last100": "Sidste 100", - "last500": "Sidste 500", - "last1000": "Sidste 1000", - "allLogs": "Alle Logs", - "noLogsMatching": "Ingen logs der matcher \"{{query}}\"", - "noLogsAvailable": "Ingen logs tilgængelige", - "noContainersFound": "Ingen containere fundet", - "noContainersFoundHint": "Ingen Docker-containere er tilgængelige på denne vært", - "searchPlaceholder": "Søg containere...", - "allStatuses": "Alle Status", - "stateRunning": "Kører", - "statePaused": "Pauset", - "stateExited": "Afsluttet", - "stateRestarting": "Genstarter", - "noContainersMatchFilters": "Ingen beholdere matcher dine filtre", - "noContainersMatchFiltersHint": "Prøv at justere dine søgnings- eller filterkriterier", - "failedToFetchStats": "Kunne ikke hente containerstatistik", - "containerNotRunning": "Container kører ikke", - "startContainerToViewStats": "Start beholderen for at se statistik", - "loadingStats": "Indlæser statistikker...", - "errorLoadingStats": "Fejl under indlæsning af statistik", - "noStatsAvailable": "Ingen statistik tilgængelig", - "cpuUsage": "CPU Forbrug", - "current": "Aktuel", - "memoryUsage": "Hukommelsesforbrug", - "networkIo": "Netværk I/O", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", "output": "Output", - "blockIo": "I/O-blok", - "read": "Læs", - "write": "Skriv", - "pids": "PID'er", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", "containerInformation": "Container Information", - "name": "Navn", + "name": "Name", "id": "ID", - "state": "Stat", - "containerMustBeRunning": "Container skal køre for at få adgang til konsollen", - "verificationCodePrompt": "Indtast bekræftelseskode", - "totpVerificationFailed": "TOTP verifikation mislykkedes. Prøv venligst igen.", - "warpgateVerificationFailed": "Godkendelse af Warpgate mislykkedes. Prøv venligst igen.", - "connectedTo": "Forbundet til {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Afbrudt", - "consoleError": "Konsol fejl", - "errorMessage": "Fejl: {{message}}", - "failedToConnect": "Kunne ikke forbinde til container", - "console": "Konsol", - "selectShell": "Vælg skal", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "aske", - "connect": "Forbind", - "disconnect": "Afbryd", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Ikke forbundet", - "clickToConnect": "Klik på Opret forbindelse for at starte en skalsession", - "connectingTo": "Forbinder til {{containerName}}...", - "containerNotFound": "Container ikke fundet", - "backToList": "Tilbage til liste", - "logs": "Logfiler", - "stats": "Statistik", - "consoleTab": "Konsol", - "startContainerToAccess": "Start beholderen for at få adgang til konsollen" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Generelt", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Brugere", - "sectionSessions": "Sessioner", - "sectionRoles": "Roller", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", "sectionDatabase": "Database", - "sectionApiKeys": "Api Nøgler", - "allowRegistration": "Tillad Brugerregistrering", - "allowRegistrationDesc": "Lad nye brugere registrere sig selv", - "allowPasswordLogin": "Tillad Adgangskode Login", - "allowPasswordLoginDesc": "Brugernavn/adgangskode login", - "oidcAutoProvision": "OIDC Auto-Tilsyn", - "oidcAutoProvisionDesc": "Auto-opret konti for OIDC-brugere, selv når registrering er deaktiveret", - "allowPasswordReset": "Tillad Nulstilling Af Adgangskode", - "allowPasswordResetDesc": "Nulstil kode via Docker-logs", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Ryd filtre", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Session Timeout", - "hours": "timer", - "sessionTimeoutRange": "Minimum 1t · Max 720h", - "monitoringDefaults": "Overvågning Af Standarder", - "statusCheck": "Status Tjek", - "metrics": "Metrik", - "sec": "sek", - "logLevel": "Log Niveau", - "enableGuacamole": "Aktiver Guacamole", - "enableGuacamoleDesc": "RDP/VNC fjernskrivebord", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "Indstil OpenID Connect for SSO. Felter markeret * er obligatoriske.", - "oidcClientId": "Klient ID", - "oidcClientSecret": "Klient Hemmelighed", - "oidcAuthUrl": "Godkendelses URL", - "oidcIssuerUrl": "Udsteders URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", "oidcTokenUrl": "Token URL", - "oidcUserIdentifier": "Bruger Id Sti", - "oidcDisplayName": "Vis Navn Sti", - "oidcScopes": "Anvendelsesområde", - "oidcUserinfoUrl": "Tilsidesæt Brugerinfo URL", - "oidcAllowedUsers": "Tilladt Brugere", - "oidcAllowedUsersDesc": "En e-mail pr. linje. Efterlad blank for at tillade alle.", - "removeOidc": "Fjern", - "usersCount": "{{count}} brugere", - "createUser": "Opret", - "newRole": "Ny Rolle", - "roleName": "Navn", - "roleDisplayName": "Vis Navn", - "roleDescription": "Varebeskrivelse", - "rolesCount": "{{count}} roller", - "createRole": "Opret", - "creating": "Opretter...", - "exportDatabase": "Eksporter Database", - "exportDatabaseDesc": "Download en sikkerhedskopi af alle værter, legitimationsoplysninger og indstillinger", - "export": "Eksporter", - "exporting": "Eksporterer...", - "importDatabase": "Importér Database", - "importDatabaseDesc": "Gendan fra en .sqlite backup-fil", - "importDatabaseSelected": "Valgt: {{name}}", - "selectFile": "Vælg Fil", - "changeFile": "Skift", - "import": "Importér", - "importing": "Importerer...", - "apiKeysCount": "{{count}} nøgler", - "newApiKey": "Ny API-nøgle", - "apiKeyCreatedWarning": "Nøgle oprettet - kopiere det nu, vil det ikke blive vist igen.", - "apiKeyName": "Navn", - "apiKeyUser": "Bruger", - "apiKeySelectUser": "Vælg en bruger...", - "apiKeyExpiresAt": "Udløber Ved", - "createKey": "Opret Nøgle", - "apiKeyNoExpiry": "Ingen udløbsdato", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Fjerne", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Dobbelt Auth", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Lokal", + "authTypeLocal": "Local", "adminStatusAdministrator": "Administrator", - "adminStatusRegularUser": "Almindelig Bruger", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "TOLD", - "youBadge": "DU", - "sessionsActive": "{{count}} aktiv", - "sessionActive": "Aktiv: {{time}}", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "Alle", - "revokeAllSessionsSuccess": "Alle sessioner for brugeren tilbagekaldt", - "revokeAllSessionsFailed": "Mislykkedes at tilbagekalde sessioner", - "revokeSessionFailed": "Mislykkedes at tilbagekalde session", - "addRole": "Tilføj rolle", - "noCustomRoles": "Ingen brugerdefinerede roller defineret", - "removeRoleFailed": "Kunne ikke fjerne rollen", - "assignRoleFailed": "Tildeling af rolle mislykkedes", - "deleteRoleFailed": "Kunne ikke slette rollen", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", "userAdminAccess": "Administrator", - "userAdminAccessDesc": "Fuld adgang til alle administratorindstillinger", - "userRoles": "Roller", - "revokeAllUserSessions": "Tilbagekald Alle Sessioner", - "revokeAllUserSessionsDesc": "Tving gen-login på alle enheder", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Sletning af denne bruger er permanent.", - "deleteUser": "Slet {{username}}", - "deleting": "Sletter...", - "deleteUserFailed": "Kunne ikke slette bruger", - "deleteUserSuccess": "Bruger \"{{username}}\" slettet", - "deleteRoleSuccess": "Rolle \"{{name}}\" slettet", - "revokeKeySuccess": "Nøgle \"{{name}}\" tilbagekaldt", - "revokeKeyFailed": "Kunne ikke tilbagekalde nøgle", - "copiedToClipboard": "Kopieret til udklipsholder", - "done": "Udført", - "createUserTitle": "Opret Bruger", - "createUserDesc": "Opret en ny lokal konto.", - "createUserUsername": "Brugernavn", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Adgangskode", - "createUserPasswordHint": "Minimum 6 tegn.", - "createUserEnterUsername": "Indtast brugernavn", - "createUserEnterPassword": "Indtast adgangskode", - "createUserSubmit": "Opret Bruger", - "editUserTitle": "Administrer Bruger: {{username}}", - "editUserDesc": "Rediger roller, admin status, sessioner og kontoindstillinger.", - "editUserUsername": "Brugernavn", - "editUserAuthType": "Auth Type", - "editUserAdminStatus": "Administrator Status", - "editUserUserId": "Bruger ID", - "linkAccountTitle": "Link OIDC til adgangskodekonto", - "linkAccountDesc": "Flet OIDC-kontoen {{username}} med en eksisterende lokal konto.", - "linkAccountWarningTitle": "Dette vil:", - "linkAccountEffect1": "Slet den eneste OIDC-konto", - "linkAccountEffect2": "Tilføj OIDC login til målkontoen", - "linkAccountEffect3": "Tillad både OIDC og adgangskode login", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Indtast det lokale brugernavn til at linke til", - "linkAccounts": "Link Konti", - "linkAccountSuccess": "OIDC-konto linket til \"{{username}}\"", - "linkAccountFailed": "Kunne ikke linke OIDC-konto", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Godkendelsestype", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Linker...", - "saving": "Gemmer...", - "updateRegistrationFailed": "Kunne ikke opdatere registreringsopsætning", - "updatePasswordLoginFailed": "Kunne ikke opdatere adgangskode login indstilling", - "updateOidcAutoProvisionFailed": "Kunne ikke opdatere OIDC auto-bestemmelses indstilling", - "updatePasswordResetFailed": "Kunne ikke opdatere indstillingen for nulstilling af adgangskode", - "sessionTimeoutRange2": "Session timeout skal være mellem 1 og 720 timer", - "sessionTimeoutSaved": "Session timeout gemt", - "sessionTimeoutSaveFailed": "Kunne ikke gemme sessions timeout", - "monitoringIntervalInvalid": "Ugyldige intervalværdier", - "monitoringSaved": "Overvågningsindstillinger gemt", - "monitoringSaveFailed": "Kunne ikke gemme overvågningsindstillinger", - "guacamoleSaved": "Guacamole indstillinger gemt", - "guacamoleSaveFailed": "Kunne ikke gemme Guacamole indstillinger", - "guacamoleUpdateFailed": "Kunne ikke opdatere Guacamole indstilling", - "logLevelUpdateFailed": "Kunne ikke opdatere logniveau", - "oidcSaved": "OIDC konfiguration gemt", - "oidcSaveFailed": "Kunne ikke gemme OIDC konfiguration", - "oidcRemoved": "OIDC konfiguration fjernet", - "oidcRemoveFailed": "Kunne ikke fjerne OIDC konfiguration", - "createUserRequired": "Brugernavn og adgangskode er påkrævet", - "createUserPasswordTooShort": "Adgangskoden skal være på mindst 6 tegn", - "createUserSuccess": "Bruger \"{{username}}\" oprettet", - "createUserFailed": "Kunne ikke oprette bruger", - "updateAdminStatusFailed": "Mislykkedes at opdatere admin status", - "allSessionsRevoked": "Alle sessioner tilbagekaldt", - "revokeSessionsFailed": "Mislykkedes at tilbagekalde sessioner", - "createRoleRequired": "Navn og visningsnavn er påkrævet", - "createRoleSuccess": "Rolle \"{{name}}\" oprettet", - "createRoleFailed": "Kunne ikke oprette rolle", - "apiKeyNameRequired": "Nøgle navn er påkrævet", - "apiKeyUserRequired": "Bruger ID er påkrævet", - "apiKeyCreatedSuccess": "API-nøgle \"{{name}}\" oprettet", - "apiKeyCreateFailed": "Kunne ikke oprette API-nøgle", - "exportSuccess": "Database eksporteret succesfuldt", - "exportFailed": "Database eksport mislykkedes", - "importSelectFile": "Vælg først en fil", - "importCompleted": "Import fuldført: {{total}} elementer importeret, {{skipped}} sprunget over", - "importFailed": "Import mislykkedes: {{error}}", - "importError": "Database import mislykkedes" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Vært", - "hostPlaceholder": "192.168.1.1 eller eksempel.com", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Brugernavn", - "usernamePlaceholder": "brugernavn", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Auth", "passwordLabel": "Adgangskode", - "passwordPlaceholder": "adgangskode", - "privateKeyLabel": "Privat Nøgle", - "privateKeyPlaceholder": "Indsæt privat nøgle...", - "credentialLabel": "Credential", - "credentialPlaceholder": "Vælg gemte legitimationsoplysninger", - "connectToTerminal": "Opret forbindelse til Terminal", - "connectToFiles": "Opret forbindelse til filer" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Legitimationsoplysninger", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Ingen terminal valgt", - "noTerminalSelectedHint": "Åbn et SSH-terminalfaneblad for at se dets kommandohistorik", - "searchPlaceholder": "Søg historik...", - "clearAll": "Ryd Alle", - "noHistoryEntries": "Ingen historik poster", - "trackingDisabled": "Tracking af historik er deaktiveret", - "trackingDisabledHint": "Aktivér det i dine profilindstillinger for at optage kommandoer." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Optagelse Af Nøgler", - "recordToTerminals": "Optag til terminaler", - "selectAll": "Alle", + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", "selectNone": "Ingen", - "noTerminalTabsOpen": "Ingen terminalfaneblade åbne", - "selectTerminalsAbove": "Vælg terminaler ovenfor", - "broadcastInputPlaceholder": "Skriv her for at sende tastetryk...", - "stopRecording": "Stop Optagelse", - "startRecording": "Start Optagelse", - "settingsTitle": "Indstillinger", - "enableRightClickCopyPaste": "Aktivér højreklik kopiér/indsæt" + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { "layoutTitle": "Layout", - "selectLayoutAbove": "Vælg et layout ovenfor", - "selectLayoutHint": "Vælg hvor mange ruder der skal vises", - "panesTitle": "Paner", - "openTabsTitle": "Åbn Faneblade", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Træk faner ind i ruderne ovenfor, eller brug Hurtig tildeling", - "dropHere": "Slip her", - "emptyPane": "Tom", - "dashboard": "Instrumentbræt", - "clearSplitScreen": "Ryd Opdelt Skærm", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Hurtig tildeling", - "alreadyAssigned": "Ruden {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Opdel faneblad", "addToSplit": "Tilføj til Opdeling", "removeFromSplit": "Fjern fra Split", - "assignToPane": "Tildel til rude" + "assignToPane": "Tildel til rude", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Opret Snippet", - "createSnippetDescription": "Opret et nyt kommandouddrag til hurtig udførelse", - "nameLabel": "Navn", - "namePlaceholder": "f.eks. Genstart Nginx", - "descriptionLabel": "Varebeskrivelse", - "descriptionPlaceholder": "Valgfri beskrivelse", - "optional": "Valgfri", - "folderLabel": "Mappe", - "noFolder": "Ingen mappe (Ikke kategoriseret)", - "commandLabel": "Kommando", - "commandPlaceholder": "f.eks. sudo systemctl genstart nginx", - "cancel": "Annuller", - "createSnippetButton": "Opret Snippet", - "createFolderTitle": "Opret Mappe", - "createFolderDescription": "Organiser dine snippets i mapper", - "folderNameLabel": "Mappe Navn", - "folderNamePlaceholder": "f.eks. Systemkommandoer, Docker Scripts", - "folderColorLabel": "Mappe Farve", - "folderIconLabel": "Mappeikon", - "previewLabel": "Eksempelvisning", - "folderNameFallback": "Mappe Navn", - "createFolderButton": "Opret Mappe", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Ophæve", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Alle", + "selectAll": "All", "selectNone": "Ingen", - "noTerminalTabsOpen": "Ingen terminalfaneblade åbne", - "searchPlaceholder": "Søg i snippets...", - "newSnippet": "Ny Snippet", - "newFolder": "Ny Mappe", - "run": "Kør", - "noSnippetsInFolder": "Ingen snippets i denne mappe", - "uncategorized": "Ikke Kategoriseret", - "editSnippetTitle": "Rediger Snippet", - "editSnippetDescription": "Opdater dette kommandouddrag", - "saveSnippetButton": "Gem Ændringer", - "createSuccess": "Snippet oprettet", - "createFailed": "Kunne ikke oprette snippet", - "updateSuccess": "Snippet opdateret", - "updateFailed": "Mislykkedes at opdatere snippet", - "deleteFailed": "Kunne ikke slette snippet", - "folderCreateSuccess": "Mappe oprettet", - "folderCreateFailed": "Kunne ikke oprette mappe", - "editFolderTitle": "Rediger Mappe", - "editFolderDescription": "Omdøb eller ændr udseendet af denne mappe", - "saveFolderButton": "Gem Ændringer", - "editFolder": "Rediger mappe", - "deleteFolder": "Slet mappe", - "folderDeleteSuccess": "Mappe \"{{name}}\" slettet", - "folderDeleteFailed": "Kunne ikke slette mappe", - "folderEditSuccess": "Mappen er opdateret", - "folderEditFailed": "Mislykkedes at opdatere mappe", - "confirmRunMessage": "Kør \"{{name}}\"?", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Løbe", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Løbe", - "runSuccess": "Ran \"{{name}}\" i {{count}} terminal(er)", - "copySuccess": "Kopieret \"{{name}}\" til udklipsholder", - "shareTitle": "Del Snippet", - "shareUser": "Bruger", - "shareRole": "Rolle", - "selectUser": "Vælg en bruger...", - "selectRole": "Vælg en rolle...", - "shareSuccess": "Snippet delt med succes", - "shareFailed": "Kunne ikke dele snippet", - "revokeSuccess": "Adgang tilbagekaldt", - "revokeFailed": "Mislykkedes at tilbagekalde adgang", - "currentAccess": "Nuværende Adgang", - "shareLoadError": "Kunne ikke indlæse delingsdata", - "loading": "Indlæser...", - "close": "Luk", - "reorderFailed": "Kunne ikke gemme rækkefølgen af uddrag" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Kunne ikke gemme rækkefølgen af uddrag", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Konto", - "sectionAppearance": "Udseende", - "sectionSecurity": "Sikkerhed", - "sectionApiKeys": "Api Nøgler", - "sectionC2sTunnels": "Tunneler C2S", - "usernameLabel": "Brugernavn", - "roleLabel": "Rolle", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", "roleAdministrator": "Administrator", - "authMethodLabel": "Auth Metode", - "authMethodLocal": "Lokal", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "Til", - "twoFaOff": "Fra", + "twoFaOn": "On", + "twoFaOff": "Off", "versionLabel": "Version", - "deleteAccount": "Slet Konto", - "deleteAccountDescription": "Slet din konto permanent", - "deleteButton": "Slet", - "deleteAccountPermanent": "Denne handling er permanent og kan ikke fortrydes.", - "deleteAccountWarning": "Alle sessioner, værter, legitimationsoplysninger og indstillinger vil blive slettet permanent.", - "confirmPasswordDeletePlaceholder": "Indtast din adgangskode for at bekræfte", - "languageLabel": "Sprog", - "themeLabel": "Tema", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Accent Farve", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Kommando Autofuldfør", - "commandAutocompleteDesc": "Vis autofuldførelse under indtastning", - "historyTracking": "Historik Sporing", - "historyTrackingDesc": "Spor terminalkommandoer", - "syntaxHighlighting": "Syntaksfremhævning", - "syntaxHighlightingDesc": "Fremhæv terminal output", - "commandPalette": "Kommando Palet", - "commandPaletteDesc": "Aktivér tastaturgenvej", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Genåbn faner ved login", "reopenTabsOnLoginDesc": "Gendan dine åbne faner, når du logger ind eller opdaterer siden, selv fra en anden enhed", - "confirmTabClose": "Bekræft Luk Af Faneblad", - "confirmTabCloseDesc": "Spørg før lukning af terminalfaner", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Vis Vært Tags", - "showHostTagsDesc": "Vis tags i værtslisten", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Klik for at udvide værtshandlinger", "hostTrayOnClickDesc": "Vis altid forbindelsesknapper; klik for at udvide administrationsmuligheder i stedet for at holde musen over", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Fastgør app-skinne", "pinAppRailDesc": "Hold appskinnen i venstre sidebar altid udvidet i stedet for at udvide den, når du holder musen over den", - "settingsSnippets": "Stumper", - "foldersCollapsed": "Mapper Sammenbrudt", - "foldersCollapsedDesc": "Fold som standard mapper sammen", - "confirmExecution": "Bekræft Kørsel", - "confirmExecutionDesc": "Bekræft før kørende snippets", - "settingsUpdates": "Opdateringer", - "disableUpdateChecks": "Deaktivér Opdateringstjek", - "disableUpdateChecksDesc": "Stop søgning efter opdateringer", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", "totpAuthenticator": "TOTP Authenticator", - "totpEnabled": "2FA er aktiveret", - "totpDisabled": "Tilføj ekstra login sikkerhed", - "disable": "Deaktivér", - "enable": "Aktiver", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Scan QR-koden eller angiv hemmeligheden i din autentificerings-app, og angiv derefter den 6-cifrede kode", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verificér", - "changePassword": "Skift Adgangskode", - "currentPasswordLabel": "Nuværende Adgangskode", - "currentPasswordPlaceholder": "Nuværende adgangskode", - "newPasswordLabel": "Ny Adgangskode", - "newPasswordPlaceholder": "Ny adgangskode", - "confirmPasswordLabel": "Bekræft Ny Adgangskode", - "confirmPasswordPlaceholder": "Bekræft ny adgangskode", - "updatePassword": "Opdater Adgangskode", - "createApiKeyTitle": "Opret API-nøgle", - "createApiKeyDescription": "Generer en ny API-nøgle til programmatisk adgang.", - "apiKeyNameLabel": "Navn", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "valgfri", - "cancel": "Annuller", - "createKey": "Opret Nøgle", - "apiKeyCount": "{{count}} nøgler", - "newKey": "Ny Nøgle", - "noApiKeys": "Ingen API-nøgler endnu.", - "apiKeyActive": "Aktiv", - "apiKeyUsageHint": "Inkluder din nøgle i", + "optional": "optional", + "cancel": "Ophæve", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", "apiKeyUsageHintHeader": "header.", - "apiKeyPermissionsHint": "Nøgler arver tilladelserne til den oprettede bruger.", - "roleUser": "Bruger", - "authMethodDual": "Dobbelt Auth", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Kunne ikke starte opsætning af TOTP", - "totpEnter6Digits": "Indtast en 6-cifret kode", - "totpEnabledSuccess": "To-faktor autentificering aktiveret", - "totpInvalidCode": "Ugyldig kode, prøv igen", - "totpDisableInputRequired": "Indtast din TOTP kode eller adgangskode", - "totpDisabledSuccess": "To-faktor autentificering deaktiveret", - "totpDisableFailed": "Mislykkedes at deaktivere 2FA", - "totpDisableTitle": "Deaktivér 2FA", - "totpDisablePlaceholder": "Indtast TOTP kode eller adgangskode", - "totpDisableConfirm": "Deaktivér 2FA", - "totpContinueVerify": "Fortsæt med at bekræfte", - "totpVerifyTitle": "Verificér Kode", - "totpBackupTitle": "Backup Koder", - "totpDownloadBackup": "Download Sikkerhedskoder", - "done": "Udført", - "secretCopied": "Hemmelig kopieret til udklipsholder", - "apiKeyNameRequired": "Nøgle navn er påkrævet", - "apiKeyCreated": "API-nøgle \"{{name}}\" oprettet", - "apiKeyCreateFailed": "Kunne ikke oprette API-nøgle", - "apiKeyUser": "Bruger", - "apiKeyExpires": "Udløber", - "apiKeyRevoked": "API-nøgle \"{{name}}\" tilbagekaldt", - "apiKeyRevokeFailed": "Mislykkedes at tilbagekalde API-nøgle", - "passwordFieldsRequired": "Nuværende og nye adgangskoder er påkrævet", - "passwordMismatch": "Adgangskoder stemmer ikke overens", - "passwordTooShort": "Adgangskoden skal være på mindst 6 tegn", - "passwordUpdated": "Adgangskode opdateret", - "passwordUpdateFailed": "Kunne ikke opdatere adgangskode", - "deletePasswordRequired": "Adgangskode er påkrævet for at slette din konto", - "deleteFailed": "Kunne ikke slette konto", - "deleting": "Sletter...", - "colorPickerTooltip": "Åbn farvevælger", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", "themeSystem": "System", - "themeLight": "Lys", - "themeDark": "Mørk", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solariseret", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "En Mørk", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Prøv igen", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Fjerne", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/de_DE.json b/src/ui/locales/translated/de_DE.json index 8245e406..7f808c46 100644 --- a/src/ui/locales/translated/de_DE.json +++ b/src/ui/locales/translated/de_DE.json @@ -4,576 +4,741 @@ "folder": "Ordner", "password": "Passwort", "key": "Schlüssel", - "sshPrivateKey": "SSH Privatschlüssel", + "sshPrivateKey": "SSH Privater Schlüssel", "upload": "Hochladen", - "keyPassword": "Schlüsselpasswort", + "keyPassword": "Schlüssel-Passwort", "sshKey": "SSH-Schlüssel", "uploadPrivateKeyFile": "Private Schlüsseldatei hochladen", - "searchCredentials": "Anmeldeinformationen suchen...", - "addCredential": "Zugangsdaten hinzufügen", + "searchCredentials": "Zugangsdaten suchen...", + "addCredential": "Anmeldeinformationen hinzufügen", "caCertificate": "CA-Zertifikat (-cert.pub)", "caCertificateDescription": "Optional: Laden Sie die CA-signierte Zertifikatsdatei hoch oder fügen Sie sie ein (z.B. id_ed25519-cert.pub). Wird benötigt, wenn Ihr SSH-Server Zertifikatsbasierte Autorisierung verwendet.", "uploadCertFile": "Datei -cert.pub hochladen", "clearCert": "Leeren", "certLoaded": "Zertifikat geladen", - "certPublicKeyLabel": "CA-Zertifikat", + "certPublicKeyLabel": "CA-Zertifikate", "certTypeLabel": "Zertifikatstyp", "pasteOrUploadCert": "Einfügen oder Hochladen eines -cert.pub Zertifikats...", "hasCaCert": "Hat CA-Zertifikat", - "noCaCert": "Kein CA-Zertifikat" + "noCaCert": "Kein CA-Zertifikat", + "noPublicKeyAvailable": "Kein öffentlicher Schlüssel verfügbar. Öffne zuerst den Anmeldedateneditor.", + "deployCommandCopied": "Deploy-Befehl kopiert", + "sortCredentials": "Zugangsdaten sortieren", + "sortDefault": "Standardsortierung", + "sortNameAsc": "Name (A → Z)", + "sortNameDesc": "Name (Z → A)", + "sortUsernameAsc": "Benutzername (A → Z)", + "sortUsernameDesc": "Benutzername (Z → A)", + "filterCredentials": "Zugangsdaten filtern", + "filterClearAll": "Filter zurücksetzen", + "filterTypeGroup": "Typ", + "filterTypePassword": "Passwort", + "filterTypeKey": "SSH-Schlüssel", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Fehler beim Laden der Warnungen", - "failedToDismissAlert": "Fehler beim Ausblenden der Warnung" + "failedToLoadAlerts": "Fehler beim Laden der Benachrichtigung", + "failedToDismissAlert": "Fehler beim Ausblenden der Benachrichtigung" }, "serverConfig": { "title": "Serverkonfiguration", "description": "Konfigurieren Sie die Termix-Server-URL für eine Verbindung zu Ihren Backend-Diensten", - "serverUrl": "Server-URL", - "enterServerUrl": "Bitte geben Sie eine Server-URL ein", + "serverUrl": "Server URL", + "enterServerUrl": "Bitte eine Server-URL eingeben", "saveFailed": "Fehler beim Speichern der Konfiguration", "saveError": "Fehler beim Speichern der Konfiguration", "saving": "Speichern...", - "saveConfig": "Konfiguration speichern", + "saveConfig": "Konfiguration Speichern", "helpText": "Geben Sie die URL ein, auf der Ihr Termix Server läuft (z.B. http://localhost:30001 oder https://your-server.com)", - "changeServer": "Server ändern", + "changeServer": "Server wechseln", "mustIncludeProtocol": "Server-URL muss mit http:// oder https:// beginnen", - "allowInvalidCertificate": "Ungültiges Zertifikat zulassen", - "allowInvalidCertificateDesc": "Nur für vertrauenswürdige, selbstgehostete Server mit selbstsignierten oder IP-Adresszertifikaten verwenden.", + "allowInvalidCertificate": "Ungültiges Zertifikat erlauben", + "allowInvalidCertificateDesc": "Verwenden Sie nur für vertrauenswürdige selbst gehostete Server mit selbstsignierten oder IP-Adressen-Zertifikaten.", "useEmbedded": "Lokalen Server verwenden", "embeddedDesc": "Starte Termix mit dem eingebauten lokalen Server (kein entfernter Server benötigt)", - "embeddedConnecting": "Verbindung zum lokalen Server...", - "embeddedNotReady": "Lokaler Server ist noch nicht bereit. Bitte warten Sie einen Moment und versuchen Sie es erneut.", - "localServer": "Lokaler Server" + "embeddedConnecting": "Verbinde zu lokalem Server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Entfernen" }, "versionCheck": { - "error": "Versionsüberprüfungsfehler", - "checkFailed": "Fehler bei der Suche nach Updates", - "upToDate": "App ist aktuell", - "currentVersion": "Sie verwenden Version {{version}}", - "updateAvailable": "Update verfügbar", - "newVersionAvailable": "Eine neue Version ist verfügbar! Sie verwenden {{current}}, aber {{latest}} ist verfügbar.", - "betaVersion": "Beta-Version", - "betaVersionDesc": "Sie verwenden {{current}}, was neuer ist als die neueste stabile Version {{latest}}.", - "releasedOn": "Veröffentlicht am {{date}}", - "downloadUpdate": "Update herunterladen", - "checking": "Suche nach Updates...", - "checkUpdates": "Nach Updates suchen", - "checkingUpdates": "Suche nach Updates...", - "updateRequired": "Update erforderlich" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Schließen", + "close": "Close", "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Weiter", - "maintenance": "Wartung", - "degraded": "Degradiert", - "error": "Fehler", - "warning": "Warnung", - "unsavedChanges": "Ungespeicherte Änderungen", - "dismiss": "Verwerfen", - "loading": "Wird geladen...", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", "optional": "Optional", - "connect": "Verbinden", - "copied": "Kopiert", - "connecting": "Verbinden...", - "updateAvailable": "Update verfügbar", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "In neuem Tab öffnen", - "noReleases": "Keine Releases", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", "updatesAndReleases": "Updates & Releases", - "newVersionAvailable": "Eine neue Version ({{version}}) ist verfügbar.", - "failedToFetchUpdateInfo": "Update-Informationen konnten nicht abgerufen werden", - "preRelease": "Pre-Release", - "noReleasesFound": "Keine Releases gefunden.", - "cancel": "Abbrechen", - "username": "Benutzername", - "login": "Anmelden", - "register": "Registrieren", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Stornieren", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Passwort", - "confirmPassword": "Passwort bestätigen", - "back": "Zurück", - "save": "Speichern", - "saving": "Speichern...", - "delete": "Löschen", - "rename": "Umbenennen", - "edit": "Bearbeiten", - "add": "Neu", - "confirm": "Bestätigen", - "no": "Nein", - "or": "ODER", - "next": "Nächste", - "previous": "Vorherige", - "refresh": "Aktualisieren", - "language": "Sprache", - "checking": "Überprüfen...", - "checkingDatabase": "Überprüfe Datenbankverbindung...", - "checkingAuthentication": "Authentifizierung wird überprüft...", - "backendReconnected": "Serververbindung wiederhergestellt", - "connectionDegraded": "Serververbindung verloren, Wiederherstellen…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", "remove": "Entfernen", - "create": "Anlegen", - "update": "Aktualisieren", - "copy": "Kopieren", - "copyFailed": "Fehler beim Kopieren in die Zwischenablage", + "create": "Create", + "update": "Update", + "copy": "Kopie", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Wiederherstellen", - "of": "von" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Zuhause", + "home": "Home", "terminal": "Terminal", "docker": "Docker", - "tunnels": "Tunnel", - "fileManager": "Datei-Manager", - "serverStats": "Serverstatistik", + "tunnels": "Tunnels", + "fileManager": "Dateimanager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "admin": "Admin", - "userProfile": "Benutzerprofil", - "splitScreen": "Bildschirm teilen", - "confirmClose": "Diese aktive Sitzung schließen?", - "close": "Schließen", - "cancel": "Abbrechen", - "sshManager": "SSH-Manager", - "cannotSplitTab": "Kann diesen Tab nicht teilen", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Stornieren", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Passwort kopieren", - "copySudoPassword": "Sudo-Passwort kopieren", - "passwordCopied": "Passwort in Zwischenablage kopiert", - "noPasswordAvailable": "Kein Passwort verfügbar", - "failedToCopyPassword": "Fehler beim Kopieren des Passworts", - "refreshTab": "Verbindung aktualisieren", - "openFileManager": "Dateimanager öffnen", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", "dashboard": "Dashboard", - "networkGraph": "Netzwerkgrafik", - "quickConnect": "Schnellverbindung", - "sshTools": "SSH-Tools", - "history": "Verlauf", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", "hosts": "Hosts", - "snippets": "Schnipsel", - "hostManager": "Host-Manager", - "credentials": "Anmeldedaten", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Verbindungen", "roleAdministrator": "Administrator", - "roleUser": "Benutzer" + "roleUser": "User" }, "hosts": { "hosts": "Hosts", - "noHosts": "Keine SSH-Hosts", + "noHosts": "No SSH Hosts", "retry": "Wiederholen", - "refresh": "Aktualisieren", + "refresh": "Refresh", "optional": "Optional", - "downloadSample": "Beispiel herunterladen", - "failedToDeleteHost": "Fehler beim Löschen von {{name}}", - "importSkipExisting": "Import (Bestehende überspringen)", - "connectionDetails": "Verbindungsdetails", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Remote-Desktop", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Benutzername", - "folder": "Ordner", + "username": "Username", + "folder": "Folder", "tags": "Tags", "pin": "Pin", - "addHost": "Host hinzufügen", - "editHost": "Host bearbeiten", - "cloneHost": "Host klonen", - "enableTerminal": "Terminal aktivieren", - "enableTunnel": "Tunnel aktivieren", - "enableFileManager": "Dateimanager aktivieren", - "enableDocker": "Docker aktivieren", - "defaultPath": "Standardpfad", - "connection": "Verbindung", - "upload": "Hochladen", - "authentication": "Authentifizierung", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Passwort", - "key": "Schlüssel", - "credential": "Anmeldedaten", - "none": "Keine", - "sshPrivateKey": "SSH Privatschlüssel", - "keyType": "Schlüsseltyp", - "uploadFile": "Datei hochladen", - "tabGeneral": "Allgemein", + "key": "Key", + "credential": "Berechtigung", + "none": "Keiner", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Tunnel", + "tabTunnels": "Tunnels", "tabDocker": "Docker", - "tabFiles": "Dateien", - "tabStats": "Statistik", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Teilen", - "tabAuthentication": "Authentifizierung", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunnel", - "fileManager": "Datei-Manager", - "serverStats": "Serverstatistik", + "fileManager": "Dateimanager", + "serverStats": "Host Metrics", "status": "Status", - "folderRenamed": "Ordner \"{{oldName}}\" wurde erfolgreich in \"{{newName}}\" umbenannt", - "failedToRenameFolder": "Ordner konnte nicht umbenannt werden", - "movedToFolder": "Verschoben nach \"{{folder}}\"", - "editHostTooltip": "Host bearbeiten", - "statusChecks": "Statusprüfungen", - "metricsCollection": "Metrik-Sammlung", - "metricsInterval": "Metrik-Sammlungsintervall", - "metricsIntervalDesc": "Wie oft Serverstatistiken gesammelt werden (5s - 1h)", - "behavior": "Verhalten", - "themePreview": "Theme-Vorschau", - "theme": "Thema", - "fontFamily": "Schriftfamilie", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Buchstabenabstand", - "lineHeight": "Zeilenhöhe", - "cursorStyle": "Cursor-Stil", - "cursorBlink": "Cursor-Blinke", - "scrollbackBuffer": "Scrollbackpuffer", - "bellStyle": "Glockenstil", - "rightClickSelectsWord": "Rechtsklick markiert Wort", - "fastScrollModifier": "Schneller Scroll-Modifikator", - "fastScrollSensitivity": "Schnelle Scroll Empfindlichkeit", - "sshAgentForwarding": "SSH-Agent-Weiterleitung", - "backspaceMode": "Backspace-Modus", - "startupSnippet": "Startschlitz", - "selectSnippet": "Snippet auswählen", - "forceKeyboardInteractive": "Tastatur-Interaktiv erzwingen", - "overrideCredentialUsername": "Benutzername überschreiben", - "overrideCredentialUsernameDesc": "Verwenden Sie den oben angegebenen Benutzernamen anstelle des Benutzernamens", - "jumpHostChain": "Host-Kette springen", - "portKnocking": "Port Klopfen", - "addKnock": "Port hinzufügen", - "addProxyNode": "Knoten hinzufügen", - "proxyNode": "Proxyknoten", - "proxyType": "Proxy-Typ", - "quickActions": "Schnelle Aktionen", - "sudoPasswordAutoFill": "Sudo Passwort automatisch eingeben", - "sudoPassword": "Sudo Passwort", - "keepaliveInterval": "Keepalive-Intervall (ms)", - "moshCommand": "MOSH Befehl", - "environmentVariables": "Umgebungsvariablen", - "addVariable": "Variable hinzufügen", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "URL des Terminals kopieren", - "copyFileManagerUrl": "Datei Manager URL kopieren", - "copyRemoteDesktopUrl": "Remote-Desktop-URL kopieren", - "failedToConnect": "Verbindung zur Konsole fehlgeschlagen", - "connect": "Verbinden", - "disconnect": "Verbindung trennen", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", "start": "Start", - "enableStatusCheck": "Statusprüfung aktivieren", - "enableMetrics": "Metriken aktivieren", - "bulkUpdateFailed": "Massenaktualisierung fehlgeschlagen", - "selectAll": "Alle auswählen", - "deselectAll": "Alle abwählen", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Sichere Shell", - "virtualNetwork": "Virtuelles Netzwerk", - "unencryptedShell": "Unverschlüsselte Shell", - "addressIp": "Adresse / IP", - "friendlyName": "Freundlicher Name", - "folderAndAdvanced": "Ordner & Erweitert", - "privateNotes": "Private Notizen", - "privateNotesPlaceholder": "Details zu diesem Server...", - "pinToTop": "Nach oben anheften", - "pinToTopDesc": "Diesen Host immer am Anfang der Liste anzeigen", - "portKnockingSequence": "Port Knocking Sequenz", - "addKnockBtn": "Knock hinzufügen", - "noPortKnocking": "Kein Port knocking konfiguriert.", - "knockPort": "Knock-Port", - "protocol": "Protocol", - "delayAfterMs": "Verzögerung nach (ms)", - "useSocks5Proxy": "SOCKS5-Proxy verwenden", - "useSocks5ProxyDesc": "Verbindung über einen Proxy-Server leiten", - "proxyHost": "Proxy-Host", - "proxyPort": "Proxy-Port", - "proxyUsername": "Proxy Benutzername", - "proxyPassword": "Proxy-Passwort", - "proxySingleMode": "Einzelner Proxy", - "proxyChainMode": "Proxy-Kette", - "you": "Du", - "jumpHostChainLabel": "Host-Kette springen", - "addJumpBtn": "Neuer Sprung", - "noJumpHosts": "Keine Spring-Hosts konfiguriert.", - "selectAServer": "Wählen Sie einen Server...", - "sshPort": "SSH-Port", - "authMethod": "Auth Methode", - "storedCredential": "Anmeldeinformationen gespeichert", - "selectACredential": "Anmeldedaten auswählen...", - "keyTypeLabel": "Schlüsseltyp", - "keyTypeAuto": "Auto-Erkennung", - "keyPasteTab": "Einfügen", - "keyUploadTab": "Hochladen", - "keyFileLoaded": "Schlüsseldatei geladen", - "keyUploadClick": "Klicken, um .pem / .key / .ppk hochzuladen", - "clearKey": "Lösche Taste", - "keySaved": "SSH-Schlüssel gespeichert", - "keyReplaceNotice": "füge einen neuen Schlüssel ein, um ihn zu ersetzen", - "keyPassphraseSaved": "Passwort gespeichert, zum Ändern eingeben", - "replaceKey": "Schlüssel ersetzen", - "forceKeyboardInteractiveLabel": "Tastatur-Interaktiv erzwingen", - "forceKeyboardInteractiveShortDesc": "Manuelle Passworteingabe erzwingen, auch wenn Schlüssel vorhanden sind", - "terminalAppearance": "Terminalansicht", - "colorTheme": "Farbschema", - "fontFamilyLabel": "Schriftfamilie", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protokoll", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Cursor-Stil", - "letterSpacingPx": "Buchstabenabstand (px)", - "lineHeightLabel": "Zeilenhöhe", - "bellStyleLabel": "Glockenstil", - "backspaceModeLabel": "Backspace-Modus", - "cursorBlinking": "Cursor-Blinken", - "cursorBlinkingDesc": "Blinkende Animation für den Cursor des Terminals aktivieren", - "rightClickSelectsWordLabel": "Rechtsklick Wort auswählen", - "rightClickSelectsWordShortDesc": "Wählen Sie das Wort unter dem Cursor mit der rechten Maustaste", - "behaviorAndAdvanced": "Verhalten & Fortgeschrittene", - "scrollbackBufferLabel": "Scrollbackpuffer", - "scrollbackMaxLines": "Maximale Anzahl von Zeilen im Verlauf", - "sshAgentForwardingLabel": "SSH-Agent-Weiterleitung", - "sshAgentForwardingShortDesc": "Ihre lokalen SSH-Schlüssel an diesen Host übergeben", - "enableAutoMosh": "Auto-Mosh aktivieren", - "enableAutoMoshDesc": "Mosh als SSH bevorzugen, falls verfügbar", - "enableAutoTmux": "Auto-Tmux aktivieren", - "enableAutoTmuxDesc": "Automatisches Starten oder Anhängen an tmux Sitzung", - "sudoPasswordAutoFillLabel": "Sudo Passwort automatisch ausfüllen", - "sudoPasswordAutoFillShortDesc": "Sudo-Passwort bei Aufforderung automatisch angeben", - "sudoPasswordLabel": "Sudo Passwort", - "environmentVariablesLabel": "Umgebungsvariablen", - "addVariableBtn": "Variable hinzufügen", - "noEnvVars": "Keine Umgebungsvariablen konfiguriert.", - "fastScrollModifierLabel": "Schneller Scroll-Modifikator", - "fastScrollSensitivityLabel": "Schnelle Scroll Empfindlichkeit", - "moshCommandLabel": "Mosh-Befehl", - "startupSnippetLabel": "Startschlitz", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Keepalive-Intervall (Sekunden)", - "maxKeepaliveMisses": "Max. Keepalive Vermisste", - "tunnelSettings": "Tunnel Einstellungen", - "enableTunneling": "Tunneling aktivieren", - "enableTunnelingDesc": "SSH-Tunnelfunktionalität für diesen Host aktivieren", - "serverTunnelsSection": "Servertunnel", - "addTunnelBtn": "Tunnel hinzufügen", - "noTunnelsConfigured": "Keine Tunnel konfiguriert.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", - "tunnelType": "Tunneltyp", - "tunnelModeLocalDesc": "Weiterleiten Sie einen lokalen Port an einen Port auf dem entfernten Server (oder einen Host, der von ihm erreichbar ist).", - "tunnelModeRemoteDesc": "Führen Sie einen Port auf dem entfernten Server zurück an einen lokalen Port auf Ihrem Rechner.", - "tunnelModeDynamicDesc": "Erstellen Sie einen SOCKS5 Proxy auf einem lokalen Port für dynamische Port-Weiterleitung.", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Dieser Host (direkter Tunnel)", - "endpointHost": "Endpunkt-Host", - "endpointPort": "Endpunkt-Port", - "bindHost": "Verbinde Host", - "sourcePort": "Quellport", - "maxRetries": "Max. Wiederholungen", - "retryIntervalS": "Wiederholungsintervall (s)", - "autoStartLabel": "Auto-Start", - "autoStartDesc": "Diesen Tunnel automatisch verbinden, wenn der Host geladen wird", - "tunnelConnecting": "Verbindung zum Tunnel...", - "tunnelDisconnected": "Tunnel getrennt", - "failedToConnectTunnel": "Verbindung fehlgeschlagen", - "failedToDisconnectTunnel": "Fehler beim Trennen", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", "dockerIntegration": "Docker Integration", - "enableDockerMonitor": "Docker aktivieren", - "enableDockerMonitorDesc": "Überwachen und verwalten von Containern auf diesem Host über Docker", - "enableFileManagerMonitor": "Dateimanager aktivieren", - "enableFileManagerMonitorDesc": "Durchsuchen und verwalten von Dateien auf diesem Host über SFTP", - "defaultPathLabel": "Standardpfad", - "fileManagerPathHint": "Das zu öffnende Verzeichnis, wenn der Dateimanager für diesen Host gestartet wird.", - "statusChecksLabel": "Statusprüfungen", - "enableStatusChecks": "Statusüberprüfungen aktivieren", - "enableStatusChecksDesc": "Ping diesen Host regelmäßig, um die Verfügbarkeit zu überprüfen", - "useGlobalInterval": "Globales Intervall verwenden", - "useGlobalIntervalDesc": "Mit dem serverweiten Statusüberprüfungsintervall überschreiben", - "checkIntervalS": "Überprüfungsintervall (e)", - "checkIntervalDesc": "Sekunden zwischen jedem Konnektivitätsping", - "metricsCollectionLabel": "Metrik-Sammlung", - "enableMetricsLabel": "Metriken aktivieren", - "enableMetricsDesc": "Erfassen Sie CPU, RAM, Festplatte und Netzwerknutzung von diesem Host", - "useGlobalMetrics": "Globales Intervall verwenden", - "useGlobalMetricsDesc": "Mit dem serverweiten Metrik-Intervall überschreiben", - "metricsIntervalS": "Metrik-Intervall (e)", - "metricsIntervalDesc2": "Sekunden zwischen metrischen Snapshots", - "visibleWidgets": "Sichtbare Widgets", - "cpuUsageLabel": "CPU Auslastung", - "cpuUsageDesc": "CPU-Prozent, Durchschnittswert, Sparkline-Graph", - "memoryLabel": "Speichernutzung", - "memoryDesc": "RAM Auslastung, Swap, zwischengespeichert", - "storageLabel": "Plattennutzung", - "storageDesc": "Festplattenverbrauch pro Mount-Punkt", - "networkLabel": "Netzwerkschnittstellen", - "networkDesc": "Schnittstellenliste und Bandbreite", - "uptimeLabel": "Laufzeit", - "uptimeDesc": "System-Uptime und Boot-Zeit", - "systemInfoLabel": "System-Info", - "systemInfoDesc": "Betriebssystem, Kernel, Hostname, Architektur", - "recentLoginsLabel": "Neueste Anmeldungen", - "recentLoginsDesc": "Erfolgreiche und fehlgeschlagene Anmeldetermine", - "topProcessesLabel": "Top-Prozesse", - "topProcessesDesc": "PID, CPU%, MEM%, Befehl", - "listeningPortsLabel": "Höre Ports", - "listeningPortsDesc": "Ports mit Prozess- und Status öffnen", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Passwort", + "authTypeKey": "SSH-Schlüssel", + "authTypeCredential": "Berechtigung", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Keiner", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, SELinux-Status", - "quickActionsLabel": "Schnelle Aktionen", - "quickActionsToolbar": "Schnelle Aktionen erscheinen als Buttons in der Server-Statistik-Symbolleiste für die Ausführung von Ein-Klick-Befehlen.", - "noQuickActions": "Noch keine schnellen Aktionen.", - "buttonLabel": "Schaltflächenbezeichnung", - "selectSnippetPlaceholder": "Snippet auswählen...", - "addActionBtn": "Aktion hinzufügen", - "hostSharedSuccessfully": "Host erfolgreich geteilt", - "failedToShareHost": "Fehler beim Teilen des Hosts", - "accessRevoked": "Zugriff widerrufen", - "failedToRevokeAccess": "Fehler beim Entfernen des Zugriffs", - "cancelBtn": "Abbrechen", - "savingBtn": "Speichern...", - "addHostBtn": "Host hinzufügen", - "hostUpdated": "Host aktualisiert", - "hostCreated": "Host erstellt", - "failedToSave": "Fehler beim Speichern des Hosts", - "credentialUpdated": "Anmeldeinformationen aktualisiert", - "credentialCreated": "Anmeldeinformationen erstellt", - "failedToSaveCredential": "Anmeldeinformationen konnten nicht gespeichert werden", - "backToHosts": "Zurück zu Hosts", - "backToCredentials": "Zurück zu Anmeldeinformationen", - "pinned": "Angeheftet", - "noHostsFound": "Keine Hosts gefunden", - "tryDifferentTerm": "Einen anderen Begriff versuchen", - "addFirstHost": "Füge deinen ersten Host hinzu, um loszulegen", - "noCredentialsFound": "Keine Anmeldedaten gefunden", - "addCredentialBtn": "Zugangsdaten hinzufügen", - "updateCredentialBtn": "Anmeldeinformationen aktualisieren", - "features": "Eigenschaften", - "noFolder": "(Kein Ordner)", - "deleteSelected": "Löschen", - "exitSelection": "Auswahl beenden", - "importSkip": "Import (Bestehende überspringen)", - "importOverwrite": "Import (Überschreiben)", - "collapseBtn": "Einklappen", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Stornieren", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Angepinnt", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Merkmale", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", "importExportBtn": "Import / Export", - "hostStatusesRefreshed": "Host-Status aktualisiert", - "failedToRefreshHosts": "Fehler beim Aktualisieren der Hosts", - "movedHostTo": "{{host}} nach \"{{folder}} \" verschoben", - "failedToMoveHost": "Fehler beim Verschieben des Hosts", - "folderRenamedTo": "Ordner umbenannt in \"{{name}}\"", - "deletedFolder": "Löschter Ordner \"{{name}}\"", - "failedToDeleteFolder": "Fehler beim Löschen des Ordners", - "deleteAllInFolder": "Alle Hosts in \"{{name}}\"löschen? Dies kann nicht rückgängig gemacht werden.", - "deletedHost": "Gelöschte {{name}}", - "copiedToClipboard": "In Zwischenablage kopiert", - "terminalUrlCopied": "Terminal URL kopiert", - "fileManagerUrlCopied": "URL des Datei-Managers kopiert", - "tunnelUrlCopied": "Tunnel-URL kopiert", - "dockerUrlCopied": "Docker URL kopiert", - "serverStatsUrlCopied": "Server-Statistik-URL kopiert", - "rdpUrlCopied": "RDP-URL kopiert", - "vncUrlCopied": "VNC-URL kopiert", - "telnetUrlCopied": "Telnet-URL kopiert", - "remoteDesktopUrlCopied": "Remote-Desktop-URL kopiert", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Stornieren", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protokoll", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Aktionen erweitern", "collapseActions": "Aktionen zusammenbrechen", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Magisches Paket an {{name}} gesendet", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Das Senden des Magic Packets ist fehlgeschlagen.", - "cloneHostAction": "Host klonen", - "copyAddress": "Adresse kopieren", - "copyLink": "Link kopieren", - "copyTerminalUrlAction": "URL des Terminals kopieren", - "copyFileManagerUrlAction": "Datei Manager URL kopieren", - "copyTunnelUrlAction": "Tunnel-URL kopieren", - "copyDockerUrlAction": "Docker URL kopieren", - "copyServerStatsUrlAction": "Server-Statistik-URL kopieren", - "copyRdpUrlAction": "RDP-URL kopieren", - "copyVncUrlAction": "VNC-URL kopieren", - "copyTelnetUrlAction": "Telnet-URL kopieren", - "copyRemoteDesktopUrlAction": "Remote-Desktop-URL kopieren", - "deleteCredentialConfirm": "Anmeldedaten \"{{name}} \"löschen?", - "deletedCredential": "Gelöschte {{name}}", - "deploySSHKeyTitle": "SSH-Schlüssel verteilen", - "deployingBtn": "Verteilen...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Deploy", - "failedToDeployKey": "Fehler beim Bereitstellen des Schlüssels", - "deleteHostsConfirm": "Löschen {{count}} Host{{plural}}? Dies kann nicht rückgängig gemacht werden.", - "movedToRoot": "Zum Root verschoben", - "failedToMoveHosts": "Fehler beim Verschieben der Hosts", - "enableTerminalFeature": "Terminal aktivieren", - "disableTerminalFeature": "Terminal deaktivieren", - "enableFilesFeature": "Dateien aktivieren", - "disableFilesFeature": "Dateien deaktivieren", - "enableTunnelsFeature": "Tunnel aktivieren", - "disableTunnelsFeature": "Tunnel deaktivieren", - "enableDockerFeature": "Docker aktivieren", - "disableDockerFeature": "Docker deaktivieren", - "addTagsPlaceholder": "Tags hinzufügen...", - "authDetails": "Authentifizierungsdetails", - "credType": "Typ", - "generateKeyPairDesc": "Generieren Sie ein neues Schlüsselpaar, sowohl private als auch öffentliche Schlüssel werden automatisch ausgefüllt.", - "generatingKey": "Erstellen...", - "generateLabel": "{{label}} generieren", - "uploadFileBtn": "Datei hochladen", - "keyPassphraseOptional": "Schlüsselpasswort (optional)", - "sshPublicKeyOptional": "SSH Öffentlicher Schlüssel (optional)", - "publicKeyGenerated": "Öffentlicher Schlüssel generiert", - "failedToGeneratePublicKey": "Öffentlichen Schlüssel konnte nicht abgerufen werden", - "publicKeyCopied": "Öffentlicher Schlüssel kopiert", - "keyPairGenerated": "{{label}} Schlüsselpaar generiert", - "failedToGenerateKeyPair": "Fehler beim Generieren des Schlüsselpaars", - "searchHostsPlaceholder": "Hosts, Adressen, Tags… suchen", - "searchCredentialsPlaceholder": "Anmeldeinformationen suchen…", - "refreshBtn": "Aktualisieren", - "addTag": "Tags hinzufügen...", - "deleteConfirmBtn": "Löschen", - "tunnelRequirementsText": "Der SSH-Server muss GatewayPorts yes, AllowTcpForwarding yes, und PermitRootLogin yes in /etc/ssh/sshd_config gesetzt haben.", - "deleteHostConfirm": "\"{{name}} \"löschen?", - "enableAtLeastOneProtocol": "Aktivieren Sie mindestens ein Protokoll oben, um Authentifizierung und Verbindungseinstellungen zu konfigurieren.", - "keyPassphrase": "Schlüsselpasswort", - "connectBtn": "Verbinden", - "disconnectBtn": "Verbindung trennen", - "basicInformation": "Grundlegende Informationen", - "authDetailsSection": "Authentifizierungsdetails", - "credTypeLabel": "Typ", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", "hostsTab": "Hosts", - "credentialsTab": "Anmeldedaten", - "selectMultiple": "Wählen Sie mehrere", - "selectHosts": "Hosts auswählen", - "connectionLabel": "Verbindung", - "authenticationLabel": "Authentifizierung", - "generateKeyPairTitle": "Schlüsselpaar generieren", - "generateKeyPairDescription": "Generieren Sie ein neues Schlüsselpaar, sowohl private als auch öffentliche Schlüssel werden automatisch ausgefüllt.", - "generateFromPrivateKey": "Aus Privatschlüssel generieren", - "refreshBtn2": "Aktualisieren", - "exitSelectionTitle": "Auswahl beenden", - "exportAll": "Alle exportieren", - "addHostBtn2": "Host hinzufügen", - "addCredentialBtn2": "Zugangsdaten hinzufügen", - "checkingHostStatuses": "Host-Status wird überprüft...", - "pinnedSection": "Angeheftet", - "hostsExported": "Hosts erfolgreich exportiert", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Angepinnt", + "hostsExported": "Hosts exported successfully", "exportFailed": "Fehler beim Exportieren der Hosts", - "sampleDownloaded": "Beispieldatei heruntergeladen", - "failedToDeleteCredential2": "Anmeldedaten konnten nicht gelöscht werden", - "noFolderOption": "(Kein Ordner)", - "nSelected": "{{count}} ausgewählt", - "featuresMenu": "Eigenschaften", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Merkmale", "moveMenu": "Bewegen", - "cancelSelection": "Abbrechen", - "deployDialogDesc": "Deploy {{name}} auf die autorisierten Schlüssel eines Hosts.", - "targetHostLabel": "Ziel-Host", - "selectHostOption": "Wähle einen Host...", - "keyDeployedSuccess": "Schlüssel erfolgreich verteilt", - "failedToDeployKey2": "Fehler beim Bereitstellen des Schlüssels", - "deletedCount": "{{count}} Hosts gelöscht", - "failedToDeleteCount": "Fehler beim Löschen der {{count}} Hosts", - "duplicatedHost": "Duplizierte \"{{name}}\"", - "failedToDuplicateHost": "Fehler beim Duplizieren des Hosts", - "updatedCount": "Aktualisierte {{count}} Hosts", - "friendlyNameLabel": "Freundlicher Name", - "descriptionLabel": "Beschreibung", - "loadingHost": "Host wird geladen...", - "loadingHosts": "Hosts werden geladen...", - "loadingCredentials": "Anmeldedaten werden geladen...", - "noHostsYet": "Noch keine Hosts", - "noHostsMatchSearch": "Keine Hosts entsprechen Ihrer Suche", - "hostNotFound": "Host nicht gefunden", - "searchHosts": "Hosts suchen...", + "connectSelected": "Connect", + "cancelSelection": "Stornieren", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Hosts sortieren", "sortDefault": "Standardreihenfolge", "sortNameAsc": "Name (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "Tags", - "shareHost": "Host teilen", - "shareHostTitle": "Weitergeben: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Dieser Host muss eine Anmeldeinformationen verwenden, um das Teilen zu ermöglichen. Bearbeiten Sie den Host und weisen Sie zuerst eine Anmeldeinformationen zu." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Verbindung", - "authentication": "Authentifizierung", - "connectionSettings": "Verbindungseinstellungen", - "displaySettings": "Anzeigeeinstellungen", - "audioSettings": "Audio-Einstellungen", - "rdpPerformance": "RDP Leistung", - "deviceRedirection": "Umleitung des Geräts", - "session": "Sitzung", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Berechtigung", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Zwischenablage", - "sessionRecording": "Sitzungsaufzeichnung", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC Einstellungen", - "terminalSettings": "Terminaleinstellungen", - "rdpPort": "RDP-Port", - "username": "Benutzername", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Passwort", - "domain": "Domäne", - "securityMode": "Sicherheitsmodus", - "colorDepth": "Farbtiefe", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Höhe", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Methode ändern", - "clientName": "Kundenname", - "initialProgram": "Initiales Programm", - "serverLayout": "Server-Layout", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", "gatewayPort": "Gateway Port", - "gatewayUsername": "Gateway-Benutzername", - "gatewayPassword": "Gateway-Passwort", - "gatewayDomain": "Gateway-Domain", - "remoteAppProgram": "RemoteApp-Programm", - "workingDirectory": "Arbeitsverzeichnis", - "arguments": "Argumente", - "normalizeLineEndings": "LinienEndings normalisieren", - "recordingPath": "Aufnahmepfad", - "recordingName": "Aufzeichnungsname", - "macAddress": "MAC-Adresse", - "broadcastAddress": "Broadcast-Adresse", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Wartezeit (n)", - "driveName": "Laufwerkname", - "drivePath": "Fahrpfad", - "ignoreCertificate": "Zertifikat ignorieren", - "ignoreCertificateDesc": "Erlaube Verbindungen zu Hosts mit selbstsignierten Zertifikaten", - "forceLossless": "Verlustfrei erzwingen", - "forceLosslessDesc": "Erzwinge verlustfreie Bildkodierung (höhere Qualität, mehr Bandbreite)", - "disableAudio": "Audio deaktivieren", - "disableAudioDesc": "Alle Audiodateien der Remote-Sitzung stummschalten", - "enableAudioInput": "Audio-Eingang aktivieren (Mikrofon)", - "enableAudioInputDesc": "Lokales Mikrofon an die entfernte Sitzung weiterleiten", - "wallpaper": "Hintergrundbild", - "wallpaperDesc": "Desktop-Hintergrund anzeigen (Deaktivierung verbessert die Leistung)", - "theming": "Design", - "themingDesc": "Visuelle Designs und Stile aktivieren", - "fontSmoothing": "Schriftglättung", - "fontSmoothingDesc": "ClearType-Schriftarten-Rendering aktivieren", - "fullWindowDrag": "Volles Fenster Drag", - "fullWindowDragDesc": "Fensterinhalt beim Ziehen anzeigen", - "desktopComposition": "Desktop-Komposition", - "desktopCompositionDesc": "Aero-Glaseffekte aktivieren", - "menuAnimations": "Menüanimationen", - "menuAnimationsDesc": "Menü- und Slide-Animationen aktivieren", - "disableBitmapCaching": "Bitmap-Cache deaktivieren", - "disableBitmapCachingDesc": "Bitmap-Cache deaktivieren (kann mit Glitches helfen)", - "disableOffscreenCaching": "Offscreen Cache deaktivieren", - "disableOffscreenCachingDesc": "Offscreen Cache ausschalten", - "disableGlyphCaching": "Glyph-Cache deaktivieren", - "disableGlyphCachingDesc": "Glyphencache ausschalten", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "RemoteFX-Grafik-Pipeline verwenden", - "enablePrinting": "Drucken aktivieren", - "enablePrintingDesc": "Lokale Drucker zur Remote-Sitzung weiterleiten", - "enableDriveRedirection": "Drive-Umleitung aktivieren", - "enableDriveRedirectionDesc": "Einen lokalen Ordner als Laufwerk in der Remote-Sitzung zuordnen", - "createDrivePath": "Laufwerkspfad erstellen", - "createDrivePathDesc": "Automatisch den Ordner erstellen, wenn er nicht existiert", - "disableDownload": "Download deaktivieren", - "disableDownloadDesc": "Verhindere das Herunterladen von Dateien von der Remote-Sitzung", - "disableUpload": "Upload deaktivieren", - "disableUploadDesc": "Das Hochladen von Dateien in die entfernte Sitzung verhindern", - "enableTouch": "Berührung aktivieren", - "enableTouchDesc": "Touch-Eingabeweiterleitung aktivieren", - "consoleSession": "Konsolen-Sitzung", - "consoleSessionDesc": "Verbinden Sie sich mit der Konsole (Sitzung 0) statt einer neuen Sitzung", - "sendWolPacket": "WOL-Paket senden", - "sendWolPacketDesc": "Senden Sie ein magisches Paket, um diesen Host aufzuwecken, bevor Sie sich verbinden", - "disableCopy": "Kopieren deaktivieren", - "disableCopyDesc": "Kopieren von Text aus der entfernten Sitzung verhindern", - "disablePaste": "Einfügen deaktivieren", - "disablePasteDesc": "Verhindern Sie das Einfügen von Text in die entfernte Sitzung", - "createPathIfMissing": "Pfad erstellen, wenn fehlt", - "createPathIfMissingDesc": "Automatisch das Aufnahmeverzeichnis erstellen", - "excludeOutput": "Ausgabe ausschließen", - "excludeOutputDesc": "Bildschirmausgabe nicht aufzeichnen (nur Metadaten)", - "excludeMouse": "Maus ausschließen", - "excludeMouseDesc": "Mausbewegungen nicht aufzeichnen", - "includeKeystrokes": "Tastenanschläge einbeziehen", - "includeKeystrokesDesc": "Zusätzlich zur Bildschirmausgabe rohe Tastenanschläge aufzeichnen", - "vncPort": "VNC-Port", - "vncPassword": "VNC Passwort", - "vncUsernameOptional": "Benutzername (optional)", - "vncLeaveBlank": "Leer lassen, wenn nicht erforderlich", - "cursorMode": "Cursor-Modus", - "swapRedBlue": "Rot/Blau tauschen", - "swapRedBlueDesc": "Vertausche die roten und blauen Kanäle (behebt einige Farbprobleme)", - "readOnly": "Nur lesen", - "readOnlyDesc": "Zeige den Remote-Bildschirm ohne Eingabe zu senden", - "telnetPort": "Telnet-Port", - "terminalType": "Terminaltyp", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Farbschema", - "backspaceKey": "Backspace-Taste", - "saveHostFirst": "Den Host zuerst speichern.", - "sharingOptionsAfterSave": "Freigabeoptionen sind verfügbar, nachdem der Host gespeichert wurde.", - "sharingLoadError": "Fehler beim Laden der Freigabedaten. Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.", - "shareHostSection": "Host teilen", - "shareWithUser": "Mit Benutzer teilen", - "shareWithRole": "Mit Rolle teilen", - "selectUser": "Benutzer auswählen", - "selectRole": "Rolle auswählen", - "selectUserOption": "Benutzer auswählen...", - "selectRoleOption": "Wählen Sie eine Rolle...", - "permissionLevel": "Berechtigungsstufe", - "expiresInHours": "Läuft ab in (Stunden)", - "noExpiryPlaceholder": "Leer lassen für kein Ablaufdatum", - "shareBtn": "Teilen", - "currentAccess": "Aktueller Zugriff", - "typeHeader": "Typ", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Berechtigung", - "grantedByHeader": "Erteilt von", - "expiresHeader": "Gültig bis", - "noAccessEntries": "Noch keine Zugriffseinträge.", - "expiredLabel": "Abgelaufen", - "neverLabel": "Nie", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Abbrechen", - "savingBtn": "Speichern...", - "updateHostBtn": "Host aktualisieren", - "addHostBtn": "Host hinzufügen" + "cancelBtn": "Stornieren", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Hosts, Befehle oder Einstellungen suchen...", - "quickActions": "Schnelle Aktionen", - "hostManager": "Host-Manager", - "hostManagerDesc": "Hosts verwalten, hinzufügen oder bearbeiten", - "addNewHost": "Neuen Host hinzufügen", - "addNewHostDesc": "Neuen Host registrieren", - "adminSettings": "Admin-Einstellungen", - "adminSettingsDesc": "Systemeinstellungen und Benutzer konfigurieren", - "userProfile": "Benutzerprofil", - "userProfileDesc": "Konto und Einstellungen verwalten", - "addCredential": "Zugangsdaten hinzufügen", - "addCredentialDesc": "SSH-Schlüssel oder Passwörter speichern", - "recentActivity": "Letzte Aktivität", - "serversAndHosts": "Server & Hosts", - "noHostsFound": "Keine Hosts gefunden, die mit \"{{search}} \" übereinstimmen", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", "links": "Links", "navigate": "Navigate", - "select": "Auswählen", - "toggleWith": "Umschalten mit" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Kein Tab zugewiesen", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktiver Bereich" }, "connections": { "noConnections": "Keine Verbindungen", "noConnectionsDesc": "Öffnen Sie ein Terminal, einen Dateimanager oder eine Remote-Desktop-Verbindung, um die Verbindungen hier anzuzeigen.", - "connectedFor": "Verbunden für {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Verbunden", "disconnected": "Getrennt", "closeTab": "Tab schließen", @@ -801,358 +981,374 @@ "sectionBackground": "Hintergrund", "backgroundDesc": "Die Sitzungen bleiben nach der Trennung noch 30 Minuten bestehen und können wiederhergestellt werden.", "persisted": "Im Hintergrund bestehen geblieben", - "expiresIn": "Läuft ab in {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Verbindungen suchen...", - "noSearchResults": "Es wurden keine Ergebnisse gefunden, die Ihrer Suche entsprechen." + "noSearchResults": "Es wurden keine Ergebnisse gefunden, die Ihrer Suche entsprechen.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Verbinde mit {{type}} Sitzung...", - "connectionError": "Verbindungsfehler", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Verbindung fehlgeschlagen", - "failedToConnect": "Verbindungs-Token konnte nicht abgerufen werden", - "hostNotFound": "Host nicht gefunden", - "noHostSelected": "Kein Host ausgewählt", - "reconnect": "Neu verbinden", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Wiederverbinden", "retry": "Wiederholen", - "guacdUnavailable": "Remote Desktop Service (guacd) ist nicht verfügbar. Bitte stellen Sie sicher, dass Guacd ausgeführt und in den Admin-Einstellungen korrekt konfiguriert und zugänglich ist.", - "ctrlAltDel": "Strg+Alt+Entf", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", + "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { - "ctrlAltDel": "Strg+Alt+Entf", - "winL": "Win+L (Sperrbildschirm)", - "winKey": "Windows-Schlüssel", - "ctrl": "Strg", + "ctrlAltDel": "Ctrl+Alt+Del", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", + "ctrl": "Ctrl", "alt": "Alt", - "shift": "Schicht", - "win": "Sieg", - "stickyActive": "{{key}} (latched - Klicke zum Lösen)", - "stickyInactive": "{{key}} (Klicke auf latch)", - "esc": "Entfliehen", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Zuhause", - "end": "Ende", - "pageUp": "Seite oben", - "pageDown": "Seite runter", - "arrowUp": "Pfeil hoch", - "arrowDown": "Pfeil runter", - "arrowLeft": "Pfeil links", - "arrowRight": "Pfeil rechts", - "fnToggle": "Funktionstasten", - "reconnect": "Sitzung erneut verbinden", - "collapse": "Symbolleiste einklappen", - "expand": "Symbolleiste erweitern", - "dragHandle": "Zum Nachsetzen ziehen ziehen" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Mit Host verbinden", - "clear": "Leeren", - "paste": "Einfügen", - "reconnect": "Neu verbinden", - "connectionLost": "Verbindung verloren", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Wiederverbinden", + "connectionLost": "Connection lost", "connected": "Verbunden", - "clipboardWriteFailed": "Fehler beim Kopieren in die Zwischenablage. Stellen Sie sicher, dass die Seite über HTTPS oder localhost ausgeliefert wird.", - "clipboardReadFailed": "Lesen aus der Zwischenablage fehlgeschlagen. Stellen Sie sicher, dass die Zwischenablage Berechtigungen gewährt werden.", - "clipboardHttpWarning": "Einfügen erfordert HTTPS. Verwenden Sie Strg+Umschalt+V oder bedienen Termix über HTTPS.", - "unknownError": "Unbekannter Fehler aufgetreten", - "websocketError": "WebSocket-Verbindungsfehler", - "connecting": "Verbinden...", - "noHostSelected": "Kein Host ausgewählt", - "reconnecting": "Erneut verbinden... ({{attempt}}/{{max}})", - "reconnected": "Wiederverbindung erfolgreich", - "tmuxSessionCreated": "tmux Sitzung erstellt: {{name}}", - "tmuxSessionAttached": "tmux Sitzung angehängt: {{name}}", - "tmuxUnavailable": "tmux ist nicht auf dem entfernten Host installiert, zurück zur Standard-Shell", - "tmuxSessionPickerTitle": "tmux Sitzungen", - "tmuxSessionPickerDesc": "Vorhandene Tmux-Sitzungen auf diesem Host gefunden. Wählen Sie eine, um eine Sitzung neu anzuhängen oder zu erstellen.", - "tmuxWindows": "Fenster", - "tmuxWindowCount": "{{count}} Fenster", - "tmuxAttached": "Angehängte Clients", - "tmuxAttachedCount": "{{count}} hinzugefügt", - "tmuxLastActivity": "Letzte Aktivität", - "tmuxTimeJustNow": "gerade jetzt", - "tmuxTimeMinutes": "{{count}}m vor", - "tmuxTimeHours": "{{count}}h vor", - "tmuxTimeDays": "{{count}}d vor", - "tmuxCreateNew": "Neue Sitzung starten", - "tmuxCopyHint": "Auswahl anpassen und Enter drücken, um in die Zwischenablage zu kopieren", - "tmuxDetach": "Von tmux Sitzung trennen", - "tmuxDetached": "Von tmux Sitzung getrennt", - "maxReconnectAttemptsReached": "Maximale Wiederholungsversuche erreicht", - "closeTab": "Schließen", - "connectionTimeout": "Verbindungs-Timeout", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "{{command}} - {{host}}", - "totpRequired": "Zwei-Faktor-Authentifizierung erforderlich", - "totpCodeLabel": "Bestätigungscode", - "totpVerify": "Überprüfen", - "warpgateAuthRequired": "Warpgate-Authentifizierung erforderlich", - "warpgateSecurityKey": "Sicherheitsschlüssel", - "warpgateAuthUrl": "Authentifizierungs-URL", - "warpgateOpenBrowser": "Im Browser öffnen", - "warpgateContinue": "Ich habe die Authentifizierung abgeschlossen", - "opksshAuthRequired": "OPKSSH Authentifizierung erforderlich", - "opksshAuthDescription": "Vollständige Authentifizierung in Ihrem Browser, um fortzufahren. Diese Sitzung bleibt 24 Stunden gültig.", - "opksshOpenBrowser": "Browser zum Authentifizieren öffnen", - "opksshWaitingForAuth": "Warte auf Authentifizierung im Browser...", - "opksshAuthenticating": "Authentifizierung wird verarbeitet...", - "opksshTimeout": "Timeout der Authentifizierung. Bitte versuchen Sie es erneut.", - "opksshAuthFailed": "Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihre Zugangsdaten und versuchen Sie es erneut.", - "opksshSignInWith": "Mit {{provider}} anmelden", - "sudoPasswordPopupTitle": "Passwort einfügen?", - "websocketAbnormalClose": "Verbindung wurde unerwartet geschlossen. Dies kann auf ein Problem mit der umgekehrten Proxy- oder SSL-Konfiguration zurückzuführen sein. Bitte überprüfen Sie die Serverprotokolle.", - "connectionLogTitle": "Verbindungsprotokoll", - "connectionLogCopy": "Protokolle in Zwischenablage kopieren", - "connectionLogEmpty": "Noch keine Verbindungsprotokolle", - "connectionLogWaiting": "Warte auf Verbindungsprotokolle...", - "connectionLogCopied": "Verbindungsprotokolle in Zwischenablage kopiert", - "connectionLogCopyFailed": "Fehler beim Kopieren der Logs in die Zwischenablage", - "connectionRejected": "Verbindung vom Server abgelehnt. Bitte überprüfen Sie Ihre Authentifizierung und Netzwerkkonfiguration.", - "hostKeyRejected": "Überprüfung des SSH-Host-Schlüssels abgelehnt. Verbindung abgebrochen.", - "sessionTakenOver": "Sitzung wurde in einem anderen Tab geöffnet. Wiederverbinden..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Offen", + "linkDialogCopy": "Kopie", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Split Tab", + "addToSplit": "Zu Split hinzufügen", + "removeFromSplit": "Aus Split entfernen" + } }, "fileManager": { - "noHostSelected": "Kein Host ausgewählt", - "initializingEditor": "Initialisiere Editor...", - "file": "Datei", - "folder": "Ordner", - "uploadFile": "Datei hochladen", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", "downloadFile": "Download", - "extractArchive": "Archiv extrahieren", - "extractingArchive": "Extrahiere {{name}}...", - "archiveExtractedSuccessfully": "{{name}} erfolgreich extrahiert", - "extractFailed": "Entpacken fehlgeschlagen", - "compressFile": "Datei komprimieren", - "compressFiles": "Dateien komprimieren", - "compressFilesDesc": "{{count}} Elemente in ein Archiv komprimieren", - "archiveName": "Archivname", - "enterArchiveName": "Archivnamen eingeben...", - "compressionFormat": "Komprimierungsformat", - "selectedFiles": "Ausgewählte Dateien", - "andMoreFiles": "und {{count}} mehr...", - "compress": "Komprimieren", - "compressingFiles": "Komprimiere {{count}} Elemente in {{name}}...", - "filesCompressedSuccessfully": "{{name}} erfolgreich erstellt", - "compressFailed": "Komprimierung fehlgeschlagen", - "edit": "Bearbeiten", - "preview": "Vorschau", - "previous": "Vorherige", - "next": "Nächste", - "pageXOfY": "Seite {{current}} von {{total}}", - "zoomOut": "Verkleinern", - "zoomIn": "Vergrößern", - "newFile": "Neue Datei", - "newFolder": "Neuer Ordner", - "rename": "Umbenennen", - "uploading": "Hochladen...", - "uploadingFile": "Lade {{name}} hoch...", - "fileName": "Dateiname", - "folderName": "Ordnername", - "fileUploadedSuccessfully": "Datei \"{{name}}\" erfolgreich hochgeladen", - "failedToUploadFile": "Fehler beim Hochladen der Datei", - "fileDownloadedSuccessfully": "Datei \"{{name}}\" erfolgreich heruntergeladen", - "failedToDownloadFile": "Fehler beim Herunterladen der Datei", - "fileCreatedSuccessfully": "Datei \"{{name}}\" erfolgreich erstellt", - "folderCreatedSuccessfully": "Ordner \"{{name}}\" erfolgreich erstellt", - "failedToCreateItem": "Element konnte nicht erstellt werden", - "operationFailed": "{{operation}} Vorgang fehlgeschlagen für {{name}}: {{error}}", - "failedToResolveSymlink": "Fehler beim Auflösen des Symlinks", - "itemsDeletedSuccessfully": "{{count}} Elemente erfolgreich gelöscht", - "failedToDeleteItems": "Löschen der Elemente fehlgeschlagen", - "sudoPasswordRequired": "Administratorpasswort erforderlich", - "enterSudoPassword": "Sudo-Passwort eingeben, um diesen Vorgang fortzuführen", - "sudoPassword": "Sudo Passwort", - "sudoOperationFailed": "Sudo-Operation fehlgeschlagen", - "sudoAuthFailed": "Sudo-Authentifizierung fehlgeschlagen", - "dragFilesToUpload": "Dateien zum Hochladen hier ablegen", - "emptyFolder": "Dieser Ordner ist leer", - "searchFiles": "Dateien suchen...", - "upload": "Hochladen", - "selectHostToStart": "Wähle einen Host um die Dateiverwaltung zu starten", - "sshRequiredForFileManager": "Der Dateimanager benötigt SSH. Für diesen Host ist SSH nicht aktiviert.", - "failedToConnect": "Verbindung zu SSH fehlgeschlagen", - "failedToLoadDirectory": "Verzeichnis konnte nicht geladen werden", - "noSSHConnection": "Keine SSH-Verbindung verfügbar", - "copy": "Kopieren", - "cut": "Schneide", - "paste": "Einfügen", - "copyPath": "Pfad kopieren", - "copyPaths": "Pfade kopieren", - "delete": "Löschen", - "properties": "Eigenschaften", - "refresh": "Aktualisieren", - "downloadFiles": "Download von {{count}} Dateien in den Browser", - "copyFiles": "Kopiere {{count}} Elemente", - "cutFiles": "{{count}} Elemente schneiden", - "deleteFiles": "{{count}} Elemente löschen", - "filesCopiedToClipboard": "{{count}} Elemente in die Zwischenablage kopiert", - "filesCutToClipboard": "{{count}} Elemente in die Zwischenablage geschnitten", - "pathCopiedToClipboard": "Pfad in Zwischenablage kopiert", - "pathsCopiedToClipboard": "{{count}} Pfade in die Zwischenablage kopiert", - "failedToCopyPath": "Fehler beim Kopieren des Pfades in die Zwischenablage", - "movedItems": "Verschobene {{count}} Elemente", - "failedToDeleteItem": "Element konnte nicht gelöscht werden", - "itemRenamedSuccessfully": "{{type}} erfolgreich umbenannt", - "failedToRenameItem": "Umbenennen fehlgeschlagen", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Kopie", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", "download": "Download", - "permissions": "Berechtigungen", - "size": "Größe", - "modified": "Geändert", - "path": "Pfad", - "confirmDelete": "Sind Sie sicher, dass Sie {{name}} löschen möchten?", - "permissionDenied": "Berechtigung verweigert", - "serverError": "Serverfehler", - "fileSavedSuccessfully": "Datei erfolgreich gespeichert", - "failedToSaveFile": "Fehler beim Speichern der Datei", - "confirmDeleteSingleItem": "Sind Sie sicher, dass Sie \"{{name}} \"dauerhaft löschen möchten?", - "confirmDeleteMultipleItems": "Sind Sie sicher, dass Sie {{count}} Elemente dauerhaft löschen möchten?", - "confirmDeleteMultipleItemsWithFolders": "Sind Sie sicher, dass Sie {{count}} Elemente dauerhaft löschen möchten? Dies schließt Ordner und deren Inhalt mit ein.", - "confirmDeleteFolder": "Sind Sie sicher, dass Sie den Ordner \"{{name}}\" und dessen Inhalt dauerhaft löschen möchten?", - "permanentDeleteWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Die Item(s) werden dauerhaft vom Server gelöscht.", - "recent": "Neueste", - "pinned": "Angeheftet", - "folderShortcuts": "Ordnerverknüpfungen", - "failedToReconnectSSH": "SSH-Sitzung konnte nicht wiederhergestellt werden", - "openTerminalHere": "Terminal hier öffnen", - "run": "Ausführen", - "openTerminalInFolder": "Terminal in diesem Ordner öffnen", - "openTerminalInFileLocation": "Öffne Terminal am Datei-Speicherort", - "runningFile": "Laufend - {{file}}", - "onlyRunExecutableFiles": "Kann nur ausführbare Dateien ausführen", - "directories": "Verzeichnisse", - "removedFromRecentFiles": "\"{{name}}\" aus den letzten Dateien entfernt", - "removeFailed": "Entfernen fehlgeschlagen", - "unpinnedSuccessfully": "\"{{name}}\" erfolgreich entfernt", - "unpinFailed": "Entfernen fehlgeschlagen", - "removedShortcut": "Verknüpfung \"{{name}} \" entfernt", - "removeShortcutFailed": "Entfernen der Verknüpfung fehlgeschlagen", - "clearedAllRecentFiles": "Alle letzten Dateien gelöscht", - "clearFailed": "Löschen fehlgeschlagen", - "removeFromRecentFiles": "Aus den letzten Dateien entfernen", - "clearAllRecentFiles": "Alle letzten Dateien löschen", - "unpinFile": "Datei lösen", - "removeShortcut": "Verknüpfung entfernen", - "pinFile": "Pin Datei", - "addToShortcuts": "Zu Verknüpfungen hinzufügen", - "pasteFailed": "Einfügen fehlgeschlagen", - "noUndoableActions": "Keine rückgängig machbaren Aktionen", - "undoCopySuccess": "Nicht kopierte Operation: Gelöschte {{count}} kopierte Dateien", - "undoCopyFailedDelete": "Rückgängig fehlgeschlagen: Konnte keine kopierten Dateien löschen", - "undoCopyFailedNoInfo": "Rückgängig fehlgeschlagen: Kopierte Dateiinformationen konnten nicht gefunden werden", - "undoMoveSuccess": "Vorgang nicht verschoben: Verschiebe {{count}} Dateien zurück zum ursprünglichen Speicherort", - "undoMoveFailedMove": "Rückgängig fehlgeschlagen: Konnte keine Dateien zurück verschieben", - "undoMoveFailedNoInfo": "Rückgängig fehlgeschlagen: Konnte die verschobene Dateiinformation nicht finden", - "undoDeleteNotSupported": "Löschvorgang kann nicht rückgängig gemacht werden: Dateien wurden dauerhaft vom Server gelöscht", - "undoTypeNotSupported": "Nicht unterstützter Undo-Operationstyp", - "undoOperationFailed": "Rückgängig fehlgeschlagen", - "unknownError": "Unbekannter Fehler", - "confirm": "Bestätigen", - "find": "Suchen...", - "replace": "Ersetzen", - "downloadInstead": "Stattdessen herunterladen", - "keyboardShortcuts": "Tastaturkürzel", - "searchAndReplace": "Suchen & Ersetzen", - "editing": "Bearbeiten", - "search": "Suchen", - "findNext": "Nächste suchen", - "findPrevious": "Vorheriges suchen", - "save": "Speichern", - "selectAll": "Alle auswählen", - "undo": "Rückgängig", - "redo": "Wiederholen", - "moveLineUp": "Linie nach oben", - "moveLineDown": "Linie runter bewegen", - "toggleComment": "Kommentar umschalten", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Angepinnt", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Laufen", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Fehler beim Laden des Bildes", - "startTyping": "Tippe ein...", - "unknownSize": "Unbekannte Größe", - "fileIsEmpty": "Datei ist leer", - "largeFileWarning": "Große Datei-Warnung", - "largeFileWarningDesc": "Diese Datei hat eine Größe von {{size}} , was Performance-Probleme verursachen kann, wenn sie als Text geöffnet wird.", - "fileNotFoundAndRemoved": "Datei \"{{name}}\" nicht gefunden und wurde aus den zuletzt angepinnten Dateien entfernt", - "failedToLoadFile": "Fehler beim Laden der Datei: {{error}}", - "serverErrorOccurred": "Serverfehler aufgetreten. Bitte versuchen Sie es später erneut.", - "autoSaveFailed": "Auto-Speichern fehlgeschlagen", - "fileAutoSaved": "Auto-Datei gespeichert", - "moveFileFailed": "Fehler beim Verschieben von {{name}}", - "moveOperationFailed": "Verschieben fehlgeschlagen", - "canOnlyCompareFiles": "Kann nur zwei Dateien vergleichen", - "comparingFiles": "Vergleiche Dateien: {{file1}} und {{file2}}", - "dragFailed": "Ziehvorgang fehlgeschlagen", - "filePinnedSuccessfully": "Datei \"{{name}}\" erfolgreich angepinnt", - "pinFileFailed": "Fehler beim Pin der Datei", - "fileUnpinnedSuccessfully": "Datei \"{{name}}\" erfolgreich entfernt", - "unpinFileFailed": "Fehler beim Entfernen der Datei", - "shortcutAddedSuccessfully": "Ordnerverknüpfung \"{{name}}\" erfolgreich hinzugefügt", - "addShortcutFailed": "Fehler beim Hinzufügen der Verknüpfung", - "operationCompletedSuccessfully": "{{operation}} {{count}} Elemente erfolgreich", - "operationCompleted": "{{operation}} {{count}} Elemente", - "downloadFileSuccess": "Datei {{name}} erfolgreich heruntergeladen", - "downloadFileFailed": "Download fehlgeschlagen", - "moveTo": "Zu {{name}} verschieben", - "diffCompareWith": "Diff vergleichen mit {{name}}", - "dragOutsideToDownload": "Zum Herunterladen nach außen ziehen ({{count}} Dateien)", - "newFolderDefault": "Neuer Ordner", - "newFileDefault": "Neue Datei.txt", - "successfullyMovedItems": "{{count}} Elemente erfolgreich nach {{target}} verschoben", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", "move": "Bewegen", - "searchInFile": "Suche in Datei (Strg+F)", - "showKeyboardShortcuts": "Tastaturkürzel anzeigen", - "startWritingMarkdown": "Schreiben Sie Ihren Markdown-Inhalt...", - "loadingFileComparison": "Lade Dateivergleich...", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Vergleichen", - "sideBySide": "Seite für Seite", + "compare": "Compare", + "sideBySide": "Side by Side", "inline": "Inline", - "fileComparison": "Dateivergleich: {{file1}} vs {{file2}}", - "fileTooLarge": "Datei zu groß: {{error}}", - "sshConnectionFailed": "SSH-Verbindung fehlgeschlagen. Bitte überprüfe deine Verbindung zu {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Fehler beim Laden der Datei: {{error}}", - "connecting": "Verbinden...", - "connectedSuccessfully": "Verbunden erfolgreich", - "totpVerificationFailed": "TOTP-Verifizierung fehlgeschlagen", - "warpgateVerificationFailed": "Warpgate-Authentifizierung fehlgeschlagen", - "authenticationFailed": "Authentifizierung fehlgeschlagen", - "verificationCodePrompt": "Bestätigungscode:", - "changePermissions": "Berechtigungen ändern", - "currentPermissions": "Aktuelle Berechtigungen", - "owner": "Besitzer", - "group": "Gruppe", - "others": "Andere", - "read": "Lesen", - "write": "Schreiben", - "execute": "Ausführen", - "permissionsChangedSuccessfully": "Berechtigungen erfolgreich geändert", - "failedToChangePermissions": "Fehler beim Ändern der Berechtigungen", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", "name": "Name", "sortByName": "Name", - "sortByDate": "Änderungsdatum", - "sortBySize": "Größe", - "ascending": "Aufsteigend", - "descending": "Absteigend", - "root": "Wurzel", - "new": "Neu", - "sortBy": "Sortieren nach", - "items": "Artikel", - "selected": "Ausgewählt", - "editor": "Redakteur", - "octal": "Oktalität", - "storage": "Speicher", - "disk": "Platte", - "used": "Verwendet", - "of": "von", - "toggleSidebar": "Seitenleiste umschalten", - "cannotLoadPdf": "Kann PDF nicht laden", - "pdfLoadError": "Beim Laden dieser PDF-Datei ist ein Fehler aufgetreten.", - "loadingPdf": "Lade PDF...", - "loadingPage": "Seite wird geladen..." + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Zum Host kopieren…", - "moveToHost": "Zum Host wechseln…", - "copyItemsToHost": "Kopiere {{count}} Elemente in den Host…", - "moveItemsToHost": "Verschiebe {{count}} Elemente in den Host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Es sind keine anderen Dateimanager-Hosts verfügbar.", "noHostsConnectedHint": "Fügen Sie im Host-Manager einen weiteren SSH-Host mit aktiviertem Dateimanager hinzu.", "selectDestinationHost": "Zielhost auswählen", @@ -1164,48 +1360,48 @@ "browseDestination": "Pfad durchsuchen oder eingeben", "confirmCopy": "Kopie", "confirmMove": "Bewegen", - "transferring": "Übertragen…", - "compressing": "Komprimierung…", - "extracting": "Extrahiere…", - "transferringItems": "Übertrage {{current}} von {{total}} Elementen…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Übertragung abgeschlossen", "transferError": "Übertragung fehlgeschlagen", - "transferPartial": "Übertragung mit {{count}} Fehlern abgeschlossen", - "transferPartialHint": "Übertragung fehlgeschlagen: {{paths}}", - "itemsSummary": "{{count}} Artikel", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Das Ziel muss ein Verzeichnis für die Übertragung mehrerer Elemente sein.", "selectThisFolder": "Wählen Sie diesen Ordner aus", "browsePathWillBeCreated": "Dieser Ordner existiert noch nicht. Er wird erstellt, sobald die Übertragung beginnt.", "browsePathError": "Dieser Pfad konnte auf dem Zielhost nicht geöffnet werden.", "goUp": "Steigen", - "copyFolderToHost": "Ordner auf Host kopieren…", - "moveFolderToHost": "Ordner zum Host verschieben…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Bereit", - "hostConnecting": "Verbindet…", + "hostConnecting": "Connecting…", "hostDisconnected": "Nicht verbunden", "hostAuthRequired": "Authentifizierung erforderlich – öffnen Sie zuerst den Dateimanager auf diesem Host.", "hostConnectionFailed": "Verbindung fehlgeschlagen", "metricsTitle": "Übertragungszeiten", - "metricsPrepare": "Ziel vorbereiten: {{duration}}", - "metricsCompress": "Komprimierung auf der Quelle: {{duration}}", - "metricsHopSourceRead": "Quelle → Server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → Ziel (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → Ziel (lokal): {{throughput}}", - "metricsTransfer": "End-to-End: {{throughput}} ({{duration}})", - "metricsExtract": "Auszug am Zielort: {{duration}}", - "metricsSourceDelete": "Aus der Quelle entfernen: {{duration}}", - "metricsTotal": "Gesamt: {{duration}}", - "progressCompressing": "Komprimierung auf dem Quellhost…", - "progressExtracting": "Extraktion am Ziel…", - "progressTransferring": "Datenübertragung…", - "progressReconnecting": "Verbindung wird wiederhergestellt…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Parallele Übergabespuren", - "parallelSegmentsOption": "{{count}} Spuren", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Große Dateien werden in 256 MB große Teile aufgeteilt. Mehrere Übertragungswege nutzen separate Verbindungen (ähnlich wie beim Starten mehrerer Übertragungen), um einen höheren Gesamtdurchsatz zu erzielen.", - "progressTotalSpeed": "{{speed}} Gesamt ({{lanes}} Spuren)", - "progressTransferringItems": "Übertrage Dateien ({{current}} von {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} Dateien", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Quelldateien beibehalten (teilweise Übertragung)", "jumpHostLimitation": "Beide Hosts müssen vom Termix-Server aus erreichbar sein. Direktes Host-zu-Host-Routing wird nicht unterstützt.", "cancel": "Stornieren", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Wählt je nach Dateianzahl, -größe und Komprimierbarkeit entweder tar-Archive oder dateibasierte SFTP-Dateien aus. Einzelne Dateien werden immer per Streaming-SFTP übertragen.", "methodTarHint": "Komprimieren auf dem Quellsystem, ein Archiv übertragen, auf dem Zielsystem extrahieren. Erfordert tar auf beiden Unix-Hosts.", "methodItemSftpHint": "Übertragen Sie jede Datei einzeln per SFTP. Funktioniert auf allen Hosts, einschließlich Windows.", - "methodPreviewLoading": "Berechnung der Transfermethode…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Die Übertragungsmethode konnte nicht in der Vorschau angezeigt werden. Der Server wählt beim Start eine Methode aus.", "methodPreviewWillUseTar": "Verwendet wird: Tar-Archiv", "methodPreviewWillUseItemSftp": "Wird verwendet: SFTP pro Datei", - "methodPreviewScanSummary": "{{fileCount}} Dateien, {{totalSize}} insgesamt (auf dem Quellhost gescannt).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Jede Datei nutzt denselben SFTP-Stream als Einzeldateikopie, die nacheinander erstellt werden. Der Fortschritt wird über alle Dateien hinweg kombiniert, daher bewegt sich der Balken bei großen Dateien nur langsam.", "methodReason": { "user_item_sftp": "Sie haben SFTP pro Datei ausgewählt.", "user_tar": "Sie haben das Tar-Archiv ausgewählt.", "tar_unavailable": "Tar ist auf einem oder beiden Hosts nicht verfügbar – stattdessen wird SFTP pro Datei verwendet.", "windows_host": "Es handelt sich um einen Windows-Host – tar wird nicht verwendet.", - "auto_multi_large": "Auto: Mehrere Dateien, einschließlich einer großen Datei ({{largestSize}}) mit komprimierbaren Daten - tar-Bundles in einer Übertragung.", - "auto_single_large_in_archive": "Auto: eine große Datei ({{largestSize}}) in diesem Satz — dateibasiertes SFTP.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto: größtenteils nicht komprimierbare Daten — dateibasiertes SFTP.", - "auto_many_files": "Auto: viele Dateien ({{fileCount}}) — tar reduziert den Overhead pro Datei.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Auto: SFTP pro Datei für diesen Satz." }, "progressCancel": "Stornieren", - "progressCancelling": "Abbrechen…", + "progressCancelling": "Cancelling…", "progressStalled": "Stillgelegt", "resumedHint": "Die Verbindung zu einer in einem anderen Fenster gestarteten aktiven Übertragung wurde wiederhergestellt.", "transferCancelled": "Transfer storniert", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Auf dem Zielserver wurden nur Teildaten gespeichert. Der Verbindungsversuch wird fortgesetzt, sobald die Verbindung wiederhergestellt ist." }, "tunnels": { - "noSshTunnels": "Keine SSH-Tunnel", - "createFirstTunnelMessage": "Sie haben noch keine SSH-Tunnel erstellt. Konfigurieren Sie Tunnelverbindungen im Host Manager, um loszulegen.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Verbunden", - "disconnected": "Verbindung getrennt", - "connecting": "Verbinden...", - "error": "Fehler", - "canceling": "Abbrechen...", - "connect": "Verbinden", - "disconnect": "Verbindung trennen", - "cancel": "Abbrechen", + "disconnected": "Getrennt", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Stornieren", "port": "Port", - "localPort": "Lokaler Port", - "remotePort": "Entfernter Port", - "currentHostPort": "Aktueller Host-Port", - "endpointPort": "Endpunkt-Port", - "bindIp": "Lokale IP", - "endpointSshConfig": "Endpunkt SSH Konfiguration", - "endpointSshHost": "Endpunkt SSH-Host", - "endpointSshHostPlaceholder": "Wähle einen konfigurierten Host", - "endpointSshHostRequired": "Wählen Sie einen Endpunkt-SSH-Host für jeden Client-Tunnel.", - "attempt": "{{current}} von {{max}} versuchen", - "nextRetryIn": "Nächste Wiederholung in {{seconds}} Sekunden", - "clientTunnels": "Kliententunnel", - "clientTunnel": "Kliententunnel", - "addClientTunnel": "Kliententunnel hinzufügen", - "noClientTunnels": "Keine Client-Tunnel auf diesem Desktop konfiguriert.", - "tunnelName": "Tunnelname", - "remoteHost": "Entfernter Host", - "autoStart": "Autostart", - "clientAutoStartDesc": "Startet, wenn sich dieser Desktop-Client öffnet und verbunden bleibt.", - "clientManualStartDesc": "Verwenden Sie Start und Stop aus dieser Zeile. Termix öffnet sie nicht automatisch.", - "clientRemoteServerNote": "Remote-Weiterleitung kann AllowTcpForwarding und GatewayPorts auf dem SSH-Server erfordern. Der entfernte Port wird geschlossen, wenn dieser Desktop sich trennt.", - "clientTunnelStarted": "Kliententunnel gestartet", - "clientTunnelStopped": "Kliententunnel gestoppt", - "tunnelTestSucceeded": "Tunneltest erfolgreich", - "tunnelTestFailed": "Tunneltest fehlgeschlagen", - "localSaved": "Kliententunnel gespeichert", - "localSaveError": "Fehler beim Speichern lokaler Client-Tunnel", - "invalidBindIp": "Lokale IP muss eine gültige IPv4-Adresse sein.", - "invalidLocalTargetIp": "Lokale Ziel-IP muss eine gültige IPv4-Adresse sein.", - "invalidLocalPort": "Der lokale Port muss zwischen 1 und 65535 liegen.", - "invalidRemotePort": "Der Remote Port muss zwischen 1 und 65535 liegen.", - "invalidLocalTargetPort": "Lokaler Port muss zwischen 1 und 65535 liegen.", - "invalidEndpointPort": "Endpunkt-Port muss zwischen 1 und 65535 liegen.", - "duplicateAutoStartBind": "Nur ein Kliententunnel kann {{bind}} verwenden.", - "manualControlError": "Tunnel Status konnte nicht aktualisiert werden.", - "active": "Aktiv", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", "start": "Start", - "stop": "Stoppen", - "test": "Testen", - "type": "Tunneltyp", - "typeLocal": "Lokal (-L)", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", "typeRemote": "Remote (-R)", - "typeDynamic": "Dynamisch (-D)", - "typeServerLocalDesc": "Aktueller Host bis Endpunkt.", - "typeServerRemoteDesc": "Endpunkt zurück zum aktuellen Host.", - "typeClientLocalDesc": "Lokaler Computer bis Endpunkt.", - "typeClientRemoteDesc": "Endpunkt zurück zum lokalen Computer.", - "typeClientDynamicDesc": "SOCKS auf lokalem Computer.", - "typeDynamicDesc": "SOCKS5 CONNECT Verkehr durch SSH weiterleiten", - "forwardDescriptionServerLocal": "Aktueller Host {{sourcePort}} → Endpunkt {{endpointPort}}.", - "forwardDescriptionServerRemote": "Endpunkt {{endpointPort}} → aktueller Host {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS auf dem aktuellen Host {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokale {{sourcePort}} → Remote- {{endpointPort}}.", - "forwardDescriptionClientRemote": "Entfernte {{sourcePort}} → Lokale {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS auf lokalen Port {{sourcePort}}.", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "Lokale {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokale {{localPort}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Route:", - "lastStarted": "Zuletzt gestartet", - "lastTested": "Zuletzt geprüft", - "lastError": "Letzter Fehler", - "maxRetries": "Max. Wiederholungen", - "maxRetriesDescription": "Maximale Anzahl an Wiederholungsversuchen.", - "retryInterval": "Wiederholungsintervall (Sekunden)", - "retryIntervalDescription": "Wartezeit zwischen wiederholten Versuchen.", - "local": "Lokal", - "remote": "Entfernt", - "destination": "Ziel", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", "host": "Host", - "mode": "Modus", - "noHostSelected": "Kein Host ausgewählt", - "working": "Arbeiten..." + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Speicher", - "disk": "Platte", - "network": "Netzwerk", - "uptime": "Laufzeit", - "processes": "Prozesse", - "available": "Verfügbar", - "free": "Kostenlos", - "connecting": "Verbinden...", - "connectionFailed": "Verbindung zum Server fehlgeschlagen", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "{{count}} Kern", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU Auslastung", - "memoryUsage": "Speichernutzung", - "diskUsage": "Plattennutzung", - "failedToFetchHostConfig": "Fehler beim Abrufen der Host-Konfiguration", - "serverOffline": "Server offline", - "cannotFetchMetrics": "Metriken können nicht vom Offline-Server abgerufen werden", - "totpFailed": "TOTP-Verifizierung fehlgeschlagen", - "noneAuthNotSupported": "Serverstatistik unterstützt keine 'keine' Authentifizierungstyp.", - "load": "Laden", - "systemInfo": "Systeminformationen", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Betriebssystem", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "Sekunden", - "networkInterfaces": "Netzwerkschnittstellen", - "noInterfacesFound": "Keine Netzwerkschnittstellen gefunden", - "noProcessesFound": "Keine Prozesse gefunden", - "loginStats": "SSH-Login-Statistiken", - "noRecentLoginData": "Keine letzten Login-Daten", - "executingQuickAction": "Ausführe {{name}}...", - "quickActionSuccess": "{{name}} erfolgreich abgeschlossen", - "quickActionFailed": "{{name}} fehlgeschlagen", - "quickActionError": "Fehler beim Ausführen von {{name}}", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Höre Ports", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protokoll", "port": "Port", - "address": "Adresse", - "process": "Verarbeiten", - "noData": "Keine Daten zum Abhören" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inaktiv", - "policy": "Richtlinien", - "rules": "regeln", - "noData": "Keine Firewall-Daten verfügbar", - "action": "Aktion", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Quelle", - "anywhere": "Überall" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Ladeformat", - "swap": "Tausch", - "architecture": "Architektur", - "refresh": "Aktualisieren", - "retry": "Wiederholen" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Wiederholen", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Laufen", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Selbstgehostete SSH- und Remote-Desktop-Verwaltung", - "loginTitle": "Bei Termix anmelden", - "registerTitle": "Konto erstellen", - "forgotPassword": "Passwort vergessen?", - "rememberMe": "Gerät für 30 Tage merken (inklusive TOTP)", - "noAccount": "Sie haben noch kein Konto?", - "hasAccount": "Haben Sie bereits ein Konto?", - "twoFactorAuth": "Zwei-Faktor-Authentifizierung", - "enterCode": "Bestätigungscode eingeben", - "backupCode": "Oder Backup-Code verwenden", - "verifyCode": "Code überprüfen", - "redirectingToApp": "Weiterleitung zu App...", - "sshAuthenticationRequired": "SSH-Authentifizierung erforderlich", - "sshNoKeyboardInteractive": "Tastatur-Interaktive Authentifizierung nicht verfügbar", - "sshAuthenticationFailed": "Authentifizierung fehlgeschlagen", - "sshAuthenticationTimeout": "Authentifizierungs-Timeout", - "sshNoKeyboardInteractiveDescription": "Der Server unterstützt keine interaktive Keyboard-Authentifizierung. Bitte geben Sie Ihr Passwort oder SSH-Schlüssel ein.", - "sshAuthFailedDescription": "Die angegebenen Zugangsdaten waren falsch. Bitte versuchen Sie es mit gültigen Zugangsdaten erneut.", - "sshTimeoutDescription": "Timeout für den Authentifizierungsversuch. Bitte versuchen Sie es erneut.", - "sshProvideCredentialsDescription": "Bitte geben Sie Ihre SSH-Zugangsdaten an, um sich mit diesem Server zu verbinden.", - "sshPasswordDescription": "Geben Sie das Passwort für diese SSH-Verbindung ein.", - "sshKeyPasswordDescription": "Wenn Ihr SSH-Schlüssel verschlüsselt ist, geben Sie hier die Passphrase ein.", - "passphraseRequired": "Passphrase erforderlich", - "passphraseRequiredDescription": "Der SSH-Schlüssel ist verschlüsselt. Bitte geben Sie die Passphrase ein, um ihn zu entsperren.", - "back": "Zurück", - "firstUser": "Erster Benutzer", - "firstUserMessage": "Sie sind der erste Benutzer und werden zu einem Admin gemacht. Sie können die Admin-Einstellungen in der Seitenleiste anzeigen. Wenn du denkst, dass dies ein Fehler ist, überprüfe die Docker Protokolle oder erstelle ein GitHub Problem.", - "external": "Externe", - "loginWithExternal": "Mit externem Anbieter anmelden", - "loginWithExternalDesc": "Melden Sie sich mit Ihrem konfigurierten externen Identity Provider an", - "externalNotSupportedInElectron": "Externe Authentifizierung wird in der Electron-App noch nicht unterstützt. Bitte verwenden Sie die Web-Version für OIDC-Login.", - "resetPasswordButton": "Passwort zurücksetzen", - "sendResetCode": "Sende Reset-Code", - "resetCodeDesc": "Geben Sie Ihren Benutzernamen ein, um einen Code zum Zurücksetzen des Passworts zu erhalten. Der Code wird in die Docker Containerprotokolle eingeloggt.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Code überprüfen", - "enterResetCode": "Geben Sie den 6-stelligen Code aus dem Docker Containerprotokoll für Benutzer ein:", - "newPassword": "Neues Passwort", - "confirmNewPassword": "Passwort bestätigen", - "enterNewPassword": "Geben Sie Ihr neues Passwort für den Benutzer ein:", - "signUp": "Registrieren", - "desktopApp": "Desktop-App", - "loggingInToDesktopApp": "Anmelden in der Desktop-App", - "loadingServer": "Lade Server...", - "dataLossWarning": "Wenn Sie Ihr Passwort auf diese Weise zurücksetzen, werden alle Ihre gespeicherten SSH-Hosts, Anmeldedaten und andere verschlüsselte Daten gelöscht. Diese Aktion kann nicht rückgängig gemacht werden. Verwenden Sie dies nur, wenn Sie Ihr Passwort vergessen haben und nicht angemeldet sind.", - "authenticationDisabled": "Authentifizierung deaktiviert", - "authenticationDisabledDesc": "Alle Authentifizierungsmethoden sind derzeit deaktiviert. Bitte kontaktieren Sie Ihren Administrator.", - "attemptsRemaining": "{{count}} verbleibende Versuche" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSH-Hostschlüssel überprüfen", - "keyChangedWarning": "SSH-Hostschlüssel geändert", - "firstConnectionTitle": "Verbindung zu diesem Host zum ersten Mal", - "firstConnectionDescription": "Die Authentizität dieses Hosts kann nicht festgestellt werden. Überprüfen Sie den Fingerabdruck mit dem, was Sie erwarten.", - "keyChangedDescription": "Der Host-Schlüssel für diesen Server hat sich seit Ihrer letzten Verbindung geändert. Dies könnte auf ein Sicherheitsproblem hinweisen.", - "previousKey": "Vorheriger Schlüssel", - "newFingerprint": "Neuer Fingerabdruck", - "fingerprint": "Fingerabdruck", - "verifyInstructions": "Wenn Sie diesem Host vertrauen, klicken Sie auf Akzeptieren, um fortzufahren und den Fingerabdruck für zukünftige Verbindungen zu speichern.", - "securityWarning": "Sicherheitswarnung", - "acceptAndContinue": "Akzeptieren & fortfahren", - "acceptNewKey": "Neuen Schlüssel akzeptieren & fortfahren" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Keine Verbindung zur Datenbank möglich", - "unknownError": "Unbekannter Fehler", - "loginFailed": "Login fehlgeschlagen", - "failedPasswordReset": "Fehler beim Initiieren des Passwort-Resets", - "failedVerifyCode": "Fehler beim Überprüfen des Reset-Codes", - "failedCompleteReset": "Fehler beim Zurücksetzen des Passworts", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Fehler beim Starten des OIDC-Logins", - "silentSigninOidcUnavailable": "Stumme Anmeldung wurde angefordert, aber OIDC Login ist nicht verfügbar.", - "failedUserInfo": "Fehler beim Abrufen der Benutzerinformationen nach dem Login", - "oidcAuthFailed": "OIDC Authentifizierung fehlgeschlagen", - "invalidAuthUrl": "Ungültige Autorisierungs-URL vom Backend erhalten", - "requiredField": "Dieses Feld ist erforderlich", - "minLength": "Mindestlänge ist {{min}}", - "passwordMismatch": "Passwörter stimmen nicht überein", - "passwordLoginDisabled": "Benutzername/Passwort Login ist derzeit deaktiviert", - "sessionExpired": "Sitzung abgelaufen - Bitte melden Sie sich erneut an", - "totpRateLimited": "Rate begrenzt: Zu viele TOTP-Verifizierungsversuche. Bitte versuchen Sie es später erneut.", - "totpRateLimitedWithTime": "Rate begrenzt: Zu viele TOTP-Verifizierungsversuche. Bitte warten Sie {{time}} Sekunden, bevor Sie es erneut versuchen.", - "resetCodeRateLimited": "Rate begrenzt: Zu viele Verifizierungsversuche. Bitte versuchen Sie es später erneut.", - "resetCodeRateLimitedWithTime": "Rate begrenzt: Zu viele Verifizierungsversuche. Bitte warten Sie {{time}} Sekunden, bevor Sie es erneut versuchen.", - "authTokenSaveFailed": "Authentifizierungstoken konnte nicht gespeichert werden", - "failedToLoadServer": "Fehler beim Laden des Servers" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Die Registrierung eines neuen Kontos ist derzeit von einem Administrator deaktiviert. Bitte melden Sie sich an oder kontaktieren Sie einen Administrator.", - "userNotAllowed": "Ihr Konto ist nicht berechtigt, sich zu registrieren. Bitte kontaktieren Sie einen Administrator.", - "databaseConnectionFailed": "Verbindung zum Datenbankserver fehlgeschlagen", - "resetCodeSent": "Code zurücksetzen gesendet an Docker Logs", - "codeVerified": "Code erfolgreich verifiziert", - "passwordResetSuccess": "Passwort erfolgreich zurückgesetzt", - "loginSuccess": "Anmeldung erfolgreich", - "registrationSuccess": "Registrierung erfolgreich" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Lokale Desktop-Tunnel, die auf konfigurierte SSH-Hosts abzielen.", - "c2sTunnelPresets": "Client-Tunnel Voreinstellungen", - "c2sTunnelPresetsDesc": "Speichere die lokale Tunnelliste dieses Desktop-Clients als benannte Server-Voreinstellung oder lade eine Voreinstellung zurück in diesen Client.", - "c2sTunnelPresetsUnavailable": "Voreinstellungen für den Client Tunnel sind nur im Desktop-Client verfügbar.", - "c2sPresetName": "Preset-Name", - "c2sPresetNamePlaceholder": "Name des Presets", - "c2sPresetToLoad": "Voreinstellung zum Laden", - "c2sNoPresetSelected": "Keine Vorlage ausgewählt", - "c2sNoPresets": "Keine Voreinstellungen gespeichert", - "c2sLoadPreset": "Laden", - "c2sCurrentLocalConfig": "{{count}} lokale Clienttunnel(s) auf dieser Arbeitsfläche konfiguriert.", - "c2sPresetSyncNote": "Voreinstellung sind explizite Schnappschüsse; das Laden eines Gerätes ersetzt die lokale Liste des Client-Tunnels.", - "c2sPresetSaved": "Voreinstellung für Kliententunnel gespeichert", - "c2sPresetLoaded": "Voreinstellung für Client-Tunnel lokal geladen", - "c2sPresetRenamed": "Voreinstellung für Kliententunnel umbenannt", - "c2sPresetDeleted": "Voreinstellung für Kliententunnel gelöscht", - "c2sPresetLoadError": "Fehler beim Laden der Client-Tunnel Voreinstellungen" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Sprache", - "keyPassword": "keypasswort", - "pastePrivateKey": "Fügen Sie Ihren privaten Schlüssel hier ein...", - "localListenerHost": "127.0.0.1 (lokal lauschen)", - "localTargetHost": "127.0.0.1 (Ziel auf diesem Computer)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Geben Sie Ihr Passwort ein", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { "title": "Dashboard", - "loading": "Dashboard wird geladen...", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Unterstützung", + "support": "Support", "discord": "Discord", - "serverOverview": "Serverübersicht", + "docs": "Docs", + "serverOverview": "Server Overview", "version": "Version", - "upToDate": "Aktuell", - "updateAvailable": "Update verfügbar", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Laufzeit", - "database": "Datenbank", - "healthy": "Gesund", - "error": "Fehler", - "totalHosts": "Hosts gesamt", - "totalTunnels": "Gesamte Tunnel", - "totalCredentials": "Gesamte Zugangsdaten", - "recentActivity": "Letzte Aktivität", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Letzte Aktivität wird geladen...", - "noRecentActivity": "Keine aktuellen Aktivitäten", - "quickActions": "Schnelle Aktionen", - "addHost": "Host hinzufügen", - "addCredential": "Zugangsdaten hinzufügen", - "adminSettings": "Admin-Einstellungen", - "userProfile": "Benutzerprofil", - "serverStats": "Serverstatistik", - "loadingServerStats": "Serverstatistiken werden geladen...", - "noServerData": "Keine Serverdaten verfügbar", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Dashboard anpassen", - "dashboardSettings": "Dashboard-Einstellungen", - "enableDisableCards": "Karten aktivieren/deaktivieren", - "resetLayout": "Auf Standard zurücksetzen", - "serverOverviewCard": "Serverübersicht", - "recentActivityCard": "Letzte Aktivität", - "networkGraphCard": "Netzwerkgrafik", - "networkGraph": "Netzwerkgrafik", - "quickActionsCard": "Schnelle Aktionen", - "serverStatsCard": "Serverstatistik", - "panelMain": "Haupt", - "panelSide": "Seite", - "justNow": "gerade jetzt" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABLE", - "hostsOnline": "Hosts online", - "activeTunnels": "Aktive Tunnel", - "registerNewServer": "Neuen Server registrieren", - "storeSshKeysOrPasswords": "SSH-Schlüssel oder Passwörter speichern", - "manageUsersAndRoles": "Benutzer und Rollen verwalten", - "manageYourAccount": "Verwalten Sie Ihr Konto", - "hostStatus": "Host-Status", - "noHostsConfigured": "Keine Hosts konfiguriert", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Hinzufügen:", - "commandPalette": "Kommandopalette", - "done": "Fertig", - "editModeInstructions": "Ziehen Sie Karten um neu zu sortieren · Ziehen Sie den Spaltentrenner, um Spalten zu vergrößern · Ziehen Sie die untere Kante einer Karte um die Größe der Karte zu ändern · Papierkorb zum Entfernen", - "empty": "Leer", - "clear": "Leeren" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopie", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Host hinzufügen", - "addGroup": "Neue Gruppe", - "addLink": "Link hinzufügen", - "zoomIn": "Vergrößern", - "zoomOut": "Verkleinern", - "resetView": "Ansicht zurücksetzen", - "selectHost": "Host auswählen", - "chooseHost": "Wähle einen Host...", - "parentGroup": "Elterngruppe", - "noGroup": "Keine Gruppe", - "groupName": "Gruppenname", - "color": "Farbe", - "source": "Quelle", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "In Gruppe verschieben", - "selectGroup": "Gruppe auswählen...", - "addConnection": "Verbindung hinzufügen", - "hostDetails": "Host-Details", - "removeFromGroup": "Aus Gruppe entfernen", - "addHostHere": "Host hier hinzufügen", - "editGroup": "Gruppe bearbeiten", - "delete": "Löschen", - "add": "Neu", - "create": "Anlegen", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", "move": "Bewegen", - "connect": "Verbinden", - "createGroup": "Gruppe erstellen", - "selectSourcePlaceholder": "Quelle auswählen...", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Ungültige Datei", - "hostAlreadyExists": "Host ist bereits in der Topologie", - "connectionExists": "Verbindung existiert bereits", - "unknown": "Unbekannt", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", "name": "Name", "ip": "IP", "status": "Status", - "failedToAddNode": "Knoten konnte nicht hinzugefügt werden", - "sourceDifferentFromTarget": "Quelle und Ziel müssen unterschiedlich sein", - "exportJSON": "JSON exportieren", - "importJSON": "JSON importieren", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Datei-Manager", + "fileManager": "Dateimanager", "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Serverstatistik", - "noNodes": "Noch keine Knoten" + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker ist für diesen Host nicht aktiviert", - "validating": "Docker wird überprüft...", - "connecting": "Verbinden...", - "error": "Fehler", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Verbindung zum Docker fehlgeschlagen", - "containerStarted": "Container {{name}} gestartet", - "failedToStartContainer": "Fehler beim Starten des Containers {{name}}", - "containerStopped": "Container {{name}} gestoppt", - "failedToStopContainer": "Fehler beim Beenden des Containers {{name}}", - "containerRestarted": "Container {{name}} neu gestartet", - "failedToRestartContainer": "Fehler beim Neustart des Containers {{name}}", - "containerPaused": "Container {{name}} pausiert", - "containerUnpaused": "Container {{name}} nicht pausiert", - "failedToTogglePauseContainer": "Fehler beim Umschalten der Pause für Container {{name}}", - "containerRemoved": "Container {{name}} entfernt", - "failedToRemoveContainer": "Fehler beim Entfernen des Containers {{name}}", - "image": "Bild", - "ports": "Häfen", - "noPorts": "Keine Ports", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", "start": "Start", - "confirmRemoveContainer": "Sind Sie sicher, dass Sie den Container '{{name}}' entfernen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", - "runningContainerWarning": "Warnung: Dieser Container wird gerade ausgeführt. Das Entfernen wird den Container zuerst stoppen.", - "loadingContainers": "Container werden geladen...", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker Manager", - "autoRefresh": "Auto-Aktualisierung", - "timestamps": "Zeitstempel", - "lines": "Linien", - "filterLogs": "Protokolle filtern...", - "refresh": "Aktualisieren", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", "download": "Download", - "clear": "Leeren", - "logsDownloaded": "Logs erfolgreich heruntergeladen", - "last50": "Letzten 50", - "last100": "Letzten 100", - "last500": "Letzten 500", - "last1000": "Letzten 1000", - "allLogs": "Alle Logs", - "noLogsMatching": "Keine Logs passend zu \"{{query}}\"", - "noLogsAvailable": "Keine Logs verfügbar", - "noContainersFound": "Keine Container gefunden", - "noContainersFoundHint": "Keine Docker-Container auf diesem Host verfügbar", - "searchPlaceholder": "Container suchen...", - "allStatuses": "Alle Status", - "stateRunning": "Laufend", - "statePaused": "Pausiert", - "stateExited": "Beendet", - "stateRestarting": "Neustart", - "noContainersMatchFilters": "Keine Container entsprechen Ihren Filtern", - "noContainersMatchFiltersHint": "Versuchen Sie, Ihre Such- oder Filterkriterien anzupassen", - "failedToFetchStats": "Fehler beim Abrufen der Containerstatistik", - "containerNotRunning": "Container läuft nicht", - "startContainerToViewStats": "Container starten, um Statistiken anzuzeigen", - "loadingStats": "Lade Statistik...", - "errorLoadingStats": "Fehler beim Laden der Statistiken", - "noStatsAvailable": "Keine Statistiken verfügbar", - "cpuUsage": "CPU Auslastung", - "current": "Aktuell", - "memoryUsage": "Speichernutzung", - "networkIo": "Netzwerk-I/O", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Ausgang", - "blockIo": "I/O blockieren", - "read": "Lesen", - "write": "Schreiben", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "Container-Informationen", + "containerInformation": "Container Information", "name": "Name", "id": "ID", - "state": "Bundesland", - "containerMustBeRunning": "Container muss ausgeführt werden, um auf die Konsole zuzugreifen", - "verificationCodePrompt": "Bestätigungscode eingeben", - "totpVerificationFailed": "TOTP-Verifizierung fehlgeschlagen. Bitte versuchen Sie es erneut.", - "warpgateVerificationFailed": "Warpgate-Authentifizierung fehlgeschlagen. Bitte versuchen Sie es erneut.", - "connectedTo": "Mit {{containerName}} verbunden", - "disconnected": "Verbindung getrennt", - "consoleError": "Konsolenfehler", - "errorMessage": "Fehler: {{message}}", - "failedToConnect": "Verbindung zum Container fehlgeschlagen", - "console": "Konsole", - "selectShell": "Shell auswählen", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Getrennt", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", - "sh": "l", - "ash": "Asche", - "connect": "Verbinden", - "disconnect": "Verbindung trennen", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Nicht verbunden", - "clickToConnect": "Klicken Sie auf Verbinden, um eine Shell-Sitzung zu starten", - "connectingTo": "Verbinde mit {{containerName}}...", - "containerNotFound": "Container nicht gefunden", - "backToList": "Zurück zur Liste", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", "logs": "Logs", - "stats": "Statistik", - "consoleTab": "Konsole", - "startContainerToAccess": "Container starten, um auf die Konsole zuzugreifen" + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Allgemein", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Benutzer", - "sectionSessions": "Sitzungen", - "sectionRoles": "Rollen", - "sectionDatabase": "Datenbank", - "sectionApiKeys": "API-Schlüssel", - "allowRegistration": "Benutzerregistrierung erlauben", - "allowRegistrationDesc": "Neue Benutzer selbst registrieren lassen", - "allowPasswordLogin": "Passwort-Login erlauben", - "allowPasswordLoginDesc": "Benutzername/Passwort Login", - "oidcAutoProvision": "OIDC Auto-Bereitstellung", - "oidcAutoProvisionDesc": "Konten für OIDC-Benutzer automatisch erstellen, auch wenn die Registrierung deaktiviert ist", - "allowPasswordReset": "Passwort zurücksetzen erlauben", - "allowPasswordResetDesc": "Code über Docker Logs zurücksetzen", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Filter löschen", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Session Timeout", - "hours": "std", - "sessionTimeoutRange": "Min. 1 Stunde · Max. 720h", - "monitoringDefaults": "Standard überwachen", - "statusCheck": "Statusprüfung", - "metrics": "Metriken", - "sec": "s", - "logLevel": "Log-Level", - "enableGuacamole": "Guacamole aktivieren", - "enableGuacamoleDesc": "RDP/VNC Remote Desktop", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "OpenID Connect für SSO konfigurieren. Felder mit * sind Pflichtfelder.", - "oidcClientId": "Kunden-ID", - "oidcClientSecret": "Kundengeheimnis", - "oidcAuthUrl": "Autorisierungs-URL", - "oidcIssuerUrl": "Ausgabe-URL", - "oidcTokenUrl": "Token-URL", - "oidcUserIdentifier": "Benutzerbezeichner Pfad", - "oidcDisplayName": "Namenspfad anzeigen", - "oidcScopes": "Bereiche", - "oidcUserinfoUrl": "Userinfo-URL überschreiben", - "oidcAllowedUsers": "Erlaubte Benutzer", - "oidcAllowedUsersDesc": "Eine E-Mail pro Zeile. Leer lassen um alle zu erlauben.", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", "removeOidc": "Entfernen", - "usersCount": "{{count}} Benutzer", - "createUser": "Anlegen", - "newRole": "Neue Rolle", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", "roleName": "Name", - "roleDisplayName": "Anzeigename", - "roleDescription": "Beschreibung", - "rolesCount": "{{count}} Rollen", - "createRole": "Anlegen", - "creating": "Erstellen...", - "exportDatabase": "Datenbank exportieren", - "exportDatabaseDesc": "Backup aller Hosts, Anmeldeinformationen und Einstellungen herunterladen", - "export": "Exportieren", - "exporting": "Exportiere...", - "importDatabase": "Datenbank importieren", - "importDatabaseDesc": "Wiederherstellen von einer .sqlite-Sicherungsdatei", - "importDatabaseSelected": "Ausgewählt: {{name}}", - "selectFile": "Datei auswählen", - "changeFile": "Ändern", - "import": "Importieren", - "importing": "Importieren...", - "apiKeysCount": "{{count}} Schlüssel", - "newApiKey": "Neuer API-Schlüssel", - "apiKeyCreatedWarning": "Schlüssel erstellt - kopieren Sie ihn jetzt, er wird nicht mehr angezeigt.", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", "apiKeyName": "Name", - "apiKeyUser": "Benutzer", - "apiKeySelectUser": "Benutzer auswählen...", - "apiKeyExpiresAt": "Gültig bis", - "createKey": "Schlüssel erstellen", - "apiKeyNoExpiry": "Kein Ablaufdatum", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Lokal", + "authTypeLocal": "Local", "adminStatusAdministrator": "Administrator", - "adminStatusRegularUser": "Normaler Benutzer", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "KUNDE", - "youBadge": "DU", - "sessionsActive": "{{count}} aktiv", - "sessionActive": "Aktiv: {{time}}", - "sessionExpires": "Erweitern: {{time}}", - "revokeAll": "Alle", - "revokeAllSessionsSuccess": "Alle Sitzungen des Benutzers widerrufen", - "revokeAllSessionsFailed": "Konnte Sitzungen nicht widerrufen", - "revokeSessionFailed": "Sitzung konnte nicht widerrufen werden", - "addRole": "Rolle hinzufügen", - "noCustomRoles": "Keine benutzerdefinierten Rollen definiert", - "removeRoleFailed": "Fehler beim Entfernen der Rolle", - "assignRoleFailed": "Fehler beim Zuweisen der Rolle", - "deleteRoleFailed": "Fehler beim Löschen der Rolle", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", "userAdminAccess": "Administrator", - "userAdminAccessDesc": "Voller Zugriff auf alle Admin-Einstellungen", - "userRoles": "Rollen", - "revokeAllUserSessions": "Alle Sitzungen widerrufen", - "revokeAllUserSessionsDesc": "Erneute Anmeldung auf allen Geräten erzwingen", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Löschen dieses Benutzers ist dauerhaft.", - "deleteUser": "{{username}} löschen", - "deleting": "Löschen...", - "deleteUserFailed": "Fehler beim Löschen des Benutzers", - "deleteUserSuccess": "Benutzer \"{{username}}\" gelöscht", - "deleteRoleSuccess": "Rolle \"{{name}}\" gelöscht", - "revokeKeySuccess": "Schlüssel \"{{name}}\" widerrufen", - "revokeKeyFailed": "Fehler beim Entfernen des Schlüssels", - "copiedToClipboard": "In Zwischenablage kopiert", - "done": "Fertig", - "createUserTitle": "Benutzer erstellen", - "createUserDesc": "Erstellen Sie ein neues lokales Konto.", - "createUserUsername": "Benutzername", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Passwort", - "createUserPasswordHint": "Mindestens 6 Zeichen.", - "createUserEnterUsername": "Benutzernamen eingeben", - "createUserEnterPassword": "Passwort eingeben", - "createUserSubmit": "Benutzer erstellen", - "editUserTitle": "Benutzer verwalten: {{username}}", - "editUserDesc": "Rollen, Adminstatus, Sessions und Kontoeinstellungen bearbeiten.", - "editUserUsername": "Benutzername", - "editUserAuthType": "Auth Typ", - "editUserAdminStatus": "Adminstatus", - "editUserUserId": "Benutzer-ID", - "linkAccountTitle": "Verbinde OIDC mit Passwort Konto", - "linkAccountDesc": "Verbinden Sie das OIDC-Konto {{username}} mit einem bestehenden lokalen Konto.", - "linkAccountWarningTitle": "Dies wird:", - "linkAccountEffect1": "Lösche das OIDC-Nur-Konto", - "linkAccountEffect2": "OIDC-Login zum Zielkonto hinzufügen", - "linkAccountEffect3": "OIDC und Passwort Login erlauben", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Geben Sie den Benutzernamen des lokalen Kontos ein, auf den verlinkt werden soll", - "linkAccounts": "Konten verknüpfen", - "linkAccountSuccess": "OIDC-Konto verknüpft mit \"{{username}}\"", - "linkAccountFailed": "Verknüpfung des OIDC-Kontos fehlgeschlagen.", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Authentifizierungstyp", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Verknüpfung...", - "saving": "Speichern...", - "updateRegistrationFailed": "Registrierungseinstellung konnte nicht aktualisiert werden", - "updatePasswordLoginFailed": "Fehler beim Aktualisieren der Passwort-Login-Einstellung", - "updateOidcAutoProvisionFailed": "OIDC Auto-Bereitstellungs-Einstellung konnte nicht aktualisiert werden", - "updatePasswordResetFailed": "Fehler beim Aktualisieren der Passwort-Reset-Einstellung", - "sessionTimeoutRange2": "Sitzungs-Timeout muss zwischen 1 und 720 Stunden liegen", - "sessionTimeoutSaved": "Sitzungs-Timeout gespeichert", - "sessionTimeoutSaveFailed": "Speichern der Sitzungszeit fehlgeschlagen", - "monitoringIntervalInvalid": "Ungültige Intervallwerte", - "monitoringSaved": "Überwachungseinstellungen gespeichert", - "monitoringSaveFailed": "Fehler beim Speichern der Überwachungseinstellungen", - "guacamoleSaved": "Guacamole Einstellungen gespeichert", - "guacamoleSaveFailed": "Fehler beim Speichern der Guacamole Einstellungen", - "guacamoleUpdateFailed": "Fehler beim Aktualisieren der Guacamole Einstellung", - "logLevelUpdateFailed": "Fehler beim Aktualisieren der Log-Ebene", - "oidcSaved": "OIDC-Konfiguration gespeichert", - "oidcSaveFailed": "Fehler beim Speichern der OIDC-Konfiguration", - "oidcRemoved": "OIDC-Konfiguration entfernt", - "oidcRemoveFailed": "Fehler beim Entfernen der OIDC-Konfiguration", - "createUserRequired": "Benutzername und Passwort sind erforderlich", - "createUserPasswordTooShort": "Passwort muss mindestens 6 Zeichen lang sein", - "createUserSuccess": "Benutzer \"{{username}}\" erstellt", - "createUserFailed": "Fehler beim Erstellen des Benutzers", - "updateAdminStatusFailed": "Fehler beim Aktualisieren des Adminstatus", - "allSessionsRevoked": "Alle Sitzungen widerrufen", - "revokeSessionsFailed": "Konnte Sitzungen nicht widerrufen", - "createRoleRequired": "Name und Anzeigename sind erforderlich", - "createRoleSuccess": "Rolle \"{{name}}\" erstellt", - "createRoleFailed": "Fehler beim Erstellen der Rolle", - "apiKeyNameRequired": "Schlüsselname ist erforderlich", - "apiKeyUserRequired": "Benutzer-ID ist erforderlich", - "apiKeyCreatedSuccess": "API-Schlüssel \"{{name}}\" erstellt", - "apiKeyCreateFailed": "API-Schlüssel konnte nicht erstellt werden", - "exportSuccess": "Datenbank erfolgreich exportiert", - "exportFailed": "Datenbank-Export fehlgeschlagen", - "importSelectFile": "Bitte wählen Sie zuerst eine Datei", - "importCompleted": "Import abgeschlossen: {{total}} importierte Elemente, {{skipped}} übersprungen", - "importFailed": "Import fehlgeschlagen: {{error}}", - "importError": "Datenbankimport fehlgeschlagen" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Host", - "hostPlaceholder": "192.168.1.1 oder beispiel.com", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Benutzername", - "usernamePlaceholder": "benutzername", - "authLabel": "Audi", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Passwort", - "passwordPlaceholder": "passwort", - "privateKeyLabel": "Privater Schlüssel", - "privateKeyPlaceholder": "Privaten Schlüssel einfügen...", - "credentialLabel": "Anmeldedaten", - "credentialPlaceholder": "Gespeicherte Anmeldeinformationen auswählen", - "connectToTerminal": "Mit Terminal verbinden", - "connectToFiles": "Mit Dateien verbinden" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Berechtigung", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Kein Terminal ausgewählt", - "noTerminalSelectedHint": "Öffne einen SSH-Terminal-Tab um seine Befehlshistorie zu sehen", - "searchPlaceholder": "Verlauf suchen...", - "clearAll": "Alles löschen", - "noHistoryEntries": "Keine Verlaufseinträge", - "trackingDisabled": "Verlaufsverfolgung deaktiviert", - "trackingDisabledHint": "Aktivieren Sie es in Ihren Profileinstellungen, um Befehle aufzuzeichnen." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Tastenaufnahme", - "recordToTerminals": "In Terminals aufnehmen", - "selectAll": "Alle", - "selectNone": "Keine", - "noTerminalTabsOpen": "Keine Terminal-Tabs geöffnet", - "selectTerminalsAbove": "Wählen Sie oben Terminals", - "broadcastInputPlaceholder": "Tippen Sie hier, um Tastenanschläge zu senden...", - "stopRecording": "Aufnahme stoppen", - "startRecording": "Aufnahme starten", - "settingsTitle": "Einstellungen", - "enableRightClickCopyPaste": "Rechtsklick Kopieren/Einfügen aktivieren" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Keiner", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { "layoutTitle": "Layout", - "selectLayoutAbove": "Wählen Sie ein Layout oben", - "selectLayoutHint": "Anzahl der anzuzeigenden Bereiche auswählen", - "panesTitle": "Scheiben", - "openTabsTitle": "Tabs öffnen", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Ziehen Sie Registerkarten in die oberen Bereiche oder verwenden Sie die Schnellzuweisung.", - "dropHere": "Hier ablegen", - "emptyPane": "Leer", + "dropHere": "Drop here", + "emptyPane": "Empty", "dashboard": "Dashboard", - "clearSplitScreen": "Split Bildschirm löschen", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Schnellzuweisung", "alreadyAssigned": "Pane {{index}}", "splitTab": "Split Tab", "addToSplit": "Zu Split hinzufügen", "removeFromSplit": "Aus Split entfernen", - "assignToPane": "Dem Bereich zuweisen" + "assignToPane": "Dem Bereich zuweisen", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Snippet erstellen", - "createSnippetDescription": "Erstellen eines neuen Befehlssnippets für eine schnelle Ausführung", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", "nameLabel": "Name", - "namePlaceholder": "z. B. Nginx neu starten", - "descriptionLabel": "Beschreibung", - "descriptionPlaceholder": "Optionale Beschreibung", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", "optional": "Optional", - "folderLabel": "Ordner", - "noFolder": "Kein Ordner (unkategorisiert)", - "commandLabel": "Befehl", - "commandPlaceholder": "z. B. sudo systemctl neustarten nginx", - "cancel": "Abbrechen", - "createSnippetButton": "Snippet erstellen", - "createFolderTitle": "Ordner erstellen", - "createFolderDescription": "Organisieren Sie Ihre Snippets in Ordner", - "folderNameLabel": "Ordnername", - "folderNamePlaceholder": "z. B. Systembefehle, Docker-Skripte", - "folderColorLabel": "Ordnerfarbe", - "folderIconLabel": "Ordnersymbol", - "previewLabel": "Vorschau", - "folderNameFallback": "Ordnername", - "createFolderButton": "Ordner erstellen", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Stornieren", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Alle", - "selectNone": "Keine", - "noTerminalTabsOpen": "Keine Terminal-Tabs geöffnet", - "searchPlaceholder": "Suche Snippets...", - "newSnippet": "Neues Schnipsel", - "newFolder": "Neuer Ordner", - "run": "Ausführen", - "noSnippetsInFolder": "Keine Snippets in diesem Ordner", - "uncategorized": "Nicht kategorisiert", - "editSnippetTitle": "Snippet bearbeiten", - "editSnippetDescription": "Diesen Befehlssnippet aktualisieren", - "saveSnippetButton": "Änderungen speichern", - "createSuccess": "Snippet erfolgreich erstellt", - "createFailed": "Fehler beim Erstellen des Snippets", - "updateSuccess": "Snippet erfolgreich aktualisiert", - "updateFailed": "Fehler beim Aktualisieren des Snippets", - "deleteFailed": "Fehler beim Löschen des Snippets", - "folderCreateSuccess": "Ordner erfolgreich erstellt", - "folderCreateFailed": "Fehler beim Erstellen des Ordners", - "editFolderTitle": "Ordner bearbeiten", - "editFolderDescription": "Umbenennen oder ändern Sie das Aussehen dieses Ordners", - "saveFolderButton": "Änderungen speichern", - "editFolder": "Ordner bearbeiten", - "deleteFolder": "Ordner löschen", - "folderDeleteSuccess": "Ordner \"{{name}}\" gelöscht", - "folderDeleteFailed": "Fehler beim Löschen des Ordners", - "folderEditSuccess": "Ordner erfolgreich aktualisiert", - "folderEditFailed": "Fehler beim Aktualisieren des Ordners", + "selectAll": "All", + "selectNone": "Keiner", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Laufen", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Laufen", - "runSuccess": "\"{{name}}\" in {{count}} Terminal(n) ran", - "copySuccess": "Kopiert \"{{name}}\" in die Zwischenablage", - "shareTitle": "Snippet teilen", - "shareUser": "Benutzer", - "shareRole": "Rolle", - "selectUser": "Benutzer auswählen...", - "selectRole": "Wählen Sie eine Rolle...", - "shareSuccess": "Snippet erfolgreich freigegeben", - "shareFailed": "Snippet konnte nicht geteilt werden", - "revokeSuccess": "Zugriff widerrufen", - "revokeFailed": "Fehler beim Entfernen des Zugriffs", - "currentAccess": "Aktueller Zugriff", - "shareLoadError": "Fehler beim Laden der Freigabedaten", - "loading": "Wird geladen...", - "close": "Schließen", - "reorderFailed": "Fehler beim Speichern der Snippet-Reihenfolge" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Fehler beim Speichern der Snippet-Reihenfolge", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Konto", - "sectionAppearance": "Erscheinung", - "sectionSecurity": "Sicherheit", - "sectionApiKeys": "API-Schlüssel", - "sectionC2sTunnels": "C2S-Tunnel", - "usernameLabel": "Benutzername", - "roleLabel": "Rolle", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", "roleAdministrator": "Administrator", - "authMethodLabel": "Auth Methode", - "authMethodLocal": "Lokal", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "An", - "twoFaOff": "Aus", + "twoFaOn": "On", + "twoFaOff": "Off", "versionLabel": "Version", - "deleteAccount": "Konto löschen", - "deleteAccountDescription": "Lösche dein Konto dauerhaft", - "deleteButton": "Löschen", - "deleteAccountPermanent": "Diese Aktion ist dauerhaft und kann nicht rückgängig gemacht werden.", - "deleteAccountWarning": "Alle Sitzungen, Hosts, Anmeldeinformationen und Einstellungen werden dauerhaft gelöscht.", - "confirmPasswordDeletePlaceholder": "Gib zum Bestätigen dein Passwort ein", - "languageLabel": "Sprache", - "themeLabel": "Thema", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Akzentfarbe", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Befehl Autovervollständigung", - "commandAutocompleteDesc": "Beim Tippen Autovervollständigung anzeigen", - "historyTracking": "Verlaufsverfolgung", - "historyTrackingDesc": "Terminalbefehle verfolgen", - "syntaxHighlighting": "Syntaxhervorhebung", - "syntaxHighlightingDesc": "Terminalausgabe hervorheben", - "commandPalette": "Kommandopalette", - "commandPaletteDesc": "Tastaturkürzel aktivieren", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Tabs beim Anmelden wieder öffnen", "reopenTabsOnLoginDesc": "Ihre geöffneten Tabs werden beim Anmelden oder Aktualisieren der Seite wiederhergestellt, sogar von einem anderen Gerät aus.", - "confirmTabClose": "Tab-Schließen bestätigen", - "confirmTabCloseDesc": "Vor Schließen von Terminal-Tabs fragen", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Host-Tags anzeigen", - "showHostTagsDesc": "Tags in der Hostliste anzeigen", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Klicken Sie hier, um die Host-Aktionen zu erweitern.", "hostTrayOnClickDesc": "Verbindungsschaltflächen immer anzeigen; zum Erweitern der Verwaltungsoptionen klicken statt mit der Maus darüberfahren", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Die linke Seitenleiste der App-Bereiche sollte immer ausgeklappt sein, anstatt sich erst beim Überfahren mit der Maus zu erweitern.", - "settingsSnippets": "Schnipsel", - "foldersCollapsed": "Ordner zusammenklappt", - "foldersCollapsedDesc": "Ordner standardmäßig einklappen", - "confirmExecution": "Ausführung bestätigen", - "confirmExecutionDesc": "Vor dem Ausführen von Snippets bestätigen", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", "settingsUpdates": "Updates", - "disableUpdateChecks": "Updateprüfungen deaktivieren", - "disableUpdateChecksDesc": "Suche nach Updates stoppen", - "totpAuthenticator": "TOTP-Authenticator", - "totpEnabled": "2FA ist aktiviert", - "totpDisabled": "Zusätzliche Login-Sicherheit hinzufügen", - "disable": "Deaktivieren", - "enable": "Aktivieren", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Scanne QR-Code oder gib Geheimnis in deiner Authentifizierungs-App ein und gib dann den 6-stelligen Code ein", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Überprüfen", - "changePassword": "Passwort ändern", - "currentPasswordLabel": "Aktuelles Passwort", - "currentPasswordPlaceholder": "Aktuelles Passwort", - "newPasswordLabel": "Neues Passwort", - "newPasswordPlaceholder": "Neues Passwort", - "confirmPasswordLabel": "Neues Passwort bestätigen", - "confirmPasswordPlaceholder": "Neues Passwort bestätigen", - "updatePassword": "Passwort aktualisieren", - "createApiKeyTitle": "API-Schlüssel erstellen", - "createApiKeyDescription": "Generieren Sie einen neuen API-Schlüssel für den programmatischen Zugriff.", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", "optional": "optional", - "cancel": "Abbrechen", - "createKey": "Schlüssel erstellen", - "apiKeyCount": "{{count}} Schlüssel", - "newKey": "Neuer Schlüssel", - "noApiKeys": "Noch keine API-Schlüssel.", - "apiKeyActive": "Aktiv", - "apiKeyUsageHint": "Fügen Sie Ihren Schlüssel in die", - "apiKeyUsageHintHeader": "kopf.", - "apiKeyPermissionsHint": "Schlüssel erben die Berechtigungen des erzeugenden Benutzers.", - "roleUser": "Benutzer", + "cancel": "Stornieren", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Fehler beim Starten der TOTP-Einrichtung", - "totpEnter6Digits": "Geben Sie einen 6-stelligen Code ein", - "totpEnabledSuccess": "Zwei-Faktor-Authentifizierung aktiviert", - "totpInvalidCode": "Ungültiger Code, bitte versuchen Sie es erneut", - "totpDisableInputRequired": "TOTP-Code oder Passwort eingeben", - "totpDisabledSuccess": "Zwei-Faktor-Authentifizierung deaktiviert", - "totpDisableFailed": "Fehler beim Deaktivieren von 2FA", - "totpDisableTitle": "2FA deaktivieren", - "totpDisablePlaceholder": "TOTP-Code oder Passwort eingeben", - "totpDisableConfirm": "2FA deaktivieren", - "totpContinueVerify": "Weiter zur Verifizierung", - "totpVerifyTitle": "Code überprüfen", - "totpBackupTitle": "Backup-Codes", - "totpDownloadBackup": "Backup-Codes herunterladen", - "done": "Fertig", - "secretCopied": "Geheimnis in die Zwischenablage kopiert", - "apiKeyNameRequired": "Schlüsselname ist erforderlich", - "apiKeyCreated": "API-Schlüssel \"{{name}}\" erstellt", - "apiKeyCreateFailed": "API-Schlüssel konnte nicht erstellt werden", - "apiKeyUser": "Benutzer", - "apiKeyExpires": "Gültig bis", - "apiKeyRevoked": "API-Schlüssel \"{{name}}\" widerrufen", - "apiKeyRevokeFailed": "API-Schlüssel konnte nicht widerrufen", - "passwordFieldsRequired": "Aktuelle und neue Passwörter sind erforderlich", - "passwordMismatch": "Passwörter stimmen nicht überein", - "passwordTooShort": "Passwort muss mindestens 6 Zeichen lang sein", - "passwordUpdated": "Passwort erfolgreich aktualisiert", - "passwordUpdateFailed": "Fehler beim Aktualisieren des Passworts", - "deletePasswordRequired": "Passwort wird benötigt, um Ihr Konto zu löschen", - "deleteFailed": "Konto konnte nicht gelöscht werden", - "deleting": "Löschen...", - "colorPickerTooltip": "Farbauswahl öffnen", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", "themeSystem": "System", - "themeLight": "Hell", - "themeDark": "Dunkel", - "themeDracula": "Gabriel", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarisiert", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Ein Dunkler", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Wiederholen", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Entfernen", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/el_GR.json b/src/ui/locales/translated/el_GR.json index 45f8e691..5e2d0bd9 100644 --- a/src/ui/locales/translated/el_GR.json +++ b/src/ui/locales/translated/el_GR.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Φάκελοι", - "folder": "Φάκελος", - "password": "Κωδικός", - "key": "Κλειδί", - "sshPrivateKey": "Ιδιωτικό Κλειδί SSH", - "upload": "Ανέβασμα", - "keyPassword": "Κωδικός Πρόσβασης Κλειδιού", - "sshKey": "SSH Κλειδί", - "uploadPrivateKeyFile": "Ανεβάστε Αρχείο Ιδιωτικού Κλειδιού", - "searchCredentials": "Αναζήτηση διαπιστευτηρίων...", - "addCredential": "Προσθήκη Διαπιστευτηρίου", - "caCertificate": "Πιστοποιητικό CA (-cert.pub)", - "caCertificateDescription": "Προαιρετικό: Ανεβάστε ή επικολλήστε το αρχείο πιστοποιητικού υπογεγραμμένο CA (π.χ. id_ed25519-cert.pub). Απαιτείται όταν ο διακομιστής SSH σας χρησιμοποιεί εξουσιοδότηση βασισμένη σε πιστοποιητικά.", - "uploadCertFile": "Μεταφόρτωση Αρχείου -cert.pub", - "clearCert": "Εκκαθάριση", - "certLoaded": "Το πιστοποιητικό φορτώθηκε", - "certPublicKeyLabel": "Πιστοποιητικό CA", - "certTypeLabel": "Τύπος πιστοποιητικού", - "pasteOrUploadCert": "Επικόλληση ή μεταφόρτωση πιστοποιητικού -cert.pub...", - "hasCaCert": "Έχει Πιστοποιητικό CA", - "noCaCert": "Χωρίς Πιστοποιητικό Ca" + "folders": "Folders", + "folder": "Folder", + "password": "Σύνθημα", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "Κλειδί SSH", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Προεπιλεγμένη παραγγελία", + "sortNameAsc": "Όνομα (Α → Ω)", + "sortNameDesc": "Όνομα (Ω → Α)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Καθαρισμός φίλτρων", + "filterTypeGroup": "Type", + "filterTypePassword": "Σύνθημα", + "filterTypeKey": "Κλειδί SSH", + "filterTagsGroup": "Ετικέτες" }, "homepage": { - "failedToLoadAlerts": "Αποτυχία φόρτωσης ειδοποιήσεων", - "failedToDismissAlert": "Αποτυχία απόρριψης ειδοποίησης" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Ρύθμιση Παραμέτρων Διακομιστή", - "description": "Ρυθμίστε τη διεύθυνση URL του διακομιστή Termix για να συνδεθείτε με τις υπηρεσίες του συστήματος υποστήριξης", - "serverUrl": "Url Διακομιστή", - "enterServerUrl": "Παρακαλώ εισάγετε μια διεύθυνση URL διακομιστή", - "saveFailed": "Αποτυχία αποθήκευσης των ρυθμίσεων", - "saveError": "Σφάλμα αποθήκευσης ρυθμίσεων", - "saving": "Αποθηκεύεται...", - "saveConfig": "Αποθήκευση Ρυθμίσεων", - "helpText": "Εισάγετε τη διεύθυνση URL όπου εκτελείται ο διακομιστής Termix (π.χ., http://localhost:30001 ή https://your-server.com)", - "changeServer": "Αλλαγή Διακομιστή", - "mustIncludeProtocol": "Η διεύθυνση URL του διακομιστή πρέπει να ξεκινά με http:// ή http://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Να επιτρέπεται το μη έγκυρο πιστοποιητικό", "allowInvalidCertificateDesc": "Χρησιμοποιήστε μόνο για αξιόπιστους αυτο-φιλοξενούμενους διακομιστές με αυτο-υπογεγραμμένα πιστοποιητικά ή πιστοποιητικά διεύθυνσης IP.", - "useEmbedded": "Χρήση Τοπικού Διακομιστή", - "embeddedDesc": "Εκτέλεση Termix με τον ενσωματωμένο τοπικό διακομιστή (δεν απαιτείται απομακρυσμένος διακομιστής)", - "embeddedConnecting": "Σύνδεση στον τοπικό διακομιστή...", - "embeddedNotReady": "Ο τοπικός διακομιστής δεν είναι έτοιμος ακόμα. Παρακαλώ περιμένετε λίγο και προσπαθήστε ξανά.", - "localServer": "Τοπικός Διακομιστής" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Αφαιρώ" }, "versionCheck": { - "error": "Σφάλμα Ελέγχου Έκδοσης", - "checkFailed": "Αποτυχία ελέγχου για ενημερώσεις", - "upToDate": "Η εφαρμογή είναι μέχρι την ημερομηνία", - "currentVersion": "Εκτελείτε την έκδοση {{version}}", - "updateAvailable": "Διαθέσιμη Ενημέρωση", - "newVersionAvailable": "Μια νέα έκδοση είναι διαθέσιμη! Εκτελείτε {{current}}αλλά το {{latest}} είναι διαθέσιμο.", - "betaVersion": "Έκδοση Beta", - "betaVersionDesc": "Τρέχετε {{current}}, το οποίο είναι νεότερο από την τελευταία σταθερή κυκλοφορία {{latest}}.", - "releasedOn": "Κυκλοφόρησε στο {{date}}", - "downloadUpdate": "Λήψη Ενημέρωσης", - "checking": "Έλεγχος για ενημερώσεις...", - "checkUpdates": "Έλεγχος για ενημερώσεις", - "checkingUpdates": "Έλεγχος για ενημερώσεις...", - "updateRequired": "Απαιτείται Ενημέρωση" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Κλείσιμο", + "close": "Close", "minimize": "Minimize", - "online": "Συνδεδεμένος", - "offline": "Αποσυνδεδεμένος", - "continue": "Συνέχεια", - "maintenance": "Συντήρηση", - "degraded": "Μειώθηκε", - "error": "Σφάλμα", - "warning": "Προειδοποίηση", - "unsavedChanges": "Μη αποθηκευμένες αλλαγές", - "dismiss": "Απόρριψη", - "loading": "Φόρτωση...", - "optional": "Προαιρετικό", - "connect": "Σύνδεση", - "copied": "Αντιγράφηκε", - "connecting": "Σύνδεση...", - "updateAvailable": "Διαθέσιμη Ενημέρωση", + "online": "Διαδικτυακά", + "offline": "Εκτός σύνδεσης", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Άνοιγμα σε νέα καρτέλα", - "noReleases": "Καμία Κυκλοφορία", - "updatesAndReleases": "Ενημερώσεις & Εκδόσεις", - "newVersionAvailable": "Μια νέα έκδοση ({{version}}) είναι διαθέσιμη.", - "failedToFetchUpdateInfo": "Αποτυχία λήψης πληροφοριών ενημέρωσης", - "preRelease": "Προ-έκδοση", - "noReleasesFound": "Δεν βρέθηκαν εκδόσεις.", - "cancel": "Ακύρωση", - "username": "Όνομα Χρήστη", - "login": "Είσοδος", - "register": "Εγγραφή", - "password": "Κωδικός", - "confirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης", - "back": "Πίσω", - "save": "Αποθήκευση", - "saving": "Αποθηκεύεται...", - "delete": "Διαγραφή", - "rename": "Μετονομασία", - "edit": "Επεξεργασία", - "add": "Προσθήκη", - "confirm": "Επιβεβαίωση", - "no": "Όχι", - "or": "Ή", - "next": "Επόμενο", - "previous": "Προηγούμενο", - "refresh": "Ανανέωση", - "language": "Γλώσσα", - "checking": "Έλεγχος...", - "checkingDatabase": "Έλεγχος σύνδεσης βάσης δεδομένων...", - "checkingAuthentication": "Έλεγχος ταυτοποίησης...", - "backendReconnected": "Έγινε επαναφορά σύνδεσης διακομιστή", - "connectionDegraded": "Η σύνδεση διακομιστή χάθηκε, ανάκτηση…", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Ματαίωση", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Σύνθημα", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Αφαίρεση", - "create": "Δημιουργία", - "update": "Ενημέρωση", - "copy": "Αντιγραφή", - "copyFailed": "Αποτυχία αντιγραφής στο πρόχειρο", + "remove": "Αφαιρώ", + "create": "Create", + "update": "Update", + "copy": "Αντίγραφο", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Επαναφορά", - "of": "από" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Αρχική", + "home": "Home", "terminal": "Τερματικό", - "docker": "Προσάρτηση", - "tunnels": "Σηράγγες", - "fileManager": "Διαχειριστής Αρχείων", - "serverStats": "Στατιστικά Διακομιστή", - "admin": "Διαχειριστής", - "userProfile": "Προφίλ Χρήστη", - "splitScreen": "Διαίρεση Οθόνης", - "confirmClose": "Κλείσιμο αυτής της ενεργής συνεδρίας?", - "close": "Κλείσιμο", - "cancel": "Ακύρωση", - "sshManager": "Διαχειριστής SSH", - "cannotSplitTab": "Αδυναμία διαχωρισμού αυτής της καρτέλας", + "docker": "Λιμενεργάτης", + "tunnels": "Tunnels", + "fileManager": "Διαχειριστής αρχείων", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Ματαίωση", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Αντιγραφή Κωδικού Πρόσβασης", - "copySudoPassword": "Αντιγραφή Κωδικού Πρόσβασης Sudo", - "passwordCopied": "Ο κωδικός αντιγράφηκε στο πρόχειρο", - "noPasswordAvailable": "Δεν υπάρχει διαθέσιμος κωδικός πρόσβασης", - "failedToCopyPassword": "Αποτυχία αντιγραφής κωδικού πρόσβασης", - "refreshTab": "Ανανέωση σύνδεσης", - "openFileManager": "Άνοιγμα Διαχειριστή Αρχείων", - "dashboard": "Ταμπλό", - "networkGraph": "Γράφημα Δικτύου", - "quickConnect": "Γρήγορη Σύνδεση", - "sshTools": "Εργαλεία SSH", - "history": "Ιστορικό", - "hosts": "Υπολογιστές", - "snippets": "Δείγματα", - "hostManager": "Διαχειριστής Υπολογιστών", - "credentials": "Διαπιστευτήρια", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Συνδέσεις", - "roleAdministrator": "Διαχειριστής", - "roleUser": "Χρήστης" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Υπολογιστές", - "noHosts": "Δεν Υπάρχουν Υπολογιστές SSH", - "retry": "Επανάληψη", - "refresh": "Ανανέωση", - "optional": "Προαιρετικό", - "downloadSample": "Λήψη Δείγματος", - "failedToDeleteHost": "Αποτυχία διαγραφής {{name}}", - "importSkipExisting": "Εισαγωγή (παράλειψη υπάρχει)", - "connectionDetails": "Λεπτομέρειες Σύνδεσης", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Δοκιμάζω πάλι", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Telnet", - "remoteDesktop": "Απομακρυσμένη Επιφάνεια Εργασίας", - "port": "Θύρα", - "username": "Όνομα Χρήστη", - "folder": "Φάκελος", + "telnet": "Τέλνετ", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "Ετικέτες", - "pin": "Καρφίτσα", - "addHost": "Προσθήκη Διακομιστή", - "editHost": "Επεξεργασία Υπολογιστή", - "cloneHost": "Κλωνοποίηση Υπολογιστή", - "enableTerminal": "Ενεργοποίηση Τερματικού", - "enableTunnel": "Ενεργοποίηση Tunnel", - "enableFileManager": "Ενεργοποίηση Διαχειριστή Αρχείων", - "enableDocker": "Ενεργοποίηση Docker", - "defaultPath": "Προεπιλεγμένη Διαδρομή", - "connection": "Σύνδεση", - "upload": "Ανέβασμα", - "authentication": "Ταυτοποίηση", - "password": "Κωδικός", - "key": "Κλειδί", - "credential": "Διαπιστευτήριο", - "none": "Κανένα", - "sshPrivateKey": "Ιδιωτικό Κλειδί SSH", - "keyType": "Τύπος Κλειδιού", - "uploadFile": "Μεταφόρτωση Αρχείου", - "tabGeneral": "Γενικά", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Σύνθημα", + "key": "Key", + "credential": "Πιστοποιητικό", + "none": "Κανένας", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", + "tabTerminal": "Τερματικό", + "tabRdp": "ΠΑΑ", "tabVnc": "VNC", - "tabTunnels": "Σηράγγες", - "tabDocker": "Προσάρτηση", - "tabFiles": "Αρχεία", - "tabStats": "Στατιστικά", - "tabTelnet": "Telnet", - "tabSharing": "Κοινή χρήση", - "tabAuthentication": "Ταυτοποίηση", + "tabTunnels": "Tunnels", + "tabDocker": "Λιμενεργάτης", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Τέλνετ", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Τερματικό", "tunnel": "Σήραγγα", - "fileManager": "Διαχειριστής Αρχείων", - "serverStats": "Στατιστικά Διακομιστή", + "fileManager": "Διαχειριστής αρχείων", + "serverStats": "Host Metrics", "status": "Κατάσταση", - "folderRenamed": "Φάκελος \"{{oldName}}\" μετονομάστηκε σε \"{{newName}}\" επιτυχώς", - "failedToRenameFolder": "Αποτυχία μετονομασίας φακέλου", - "movedToFolder": "Μετακινήθηκε στο \"{{folder}}\"", - "editHostTooltip": "Επεξεργασία κεντρικού υπολογιστή", - "statusChecks": "Έλεγχοι Κατάστασης", - "metricsCollection": "Συλλογή Μετρικών", - "metricsInterval": "Διάστημα Συλλογής Μετρήσεων", - "metricsIntervalDesc": "Πόσο συχνά συλλέγουν στατιστικά στοιχεία διακομιστή (5s - 1h)", - "behavior": "Συμπεριφορά", - "themePreview": "Προεπισκόπηση Θέματος", - "theme": "Θέμα", - "fontFamily": "Οικογένεια Γραμματοσειρών", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Διάστημα Γραμμάτων", - "lineHeight": "Ύψος Γραμμής", - "cursorStyle": "Στυλ Δρομέα", - "cursorBlink": "Αναβόσβημα Δρομέα", - "scrollbackBuffer": "Προσωρινή Μνήμη Κύλισης", - "bellStyle": "Στυλ Κουδουνιού", - "rightClickSelectsWord": "Δεξί Κλικ Επιλέγει Λέξη", - "fastScrollModifier": "Τροποποιητής Γρήγορης Κύλισης", - "fastScrollSensitivity": "Ευαισθησία Γρήγορης Κύλισης", - "sshAgentForwarding": "Προώθηση SSH Πράκτορα", - "backspaceMode": "Λειτουργία Backspace", - "startupSnippet": "Δείγμα Εκκίνησης", - "selectSnippet": "Επιλογή αποσπάσματος", - "forceKeyboardInteractive": "Εξαναγκασμός Keyboard-Interactive", - "overrideCredentialUsername": "Παράκαμψη Ονόματος Διαπιστευτηρίου Χρήστη", - "overrideCredentialUsernameDesc": "Χρησιμοποιήστε το όνομα χρήστη που καθορίστηκε παραπάνω αντί για το όνομα χρήστη του διαπιστευτηρίου", - "jumpHostChain": "Αλυσίδα Άλματος", - "portKnocking": "Λιμάνι Knocking", - "addKnock": "Προσθήκη Θύρας", - "addProxyNode": "Προσθήκη Κόμβου", - "proxyNode": "Κόμβος Διαμεσολαβητή", - "proxyType": "Τύπος Διαμεσολαβητή", - "quickActions": "Γρήγορες Ενέργειες", - "sudoPasswordAutoFill": "Αυτόματη Συμπλήρωση Κωδικού Πρόσβασης Sudo", - "sudoPassword": "Κωδικός Πρόσβασης Sudo", - "keepaliveInterval": "Διάστημα Διατροφής (ms)", - "moshCommand": "Διοίκηση MOSH", - "environmentVariables": "Μεταβλητές Περιβάλλοντος", - "addVariable": "Προσθήκη Μεταβλητής", - "docker": "Προσάρτηση", - "copyTerminalUrl": "Αντιγραφή URL Τερματικού", - "copyFileManagerUrl": "Αντιγραφή URL Διαχειριστή Αρχείων", - "copyRemoteDesktopUrl": "Αντιγραφή URL Απομακρυσμένης Επιφάνειας Εργασίας", - "failedToConnect": "Αποτυχία σύνδεσης στην κονσόλα", - "connect": "Σύνδεση", - "disconnect": "Αποσύνδεση", - "start": "Έναρξη", - "enableStatusCheck": "Ενεργοποίηση Ελέγχου Κατάστασης", - "enableMetrics": "Ενεργοποίηση Μετρήσεων", - "bulkUpdateFailed": "Η μαζική ενημέρωση απέτυχε", - "selectAll": "Επιλογή Όλων", - "deselectAll": "Αποεπιλογή Όλων", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Λιμενεργάτης", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Ασφαλές Κέλυφος", - "virtualNetwork": "Εικονικό Δίκτυο", - "unencryptedShell": "Μη κρυπτογραφημένο κέλυφος", - "addressIp": "Διεύθυνση / IP", - "friendlyName": "Φιλικό Όνομα", - "folderAndAdvanced": "& Προχωρημένος Φάκελος", - "privateNotes": "Ιδιωτικές Σημειώσεις", - "privateNotesPlaceholder": "Λεπτομέρειες σχετικά με αυτόν τον διακομιστή...", - "pinToTop": "Καρφίτσωμα στην κορυφή", - "pinToTopDesc": "Να εμφανίζεται πάντα αυτός ο κεντρικός υπολογιστής στην κορυφή της λίστας", - "portKnockingSequence": "Ακολουθία Του Port Knocking", - "addKnockBtn": "Προσθήκη Κτυπήματος", - "noPortKnocking": "Δεν έχει ρυθμιστεί καμία θύρα.", - "knockPort": "Θύρα Knock", - "protocol": "Protocol", - "delayAfterMs": "Καθυστέρηση Μετά (ms)", - "useSocks5Proxy": "Χρήση Διακομιστή Μεσολάβησης SOCKS5", - "useSocks5ProxyDesc": "Σύνδεση διαδρομής μέσω διακομιστή μεσολάβησης", - "proxyHost": "Διακομιστής Μεσολάβησης", - "proxyPort": "Θύρα Διαμεσολαβητή", - "proxyUsername": "Όνομα Χρήστη Διακομιστή Μεσολάβησης", - "proxyPassword": "Κωδικός Διακομιστή Μεσολάβησης", - "proxySingleMode": "Μονός Διακομιστής Μεσολάβησης", - "proxyChainMode": "Αλυσίδα Διαμεσολαβητή", - "you": "Εσείς", - "jumpHostChainLabel": "Αλυσίδα Άλματος", - "addJumpBtn": "Προσθήκη Άλματος", - "noJumpHosts": "Δεν έχει ρυθμιστεί κανένας υπολογιστής άλματος.", - "selectAServer": "Επιλέξτε έναν διακομιστή...", - "sshPort": "Θύρα SSH", - "authMethod": "Μέθοδος Πιστοποίησης", - "storedCredential": "Αποθηκευμένα Διαπιστευτήρια", - "selectACredential": "Επιλέξτε ένα πιστοποιητικό...", - "keyTypeLabel": "Τύπος Κλειδιού", - "keyTypeAuto": "Αυτόματη Ανίχνευση", - "keyPasteTab": "Επικόλληση", - "keyUploadTab": "Ανέβασμα", - "keyFileLoaded": "Το αρχείο κλειδί φορτώθηκε", - "keyUploadClick": "Κάντε κλικ για να ανεβάσετε .pem / .key / .ppk", - "clearKey": "Καθαρισμός κλειδιού", - "keySaved": "SSH κλειδί αποθηκεύτηκε", - "keyReplaceNotice": "επικολλήστε ένα νέο κλειδί κάτω για να το αντικαταστήσετε", - "keyPassphraseSaved": "Η φράση πρόσβασης αποθηκεύτηκε, πληκτρολογήστε για αλλαγή", - "replaceKey": "Αντικατάσταση κλειδιού", - "forceKeyboardInteractiveLabel": "Εξαναγκασμός Πληκτρολογίου Διαδραστικού", - "forceKeyboardInteractiveShortDesc": "Εξαναγκασμός καταχώρησης χειροκίνητου κωδικού πρόσβασης ακόμη και αν υπάρχουν κλειδιά", - "terminalAppearance": "Εμφάνιση Τερματικού", - "colorTheme": "Χρώμα Θέματος", - "fontFamilyLabel": "Οικογένεια Γραμματοσειρών", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Πρωτόκολλο", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Στυλ Δρομέα", - "letterSpacingPx": "Διάστημα Γραμμάτων (px)", - "lineHeightLabel": "Ύψος Γραμμής", - "bellStyleLabel": "Στυλ Κουδουνιού", - "backspaceModeLabel": "Λειτουργία Backspace", - "cursorBlinking": "Αναβόσβημα Δρομέα", - "cursorBlinkingDesc": "Ενεργοποίηση εφέ αναβοσβήσματος για τον κέρσορα τερματικού", - "rightClickSelectsWordLabel": "Κάντε δεξί κλικ Επιλογή Λέξης", - "rightClickSelectsWordShortDesc": "Επιλέξτε τη λέξη κάτω από το δρομέα με δεξί κλικ", - "behaviorAndAdvanced": "Συμπεριφορά & Προχωρημένη", - "scrollbackBufferLabel": "Προσωρινή Μνήμη Κύλισης", - "scrollbackMaxLines": "Μέγιστος αριθμός γραμμών που διατηρούνται στο ιστορικό", - "sshAgentForwardingLabel": "Προώθηση SSH Πράκτορα", - "sshAgentForwardingShortDesc": "Περάστε τα τοπικά SSH κλειδιά σας σε αυτόν τον υπολογιστή", - "enableAutoMosh": "Ενεργοποίηση Αυτόματη-Mosh", - "enableAutoMoshDesc": "Προτίμηση του Mosh πάνω από SSH εάν είναι διαθέσιμο", - "enableAutoTmux": "Ενεργοποίηση Auto-Tmux", - "enableAutoTmuxDesc": "Αυτόματη εκκίνηση ή επισύναψη σε συνεδρία tmux", - "sudoPasswordAutoFillLabel": "Αυτόματος Γέμισμα Κωδικού Πρόσβασης Sudo", - "sudoPasswordAutoFillShortDesc": "Αυτόματη παροχή sudo κωδικού πρόσβασης όταν σας ζητηθεί", - "sudoPasswordLabel": "Κωδικός Πρόσβασης Sudo", - "environmentVariablesLabel": "Μεταβλητές Περιβάλλοντος", - "addVariableBtn": "Προσθήκη Μεταβλητής", - "noEnvVars": "Δεν έχουν ρυθμιστεί μεταβλητές περιβάλλοντος.", - "fastScrollModifierLabel": "Τροποποιητής Γρήγορης Κύλισης", - "fastScrollSensitivityLabel": "Ευαισθησία Γρήγορης Κύλισης", - "moshCommandLabel": "Εντολή Mosh", - "startupSnippetLabel": "Δείγμα Εκκίνησης", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Διάστημα διατήρησης ζωντανής λειτουργίας (δευτερόλεπτα)", - "maxKeepaliveMisses": "Μέγιστες Αστοχίες Keepalive", - "tunnelSettings": "Ρυθμίσεις Tunnel", - "enableTunneling": "Ενεργοποίηση Tunneling", - "enableTunnelingDesc": "Ενεργοποίηση λειτουργίας SSH tunnel για αυτόν τον κεντρικό υπολογιστή", - "serverTunnelsSection": "Σήραγγες Διακομιστή", - "addTunnelBtn": "Προσθήκη Tunnel", - "noTunnelsConfigured": "Δεν έχουν ρυθμιστεί σήραγγες.", - "tunnelLabel": "Σήραγγα {{number}}", - "tunnelType": "Τύπος Tunnel", - "tunnelModeLocalDesc": "Προώθηση μιας τοπικής θύρας σε μια θύρα στον απομακρυσμένο διακομιστή (ή έναν εξυπηρετητή προσβάσιμο από αυτό).", - "tunnelModeRemoteDesc": "Προώθηση μιας θύρας στον απομακρυσμένο διακομιστή πίσω σε μια τοπική θύρα στον υπολογιστή σας.", - "tunnelModeDynamicDesc": "Δημιουργήστε ένα διακομιστή μεσολάβησης SOCKS5 σε μια τοπική θύρα για δυναμική προώθηση θύρας.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Αυτός ο κεντρικός υπολογιστής (άμεση σήραγγα)", - "endpointHost": "Διακομιστής Τελικού Σημείου", - "endpointPort": "Θύρα Τελικού Σημείου", - "bindHost": "Δεσμευμένος Διακομιστής", - "sourcePort": "Θύρα Πηγής", - "maxRetries": "Μέγιστες Επαναλήψεις", - "retryIntervalS": "Επανάληψη Διαστήματος (ων)", - "autoStartLabel": "Αυτόματη εκκίνηση", - "autoStartDesc": "Αυτόματη σύνδεση αυτής της διοχέτευσης όταν φορτωθεί ο υπολογιστής", - "tunnelConnecting": "Σύνδεση σήραγγας...", - "tunnelDisconnected": "Η σήραγγα αποσυνδέθηκε", - "failedToConnectTunnel": "Αποτυχία σύνδεσης", - "failedToDisconnectTunnel": "Αποτυχία αποσύνδεσης", - "dockerIntegration": "Ενσωμάτωση Docker", - "enableDockerMonitor": "Ενεργοποίηση Docker", - "enableDockerMonitorDesc": "Παρακολούθηση και διαχείριση δοχείων σε αυτόν τον υπολογιστή μέσω Docker", - "enableFileManagerMonitor": "Ενεργοποίηση Διαχειριστή Αρχείων", - "enableFileManagerMonitorDesc": "Περιηγηθείτε και διαχειριστείτε αρχεία σε αυτόν τον κεντρικό υπολογιστή μέσω SFTP", - "defaultPathLabel": "Προεπιλεγμένη Διαδρομή", - "fileManagerPathHint": "Ο κατάλογος που θα ανοίξει όταν ο διαχειριστής αρχείων ξεκινήσει για αυτόν τον υπολογιστή.", - "statusChecksLabel": "Έλεγχοι Κατάστασης", - "enableStatusChecks": "Ενεργοποίηση Ελέγχου Κατάστασης", - "enableStatusChecksDesc": "Περιοδικά ping σε αυτόν τον κεντρικό υπολογιστή για να επαληθεύσει τη διαθεσιμότητα", - "useGlobalInterval": "Χρήση Καθολικού Διαστήματος", - "useGlobalIntervalDesc": "Παράκαμψη με το διάστημα ελέγχου κατάστασης για ολόκληρο το διακομιστή", - "checkIntervalS": "Χρονικό Διάστημα Ελέγχου", - "checkIntervalDesc": "Δευτερόλεπτα μεταξύ κάθε συνδεσιμότητας ping", - "metricsCollectionLabel": "Συλλογή Μετρικών", - "enableMetricsLabel": "Ενεργοποίηση Μετρήσεων", - "enableMetricsDesc": "Συλλογή CPU, RAM, δίσκου και χρήσης δικτύου από αυτόν τον υπολογιστή", - "useGlobalMetrics": "Χρήση Καθολικού Διαστήματος", - "useGlobalMetricsDesc": "Παράκαμψη με το διάστημα μετρήσεων σε κλίμακα διακομιστή", - "metricsIntervalS": "Διάστημα Μετρήσεων", - "metricsIntervalDesc2": "Δευτερόλεπτα μεταξύ μετρικών στιγμιότυπων", - "visibleWidgets": "Ορατά Widgets", - "cpuUsageLabel": "Χρήση CPU", - "cpuUsageDesc": "CPU τοις εκατό, μέσοι όροι φορτίου, σπινθηρογράφημα", - "memoryLabel": "Χρήση Μνήμης", - "memoryDesc": "Χρήση RAM, swap, cached", - "storageLabel": "Χρήση Δίσκου", - "storageDesc": "Χρήση δίσκου ανά σημείο προσάρτησης", - "networkLabel": "Διεπαφές Δικτύου", - "networkDesc": "Κατάλογος διεπαφών και εύρος ζώνης", - "uptimeLabel": "Χρόνος", - "uptimeDesc": "Χρόνος λειτουργίας συστήματος και χρόνος εκκίνησης", - "systemInfoLabel": "Πληροφορίες Συστήματος", - "systemInfoDesc": "OS, πυρήνας, όνομα hostname, αρχιτεκτονική", - "recentLoginsLabel": "Πρόσφατες Συνδέσεις", - "recentLoginsDesc": "Επιτυχημένες και αποτυχημένες εκδηλώσεις σύνδεσης", - "topProcessesLabel": "Κορυφαίες Διεργασίες", - "topProcessesDesc": "PID, CPU%, MEM%, εντολή", - "listeningPortsLabel": "Θύρες Ακρόασης", - "listeningPortsDesc": "Άνοιγμα θυρών με διεργασία και πολιτεία", - "firewallLabel": "Τείχος Προστασίας", - "firewallDesc": "Firewall, AppArmor, SELinux κατάσταση", - "quickActionsLabel": "Γρήγορες Ενέργειες", - "quickActionsToolbar": "Οι γρήγορες ενέργειες εμφανίζονται ως κουμπιά στη γραμμή στατιστικών διακομιστή για εκτέλεση εντολών με ένα κλικ.", - "noQuickActions": "Δεν υπάρχουν ακόμα γρήγορες ενέργειες.", - "buttonLabel": "Ετικέτα κουμπιού", - "selectSnippetPlaceholder": "Επιλέξτε απόφραξη...", - "addActionBtn": "Προσθήκη Ενέργειας", - "hostSharedSuccessfully": "Επιτυχής κοινή χρήση εξυπηρετητή", - "failedToShareHost": "Αποτυχία κοινής χρήσης κεντρικού υπολογιστή", - "accessRevoked": "Η πρόσβαση ανακλήθηκε", - "failedToRevokeAccess": "Αποτυχία ανάκλησης πρόσβασης", - "cancelBtn": "Ακύρωση", - "savingBtn": "Αποθηκεύεται...", - "addHostBtn": "Προσθήκη Διακομιστή", - "hostUpdated": "Ο υπολογιστής ενημερώθηκε", - "hostCreated": "Ο υπολογιστής δημιουργήθηκε", - "failedToSave": "Αποτυχία αποθήκευσης κεντρικού υπολογιστή", - "credentialUpdated": "Το διαπιστευτήριο ενημερώθηκε", - "credentialCreated": "Δημιουργήθηκε διαπιστευτήριο", - "failedToSaveCredential": "Αποτυχία αποθήκευσης διαπιστευτηρίων", - "backToHosts": "Πίσω στους οικοδεσπότες", - "backToCredentials": "Πίσω στα διαπιστευτήρια", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Σύνθημα", + "authTypeKey": "Κλειδί SSH", + "authTypeCredential": "Πιστοποιητικό", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Κανένας", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Ματαίωση", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Καρφιτσωμένο", - "noHostsFound": "Δεν βρέθηκαν υπολογιστές", - "tryDifferentTerm": "Δοκιμάστε έναν διαφορετικό όρο", - "addFirstHost": "Προσθέστε τον πρώτο σας υπολογιστή για να ξεκινήσετε", - "noCredentialsFound": "Δεν βρέθηκαν διαπιστευτήρια", - "addCredentialBtn": "Προσθήκη Διαπιστευτηρίου", - "updateCredentialBtn": "Ενημέρωση Διαπιστευτηρίων", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Χαρακτηριστικά", - "noFolder": "(Χωρίς φάκελο)", - "deleteSelected": "Διαγραφή", - "exitSelection": "Έξοδος από επιλογή", - "importSkip": "Εισαγωγή (παράλειψη υπάρχει)", - "importOverwrite": "Εισαγωγή (αντικατάσταση)", - "collapseBtn": "Σύμπτυξη", - "importExportBtn": "Εισαγωγή / Εξαγωγή", - "hostStatusesRefreshed": "Ανανεωμένες καταστάσεις κεντρικού υπολογιστή", - "failedToRefreshHosts": "Αποτυχία ανανέωσης υπολογιστών", - "movedHostTo": "Μετακινήθηκε {{host}} στο \"{{folder}}\"", - "failedToMoveHost": "Αποτυχία μετακίνησης κεντρικού υπολογιστή", - "folderRenamedTo": "Ο φάκελος μετονομάστηκε σε \"{{name}}\"", - "deletedFolder": "Διαγραμμένος φάκελος \"{{name}}\"", - "failedToDeleteFolder": "Αποτυχία διαγραφής φακέλου", - "deleteAllInFolder": "Διαγραφή όλων των υπολογιστών στο \"{{name}}\"? Αυτό δεν μπορεί να αναιρεθεί.", - "deletedHost": "Διαγράφηκε {{name}}", - "copiedToClipboard": "Αντιγράφηκε στο πρόχειρο", - "terminalUrlCopied": "Το URL τερματικού αντιγράφηκε", - "fileManagerUrlCopied": "Το URL διαχείρισης αρχείων αντιγράφηκε", - "tunnelUrlCopied": "Το URL διοχέτευσης αντιγράφηκε", - "dockerUrlCopied": "Το URL προσάρτησης αντιγράφηκε", - "serverStatsUrlCopied": "Η διεύθυνση URL αντιγράφηκε διακομιστή", - "rdpUrlCopied": "Το URL RDP αντιγράφηκε", - "vncUrlCopied": "Το URL VNC αντιγράφηκε", - "telnetUrlCopied": "Το URL Telnet αντιγράφηκε", - "remoteDesktopUrlCopied": "Η διεύθυνση URL απομακρυσμένης επιφάνειας εργασίας αντιγράφηκε", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Ματαίωση", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Κατάσταση", + "GroupByProtocol": "Πρωτόκολλο", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Ανάπτυξη ενεργειών", "collapseActions": "Σύμπτυξη ενεργειών", "wakeOnLanAction": "Αφύπνιση σε LAN", - "wakeOnLanSuccess": "Μαγικό πακέτο στάλθηκε στον/στην {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Αποτυχία αποστολής μαγικού πακέτου", - "cloneHostAction": "Κλωνοποίηση Υπολογιστή", - "copyAddress": "Αντιγραφή Διεύθυνσης", - "copyLink": "Αντιγραφή Συνδέσμου", - "copyTerminalUrlAction": "Αντιγραφή URL Τερματικού", - "copyFileManagerUrlAction": "Αντιγραφή URL Διαχειριστή Αρχείων", - "copyTunnelUrlAction": "Αντιγραφή Διεύθυνσης Tunnel", - "copyDockerUrlAction": "Αντιγραφή URL Προσάρτησης", - "copyServerStatsUrlAction": "Αντιγραφή Url Στατιστικών Διακομιστή", - "copyRdpUrlAction": "Αντιγραφή URL RDP", - "copyVncUrlAction": "Αντιγραφή Διεύθυνσης Vnc", - "copyTelnetUrlAction": "Αντιγραφή Διεύθυνσης Telnet", - "copyRemoteDesktopUrlAction": "Αντιγραφή URL Απομακρυσμένης Επιφάνειας Εργασίας", - "deleteCredentialConfirm": "Διαγραφή διαπιστευτηρίων \"{{name}}\";", - "deletedCredential": "Διαγράφηκε {{name}}", - "deploySSHKeyTitle": "Ανάπτυξη Κλειδιού SSH", - "deployingBtn": "Εφαρμογή...", - "deployBtn": "Ανάπτυξη", - "failedToDeployKey": "Αποτυχία ανάπτυξης κλειδιού", - "deleteHostsConfirm": "Διαγραφή {{count}} host{{plural}}? Αυτό δεν μπορεί να αναιρεθεί.", - "movedToRoot": "Μεταφέρθηκε στη ρίζα", - "failedToMoveHosts": "Αποτυχία μετακίνησης υπολογιστών", - "enableTerminalFeature": "Ενεργοποίηση Τερματικού", - "disableTerminalFeature": "Απενεργοποίηση Τερματικού", - "enableFilesFeature": "Ενεργοποίηση Αρχείων", - "disableFilesFeature": "Απενεργοποίηση Αρχείων", - "enableTunnelsFeature": "Ενεργοποίηση Σηράγγων", - "disableTunnelsFeature": "Απενεργοποίηση Των Tunnels", - "enableDockerFeature": "Ενεργοποίηση Docker", - "disableDockerFeature": "Απενεργοποίηση Προσάρτησης", - "addTagsPlaceholder": "Προσθήκη ετικετών ...", - "authDetails": "Λεπτομέρειες Ταυτοποίησης", - "credType": "Τύπος", - "generateKeyPairDesc": "Δημιουργήστε ένα νέο ζεύγος κλειδιών, τόσο ιδιωτικά όσο και δημόσια κλειδιά θα συμπληρώνονται αυτόματα.", - "generatingKey": "Δημιουργία...", - "generateLabel": "Δημιουργία {{label}}", - "uploadFileBtn": "Μεταφόρτωση αρχείου", - "keyPassphraseOptional": "Φράση Πρόσβασης Κλειδιού (Προαιρετικό)", - "sshPublicKeyOptional": "SSH Δημόσιο Κλειδί (Προαιρετικό)", - "publicKeyGenerated": "Το δημόσιο κλειδί δημιουργήθηκε", - "failedToGeneratePublicKey": "Αποτυχία άντλησης δημόσιου κλειδιού", - "publicKeyCopied": "Το δημόσιο κλειδί αντιγράφηκε", - "keyPairGenerated": "Δημιουργήθηκε ένα ζευγάρι κλειδιών {{label}}", - "failedToGenerateKeyPair": "Αποτυχία δημιουργίας ζεύγους κλειδιών", - "searchHostsPlaceholder": "Αναζήτηση κεντρικών υπολογιστών, διευθύνσεων, ετικετών…", - "searchCredentialsPlaceholder": "Αναζήτηση διαπιστευτηρίων…", - "refreshBtn": "Ανανέωση", - "addTag": "Προσθήκη ετικετών ...", - "deleteConfirmBtn": "Διαγραφή", - "tunnelRequirementsText": "Ο διακομιστής SSH πρέπει να έχει GatewayPorts ναι, AllowTcpForwarding ναι και PermitRootLogin ναι που έχει οριστεί στο /etc/ssh/sshd_config.", - "deleteHostConfirm": "Διαγραφή \"{{name}}\"?", - "enableAtLeastOneProtocol": "Ενεργοποιήστε τουλάχιστον ένα παραπάνω πρωτόκολλο για να ρυθμίσετε τον έλεγχο ταυτότητας και τις ρυθμίσεις σύνδεσης.", - "keyPassphrase": "Συνθηματική Φράση Κλειδιού", - "connectBtn": "Σύνδεση", - "disconnectBtn": "Αποσύνδεση", - "basicInformation": "Βασικές Πληροφορίες", - "authDetailsSection": "Λεπτομέρειες Ταυτοποίησης", - "credTypeLabel": "Τύπος", - "hostsTab": "Υπολογιστές", - "credentialsTab": "Διαπιστευτήρια", - "selectMultiple": "Επιλογή πολλαπλών", - "selectHosts": "Επιλέξτε οικοδεσπότες", - "connectionLabel": "Σύνδεση", - "authenticationLabel": "Ταυτοποίηση", - "generateKeyPairTitle": "Δημιουργία Ζεύγους Κλειδιών", - "generateKeyPairDescription": "Δημιουργήστε ένα νέο ζεύγος κλειδιών, τόσο ιδιωτικά όσο και δημόσια κλειδιά θα συμπληρώνονται αυτόματα.", - "generateFromPrivateKey": "Δημιουργία από Ιδιωτικό Κλειδί", - "refreshBtn2": "Ανανέωση", - "exitSelectionTitle": "Έξοδος από επιλογή", - "exportAll": "Εξαγωγή Όλων", - "addHostBtn2": "Προσθήκη Διακομιστή", - "addCredentialBtn2": "Προσθήκη Διαπιστευτηρίου", - "checkingHostStatuses": "Έλεγχος κατάστασης κεντρικού υπολογιστή...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Καρφιτσωμένο", - "hostsExported": "Οι υπολογιστές εξήχθησαν επιτυχώς", + "hostsExported": "Hosts exported successfully", "exportFailed": "Αποτυχία εξαγωγής κεντρικών υπολογιστών", - "sampleDownloaded": "Δείγμα αρχείου που λήφθηκε", - "failedToDeleteCredential2": "Αποτυχία διαγραφής διαπιστευτηρίων", - "noFolderOption": "(Χωρίς φάκελο)", - "nSelected": "επιλεγμένο {{count}}", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Χαρακτηριστικά", - "moveMenu": "Μετακίνηση", - "cancelSelection": "Ακύρωση", - "deployDialogDesc": "Ανάπτυξη {{name}} σε εξουσιοδοτημένου_κλειδιά ενός κεντρικού υπολογιστή.", - "targetHostLabel": "Διακομιστής Στόχου", - "selectHostOption": "Επιλέξτε έναν υπολογιστή...", - "keyDeployedSuccess": "Το κλειδί αναπτύχθηκε με επιτυχία", - "failedToDeployKey2": "Αποτυχία ανάπτυξης κλειδιού", - "deletedCount": "Διαγράφηκαν {{count}} κεντρικοί υπολογιστές", - "failedToDeleteCount": "Αποτυχία διαγραφής {{count}} hosts", - "duplicatedHost": "Διπλότυπο \"{{name}}\"", - "failedToDuplicateHost": "Αποτυχία αντιγραφής κεντρικού υπολογιστή", - "updatedCount": "Ενημερώθηκαν οι {{count}} hosts", - "friendlyNameLabel": "Φιλικό Όνομα", - "descriptionLabel": "Περιγραφή", - "loadingHost": "Φόρτωση κεντρικού υπολογιστή...", - "loadingHosts": "Φόρτωση κεντρικών υπολογιστών...", - "loadingCredentials": "Φόρτωση διαπιστευτηρίων...", - "noHostsYet": "Κανένας υπολογιστής ακόμα", - "noHostsMatchSearch": "Κανένας υπολογιστής δεν ταιριάζει με την αναζήτησή σας", - "hostNotFound": "Δεν βρέθηκε υπολογιστής", - "searchHosts": "Αναζήτηση υπολογιστών...", + "moveMenu": "Κίνηση", + "connectSelected": "Connect", + "cancelSelection": "Ματαίωση", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Ταξινόμηση κεντρικών υπολογιστών", "sortDefault": "Προεπιλεγμένη παραγγελία", "sortNameAsc": "Όνομα (Α → Ω)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Σήραγγα", "filterFeatureDocker": "Λιμενεργάτης", "filterTagsGroup": "Ετικέτες", - "shareHost": "Κοινοποίηση Διακομιστή", - "shareHostTitle": "Κοινή χρήση: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Αυτός ο υπολογιστής πρέπει να χρησιμοποιήσει ένα διαπιστευτήριο για να επιτρέψει την κοινή χρήση. Επεξεργαστείτε τον κεντρικό υπολογιστή και εκχωρήστε πρώτα ένα διαπιστευτήριο." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Σύνδεση", - "authentication": "Ταυτοποίηση", - "connectionSettings": "Ρυθμίσεις Σύνδεσης", - "displaySettings": "Ρυθμίσεις Εμφάνισης", - "audioSettings": "Ρυθμίσεις Ήχου", - "rdpPerformance": "Απόδοση RDP", - "deviceRedirection": "Ανακατεύθυνση Συσκευής", - "session": "Συνεδρία", - "gateway": "Πύλη", - "remoteApp": "Απομακρυσμένη Εφαρμογή", - "clipboard": "Πρόχειρο", - "sessionRecording": "Καταγραφή Συνεδρίας", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Πιστοποιητικό", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Ρυθμίσεις VNC", - "terminalSettings": "Ρυθμίσεις Τερματικού", - "rdpPort": "Θύρα RDP", - "username": "Όνομα Χρήστη", - "password": "Κωδικός", - "domain": "Τομέας", - "securityMode": "Λειτουργία Ασφαλείας", - "colorDepth": "Βάθος Χρώματος", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", + "password": "Σύνθημα", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Ύψος", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Μέθοδος Αλλαγή Μεγέθους", - "clientName": "Όνομα Πελάτη", - "initialProgram": "Αρχικό Πρόγραμμα", - "serverLayout": "Διάταξη Διακομιστή", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Θύρα Πύλης", - "gatewayUsername": "Όνομα Χρήστη Πύλης", - "gatewayPassword": "Κωδικός Πύλης", - "gatewayDomain": "Τομέας Πύλης", - "remoteAppProgram": "Πρόγραμμα Απομακρυσμένης Εφαρμογής", - "workingDirectory": "Κατάλογος Εργασίας", - "arguments": "Παράμετροι", - "normalizeLineEndings": "Κανονικοποίηση Καταχωρήσεων Γραμμής", - "recordingPath": "Διαδρομή Καταγραφής", - "recordingName": "Όνομα Εγγραφής", - "macAddress": "Διεύθυνση MAC", - "broadcastAddress": "Διεύθυνση Μετάδοσης", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Χρόνος Αναμονής (s)", - "driveName": "Όνομα Δίσκου", - "drivePath": "Διαδρομή Οδηγού", - "ignoreCertificate": "Αγνόηση Πιστοποιητικού", - "ignoreCertificateDesc": "Να επιτρέπονται συνδέσεις σε υπολογιστές με αυτο-υπογεγραμμένα πιστοποιητικά", - "forceLossless": "Εξαναγκασμός Απώλειας", - "forceLosslessDesc": "Εξαναγκασμός κωδικοποίησης χωρίς απώλειες εικόνας (υψηλότερη ποιότητα, μεγαλύτερο εύρος ζώνης)", - "disableAudio": "Απενεργοποίηση Ήχου", - "disableAudioDesc": "Σίγαση όλων των ήχων από την απομακρυσμένη συνεδρία", - "enableAudioInput": "Ενεργοποίηση Εισόδου Ήχου (Μικρόφωνο)", - "enableAudioInputDesc": "Προώθηση τοπικού μικροφώνου στην απομακρυσμένη συνεδρία", - "wallpaper": "Φόντο", - "wallpaperDesc": "Εμφάνιση ταπετσαρίας επιφάνειας εργασίας (η απενεργοποίηση βελτιώνει την απόδοση)", - "theming": "Θέμα", - "themingDesc": "Ενεργοποίηση οπτικών θεμάτων και στυλ", - "fontSmoothing": "Εξομάλυνση Γραμματοσειράς", - "fontSmoothingDesc": "Ενεργοποίηση απόδοσης γραμματοσειράς ClearType", - "fullWindowDrag": "Πλήρες Παράθυρο", - "fullWindowDragDesc": "Εμφάνιση περιεχομένων παραθύρου κατά το σύρσιμο", - "desktopComposition": "Σύνθεση Επιφάνειας Εργασίας", - "desktopCompositionDesc": "Ενεργοποίηση Aero glass effects", - "menuAnimations": "Εφέ Μενού", - "menuAnimationsDesc": "Ενεργοποίηση κίνησης ξεθωριάσματος μενού και σλάιντ", - "disableBitmapCaching": "Απενεργοποίηση Προσωρινής Αποθήκευσης Bitmap", - "disableBitmapCachingDesc": "Απενεργοποίηση προσωρινής μνήμης bitmap (μπορεί να βοηθήσει με δυσλειτουργίες)", - "disableOffscreenCaching": "Απενεργοποίηση Προσωρινής Αποθήκευσης Offscreen", - "disableOffscreenCachingDesc": "Απενεργοποίηση προσωρινής μνήμης εκτός οθόνης", - "disableGlyphCaching": "Απενεργοποίηση Προσωρινής Αποθήκευσης Glyph", - "disableGlyphCachingDesc": "Απενεργοποίηση glyph cache", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Χρήση αγωγού γραφικών RemoteFX", - "enablePrinting": "Ενεργοποίηση Εκτύπωσης", - "enablePrintingDesc": "Ανακατεύθυνση τοπικών εκτυπωτών στην απομακρυσμένη συνεδρία", - "enableDriveRedirection": "Ενεργοποίηση Ανακατεύθυνσης Δίσκου", - "enableDriveRedirectionDesc": "Αντιστοίχηση ενός τοπικού φακέλου ως μονάδας δίσκου στην απομακρυσμένη συνεδρία", - "createDrivePath": "Δημιουργία Διαδρομής Δίσκου", - "createDrivePathDesc": "Αυτόματη δημιουργία φακέλου αν δεν υπάρχει", - "disableDownload": "Απενεργοποίηση Λήψης", - "disableDownloadDesc": "Αποτροπή λήψης αρχείων από την απομακρυσμένη συνεδρία", - "disableUpload": "Απενεργοποίηση Αποστολής", - "disableUploadDesc": "Αποτροπή μεταφόρτωσης αρχείων στην απομακρυσμένη συνεδρία", - "enableTouch": "Ενεργοποίηση Αφής", - "enableTouchDesc": "Ενεργοποίηση προώθησης εισαγωγής αφής", - "consoleSession": "Συνεδρία Κονσόλας", - "consoleSessionDesc": "Σύνδεση στην κονσόλα (συνεδρία 0) αντί για μια νέα συνεδρία", - "sendWolPacket": "Αποστολή Πακέτου Wol", - "sendWolPacketDesc": "Στείλτε ένα μαγικό πακέτο για να ξυπνήσει αυτόν τον κεντρικό υπολογιστή πριν από τη σύνδεση", - "disableCopy": "Απενεργοποίηση Αντιγραφής", - "disableCopyDesc": "Αποτροπή αντιγραφής κειμένου από την απομακρυσμένη συνεδρία", - "disablePaste": "Απενεργοποίηση Επικόλλησης", - "disablePasteDesc": "Αποτροπή επικόλλησης κειμένου στην απομακρυσμένη συνεδρία", - "createPathIfMissing": "Δημιουργία διαδρομής αν Λείπει", - "createPathIfMissingDesc": "Αυτόματη δημιουργία του φακέλου εγγραφής", - "excludeOutput": "Εξαίρεση Εξόδου", - "excludeOutputDesc": "Να μην καταγράφεται η έξοδος οθόνης (μόνο μεταδεδομένα)", - "excludeMouse": "Εξαίρεση Ποντικιού", - "excludeMouseDesc": "Να μην καταγράφονται κινήσεις του ποντικιού", - "includeKeystrokes": "Συμπερίληψη Πλήκτρων", - "includeKeystrokesDesc": "Εγγραφή ακατέργαστων πληκτρολογίων εκτός από την έξοδο οθόνης", - "vncPort": "Θύρα VNC", - "vncPassword": "Κωδικός VNC", - "vncUsernameOptional": "Όνομα Χρήστη (Προαιρετικό)", - "vncLeaveBlank": "Αφήστε κενό εάν δεν απαιτείται", - "cursorMode": "Λειτουργία Δρομέα", - "swapRedBlue": "Εναλλαγή Κόκκινο/Μπλε", - "swapRedBlueDesc": "Εναλλαγή των καναλιών κόκκινου και μπλε χρώματος (διορθώνει ορισμένα ζητήματα χρώματος)", - "readOnly": "Μόνο για ανάγνωση", - "readOnlyDesc": "Δείτε την απομακρυσμένη οθόνη χωρίς να στείλετε καμία είσοδο", - "telnetPort": "Θύρα Telnet", - "terminalType": "Τύπος Τερματικού", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Θέμα Χρωμάτων", - "backspaceKey": "Κλειδί Backspace", - "saveHostFirst": "Αποθηκεύστε πρώτα τον κεντρικό υπολογιστή.", - "sharingOptionsAfterSave": "Οι επιλογές κοινής χρήσης είναι διαθέσιμες μετά την αποθήκευση του κεντρικού υπολογιστή.", - "sharingLoadError": "Αποτυχία φόρτωσης δεδομένων κοινής χρήσης. Ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά.", - "shareHostSection": "Κοινοποίηση Διακομιστή", - "shareWithUser": "Κοινή χρήση με το χρήστη", - "shareWithRole": "Κοινή χρήση με το ρόλο", - "selectUser": "Επιλογή Χρήστη", - "selectRole": "Επιλογή Ρόλου", - "selectUserOption": "Επιλέξτε έναν χρήστη...", - "selectRoleOption": "Επιλέξτε ένα ρόλο...", - "permissionLevel": "Επίπεδο Δικαιωμάτων", - "expiresInHours": "Λήγει σε (ώρες)", - "noExpiryPlaceholder": "Αφήστε κενό για να μην λήξει", - "shareBtn": "Κοινοποίηση", - "currentAccess": "Τρέχουσα Πρόσβαση", - "typeHeader": "Τύπος", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Άδεια", - "grantedByHeader": "Χορηγήθηκε Από", - "expiresHeader": "Λήγει", - "noAccessEntries": "Δεν υπάρχουν καταχωρήσεις πρόσβασης.", - "expiredLabel": "Έληξε", - "neverLabel": "Ποτέ", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Ακύρωση", - "savingBtn": "Αποθηκεύεται...", - "updateHostBtn": "Διακομιστής Ενημέρωσης", - "addHostBtn": "Προσθήκη Διακομιστή" + "cancelBtn": "Ματαίωση", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Αναζήτηση hosts, εντολών ή ρυθμίσεων...", - "quickActions": "Γρήγορες Ενέργειες", - "hostManager": "Διαχειριστής Υπολογιστών", - "hostManagerDesc": "Διαχείριση, προσθήκη ή επεξεργασία υπολογιστών", - "addNewHost": "Προσθήκη Νέου Διακομιστή", - "addNewHostDesc": "Εγγραφή νέου κεντρικού υπολογιστή", - "adminSettings": "Ρυθμίσεις Διαχειριστή", - "adminSettingsDesc": "Ρύθμιση προτιμήσεων συστήματος και χρηστών", - "userProfile": "Προφίλ Χρήστη", - "userProfileDesc": "Διαχειριστείτε το λογαριασμό σας και τις προτιμήσεις σας", - "addCredential": "Προσθήκη Διαπιστευτηρίου", - "addCredentialDesc": "Αποθήκευση SSH κλειδιών ή κωδικών πρόσβασης", - "recentActivity": "Πρόσφατη Δραστηριότητα", - "serversAndHosts": "Εξυπηρετητές & Υπολογιστές", - "noHostsFound": "Δεν βρέθηκαν υπολογιστές που να ταιριάζουν \"{{search}}\"", - "links": "Σύνδεσμοι", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Επιλογή", - "toggleWith": "Εναλλαγή με" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Δεν έχει ανατεθεί καρτέλα", + "noTabAssigned": "No tab assigned", "focusedPane": "Ενεργό παράθυρο" }, "connections": { "noConnections": "Δεν υπάρχουν συνδέσεις", "noConnectionsDesc": "Ανοίξτε ένα τερματικό, έναν διαχειριστή αρχείων ή μια απομακρυσμένη επιφάνεια εργασίας για να δείτε τις συνδέσεις εδώ", - "connectedFor": "Συνδεδεμένος για {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Συνδεδεμένος", "disconnected": "Ασύνδετος", "closeTab": "Κλείσιμο καρτέλας", @@ -801,358 +981,374 @@ "sectionBackground": "Φόντο", "backgroundDesc": "Οι συνεδρίες διαρκούν για 30 λεπτά μετά την αποσύνδεση και μπορούν να επανασυνδεθούν.", "persisted": "Επέμεινε στο παρασκήνιο", - "expiresIn": "Λήγει σε {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Αναζήτηση συνδέσεων...", - "noSearchResults": "Δεν υπάρχουν συνδέσεις που να αντιστοιχούν στην αναζήτησή σας" + "noSearchResults": "Δεν υπάρχουν συνδέσεις που να αντιστοιχούν στην αναζήτησή σας", + "rename": "Rename session" }, "guacamole": { - "connecting": "Σύνδεση σε συνεδρία {{type}}...", - "connectionError": "Σφάλμα σύνδεσης", - "connectionFailed": "Αποτυχία σύνδεσης", - "failedToConnect": "Αποτυχία λήψης διακριτικού σύνδεσης", - "hostNotFound": "Δεν βρέθηκε υπολογιστής", - "noHostSelected": "Δεν επιλέχθηκε κεντρικός υπολογιστής", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Η σύνδεση απέτυχε", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "Επανασύνδεση", - "retry": "Επανάληψη", - "guacdUnavailable": "Η υπηρεσία απομακρυσμένου υπολογιστή (guacd) δεν είναι διαθέσιμη. Παρακαλώ βεβαιωθείτε ότι το guacd λειτουργεί και είναι προσβάσιμο και ρυθμισμένο σωστά στις ρυθμίσεις διαχειριστή.", + "retry": "Δοκιμάζω πάλι", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Οθόνη Κλειδώματος)", - "winKey": "Κλειδί Παραθύρων", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", "shift": "Shift", "win": "Win", - "stickyActive": "{{key}} (μανωμένο - κάντε κλικ στην έκδοση)", - "stickyInactive": "{{key}} (κάντε κλικ για να κλειδώσετε)", - "esc": "Διαφυγής", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Αρχική", - "end": "Τέλος", - "pageUp": "Σελίδα Επάνω", - "pageDown": "Σελίδα Κάτω", - "arrowUp": "Βέλος Πάνω", - "arrowDown": "Βέλος Κάτω", - "arrowLeft": "Αριστερό Βέλος", - "arrowRight": "Βέλος Δεξιά", - "fnToggle": "Πλήκτρα Συναρτήσεων", - "reconnect": "Επανασύνδεση Συνεδρίας", - "collapse": "Σύμπτυξη γραμμής εργαλείων", - "expand": "Ανάπτυξη γραμμής εργαλείων", - "dragHandle": "Σύρετε για επανατοποθέτηση" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Σύνδεση στον εξυπηρετητή", - "clear": "Εκκαθάριση", - "paste": "Επικόλληση", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "Επανασύνδεση", - "connectionLost": "Η σύνδεση χάθηκε", - "connected": "Συνδεδεμένο", - "clipboardWriteFailed": "Αποτυχία αντιγραφής στο πρόχειρο. Βεβαιωθείτε ότι η σελίδα εξυπηρετείται μέσω HTTPS ή localhost.", - "clipboardReadFailed": "Αποτυχία ανάγνωσης από το πρόχειρο. Βεβαιωθείτε ότι έχουν χορηγηθεί δικαιώματα πρόχειρου.", - "clipboardHttpWarning": "Η Επικόλληση απαιτεί HTTPS. Χρησιμοποιήστε Ctrl+Shift+V ή εξυπηρετήστε Termix μέσω HTTPS.", - "unknownError": "Προέκυψε άγνωστο σφάλμα", - "websocketError": "Σφάλμα σύνδεσης WebSocket", - "connecting": "Σύνδεση...", - "noHostSelected": "Δεν επιλέχθηκε κεντρικός υπολογιστής", - "reconnecting": "Επανασύνδεση... ({{attempt}}/{{max}})", - "reconnected": "Επιτυχής επανασύνδεση", - "tmuxSessionCreated": "δημιουργήθηκε η συνεδρία tmux: {{name}}", - "tmuxSessionAttached": "Συνεδρία tmux επισυνάπτεται: {{name}}", - "tmuxUnavailable": "το tmux δεν είναι εγκατεστημένο στον απομακρυσμένο υπολογιστή, επιστρέφοντας στο τυπικό κέλυφος", - "tmuxSessionPickerTitle": "συνεδρίες tmux", - "tmuxSessionPickerDesc": "Υπάρχουσες συνεδρίες tmux που βρέθηκαν σε αυτόν τον υπολογιστή. Επιλέξτε μία για να επαναφέρετε ή να δημιουργήσετε μια νέα συνεδρία.", - "tmuxWindows": "Παράθυρα", - "tmuxWindowCount": "παράθυρο {{count}}", - "tmuxAttached": "Συνημμένοι πελάτες", - "tmuxAttachedCount": "{{count}} επισυνάπτεται", - "tmuxLastActivity": "Τελευταία δραστηριότητα", - "tmuxTimeJustNow": "μόλις τώρα", - "tmuxTimeMinutes": "{{count}}m πριν", - "tmuxTimeHours": "{{count}}h πριν", - "tmuxTimeDays": "{{count}}πριν από ημέρες", - "tmuxCreateNew": "Έναρξη νέας συνεδρίας", - "tmuxCopyHint": "Προσαρμόστε την επιλογή και πατήστε Enter για αντιγραφή στο πρόχειρο", - "tmuxDetach": "Αποσύνδεση από τη συνεδρία tmux", - "tmuxDetached": "Αποκλεισμένο από τη συνεδρία tmux", - "maxReconnectAttemptsReached": "Επιτεύχθηκαν μέγιστες προσπάθειες επανασύνδεσης", - "closeTab": "Κλείσιμο", - "connectionTimeout": "Χρονικό όριο σύνδεσης", - "terminalTitle": "Τερματικό - {{host}}", - "terminalWithPath": "Τερματικό - {{host}}:{{path}}", - "runTitle": "Εκτέλεση {{command}} - {{host}}", - "totpRequired": "Απαιτείται Έλεγχος Ταυτότητας Δύο Παραγόντων", - "totpCodeLabel": "Κωδικός Επαλήθευσης", - "totpVerify": "Επαλήθευση", - "warpgateAuthRequired": "Απαιτείται Πιστοποίηση Warpgate", - "warpgateSecurityKey": "Κλειδί Ασφαλείας", - "warpgateAuthUrl": "URL Ταυτοποίησης", - "warpgateOpenBrowser": "Άνοιγμα σε περιηγητή", - "warpgateContinue": "Έχω Ολοκληρώσει την Πιστοποίηση", - "opksshAuthRequired": "Απαιτείται Πιστοποίηση OPKSSH", - "opksshAuthDescription": "Πλήρης ταυτοποίηση στο πρόγραμμα περιήγησής σας για να συνεχίσετε. Αυτή η συνεδρία θα παραμείνει έγκυρη για 24 ώρες.", - "opksshOpenBrowser": "Άνοιγμα περιηγητή για έλεγχο ταυτότητας", - "opksshWaitingForAuth": "Αναμονή για έλεγχο ταυτότητας στο πρόγραμμα περιήγησης...", - "opksshAuthenticating": "Επεξεργασία ταυτοποίησης...", - "opksshTimeout": "Λήξη χρονικού ορίου επαλήθευσης. Παρακαλώ προσπαθήστε ξανά.", - "opksshAuthFailed": "Ο έλεγχος ταυτότητας απέτυχε. Παρακαλώ ελέγξτε τα στοιχεία σας και προσπαθήστε ξανά.", - "opksshSignInWith": "Σύνδεση με {{provider}}", - "sudoPasswordPopupTitle": "Εισαγωγή Κωδικού Πρόσβασης?", - "websocketAbnormalClose": "Η σύνδεση έκλεισε απροσδόκητα. Αυτό μπορεί να οφείλεται σε πρόβλημα αντίστροφης διαμεσολάβησης ή ρύθμισης SSL. Παρακαλώ ελέγξτε τα αρχεία καταγραφής διακομιστή.", - "connectionLogTitle": "Αρχείο Καταγραφής Σύνδεσης", - "connectionLogCopy": "Αντιγραφή αρχείων καταγραφής στο πρόχειρο", - "connectionLogEmpty": "Δεν υπάρχουν αρχεία καταγραφής σύνδεσης ακόμα", - "connectionLogWaiting": "Αναμονή για αρχεία καταγραφής σύνδεσης...", - "connectionLogCopied": "Η σύνδεση καταγραφής αντιγράφηκε στο πρόχειρο", - "connectionLogCopyFailed": "Αποτυχία αντιγραφής αρχείων καταγραφής στο πρόχειρο", - "connectionRejected": "Η σύνδεση απορρίφθηκε από το διακομιστή. Παρακαλώ ελέγξτε τον έλεγχο ταυτότητας και τις ρυθμίσεις δικτύου.", - "hostKeyRejected": "Η επαλήθευση SSH κεντρικού υπολογιστή απορρίφθηκε. Η σύνδεση ακυρώθηκε.", - "sessionTakenOver": "Η συνεδρία άνοιξε σε άλλη καρτέλα. Επανασύνδεση..." + "connectionLost": "Connection lost", + "connected": "Συνδεδεμένος", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Ανοιχτό", + "linkDialogCopy": "Αντίγραφο", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Διαίρεση καρτέλας", + "addToSplit": "Προσθήκη στο Split", + "removeFromSplit": "Αφαίρεση από το Σπλιτ" + } }, "fileManager": { - "noHostSelected": "Δεν επιλέχθηκε κεντρικός υπολογιστής", - "initializingEditor": "Αρχικοποίηση επεξεργαστή...", - "file": "Αρχείο", - "folder": "Φάκελος", - "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": "Μετονομασία", - "uploading": "Μεταφόρτωση...", - "uploadingFile": "Μεταφόρτωση {{name}}...", - "fileName": "Όνομα Αρχείου", - "folderName": "Όνομα Φακέλου", - "fileUploadedSuccessfully": "Αρχείο \"{{name}}\" μεταφορτώθηκε επιτυχώς", - "failedToUploadFile": "Αποτυχία μεταφόρτωσης αρχείου", - "fileDownloadedSuccessfully": "Αρχείο \"{{name}}\" κατεβασμένο επιτυχώς", - "failedToDownloadFile": "Αποτυχία λήψης αρχείου", - "fileCreatedSuccessfully": "Αρχείο \"{{name}}\" δημιουργήθηκε με επιτυχία", - "folderCreatedSuccessfully": "Ο φάκελος \"{{name}}\" δημιουργήθηκε με επιτυχία", - "failedToCreateItem": "Αποτυχία δημιουργίας στοιχείου", - "operationFailed": "{{operation}} λειτουργία απέτυχε για {{name}}: {{error}}", - "failedToResolveSymlink": "Αποτυχία επίλυσης συντόμευσης", - "itemsDeletedSuccessfully": "{{count}} στοιχεία διαγράφηκαν με επιτυχία", - "failedToDeleteItems": "Αποτυχία διαγραφής στοιχείων", - "sudoPasswordRequired": "Απαιτείται Κωδικός Διαχειριστή", - "enterSudoPassword": "Εισάγετε sudo password για να συνεχίσετε αυτή τη λειτουργία", - "sudoPassword": "Κωδικός πρόσβασης Sudo", - "sudoOperationFailed": "Η επιχείρηση Sudo απέτυχε", - "sudoAuthFailed": "Ο έλεγχος ταυτότητας Sudo απέτυχε", - "dragFilesToUpload": "Αποθέστε αρχεία εδώ για μεταφόρτωση", - "emptyFolder": "Αυτός ο φάκελος είναι κενός", - "searchFiles": "Αναζήτηση αρχείων...", - "upload": "Ανέβασμα", - "selectHostToStart": "Επιλέξτε έναν εξυπηρετητή για να ξεκινήσετε τη διαχείριση αρχείων", - "sshRequiredForFileManager": "Ο διαχειριστής αρχείων απαιτεί SSH. Αυτός ο υπολογιστής δεν έχει SSH ενεργοποιημένο.", - "failedToConnect": "Αποτυχία σύνδεσης στο SSH", - "failedToLoadDirectory": "Αποτυχία φόρτωσης φακέλου", - "noSSHConnection": "Δεν υπάρχει διαθέσιμη σύνδεση SSH", - "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}}?", - "permissionDenied": "Άρνηση πρόσβασης", - "serverError": "Σφάλμα Διακομιστή", - "fileSavedSuccessfully": "Το αρχείο αποθηκεύτηκε επιτυχώς", - "failedToSaveFile": "Αποτυχία αποθήκευσης αρχείου", - "confirmDeleteSingleItem": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα \"{{name}}\"?", - "confirmDeleteMultipleItems": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα {{count}} αντικείμενα?", - "confirmDeleteMultipleItemsWithFolders": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα {{count}} αντικείμενα? Αυτό περιλαμβάνει φακέλους και τα περιεχόμενά τους.", - "confirmDeleteFolder": "Είστε βέβαιοι ότι θέλετε να διαγράψετε οριστικά τον φάκελο \"{{name}}\" και όλα τα περιεχόμενά του;", - "permanentDeleteWarning": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Το αντικείμενο(α) θα διαγραφεί οριστικά από το διακομιστή.", - "recent": "Πρόσφατα", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Αντίγραφο", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Καρφιτσωμένο", - "folderShortcuts": "Συντομεύσεις Φακέλου", - "failedToReconnectSSH": "Αποτυχία επανασύνδεσης SSH συνεδρίας", - "openTerminalHere": "Άνοιγμα Τερματικού Εδώ", - "run": "Εκτέλεση", - "openTerminalInFolder": "Άνοιγμα τερματικού σε αυτόν τον φάκελο", - "openTerminalInFileLocation": "Άνοιγμα τερματικού στην τοποθεσία αρχείου", - "runningFile": "Τρέξιμο - {{file}}", - "onlyRunExecutableFiles": "Μπορέστε να εκτελέσετε μόνο εκτελέσιμα αρχεία", - "directories": "Κατάλογοι", - "removedFromRecentFiles": "Αφαιρέθηκε το \"{{name}}\" από τα πρόσφατα αρχεία", - "removeFailed": "Αποτυχία κατάργησης", - "unpinnedSuccessfully": "Unpinned \"{{name}}\" επιτυχώς", - "unpinFailed": "Αποτυχία αποσύνδεσης", - "removedShortcut": "Αφαιρέθηκε συντόμευση \"{{name}}\"", - "removeShortcutFailed": "Κατάργηση συντόμευσης απέτυχε", - "clearedAllRecentFiles": "Εκκαθάριση όλων των πρόσφατων αρχείων", - "clearFailed": "Αποτυχία εκκαθάρισης", - "removeFromRecentFiles": "Αφαίρεση από τα πρόσφατα αρχεία", - "clearAllRecentFiles": "Εκκαθάριση όλων των πρόσφατων αρχείων", - "unpinFile": "Ξεκαρφίτσωμα αρχείου", - "removeShortcut": "Αφαίρεση συντόμευσης", - "pinFile": "Καρφίτσωμα αρχείου", - "addToShortcuts": "Προσθήκη στις συντομεύσεις", - "pasteFailed": "Η επικόλληση απέτυχε", - "noUndoableActions": "Καμία μη αναιρέσιμη ενέργεια", - "undoCopySuccess": "Αναίρεση λειτουργίας αντιγραφής: Διαγράφηκαν {{count}} αντιγραμμένα αρχεία", - "undoCopyFailedDelete": "Αποτυχία αναίρεσης: Δεν ήταν δυνατή η διαγραφή αντιγραμμένων αρχείων", - "undoCopyFailedNoInfo": "Αποτυχία αναίρεσης: Αδυναμία εύρεσης αντιγραμμένων πληροφοριών αρχείου", - "undoMoveSuccess": "Undid move operation: Μετακινήθηκε {{count}} αρχεία πίσω στην αρχική τοποθεσία", - "undoMoveFailedMove": "Αποτυχία αναίρεσης: Δεν ήταν δυνατή η μετακίνηση αρχείων πίσω", - "undoMoveFailedNoInfo": "Αποτυχία αναίρεσης: Αδυναμία εύρεσης πληροφοριών αρχείου που μετακινήθηκαν", - "undoDeleteNotSupported": "Η λειτουργία διαγραφής δεν μπορεί να αναιρεθεί: Τα αρχεία έχουν διαγραφεί οριστικά από το διακομιστή", - "undoTypeNotSupported": "Μη υποστηριζόμενος τύπος λειτουργίας αναίρεσης", - "undoOperationFailed": "Η λειτουργία αναίρεσης απέτυχε", - "unknownError": "Άγνωστο σφάλμα", - "confirm": "Επιβεβαίωση", - "find": "Εύρεση...", - "replace": "Αντικατάσταση", - "downloadInstead": "Λήψη Αντ 'αυτού", - "keyboardShortcuts": "Συντομεύσεις Πληκτρολογίου", - "searchAndReplace": "Αναζήτηση & Αντικατάσταση", - "editing": "Επεξεργασία", - "search": "Αναζήτηση", - "findNext": "Εύρεση Επόμενου", - "findPrevious": "Εύρεση Προηγούμενου", - "save": "Αποθήκευση", - "selectAll": "Επιλογή Όλων", - "undo": "Αναίρεση", - "redo": "Επανάληψη", - "moveLineUp": "Μετακίνηση Γραμμής Πάνω", - "moveLineDown": "Μετακίνηση Γραμμής Κάτω", - "toggleComment": "Εναλλαγή Σχολίου", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Τρέξιμο", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Αποτυχία φόρτωσης εικόνας", - "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": "Νέος Φάκελος", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Επιτυχής μετακίνηση {{count}} στοιχείων στο {{target}}", - "move": "Μετακίνηση", - "searchInFile": "Αναζήτηση σε αρχείο (Ctrl+F)", - "showKeyboardShortcuts": "Εμφάνιση συντομεύσεων πληκτρολογίου", - "startWritingMarkdown": "Αρχίστε να γράφετε το περιεχόμενό σας markdown...", - "loadingFileComparison": "Φόρτωση σύγκρισης αρχείου...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Κίνηση", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Σύγκριση", - "sideBySide": "Πλευρά δίπλα", - "inline": "Εμβόλιμο", - "fileComparison": "Σύγκριση αρχείων: {{file1}} vs {{file2}}", - "fileTooLarge": "Πολύ μεγάλο αρχείο: {{error}}", - "sshConnectionFailed": "Αποτυχία σύνδεσης SSH. Παρακαλώ ελέγξτε τη σύνδεσή σας στο {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Απέτυχε η φόρτωση του αρχείου: {{error}}", - "connecting": "Σύνδεση...", - "connectedSuccessfully": "Επιτυχής σύνδεση", - "totpVerificationFailed": "Αποτυχία επαλήθευσης TOTP", - "warpgateVerificationFailed": "Η ταυτοποίηση Warpgate απέτυχε", - "authenticationFailed": "Αποτυχία ταυτοποίησης", - "verificationCodePrompt": "Κωδικός επιβεβαίωσης:", - "changePermissions": "Αλλαγή Δικαιωμάτων", - "currentPermissions": "Τρέχοντα Δικαιώματα", - "owner": "Ιδιοκτήτης", - "group": "Ομάδα", - "others": "Άλλα", - "read": "Ανάγνωση", - "write": "Εγγραφή", - "execute": "Εκτέλεση", - "permissionsChangedSuccessfully": "Τα δικαιώματα άλλαξαν επιτυχώς", - "failedToChangePermissions": "Αποτυχία αλλαγής δικαιωμάτων", - "name": "Όνομα", - "sortByName": "Όνομα", - "sortByDate": "Ημερομηνία Τροποποίησης", - "sortBySize": "Μέγεθος", - "ascending": "Αύξουσα", - "descending": "Φθίνουσα", - "root": "Ρίζα", - "new": "Νέο", - "sortBy": "Ταξινόμηση Κατά", - "items": "Στοιχεία", - "selected": "Επιλεγμένο", - "editor": "Επεξεργαστής", - "octal": "Οκταδική", - "storage": "Αποθήκευση", - "disk": "Δίσκος", - "used": "Χρησιμοποιείται", - "of": "από", - "toggleSidebar": "Εναλλαγή Πλευρικής Μπάρας", - "cannotLoadPdf": "Αδυναμία φόρτωσης PDF", - "pdfLoadError": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση αυτού του αρχείου PDF.", - "loadingPdf": "Φόρτωση PDF...", - "loadingPage": "Φόρτωση σελίδας..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Αντιγραφή στον κεντρικό υπολογιστή…", - "moveToHost": "Μετακίνηση στον κεντρικό υπολογιστή…", - "copyItemsToHost": "Αντιγραφή στοιχείων {{count}} για φιλοξενία…", - "moveItemsToHost": "Μετακίνηση στοιχείων {{count}} για φιλοξενία…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Δεν υπάρχουν άλλοι διαθέσιμοι κεντρικοί υπολογιστές διαχείρισης αρχείων.", "noHostsConnectedHint": "Προσθέστε έναν άλλο κεντρικό υπολογιστή SSH με ενεργοποιημένο το File Manager στο Host Manager.", "selectDestinationHost": "Επιλέξτε κεντρικό υπολογιστή προορισμού", @@ -1164,48 +1360,48 @@ "browseDestination": "Περιήγηση ή εισαγωγή διαδρομής", "confirmCopy": "Αντίγραφο", "confirmMove": "Κίνηση", - "transferring": "Μεταφορά…", - "compressing": "Συμπίεση…", - "extracting": "Εξαγωγή…", - "transferringItems": "Μεταφορά {{current}} από {{total}} στοιχεία…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Η μεταφορά ολοκληρώθηκε", "transferError": "Η μεταφορά απέτυχε", - "transferPartial": "Η μεταφορά ολοκληρώθηκε με σφάλματα {{count}}", - "transferPartialHint": "Δεν ήταν δυνατή η μεταφορά: {{paths}}", - "itemsSummary": "{{count}} στοιχεία", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Ο προορισμός πρέπει να είναι ένας κατάλογος για μεταφορές πολλαπλών στοιχείων", "selectThisFolder": "Επιλέξτε αυτόν τον φάκελο", "browsePathWillBeCreated": "Αυτός ο φάκελος δεν υπάρχει ακόμη. Θα δημιουργηθεί όταν ξεκινήσει η μεταφορά.", "browsePathError": "Δεν ήταν δυνατό το άνοιγμα αυτής της διαδρομής στον κεντρικό υπολογιστή προορισμού.", "goUp": "Ανεβαίνω", - "copyFolderToHost": "Αντιγραφή φακέλου στον κεντρικό υπολογιστή…", - "moveFolderToHost": "Μετακίνηση φακέλου στον κεντρικό υπολογιστή…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Ετοιμος", - "hostConnecting": "Σύνδεση…", + "hostConnecting": "Connecting…", "hostDisconnected": "Δεν είναι συνδεδεμένο", "hostAuthRequired": "Απαιτείται έλεγχος ταυτότητας — ανοίξτε πρώτα τη Διαχείριση αρχείων σε αυτόν τον κεντρικό υπολογιστή", "hostConnectionFailed": "Η σύνδεση απέτυχε", "metricsTitle": "Χρόνοι μεταφοράς", - "metricsPrepare": "Προετοιμασία προορισμού: {{duration}}", - "metricsCompress": "Συμπίεση στην πηγή: {{duration}}", - "metricsHopSourceRead": "Πηγή → διακομιστής: {{throughput}}", - "metricsHopDestSftpWrite": "Διακομιστής → προορισμός (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Διακομιστής → προορισμός (τοπικός): {{throughput}}", - "metricsTransfer": "Από άκρο σε άκρο: {{throughput}} ({{duration}})", - "metricsExtract": "Εξαγωγή στον προορισμό: {{duration}}", - "metricsSourceDelete": "Αφαίρεση από την πηγή: {{duration}}", - "metricsTotal": "Σύνολο: {{duration}}", - "progressCompressing": "Συμπίεση στον κεντρικό υπολογιστή προέλευσης…", - "progressExtracting": "Εξαγωγή στον προορισμό…", - "progressTransferring": "Μεταφορά δεδομένων…", - "progressReconnecting": "Επανασύνδεση…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Παράλληλες λωρίδες μετεπιβίβασης", - "parallelSegmentsOption": "{{count}} λωρίδες", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Τα μεγάλα αρχεία χωρίζονται σε κομμάτια των 256 MB. Πολλαπλές λωρίδες χρησιμοποιούν ξεχωριστές συνδέσεις (όπως η έναρξη αρκετών μεταφορών) για υψηλότερη συνολική απόδοση.", - "progressTotalSpeed": "{{speed}} σύνολο ({{lanes}} λωρίδες)", - "progressTransferringItems": "Μεταφορά αρχείων ({{current}} από {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} αρχεία", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Τα αρχεία προέλευσης διατηρούνται (μερική μεταφορά)", "jumpHostLimitation": "Και οι δύο κεντρικοί υπολογιστές πρέπει να είναι προσβάσιμοι από τον διακομιστή Termix. Δεν υποστηρίζεται η άμεση δρομολόγηση από κεντρικό υπολογιστή σε κεντρικό υπολογιστή.", "cancel": "Ματαίωση", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Επιλέγει SFTP tar ή ανά αρχείο με βάση τον αριθμό αρχείων, το μέγεθος και τη συμπιεστότητα. Τα μεμονωμένα αρχεία χρησιμοποιούν πάντα SFTP ροής.", "methodTarHint": "Συμπίεση στην πηγή, μεταφορά ενός αρχείου, εξαγωγή στον προορισμό. Απαιτείται tar και στους δύο κεντρικούς υπολογιστές Unix.", "methodItemSftpHint": "Μεταφέρετε κάθε αρχείο ξεχωριστά μέσω SFTP. Λειτουργεί σε όλους τους κεντρικούς υπολογιστές, συμπεριλαμβανομένων των Windows.", - "methodPreviewLoading": "Υπολογισμός μεθόδου μεταφοράς…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Δεν ήταν δυνατή η προεπισκόπηση της μεθόδου μεταφοράς. Ο διακομιστής θα επιλέξει μια μέθοδο κατά την εκκίνηση.", "methodPreviewWillUseTar": "Θα χρησιμοποιηθεί: Αρχείο Tar", "methodPreviewWillUseItemSftp": "Θα χρησιμοποιηθεί: SFTP ανά αρχείο", - "methodPreviewScanSummary": "{{fileCount}} αρχεία, {{totalSize}} συνολικά (σαρωμένα στον κεντρικό υπολογιστή προέλευσης).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Κάθε αρχείο χρησιμοποιεί την ίδια ροή SFTP ως αντίγραφο ενός μόνο αρχείου, το ένα μετά το άλλο. Η πρόοδος συνδυάζεται σε όλα τα αρχεία, επομένως η γραμμή κινείται αργά κατά τη διάρκεια μεγάλων αρχείων.", "methodReason": { "user_item_sftp": "Επιλέξατε SFTP ανά αρχείο.", "user_tar": "Επιλέξατε το αρχείο tar.", "tar_unavailable": "Το Tar δεν είναι διαθέσιμο σε έναν ή και στους δύο κεντρικούς υπολογιστές — θα χρησιμοποιηθεί αντ' αυτού το SFTP ανά αρχείο.", "windows_host": "Εμπλέκεται ένας κεντρικός υπολογιστής των Windows — δεν χρησιμοποιείται το tar.", - "auto_multi_large": "Αυτόματα: πολλά αρχεία, συμπεριλαμβανομένου ενός μεγάλου αρχείου ({{largestSize}}) με συμπιέσιμα δεδομένα — tar ομαδοποιεί σε μία μεταφορά.", - "auto_single_large_in_archive": "Αυτόματα: ένα μεγάλο αρχείο ({{largestSize}}) σε αυτό το σύνολο — ανά αρχείο SFTP.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Αυτόματα: ως επί το πλείστον ασυμπίεστα δεδομένα — SFTP ανά αρχείο.", - "auto_many_files": "Αυτόματα: πολλά αρχεία ({{fileCount}}) — το tar μειώνει την επιβάρυνση ανά αρχείο.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Αυτόματα: SFTP ανά αρχείο για αυτό το σύνολο." }, "progressCancel": "Ματαίωση", - "progressCancelling": "Ακύρωση…", + "progressCancelling": "Cancelling…", "progressStalled": "Σταματημένο", "resumedHint": "Επανασύνδεση με μια ενεργή μεταφορά που ξεκίνησε σε άλλο παράθυρο.", "transferCancelled": "Η μεταφορά ακυρώθηκε.", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Μερικά δεδομένα διατηρήθηκαν στον προορισμό. Η επανάληψη θα συνεχιστεί όταν αποκατασταθεί η σύνδεση." }, "tunnels": { - "noSshTunnels": "Χωρίς SSH Tunnels", - "createFirstTunnelMessage": "Δεν έχετε δημιουργήσει ακόμα SSH tunnel. Ρυθμίστε τις συνδέσεις tunnel στο Host Manager για να ξεκινήσετε.", - "connected": "Συνδεδεμένο", - "disconnected": "Αποσυνδέθηκε", - "connecting": "Σύνδεση...", - "error": "Σφάλμα", - "canceling": "Ακύρωση...", - "connect": "Σύνδεση", - "disconnect": "Αποσύνδεση", - "cancel": "Ακύρωση", - "port": "Θύρα", - "localPort": "Τοπική Θύρα", - "remotePort": "Απομακρυσμένη Θύρα", - "currentHostPort": "Τρέχουσα Θύρα Διακομιστή", - "endpointPort": "Θύρα Τελικού Σημείου", - "bindIp": "Τοπική IP", - "endpointSshConfig": "Ρύθμιση Τελικού Σημείου SSH", - "endpointSshHost": "Τελικός Διακομιστής SSH", - "endpointSshHostPlaceholder": "Επιλέξτε έναν ρυθμισμένο διακομιστή", - "endpointSshHostRequired": "Επιλέξτε έναν υπολογιστή SSH τελικού σημείου για κάθε δρομολόγηση υπολογιστή-πελάτη.", - "attempt": "Προσπάθεια {{current}} του {{max}}", - "nextRetryIn": "Επόμενη προσπάθεια σε {{seconds}} δευτερόλεπτα", - "clientTunnels": "Σήραγγες Πελάτη", - "clientTunnel": "Σήραγγα Πελάτη", - "addClientTunnel": "Προσθήκη Σήραγγας Πελάτη", - "noClientTunnels": "Δεν έχουν ρυθμιστεί σήραγγες πελάτη σε αυτήν την επιφάνεια εργασίας.", - "tunnelName": "Όνομα Tunnel", - "remoteHost": "Απομακρυσμένος Διακομιστής", - "autoStart": "Αυτόματη Εκκίνηση", - "clientAutoStartDesc": "Ξεκινά όταν ανοίγει αυτός ο υπολογιστής-πελάτης και παραμένει συνδεδεμένος.", - "clientManualStartDesc": "Χρησιμοποιήστε Έναρξη και Διακοπή από αυτή τη σειρά. Το Termix δεν θα το ανοίξει αυτόματα.", - "clientRemoteServerNote": "Η απομακρυσμένη προώθηση μπορεί να απαιτεί AllowTcpForwarding και GatewayPorts στον εξυπηρετητή τελικού σημείου SSH. Η απομακρυσμένη θύρα κλείνει όταν αποσυνδέεται αυτή η επιφάνεια εργασίας.", - "clientTunnelStarted": "Η σήραγγα πελάτη ξεκίνησε", - "clientTunnelStopped": "Η σήραγγα πελάτη σταμάτησε", - "tunnelTestSucceeded": "Επιτυχής δοκιμή σήραγγας", - "tunnelTestFailed": "Η δοκιμή σήραγγας απέτυχε", - "localSaved": "Οι σήραγγες πελατών αποθηκεύτηκαν", - "localSaveError": "Αποτυχία αποθήκευσης τοπικών tunnels πελάτη", - "invalidBindIp": "Η τοπική IP πρέπει να είναι μια έγκυρη διεύθυνση IPv4.", - "invalidLocalTargetIp": "Το τοπικό IP προορισμού πρέπει να είναι μια έγκυρη διεύθυνση IPv4.", - "invalidLocalPort": "Η τοπική θύρα πρέπει να είναι μεταξύ 1 και 65535.", - "invalidRemotePort": "Η απομακρυσμένη θύρα πρέπει να είναι μεταξύ 1 και 65535.", - "invalidLocalTargetPort": "Η τοπική θύρα προορισμού πρέπει να είναι μεταξύ 1 και 65535.", - "invalidEndpointPort": "Ο λιμένας τελικού σημείου πρέπει να είναι μεταξύ 1 και 65535.", - "duplicateAutoStartBind": "Μόνο μία αυτόματη εκκίνηση tunnel πελάτη μπορεί να χρησιμοποιήσει το {{bind}}.", - "manualControlError": "Αποτυχία ενημέρωσης κατάστασης διοχέτευσης.", - "active": "Ενεργό", - "start": "Έναρξη", - "stop": "Διακοπή", - "test": "Δοκιμή", - "type": "Τύπος Tunnel", - "typeLocal": "Τοπικό (-L)", - "typeRemote": "Απομακρυσμένο (-R)", - "typeDynamic": "Δυναμικό (-D)", - "typeServerLocalDesc": "Τρέχων υπολογιστής στο τελικό σημείο.", - "typeServerRemoteDesc": "Τελικό σημείο πίσω στον τρέχοντα υπολογιστή.", - "typeClientLocalDesc": "Τοπικός υπολογιστής στο τελικό σημείο.", - "typeClientRemoteDesc": "Τελικό σημείο πίσω στον τοπικό υπολογιστή.", - "typeClientDynamicDesc": "SOCKS στον τοπικό υπολογιστή.", - "typeDynamicDesc": "Προώθηση κίνησης SOCKS5 ΣΥΝΔΕΣΗΣ μέσω SSH", - "forwardDescriptionServerLocal": "Τρέχων κεντρικός υπολογιστής {{sourcePort}} → endpoint {{endpointPort}}.", - "forwardDescriptionServerRemote": "Τελικό σημείο {{endpointPort}} → τρέχων κεντρικός υπολογιστής {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS στον τρέχοντα κεντρικό υπολογιστή {{sourcePort}}.", - "forwardDescriptionClientLocal": "Τοπικό {{sourcePort}} → remote {{endpointPort}}.", - "forwardDescriptionClientRemote": "Απομακρυσμένο {{sourcePort}} → τοπικό {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS στο τοπικό λιμάνι {{sourcePort}}.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Συνδεδεμένος", + "disconnected": "Ασύνδετος", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Ματαίωση", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS μέσω {{endpoint}}", - "autoNameClientLocal": "Τοπικό {{localPort}} → {{endpoint}} {{remotePort}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", - "autoNameClientDynamic": "SOCKS {{localPort}} μέσω {{endpoint}}", - "route": "Διαδρομή:", - "lastStarted": "Τελευταία εκκίνηση", - "lastTested": "Τελευταία δοκιμή", - "lastError": "Τελευταίο σφάλμα", - "maxRetries": "Μέγιστες Επαναλήψεις", - "maxRetriesDescription": "Μέγιστος αριθμός προσπαθειών επανάληψης.", - "retryInterval": "Διάστημα Επανάληψη (δευτερόλεπτα)", - "retryIntervalDescription": "Χρόνος αναμονής μεταξύ προσπαθειών επανάληψης.", - "local": "Τοπικό", - "remote": "Απομακρυσμένο", - "destination": "Προορισμός", - "host": "Διακομιστής", - "mode": "Λειτουργία", - "noHostSelected": "Δεν επιλέχθηκε κεντρικός υπολογιστής", - "working": "Εργάζεται..." + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "Επεξεργαστής", - "memory": "Μνήμη", - "disk": "Δίσκος", - "network": "Δίκτυο", - "uptime": "Χρόνος", - "processes": "Διεργασίες", - "available": "Διαθέσιμο", - "free": "Δωρεάν", - "connecting": "Σύνδεση...", - "connectionFailed": "Αποτυχία σύνδεσης με το διακομιστή", - "naCpus": "Δ/Α ΚΜΕ", - "cpuCores_one": "{{count}} Πυρήνας", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Χρήση CPU", - "memoryUsage": "Χρήση Μνήμης", - "diskUsage": "Χρήση Δίσκου", - "failedToFetchHostConfig": "Αποτυχία ανάκτησης ρύθμισης παραμέτρων κεντρικού υπολογιστή", - "serverOffline": "Διακομιστής Χωρίς Σύνδεση", - "cannotFetchMetrics": "Αδυναμία λήψης μετρήσεων από διακομιστή εκτός σύνδεσης", - "totpFailed": "Αποτυχία επαλήθευσης TOTP", - "noneAuthNotSupported": "Τα Στατιστικά Διακομιστή δεν υποστηρίζουν τύπο ελέγχου ταυτότητας 'none'.", - "load": "Φόρτωση", - "systemInfo": "Πληροφορίες Συστήματος", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Λειτουργικό Σύστημα", - "kernel": "Πυρήνας", - "seconds": "δευτερόλεπτα", - "networkInterfaces": "Διεπαφές Δικτύου", - "noInterfacesFound": "Δεν βρέθηκαν διεπαφές δικτύου", - "noProcessesFound": "Δεν βρέθηκαν διεργασίες", - "loginStats": "Στατιστικά Σύνδεσης SSH", - "noRecentLoginData": "Δεν υπάρχουν πρόσφατα δεδομένα σύνδεσης", - "executingQuickAction": "Εκτέλεση {{name}}...", - "quickActionSuccess": "{{name}} ολοκληρώθηκε με επιτυχία", - "quickActionFailed": "{{name}} απέτυχε", - "quickActionError": "Απέτυχε η εκτέλεση του {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Θύρες Ακρόασης", - "protocol": "Protocol", - "port": "Θύρα", - "address": "Διεύθυνση", - "process": "Διεργασία", - "noData": "Δεν υπάρχουν δεδομένα θυρών ακρόασης" + "title": "Listening Ports", + "protocol": "Πρωτόκολλο", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Τείχος Προστασίας", - "inactive": "Ανενεργό", - "policy": "Πολιτική", - "rules": "κανόνες", - "noData": "Δεν υπάρχουν διαθέσιμα δεδομένα τείχους προστασίας", - "action": "Ενέργεια", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Θύρα", - "source": "Πηγή", - "anywhere": "Οπουδήποτε" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Μέση Φόρτωση", - "swap": "Εναλλαγή", - "architecture": "Αρχιτεκτονική", - "refresh": "Ανανέωση", - "retry": "Επανάληψη" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Δοκιμάζω πάλι", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Τρέξιμο", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Αυτοφιλοξενούμενη διαχείριση SSH και απομακρυσμένης επιφάνειας εργασίας", - "loginTitle": "Συνδεθείτε στο Termix", - "registerTitle": "Δημιουργία Λογαριασμού", - "forgotPassword": "Ξεχάσατε Τον Κωδικό Πρόσβασης?", - "rememberMe": "Απομνημόνευση συσκευής για 30 ημέρες (περιλαμβάνει TOTP)", - "noAccount": "Δεν έχετε λογαριασμό?", - "hasAccount": "Έχετε ήδη λογαριασμό?", - "twoFactorAuth": "Έλεγχος Ταυτότητας Δύο Παραγόντων", - "enterCode": "Εισάγετε τον κωδικό επαλήθευσης", - "backupCode": "Ή χρησιμοποιήστε εφεδρικό κωδικό", - "verifyCode": "Επαλήθευση Κωδικού", - "redirectingToApp": "Ανακατεύθυνση στην εφαρμογή...", - "sshAuthenticationRequired": "Απαιτείται Πιστοποίηση SSH", - "sshNoKeyboardInteractive": "Διαδραστική Πιστοποίηση Πληκτρολογίου Μη Διαθέσιμη", - "sshAuthenticationFailed": "Αποτυχία Ταυτοποίησης", - "sshAuthenticationTimeout": "Χρονικό Όριο Ταυτοποίησης", - "sshNoKeyboardInteractiveDescription": "Ο διακομιστής δεν υποστηρίζει έλεγχο ταυτότητας διαδραστικού πληκτρολογίου. Παρακαλώ δώστε τον κωδικό σας ή το SSH κλειδί.", - "sshAuthFailedDescription": "Τα παρεχόμενα διαπιστευτήρια ήταν εσφαλμένα. Παρακαλώ δοκιμάστε ξανά με έγκυρα διαπιστευτήρια.", - "sshTimeoutDescription": "Λήξη χρονικού ορίου προσπάθειας ταυτοποίησης. Παρακαλώ δοκιμάστε ξανά.", - "sshProvideCredentialsDescription": "Παρακαλώ δώστε τα SSH διαπιστευτήρια σας για να συνδεθείτε σε αυτόν το διακομιστή.", - "sshPasswordDescription": "Εισάγετε τον κωδικό πρόσβασης για αυτή τη σύνδεση SSH.", - "sshKeyPasswordDescription": "Αν το SSH κλειδί σας είναι κρυπτογραφημένο, εισάγετε εδώ τη φράση πρόσβασης.", - "passphraseRequired": "Απαιτείται Συνθηματική φράση", - "passphraseRequiredDescription": "Το SSH κλειδί είναι κρυπτογραφημένο. Παρακαλώ εισάγετε τη φράση πρόσβασης για να το ξεκλειδώσετε.", - "back": "Πίσω", - "firstUser": "Πρώτος Χρήστης", - "firstUserMessage": "Είστε ο πρώτος χρήστης και θα γίνει ένας διαχειριστής. Μπορείτε να δείτε τις ρυθμίσεις διαχειριστή στο αναπτυσσόμενο μενού του χρήστη πλαϊνής μπάρας. Αν νομίζετε ότι αυτό είναι λάθος, ελέγξτε τα αρχεία καταγραφής docker ή δημιουργήστε ένα ζήτημα GitHub.", - "external": "Εξωτερικό", - "loginWithExternal": "Συνδεθείτε με τον εξωτερικό πάροχο", - "loginWithExternalDesc": "Συνδεθείτε χρησιμοποιώντας τον καθορισμένο εξωτερικό πάροχο ταυτότητας σας", - "externalNotSupportedInElectron": "Ο εξωτερικός έλεγχος ταυτότητας δεν υποστηρίζεται ακόμα στην εφαρμογή Electron. Παρακαλούμε χρησιμοποιήστε την έκδοση web για σύνδεση OIDC.", - "resetPasswordButton": "Επαναφορά Κωδικού Πρόσβασης", - "sendResetCode": "Αποστολή Κωδικού Επαναφοράς", - "resetCodeDesc": "Εισάγετε το όνομα χρήστη σας για να λάβετε έναν κωδικό επαναφοράς κωδικού. Ο κωδικός θα συνδεθεί στα αρχεία καταγραφής docker container.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Επαλήθευση Κωδικού", - "enterResetCode": "Εισάγετε τον 6ψήφιο κωδικό από τα αρχεία καταγραφής docker container για τον χρήστη:", - "newPassword": "Νέος Κωδικός Πρόσβασης", - "confirmNewPassword": "Επιβεβαίωση Κωδικού Πρόσβασης", - "enterNewPassword": "Εισάγετε τον νέο κωδικό πρόσβασης για το χρήστη:", - "signUp": "Εγγραφή", - "desktopApp": "Εφαρμογή Επιφάνειας Εργασίας", - "loggingInToDesktopApp": "Σύνδεση στην εφαρμογή επιφάνειας εργασίας", - "loadingServer": "Φόρτωση διακομιστή...", - "dataLossWarning": "Η επαναφορά του κωδικού πρόσβασής σας με αυτόν τον τρόπο θα διαγράψει όλα τα αποθηκευμένα SSH hosts, διαπιστευτήρια και άλλα κρυπτογραφημένα δεδομένα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Χρησιμοποιήστε την μόνο αν έχετε ξεχάσει τον κωδικό σας και δεν είστε συνδεδεμένοι.", - "authenticationDisabled": "Απενεργοποίηση Ταυτοποίησης", - "authenticationDisabledDesc": "Όλες οι μέθοδοι ταυτοποίησης είναι απενεργοποιημένες. Παρακαλώ επικοινωνήστε με το διαχειριστή.", - "attemptsRemaining": "{{count}} προσπάθειες απομένουν" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Επαλήθευση Κλειδιού Διακομιστή SSH", - "keyChangedWarning": "Το Κλειδί Υπολογιστή SSH Άλλαξε", - "firstConnectionTitle": "Πρώτη σύνδεση σε αυτόν τον υπολογιστή", - "firstConnectionDescription": "Η αυθεντικότητα αυτού του κεντρικού υπολογιστή δεν μπορεί να καθοριστεί. Βεβαιωθείτε ότι το δακτυλικό αποτύπωμα ταιριάζει με αυτό που περιμένετε.", - "keyChangedDescription": "Το κλειδί φιλοξενίας αυτού του διακομιστή έχει αλλάξει από την τελευταία σας σύνδεση. Αυτό μπορεί να υποδηλώνει ένα πρόβλημα ασφάλειας.", - "previousKey": "Προηγούμενο Κλειδί", - "newFingerprint": "Νέο Δακτυλικό Αποτύπωμα", - "fingerprint": "Αποτύπωμα", - "verifyInstructions": "Αν εμπιστεύεστε αυτόν τον οικοδεσπότη, κάντε κλικ για να συνεχίσετε και να αποθηκεύσετε αυτό το δακτυλικό αποτύπωμα για μελλοντικές συνδέσεις.", - "securityWarning": "Προειδοποίηση Ασφαλείας", - "acceptAndContinue": "Αποδοχή & Συνέχεια", - "acceptNewKey": "Αποδοχή Νέου Κλειδιού & Συνέχεια" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Δεν ήταν δυνατή η σύνδεση με τη βάση δεδομένων", - "unknownError": "Άγνωστο σφάλμα", - "loginFailed": "Αποτυχία σύνδεσης", - "failedPasswordReset": "Αποτυχία έναρξης επαναφοράς κωδικού πρόσβασης", - "failedVerifyCode": "Αποτυχία επαλήθευσης κωδικού επαναφοράς", - "failedCompleteReset": "Αποτυχία ολοκλήρωσης της επαναφοράς κωδικού πρόσβασης", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Αποτυχία έναρξης σύνδεσης OIDC", - "silentSigninOidcUnavailable": "Ζητήθηκε σιωπηλή σύνδεση, αλλά η σύνδεση OIDC δεν είναι διαθέσιμη.", - "failedUserInfo": "Αποτυχία λήψης πληροφοριών χρήστη μετά τη σύνδεση", - "oidcAuthFailed": "Αποτυχία ταυτοποίησης OIDC", - "invalidAuthUrl": "Μη έγκυρη έγκριση URL λήφθηκε από το σύστημα υποστήριξης", - "requiredField": "Αυτό το πεδίο είναι υποχρεωτικό", - "minLength": "Το ελάχιστο μήκος είναι {{min}}", - "passwordMismatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", - "passwordLoginDisabled": "Το όνομα χρήστη/κωδικός πρόσβασης είναι απενεργοποιημένο", - "sessionExpired": "Η συνεδρία έληξε - παρακαλώ συνδεθείτε ξανά", - "totpRateLimited": "Περιορισμένος ρυθμός: Πάρα πολλές προσπάθειες επαλήθευσης TOTP. Παρακαλώ δοκιμάστε ξανά αργότερα.", - "totpRateLimitedWithTime": "Περιορισμένος ρυθμός: Πάρα πολλές προσπάθειες επαλήθευσης TOTP. Παρακαλώ περιμένετε {{time}} δευτερόλεπτα πριν προσπαθήσετε ξανά.", - "resetCodeRateLimited": "Περιορισμένη βαθμολογία: Πάρα πολλές προσπάθειες επαλήθευσης. Παρακαλώ δοκιμάστε ξανά αργότερα.", - "resetCodeRateLimitedWithTime": "Περιορισμένος ρυθμός: Πάρα πολλές προσπάθειες επαλήθευσης. Παρακαλώ περιμένετε {{time}} δευτερόλεπτα πριν προσπαθήσετε ξανά.", - "authTokenSaveFailed": "Αποτυχία αποθήκευσης διακριτικού ταυτοποίησης", - "failedToLoadServer": "Αποτυχία φόρτωσης διακομιστή" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Νέα εγγραφή λογαριασμού απενεργοποιείται από έναν διαχειριστή. Παρακαλούμε συνδεθείτε ή επικοινωνήστε με το διαχειριστή.", - "userNotAllowed": "Ο λογαριασμός σας δεν είναι εξουσιοδοτημένος να εγγραφεί. Επικοινωνήστε με το διαχειριστή.", - "databaseConnectionFailed": "Αποτυχία σύνδεσης με το διακομιστή βάσης δεδομένων", - "resetCodeSent": "Η επαναφορά κωδικού στάλθηκε στα αρχεία καταγραφής Docker", - "codeVerified": "Επιτυχής επαλήθευση κωδικού", - "passwordResetSuccess": "Επιτυχής επαναφορά κωδικού πρόσβασης", - "loginSuccess": "Επιτυχής σύνδεση", - "registrationSuccess": "Επιτυχής εγγραφή" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Τοπικές σήραγγες επιφάνειας εργασίας με στόχο ρυθμισμένους SSH υπολογιστές.", - "c2sTunnelPresets": "Προεπιλογές Tunnel Πελάτη", - "c2sTunnelPresetsDesc": "Αποθήκευση της τοπικής λίστας διοχέτευσης αυτού του υπολογιστή-πελάτη γραφείου ως μια καθορισμένη προεπιλογή διακομιστή ή φόρτωση μιας προκαθορισμένης ρύθμισης σε αυτόν τον υπολογιστή-πελάτη.", - "c2sTunnelPresetsUnavailable": "Οι προεπιλογές διοχέτευσης πελάτη είναι διαθέσιμες μόνο στην επιφάνεια εργασίας προγράμματος-πελάτη.", - "c2sPresetName": "Προκαθορισμένο Όνομα", - "c2sPresetNamePlaceholder": "Προκαθορισμένο όνομα πελάτη", - "c2sPresetToLoad": "Προκαθορισμένο Για Φόρτωση", - "c2sNoPresetSelected": "Δεν επιλέχθηκε προεπιλογή", - "c2sNoPresets": "Δεν αποθηκεύτηκαν προεπιλογές", - "c2sLoadPreset": "Φόρτωση", - "c2sCurrentLocalConfig": "{{count}} τοπική(ές) διοχέτευση(εις) πελάτη που έχουν ρυθμιστεί σε αυτήν την επιφάνεια εργασίας.", - "c2sPresetSyncNote": "Οι προεπιλογές είναι σαφείς στιγμιότυπα. Η φόρτωση μιας αντικαθιστά την τοπική λίστα tunnel πελάτη της επιφάνειας εργασίας.", - "c2sPresetSaved": "Η προκαθορισμένη ρύθμιση δρομολόγησης πελάτη αποθηκεύτηκε", - "c2sPresetLoaded": "Τοπικά φορτισμένη σήραγγα πελάτη", - "c2sPresetRenamed": "Η προκαθορισμένη ρύθμιση δρομολόγησης πελάτη μετονομάστηκε", - "c2sPresetDeleted": "Η προκαθορισμένη ρύθμιση δρομολόγησης πελάτη διαγράφηκε", - "c2sPresetLoadError": "Αποτυχία φόρτωσης προεπιλογών tunnel πελάτη" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Γλώσσα", - "keyPassword": "κωδικός πρόσβασης", - "pastePrivateKey": "Επικολλήστε το ιδιωτικό σας κλειδί εδώ...", - "localListenerHost": "127.0.0.1 (ακούστε τοπικά)", - "localTargetHost": "127.0.0.1 (στόχος σε αυτόν τον υπολογιστή)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Εισάγετε τον κωδικό σας", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Ταμπλό", - "loading": "Φόρτωση ταμπλό...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Υποστήριξη", + "support": "Support", "discord": "Discord", - "serverOverview": "Επισκόπηση Διακομιστή", - "version": "Έκδοση", - "upToDate": "Έως την ημερομηνία", - "updateAvailable": "Διαθέσιμη Ενημέρωση", - "beta": "Βήτα", - "uptime": "Χρόνος", - "database": "Βάση Δεδομένων", - "healthy": "Υγιείς", - "error": "Σφάλμα", - "totalHosts": "Σύνολο Υπολογιστών", - "totalTunnels": "Σύνολο Σηράγγων", - "totalCredentials": "Σύνολο Διαπιστευτηρίων", - "recentActivity": "Πρόσφατη Δραστηριότητα", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Φόρτωση πρόσφατης δραστηριότητας...", - "noRecentActivity": "Καμία πρόσφατη δραστηριότητα", - "quickActions": "Γρήγορες Ενέργειες", - "addHost": "Προσθήκη Διακομιστή", - "addCredential": "Προσθήκη Διαπιστευτηρίου", - "adminSettings": "Ρυθμίσεις Διαχειριστή", - "userProfile": "Προφίλ Χρήστη", - "serverStats": "Στατιστικά Διακομιστή", - "loadingServerStats": "Φόρτωση στατιστικών διακομιστή...", - "noServerData": "Δεν υπάρχουν διαθέσιμα δεδομένα διακομιστή", - "cpu": "Επεξεργαστής", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Προσαρμογή Πίνακα Ελέγχου", - "dashboardSettings": "Ρυθμίσεις Ταμπλό", - "enableDisableCards": "Ενεργοποίηση/Απενεργοποίηση Καρτών", - "resetLayout": "Επαναφορά προεπιλογών", - "serverOverviewCard": "Επισκόπηση Διακομιστή", - "recentActivityCard": "Πρόσφατη Δραστηριότητα", - "networkGraphCard": "Γράφημα Δικτύου", - "networkGraph": "Γράφημα Δικτύου", - "quickActionsCard": "Γρήγορες Ενέργειες", - "serverStatsCard": "Στατιστικά Διακομιστή", - "panelMain": "Κύρια", - "panelSide": "Πλευρά", - "justNow": "μόλις τώρα" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABLE", - "hostsOnline": "Συνδεδεμένοι Υπολογιστές", - "activeTunnels": "Ενεργές Σηράξεις", - "registerNewServer": "Εγγραφή νέου διακομιστή", - "storeSshKeysOrPasswords": "Αποθήκευση SSH κλειδιών ή κωδικών πρόσβασης", - "manageUsersAndRoles": "Διαχείριση χρηστών και ρόλων", - "manageYourAccount": "Διαχείριση του λογαριασμού σας", - "hostStatus": "Κατάσταση Υπολογιστή", - "noHostsConfigured": "Δεν έχουν ρυθμιστεί υπολογιστές", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", - "onlineLower": "Συνδεδεμένος", + "onlineLower": "Διαδικτυακά", "nodes": "{{count}} nodes", - "add": "Προσθέστε:", - "commandPalette": "Παλέτα Εντολών", - "done": "Ολοκληρώθηκε", - "editModeInstructions": "Σύρετε τις κάρτες για να αναδιατάξετε · Σύρετε το διαχωριστικό στήλης για να αλλάξετε το μέγεθος των στηλών · Σύρετε το κάτω άκρο ενός φύλλου για να αλλάξετε το μέγεθος του · Απορρίμματα για να αφαιρέσετε", - "empty": "Κενό", - "clear": "Εκκαθάριση" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Αντίγραφο", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Προσθήκη Διακομιστή", - "addGroup": "Προσθήκη Ομάδας", - "addLink": "Προσθήκη Συνδέσμου", - "zoomIn": "Μεγέθυνση", - "zoomOut": "Σμίκρυνση", - "resetView": "Επαναφορά Προβολής", - "selectHost": "Επιλογή Διακομιστή", - "chooseHost": "Επιλογή κεντρικού υπολογιστή...", - "parentGroup": "Γονική Ομάδα", - "noGroup": "Καμία Ομάδα", - "groupName": "Όνομα Ομάδας", - "color": "Χρώμα", - "source": "Πηγή", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Μετακίνηση στην ομάδα", - "selectGroup": "Επιλογή ομάδας...", - "addConnection": "Προσθήκη Σύνδεσης", - "hostDetails": "Λεπτομέρειες Υπολογιστή", - "removeFromGroup": "Αφαίρεση από την ομάδα", - "addHostHere": "Προσθήκη Υπολογιστή Εδώ", - "editGroup": "Επεξεργασία Ομάδας", - "delete": "Διαγραφή", - "add": "Προσθήκη", - "create": "Δημιουργία", - "move": "Μετακίνηση", - "connect": "Σύνδεση", - "createGroup": "Δημιουργία Ομάδας", - "selectSourcePlaceholder": "Επιλογή Πηγής...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Κίνηση", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Μη Έγκυρο Αρχείο", - "hostAlreadyExists": "Ο οικοδεσπότης βρίσκεται ήδη στην τοπολογία", - "connectionExists": "Η σύνδεση υπάρχει ήδη", - "unknown": "Άγνωστο", - "name": "Όνομα", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Κατάσταση", - "failedToAddNode": "Αποτυχία προσθήκης κόμβου", - "sourceDifferentFromTarget": "Η πηγή και ο στόχος πρέπει να είναι διαφορετικοί", - "exportJSON": "Εξαγωγή JSON", - "importJSON": "Εισαγωγή JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Τερματικό", - "fileManager": "Διαχειριστής Αρχείων", + "fileManager": "Διαχειριστής αρχείων", "tunnel": "Σήραγγα", - "docker": "Προσάρτηση", - "serverStats": "Στατιστικά Διακομιστή", - "noNodes": "Δεν υπάρχουν κόμβοι ακόμα" + "docker": "Λιμενεργάτης", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Το Docker δεν είναι ενεργοποιημένο για αυτόν τον υπολογιστή", - "validating": "Επικύρωση Docker...", - "connecting": "Σύνδεση...", - "error": "Σφάλμα", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Αποτυχία σύνδεσης στο Docker", - "containerStarted": "Το κοντέινερ {{name}} ξεκίνησε", - "failedToStartContainer": "Αποτυχία εκκίνησης κοντέινερ {{name}}", - "containerStopped": "Το κοντέινερ {{name}} σταμάτησε", - "failedToStopContainer": "Αποτυχία διακοπής του κοντέινερ {{name}}", - "containerRestarted": "Container {{name}} επανεκκινήθηκε", - "failedToRestartContainer": "Απέτυχε η επανεκκίνηση του container {{name}}", - "containerPaused": "Το κοντέινερ {{name}} τέθηκε σε παύση", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", "containerUnpaused": "Container {{name}} unpaused", - "failedToTogglePauseContainer": "Αποτυχία εναλλαγής κατάστασης παύσης για το κοντέινερ {{name}}", - "containerRemoved": "Το κοντέινερ {{name}} αφαιρέθηκε", - "failedToRemoveContainer": "Αποτυχία κατάργησης του κοντέινερ {{name}}", - "image": "Εικόνα", - "ports": "Θύρες", - "noPorts": "Δεν υπάρχουν θύρες", - "start": "Έναρξη", - "confirmRemoveContainer": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το δοχείο '{{name}}'? Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", - "runningContainerWarning": "Προειδοποίηση: Αυτό το δοχείο εκτελείται αυτή τη στιγμή. Η αφαίρεση του θα σταματήσει πρώτα τον περιέκτη.", - "loadingContainers": "Φόρτωση εμπορευματοκιβωτίων...", - "manager": "Διαχειριστής Προσάρτησης", - "autoRefresh": "Αυτόματη Ανανέωση", - "timestamps": "Χρονοσφραγίδες", - "lines": "Γραμμές", - "filterLogs": "Φιλτράρισμα αρχείων καταγραφής...", - "refresh": "Ανανέωση", - "download": "Λήψη", - "clear": "Εκκαθάριση", - "logsDownloaded": "Τα αρχεία καταγραφής κατέβηκαν επιτυχώς", - "last50": "Τελευταίο 50", - "last100": "Τελευταία 100", - "last500": "Τελευταίο 500", - "last1000": "Τελευταίο 1000", - "allLogs": "Όλα Τα Αρχεία Καταγραφής", - "noLogsMatching": "Δεν υπάρχουν αρχεία καταγραφής που να ταιριάζουν \"{{query}}\"", - "noLogsAvailable": "Δεν υπάρχουν διαθέσιμα αρχεία καταγραφής", - "noContainersFound": "Δεν βρέθηκαν εμπορευματοκιβώτια", - "noContainersFoundHint": "Δεν υπάρχουν διαθέσιμα δοχεία Docker σε αυτόν τον υπολογιστή", - "searchPlaceholder": "Αναζήτηση εμπορευματοκιβωτίων...", - "allStatuses": "Όλες Οι Καταστάσεις", - "stateRunning": "Εκτελείται", - "statePaused": "Παύση", - "stateExited": "Έξοδος", - "stateRestarting": "Επανεκκίνηση", - "noContainersMatchFilters": "Κανένα δοχείο δεν ταιριάζει με τα φίλτρα σας", - "noContainersMatchFiltersHint": "Δοκιμάστε να προσαρμόσετε τα κριτήρια αναζήτησης ή φίλτρου", - "failedToFetchStats": "Αποτυχία λήψης στατιστικών στοιχείων εμπορευματοκιβωτίων", - "containerNotRunning": "Ο περιέκτης δεν εκτελείται", - "startContainerToViewStats": "Εκκίνηση του περιέκτη για προβολή στατιστικών", - "loadingStats": "Φόρτωση στατιστικών...", - "errorLoadingStats": "Σφάλμα φόρτωσης στατιστικών", - "noStatsAvailable": "Δεν υπάρχουν διαθέσιμα στατιστικά στοιχεία", - "cpuUsage": "Χρήση CPU", - "current": "Τρέχων", - "memoryUsage": "Χρήση Μνήμης", - "networkIo": "Δίκτυο I/O", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Έξοδος", - "blockIo": "Αποκλεισμός I/O", - "read": "Ανάγνωση", - "write": "Εγγραφή", - "pids": "PID", - "containerInformation": "Πληροφορίες Περιέκτη", - "name": "Όνομα", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Κατάσταση", - "containerMustBeRunning": "Ο περιέκτης πρέπει να εκτελείται για πρόσβαση στην κονσόλα", - "verificationCodePrompt": "Εισάγετε τον κωδικό επαλήθευσης", - "totpVerificationFailed": "Η επαλήθευση TOTP απέτυχε. Παρακαλώ προσπαθήστε ξανά.", - "warpgateVerificationFailed": "Η ταυτοποίηση Warpgate απέτυχε. Παρακαλώ προσπαθήστε ξανά.", - "connectedTo": "Συνδεδεμένο με {{containerName}}", - "disconnected": "Αποσυνδέθηκε", - "consoleError": "Σφάλμα κονσόλας", - "errorMessage": "Σφάλμα: {{message}}", - "failedToConnect": "Αποτυχία σύνδεσης με τον περιέκτη", - "console": "Κονσόλα", - "selectShell": "Επιλογή κελύφους", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Ασύνδετος", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "τέφρα", - "connect": "Σύνδεση", - "disconnect": "Αποσύνδεση", - "notConnected": "Δεν συνδέθηκε", - "clickToConnect": "Κάντε κλικ στη σύνδεση για να ξεκινήσετε μια συνεδρία κελύφους", - "connectingTo": "Σύνδεση με {{containerName}}...", - "containerNotFound": "Ο περιέκτης δεν βρέθηκε", - "backToList": "Πίσω στη Λίστα", - "logs": "Καταγραφή", - "stats": "Στατιστικά", - "consoleTab": "Κονσόλα", - "startContainerToAccess": "Εκκίνηση του περιέκτη για πρόσβαση στην κονσόλα" + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Δεν είναι συνδεδεμένο", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Γενικά", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Χρήστες", - "sectionSessions": "Συνεδρίες", - "sectionRoles": "Ρόλοι", - "sectionDatabase": "Βάση Δεδομένων", - "sectionApiKeys": "Κλειδιά API", - "allowRegistration": "Επιτρέψτε Την Εγγραφή Χρήστη", - "allowRegistrationDesc": "Να επιτρέπεται στους νέους χρήστες η αυτο-εγγραφή", - "allowPasswordLogin": "Να Επιτρέπεται Η Σύνδεση Κωδικού Πρόσβασης", - "allowPasswordLoginDesc": "Όνομα χρήστη/κωδικός πρόσβασης", - "oidcAutoProvision": "Αυτόματη Παροχή OIDC", - "oidcAutoProvisionDesc": "Αυτόματη δημιουργία λογαριασμών για χρήστες OIDC ακόμη και όταν η εγγραφή είναι απενεργοποιημένη", - "allowPasswordReset": "Επιτρέπεται Επαναφορά Κωδικού Πρόσβασης", - "allowPasswordResetDesc": "Επαναφορά κώδικα μέσω αρχείων καταγραφής Docker", - "sessionTimeout": "Χρονικό Όριο Συνεδρίας", - "hours": "ώρες", - "sessionTimeoutRange": "Ελάχιστη 1h · Ανώτατο όριο 720h", - "monitoringDefaults": "Προεπιλογές Παρακολούθησης", - "statusCheck": "Έλεγχος Κατάστασης", - "metrics": "Μετρικές", - "sec": "δευτ", - "logLevel": "Επίπεδο Καταγραφής", - "enableGuacamole": "Ενεργοποίηση Guacamole", - "enableGuacamoleDesc": "Απομακρυσμένη επιφάνεια εργασίας RDP/VNC", - "guacdUrl": "URL guacd", - "oidcDescription": "Οι ρυθμίσεις σύνδεσης OpenID για SSO. Τα πεδία που σημειώνονται * είναι υποχρεωτικά.", - "oidcClientId": "Ταυτότητα Πελάτη", - "oidcClientSecret": "Μυστικό Πελάτη", - "oidcAuthUrl": "URL Εξουσιοδότησης", - "oidcIssuerUrl": "Url Εκδότη", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Καθαρισμός φίλτρων", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Κατάσταση", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", "oidcTokenUrl": "Token URL", - "oidcUserIdentifier": "Διαδρομή Αναγνωριστικού Χρήστη", - "oidcDisplayName": "Εμφανιζόμενο Όνομα Διαδρομής", - "oidcScopes": "Εμβέλεια", - "oidcUserinfoUrl": "Παράκαμψη URL Πληροφορίας Χρήστη", - "oidcAllowedUsers": "Επιτρεπόμενοι Χρήστες", - "oidcAllowedUsersDesc": "Ένα email ανά γραμμή. Αφήστε κενό για να επιτρέψετε σε όλους.", - "removeOidc": "Αφαίρεση", - "usersCount": "{{count}} χρήστες", - "createUser": "Δημιουργία", - "newRole": "Νέος Ρόλος", - "roleName": "Όνομα", - "roleDisplayName": "Εμφανιζόμενο Όνομα", - "roleDescription": "Περιγραφή", - "rolesCount": "{{count}} ρόλοι", - "createRole": "Δημιουργία", - "creating": "Δημιουργία...", - "exportDatabase": "Εξαγωγή Βάσης Δεδομένων", - "exportDatabaseDesc": "Κατεβάστε ένα αντίγραφο ασφαλείας όλων των hosts, διαπιστευτήρια και ρυθμίσεις", - "export": "Εξαγωγή", - "exporting": "Εξαγωγή...", - "importDatabase": "Εισαγωγή Βάσης Δεδομένων", - "importDatabaseDesc": "Επαναφορά από ένα αρχείο αντιγράφου ασφαλείας .sqlite", - "importDatabaseSelected": "Επιλεγμένα: {{name}}", - "selectFile": "Επιλογή Αρχείου", - "changeFile": "Αλλαγή", - "import": "Εισαγωγή", - "importing": "Εισαγωγή...", - "apiKeysCount": "{{count}} πλήκτρα", - "newApiKey": "Νέο Κλειδί Api", - "apiKeyCreatedWarning": "Το κλειδί δημιουργήθηκε - αντιγράψτε το τώρα, δεν θα εμφανιστεί ξανά.", - "apiKeyName": "Όνομα", - "apiKeyUser": "Χρήστης", - "apiKeySelectUser": "Επιλέξτε έναν χρήστη...", - "apiKeyExpiresAt": "Λήγει Στις", - "createKey": "Δημιουργία Κλειδιού", - "apiKeyNoExpiry": "Καμία λήξη", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Αφαιρώ", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Διπλή Πιστοποίηση", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Τοπικό", - "adminStatusAdministrator": "Διαχειριστής", - "adminStatusRegularUser": "Κανονικός Χρήστης", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "ΤΕΛΩΝΕΙΟ", - "youBadge": "ΣΑΣ", - "sessionsActive": "{{count}} ενεργό", - "sessionActive": "Ενεργό: {{time}}", - "sessionExpires": "Λήξη: {{time}}", - "revokeAll": "Όλα", - "revokeAllSessionsSuccess": "Όλες οι συνεδρίες για τον χρήστη ανακλήθηκαν", - "revokeAllSessionsFailed": "Αποτυχία ανάκλησης συνεδριών", - "revokeSessionFailed": "Αποτυχία ανάκλησης συνεδρίας", - "addRole": "Προσθήκη ρόλου", - "noCustomRoles": "Δεν έχουν οριστεί προσαρμοσμένοι ρόλοι", - "removeRoleFailed": "Αποτυχία κατάργησης ρόλου", - "assignRoleFailed": "Αποτυχία αντιστοίχισης ρόλου", - "deleteRoleFailed": "Αποτυχία διαγραφής ρόλου", - "userAdminAccess": "Διαχειριστής", - "userAdminAccessDesc": "Πλήρης πρόσβαση σε όλες τις ρυθμίσεις διαχειριστή", - "userRoles": "Ρόλοι", - "revokeAllUserSessions": "Ανάκληση Όλων Των Συνεδριών", - "revokeAllUserSessionsDesc": "Αναγκαστική επανασύνδεση σε όλες τις συσκευές", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Η διαγραφή αυτού του χρήστη είναι μόνιμη.", - "deleteUser": "Διαγραφή {{username}}", - "deleting": "Διαγραφή...", - "deleteUserFailed": "Αποτυχία διαγραφής χρήστη", - "deleteUserSuccess": "Χρήστης \"{{username}}\" διαγράφηκε", - "deleteRoleSuccess": "Ο ρόλος \"{{name}}\" διαγράφηκε", - "revokeKeySuccess": "Το κλειδί \"{{name}}\" ανακλήθηκε", - "revokeKeyFailed": "Αποτυχία ανάκλησης κλειδιού", - "copiedToClipboard": "Αντιγράφηκε στο πρόχειρο", - "done": "Ολοκληρώθηκε", - "createUserTitle": "Δημιουργία Χρήστη", - "createUserDesc": "Δημιουργία νέου τοπικού λογαριασμού.", - "createUserUsername": "Όνομα Χρήστη", - "createUserPassword": "Κωδικός", - "createUserPasswordHint": "Τουλάχιστον 6 χαρακτήρες.", - "createUserEnterUsername": "Εισάγετε όνομα χρήστη", - "createUserEnterPassword": "Εισάγετε κωδικό πρόσβασης", - "createUserSubmit": "Δημιουργία Χρήστη", - "editUserTitle": "Διαχείριση χρήστη: {{username}}", - "editUserDesc": "Επεξεργασία ρόλων, κατάστασης διαχειριστή, συνεδριών και ρυθμίσεων λογαριασμού.", - "editUserUsername": "Όνομα Χρήστη", - "editUserAuthType": "Τύπος Πιστοποίησης", - "editUserAdminStatus": "Κατάσταση Διαχειριστή", - "editUserUserId": "Id Χρήστη", - "linkAccountTitle": "Σύνδεση OIDC σε λογαριασμό κωδικού πρόσβασης", - "linkAccountDesc": "Συγχώνευση του λογαριασμού OIDC {{username}} με έναν υπάρχοντα τοπικό λογαριασμό.", - "linkAccountWarningTitle": "Αυτό θα:", - "linkAccountEffect1": "Διαγραφή του λογαριασμού OIDC μόνο", - "linkAccountEffect2": "Προσθήκη σύνδεσης OIDC στον λογαριασμό προορισμού", - "linkAccountEffect3": "Επιτρέπεται η σύνδεση OIDC και κωδικού πρόσβασης", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Εισάγετε το όνομα τοπικού λογαριασμού για σύνδεση", - "linkAccounts": "Σύνδεση Λογαριασμών", - "linkAccountSuccess": "Λογαριασμός OIDC συνδεδεμένος με \"{{username}}\"", - "linkAccountFailed": "Αποτυχία σύνδεσης λογαριασμού OIDC", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", + "createUserPassword": "Σύνθημα", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Τύπος Εξουσιοδότησης", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Σύνδεση...", - "saving": "Αποθηκεύεται...", - "updateRegistrationFailed": "Αποτυχία ενημέρωσης της ρύθμισης εγγραφής", - "updatePasswordLoginFailed": "Αποτυχία ενημέρωσης της ρύθμισης σύνδεσης κωδικού πρόσβασης", - "updateOidcAutoProvisionFailed": "Αποτυχία ενημέρωσης της ρύθμισης OIDC αυτόματης παροχής", - "updatePasswordResetFailed": "Αποτυχία ενημέρωσης της ρύθμισης επαναφοράς κωδικού πρόσβασης", - "sessionTimeoutRange2": "Το χρονικό όριο συνεδρίας πρέπει να είναι μεταξύ 1 και 720 ωρών", - "sessionTimeoutSaved": "Χρονικό όριο συνεδρίας αποθηκεύτηκε", - "sessionTimeoutSaveFailed": "Αποτυχία αποθήκευσης χρονικού ορίου συνεδρίας", - "monitoringIntervalInvalid": "Μη έγκυρες τιμές διαστήματος", - "monitoringSaved": "Οι ρυθμίσεις παρακολούθησης αποθηκεύτηκαν", - "monitoringSaveFailed": "Αποτυχία αποθήκευσης των ρυθμίσεων παρακολούθησης", - "guacamoleSaved": "Οι ρυθμίσεις Guacamole αποθηκεύτηκαν", - "guacamoleSaveFailed": "Αποτυχία αποθήκευσης ρυθμίσεων Guacamole", - "guacamoleUpdateFailed": "Αποτυχία ενημέρωσης της ρύθμισης Guacamole", - "logLevelUpdateFailed": "Αποτυχία ενημέρωσης επιπέδου καταγραφής", - "oidcSaved": "Οι ρυθμίσεις OIDC αποθηκεύτηκαν", - "oidcSaveFailed": "Αποτυχία αποθήκευσης ρυθμίσεων OIDC", - "oidcRemoved": "Η διαμόρφωση OIDC αφαιρέθηκε", - "oidcRemoveFailed": "Αποτυχία κατάργησης ρυθμίσεων OIDC", - "createUserRequired": "Απαιτείται όνομα χρήστη και κωδικός πρόσβασης", - "createUserPasswordTooShort": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 6 χαρακτήρες", - "createUserSuccess": "Χρήστης \"{{username}}\" δημιουργήθηκε", - "createUserFailed": "Αποτυχία δημιουργίας χρήστη", - "updateAdminStatusFailed": "Αποτυχία ενημέρωσης κατάστασης διαχειριστή", - "allSessionsRevoked": "Όλες οι συνεδρίες ανακλήθηκαν", - "revokeSessionsFailed": "Αποτυχία ανάκλησης συνεδριών", - "createRoleRequired": "Όνομα και εμφανιζόμενο όνομα απαιτούνται", - "createRoleSuccess": "Ο ρόλος \"{{name}}\" δημιουργήθηκε", - "createRoleFailed": "Αποτυχία δημιουργίας ρόλου", - "apiKeyNameRequired": "Απαιτείται όνομα κλειδιού", - "apiKeyUserRequired": "Απαιτείται ID χρήστη", - "apiKeyCreatedSuccess": "API κλειδί \"{{name}}\" δημιουργήθηκε", - "apiKeyCreateFailed": "Αποτυχία δημιουργίας κλειδιού API", - "exportSuccess": "Η βάση δεδομένων εξήχθη επιτυχώς", - "exportFailed": "Η εξαγωγή βάσης δεδομένων απέτυχε", - "importSelectFile": "Παρακαλώ επιλέξτε πρώτα ένα αρχείο", - "importCompleted": "Η εισαγωγή ολοκληρώθηκε: {{total}} στοιχεία εισήχθησαν, {{skipped}} παραλείφθηκαν", - "importFailed": "Η εισαγωγή απέτυχε: {{error}}", - "importError": "Η εισαγωγή βάσης δεδομένων απέτυχε" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Τερματικό", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Διακομιστής", - "hostPlaceholder": "192.168.1.1 ή example.com", - "portLabel": "Θύρα", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Όνομα Χρήστη", - "usernamePlaceholder": "όνομα χρήστη", - "authLabel": "Πιστοποίηση", - "passwordLabel": "Κωδικός", - "passwordPlaceholder": "κωδικός", - "privateKeyLabel": "Ιδιωτικό Κλειδί", - "privateKeyPlaceholder": "Επικόλληση ιδιωτικού κλειδιού...", - "credentialLabel": "Διαπιστευτήριο", - "credentialPlaceholder": "Επιλέξτε ένα αποθηκευμένο διαπιστευτήριο", - "connectToTerminal": "Σύνδεση στο Τερματικό", - "connectToFiles": "Σύνδεση σε αρχεία" + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", + "passwordLabel": "Σύνθημα", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Πιστοποιητικό", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Δεν επιλέχθηκε τερματικό", - "noTerminalSelectedHint": "Άνοιγμα μιας καρτέλας τερματικού SSH για προβολή του ιστορικού εντολών", - "searchPlaceholder": "Αναζήτηση ιστορικού...", - "clearAll": "Εκκαθάριση Όλων", - "noHistoryEntries": "Δεν υπάρχουν καταχωρήσεις ιστορικού", - "trackingDisabled": "Η παρακολούθηση ιστορικού είναι απενεργοποιημένη", - "trackingDisabledHint": "Ενεργοποιήστε το στις ρυθμίσεις προφίλ σας για την εγγραφή εντολών." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Εγγραφή Πλήκτρων", - "recordToTerminals": "Εγγραφή σε τερματικά", - "selectAll": "Όλα", - "selectNone": "Κανένα", - "noTerminalTabsOpen": "Δεν έχουν ανοίξει καρτέλες τερματικού", - "selectTerminalsAbove": "Επιλέξτε τερματικά πάνω", - "broadcastInputPlaceholder": "Πληκτρολογήστε εδώ για να μεταδώσετε τα πλήκτρα...", - "stopRecording": "Διακοπή Εγγραφής", - "startRecording": "Έναρξη Εγγραφής", - "settingsTitle": "Ρυθμίσεις", - "enableRightClickCopyPaste": "Ενεργοποίηση αντιγραφής/επικόλλησης με δεξί κλικ" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Κανένας", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Διάταξη", - "selectLayoutAbove": "Επιλέξτε μια διάταξη παραπάνω", - "selectLayoutHint": "Επιλέξτε πόσα παράθυρα θα εμφανίζονται", - "panesTitle": "Πίνακες", - "openTabsTitle": "Άνοιγμα Καρτελών", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Σύρετε καρτέλες στα παραπάνω παράθυρα ή χρησιμοποιήστε τη Γρήγορη αντιστοίχιση", - "dropHere": "Ρίξτε εδώ", - "emptyPane": "Κενό", - "dashboard": "Ταμπλό", - "clearSplitScreen": "Καθαρισμός Διαίρεσης Οθόνης", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Γρήγορη ανάθεση", - "alreadyAssigned": "Παράθυρο {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Διαίρεση καρτέλας", "addToSplit": "Προσθήκη στο Split", "removeFromSplit": "Αφαίρεση από το Σπλιτ", - "assignToPane": "Ανάθεση σε παράθυρο" + "assignToPane": "Ανάθεση σε παράθυρο", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Δημιουργία Δείγματος", - "createSnippetDescription": "Δημιουργήστε ένα νέο στέλεχος εντολών για γρήγορη εκτέλεση", - "nameLabel": "Όνομα", - "namePlaceholder": "π.χ. Επανεκκίνηση Nginx", - "descriptionLabel": "Περιγραφή", - "descriptionPlaceholder": "Προαιρετική περιγραφή", - "optional": "Προαιρετικό", - "folderLabel": "Φάκελος", - "noFolder": "Χωρίς φάκελο (Μη κατηγοριοποιημένο)", - "commandLabel": "Εντολή", - "commandPlaceholder": "π.χ. sudo systemctl restart nginx", - "cancel": "Ακύρωση", - "createSnippetButton": "Δημιουργία Δείγματος", - "createFolderTitle": "Δημιουργία Φακέλου", - "createFolderDescription": "Οργανώστε τα αποσπάσματα σας σε φακέλους", - "folderNameLabel": "Όνομα Φακέλου", - "folderNamePlaceholder": "π.χ., Εντολές Συστήματος, Σενάρια Docker", - "folderColorLabel": "Χρώμα Φακέλου", - "folderIconLabel": "Εικονίδιο Φακέλου", - "previewLabel": "Προεπισκόπηση", - "folderNameFallback": "Όνομα Φακέλου", - "createFolderButton": "Δημιουργία Φακέλου", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Ματαίωση", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Όλα", - "selectNone": "Κανένα", - "noTerminalTabsOpen": "Δεν έχουν ανοίξει καρτέλες τερματικού", - "searchPlaceholder": "Αναζήτηση αποσπασμάτων ...", - "newSnippet": "Νέο Δείγμα", - "newFolder": "Νέος Φάκελος", - "run": "Εκτέλεση", - "noSnippetsInFolder": "Δεν υπάρχουν αποσπάσματα σε αυτόν το φάκελο", - "uncategorized": "Αταξινόμητο", - "editSnippetTitle": "Επεξεργασία Δείγματος", - "editSnippetDescription": "Ενημερώστε αυτό το τμήμα εντολών", - "saveSnippetButton": "Αποθήκευση Αλλαγών", - "createSuccess": "Δείγμα δημιουργήθηκε με επιτυχία", - "createFailed": "Αποτυχία δημιουργίας αποσπάσματος", - "updateSuccess": "Δείγμα ενημερώθηκε με επιτυχία", - "updateFailed": "Αποτυχία ενημέρωσης αποσπάσματος", - "deleteFailed": "Αποτυχία διαγραφής αποσπάσματος", - "folderCreateSuccess": "Ο φάκελος δημιουργήθηκε με επιτυχία", - "folderCreateFailed": "Αποτυχία δημιουργίας φακέλου", - "editFolderTitle": "Επεξεργασία Φακέλου", - "editFolderDescription": "Μετονομασία ή αλλαγή εμφάνισης αυτού του φακέλου", - "saveFolderButton": "Αποθήκευση Αλλαγών", - "editFolder": "Επεξεργασία φακέλου", - "deleteFolder": "Διαγραφή φακέλου", - "folderDeleteSuccess": "Φάκελος \"{{name}}\" διαγράφηκε", - "folderDeleteFailed": "Αποτυχία διαγραφής φακέλου", - "folderEditSuccess": "Ο φάκελος ενημερώθηκε επιτυχώς", - "folderEditFailed": "Αποτυχία ενημέρωσης φακέλου", - "confirmRunMessage": "Εκτέλεση \"{{name}}\";", + "selectAll": "All", + "selectNone": "Κανένας", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Τρέξιμο", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Τρέξιμο", - "runSuccess": "Ran \"{{name}}\" σε τερματικό(ά) {{count}}", - "copySuccess": "Αντιγράφηκε το \"{{name}}\" στο πρόχειρο", - "shareTitle": "Μοιραστείτε Δείγμα", - "shareUser": "Χρήστης", - "shareRole": "Ρόλος", - "selectUser": "Επιλέξτε έναν χρήστη...", - "selectRole": "Επιλέξτε ένα ρόλο...", - "shareSuccess": "Το Snippet κοινοποιήθηκε με επιτυχία", - "shareFailed": "Αποτυχία κοινοποίησης αποσπάσματος", - "revokeSuccess": "Η πρόσβαση ανακλήθηκε", - "revokeFailed": "Αποτυχία ανάκλησης πρόσβασης", - "currentAccess": "Τρέχουσα Πρόσβαση", - "shareLoadError": "Αποτυχία φόρτωσης δεδομένων κοινής χρήσης", - "loading": "Φόρτωση...", - "close": "Κλείσιμο", - "reorderFailed": "Η αποθήκευση της σειράς αποσπάσματος απέτυχε" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Η αποθήκευση της σειράς αποσπάσματος απέτυχε", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Λογαριασμός", - "sectionAppearance": "Εμφάνιση", - "sectionSecurity": "Ασφάλεια", - "sectionApiKeys": "Κλειδιά API", - "sectionC2sTunnels": "C2S Σήραγγες", - "usernameLabel": "Όνομα Χρήστη", - "roleLabel": "Ρόλος", - "roleAdministrator": "Διαχειριστής", - "authMethodLabel": "Μέθοδος Πιστοποίησης", - "authMethodLocal": "Τοπικό", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "Ενεργό", - "twoFaOff": "Ανενεργό", - "versionLabel": "Έκδοση", - "deleteAccount": "Διαγραφή Λογαριασμού", - "deleteAccountDescription": "Μόνιμη διαγραφή λογαριασμού σας", - "deleteButton": "Διαγραφή", - "deleteAccountPermanent": "Αυτή η ενέργεια είναι μόνιμη και δεν μπορεί να αναιρεθεί.", - "deleteAccountWarning": "Όλες οι συνεδρίες, οι υπολογιστές, τα διαπιστευτήρια και οι ρυθμίσεις θα διαγραφούν οριστικά.", - "confirmPasswordDeletePlaceholder": "Εισάγετε τον κωδικό πρόσβασής σας για επιβεβαίωση", - "languageLabel": "Γλώσσα", - "themeLabel": "Θέμα", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Χρώμα Έμφασης", + "accentColorLabel": "Accent Color", "settingsTerminal": "Τερματικό", - "commandAutocomplete": "Αυτόματη Ολοκλήρωση Εντολής", - "commandAutocompleteDesc": "Εμφάνιση αυτόματης συμπλήρωσης κατά την πληκτρολόγηση", - "historyTracking": "Παρακολούθηση Ιστορικού", - "historyTrackingDesc": "Παρακολούθηση εντολών τερματικού", - "syntaxHighlighting": "Επισήμανση Σύνταξης", - "syntaxHighlightingDesc": "Επισήμανση εξόδου τερματικού", - "commandPalette": "Παλέτα Εντολών", - "commandPaletteDesc": "Ενεργοποίηση συντόμευσης πληκτρολογίου", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Επανάνοιγμα καρτελών κατά τη σύνδεση", "reopenTabsOnLoginDesc": "Επαναφέρετε τις ανοιχτές καρτέλες σας όταν συνδέεστε ή ανανεώνετε τη σελίδα, ακόμα και από άλλη συσκευή", - "confirmTabClose": "Επιβεβαίωση Κλεισίματος Καρτέλας", - "confirmTabCloseDesc": "Ερώτηση πριν το κλείσιμο καρτελών τερματικού", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Εμφάνιση Ετικετών Υπολογιστή", - "showHostTagsDesc": "Εμφάνιση ετικετών στη λίστα κεντρικών υπολογιστών", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Κάντε κλικ για να αναπτύξετε τις Ενέργειες κεντρικού υπολογιστή", "hostTrayOnClickDesc": "Να εμφανίζονται πάντα τα κουμπιά σύνδεσης. Κάντε κλικ για να αναπτύξετε τις επιλογές διαχείρισης αντί να τοποθετήσετε τον δείκτη του ποντικιού.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Καρφίτσωμα εφαρμογής Rail", "pinAppRailDesc": "Διατηρήστε το αριστερό πλευρικό πλαίσιο εφαρμογής πάντα ανοιχτό αντί να επεκτείνεται κατά την τοποθέτηση του δείκτη του ποντικιού", - "settingsSnippets": "Δείγματα", - "foldersCollapsed": "Φάκελοι Που Απορρίφθηκαν", - "foldersCollapsedDesc": "Σύμπτυξη φακέλων από προεπιλογή", - "confirmExecution": "Επιβεβαίωση Εκτέλεσης", - "confirmExecutionDesc": "Επιβεβαιώστε πριν εκτελέσετε αποσπάσματα", - "settingsUpdates": "Ενημερώσεις", - "disableUpdateChecks": "Απενεργοποίηση Ελέγχου Ενημέρωσης", - "disableUpdateChecksDesc": "Διακοπή ελέγχου για ενημερώσεις", - "totpAuthenticator": "Πιστοποιητής TOTP", - "totpEnabled": "Το 2FA είναι ενεργοποιημένο", - "totpDisabled": "Προσθέστε επιπλέον ασφάλεια σύνδεσης", - "disable": "Απενεργοποίηση", - "enable": "Ενεργοποίηση", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Σαρώστε τον κωδικό QR ή εισάγετε το μυστικό στην εφαρμογή ελέγχου ταυτότητας και μετά εισάγετε τον 6-ψήφιο κωδικό", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Επαλήθευση", - "changePassword": "Αλλαγή Κωδικού Πρόσβασης", - "currentPasswordLabel": "Τρέχων Κωδικός Πρόσβασης", - "currentPasswordPlaceholder": "Τρέχων κωδικός πρόσβασης", - "newPasswordLabel": "Νέος Κωδικός Πρόσβασης", - "newPasswordPlaceholder": "Νέος κωδικός πρόσβασης", - "confirmPasswordLabel": "Επιβεβαίωση Νέου Κωδικού Πρόσβασης", - "confirmPasswordPlaceholder": "Επιβεβαίωση νέου κωδικού πρόσβασης", - "updatePassword": "Ενημέρωση Κωδικού Πρόσβασης", - "createApiKeyTitle": "Δημιουργία Κλειδιού Api", - "createApiKeyDescription": "Δημιουργήστε ένα νέο κλειδί API για την προγραμματική πρόσβαση.", - "apiKeyNameLabel": "Όνομα", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "προαιρετικό", - "cancel": "Ακύρωση", - "createKey": "Δημιουργία Κλειδιού", - "apiKeyCount": "{{count}} πλήκτρα", - "newKey": "Νέο Κλειδί", - "noApiKeys": "Δεν υπάρχουν ακόμα κλειδιά API.", - "apiKeyActive": "Ενεργό", - "apiKeyUsageHint": "Συμπεριλάβετε το κλειδί σας στο", - "apiKeyUsageHintHeader": "κεφαλίδα.", - "apiKeyPermissionsHint": "Τα κλειδιά κληρονομούν τα δικαιώματα του δημιουργού χρήστη.", - "roleUser": "Χρήστης", - "authMethodDual": "Διπλή Πιστοποίηση", + "optional": "optional", + "cancel": "Ματαίωση", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Αποτυχία έναρξης εγκατάστασης TOTP", - "totpEnter6Digits": "Εισάγετε έναν 6-ψήφιο κωδικό", - "totpEnabledSuccess": "Έλεγχος ταυτότητας δύο παραγόντων ενεργοποιήθηκε", - "totpInvalidCode": "Μη έγκυρος κωδικός, παρακαλώ προσπαθήστε ξανά", - "totpDisableInputRequired": "Εισάγετε τον κωδικό TOTP ή τον κωδικό πρόσβασης", - "totpDisabledSuccess": "Ο έλεγχος ταυτότητας δύο παραγόντων απενεργοποιήθηκε", - "totpDisableFailed": "Αποτυχία απενεργοποίησης του 2FA", - "totpDisableTitle": "Απενεργοποίηση 2FA", - "totpDisablePlaceholder": "Εισάγετε τον κωδικό TOTP ή τον κωδικό πρόσβασης", - "totpDisableConfirm": "Απενεργοποίηση 2FA", - "totpContinueVerify": "Συνεχίστε στην Επαλήθευση", - "totpVerifyTitle": "Επαλήθευση Κωδικού", - "totpBackupTitle": "Κωδικοί Αντιγράφων Ασφαλείας", - "totpDownloadBackup": "Λήψη Εφεδρικών Κωδικών", - "done": "Ολοκληρώθηκε", - "secretCopied": "Το μυστικό αντιγράφηκε στο πρόχειρο", - "apiKeyNameRequired": "Απαιτείται όνομα κλειδιού", - "apiKeyCreated": "API κλειδί \"{{name}}\" δημιουργήθηκε", - "apiKeyCreateFailed": "Αποτυχία δημιουργίας κλειδιού API", - "apiKeyUser": "Χρήστης", - "apiKeyExpires": "Λήγει", - "apiKeyRevoked": "API κλειδί \"{{name}}\" ανακλήθηκε", - "apiKeyRevokeFailed": "Αποτυχία ανάκλησης κλειδιού API", - "passwordFieldsRequired": "Απαιτούνται τρέχοντες και νέοι κωδικοί πρόσβασης", - "passwordMismatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", - "passwordTooShort": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 6 χαρακτήρες", - "passwordUpdated": "Ο κωδικός πρόσβασης ενημερώθηκε επιτυχώς", - "passwordUpdateFailed": "Αποτυχία ενημέρωσης κωδικού πρόσβασης", - "deletePasswordRequired": "Απαιτείται κωδικός πρόσβασης για να διαγράψετε το λογαριασμό σας", - "deleteFailed": "Αποτυχία διαγραφής λογαριασμού", - "deleting": "Διαγραφή...", - "colorPickerTooltip": "Άνοιγμα επιλογέα χρώματος", - "themeSystem": "Σύστημα", - "themeLight": "Φωτεινό", - "themeDark": "Σκοτεινό", - "themeDracula": "Δράκουλας", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Ολοκληρωμένο", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Ένα Σκοτεινό", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Ετικέτες", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Δοκιμάζω πάλι", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Αφαιρώ", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/es_ES.json b/src/ui/locales/translated/es_ES.json index 9db0a1b4..2f5b292b 100644 --- a/src/ui/locales/translated/es_ES.json +++ b/src/ui/locales/translated/es_ES.json @@ -1,579 +1,744 @@ { "credentials": { "folders": "Carpetas", - "folder": "Carpeta", + "folder": "Folder", "password": "Contraseña", - "key": "Clave", - "sshPrivateKey": "Clave privada SSH", - "upload": "Subir", - "keyPassword": "Contraseña de clave", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "Clave SSH", - "uploadPrivateKeyFile": "Subir archivo de clave privada", - "searchCredentials": "Buscar credenciales...", - "addCredential": "Añadir credencial", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Credenciales de búsqueda...", + "addCredential": "Add Credential", "caCertificate": "Certificado CA (-cert.pub)", - "caCertificateDescription": "Opcional: Cargue o pegue el archivo de certificado firmado por CA (por ejemplo, id_ed25519-cert.pub). Requerido cuando su servidor SSH utiliza la autorización basada en certificados.", - "uploadCertFile": "Subir archivo -cert.pub", - "clearCert": "Claro", - "certLoaded": "Certificado cargado", - "certPublicKeyLabel": "Certificado CA", - "certTypeLabel": "Tipo de certificado", - "pasteOrUploadCert": "Pegar o subir un certificado -cert.pub...", - "hasCaCert": "Tiene Certificado CA", - "noCaCert": "No hay Certificado CA" + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Orden predeterminada", + "sortNameAsc": "Nombre (A → Z)", + "sortNameDesc": "Nombre (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Borrar filtros", + "filterTypeGroup": "Type", + "filterTypePassword": "Contraseña", + "filterTypeKey": "Clave SSH", + "filterTagsGroup": "Etiquetas" }, "homepage": { - "failedToLoadAlerts": "Error al cargar las alertas", - "failedToDismissAlert": "Error al descartar la alerta" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Configuración del servidor", - "description": "Configure la URL del servidor Termix para conectarse a sus servicios de backend", - "serverUrl": "URL del servidor", - "enterServerUrl": "Por favor, introduzca una URL del servidor", - "saveFailed": "Error al guardar la configuración", - "saveError": "Error al guardar la configuración", - "saving": "Guardando...", - "saveConfig": "Guardar configuración", - "helpText": "Introduzca la URL en la que se ejecuta su servidor Termix (por ejemplo, http://localhost:30001 o https://your-server.com)", - "changeServer": "Cambiar servidor", - "mustIncludeProtocol": "La URL del servidor debe comenzar con http:// o https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Introduce la URL donde se ejecuta tu servidor Termix (por ejemplo, http://localhost:30001 o https://your-server.com).", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Permitir certificado no válido", "allowInvalidCertificateDesc": "Utilizar únicamente en servidores autogestionados de confianza con certificados autofirmados o basados en direcciones IP.", - "useEmbedded": "Usar servidor local", - "embeddedDesc": "Ejecutar Termix con el servidor local integrado (no se necesita un servidor remoto)", - "embeddedConnecting": "Conectando con el servidor local...", - "embeddedNotReady": "El servidor local aún no está listo. Por favor, espere un momento y vuelva a intentarlo.", - "localServer": "Servidor local" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Eliminar" }, "versionCheck": { - "error": "Error de comprobación de versión", - "checkFailed": "Error al comprobar actualizaciones", - "upToDate": "La aplicación está actualizada", - "currentVersion": "Estás ejecutando la versión {{version}}", - "updateAvailable": "Actualización disponible", - "newVersionAvailable": "¡Una nueva versión está disponible! Estás usando {{current}}, pero {{latest}} está disponible.", - "betaVersion": "Versión beta", - "betaVersionDesc": "Está ejecutando {{current}}, que es más reciente que la última versión estable {{latest}}.", - "releasedOn": "Liberado en {{date}}", - "downloadUpdate": "Descargar actualización", - "checking": "Buscando actualizaciones...", - "checkUpdates": "Buscar actualizaciones", - "checkingUpdates": "Buscando actualizaciones...", - "updateRequired": "Actualización requerida" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Comprobar si hay actualizaciones", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Cerrar", - "minimize": "Minimize", + "close": "Close", + "minimize": "Minimizar", "online": "En línea", "offline": "Desconectado", - "continue": "Continuar", - "maintenance": "Mantenimiento", - "degraded": "Degrado", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", "error": "Error", - "warning": "Advertencia", - "unsavedChanges": "Cambios sin guardar", - "dismiss": "Descartar", - "loading": "Cargando...", - "optional": "Opcional", - "connect": "Conectar", - "copied": "Copiado", - "connecting": "Conectando...", - "updateAvailable": "Actualización disponible", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Abrir en nueva pestaña", - "noReleases": "No hay lanzamientos", - "updatesAndReleases": "Actualizaciones y Publicaciones", - "newVersionAvailable": "Una nueva versión ({{version}}) está disponible.", - "failedToFetchUpdateInfo": "Error al obtener información de actualización", - "preRelease": "Pre-lanzamiento", - "noReleasesFound": "No se encontraron lanzamientos.", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", "cancel": "Cancelar", - "username": "Usuario", - "login": "Ingresar", - "register": "Registrarse", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Contraseña", - "confirmPassword": "Confirmar contraseña", - "back": "Atrás", - "save": "Guardar", - "saving": "Guardando...", - "delete": "Eliminar", - "rename": "Renombrar", - "edit": "Editar", - "add": "Añadir", - "confirm": "Confirmar", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", "no": "No", "or": "O", - "next": "Siguiente", - "previous": "Anterior", - "refresh": "Recargar", + "next": "Next", + "previous": "Previous", + "refresh": "Refrescar", "language": "Idioma", - "checking": "Comprobando...", - "checkingDatabase": "Comprobando conexión a la base de datos...", - "checkingAuthentication": "Comprobando autenticación...", - "backendReconnected": "Conexión con el servidor restaurada", - "connectionDegraded": "Se perdió la conexión del servidor, recuperando…", - "reload": "Reload", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Comprobando la autenticación...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Recargar", "remove": "Eliminar", - "create": "Crear", - "update": "Actualizar", + "create": "Create", + "update": "Update", "copy": "Copiar", - "copyFailed": "Error al copiar al portapapeles", - "maximize": "Maximize", - "restore": "Restaurar", - "of": "de" + "copyFailed": "Failed to copy to clipboard", + "maximize": "Maximizar", + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Inicio", + "home": "Home", "terminal": "Terminal", - "docker": "Doctor", - "tunnels": "Túneles", + "docker": "Estibador", + "tunnels": "Tunnels", "fileManager": "Gestor de archivos", - "serverStats": "Estadísticas del Servidor", - "admin": "Administrador", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Administración", "userProfile": "Perfil de usuario", - "splitScreen": "Dividir pantalla", - "confirmClose": "¿Cerrar esta sesión activa?", - "close": "Cerrar", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", "cancel": "Cancelar", - "sshManager": "Gestor SSH", - "cannotSplitTab": "No se puede dividir esta pestaña", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Copiar contraseña", - "copySudoPassword": "Copiar contraseña de Sudo", - "passwordCopied": "Contraseña copiada al portapapeles", - "noPasswordAvailable": "Contraseña no disponible", - "failedToCopyPassword": "Error al copiar la contraseña", - "refreshTab": "Actualizar conexión", - "openFileManager": "Abrir gestor de archivos", - "dashboard": "Tablero", - "networkGraph": "Gráfico de red", - "quickConnect": "Conexión rápida", - "sshTools": "Herramientas SSH", - "history": "Historial", - "hosts": "Anfitriones", - "snippets": "Fragmentos", - "hostManager": "Gestor de Anfitriones", - "credentials": "Credenciales", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Conexiones", - "roleAdministrator": "Administrador", - "roleUser": "Usuario" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Anfitriones", - "noHosts": "No hay hosts SSH", - "retry": "Reintentar", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Rever", "refresh": "Refrescar", - "optional": "Opcional", + "optional": "Optional", "downloadSample": "Descargar muestra", - "failedToDeleteHost": "Error al eliminar {{name}}", - "importSkipExisting": "Importar (saltar existente)", - "connectionDetails": "Detalles de la conexión", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Escritorio remoto", - "port": "Puerto", - "username": "Usuario", - "folder": "Carpeta", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "Etiquetas", - "pin": "Fijar", - "addHost": "Añadir Host", - "editHost": "Editar Host", - "cloneHost": "Clonar Host", - "enableTerminal": "Activar Terminal", - "enableTunnel": "Activar túnel", - "enableFileManager": "Habilitar gestor de archivos", - "enableDocker": "Activar Docker", - "defaultPath": "Ruta por defecto", - "connection": "Conexión", - "upload": "Subir", - "authentication": "Autenticación", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Contraseña", - "key": "Clave", + "key": "Key", "credential": "Credencial", - "none": "Ninguna", - "sshPrivateKey": "Clave privada SSH", - "keyType": "Tipo de clave", - "uploadFile": "Subir archivo", + "none": "Ninguno", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Túneles", - "tabDocker": "Doctor", - "tabFiles": "Archivos", - "tabStats": "Estadísticas", + "tabTunnels": "Tunnels", + "tabDocker": "Estibador", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Compartiendo", - "tabAuthentication": "Autenticación", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Túnel", "fileManager": "Gestor de archivos", - "serverStats": "Estadísticas del Servidor", + "serverStats": "Host Metrics", "status": "Estado", - "folderRenamed": "Carpeta \"{{oldName}}\" renombrada a \"{{newName}}\" correctamente", - "failedToRenameFolder": "Error al renombrar la carpeta", - "movedToFolder": "Movido a \"{{folder}}\"", - "editHostTooltip": "Editar host", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", "statusChecks": "Comprobaciones de estado", - "metricsCollection": "Colección de métricas", - "metricsInterval": "Intervalo de recolección de métricas", - "metricsIntervalDesc": "Con qué frecuencia recolectar estadísticas del servidor (5s - 1h)", - "behavior": "Comportamiento", - "themePreview": "Vista previa del tema", - "theme": "Tema", - "fontFamily": "Familia de fuente", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Familia de fuentes", "fontSize": "Tamaño de fuente", - "letterSpacing": "Espacio de letras", - "lineHeight": "Altura de línea", + "letterSpacing": "Espaciado entre letras", + "lineHeight": "Line Height", "cursorStyle": "Estilo del cursor", - "cursorBlink": "Bloque de cursor", - "scrollbackBuffer": "Búfer de desplazamiento", - "bellStyle": "Estilo de Campanilla", - "rightClickSelectsWord": "Haga clic derecho selecciona palabra", - "fastScrollModifier": "Modificador de Desplazamiento Rápido", - "fastScrollSensitivity": "Sensibilidad de desplazamiento rápido", - "sshAgentForwarding": "Desvío del agente SSH", - "backspaceMode": "Modo Backspace", - "startupSnippet": "Fragmento de inicio", - "selectSnippet": "Seleccionar fragmento", - "forceKeyboardInteractive": "Forzar interactivo del teclado", - "overrideCredentialUsername": "Reemplazar nombre de usuario de credenciales", - "overrideCredentialUsernameDesc": "Utilice el nombre de usuario especificado arriba en lugar del nombre de usuario de la credencial", - "jumpHostChain": "Cadena de Host de Salto", - "portKnocking": "Puesta de puerto", - "addKnock": "Añadir Puerto", - "addProxyNode": "Añadir Nodo", - "proxyNode": "Nodo proxy", - "proxyType": "Tipo de proxy", - "quickActions": "Acciones rápidas", - "sudoPasswordAutoFill": "Auto-relleno de contraseña de Sudo", - "sudoPassword": "Contraseña Sudo", - "keepaliveInterval": "Intervalo Keepalive (ms)", - "moshCommand": "MOSH comando", - "environmentVariables": "Variables de entorno", - "addVariable": "Añadir variable", - "docker": "Doctor", - "copyTerminalUrl": "Copiar URL de terminal", - "copyFileManagerUrl": "Copiar URL del gestor de archivos", - "copyRemoteDesktopUrl": "Copiar URL de escritorio remoto", - "failedToConnect": "Error al conectar a la consola", - "connect": "Conectar", - "disconnect": "Desconectar", - "start": "Comenzar", - "enableStatusCheck": "Activar verificación de estado", - "enableMetrics": "Activar métricas", - "bulkUpdateFailed": "Actualización masiva fallida", - "selectAll": "Seleccionar todo", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Estibador", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Deseleccionar todo", - "protocols": "Protocols", - "secureShell": "Caparazón seguro", - "virtualNetwork": "Red virtual", - "unencryptedShell": "Shell sin cifrar", - "addressIp": "Dirección / IP", - "friendlyName": "Nombre amigable", - "folderAndAdvanced": "Carpeta & Avanzada", - "privateNotes": "Notas privadas", - "privateNotesPlaceholder": "Detalles sobre este servidor...", - "pinToTop": "Fijar arriba", - "pinToTopDesc": "Mostrar siempre este host en la parte superior de la lista", - "portKnockingSequence": "Secuencia de golpe de puerto", - "addKnockBtn": "Añadir Knock", - "noPortKnocking": "No se ha configurado ningún golpe de puerto.", - "knockPort": "Puerto Knock", - "protocol": "Protocol", - "delayAfterMs": "Retardo Después de (ms)", - "useSocks5Proxy": "Usar proxy SOCKS5", - "useSocks5ProxyDesc": "Conexión de ruta a través de un servidor proxy", - "proxyHost": "Host del proxy", - "proxyPort": "Puerto proxy", - "proxyUsername": "Usuario del proxy", - "proxyPassword": "Contraseña del proxy", - "proxySingleMode": "Proxy único", - "proxyChainMode": "Cadena de proxy", - "you": "Tú", - "jumpHostChainLabel": "Cadena de Host de Salto", - "addJumpBtn": "Añadir Salto", - "noJumpHosts": "No hay hosts configurados.", - "selectAServer": "Seleccione un servidor...", - "sshPort": "Puerto SSH", - "authMethod": "Método Auth", - "storedCredential": "Credencial almacenada", - "selectACredential": "Seleccione una credencial...", - "keyTypeLabel": "Tipo de clave", - "keyTypeAuto": "Auto detectar", - "keyPasteTab": "Pegar", - "keyUploadTab": "Subir", - "keyFileLoaded": "Archivo de clave cargado", - "keyUploadClick": "Haga clic para subir .pem / .key / .ppk", - "clearKey": "Borrar tecla", - "keySaved": "Clave SSH guardada", - "keyReplaceNotice": "pegar una nueva clave abajo para reemplazarla", - "keyPassphraseSaved": "Contraseña guardada, escriba para cambiar", - "replaceKey": "Reemplazar clave", - "forceKeyboardInteractiveLabel": "Forzar interactiva del teclado", - "forceKeyboardInteractiveShortDesc": "Forzar entrada de contraseña manual incluso si las claves están presentes", - "terminalAppearance": "Apariencia Terminal", - "colorTheme": "Tema de color", - "fontFamilyLabel": "Familia de fuente", + "protocols": "Protocolos", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Agregar golpe", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protocolo", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Familia de fuentes", "fontSizeLabel": "Tamaño de fuente", "cursorStyleLabel": "Estilo del cursor", - "letterSpacingPx": "Espacio de letras (px)", - "lineHeightLabel": "Altura de línea", - "bellStyleLabel": "Estilo de Campanilla", - "backspaceModeLabel": "Modo Backspace", - "cursorBlinking": "Parpadeo de cursor", - "cursorBlinkingDesc": "Activar animación parpadeante para el cursor de la terminal", - "rightClickSelectsWordLabel": "Clic derecho selecciona palabra", - "rightClickSelectsWordShortDesc": "Seleccione la palabra bajo el cursor al hacer clic derecho", - "behaviorAndAdvanced": "Comportamiento & Avanzado", - "scrollbackBufferLabel": "Búfer de desplazamiento", - "scrollbackMaxLines": "Número máximo de líneas conservadas en el historial", - "sshAgentForwardingLabel": "Desvío del agente SSH", - "sshAgentForwardingShortDesc": "Pasa tus claves SSH locales a este host", - "enableAutoMosh": "Activar autoMosh", - "enableAutoMoshDesc": "Preferir Mosh sobre SSH si está disponible", - "enableAutoTmux": "Activar Auto-Tmux", - "enableAutoTmuxDesc": "Iniciar o adjuntar automáticamente a la sesión de tmux", - "sudoPasswordAutoFillLabel": "Auto-relleno de contraseña de Sudo", - "sudoPasswordAutoFillShortDesc": "Proporcionar automáticamente una contraseña sudo cuando se le solicite", - "sudoPasswordLabel": "Contraseña Sudo", - "environmentVariablesLabel": "Variables de entorno", - "addVariableBtn": "Añadir variable", - "noEnvVars": "No hay variables de entorno configuradas.", - "fastScrollModifierLabel": "Modificador de Desplazamiento Rápido", - "fastScrollSensitivityLabel": "Sensibilidad de desplazamiento rápido", - "moshCommandLabel": "Mosh Comando", - "startupSnippetLabel": "Fragmento de inicio", + "letterSpacingPx": "Espaciado entre letras (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Intervalo de mantenimiento de conexión (segundos)", - "maxKeepaliveMisses": "Misiones máximas de Keepalive", - "tunnelSettings": "Configuración del túnel", - "enableTunneling": "Activar túnel", - "enableTunnelingDesc": "Habilitar la funcionalidad de túnel SSH para este host", - "serverTunnelsSection": "Túneles de servidor", - "addTunnelBtn": "Añadir túnel", - "noTunnelsConfigured": "No hay túneles configurados.", - "tunnelLabel": "Túnel {{number}}", - "tunnelType": "Tipo de túnel", - "tunnelModeLocalDesc": "Reenviar un puerto local a un puerto en el servidor remoto (o un host accesible desde él).", - "tunnelModeRemoteDesc": "Reenviar un puerto en el servidor remoto a un puerto local de su máquina.", - "tunnelModeDynamicDesc": "Crear un proxy SOCKS5 en un puerto local para reenvío de puertos dinámicos.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Habilitar la tunelización", + "enableTunnelingDesc": "Habilitar la funcionalidad de túnel SSH para este host.", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Este host (túnel directo)", - "endpointHost": "Host de punto final", - "endpointPort": "Puerto final", - "bindHost": "Anfitrión de enlace", - "sourcePort": "Puerto de origen", - "maxRetries": "Reintentos máximos", - "retryIntervalS": "Intervalo de Reintentar (s)", - "autoStartLabel": "Autoiniciar", - "autoStartDesc": "Conectar automáticamente este túnel cuando se carga el host", - "tunnelConnecting": "Túnel conectando...", - "tunnelDisconnected": "Túnel desconectado", - "failedToConnectTunnel": "Error al conectar", - "failedToDisconnectTunnel": "Error al desconectar", - "dockerIntegration": "Integración Docker", - "enableDockerMonitor": "Activar Docker", - "enableDockerMonitorDesc": "Controlar y administrar contenedores en este host a través de Docker", - "enableFileManagerMonitor": "Habilitar gestor de archivos", - "enableFileManagerMonitorDesc": "Navegar y administrar archivos en este host a través de SFTP", - "defaultPathLabel": "Ruta por defecto", - "fileManagerPathHint": "El directorio a abrir cuando el gestor de archivos se inicia para este host.", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Conectar automáticamente este túnel cuando el host esté cargado.", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Contraseña", + "authTypeKey": "Clave SSH", + "authTypeCredential": "Credencial", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Ninguno", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", "statusChecksLabel": "Comprobaciones de estado", - "enableStatusChecks": "Activar comprobaciones de estado", - "enableStatusChecksDesc": "Haciendo ping periódicamente a este host para verificar disponibilidad", - "useGlobalInterval": "Usar intervalo global", - "useGlobalIntervalDesc": "Anular con el intervalo de verificación de estado del servidor", - "checkIntervalS": "Comprobar intervalo (s)", - "checkIntervalDesc": "Segundos entre cada ping de conectividad", - "metricsCollectionLabel": "Colección de métricas", - "enableMetricsLabel": "Activar métricas", - "enableMetricsDesc": "Recoge CPU, RAM, disco y uso de red desde este host", - "useGlobalMetrics": "Usar intervalo global", - "useGlobalMetricsDesc": "Anular con el intervalo de métricas del servidor", - "metricsIntervalS": "Intervalo de métricas (s)", - "metricsIntervalDesc2": "Segundos entre instantáneas métricas", - "visibleWidgets": "Widgets visibles", - "cpuUsageLabel": "Uso de CPU", - "cpuUsageDesc": "Porcentaje de la CPU, promedios de carga, gráfica de esparkline", - "memoryLabel": "Uso de memoria", - "memoryDesc": "Uso de RAM, intercambio, caché", - "storageLabel": "Uso del disco", - "storageDesc": "Uso de disco por punto de montaje", - "networkLabel": "Interfaces de red", - "networkDesc": "Lista de interfaces y ancho de banda", - "uptimeLabel": "Actualización", - "uptimeDesc": "Tiempo de puesta del sistema y tiempo de arranque", - "systemInfoLabel": "Información del sistema", - "systemInfoDesc": "OS, núcleo, nombre de host, arquitectura", - "recentLoginsLabel": "Entradas recientes", - "recentLoginsDesc": "Eventos de inicio de sesión fallidos y exitosos", - "topProcessesLabel": "Procesos más altos", - "topProcessesDesc": "PID, CPU%, MEM%, comando", - "listeningPortsLabel": "Puertos de escucha", - "listeningPortsDesc": "Puertos abiertos con proceso y estado", - "firewallLabel": "Cortafuegos", - "firewallDesc": "Firewall, AppArmor, estado SELinux", - "quickActionsLabel": "Acciones rápidas", - "quickActionsToolbar": "Las acciones rápidas aparecen como botones en la barra de herramientas de Server Stats para la ejecución de comandos con un solo clic.", - "noQuickActions": "Aún no hay acciones rápidas.", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Haz ping periódicamente a este host para verificar su disponibilidad.", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", "buttonLabel": "Etiqueta del botón", - "selectSnippetPlaceholder": "Seleccionar fragmento...", - "addActionBtn": "Añadir Acción", - "hostSharedSuccessfully": "Servidor compartido correctamente", - "failedToShareHost": "Error al compartir host", - "accessRevoked": "Acceso revocado", - "failedToRevokeAccess": "Error al revocar el acceso", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", "cancelBtn": "Cancelar", - "savingBtn": "Guardando...", - "addHostBtn": "Añadir Host", - "hostUpdated": "Host actualizado", - "hostCreated": "Host creado", - "failedToSave": "Error al guardar el host", - "credentialUpdated": "Credencial actualizado", - "credentialCreated": "Creación de credenciales", - "failedToSaveCredential": "Error al guardar la credencial", - "backToHosts": "Volver a hosts", - "backToCredentials": "Volver a las credenciales", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Fijado", - "noHostsFound": "No hay hosts", - "tryDifferentTerm": "Prueba un término diferente", - "addFirstHost": "Añade tu primer host para empezar", - "noCredentialsFound": "No se encontraron credenciales", - "addCredentialBtn": "Añadir credencial", - "updateCredentialBtn": "Actualizar credencial", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Características", - "noFolder": "(Sin carpeta)", - "deleteSelected": "Eliminar", - "exitSelection": "Salir de la selección", - "importSkip": "Importar (saltar existente)", - "importOverwrite": "Importar (sobrescribir)", - "collapseBtn": "Colapso", - "importExportBtn": "Importar / Exportar", - "hostStatusesRefreshed": "Estados de host actualizados", - "failedToRefreshHosts": "Error al actualizar hosts", - "movedHostTo": "Mover {{host}} a \"{{folder}}\"", - "failedToMoveHost": "Error al mover el host", - "folderRenamedTo": "Carpeta renombrada a \"{{name}}\"", - "deletedFolder": "Carpeta eliminada \"{{name}}\"", - "failedToDeleteFolder": "Error al eliminar la carpeta", - "deleteAllInFolder": "¿Eliminar todos los hosts de \"{{name}}\"? Esto no se puede deshacer.", - "deletedHost": "Eliminado {{name}}", - "copiedToClipboard": "Copiado al portapapeles", - "terminalUrlCopied": "URL de terminal copiada", - "fileManagerUrlCopied": "URL del gestor de archivos copiado", - "tunnelUrlCopied": "URL del túnel copiado", - "dockerUrlCopied": "URL Docker copiada", - "serverStatsUrlCopied": "URL de las estadísticas del servidor copiada", - "rdpUrlCopied": "URL RDP copiada", - "vncUrlCopied": "URL VNC copiada", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancelar", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Estado", + "GroupByProtocol": "Protocolo", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", "telnetUrlCopied": "URL de Telnet copiada", - "remoteDesktopUrlCopied": "URL de escritorio remoto copiada", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Ampliar acciones", "collapseActions": "Acciones de colapso", "wakeOnLanAction": "Activar la LAN", - "wakeOnLanSuccess": "Paquete mágico enviado a {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Error al enviar el paquete mágico", - "cloneHostAction": "Clonar Host", - "copyAddress": "Copiar dirección", - "copyLink": "Copiar enlace", - "copyTerminalUrlAction": "Copiar URL de terminal", - "copyFileManagerUrlAction": "Copiar URL del gestor de archivos", - "copyTunnelUrlAction": "Copiar URL del túnel", - "copyDockerUrlAction": "Copiar URL de Docker", - "copyServerStatsUrlAction": "Copiar URL de las estadísticas del servidor", - "copyRdpUrlAction": "Copiar URL RDP", - "copyVncUrlAction": "Copiar URL VNC", - "copyTelnetUrlAction": "Copiar URL de Telnet", - "copyRemoteDesktopUrlAction": "Copiar URL de escritorio remoto", - "deleteCredentialConfirm": "¿Eliminar credencial \"{{name}}\"?", - "deletedCredential": "Eliminado {{name}}", - "deploySSHKeyTitle": "Desplegar clave SSH", - "deployingBtn": "Desplegando...", - "deployBtn": "Desplegar", - "failedToDeployKey": "Error al desplegar la clave", - "deleteHostsConfirm": "¿Eliminar {{count}} host{{plural}}? Esto no se puede deshacer.", - "movedToRoot": "Mover a la raíz", - "failedToMoveHosts": "Error al mover hosts", - "enableTerminalFeature": "Activar Terminal", - "disableTerminalFeature": "Desactivar Terminal", - "enableFilesFeature": "Habilitar archivos", - "disableFilesFeature": "Desactivar Archivos", - "enableTunnelsFeature": "Activar túneles", - "disableTunnelsFeature": "Desactivar túneles", - "enableDockerFeature": "Activar Docker", - "disableDockerFeature": "Desactivar Docker", - "addTagsPlaceholder": "Añadir etiquetas...", - "authDetails": "Detalles de autenticación", - "credType": "Tipo", - "generateKeyPairDesc": "Generar un nuevo par de claves, tanto las claves privadas como las públicas se llenarán automáticamente.", - "generatingKey": "Generando...", - "generateLabel": "Generar {{label}}", - "uploadFileBtn": "Subir archivo", - "keyPassphraseOptional": "Contraseña de clave (opcional)", - "sshPublicKeyOptional": "Clave pública SSH (opcional)", - "publicKeyGenerated": "Clave pública generada", - "failedToGeneratePublicKey": "No se pudo derivar la clave pública", - "publicKeyCopied": "Clave pública copiada", - "keyPairGenerated": "Se generó un par de claves {{label}}", - "failedToGenerateKeyPair": "Error al generar el par de claves", - "searchHostsPlaceholder": "Buscar hosts, direcciones, etiquetas…", - "searchCredentialsPlaceholder": "Buscar credenciales…", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", "refreshBtn": "Refrescar", - "addTag": "Añadir etiquetas...", - "deleteConfirmBtn": "Eliminar", - "tunnelRequirementsText": "El servidor SSH debe tener GatewayPorts sí, AllowTcpForwarding sí, y PermitRootLogin yes configurado en src/ssh/sshd_config.", - "deleteHostConfirm": "¿Eliminar \"{{name}}\"?", - "enableAtLeastOneProtocol": "Habilitar al menos un protocolo anterior para configurar la autenticación y la configuración de conexión.", - "keyPassphrase": "Contraseña de clave", - "connectBtn": "Conectar", - "disconnectBtn": "Desconectar", - "basicInformation": "Información básica", - "authDetailsSection": "Detalles de autenticación", - "credTypeLabel": "Tipo", - "hostsTab": "Anfitriones", - "credentialsTab": "Credenciales", - "selectMultiple": "Seleccionar múltiples", - "selectHosts": "Seleccionar hosts", - "connectionLabel": "Conexión", - "authenticationLabel": "Autenticación", - "generateKeyPairTitle": "Generar par de claves", - "generateKeyPairDescription": "Generar un nuevo par de claves, tanto las claves privadas como las públicas se llenarán automáticamente.", - "generateFromPrivateKey": "Generar desde Clave Privada", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "El servidor SSH debe tener las opciones GatewayPorts yes, AllowTcpForwarding yes y PermitRootLogin yes configuradas en /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", "refreshBtn2": "Refrescar", - "exitSelectionTitle": "Salir de la selección", - "exportAll": "Exportar todo", - "addHostBtn2": "Añadir Host", - "addCredentialBtn2": "Añadir credencial", - "checkingHostStatuses": "Comprobando estados de host...", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Fijado", - "hostsExported": "Hosts exportados con éxito", + "hostsExported": "Hosts exported successfully", "exportFailed": "Error al exportar los hosts.", - "sampleDownloaded": "Archivo de ejemplo descargado", - "failedToDeleteCredential2": "Error al eliminar la credencial", - "noFolderOption": "(Sin carpeta)", - "nSelected": "{{count}} seleccionado", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Características", "moveMenu": "Mover", + "connectSelected": "Connect", "cancelSelection": "Cancelar", - "deployDialogDesc": "Desplegar {{name}} a las llaves autorizadas de un host.", - "targetHostLabel": "Anfitrión objetivo", - "selectHostOption": "Seleccione un host...", - "keyDeployedSuccess": "Clave desplegada con éxito", - "failedToDeployKey2": "Error al desplegar la clave", - "deletedCount": "Equipos {{count}} eliminados", - "failedToDeleteCount": "Error al eliminar hosts {{count}}", - "duplicatedHost": "Duplicado \"{{name}}\"", - "failedToDuplicateHost": "Error al duplicar host", - "updatedCount": "Equipos {{count}} actualizados", - "friendlyNameLabel": "Nombre amigable", - "descriptionLabel": "Descripción", - "loadingHost": "Cargando host...", - "loadingHosts": "Cargando hosts...", - "loadingCredentials": "Cargando credenciales...", - "noHostsYet": "Aún no hay hosts", - "noHostsMatchSearch": "Ningún host coincide con tu búsqueda", - "hostNotFound": "Host no encontrado", - "searchHosts": "Buscar hosts...", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Ordenar hosts", "sortDefault": "Orden predeterminada", "sortNameAsc": "Nombre (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Túnel", "filterFeatureDocker": "Estibador", "filterTagsGroup": "Etiquetas", - "shareHost": "Compartir Host", - "shareHostTitle": "Compartir: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Este host debe utilizar una credencial para permitir compartir. Editar el host y asignar una credencial primero." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Conexión", - "authentication": "Autenticación", - "connectionSettings": "Configuración de conexión", - "displaySettings": "Mostrar ajustes", - "audioSettings": "Ajustes de audio", - "rdpPerformance": "Rendimiento RDP", - "deviceRedirection": "Redirección del dispositivo", - "session": "Sesión", - "gateway": "Pasarela", - "remoteApp": "Aplicación remota", - "clipboard": "Portapapeles", - "sessionRecording": "Grabación de sesión", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credencial", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Ajustes de VNC", - "terminalSettings": "Ajustes de Terminal", - "rdpPort": "Puerto RDP", - "username": "Usuario", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Contraseña", - "domain": "Dominio", - "securityMode": "Modo de seguridad", - "colorDepth": "Profundidad de color", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Altura", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Redimensionar Método", - "clientName": "Nombre del cliente", - "initialProgram": "Programa inicial", - "serverLayout": "Diseño del servidor", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Puerto de pasarela", - "gatewayUsername": "Usuario de Gateway", - "gatewayPassword": "Contraseña del Gateway", - "gatewayDomain": "Dominio de Gateway", - "remoteAppProgram": "Programa RemoteApp", - "workingDirectory": "Directorio de trabajo", - "arguments": "Argumentos", - "normalizeLineEndings": "Normalizar terminaciones de línea", - "recordingPath": "Ruta de grabación", - "recordingName": "Nombre de grabación", - "macAddress": "Dirección MAC", - "broadcastAddress": "Dirección de Broadcast", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Tiempo de espera (s)", - "driveName": "Nombre de Unidad", - "drivePath": "Ruta de la Unidad", - "ignoreCertificate": "Ignorar certificado", - "ignoreCertificateDesc": "Permitir conexiones a hosts con certificados autofirmados", - "forceLossless": "Forzar sin pérdida", - "forceLosslessDesc": "Forzar la codificación de imágenes sin pérdida (mayor calidad, más ancho de banda)", - "disableAudio": "Desactivar audio", - "disableAudioDesc": "Silenciar todo el audio de la sesión remota", - "enableAudioInput": "Activar entrada de audio (micrófono)", - "enableAudioInputDesc": "Reenviar el micrófono local a la sesión remota", - "wallpaper": "Fondo de pantalla", - "wallpaperDesc": "Mostrar fondo de escritorio (desactivar mejora el rendimiento)", - "theming": "Tema", - "themingDesc": "Habilitar temas y estilos visuales", - "fontSmoothing": "Suavizado de fuente", - "fontSmoothingDesc": "Habilitar el renderizado de tipografía Clear Type", - "fullWindowDrag": "Arrastre de Ventana completa", - "fullWindowDragDesc": "Mostrar el contenido de la ventana mientras se arrastra", - "desktopComposition": "Composición de escritorio", - "desktopCompositionDesc": "Activar efectos de cristal Aero", - "menuAnimations": "Animaciones de menú", - "menuAnimationsDesc": "Habilitar animaciones de diapositivas y de fundido de menú", - "disableBitmapCaching": "Desactivar Caché de Bitmap", - "disableBitmapCachingDesc": "Desactivar caché de mapa de bits (puede ayudar con fallos)", - "disableOffscreenCaching": "Desactivar caché offscreen", - "disableOffscreenCachingDesc": "Desactivar caché offscreen", - "disableGlyphCaching": "Desactivar el caché de glifos", - "disableGlyphCachingDesc": "Desactivar caché de glifos", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Usar pipeline de gráficos remota", - "enablePrinting": "Habilitar impresión", - "enablePrintingDesc": "Redirigir impresoras locales a la sesión remota", - "enableDriveRedirection": "Habilitar redirección de Drive", - "enableDriveRedirectionDesc": "Mapear una carpeta local como una unidad en la sesión remota", - "createDrivePath": "Crear ruta de unidad", - "createDrivePathDesc": "Crear automáticamente la carpeta si no existe", - "disableDownload": "Desactivar descarga", - "disableDownloadDesc": "Evitar descargar archivos de la sesión remota", - "disableUpload": "Desactivar subida", - "disableUploadDesc": "Evitar la subida de archivos a la sesión remota", - "enableTouch": "Activar Toque", - "enableTouchDesc": "Activar reenvío de entrada táctil", - "consoleSession": "Sesión de consola", - "consoleSessionDesc": "Conectar a la consola (sesión 0) en lugar de una nueva sesión", - "sendWolPacket": "Enviar paquete WOL", - "sendWolPacketDesc": "Enviar un paquete mágico para despertar este host antes de conectar", - "disableCopy": "Desactivar copia", - "disableCopyDesc": "Evitar copiar texto de la sesión remota", - "disablePaste": "Desactivar Pegar", - "disablePasteDesc": "Evitar pegar texto en la sesión remota", - "createPathIfMissing": "Crear ruta si falta", - "createPathIfMissingDesc": "Crear automáticamente el directorio de grabación", - "excludeOutput": "Excluir salida", - "excludeOutputDesc": "No grabar salida de pantalla (sólo metadatos)", - "excludeMouse": "Excluir ratón", - "excludeMouseDesc": "No grabar movimientos del ratón", - "includeKeystrokes": "Incluye trazos de teclado", - "includeKeystrokesDesc": "Grabar pulsaciones de teclas crudas además de la salida de pantalla", - "vncPort": "Puerto VNC", - "vncPassword": "Contraseña VNC", - "vncUsernameOptional": "Nombre de usuario (opcional)", - "vncLeaveBlank": "Dejar en blanco si no es necesario", - "cursorMode": "Modo cursor", - "swapRedBlue": "Intercambiar rojo/azul", - "swapRedBlueDesc": "Intercambia los canales de color rojo y azul (corrige algunos problemas de color)", - "readOnly": "Sólo lectura", - "readOnlyDesc": "Ver la pantalla remota sin enviar ninguna entrada", - "telnetPort": "Puerto Telnet", - "terminalType": "Tipo de terminal", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", - "fontSize": "Font Size", - "colorScheme": "Esquema de color", - "backspaceKey": "Retroceso clave", - "saveHostFirst": "Guardar el host primero.", - "sharingOptionsAfterSave": "Las opciones de compartir están disponibles después de que el host haya sido guardado.", - "sharingLoadError": "Error al cargar los datos compartidos. Comprueba tu conexión e inténtalo de nuevo.", - "shareHostSection": "Compartir Host", - "shareWithUser": "Compartir con el usuario", - "shareWithRole": "Compartir con Rol", - "selectUser": "Seleccionar usuario", - "selectRole": "Seleccionar rol", - "selectUserOption": "Seleccione un usuario...", - "selectRoleOption": "Seleccione un rol...", - "permissionLevel": "Nivel de permisos", - "expiresInHours": "Caduca en (horas)", - "noExpiryPlaceholder": "Dejar vacío para no expirar", - "shareBtn": "Compartir", - "currentAccess": "Acceso actual", - "typeHeader": "Tipo", + "fontSize": "Tamaño de fuente", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Permiso", - "grantedByHeader": "Concedido por", - "expiresHeader": "Caduca", - "noAccessEntries": "Aún no hay entradas de acceso.", - "expiredLabel": "Caducó", - "neverLabel": "Nunca", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", "cancelBtn": "Cancelar", - "savingBtn": "Guardando...", - "updateHostBtn": "Actualizar Host", - "addHostBtn": "Añadir Host" + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Buscar hosts, comandos o ajustes...", - "quickActions": "Acciones rápidas", - "hostManager": "Gestor de Anfitriones", - "hostManagerDesc": "Gestionar, añadir o editar hosts", - "addNewHost": "Añadir nuevo Host", - "addNewHostDesc": "Registrar un nuevo host", - "adminSettings": "Configuración de Admin", - "adminSettingsDesc": "Configurar preferencias del sistema y usuarios", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", "userProfile": "Perfil de usuario", - "userProfileDesc": "Administrar tu cuenta y preferencias", - "addCredential": "Añadir credencial", - "addCredentialDesc": "Guardar claves o contraseñas SSH", - "recentActivity": "Actividad reciente", - "serversAndHosts": "Servidores y hosts", - "noHostsFound": "No se han encontrado hosts que coincidan con \"{{search}}\"", - "links": "Enlaces", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Seleccionar", - "toggleWith": "Cambiar con" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Ninguna pestaña asignada", + "noTabAssigned": "No tab assigned", "focusedPane": "Panel activo" }, "connections": { "noConnections": "Sin conexiones", "noConnectionsDesc": "Abra una terminal, un administrador de archivos o un escritorio remoto para ver las conexiones aquí.", - "connectedFor": "Conectado para {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Conectado", "disconnected": "Desconectado", "closeTab": "Cerrar pestaña", @@ -801,358 +981,374 @@ "sectionBackground": "Fondo", "backgroundDesc": "Las sesiones se mantienen activas durante 30 minutos después de la desconexión y se pueden volver a conectar.", "persisted": "Persistió en segundo plano", - "expiresIn": "Caduca en {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Buscar conexiones...", - "noSearchResults": "No se encontraron conexiones que coincidan con su búsqueda." + "noSearchResults": "No se encontraron conexiones que coincidan con su búsqueda.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Conectando a la sesión {{type}}...", - "connectionError": "Error de conexión", - "connectionFailed": "Conexión fallida", - "failedToConnect": "Error al obtener el token de conexión", - "hostNotFound": "Host no encontrado", - "noHostSelected": "Ningún host seleccionado", - "reconnect": "Volver a conectar", - "retry": "Reintentar", - "guacdUnavailable": "El servicio de escritorio remoto (guacd) no está disponible. Por favor, asegúrese de que guacd se está ejecutando y es accesible y configurado correctamente en la configuración del administrador.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Falló la conexión.", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Reconectar", + "retry": "Rever", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Ganar + L (Pantalla de bloqueo)", - "winKey": "Clave de Windows", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Cambio", - "win": "Gana", - "stickyActive": "{{key}} (agarrado - click para lanzar)", - "stickyInactive": "{{key}} (click para atajar)", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Escape", "tab": "Tab", - "home": "Inicio", - "end": "Fin", - "pageUp": "Subir página", - "pageDown": "Página abajo", - "arrowUp": "Flecha arriba", - "arrowDown": "Flecha abajo", - "arrowLeft": "Flecha izquierda", - "arrowRight": "Flecha derecha", - "fnToggle": "Teclas de función", - "reconnect": "Volver a conectar sesión", - "collapse": "Colapsar barra de herramientas", - "expand": "Expandir barra de herramientas", - "dragHandle": "Arrastre para reposicionar" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Conectar al Host", - "clear": "Claro", - "paste": "Pegar", - "reconnect": "Volver a conectar", - "connectionLost": "Conexión perdida", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconectar", + "connectionLost": "Connection lost", "connected": "Conectado", - "clipboardWriteFailed": "No se pudo copiar al portapapeles. Asegúrese de que la página se sirve sobre HTTPS o localhost.", - "clipboardReadFailed": "Error al leer desde el portapapeles. Asegúrate de que los permisos del portapapeles estén garantizados.", - "clipboardHttpWarning": "Pegar requiere HTTPS. Usar Ctrl+Shift+V o servir Termix sobre HTTPS.", - "unknownError": "Ocurrió un error desconocido", - "websocketError": "Error de conexión WebSocket", - "connecting": "Conectando...", - "noHostSelected": "Ningún host seleccionado", - "reconnecting": "Reconectando... ({{attempt}}/{{max}})", - "reconnected": "Reconectado correctamente", - "tmuxSessionCreated": "sesión tmux creada: {{name}}", - "tmuxSessionAttached": "sesión tmux adjunta: {{name}}", - "tmuxUnavailable": "tmux no está instalado en el host remoto, volviendo a la shell estándar", - "tmuxSessionPickerTitle": "sesiones de tmux", - "tmuxSessionPickerDesc": "Sesiones de tmux existentes encontradas en este host. Seleccione una para reconstruir o crear una nueva sesión.", - "tmuxWindows": "Ventanas", - "tmuxWindowCount": "Ventana {{count}}", - "tmuxAttached": "Clientes adjuntos", - "tmuxAttachedCount": "{{count}} adjunto", - "tmuxLastActivity": "Última actividad", - "tmuxTimeJustNow": "justo ahora", - "tmuxTimeMinutes": "{{count}}hace m", - "tmuxTimeHours": "{{count}}hace h", - "tmuxTimeDays": "{{count}}hace d", - "tmuxCreateNew": "Iniciar nueva sesión", - "tmuxCopyHint": "Ajustar selección y presionar Enter para copiar al portapapeles", - "tmuxDetach": "Separar de la sesión de tmux", - "tmuxDetached": "Separado de la sesión de tmux", - "maxReconnectAttemptsReached": "Máximo de intentos de reconexión alcanzados", - "closeTab": "Cerrar", - "connectionTimeout": "Tiempo de conexión agotado", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Ejecutando {{command}} - {{host}}", - "totpRequired": "Autenticación de dos factores requerida", - "totpCodeLabel": "Código de verificación", - "totpVerify": "Verificar", - "warpgateAuthRequired": "Autenticación de Warpgate requerida", - "warpgateSecurityKey": "Clave de seguridad", - "warpgateAuthUrl": "URL de autenticación", - "warpgateOpenBrowser": "Abrir en el navegador", - "warpgateContinue": "He completado la autenticación", - "opksshAuthRequired": "Autenticación OPKSSH requerida", - "opksshAuthDescription": "Autenticación completa en su navegador para continuar. Esta sesión permanecerá válida durante 24 horas.", - "opksshOpenBrowser": "Abrir navegador para autenticar", - "opksshWaitingForAuth": "Esperando la autenticación en el navegador...", - "opksshAuthenticating": "Procesando autenticación...", - "opksshTimeout": "Se ha agotado el tiempo de autenticación. Por favor, inténtalo de nuevo.", - "opksshAuthFailed": "Error de autenticación. Por favor, comprueba tus credenciales e inténtalo de nuevo.", - "opksshSignInWith": "Iniciar sesión con {{provider}}", - "sudoPasswordPopupTitle": "¿Insertar contraseña?", - "websocketAbnormalClose": "Conexión cerrada inesperadamente. Esto puede deberse a un problema de configuración SSL o proxy inverso. Por favor, compruebe los registros del servidor.", - "connectionLogTitle": "Registro de conexión", - "connectionLogCopy": "Copiar registros al portapapeles", - "connectionLogEmpty": "Aún no hay registros de conexión", - "connectionLogWaiting": "Esperando los registros de conexión...", - "connectionLogCopied": "Registros de conexión copiados al portapapeles", - "connectionLogCopyFailed": "Error al copiar los registros al portapapeles", - "connectionRejected": "Conexión rechazada por el servidor. Por favor, compruebe su autenticación y configuración de red.", - "hostKeyRejected": "Verificación de clave del host SSH rechazada. Conexión cancelada.", - "sessionTakenOver": "La sesión fue abierta en otra pestaña. Volviendo a conectar..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Abierto", + "linkDialogCopy": "Copiar", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Pestaña dividida", + "addToSplit": "Agregar a Dividir", + "removeFromSplit": "Eliminar de Split" + } }, "fileManager": { - "noHostSelected": "Ningún host seleccionado", - "initializingEditor": "Inicializando editor...", - "file": "Fichero", - "folder": "Carpeta", - "uploadFile": "Subir archivo", - "downloadFile": "Descargar", - "extractArchive": "Extraer archivo", - "extractingArchive": "Extrayendo {{name}}...", - "archiveExtractedSuccessfully": "{{name}} extraído con éxito", - "extractFailed": "Error al extraer", - "compressFile": "Comprimir archivo", - "compressFiles": "Comprimir archivos", - "compressFilesDesc": "Comprimir elementos {{count}} en un archivo", - "archiveName": "Nombre de archivo", - "enterArchiveName": "Introduzca el nombre del archivo...", - "compressionFormat": "Formato de compresión", - "selectedFiles": "Archivos seleccionados", - "andMoreFiles": "y {{count}} más...", - "compress": "Comprimir", - "compressingFiles": "Comprimiendo objetos {{count}} en {{name}}...", - "filesCompressedSuccessfully": "{{name}} creado con éxito", - "compressFailed": "Compresión fallida", - "edit": "Editar", - "preview": "Vista previa", - "previous": "Anterior", - "next": "Siguiente", - "pageXOfY": "Página {{current}} de {{total}}", - "zoomOut": "Apagar", - "zoomIn": "Acercar en", - "newFile": "Nuevo archivo", - "newFolder": "Nueva carpeta", - "rename": "Renombrar", - "uploading": "Subiendo...", - "uploadingFile": "Subiendo {{name}}...", - "fileName": "Nombre del archivo", - "folderName": "Nombre de carpeta", - "fileUploadedSuccessfully": "Archivo \"{{name}}\" subido correctamente", - "failedToUploadFile": "Error al subir el archivo", - "fileDownloadedSuccessfully": "Archivo \"{{name}}\" descargado correctamente", - "failedToDownloadFile": "Error al descargar el archivo", - "fileCreatedSuccessfully": "Archivo \"{{name}}\" creado correctamente", - "folderCreatedSuccessfully": "Carpeta \"{{name}}\" creada correctamente", - "failedToCreateItem": "Error al crear el artículo", - "operationFailed": "Operación {{operation}} fallida para {{name}}: {{error}}", - "failedToResolveSymlink": "Error al resolver el enlace simbólico", - "itemsDeletedSuccessfully": "{{count}} elementos eliminados con éxito", - "failedToDeleteItems": "Error al eliminar elementos", - "sudoPasswordRequired": "Contraseña de administrador requerida", - "enterSudoPassword": "Introduzca la contraseña sudo para continuar con esta operación", - "sudoPassword": "Contraseña Sudo", - "sudoOperationFailed": "Error en la operación Sudo", - "sudoAuthFailed": "Falló la autenticación Sudo", - "dragFilesToUpload": "Borrar archivos aquí para subir", - "emptyFolder": "Esta carpeta está vacía", - "searchFiles": "Buscar archivos...", - "upload": "Subir", - "selectHostToStart": "Seleccione un host para iniciar la gestión de archivos", - "sshRequiredForFileManager": "El gestor de archivos requiere SSH. Este host no tiene SSH habilitado.", - "failedToConnect": "No se pudo conectar a SSH", - "failedToLoadDirectory": "Error al cargar el directorio", - "noSSHConnection": "No hay conexión SSH disponible", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "copy": "Copiar", - "cut": "Cortar", - "paste": "Pegar", - "copyPath": "Copiar ruta", - "copyPaths": "Copiar rutas", - "delete": "Eliminar", - "properties": "Propiedades", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", "refresh": "Refrescar", - "downloadFiles": "Descargar archivos {{count}} al navegador", - "copyFiles": "Copiar elementos {{count}}", - "cutFiles": "Cortar objetos {{count}}", - "deleteFiles": "Eliminar elementos {{count}}", - "filesCopiedToClipboard": "{{count}} elementos copiados al portapapeles", - "filesCutToClipboard": "{{count}} elementos cortados al portapapeles", - "pathCopiedToClipboard": "Ruta copiada al portapapeles", - "pathsCopiedToClipboard": "{{count}} rutas copiadas al portapapeles", - "failedToCopyPath": "Error al copiar la ruta al portapapeles", - "movedItems": "Movidos {{count}} objetos", - "failedToDeleteItem": "Error al eliminar el elemento", - "itemRenamedSuccessfully": "{{type}} renombrado con éxito", - "failedToRenameItem": "Error al renombrar el elemento", - "download": "Descargar", - "permissions": "Permisos", - "size": "Tamaño", - "modified": "Modificado", - "path": "Ruta", - "confirmDelete": "¿Está seguro que desea eliminar {{name}}?", - "permissionDenied": "Permiso denegado", - "serverError": "Error del servidor", - "fileSavedSuccessfully": "Archivo guardado correctamente", - "failedToSaveFile": "Error al guardar el archivo", - "confirmDeleteSingleItem": "¿Está seguro que desea eliminar permanentemente \"{{name}}\"?", - "confirmDeleteMultipleItems": "¿Está seguro que desea eliminar permanentemente los elementos {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "¿Estás seguro de que quieres eliminar permanentemente los elementos {{count}} ? Esto incluye carpetas y su contenido.", - "confirmDeleteFolder": "¿Está seguro de que desea eliminar permanentemente la carpeta \"{{name}}\" y todo su contenido?", - "permanentDeleteWarning": "Esta acción no se puede deshacer. El elemento(s) se eliminará permanentemente del servidor.", - "recent": "Recientes", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Fijado", - "folderShortcuts": "Atajos de carpeta", - "failedToReconnectSSH": "Error al volver a conectar la sesión SSH", - "openTerminalHere": "Abrir Terminal Aquí", - "run": "Ejecutar", - "openTerminalInFolder": "Abrir terminal en esta carpeta", - "openTerminalInFileLocation": "Abrir terminal en la ubicación del archivo", - "runningFile": "Ejecutando - {{file}}", - "onlyRunExecutableFiles": "Sólo se pueden ejecutar archivos ejecutables", - "directories": "Directorios", - "removedFromRecentFiles": "Eliminado \"{{name}}\" de archivos recientes", - "removeFailed": "Error al eliminar", - "unpinnedSuccessfully": "No fijado con éxito \"{{name}}\"", - "unpinFailed": "Fallo al desfijar", - "removedShortcut": "Atajo eliminado \"{{name}}\"", - "removeShortcutFailed": "Error al eliminar acceso directo", - "clearedAllRecentFiles": "Limpiado todos los archivos recientes", - "clearFailed": "Error al limpiar", - "removeFromRecentFiles": "Eliminar de archivos recientes", - "clearAllRecentFiles": "Borrar todos los archivos recientes", - "unpinFile": "Desanclar archivo", - "removeShortcut": "Eliminar acceso directo", - "pinFile": "Fijar archivo", - "addToShortcuts": "Añadir a accesos directos", - "pasteFailed": "Pegado fallido", - "noUndoableActions": "No hay acciones deshacerables", - "undoCopySuccess": "Operación de copia inrealizada: Eliminados archivos copiados {{count}}", - "undoCopyFailedDelete": "Deshacer fallido: No se pudo eliminar ningún archivo copiado", - "undoCopyFailedNoInfo": "Deshacer fallido: no se pudo encontrar la información del archivo copiado", - "undoMoveSuccess": "Operación de movimiento inrealizado: Se han movido archivos {{count}} de vuelta a la ubicación original", - "undoMoveFailedMove": "Error al deshacer: no se pudo mover ningún archivo de vuelta", - "undoMoveFailedNoInfo": "Error al deshacer: no se pudo encontrar la información del archivo movido", - "undoDeleteNotSupported": "La operación de eliminación no se puede deshacer: los archivos se han eliminado permanentemente del servidor", - "undoTypeNotSupported": "Tipo de operación de deshacer no soportado", - "undoOperationFailed": "Operación de deshacer fallida", - "unknownError": "Error desconocido", - "confirm": "Confirmar", - "find": "Buscar...", - "replace": "Reemplazar", - "downloadInstead": "Descargar en su lugar", - "keyboardShortcuts": "Atajos de teclado", - "searchAndReplace": "Buscar y reemplazar", - "editing": "Editando", - "search": "Buscar", - "findNext": "Buscar Siguiente", - "findPrevious": "Buscar Anterior", - "save": "Guardar", - "selectAll": "Seleccionar todo", - "undo": "Deshacer", - "redo": "Rehacer", - "moveLineUp": "Mover línea arriba", - "moveLineDown": "Mover línea abajo", - "toggleComment": "Cambiar comentario", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Correr", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Error al cargar la imagen", - "startTyping": "Comience a escribir...", - "unknownSize": "Tamaño desconocido", - "fileIsEmpty": "El archivo está vacío", - "largeFileWarning": "Advertencia de archivo grande", - "largeFileWarningDesc": "Este archivo tiene un tamaño {{size}} , que puede causar problemas de rendimiento cuando se abre como texto.", - "fileNotFoundAndRemoved": "No se ha encontrado el archivo \"{{name}}\" y se ha eliminado de archivos recientes o anclados", - "failedToLoadFile": "Error al cargar el archivo: {{error}}", - "serverErrorOccurred": "Se ha producido un error en el servidor. Inténtalo de nuevo más tarde.", - "autoSaveFailed": "Error al guardar automáticamente", - "fileAutoSaved": "Archivo guardado automáticamente", - "moveFileFailed": "Error al mover {{name}}", - "moveOperationFailed": "Operación de movimiento fallida", - "canOnlyCompareFiles": "Sólo se pueden comparar dos archivos", - "comparingFiles": "Comparando archivos: {{file1}} y {{file2}}", - "dragFailed": "Operación de arrastre fallida", - "filePinnedSuccessfully": "Archivo \"{{name}}\" anclado correctamente", - "pinFileFailed": "Error al anclar archivo", - "fileUnpinnedSuccessfully": "Archivo \"{{name}}\" sin fijar correctamente", - "unpinFileFailed": "Error al desfijar el archivo", - "shortcutAddedSuccessfully": "Acceso directo a la carpeta \"{{name}}\" añadido correctamente", - "addShortcutFailed": "Error al añadir acceso directo", - "operationCompletedSuccessfully": "{{operation}} {{count}} elementos con éxito", - "operationCompleted": "{{operation}} {{count}} objetos", - "downloadFileSuccess": "Archivo {{name}} descargado correctamente", - "downloadFileFailed": "Descarga fallida", - "moveTo": "Mover a {{name}}", - "diffCompareWith": "Comparación de diferencias con {{name}}", - "dragOutsideToDownload": "Arrastra la ventana exterior para descargar ( archivos{{count}})", - "newFolderDefault": "Carpeta nueva", - "newFileDefault": "Nuevo archivo.txt", - "successfullyMovedItems": "Movidos con éxito {{count}} elementos a {{target}}", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", "move": "Mover", - "searchInFile": "Buscar en archivo (Ctrl+F)", - "showKeyboardShortcuts": "Mostrar atajos de teclado", - "startWritingMarkdown": "Empieza a escribir tu contenido de markdown...", - "loadingFileComparison": "Cargando comparación de archivos...", - "reload": "Reload", - "compare": "Comparar", - "sideBySide": "Lado por lado", - "inline": "En línea", - "fileComparison": "Comparación de archivos: {{file1}} vs {{file2}}", - "fileTooLarge": "Archivo demasiado grande: {{error}}", - "sshConnectionFailed": "La conexión SSH ha fallado. Por favor, compruebe su conexión a {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Error al cargar el archivo: {{error}}", - "connecting": "Conectando...", - "connectedSuccessfully": "Conectado correctamente", - "totpVerificationFailed": "Falló la verificación TOTP", - "warpgateVerificationFailed": "Autenticación de Warpgate fallida", - "authenticationFailed": "Autenticación fallida", - "verificationCodePrompt": "Código de verificación:", - "changePermissions": "Cambiar permisos", - "currentPermissions": "Permisos actuales", - "owner": "Propietario", - "group": "Grupo", - "others": "Otros", - "read": "Leer", - "write": "Escribir", - "execute": "Ejecutar", - "permissionsChangedSuccessfully": "Permisos modificados con éxito", - "failedToChangePermissions": "Error al cambiar los permisos", - "name": "Nombre", - "sortByName": "Nombre", - "sortByDate": "Fecha Modificada", - "sortBySize": "Tamaño", - "ascending": "Ascendente", - "descending": "Descendente", - "root": "Raíz", - "new": "Nuevo", - "sortBy": "Ordenar por", - "items": "Elementos", - "selected": "Seleccionado", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Recargar", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", "editor": "Editor", "octal": "Octal", - "storage": "Almacenamiento", - "disk": "Disco", - "used": "Usado", - "of": "de", - "toggleSidebar": "Cambiar barra lateral", - "cannotLoadPdf": "No se puede cargar PDF", - "pdfLoadError": "Se ha producido un error al cargar este archivo PDF.", - "loadingPdf": "Cargando PDF...", - "loadingPage": "Cargando página..." + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Copiar al host…", - "moveToHost": "Mover al host…", - "copyItemsToHost": "Copia {{count}} elementos al host…", - "moveItemsToHost": "Mover {{count}} elementos al host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "No hay otros servidores de gestores de archivos disponibles.", "noHostsConnectedHint": "Agregue otro host SSH con el Administrador de archivos habilitado en el Administrador de hosts.", "selectDestinationHost": "Seleccione el host de destino", @@ -1164,48 +1360,48 @@ "browseDestination": "Navegar o introducir ruta", "confirmCopy": "Copiar", "confirmMove": "Mover", - "transferring": "Transferencia…", - "compressing": "Comprimiendo…", - "extracting": "Extrayendo…", - "transferringItems": "Transferencia de {{current}} de {{total}} elementos…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transferencia completada", "transferError": "La transferencia falló.", - "transferPartial": "Transferencia completada con {{count}} errores", - "transferPartialHint": "No se pudo transferir: {{paths}}", - "itemsSummary": "{{count}} elementos", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "El destino debe ser un directorio para transferencias de varios elementos.", "selectThisFolder": "Seleccione esta carpeta", "browsePathWillBeCreated": "Esta carpeta aún no existe. Se creará cuando comience la transferencia.", "browsePathError": "No se pudo abrir esta ruta en el host de destino.", "goUp": "Subir", - "copyFolderToHost": "Copiar carpeta al host…", - "moveFolderToHost": "Mover carpeta al host…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Listo", - "hostConnecting": "Conectando…", + "hostConnecting": "Connecting…", "hostDisconnected": "No conectado", "hostAuthRequired": "Se requiere autenticación; primero abra el Administrador de archivos en este host.", "hostConnectionFailed": "Falló la conexión.", "metricsTitle": "Plazos de transferencia", - "metricsPrepare": "Preparar destino: {{duration}}", - "metricsCompress": "Comprimir en la fuente: {{duration}}", - "metricsHopSourceRead": "Fuente → servidor: {{throughput}}", - "metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}", - "metricsTransfer": "De extremo a extremo: {{throughput}} ({{duration}})", - "metricsExtract": "Extraer en el destino: {{duration}}", - "metricsSourceDelete": "Eliminar de la fuente: {{duration}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", "metricsTotal": "Total: {{duration}}", - "progressCompressing": "Comprimiendo en el host de origen…", - "progressExtracting": "Extrayendo en el destino…", - "progressTransferring": "Transferencia de datos…", - "progressReconnecting": "Reconectando…", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Carriles de transferencia paralelos", - "parallelSegmentsOption": "{{count}} carriles", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Los archivos grandes se dividen en fragmentos de 256 MB. Varias vías utilizan conexiones separadas (como si se iniciaran varias transferencias) para obtener un mayor rendimiento total.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} carriles)", - "progressTransferringItems": "Transferencia de archivos ({{current}} de {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} archivos", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Archivos de origen conservados (transferencia parcial)", "jumpHostLimitation": "Ambos hosts deben ser accesibles desde el servidor Termix. No se admite el enrutamiento directo entre hosts.", "cancel": "Cancelar", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Selecciona entre tar o SFTP por archivo según la cantidad, el tamaño y la compresibilidad de los archivos. Los archivos individuales siempre utilizan SFTP por transmisión.", "methodTarHint": "Comprime en origen, transfiere un archivo y descomprímelo en destino. Requiere tar en ambos hosts Unix.", "methodItemSftpHint": "Transfiere cada archivo individualmente mediante SFTP. Funciona en todos los sistemas operativos, incluido Windows.", - "methodPreviewLoading": "Calculando el método de transferencia…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "No se pudo previsualizar el método de transferencia. El servidor seleccionará un método al iniciar.", "methodPreviewWillUseTar": "Se utilizará: archivo Tar", "methodPreviewWillUseItemSftp": "Se utilizará: SFTP por archivo", - "methodPreviewScanSummary": "{{fileCount}} archivos, {{totalSize}} total (escaneados en el host de origen).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Cada archivo utiliza el mismo flujo SFTP como una copia individual, una tras otra. El progreso se combina en todos los archivos, por lo que la barra avanza lentamente con archivos grandes.", "methodReason": { "user_item_sftp": "Usted eligió SFTP por archivo.", "user_tar": "Elegiste el archivo tar.", "tar_unavailable": "Tar no está disponible en uno o ambos hosts; en su lugar, se utilizará SFTP por archivo.", "windows_host": "Se utiliza un sistema operativo Windows; no se usa tar.", - "auto_multi_large": "Automático: varios archivos, incluido un archivo grande ({{largestSize}}) con datos comprimibles: paquetes tar en una sola transferencia.", - "auto_single_large_in_archive": "Automático: un archivo grande ({{largestSize}}) en este conjunto — SFTP por archivo.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automático: datos mayormente incompresibles — SFTP por archivo.", - "auto_many_files": "Automático: muchos archivos ({{fileCount}}) — tar reduce la sobrecarga por archivo.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automático: SFTP por archivo para este conjunto." }, "progressCancel": "Cancelar", - "progressCancelling": "Cancelando…", + "progressCancelling": "Cancelling…", "progressStalled": "Estancado", "resumedHint": "Se ha restablecido la conexión con una transferencia activa iniciada en otra ventana.", "transferCancelled": "Transferencia cancelada", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Se conservaron datos parciales en el destino. El reintento se reanudará cuando se restablezca la conexión." }, "tunnels": { - "noSshTunnels": "No hay túneles SSH", - "createFirstTunnelMessage": "No has creado ningún túnel SSH todavía. Configura conexiones de túnel en el Administrador de Equipos para empezar.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Conectado", "disconnected": "Desconectado", - "connecting": "Conectando...", + "connecting": "Connecting...", "error": "Error", - "canceling": "Cancelando...", - "connect": "Conectar", - "disconnect": "Desconectar", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", "cancel": "Cancelar", - "port": "Puerto", - "localPort": "Puerto local", - "remotePort": "Puerto remoto", - "currentHostPort": "Puerto actual de host", - "endpointPort": "Puerto final", - "bindIp": "IP local", - "endpointSshConfig": "Configuración SSSH de punto final", - "endpointSshHost": "Host SSH de punto final", - "endpointSshHostPlaceholder": "Seleccione un host configurado", - "endpointSshHostRequired": "Seleccione un endpoint SSH host para cada túnel de cliente.", - "attempt": "Intento {{current}} de {{max}}", - "nextRetryIn": "Siguiente reintento en {{seconds}} segundos", - "clientTunnels": "Túneles de cliente", - "clientTunnel": "Túnel de cliente", - "addClientTunnel": "Añadir túnel de cliente", - "noClientTunnels": "No hay túneles de cliente configurados en este ordenador.", - "tunnelName": "Nombre del túnel", - "remoteHost": "Host remoto", - "autoStart": "Auto inicio", - "clientAutoStartDesc": "Se inicia cuando este cliente de escritorio se abre y permanece conectado.", - "clientManualStartDesc": "Usar Inicio y Detener de esta fila. Termix no lo abrirá automáticamente.", - "clientRemoteServerNote": "El reenvío remoto puede requerir AllowTcpForwarding y GatewayPorts en el servidor SSH. El puerto remoto se cierra cuando este escritorio se desconecta.", - "clientTunnelStarted": "Túnel de cliente iniciado", - "clientTunnelStopped": "Túnel de cliente detenido", - "tunnelTestSucceeded": "Prueba de túnel exitosa", - "tunnelTestFailed": "Prueba de túnel fallida", - "localSaved": "Túneles de cliente guardados", - "localSaveError": "Error al guardar túneles de cliente locales", - "invalidBindIp": "IP local debe ser una dirección IPv4 válida.", - "invalidLocalTargetIp": "IP de destino local debe ser una dirección IPv4 válida.", - "invalidLocalPort": "El puerto local debe estar entre 1 y 65535.", - "invalidRemotePort": "Puerto remoto debe estar entre 1 y 65535.", - "invalidLocalTargetPort": "El puerto local destino debe estar entre 1 y 65535.", - "invalidEndpointPort": "El puerto de punto final debe estar entre 1 y 65535.", - "duplicateAutoStartBind": "Sólo un túnel de cliente de autoarranque puede usar {{bind}}.", - "manualControlError": "Error al actualizar el estado del túnel.", - "active": "Activo", - "start": "Comenzar", - "stop": "Parar", - "test": "Prueba", - "type": "Tipo de túnel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", "typeLocal": "Local (-L)", - "typeRemote": "Remoto (-R)", - "typeDynamic": "Dinámica (-D)", - "typeServerLocalDesc": "Anfitrión actual al final.", - "typeServerRemoteDesc": "Volver al punto final al host actual.", - "typeClientLocalDesc": "Ordenador local al final.", - "typeClientRemoteDesc": "Vuelve al punto final al ordenador local.", - "typeClientDynamicDesc": "SOCKS en el ordenador local.", - "typeDynamicDesc": "Reenviar tráfico CONNECT SOCKS5 a través de SSH", - "forwardDescriptionServerLocal": "Hosting actual {{sourcePort}} → endpoint {{endpointPort}}.", - "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → host actual {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS en el host actual {{sourcePort}}.", - "forwardDescriptionClientLocal": "Local {{sourcePort}} → remoto {{endpointPort}}.", - "forwardDescriptionClientRemote": "{{sourcePort}} remoto → {{endpointPort}} local .", - "forwardDescriptionClientDynamic": "SOCKS en el puerto local {{sourcePort}}.", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS vía {{endpoint}}", - "autoNameClientLocal": "{{localPort}} local → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → {{localPort}} local", - "autoNameClientDynamic": "SOCKS {{localPort}} vía {{endpoint}}", - "route": "Ruta:", - "lastStarted": "Último inicio", - "lastTested": "Última prueba", - "lastError": "Último error", - "maxRetries": "Reintentos máximos", - "maxRetriesDescription": "Cantidad máxima de intentos de reintento.", - "retryInterval": "Intervalo de reintento (segundos)", - "retryIntervalDescription": "Tiempo de espera entre intentos de reintento.", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", "local": "Local", - "remote": "Remoto", - "destination": "Destino", - "host": "Anfitrión", - "mode": "Modo", - "noHostSelected": "Ningún host seleccionado", - "working": "Trabajando..." + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Memoria", - "disk": "Disco", - "network": "Red", - "uptime": "Actualización", - "processes": "Procesos", - "available": "Disponible", - "free": "Gratis", - "connecting": "Conectando...", - "connectionFailed": "Error al conectar al servidor", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "Núcleo {{count}}", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Uso de CPU", - "memoryUsage": "Uso de memoria", - "diskUsage": "Uso del disco", - "failedToFetchHostConfig": "Error al recuperar la configuración del host", - "serverOffline": "Servidor fuera de línea", - "cannotFetchMetrics": "No se pueden obtener métricas del servidor sin conexión", - "totpFailed": "Falló la verificación TOTP", - "noneAuthNotSupported": "Las estadísticas del servidor no son compatibles con el tipo de autenticación 'ninguno'.", - "load": "Cargar", - "systemInfo": "Información del sistema", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Sistema operativo", - "kernel": "Kerel", - "seconds": "segundos", - "networkInterfaces": "Interfaces de red", - "noInterfacesFound": "No se encontraron interfaces de red", - "noProcessesFound": "No se encontraron procesos", - "loginStats": "Estadísticas de inicio de sesión SSH", - "noRecentLoginData": "No hay datos de acceso recientes", - "executingQuickAction": "Ejecutando {{name}}...", - "quickActionSuccess": "{{name}} completado con éxito", - "quickActionFailed": "{{name}} falló", - "quickActionError": "Error al ejecutar {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Puertos de escucha", - "protocol": "Protocol", - "port": "Puerto", - "address": "Dirección", - "process": "Proceso", - "noData": "No hay datos de puertos en escucha" + "title": "Listening Ports", + "protocol": "Protocolo", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Cortafuegos", - "inactive": "Inactivo", - "policy": "Política", - "rules": "reglas", - "noData": "No hay datos firewall disponibles", - "action": "Accin", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Puerto", - "source": "Fuente", - "anywhere": "En cualquier lugar" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Cargar Media", - "swap": "Intercambiar", - "architecture": "Arquitectura", + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", "refresh": "Refrescar", - "retry": "Reintentar" + "retry": "Rever", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Correr", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { - "tagline": "SSH autoalojado y administración remota de escritorio", - "loginTitle": "Iniciar sesión en Termix", - "registerTitle": "Crear cuenta", - "forgotPassword": "¿Olvidó la contraseña?", - "rememberMe": "Recordar dispositivo durante 30 días (incluye TOTP)", - "noAccount": "¿No tienes una cuenta?", - "hasAccount": "¿Ya tienes una cuenta?", - "twoFactorAuth": "Autenticación de dos factores", - "enterCode": "Introduzca código de verificación", - "backupCode": "O usar código de copia de seguridad", - "verifyCode": "Verificar código", - "redirectingToApp": "Redirigiendo a la aplicación...", - "sshAuthenticationRequired": "Autenticación SSH requerida", - "sshNoKeyboardInteractive": "Autenticación interactiva del teclado no disponible", - "sshAuthenticationFailed": "Autenticación fallida", - "sshAuthenticationTimeout": "Tiempo de espera de autenticación", - "sshNoKeyboardInteractiveDescription": "El servidor no soporta autenticación interactiva de teclado. Por favor, introduzca su contraseña o clave SSH.", - "sshAuthFailedDescription": "Las credenciales proporcionadas eran incorrectas. Por favor, inténtelo de nuevo con credenciales válidas.", - "sshTimeoutDescription": "Se ha agotado el tiempo de espera de autenticación. Inténtalo de nuevo.", - "sshProvideCredentialsDescription": "Por favor, proporcione sus credenciales SSH para conectarse a este servidor.", - "sshPasswordDescription": "Introduzca la contraseña para esta conexión SSH.", - "sshKeyPasswordDescription": "Si su clave SSH está cifrada, introduzca la contraseña aquí.", - "passphraseRequired": "Contraseña requerida", - "passphraseRequiredDescription": "La clave SSH está cifrada. Por favor, introduzca la contraseña para desbloquearla.", - "back": "Atrás", - "firstUser": "Primer usuario", - "firstUserMessage": "Eres el primer usuario y se hará un administrador. Puedes ver la configuración de administración en la barra lateral del menú desplegable. Si cree que esto es un error, compruebe los registros de docker, o cree un problema de GitHub.", - "external": "Externo", - "loginWithExternal": "Iniciar sesión con proveedor externo", - "loginWithExternalDesc": "Iniciar sesión usando su proveedor de identidad externo configurado", - "externalNotSupportedInElectron": "La autenticación externa no está soportada en la aplicación Electron todavía. Por favor, utilice la versión web para iniciar sesión OIDC.", - "resetPasswordButton": "Restablecer contraseña", - "sendResetCode": "Enviar código de reinicio", - "resetCodeDesc": "Introduzca su nombre de usuario para recibir un código de restablecimiento de contraseña. El código se registrará en los registros del contenedor docker.", + "tagline": "Gestión de escritorio remoto y SSH autogestionada", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verificar código", - "enterResetCode": "Introduzca el código de 6 dígitos del contenedor docker para el usuario:", - "newPassword": "Nueva contraseña", - "confirmNewPassword": "Confirmar contraseña", - "enterNewPassword": "Introduzca su nueva contraseña para el usuario:", - "signUp": "Regístrate", - "desktopApp": "App de escritorio", - "loggingInToDesktopApp": "Iniciando sesión en la aplicación de escritorio", - "loadingServer": "Cargando servidor...", - "dataLossWarning": "Restablecer su contraseña de esta manera eliminará todos sus hosts SSH guardados, credenciales y otros datos cifrados. Esta acción no se puede deshacer. Utilice sólo si ha olvidado su contraseña y no ha iniciado sesión.", - "authenticationDisabled": "Autenticación desactivada", - "authenticationDisabledDesc": "Todos los métodos de autenticación están actualmente deshabilitados. Por favor, póngase en contacto con su administrador.", - "attemptsRemaining": "{{count}} intentos restantes" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verificar clave SSH Host", - "keyChangedWarning": "SSH Host Key cambiada", - "firstConnectionTitle": "Primera conexión a este host", - "firstConnectionDescription": "La autenticidad de este host no se puede establecer. Verifique que la huella digital coincide con lo que espera.", - "keyChangedDescription": "La clave de host para este servidor ha cambiado desde su última conexión. Esto podría indicar un problema de seguridad.", - "previousKey": "Clave anterior", - "newFingerprint": "Nueva huella dactilar", - "fingerprint": "Huella dactilar", - "verifyInstructions": "Si confía en este host, haga clic en Aceptar para continuar y guardar esta huella dactilar para conexiones futuras.", - "securityWarning": "Advertencia de seguridad", - "acceptAndContinue": "Aceptar y continuar", - "acceptNewKey": "Aceptar nueva clave y continuar" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "No se pudo conectar a la base de datos", - "unknownError": "Error desconocido", - "loginFailed": "Error al iniciar sesión", - "failedPasswordReset": "Error al iniciar el restablecimiento de contraseña", - "failedVerifyCode": "Error al verificar el código de restablecimiento", - "failedCompleteReset": "Error al restablecer la contraseña", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Error al iniciar inicio de sesión OIDC", - "silentSigninOidcUnavailable": "Se solicitó el inicio de sesión silencioso, pero el inicio de sesión de OIDC no está disponible.", - "failedUserInfo": "Error al obtener la información del usuario después de iniciar sesión", - "oidcAuthFailed": "Autenticación OIDC fallida", - "invalidAuthUrl": "URL de autorización no válida recibida del backend", - "requiredField": "Este campo es obligatorio", - "minLength": "La longitud mínima es {{min}}", - "passwordMismatch": "Las contraseñas no coinciden", - "passwordLoginDisabled": "Nombre de usuario/contraseña está actualmente desactivado", - "sessionExpired": "Sesión caducada - por favor inicia sesión de nuevo", - "totpRateLimited": "Tasa limitada: Demasiados intentos de verificación TOTP. Inténtalo de nuevo más tarde.", - "totpRateLimitedWithTime": "Tasa limitada: Demasiados intentos de verificación TOTP. Por favor, espera {{time}} segundos antes de intentarlo de nuevo.", - "resetCodeRateLimited": "Tasa limitada: Demasiados intentos de verificación. Inténtalo de nuevo más tarde.", - "resetCodeRateLimitedWithTime": "Tasa limitada: Demasiados intentos de verificación. Por favor, espere {{time}} segundos antes de intentarlo de nuevo.", - "authTokenSaveFailed": "Error al guardar el token de autenticación", - "failedToLoadServer": "Error al cargar el servidor" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "El registro de nueva cuenta está actualmente desactivado por un administrador. Por favor, inicie sesión o póngase en contacto con un administrador.", - "userNotAllowed": "Tu cuenta no está autorizada a registrarse. Por favor, contacta con un administrador.", - "databaseConnectionFailed": "Error al conectar al servidor de base de datos", - "resetCodeSent": "Restablecer código enviado a los registros de Docker", - "codeVerified": "Código verificado con éxito", - "passwordResetSuccess": "Contraseña restablecida correctamente", - "loginSuccess": "Inicio de sesión correcto", - "registrationSuccess": "Registro exitoso" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Túneles de escritorio locales dirigidos a hosts SSH configurados.", - "c2sTunnelPresets": "Ajustes de túnel de cliente", - "c2sTunnelPresetsDesc": "Guarde la lista de túneles locales de este cliente de escritorio como un preset de servidor nombrado, o cargue un preset de nuevo en este cliente.", - "c2sTunnelPresetsUnavailable": "Los ajustes predeterminados del túnel de cliente sólo están disponibles en el cliente de escritorio.", - "c2sPresetName": "Nombre predefinido", - "c2sPresetNamePlaceholder": "Nombre predefinido del cliente", - "c2sPresetToLoad": "Preseleccionar para cargar", - "c2sNoPresetSelected": "Ningún preset seleccionado", - "c2sNoPresets": "No hay preajustes guardados", - "c2sLoadPreset": "Cargar", - "c2sCurrentLocalConfig": "{{count}} túnel(s) de cliente local configurado en este escritorio.", - "c2sPresetSyncNote": "Los ajustes predeterminados son instantáneas explícitas; la carga de uno reemplaza la lista de túneles de clientes locales de este cliente de escritorio.", - "c2sPresetSaved": "Preajuste de túnel de cliente guardado", - "c2sPresetLoaded": "Túnel de cliente preestablecido cargado localmente", - "c2sPresetRenamed": "Preajuste de túnel de cliente renombrado", - "c2sPresetDeleted": "Preajuste de túnel de cliente eliminado", - "c2sPresetLoadError": "Error al cargar los ajustes predeterminados del túnel del cliente" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", "language": "Idioma", - "keyPassword": "clave de contraseña", - "pastePrivateKey": "Pegue su clave privada aquí...", - "localListenerHost": "127.0.0.1 (escuchar localmente)", - "localTargetHost": "127.0.0.1 (objetivo en este ordenador)", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Introduzca su contraseña", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Tablero", - "loading": "Cargando panel...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Soporte", + "support": "Support", "discord": "Discordia", - "serverOverview": "Vista general del servidor", - "version": "Versión", - "upToDate": "Hasta la fecha", - "updateAvailable": "Actualización disponible", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Actualización", - "database": "Base de datos", - "healthy": "Saludable", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", "error": "Error", - "totalHosts": "Total de hosts", - "totalTunnels": "Total de túneles", - "totalCredentials": "Total de credenciales", - "recentActivity": "Actividad reciente", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Cargando actividad reciente...", - "noRecentActivity": "No hay actividad reciente", - "quickActions": "Acciones rápidas", - "addHost": "Añadir Host", - "addCredential": "Añadir credencial", - "adminSettings": "Configuración de Admin", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", "userProfile": "Perfil de usuario", - "serverStats": "Estadísticas del Servidor", - "loadingServerStats": "Cargando estadísticas del servidor...", - "noServerData": "No hay datos del servidor disponibles", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personalizar panel", - "dashboardSettings": "Ajustes del panel", - "enableDisableCards": "Habilitar/deshabilitar tarjetas", - "resetLayout": "Restablecer por defecto", - "serverOverviewCard": "Vista general del servidor", - "recentActivityCard": "Actividad reciente", - "networkGraphCard": "Gráfico de red", - "networkGraph": "Gráfico de red", - "quickActionsCard": "Acciones rápidas", - "serverStatsCard": "Estadísticas del Servidor", - "panelMain": "Principal", - "panelSide": "Lado", - "justNow": "justo ahora" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "ESTABLE", - "hostsOnline": "Hosts en línea", - "activeTunnels": "Túneles activos", - "registerNewServer": "Registrar un nuevo servidor", - "storeSshKeysOrPasswords": "Guardar claves o contraseñas SSH", - "manageUsersAndRoles": "Administrar usuarios y roles", - "manageYourAccount": "Administra tu cuenta", - "hostStatus": "Estado del host", - "noHostsConfigured": "No hay hosts configurados", - "online": "EN LÍNEA", - "offline": "DESARROLLO", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", "onlineLower": "En línea", "nodes": "{{count}} nodes", - "add": "Añadir:", - "commandPalette": "Paleta de comandos", - "done": "Hecho", - "editModeInstructions": "Arrastra tarjetas para reordenar · Arrastra el divisor de columnas para redimensionar columnas · Arrastra el borde inferior de una tarjeta para redimensionar su altura · Basura para remover", - "empty": "Vaciar", - "clear": "Claro" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copiar", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Añadir Host", - "addGroup": "Añadir grupo", - "addLink": "Añadir enlace", - "zoomIn": "Acercar en", - "zoomOut": "Apagar", - "resetView": "Reiniciar vista", - "selectHost": "Seleccionar Host", - "chooseHost": "Seleccione un host...", - "parentGroup": "Grupo padre", - "noGroup": "Sin grupo", - "groupName": "Nombre del grupo", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", "color": "Color", - "source": "Fuente", + "source": "Source", "target": "Target", - "moveToGroup": "Mover al grupo", - "selectGroup": "Seleccionar grupo...", - "addConnection": "Añadir conexión", - "hostDetails": "Detalles del host", - "removeFromGroup": "Eliminar del grupo", - "addHostHere": "Añadir host aquí", - "editGroup": "Editar grupo", - "delete": "Eliminar", - "add": "Añadir", - "create": "Crear", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", "move": "Mover", - "connect": "Conectar", - "createGroup": "Crear grupo", - "selectSourcePlaceholder": "Seleccionar origen...", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Archivo inválido", - "hostAlreadyExists": "El anfitrión ya está en la topología", - "connectionExists": "La conexión ya existe", - "unknown": "Desconocido", - "name": "Nombre", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Estado", - "failedToAddNode": "Error al añadir el nodo", - "sourceDifferentFromTarget": "La fuente y el objetivo deben ser diferentes", - "exportJSON": "Exportar JSON", - "importJSON": "Importar JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", "fileManager": "Gestor de archivos", "tunnel": "Túnel", - "docker": "Doctor", - "serverStats": "Estadísticas del Servidor", - "noNodes": "Aún no hay nodos" + "docker": "Estibador", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker no está habilitado para este host", - "validating": "Validando Docker...", - "connecting": "Conectando...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Error al conectar con Docker", - "containerStarted": "Contenedor {{name}} iniciado", - "failedToStartContainer": "Error al iniciar el contenedor {{name}}", - "containerStopped": "Contenedor {{name}} detenido", - "failedToStopContainer": "No se pudo detener el contenedor {{name}}", - "containerRestarted": "Contenedor {{name}} reiniciado", - "failedToRestartContainer": "Error al reiniciar el contenedor {{name}}", - "containerPaused": "Contenedor {{name}} en pausa", - "containerUnpaused": "Contenedor {{name}} despausado", - "failedToTogglePauseContainer": "Error al cambiar el estado de pausa para el contenedor {{name}}", - "containerRemoved": "Contenedor {{name}} eliminado", - "failedToRemoveContainer": "Error al eliminar el contenedor {{name}}", - "image": "Imagen", - "ports": "Puertos", - "noPorts": "Sin puertos", - "start": "Comenzar", - "confirmRemoveContainer": "¿Está seguro de que desea eliminar el contenedor '{{name}}'? Esta acción no se puede deshacer.", - "runningContainerWarning": "Advertencia: Este contenedor se está ejecutando. Eliminarlo detendrá el contenedor primero.", - "loadingContainers": "Cargando contenedores...", - "manager": "Administrador Docker", - "autoRefresh": "Actualización automática", - "timestamps": "Marcas de tiempo", - "lines": "Líneas", - "filterLogs": "Filtrar registros...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", "refresh": "Refrescar", - "download": "Descargar", - "clear": "Claro", - "logsDownloaded": "Registros descargados con éxito", - "last50": "Últimos 50", - "last100": "Últimos 100", - "last500": "Últimos 500", - "last1000": "Últimos 1000", - "allLogs": "Todos los registros", - "noLogsMatching": "No hay registros que coincidan con \"{{query}}\"", - "noLogsAvailable": "No hay registros disponibles", - "noContainersFound": "No hay contenedores", - "noContainersFoundHint": "No hay contenedores Docker disponibles en este host", - "searchPlaceholder": "Buscar contenedores...", - "allStatuses": "Todos los estados", - "stateRunning": "Ejecutando", - "statePaused": "Pausado", - "stateExited": "Salido", - "stateRestarting": "Reiniciando", - "noContainersMatchFilters": "Ningún contenedor coincide con sus filtros", - "noContainersMatchFiltersHint": "Intente ajustar su criterio de búsqueda o filtro", - "failedToFetchStats": "Error al obtener las estadísticas del contenedor", - "containerNotRunning": "Contenedor no ejecutándose", - "startContainerToViewStats": "Iniciar el contenedor para ver las estadísticas", - "loadingStats": "Cargando estadísticas...", - "errorLoadingStats": "Error al cargar estadísticas", - "noStatsAvailable": "No hay estadísticas disponibles", - "cpuUsage": "Uso de CPU", - "current": "Actual", - "memoryUsage": "Uso de memoria", - "networkIo": "E/S de red", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Salida", - "blockIo": "Bloquear E/S", - "read": "Leer", - "write": "Escribir", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "Información del contenedor", - "name": "Nombre", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Estado", - "containerMustBeRunning": "El contenedor debe estar ejecutándose para acceder a la consola", - "verificationCodePrompt": "Introduzca código de verificación", - "totpVerificationFailed": "Falló la verificación del TOTP. Por favor, inténtelo de nuevo.", - "warpgateVerificationFailed": "La autenticación de Warpgate falló. Por favor, inténtelo de nuevo.", - "connectedTo": "Conectado a {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Desconectado", - "consoleError": "Error de consola", + "consoleError": "Console error", "errorMessage": "Error: {{message}}", - "failedToConnect": "No se pudo conectar al contenedor", - "console": "Consola", - "selectShell": "Seleccionar shell", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", - "sh": "m", - "ash": "ceniza", - "connect": "Conectar", - "disconnect": "Desconectar", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "No conectado", - "clickToConnect": "Haga clic en conectar para iniciar una sesión de shell", - "connectingTo": "Conectando a {{containerName}}...", - "containerNotFound": "Contenedor no encontrado", - "backToList": "Volver a la lista", - "logs": "Registros", - "stats": "Estadísticas", - "consoleTab": "Consola", - "startContainerToAccess": "Iniciar el contenedor para acceder a la consola" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Usuarios", - "sectionSessions": "Sesiones", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", "sectionRoles": "Roles", - "sectionDatabase": "Base de datos", - "sectionApiKeys": "Claves API", - "allowRegistration": "Permitir registro de usuario", - "allowRegistrationDesc": "Permitir auto-registro de nuevos usuarios", - "allowPasswordLogin": "Permitir inicio de sesión de contraseña", - "allowPasswordLoginDesc": "Nombre de usuario / contraseña", - "oidcAutoProvision": "Auto-Provisión OIDC", - "oidcAutoProvisionDesc": "Auto-crear cuentas para usuarios OIDC incluso cuando el registro está desactivado", - "allowPasswordReset": "Permitir restablecer contraseña", - "allowPasswordResetDesc": "Restablecer código a través de registros Docker", - "sessionTimeout": "Tiempo de espera agotado", - "hours": "horas", - "sessionTimeoutRange": "Mínimo 1h · Max 720h", - "monitoringDefaults": "Monitoreo por defecto", - "statusCheck": "Comprobación de estado", - "metrics": "Métricas", - "sec": "seg", - "logLevel": "Nivel de Log", - "enableGuacamole": "Activar Guacamole", - "enableGuacamoleDesc": "Escritorio remoto RDP/VNC", - "guacdUrl": "URL de guacd", - "oidcDescription": "Configure OpenID Connect para SSO. Los campos marcados * son obligatorios.", - "oidcClientId": "ID de cliente", - "oidcClientSecret": "Cliente secreto", - "oidcAuthUrl": "URL de autorización", - "oidcIssuerUrl": "URL del emisor", - "oidcTokenUrl": "URL del token", - "oidcUserIdentifier": "Ruta del identificador de usuario", - "oidcDisplayName": "Mostrar ruta de nombre", - "oidcScopes": "Ámbitos", - "oidcUserinfoUrl": "Reemplazar URL de Userinfo", - "oidcAllowedUsers": "Usuarios Permitidos", - "oidcAllowedUsersDesc": "Un correo electrónico por línea. Dejar en blanco para permitir a todos.", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Borrar filtros", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Estado", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", "removeOidc": "Eliminar", - "usersCount": "{{count}} usuarios", - "createUser": "Crear", - "newRole": "Nuevo rol", - "roleName": "Nombre", - "roleDisplayName": "Mostrar nombre", - "roleDescription": "Descripción", - "rolesCount": "Rol {{count}}", - "createRole": "Crear", - "creating": "Creando...", - "exportDatabase": "Exportar base de datos", - "exportDatabaseDesc": "Descargar una copia de seguridad de todos los hosts, credenciales y ajustes", - "export": "Exportar", - "exporting": "Exportando...", - "importDatabase": "Importar base de datos", - "importDatabaseDesc": "Restaurar desde un archivo de copia de seguridad .sqlite", - "importDatabaseSelected": "Seleccionado: {{name}}", - "selectFile": "Seleccionar archivo", - "changeFile": "Cambiar", - "import": "Importar", - "importing": "Importando...", - "apiKeysCount": "Claves {{count}}", - "newApiKey": "Nueva Clave API", - "apiKeyCreatedWarning": "Clave creada - cópiela ahora, no se mostrará de nuevo.", - "apiKeyName": "Nombre", - "apiKeyUser": "Usuario", - "apiKeySelectUser": "Seleccione un usuario...", - "apiKeyExpiresAt": "Caduca el", - "createKey": "Crear Clave", - "apiKeyNoExpiry": "No expirar", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Doble Auth", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", "authTypeLocal": "Local", - "adminStatusAdministrator": "Administrador", - "adminStatusRegularUser": "Usuario regular", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", - "systemBadge": "SI", - "customBadge": "CLIENTE", - "youBadge": "TI", - "sessionsActive": "{{count}} activo", - "sessionActive": "Activo: {{time}}", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "Todos", - "revokeAllSessionsSuccess": "Todas las sesiones para el usuario revocadas", - "revokeAllSessionsFailed": "Error al revocar las sesiones", - "revokeSessionFailed": "Error al revocar la sesión", - "addRole": "Añadir rol", - "noCustomRoles": "Sin roles personalizados definidos", - "removeRoleFailed": "Error al eliminar el rol", - "assignRoleFailed": "No se pudo asignar el rol", - "deleteRoleFailed": "Error al eliminar el rol", - "userAdminAccess": "Administrador", - "userAdminAccessDesc": "Acceso total a todos los ajustes de administración", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", "userRoles": "Roles", - "revokeAllUserSessions": "Revocar todas las sesiones", - "revokeAllUserSessionsDesc": "Forzar reinicio de sesión en todos los dispositivos", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Eliminar este usuario es permanente.", - "deleteUser": "Eliminar {{username}}", - "deleting": "Eliminando...", - "deleteUserFailed": "Error al eliminar el usuario", - "deleteUserSuccess": "Usuario \"{{username}}\" eliminado", - "deleteRoleSuccess": "Rol \"{{name}}\" eliminado", - "revokeKeySuccess": "Llave \"{{name}}\" revocada", - "revokeKeyFailed": "Error al revocar la clave", - "copiedToClipboard": "Copiado al portapapeles", - "done": "Hecho", - "createUserTitle": "Crear usuario", - "createUserDesc": "Crear una nueva cuenta local.", - "createUserUsername": "Usuario", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Contraseña", - "createUserPasswordHint": "Mínimo 6 caracteres.", - "createUserEnterUsername": "Introduzca nombre de usuario", - "createUserEnterPassword": "Introduzca contraseña", - "createUserSubmit": "Crear usuario", - "editUserTitle": "Administrar usuario: {{username}}", - "editUserDesc": "Editar roles, estado de administración, sesiones y configuración de la cuenta.", - "editUserUsername": "Usuario", - "editUserAuthType": "Tipo de Auth", - "editUserAdminStatus": "Estado del Admin", - "editUserUserId": "ID Usuario", - "linkAccountTitle": "Enlazar OIDC a la cuenta de contraseña", - "linkAccountDesc": "Fusionar la cuenta OIDC {{username}} con una cuenta local existente.", - "linkAccountWarningTitle": "Esto hará:", - "linkAccountEffect1": "Eliminar la cuenta sólo OIDC", - "linkAccountEffect2": "Añadir inicio de sesión OIDC a la cuenta de destino", - "linkAccountEffect3": "Permitir tanto OIDC como login de contraseña", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Introduzca el nombre de usuario de cuenta local al que enlazar", - "linkAccounts": "Enlazar cuentas", - "linkAccountSuccess": "Cuenta OIDC vinculada a \"{{username}}\"", - "linkAccountFailed": "No se pudo vincular la cuenta OIDC.", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Tipo de autenticación", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Enlace...", - "saving": "Guardando...", - "updateRegistrationFailed": "Error al actualizar la configuración de registro", - "updatePasswordLoginFailed": "Error al actualizar el inicio de sesión de contraseña", - "updateOidcAutoProvisionFailed": "Error al actualizar la configuración de autoprovisión OIDC", - "updatePasswordResetFailed": "Error al actualizar el restablecimiento de contraseña", - "sessionTimeoutRange2": "El tiempo de espera de la sesión debe estar entre 1 y 720 horas", - "sessionTimeoutSaved": "Tiempo de espera de sesión guardado", - "sessionTimeoutSaveFailed": "Error al guardar el tiempo de espera de sesión", - "monitoringIntervalInvalid": "Valores de intervalo inválidos", - "monitoringSaved": "Ajustes de monitorización guardados", - "monitoringSaveFailed": "Error al guardar la configuración de monitoreo", - "guacamoleSaved": "Ajustes de Guacamole guardados", - "guacamoleSaveFailed": "Error al guardar la configuración de Guacamole", - "guacamoleUpdateFailed": "Error al actualizar la configuración de Guacamole", - "logLevelUpdateFailed": "Error al actualizar el nivel de registro", - "oidcSaved": "Configuración OIDC guardada", - "oidcSaveFailed": "Error al guardar la configuración OIDC", - "oidcRemoved": "Configuración OIDC eliminada", - "oidcRemoveFailed": "Error al eliminar la configuración OIDC", - "createUserRequired": "Nombre de usuario y contraseña son requeridos", - "createUserPasswordTooShort": "La contraseña debe tener al menos 6 caracteres", - "createUserSuccess": "Usuario \"{{username}}\" creado", - "createUserFailed": "Error al crear el usuario", - "updateAdminStatusFailed": "Error al actualizar el estado del administrador", - "allSessionsRevoked": "Todas las sesiones revocadas", - "revokeSessionsFailed": "Error al revocar las sesiones", - "createRoleRequired": "Nombre y nombre para mostrar son requeridos", - "createRoleSuccess": "Rol \"{{name}}\" creado", - "createRoleFailed": "Error al crear el rol", - "apiKeyNameRequired": "Se requiere nombre de clave", - "apiKeyUserRequired": "Se requiere ID de usuario", - "apiKeyCreatedSuccess": "Clave API \"{{name}}\" creada", - "apiKeyCreateFailed": "Error al crear la clave API", - "exportSuccess": "Base de datos exportada con éxito", - "exportFailed": "Exportación de base de datos fallida", - "importSelectFile": "Por favor, seleccione un archivo primero", - "importCompleted": "Importación completada: {{total}} elementos importados, {{skipped}} omitidos", - "importFailed": "Importación fallida: {{error}}", - "importError": "Error al importar la base de datos" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Anfitrión", - "hostPlaceholder": "192.168.1.1 o ejemplo.com", - "portLabel": "Puerto", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Usuario", - "usernamePlaceholder": "nombre de usuario", - "authLabel": "Aut", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Contraseña", - "passwordPlaceholder": "contraseña", - "privateKeyLabel": "Clave Privada", - "privateKeyPlaceholder": "Pegar clave privada...", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", "credentialLabel": "Credencial", - "credentialPlaceholder": "Seleccione una credencial guardada", - "connectToTerminal": "Conectar a la terminal", - "connectToFiles": "Conectar a archivos" + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "No hay terminal seleccionado", - "noTerminalSelectedHint": "Abrir una pestaña de terminal SSH para ver su historial de comandos", - "searchPlaceholder": "Buscar historial...", - "clearAll": "Limpiar todo", - "noHistoryEntries": "No hay entradas del historial", - "trackingDisabled": "El seguimiento del historial está desactivado", - "trackingDisabledHint": "Actívalo en la configuración de tu perfil para grabar comandos." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Grabación de clave", - "recordToTerminals": "Grabar en terminales", - "selectAll": "Todos", - "selectNone": "Ninguna", - "noTerminalTabsOpen": "No hay pestañas de terminal abiertas", - "selectTerminalsAbove": "Seleccionar terminales arriba", - "broadcastInputPlaceholder": "Escriba aquí para emitir pulsaciones de teclado...", - "stopRecording": "Detener grabación", - "startRecording": "Iniciar grabación", - "settingsTitle": "Ajustes", - "enableRightClickCopyPaste": "Habilitar copiar/pegar con clic derecho" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Ninguno", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Diseño", - "selectLayoutAbove": "Seleccione un diseño arriba", - "selectLayoutHint": "Elegir cuántos paneles mostrar", - "panesTitle": "Paneles", - "openTabsTitle": "Abrir Pestañas", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Arrastra las pestañas a los paneles superiores o usa la función Asignación rápida.", - "dropHere": "Soltar aquí", - "emptyPane": "Vaciar", - "dashboard": "Tablero", - "clearSplitScreen": "Limpiar pantalla dividida", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Asignación rápida", - "alreadyAssigned": "Panel {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Pestaña dividida", "addToSplit": "Agregar a Dividir", "removeFromSplit": "Eliminar de Split", - "assignToPane": "Asignar al panel" + "assignToPane": "Asignar al panel", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Crear Fragmento", - "createSnippetDescription": "Crear un nuevo fragmento de comandos para ejecución rápida", - "nameLabel": "Nombre", - "namePlaceholder": "ej. Reiniciar Nginx", - "descriptionLabel": "Descripción", - "descriptionPlaceholder": "Descripción opcional", - "optional": "Opcional", - "folderLabel": "Carpeta", - "noFolder": "No hay carpeta (sin categorizar)", - "commandLabel": "Comando", - "commandPlaceholder": "por ejemplo, el sistema sudo reiniciar nginx", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", "cancel": "Cancelar", - "createSnippetButton": "Crear Fragmento", - "createFolderTitle": "Crear carpeta", - "createFolderDescription": "Organiza tus fragmentos en carpetas", - "folderNameLabel": "Nombre de carpeta", - "folderNamePlaceholder": "ej., Comandos del Sistema, Docker Scripts", - "folderColorLabel": "Color de carpeta", - "folderIconLabel": "Icono de carpeta", - "previewLabel": "Vista previa", - "folderNameFallback": "Nombre de carpeta", - "createFolderButton": "Crear carpeta", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Todos", - "selectNone": "Ninguna", - "noTerminalTabsOpen": "No hay pestañas de terminal abiertas", - "searchPlaceholder": "Buscar fragmentos...", - "newSnippet": "Nuevo Fragmento", - "newFolder": "Nueva carpeta", - "run": "Ejecutar", - "noSnippetsInFolder": "No hay fragmentos en esta carpeta", - "uncategorized": "Sin categorizar", - "editSnippetTitle": "Editar Snippet", - "editSnippetDescription": "Actualizar este fragmento de comandos", - "saveSnippetButton": "Guardar Cambios", - "createSuccess": "Fragmento creado correctamente", - "createFailed": "Error al crear el fragmento", - "updateSuccess": "Fragmento actualizado correctamente", - "updateFailed": "Error al actualizar el snippet", - "deleteFailed": "Error al eliminar el snippet", - "folderCreateSuccess": "Carpeta creada correctamente", - "folderCreateFailed": "Error al crear la carpeta", - "editFolderTitle": "Editar carpeta", - "editFolderDescription": "Renombrar o cambiar la apariencia de esta carpeta", - "saveFolderButton": "Guardar Cambios", - "editFolder": "Editar carpeta", - "deleteFolder": "Eliminar carpeta", - "folderDeleteSuccess": "Carpeta \"{{name}}\" eliminada", - "folderDeleteFailed": "Error al eliminar la carpeta", - "folderEditSuccess": "Carpeta actualizada correctamente", - "folderEditFailed": "Error al actualizar la carpeta", - "confirmRunMessage": "Ejecutar \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Ninguno", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Correr", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Correr", - "runSuccess": "Ran \"{{name}}\" en terminales {{count}}", - "copySuccess": "Copiado \"{{name}}\" al portapapeles", - "shareTitle": "Compartir Snippet", - "shareUser": "Usuario", - "shareRole": "Rol", - "selectUser": "Seleccione un usuario...", - "selectRole": "Seleccione un rol...", - "shareSuccess": "Fragmento compartido correctamente", - "shareFailed": "Error al compartir el snippet", - "revokeSuccess": "Acceso revocado", - "revokeFailed": "Error al revocar el acceso", - "currentAccess": "Acceso actual", - "shareLoadError": "Error al cargar los datos compartidos", - "loading": "Cargando...", - "close": "Cerrar", - "reorderFailed": "No se pudo guardar el orden del fragmento." + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "No se pudo guardar el orden del fragmento.", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Cuenta", - "sectionAppearance": "Apariencia", - "sectionSecurity": "Seguridad", - "sectionApiKeys": "Claves API", - "sectionC2sTunnels": "Túneles C2S", - "usernameLabel": "Usuario", - "roleLabel": "Rol", - "roleAdministrator": "Administrador", - "authMethodLabel": "Método Auth", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "En", - "twoFaOff": "Apagado", - "versionLabel": "Versión", - "deleteAccount": "Eliminar cuenta", - "deleteAccountDescription": "Elimina permanentemente tu cuenta", - "deleteButton": "Eliminar", - "deleteAccountPermanent": "Esta acción es permanente y no se puede deshacer.", - "deleteAccountWarning": "Todas las sesiones, hosts, credenciales y ajustes se eliminarán permanentemente.", - "confirmPasswordDeletePlaceholder": "Introduzca su contraseña para confirmar", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", "languageLabel": "Idioma", - "themeLabel": "Tema", - "fontSizeLabel": "Font Size", - "accentColorLabel": "Color de acento", + "themeLabel": "Theme", + "fontSizeLabel": "Tamaño de fuente", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Comando autocompletado", - "commandAutocompleteDesc": "Mostrar autocompletado al escribir", - "historyTracking": "Historial de seguimiento", - "historyTrackingDesc": "Rastrear comandos de terminal", - "syntaxHighlighting": "Resaltado sintáctico", - "syntaxHighlightingDesc": "Resaltar salida de terminal", - "commandPalette": "Paleta de comandos", - "commandPaletteDesc": "Activar atajo de teclado", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Reabrir pestañas al iniciar sesión", "reopenTabsOnLoginDesc": "Restaura tus pestañas abiertas cuando inicies sesión o actualices la página, incluso desde otro dispositivo.", - "confirmTabClose": "Confirmar cierre de pestaña", - "confirmTabCloseDesc": "Preguntar antes de cerrar pestañas de terminal", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Mostrar etiquetas de host", - "showHostTagsDesc": "Mostrar etiquetas en la lista de hosts", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Haz clic para expandir las acciones del anfitrión.", "hostTrayOnClickDesc": "Mostrar siempre los botones de conexión; hacer clic para expandir las opciones de administración en lugar de pasar el cursor por encima.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Mantener siempre expandida la barra lateral izquierda en lugar de expandirla al pasar el cursor sobre ella.", - "settingsSnippets": "Fragmentos", - "foldersCollapsed": "Carpetas colapsadas", - "foldersCollapsedDesc": "Colapsar carpetas por defecto", - "confirmExecution": "Confirmar ejecución", - "confirmExecutionDesc": "Confirmar antes de ejecutar fragmentos", - "settingsUpdates": "Actualizaciones", - "disableUpdateChecks": "Desactivar comprobaciones de actualización", - "disableUpdateChecksDesc": "Dejar de buscar actualizaciones", - "totpAuthenticator": "Autenticador TOTP", - "totpEnabled": "2FA está habilitado", - "totpDisabled": "Añadir seguridad de acceso adicional", - "disable": "Desactivar", - "enable": "Activar", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Escanea el código QR o introduce el secreto en tu aplicación de autenticador, luego introduce el código de 6 dígitos", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verificar", - "changePassword": "Cambiar contraseña", - "currentPasswordLabel": "Contraseña actual", - "currentPasswordPlaceholder": "Contraseña actual", - "newPasswordLabel": "Nueva contraseña", - "newPasswordPlaceholder": "Nueva contraseña", - "confirmPasswordLabel": "Confirmar nueva contraseña", - "confirmPasswordPlaceholder": "Confirmar nueva contraseña", - "updatePassword": "Actualizar contraseña", - "createApiKeyTitle": "Crear Clave API", - "createApiKeyDescription": "Generar una nueva clave API para el acceso programático.", - "apiKeyNameLabel": "Nombre", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "opcional", + "optional": "optional", "cancel": "Cancelar", - "createKey": "Crear Clave", - "apiKeyCount": "Claves {{count}}", - "newKey": "Nueva Clave", - "noApiKeys": "Aún no hay claves API.", - "apiKeyActive": "Activo", - "apiKeyUsageHint": "Incluye tu clave en el", - "apiKeyUsageHintHeader": "cabecera.", - "apiKeyPermissionsHint": "Las claves heredan los permisos del usuario creador.", - "roleUser": "Usuario", - "authMethodDual": "Doble Auth", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Error al iniciar la configuración del TOTP", - "totpEnter6Digits": "Introduzca un código de 6 dígitos", - "totpEnabledSuccess": "Autenticación de doble factor habilitada", - "totpInvalidCode": "Código inválido, por favor inténtelo de nuevo", - "totpDisableInputRequired": "Introduzca su código TOTP o contraseña", - "totpDisabledSuccess": "Autenticación de doble factor desactivada", - "totpDisableFailed": "Error al desactivar 2FA", - "totpDisableTitle": "Desactivar 2FA", - "totpDisablePlaceholder": "Introduzca código TOTP o contraseña", - "totpDisableConfirm": "Desactivar 2FA", - "totpContinueVerify": "Continuar a verificar", - "totpVerifyTitle": "Verificar código", - "totpBackupTitle": "Copias de seguridad", - "totpDownloadBackup": "Descargar códigos de copia de seguridad", - "done": "Hecho", - "secretCopied": "secreto copiado al portapapeles", - "apiKeyNameRequired": "Se requiere nombre de clave", - "apiKeyCreated": "Clave API \"{{name}}\" creada", - "apiKeyCreateFailed": "Error al crear la clave API", - "apiKeyUser": "Usuario", - "apiKeyExpires": "Caduca", - "apiKeyRevoked": "Clave API \"{{name}}\" revocada", - "apiKeyRevokeFailed": "Error al revocar la clave API", - "passwordFieldsRequired": "Se requieren contraseñas actuales y nuevas", - "passwordMismatch": "Las contraseñas no coinciden", - "passwordTooShort": "La contraseña debe tener al menos 6 caracteres", - "passwordUpdated": "Contraseña actualizada correctamente", - "passwordUpdateFailed": "Error al actualizar la contraseña", - "deletePasswordRequired": "Se requiere contraseña para eliminar su cuenta", - "deleteFailed": "Error al eliminar la cuenta", - "deleting": "Eliminando...", - "colorPickerTooltip": "Abrir selector de color", - "themeSystem": "Sistema", - "themeLight": "Claro", - "themeDark": "Oscuro", - "themeDracula": "Drácula", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarizado", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Una oscura", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refrescar", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Etiquetas", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Rever", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Eliminar", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/fi_FI.json b/src/ui/locales/translated/fi_FI.json index f9901c47..d67ed19d 100644 --- a/src/ui/locales/translated/fi_FI.json +++ b/src/ui/locales/translated/fi_FI.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Kansiot", - "folder": "Kansio", + "folders": "Folders", + "folder": "Folder", "password": "Salasana", - "key": "Avain", - "sshPrivateKey": "Ssh Yksityinen Avain", - "upload": "Lähetä", - "keyPassword": "Avaimen Salasana", - "sshKey": "Ssh Avain", - "uploadPrivateKeyFile": "Lataa Yksityinen Avaintiedosto", - "searchCredentials": "Hae käyttäjätunnuksia...", - "addCredential": "Lisää Käyttöoikeustieto", - "caCertificate": "CA-todistus (-cert.pub)", - "caCertificateDescription": "Valinnainen: Lataa tai liitä CA-allekirjoitettu sertifikaattitiedosto (esim. id_ed25519-cert.pub). Vaaditaan kun SSH-palvelin käyttää sertifikaattipohjaista valtuutusta.", - "uploadCertFile": "Lataa -cert.pub-tiedosto", - "clearCert": "Tyhjennä", - "certLoaded": "Varmenne ladattu", - "certPublicKeyLabel": "Varmenne", - "certTypeLabel": "Varmenteen tyyppi", - "pasteOrUploadCert": "Liitä tai lataa -cert.pub sertifikaatti...", - "hasCaCert": "On CA-varmenne", - "noCaCert": "Ei CA-varmennetta" + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH-avain", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Oletusjärjestys", + "sortNameAsc": "Nimi (A → Ö)", + "sortNameDesc": "Nimi (Ö → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Tyhjennä suodattimet", + "filterTypeGroup": "Type", + "filterTypePassword": "Salasana", + "filterTypeKey": "SSH-avain", + "filterTagsGroup": "Tunnisteet" }, "homepage": { - "failedToLoadAlerts": "Ilmoitusten lataaminen epäonnistui", - "failedToDismissAlert": "Hälytys epäonnistui" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Palvelimen Asetukset", - "description": "Määritä Termix-palvelimen URL-osoite yhdistääksesi taustaosan palveluihin", - "serverUrl": "Palvelimen URL", - "enterServerUrl": "Syötä palvelimen URL-osoite", - "saveFailed": "Konfiguraation tallennus epäonnistui", - "saveError": "Virhe tallennettaessa määritystä", - "saving": "Tallennetaan...", - "saveConfig": "Tallenna Asetukset", - "helpText": "Syötä URL, jossa Termix-palvelin on käynnissä (esim. http://localhost:30001 tai https://your-server.com)", - "changeServer": "Vaihda Palvelinta", - "mustIncludeProtocol": "Palvelimen URL-osoitteen on alettava http:// tai http://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Salli virheellinen varmenne", "allowInvalidCertificateDesc": "Käytä vain luotettaville itse isännöidyille palvelimille, joissa on itse allekirjoitetut tai IP-osoitevarmenteet.", - "useEmbedded": "Käytä Paikallista Palvelinta", - "embeddedDesc": "Suorita Termix sisäänrakennetulla paikallisella palvelimella (etäpalvelinta ei tarvita)", - "embeddedConnecting": "Yhdistetään paikalliseen palvelimeen...", - "embeddedNotReady": "Paikallinen palvelin ei ole vielä valmis. Odota hetki ja yritä uudelleen.", - "localServer": "Paikallinen Palvelin" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Poistaa" }, "versionCheck": { - "error": "Version Tarkistus Virhe", - "checkFailed": "Päivitysten tarkistus epäonnistui", - "upToDate": "Sovellus on ajan tasalla", - "currentVersion": "Käytössäsi on versio {{version}}", - "updateAvailable": "Päivitys Saatavilla", - "newVersionAvailable": "Uusi versio on saatavilla! Käytät {{current}}, mutta {{latest}} on saatavilla.", - "betaVersion": "Beta Versio", - "betaVersionDesc": "Käytössäsi on {{current}}, joka on uudempi kuin uusin vakaa julkaisu {{latest}}.", - "releasedOn": "Julkaistu {{date}}", - "downloadUpdate": "Lataa Päivitys", - "checking": "Tarkistetaan päivityksiä...", - "checkUpdates": "Tarkista päivitykset", - "checkingUpdates": "Tarkistetaan päivityksiä...", - "updateRequired": "Päivitys Vaaditaan" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Sulje", + "close": "Close", "minimize": "Minimize", - "online": "Paikalla", + "online": "Verkossa", "offline": "Offline-tilassa", - "continue": "Jatka", - "maintenance": "Huolto", - "degraded": "Hajotettu", - "error": "Virhe", - "warning": "Varoitus", - "unsavedChanges": "Tallentamattomat muutokset", - "dismiss": "Hylkää", - "loading": "Ladataan...", - "optional": "Valinnainen", - "connect": "Yhdistä", - "copied": "Kopioitu", - "connecting": "Yhdistetään...", - "updateAvailable": "Päivitys Saatavilla", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Avaa uudessa välilehdessä", - "noReleases": "Ei Julkaisuja", - "updatesAndReleases": "Päivitykset Ja Julkaisut", - "newVersionAvailable": "Uusi versio ({{version}}) on saatavilla.", - "failedToFetchUpdateInfo": "Päivitystietojen noutaminen epäonnistui", - "preRelease": "Esijulkaisu", - "noReleasesFound": "Julkaisuja ei löytynyt.", - "cancel": "Peruuta", - "username": "Käyttäjätunnus", - "login": "Kirjaudu", - "register": "Rekisteröidy", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Peruuttaa", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Salasana", - "confirmPassword": "Vahvista Salasana", - "back": "Takaisin", - "save": "Tallenna", - "saving": "Tallennetaan...", - "delete": "Poista", - "rename": "Uudelleennimeä", - "edit": "Muokkaa", - "add": "Lisää", - "confirm": "Vahvista", - "no": "Ei", - "or": "TAI", - "next": "Seuraava", - "previous": "Edellinen", - "refresh": "Päivitä", - "language": "Kieli", - "checking": "Tarkistetaan...", - "checkingDatabase": "Tarkistetaan tietokantayhteyttä...", - "checkingAuthentication": "Tarkistetaan todennusta...", - "backendReconnected": "Palvelinyhteys palautettu", - "connectionDegraded": "Palvelinyhteys katkesi, palautetaan…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Poista", - "create": "Luo", - "update": "Päivitä", - "copy": "Kopioi", - "copyFailed": "Kopiointi leikepöydälle epäonnistui", + "remove": "Poistaa", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Palauta", - "of": "jostakin" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Koti", - "terminal": "Pääte", - "docker": "Telakoitsija", - "tunnels": "Tunnelit", - "fileManager": "Tiedostojen Hallinta", - "serverStats": "Palvelimen Tilastot", - "admin": "Ylläpitäjä", - "userProfile": "Käyttäjän Profiili", - "splitScreen": "Jaettu Näyttö", - "confirmClose": "Sulje tämä aktiivinen istunto?", - "close": "Sulje", - "cancel": "Peruuta", - "sshManager": "Ssh Hallinta", - "cannotSplitTab": "Välilehtiä ei voi jakaa", + "home": "Home", + "terminal": "Terminaali", + "docker": "Satamatyöläinen", + "tunnels": "Tunnels", + "fileManager": "Tiedostonhallinta", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Peruuttaa", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Kopioi Salasana", - "copySudoPassword": "Kopioi Sudo Salasana", - "passwordCopied": "Salasana kopioitu leikepöydälle", - "noPasswordAvailable": "Salasanaa ei ole saatavilla", - "failedToCopyPassword": "Salasanan kopiointi epäonnistui", - "refreshTab": "Päivitä yhteys", - "openFileManager": "Avaa Tiedostonhallinta", - "dashboard": "Hallintapaneeli", - "networkGraph": "Verkkokaavio", - "quickConnect": "Nopea Yhdistäminen", - "sshTools": "SSH Työkalut", - "history": "Historia", - "hosts": "Isäntä", - "snippets": "Projekti", - "hostManager": "Isäntälaitteen Hallinta", - "credentials": "Käyttäjätunnukset", - "connections": "Yhteydet", - "roleAdministrator": "Ylläpitäjä", - "roleUser": "Käyttäjä" + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Isäntä", - "noHosts": "Ei Ssh Isäntiä", - "retry": "Yritä Uudelleen", - "refresh": "Päivitä", - "optional": "Valinnainen", - "downloadSample": "Lataa Näyte", - "failedToDeleteHost": "{{name}} poisto epäonnistui", - "importSkipExisting": "Tuo (ohita olemassa)", - "connectionDetails": "Yhteyden Tiedot", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Yritä uudelleen", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Etätyöpöytä", - "port": "Portti", - "username": "Käyttäjätunnus", - "folder": "Kansio", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "Tunnisteet", - "pin": "Kiinnitä", - "addHost": "Lisää Isäntä", - "editHost": "Muokkaa Palvelinta", - "cloneHost": "Kloonaa Isäntä", - "enableTerminal": "Ota Pääte Käyttöön", - "enableTunnel": "Ota Tunneli Käyttöön", - "enableFileManager": "Ota Tiedostonhallinta Käyttöön", - "enableDocker": "Ota Docker Käyttöön", - "defaultPath": "Oletus Polku", - "connection": "Yhteys", - "upload": "Lähetä", - "authentication": "Todennus", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Salasana", - "key": "Avain", - "credential": "Käyttöoikeustiedot", - "none": "Ei Mitään", - "sshPrivateKey": "Ssh Yksityinen Avain", - "keyType": "Avaimen Tyyppi", - "uploadFile": "Lataa Tiedosto", - "tabGeneral": "Yleiset", + "key": "Key", + "credential": "Valtakirja", + "none": "Ei mitään", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", + "tabTerminal": "Terminaali", + "tabRdp": "Maaseudun kehittämisohjelma", "tabVnc": "VNC", - "tabTunnels": "Tunnelit", - "tabDocker": "Telakoitsija", - "tabFiles": "Tiedostot", - "tabStats": "Tilastot", + "tabTunnels": "Tunnels", + "tabDocker": "Satamatyöläinen", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Jakaminen", - "tabAuthentication": "Todennus", - "terminal": "Pääte", - "tunnel": "Tunneli", - "fileManager": "Tiedostojen Hallinta", - "serverStats": "Palvelimen Tilastot", - "status": "Tila", - "folderRenamed": "Kansio \"{{oldName}}\" nimettiin uudelleen onnistuneesti muotoon \"{{newName}}\"", - "failedToRenameFolder": "Kansion uudelleennimeäminen epäonnistui", - "movedToFolder": "Siirretty kohteeseen \"{{folder}}\"", - "editHostTooltip": "Muokkaa isäntää", - "statusChecks": "Tilan Tarkastukset", - "metricsCollection": "Metriikan Kokoelma", - "metricsInterval": "Metrics Kokoelman Aikaväli", - "metricsIntervalDesc": "Kuinka usein palvelimia koskevia tilastoja kerätään (5s - 1h)", - "behavior": "Käyttäytyminen", - "themePreview": "Teeman Esikatselu", - "theme": "Teema", - "fontFamily": "Kirjasinperhe", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminaali", + "tunnel": "Tunnel", + "fileManager": "Tiedostonhallinta", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Kirje Väli", - "lineHeight": "Rivin Korkeus", - "cursorStyle": "Kohdistimen Tyyli", - "cursorBlink": "Kohdistimen Vilkutus", - "scrollbackBuffer": "Vierityspuskuri", - "bellStyle": "Äänimerkin Tyyli", - "rightClickSelectsWord": "Oikea Napsautus Valitsee Sanan", - "fastScrollModifier": "Nopea Vieritysmuokkain", - "fastScrollSensitivity": "Nopea Vieritä Herkkyys", - "sshAgentForwarding": "Ssh Agentti Eteenpäinvälitys", - "backspaceMode": "Askelpalautin Tila", - "startupSnippet": "Käynnistä Projekti", - "selectSnippet": "Valitse tiedosto", - "forceKeyboardInteractive": "Pakota Näppäimistön Interaktiivinen", - "overrideCredentialUsername": "Ohita Käyttöoikeustietojen Käyttäjätunnus", - "overrideCredentialUsernameDesc": "Käytä yllä määriteltyä käyttäjänimeä käyttäjätunnuksen sijaan", - "jumpHostChain": "Hyppää Isäntäketju", - "portKnocking": "Sataman Nukkuminen", - "addKnock": "Lisää Portti", - "addProxyNode": "Lisää Solmu", - "proxyNode": "Välityspalvelimen Solmu", - "proxyType": "Välityspalvelimen Tyyppi", - "quickActions": "Nopeat Toiminnot", - "sudoPasswordAutoFill": "Sudo Salasanan Automaattitäyttö", - "sudoPassword": "Sudo Salasana", - "keepaliveInterval": "Keepalive -väli (ms)", - "moshCommand": "MOSH Komento", - "environmentVariables": "Ympäristön Muuttujat", - "addVariable": "Lisää Muuttuja", - "docker": "Telakoitsija", - "copyTerminalUrl": "Kopioi Päätteen URL", - "copyFileManagerUrl": "Kopioi Tiedostonhallinnan URL", - "copyRemoteDesktopUrl": "Kopioi Työpöydän URL", - "failedToConnect": "Yhteyden muodostaminen konsoliin epäonnistui", - "connect": "Yhdistä", - "disconnect": "Katkaise", - "start": "Aloita", - "enableStatusCheck": "Ota Tilan Tarkistus Käyttöön", - "enableMetrics": "Ota Metrics Käyttöön", - "bulkUpdateFailed": "Massapäivitys epäonnistui", - "selectAll": "Valitse Kaikki", - "deselectAll": "Poista Kaikki Valinnat", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Satamatyöläinen", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Turvallinen Tulkki", - "virtualNetwork": "Virtuaalinen Verkko", - "unencryptedShell": "Salaamaton tulkki", - "addressIp": "Osoite / IP", - "friendlyName": "Ystävällinen Nimi", - "folderAndAdvanced": "Kansio & Lisäasetukset", - "privateNotes": "Yksityiset Muistiinpanot", - "privateNotesPlaceholder": "Tämän palvelimen yksityiskohdat...", - "pinToTop": "Kiinnitä ylös", - "pinToTopDesc": "Näytä aina tämä isäntä listan yläreunassa", - "portKnockingSequence": "Portin Torkkujärjestys", - "addKnockBtn": "Lisää Torkku", - "noPortKnocking": "Portin koputtamista ei ole määritetty.", - "knockPort": "Knock Portti", - "protocol": "Protocol", - "delayAfterMs": "Viive Jälkeen (Ms)", - "useSocks5Proxy": "Käytä SOCKS5-välityspalvelinta", - "useSocks5ProxyDesc": "Reitin yhteys välityspalvelimen kautta", - "proxyHost": "Välityspalvelimen Isäntä", - "proxyPort": "Välityspalvelimen Portti", - "proxyUsername": "Välityspalvelimen Käyttäjänimi", - "proxyPassword": "Välityspalvelimen Salasana", - "proxySingleMode": "Yksi Välityspalvelin", - "proxyChainMode": "Välityspalvelimen Ketju", - "you": "Sinä", - "jumpHostChainLabel": "Hyppää Isäntäketju", - "addJumpBtn": "Lisää Hyppy", - "noJumpHosts": "Hyppypalvelimia ei ole määritetty.", - "selectAServer": "Valitse palvelin...", - "sshPort": "Ssh Portti", - "authMethod": "Todistusmenetelmä", - "storedCredential": "Tallennettu Käyttöoikeustieto", - "selectACredential": "Valitse käyttäjätunnus...", - "keyTypeLabel": "Avaimen Tyyppi", - "keyTypeAuto": "Tunnista Automaattisesti", - "keyPasteTab": "Liitä", - "keyUploadTab": "Lähetä", - "keyFileLoaded": "Avaintiedosto ladattu", - "keyUploadClick": "Klikkaa ladataksesi .pem / .key / .ppk", - "clearKey": "Tyhjennä avain", - "keySaved": "SSH avain tallennettu", - "keyReplaceNotice": "liitä uusi avain alla korvaamaan se", - "keyPassphraseSaved": "Tunnuslause tallennettu, kirjoita vaihtaaksesi", - "replaceKey": "Korvaa avain", - "forceKeyboardInteractiveLabel": "Pakota Näppäimistön Interaktiivinen", - "forceKeyboardInteractiveShortDesc": "Pakota manuaalinen salasanakirjaus, vaikka avaimet olisivat läsnä", - "terminalAppearance": "Pääteikkunan Ulkonäkö", - "colorTheme": "Väri Teema", - "fontFamilyLabel": "Kirjasinperhe", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protokolla", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Kohdistimen Tyyli", - "letterSpacingPx": "Kirje Väli (px)", - "lineHeightLabel": "Rivin Korkeus", - "bellStyleLabel": "Äänimerkin Tyyli", - "backspaceModeLabel": "Askelpalautin Tila", - "cursorBlinking": "Kohdistimen Vilkkuminen", - "cursorBlinkingDesc": "Ota käyttöön vilkkuva animaatio päätelaitteen kohdistimeen", - "rightClickSelectsWordLabel": "Oikea-klikkaus Valitsee Sanan", - "rightClickSelectsWordShortDesc": "Valitse sana kohdistimen alta hiiren kakkospainikkeella", - "behaviorAndAdvanced": "Käyttäytyminen Ja Lisäasetukset", - "scrollbackBufferLabel": "Vierityspuskuri", - "scrollbackMaxLines": "Historiassa säilytettyjen rivien enimmäismäärä", - "sshAgentForwardingLabel": "Ssh Agentti Eteenpäinvälitys", - "sshAgentForwardingShortDesc": "Ohita paikalliset SSH avaimet tähän isäntään", - "enableAutoMosh": "Ota AutomaattiMosh Käyttöön", - "enableAutoMoshDesc": "Suosi Mosh SSH jos saatavilla", - "enableAutoTmux": "Ota Automaattisesti Tmux Käyttöön", - "enableAutoTmuxDesc": "Käynnistä tai liitä automaattisesti tmux-istuntoon", - "sudoPasswordAutoFillLabel": "Sudo Salasana Täytä Automaattisesti", - "sudoPasswordAutoFillShortDesc": "Anna sudo-salasana automaattisesti pyydettäessä", - "sudoPasswordLabel": "Sudo Salasana", - "environmentVariablesLabel": "Ympäristön Muuttujat", - "addVariableBtn": "Lisää Muuttuja", - "noEnvVars": "Ympäristömuuttujia ei ole määritetty.", - "fastScrollModifierLabel": "Nopea Vieritysmuokkain", - "fastScrollSensitivityLabel": "Nopea Vieritä Herkkyys", - "moshCommandLabel": "Mosh Komento", - "startupSnippetLabel": "Käynnistä Projekti", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Säilytysaika (sekuntia)", - "maxKeepaliveMisses": "Enimmäismäärä Keepalive Misses", - "tunnelSettings": "Tunnelin Asetukset", - "enableTunneling": "Ota Tunnistus Käyttöön", - "enableTunnelingDesc": "Ota käyttöön SSH tunnelin toiminnot tälle isännälle", - "serverTunnelsSection": "Palvelimen Tunnelit", - "addTunnelBtn": "Lisää Tunneli", - "noTunnelsConfigured": "Tunneleita ei ole määritetty.", - "tunnelLabel": "Tunneli {{number}}", - "tunnelType": "Tunnelin Tyyppi", - "tunnelModeLocalDesc": "Välitä paikallinen portti porttiin etäpalvelimella (tai palvelimella, johon se on saavutettavissa).", - "tunnelModeRemoteDesc": "Lähetä etäpalvelimella oleva portti takaisin koneesi paikalliseen porttiin.", - "tunnelModeDynamicDesc": "Luo paikalliseen porttiin SOCKS5-välityspalvelin dynaamista porttien huolintaa varten.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Tämä isäntä (suora tunneli)", - "endpointHost": "Päätepisteen Isäntä", - "endpointPort": "Päätepisteen Portti", - "bindHost": "Sido Isäntä", - "sourcePort": "Lähde Portti", - "maxRetries": "Maksimi Uudelleen", - "retryIntervalS": "Uudelleen Aikaväli (s)", - "autoStartLabel": "Automaattikäynnistys", - "autoStartDesc": "Yhdistä tämä tunneli automaattisesti kun isäntä on ladattu", - "tunnelConnecting": "Tunneli yhdistää...", - "tunnelDisconnected": "Tunneli katkaistu", - "failedToConnectTunnel": "Yhteyden muodostaminen epäonnistui", - "failedToDisconnectTunnel": "Yhteyden katkaisu epäonnistui", - "dockerIntegration": "Docker Integraatio", - "enableDockerMonitor": "Ota Docker Käyttöön", - "enableDockerMonitorDesc": "Tarkkaile ja hallitse tämän isännän kontteja Dockerin kautta", - "enableFileManagerMonitor": "Ota Tiedostonhallinta Käyttöön", - "enableFileManagerMonitorDesc": "Selaa ja hallitse tiedostoja tässä palvelimessa SFTP:n kautta", - "defaultPathLabel": "Oletus Polku", - "fileManagerPathHint": "Hakemisto, joka avataan, kun tiedostonhallinta käynnistyy tälle palvelimelle.", - "statusChecksLabel": "Tilan Tarkastukset", - "enableStatusChecks": "Ota Tilatarkastukset Käyttöön", - "enableStatusChecksDesc": "Pellamalla tätä isäntää määräajoin varmistaaksesi käytettävyyden", - "useGlobalInterval": "Käytä Globaalia Aikaväliä", - "useGlobalIntervalDesc": "Ohita palvelimen koko tilan tarkistusväli", - "checkIntervalS": "Tarkastusväli (s)", - "checkIntervalDesc": "Sekuntia jokaisen yhteyden pingin välillä", - "metricsCollectionLabel": "Metriikan Kokoelma", - "enableMetricsLabel": "Ota Metrics Käyttöön", - "enableMetricsDesc": "Kerää suoritin, RAM, levy ja verkon käyttö tältä palvelimelta", - "useGlobalMetrics": "Käytä Globaalia Aikaväliä", - "useGlobalMetricsDesc": "Ohita palvelimen leveä mittausväli", - "metricsIntervalS": "Metrics Aikaväli (s)", - "metricsIntervalDesc2": "Sekuntia metristen tilannekuvien välillä", - "visibleWidgets": "Näkyvät Widgetit", - "cpuUsageLabel": "Suorittimen Käyttö", - "cpuUsageDesc": "Prosessin prosentti, kuorman keskiarvot, kipinäviiva", - "memoryLabel": "Muistin Käyttö", - "memoryDesc": "RAM-muistin käyttö, swap, välimuistissa", - "storageLabel": "Levyn Käyttö", - "storageDesc": "Levyn käyttö kiinnityspistettä kohden", - "networkLabel": "Verkon Liitännät", - "networkDesc": "Käyttöliittymän luettelo ja kaistanleveys", - "uptimeLabel": "Käyttöaika", - "uptimeDesc": "Järjestelmän käyttöaika ja käynnistysaika", - "systemInfoLabel": "Järjestelmän Tiedot", - "systemInfoDesc": "Käyttöjärjestelmä, ytimen, isäntänimi, arkkitehtuuri", - "recentLoginsLabel": "Viimeisimmät Kirjautumistiedot", - "recentLoginsDesc": "Onnistuneet ja epäonnistuneet kirjautumistapahtumat", - "topProcessesLabel": "Parhaat Prosessit", - "topProcessesDesc": "PID, CPU%, MEM%, komento", - "listeningPortsLabel": "Kuunnellaan Satamia", - "listeningPortsDesc": "Avoimet portit prosessin ja tilan kanssa", - "firewallLabel": "Palomuuri", - "firewallDesc": "Palomuuli, AppArmor, SELinux tila", - "quickActionsLabel": "Nopeat Toiminnot", - "quickActionsToolbar": "Pikatoiminnot näkyvät painikkeina palvelimen tilastojen työkalurivissä, kun yhden napsautuksen komento suoritetaan.", - "noQuickActions": "Ei vielä nopeita toimintoja.", - "buttonLabel": "Painikkeen nimi", - "selectSnippetPlaceholder": "Valitse leikkaus...", - "addActionBtn": "Lisää Toiminto", - "hostSharedSuccessfully": "Isäntä jaettu onnistuneesti", - "failedToShareHost": "Palvelimen jakaminen epäonnistui", - "accessRevoked": "Pääsy peruttu", - "failedToRevokeAccess": "Käyttöoikeuksien peruuttaminen epäonnistui", - "cancelBtn": "Peruuta", - "savingBtn": "Tallennetaan...", - "addHostBtn": "Lisää Isäntä", - "hostUpdated": "Isäntä päivitetty", - "hostCreated": "Isäntä luotu", - "failedToSave": "Palvelimen tallentaminen epäonnistui", - "credentialUpdated": "Käyttöoikeustiedot päivitetty", - "credentialCreated": "Tekijä luotu", - "failedToSaveCredential": "Käyttäjätunnuksen tallentaminen epäonnistui", - "backToHosts": "Takaisin isäntiin", - "backToCredentials": "Takaisin käyttäjätunnuksiin", - "pinned": "Kiinnitetty", - "noHostsFound": "Isäntää ei löytynyt", - "tryDifferentTerm": "Kokeile toista termiä", - "addFirstHost": "Lisää ensimmäinen isäntä aloittaaksesi", - "noCredentialsFound": "Kirjautumistietoja ei löytynyt", - "addCredentialBtn": "Lisää Käyttöoikeustieto", - "updateCredentialBtn": "Päivitä Käyttöoikeustiedot", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Salasana", + "authTypeKey": "SSH-avain", + "authTypeCredential": "Valtakirja", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Ei mitään", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Peruuttaa", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Pinned", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Ominaisuudet", - "noFolder": "(Ei kansiota)", - "deleteSelected": "Poista", - "exitSelection": "Poistu valinnasta", - "importSkip": "Tuo (ohita olemassa)", - "importOverwrite": "Tuonti (ylikirjoitettu)", - "collapseBtn": "Kutista", - "importExportBtn": "Tuo / Vie", - "hostStatusesRefreshed": "Isäntätilan päivitys", - "failedToRefreshHosts": "Ei voitu päivittää isäntiä", - "movedHostTo": "Siirretty {{host}} kohtaan \"{{folder}}\"", - "failedToMoveHost": "Palvelimen siirto epäonnistui", - "folderRenamedTo": "Kansio nimetty uudelleen \"{{name}}\"", - "deletedFolder": "Poistettu kansio \"{{name}}\"", - "failedToDeleteFolder": "Kansion poistaminen epäonnistui", - "deleteAllInFolder": "Poista kaikki isännät \"{{name}}\"? Tätä ei voi perua.", - "deletedHost": "Poistettu {{name}}", - "copiedToClipboard": "Kopioitu leikepöydälle", - "terminalUrlCopied": "Pääteikkunan URL kopioitu", - "fileManagerUrlCopied": "Tiedostonhallinnan URL kopioitu", - "tunnelUrlCopied": "Tunnelin URL kopioitu", - "dockerUrlCopied": "Docker URL kopioitu", - "serverStatsUrlCopied": "Palvelimen tilastojen URL kopioitu", - "rdpUrlCopied": "RDP URL kopioitu", - "vncUrlCopied": "VNC URL kopioitu", - "telnetUrlCopied": "Telnet URL kopioitu", - "remoteDesktopUrlCopied": "Etätyöpöydän URL kopioitu", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Peruuttaa", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protokolla", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Laajenna toimintoja", "collapseActions": "Tiivistä toiminnot", "wakeOnLanAction": "Herätys lähiverkossa", - "wakeOnLanSuccess": "Taikapaketti lähetetty osoitteeseen {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Taikapaketin lähettäminen epäonnistui", - "cloneHostAction": "Kloonaa Isäntä", - "copyAddress": "Kopioi Osoite", - "copyLink": "Kopioi Linkki", - "copyTerminalUrlAction": "Kopioi Päätteen URL", - "copyFileManagerUrlAction": "Kopioi Tiedostonhallinnan URL", - "copyTunnelUrlAction": "Kopioi Tunnelin URL", - "copyDockerUrlAction": "Kopioi Docker URL", - "copyServerStatsUrlAction": "Kopioi Palvelimen Tilastot Url", - "copyRdpUrlAction": "Kopioi RDP URL", - "copyVncUrlAction": "Kopioi VNC URL", - "copyTelnetUrlAction": "Kopioi Telnet URL", - "copyRemoteDesktopUrlAction": "Kopioi Työpöydän URL", - "deleteCredentialConfirm": "Poista käyttäjätunnus \"{{name}}\"?", - "deletedCredential": "Poistettu {{name}}", - "deploySSHKeyTitle": "Julkaise Ssh Avain", - "deployingBtn": "Otetaan Käyttöön...", - "deployBtn": "Julkaise", - "failedToDeployKey": "Avaimen käyttöönotto epäonnistui", - "deleteHostsConfirm": "Poistetaanko {{count}} isäntä{{plural}}? Tätä ei voi perua.", - "movedToRoot": "Siirretty juuriin", - "failedToMoveHosts": "Isäntäpisteiden siirto epäonnistui", - "enableTerminalFeature": "Ota Pääte Käyttöön", - "disableTerminalFeature": "Poista Pääte Käytöstä", - "enableFilesFeature": "Ota Tiedostot Käyttöön", - "disableFilesFeature": "Poista Tiedostot Käytöstä", - "enableTunnelsFeature": "Salli Tunnelit", - "disableTunnelsFeature": "Poista Tunnelit Käytöstä", - "enableDockerFeature": "Ota Docker Käyttöön", - "disableDockerFeature": "Poista Docker Käytöstä", - "addTagsPlaceholder": "Lisää tunnisteita...", - "authDetails": "Todennuksen Tiedot", - "credType": "Tyyppi", - "generateKeyPairDesc": "Luo uusi avainpari, sekä yksityiset että julkiset avaimet täytetään automaattisesti.", - "generatingKey": "Luodaan...", - "generateLabel": "Luo {{label}}", - "uploadFileBtn": "Lataa tiedosto", - "keyPassphraseOptional": "Avaimen Tunnuslause (Valinnainen)", - "sshPublicKeyOptional": "Ssh Julkinen Avain (Valinnainen)", - "publicKeyGenerated": "Julkinen avain luotu", - "failedToGeneratePublicKey": "Julkisen avaimen johtaminen epäonnistui", - "publicKeyCopied": "Julkinen avain kopioitu", - "keyPairGenerated": "{{label}} avainpari luotu", - "failedToGenerateKeyPair": "Avainparin luonti epäonnistui", - "searchHostsPlaceholder": "Etsi isäntiä, osoitteita, tunnisteita…", - "searchCredentialsPlaceholder": "Hae käyttäjätunnuksia…", - "refreshBtn": "Päivitä", - "addTag": "Lisää tunnisteita...", - "deleteConfirmBtn": "Poista", - "tunnelRequirementsText": "SSH-palvelimella on oltava GatewayPorts kyllä, AllowTcpForwarding kyllä, ja PermitRootLogin kyllä asetettu /etc/ssh/sshd_config.", - "deleteHostConfirm": "Poista \"{{name}}\"?", - "enableAtLeastOneProtocol": "Ota käyttöön vähintään yksi yllä oleva protokolla määrittääksesi todennuksen ja yhteysasetukset.", - "keyPassphrase": "Avaimen Tunnuslause", - "connectBtn": "Yhdistä", - "disconnectBtn": "Katkaise", - "basicInformation": "Perustiedot", - "authDetailsSection": "Todennuksen Tiedot", - "credTypeLabel": "Tyyppi", - "hostsTab": "Isäntä", - "credentialsTab": "Käyttäjätunnukset", - "selectMultiple": "Valitse useita", - "selectHosts": "Valitse isännät", - "connectionLabel": "Yhteys", - "authenticationLabel": "Todennus", - "generateKeyPairTitle": "Luo Avaimen Pari", - "generateKeyPairDescription": "Luo uusi avainpari, sekä yksityiset että julkiset avaimet täytetään automaattisesti.", - "generateFromPrivateKey": "Luo yksityisellä avaimella", - "refreshBtn2": "Päivitä", - "exitSelectionTitle": "Poistu valinnasta", - "exportAll": "Vie Kaikki", - "addHostBtn2": "Lisää Isäntä", - "addCredentialBtn2": "Lisää Käyttöoikeustieto", - "checkingHostStatuses": "Tarkistetaan isäntätiloja...", - "pinnedSection": "Kiinnitetty", - "hostsExported": "Isäntä viety onnistuneesti", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Pinned", + "hostsExported": "Hosts exported successfully", "exportFailed": "Isäntien vienti epäonnistui", - "sampleDownloaded": "Mallitiedosto ladattu", - "failedToDeleteCredential2": "Käyttäjätunnuksen poistaminen epäonnistui", - "noFolderOption": "(Ei kansiota)", - "nSelected": "{{count}} valittu", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Ominaisuudet", - "moveMenu": "Siirrä", - "cancelSelection": "Peruuta", - "deployDialogDesc": "Julkaise {{name}} isännän authorized_keys.", - "targetHostLabel": "Kohde Isäntä", - "selectHostOption": "Valitse isäntä...", - "keyDeployedSuccess": "Avaimen käyttöönotto onnistui", - "failedToDeployKey2": "Avaimen käyttöönotto epäonnistui", - "deletedCount": "Poistettu {{count}} isäntä", - "failedToDeleteCount": "{{count}} isäntien poistaminen epäonnistui", - "duplicatedHost": "Monistettu \"{{name}}\"", - "failedToDuplicateHost": "Palvelimen kopiointi epäonnistui", - "updatedCount": "Päivitetään {{count}} isäntää", - "friendlyNameLabel": "Ystävällinen Nimi", - "descriptionLabel": "Kuvaus", - "loadingHost": "Ladataan konetta...", - "loadingHosts": "Ladataan isäntiä...", - "loadingCredentials": "Ladataan käyttäjätietoja...", - "noHostsYet": "Ei vielä isäntiä", - "noHostsMatchSearch": "Yksikään isäntä ei vastaa hakuasi", - "hostNotFound": "Palvelinta ei löydy", - "searchHosts": "Etsi palvelimia...", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Peruuttaa", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Lajittele isännät", "sortDefault": "Oletusjärjestys", "sortNameAsc": "Nimi (A → Ö)", @@ -588,7 +753,7 @@ "filterStatusGroup": "Status", "filterOnline": "Verkossa", "filterOffline": "Offline-tilassa", - "filterPinned": "Kiinnitetty", + "filterPinned": "Pinned", "filterAuthGroup": "Valtuutustyyppi", "filterAuthPassword": "Salasana", "filterAuthKey": "SSH-avain", @@ -603,556 +768,587 @@ "filterFeaturesGroup": "Ominaisuudet", "filterFeatureTerminal": "Terminaali", "filterFeatureFileManager": "Tiedostonhallinta", - "filterFeatureTunnel": "Tunneli", + "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Satamatyöläinen", "filterTagsGroup": "Tunnisteet", - "shareHost": "Jaa Isäntä", - "shareHostTitle": "Jaa: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Tämän isännän on käytettävä käyttäjätunnusta ottaakseen jakamisen käyttöön. Muokkaa isäntää ja määritä käyttäjätunnus ensin." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Yhteys", - "authentication": "Todennus", - "connectionSettings": "Yhteyden Asetukset", - "displaySettings": "Näytä Asetukset", - "audioSettings": "Äänen Asetukset", - "rdpPerformance": "RDP Suorituskyky", - "deviceRedirection": "Laitteen Uudelleenohjaus", - "session": "Istunto", - "gateway": "Yhdyskäytävä", - "remoteApp": "Etäsovellus", - "clipboard": "Leikepöytä", - "sessionRecording": "Istunnon Tallennus", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Valtakirja", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Vnc Asetukset", - "terminalSettings": "Pääteikkunan Asetukset", - "rdpPort": "RDP Portti", - "username": "Käyttäjätunnus", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Salasana", - "domain": "Verkkotunnus", - "securityMode": "Turvallisuus Tila", - "colorDepth": "Värin Syvyys", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Korkeus", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Muuta Metodin Kokoa", - "clientName": "Asiakkaan Nimi", - "initialProgram": "Alkuperäinen Ohjelma", - "serverLayout": "Palvelimen Asettelu", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Yhdyskäytävän Portti", - "gatewayUsername": "Yhdyskäytävän Käyttäjänimi", - "gatewayPassword": "Gatewayn Salasana", - "gatewayDomain": "Yhdyskäytävän Verkkotunnus", - "remoteAppProgram": "RemoteApp Ohjelma", - "workingDirectory": "Työhakemisto", - "arguments": "Argumentit", - "normalizeLineEndings": "Normalisoi Rivimääritykset", - "recordingPath": "Tallennuksen Polku", - "recordingName": "Tallennuksen Nimi", - "macAddress": "Mapc Osoite", - "broadcastAddress": "Lähetyksen Osoite", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Odotusaika (s)", - "driveName": "Aseman Nimi", - "drivePath": "Aseman Polku", - "ignoreCertificate": "Ohita Sertifikaatti", - "ignoreCertificateDesc": "Salli yhteydet isäntiin, joilla on itseallekirjoitetut varmenteet", - "forceLossless": "Pakota Häviötön", - "forceLosslessDesc": "Pakota häviötön kuvakoodaus (parempi laatu, kaistanleveys)", - "disableAudio": "Poista Ääni Käytöstä", - "disableAudioDesc": "Mykistä kaikki ääni etäistunnosta", - "enableAudioInput": "Ota Äänisyöttö Käyttöön (Mikrofoni)", - "enableAudioInputDesc": "Välitä paikallinen mikrofoni kaukosäätimelle", - "wallpaper": "Taustakuva", - "wallpaperDesc": "Näytä työpöydän taustakuva (pois käytöstä parantaa suorituskykyä)", - "theming": "Teema", - "themingDesc": "Käytä visuaalisia teemoja ja tyylejä", - "fontSmoothing": "Kirjasimen Pehmennys", - "fontSmoothingDesc": "Ota tyhjennystyypin kirjasinrenderointi käyttöön", - "fullWindowDrag": "Koko Ikkunan Vedä", - "fullWindowDragDesc": "Näytä ikkunan sisältö vedettäessä", - "desktopComposition": "Työpöydän Kokoonpano", - "desktopCompositionDesc": "Ota käyttöön Aeron lasitehosteet", - "menuAnimations": "Valikon Animaatiot", - "menuAnimationsDesc": "Ota valikon häivytys ja diaanimaatiot käyttöön", - "disableBitmapCaching": "Poista Bittikarttavälimuisti Käytöstä", - "disableBitmapCachingDesc": "Poista bittikarttavälimuisti käytöstä (voi auttaa glitchesissä)", - "disableOffscreenCaching": "Poista Offscreen Välimuisti Käytöstä", - "disableOffscreenCachingDesc": "Poista näytön välimuisti käytöstä", - "disableGlyphCaching": "Poista Glyph Välimuisti Käytöstä", - "disableGlyphCachingDesc": "Poista glyph välimuisti käytöstä", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Käytä RemoteFX grafiikkaputkea", - "enablePrinting": "Käytä Tulostusta", - "enablePrintingDesc": "Ohjaa paikalliset tulostimet etäistuntoon", - "enableDriveRedirection": "Ota Käyttöön Aseman Uudelleenohjaus", - "enableDriveRedirectionDesc": "Kartta paikallinen kansio asemaksi etäistunnossa", - "createDrivePath": "Luo Asemapolku", - "createDrivePathDesc": "Luo kansio automaattisesti, jos sitä ei ole olemassa", - "disableDownload": "Poista Lataus Käytöstä", - "disableDownloadDesc": "Estä tiedostojen lataaminen etäistunnosta", - "disableUpload": "Poista Lataus Käytöstä", - "disableUploadDesc": "Estä tiedostojen lataaminen etäistuntoon", - "enableTouch": "Ota Kosketus Käyttöön", - "enableTouchDesc": "Ota kosketussyötteen siirto käyttöön", - "consoleSession": "Konsolin Istunto", - "consoleSessionDesc": "Yhdistä konsoliin (istunto 0) uuden istunnon sijaan", - "sendWolPacket": "Lähetä WOL-paketti", - "sendWolPacketDesc": "Lähetä maaginen paketti herättääksesi tämän isännän ennen yhdistämistä", - "disableCopy": "Poista Kopiointi Käytöstä", - "disableCopyDesc": "Estä tekstin kopiointi etäistunnosta", - "disablePaste": "Poista Liitä", - "disablePasteDesc": "Estä tekstin liittäminen etäistuntoon", - "createPathIfMissing": "Luo polku puuttuessa", - "createPathIfMissingDesc": "Luo automaattisesti tallennuskansio", - "excludeOutput": "Sulje Ulostulo", - "excludeOutputDesc": "Älä nauhoita näytön ulostuloa (vain metatiedot)", - "excludeMouse": "Ohita Hiiri", - "excludeMouseDesc": "Älä nauhoita hiiren liikkeitä", - "includeKeystrokes": "Sisällytä Avaimet", - "includeKeystrokesDesc": "Tallenna raa'at näppäimistöt näytön lisäksi", - "vncPort": "Vnc Portti", - "vncPassword": "Vnc Salasana", - "vncUsernameOptional": "Käyttäjänimi (valinnainen)", - "vncLeaveBlank": "Jätä tyhjäksi, jos ei vaadita", - "cursorMode": "Kohdistimen Tila", - "swapRedBlue": "Vaihda Punainen/Sininen", - "swapRedBlueDesc": "Vaihda punaisen ja sinisen värin kanavat (korjaa joitakin väriongelmia)", - "readOnly": "Vain Lukutilassa", - "readOnlyDesc": "Näytä etänäyttö lähettämättä mitään syötettä", - "telnetPort": "Telnet Portti", - "terminalType": "Päätteen Tyyppi", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Väriteema", - "backspaceKey": "Askelpalautin Avain", - "saveHostFirst": "Tallenna isäntä ensin.", - "sharingOptionsAfterSave": "Jakamisen asetukset ovat käytettävissä kun isäntä on tallennettu.", - "sharingLoadError": "Jakamisen tietojen lataaminen epäonnistui. Tarkista yhteytesi ja yritä uudelleen.", - "shareHostSection": "Jaa Isäntä", - "shareWithUser": "Jaa käyttäjän kanssa", - "shareWithRole": "Jaa roolin kanssa", - "selectUser": "Valitse Käyttäjä", - "selectRole": "Valitse Rooli", - "selectUserOption": "Valitse käyttäjä...", - "selectRoleOption": "Valitse rooli...", - "permissionLevel": "Käyttöoikeuden Taso", - "expiresInHours": "Vanhenee (tunteina)", - "noExpiryPlaceholder": "Jätä tyhjäksi ei vanhene", - "shareBtn": "Jaa", - "currentAccess": "Nykyinen Käyttöoikeus", - "typeHeader": "Tyyppi", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Käyttöoikeus", - "grantedByHeader": "Myöntänyt", - "expiresHeader": "Vanhenee", - "noAccessEntries": "Ei oikeuksia vielä.", - "expiredLabel": "Vanhentunut", - "neverLabel": "Ei Koskaan", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Peruuta", - "savingBtn": "Tallennetaan...", - "updateHostBtn": "Päivitä Isäntä", - "addHostBtn": "Lisää Isäntä" + "cancelBtn": "Peruuttaa", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Hae isäntiä, komentoja tai asetuksia...", - "quickActions": "Nopeat Toiminnot", - "hostManager": "Isäntälaitteen Hallinta", - "hostManagerDesc": "Hallitse tai lisää tai muokkaa isäntiä", - "addNewHost": "Lisää Uusi Isäntä", - "addNewHostDesc": "Rekisteröi uusi isäntä", - "adminSettings": "Ylläpitäjän Asetukset", - "adminSettingsDesc": "Määritä järjestelmän asetukset ja käyttäjät", - "userProfile": "Käyttäjän Profiili", - "userProfileDesc": "Hallitse tiliäsi ja asetuksiasi", - "addCredential": "Lisää Käyttöoikeustieto", - "addCredentialDesc": "Tallenna SSH näppäimet tai salasanat", - "recentActivity": "Viimeaikainen Toiminta", - "serversAndHosts": "Palvelimet Ja Palvelimet", - "noHostsFound": "Vastaavia palvelimia ei löytynyt \"{{search}}\"", - "links": "Linkit", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Valitse", - "toggleWith": "Vaihda käyttäen" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Yhtään välilehteä ei määritetty", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktiivinen ruutu" }, "connections": { "noConnections": "Ei yhteyksiä", "noConnectionsDesc": "Avaa pääte, tiedostonhallinta tai etätyöpöytä nähdäksesi yhteydet täällä", - "connectedFor": "Yhdistetty kohteeseen {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Yhdistetty", "disconnected": "Yhteys katkennut", "closeTab": "Sulje välilehti", "closeConnection": "Sulje yhteys", "forgetTab": "Unohtaa", "removeBackground": "Poistaa", - "reconnect": "Yhdistä uudelleen", + "reconnect": "Reconnect", "reopenTab": "Avaa uudelleen", "sectionOpen": "Avata", "sectionBackground": "Tausta", "backgroundDesc": "Istunto jatkuu 30 minuuttia yhteyden katkaisemisen jälkeen, ja se voidaan yhdistää uudelleen.", "persisted": "Jatkui taustalla", - "expiresIn": "Vanhenee {{duration}} kuluttua", + "expiresIn": "Expires in {{duration}}", "search": "Hae yhteyksiä...", - "noSearchResults": "Ei hakuasi vastaavia yhteyksiä" + "noSearchResults": "Ei hakuasi vastaavia yhteyksiä", + "rename": "Rename session" }, "guacamole": { - "connecting": "Yhdistetään {{type}} istuntoon...", - "connectionError": "Virhe yhteydenpidossa", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Yhteys epäonnistui", - "failedToConnect": "Yhteyden tunnuksen haku epäonnistui", - "hostNotFound": "Palvelinta ei löydy", - "noHostSelected": "Ei isäntää valittuna", - "reconnect": "Yhdistä Uudelleen", - "retry": "Yritä Uudelleen", - "guacdUnavailable": "Etätyöpöytäpalvelu (guacd) ei ole käytettävissä. Varmista, että guacd on käynnissä ja käytettävissä ja että se on määritetty asianmukaisesti järjestelmänvalvojan asetuksissa.", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Yritä uudelleen", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Lukitusnäyttö)", - "winKey": "Ikkunan Avain", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Vaihto", - "win": "Voita", - "stickyActive": "{{key}} (pakattu - napsauta vapauttaaksesi)", - "stickyInactive": "{{key}} (napauta latch)", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Escape", "tab": "Tab", - "home": "Koti", - "end": "Loppu", - "pageUp": "Sivu Ylös", - "pageDown": "Sivu Alas", - "arrowUp": "Nuoli Ylös", - "arrowDown": "Nuoli Alas", - "arrowLeft": "Nuoli Vasemmalle", - "arrowRight": "Nuoli Oikealle", - "fnToggle": "Funktion Avaimet", - "reconnect": "Yhdistä Istunto Uudelleen", - "collapse": "Tiivistä työkalupalkki", - "expand": "Laajenna työkalupalkki", - "dragHandle": "Vedä uudelleensijoittaaksesi" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Yhdistä palvelimeen", - "clear": "Tyhjennä", - "paste": "Liitä", - "reconnect": "Yhdistä Uudelleen", - "connectionLost": "Yhteys katkesi", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", + "connectionLost": "Connection lost", "connected": "Yhdistetty", - "clipboardWriteFailed": "Kopiointi leikepöydälle epäonnistui. Varmista, että sivu on tarjolla HTTPS:n tai localhostin kautta.", - "clipboardReadFailed": "Leikepöydältä ei voitu lukea. Varmista, että leikepöydän oikeudet on myönnetty.", - "clipboardHttpWarning": "Liitä vaatii HTTPS. Käytä Ctrl+Shift+V tai tarjoile Termix HTTPS:n päällä.", - "unknownError": "Tuntematon virhe tapahtui", - "websocketError": "WebSocketin yhteysvirhe", - "connecting": "Yhdistetään...", - "noHostSelected": "Ei isäntää valittuna", - "reconnecting": "Yhdistetään Uudelleen... ({{attempt}}/{{max}})", - "reconnected": "Yhdistetty uudelleen onnistuneesti", - "tmuxSessionCreated": "tmux-istunto luotu: {{name}}", - "tmuxSessionAttached": "tmux-istunto liitteenä: {{name}}", - "tmuxUnavailable": "tmuxia ei ole asennettu kaukosäätimessä olevaan isäntään, joka palautuu vakiomuotoiseen komentotulkkiin", - "tmuxSessionPickerTitle": "tmux-istunnot", - "tmuxSessionPickerDesc": "Olemassa olevat tmux-istunnot löytyvät tästä isännästä. Valitse istunto, joka liitetään uudelleen tai luodaan uusi istunto.", - "tmuxWindows": "Ikkunat", - "tmuxWindowCount": "{{count}} ikkuna", - "tmuxAttached": "Liitetyt asiakkaat", - "tmuxAttachedCount": "{{count}} liitetty", - "tmuxLastActivity": "Viimeisin toiminta", - "tmuxTimeJustNow": "juuri nyt", - "tmuxTimeMinutes": "{{count}}m sitten", - "tmuxTimeHours": "{{count}}tuntia sitten", - "tmuxTimeDays": "{{count}}pv sitten", - "tmuxCreateNew": "Aloita uusi istunto", - "tmuxCopyHint": "Säädä valintaa ja paina Enter kopioidaksesi leikepöydälle", - "tmuxDetach": "Irrota tmux-istunnosta", - "tmuxDetached": "Irrotettu tmux-istunnosta", - "maxReconnectAttemptsReached": "Suurin uudelleenyhdistämisyritys saavutettu", - "closeTab": "Sulje", - "connectionTimeout": "Yhteyden aikakatkaisu", - "terminalTitle": "Pääte - {{host}}", - "terminalWithPath": "Pääte - {{host}}:{{path}}", - "runTitle": "Juoksemassa {{command}} - {{host}}", - "totpRequired": "Kaksivaiheinen Todennus Vaaditaan", - "totpCodeLabel": "Vahvistuskoodi", - "totpVerify": "Vahvista", - "warpgateAuthRequired": "Varmennus Vaaditaan", - "warpgateSecurityKey": "Turvallisuus Avain", - "warpgateAuthUrl": "Todennuksen URL", - "warpgateOpenBrowser": "Avaa selaimessa", - "warpgateContinue": "Olen Suorittanut Todentamisen", - "opksshAuthRequired": "OPKSSH Todennus Vaaditaan", - "opksshAuthDescription": "Lopeta todennus selaimessasi jatkaaksesi. Tämä istunto pysyy voimassa 24 tuntia.", - "opksshOpenBrowser": "Avaa selain todennettavaksi", - "opksshWaitingForAuth": "Odotetaan todennusta selaimessa...", - "opksshAuthenticating": "Käsitellään todennusta...", - "opksshTimeout": "Todennus aikakatkaistiin. Yritä uudelleen.", - "opksshAuthFailed": "Todennus epäonnistui. Tarkista käyttäjätunnuksesi ja yritä uudelleen.", - "opksshSignInWith": "Kirjaudu sisään {{provider}} avulla", - "sudoPasswordPopupTitle": "Lisää Salasana?", - "websocketAbnormalClose": "Yhteys suljettiin odottamattomasti. Tämä saattaa johtua käänteisestä välityspalvelusta tai SSL-asetuksista. Tarkista palvelimen lokit.", - "connectionLogTitle": "Yhteyden Loki", - "connectionLogCopy": "Kopioi lokit leikepöydälle", - "connectionLogEmpty": "Ei vielä yhteyslokeja", - "connectionLogWaiting": "Odotetaan yhteyslokeja...", - "connectionLogCopied": "Yhteyden lokit kopioitu leikepöydälle", - "connectionLogCopyFailed": "Lokien kopiointi leikepöydälle epäonnistui", - "connectionRejected": "Palvelin hylkäsi yhteyden. Tarkista todennus ja verkon asetukset.", - "hostKeyRejected": "SSH isäntäavaimen vahvistus hylätty. Yhteys peruutettu.", - "sessionTakenOver": "Istunto avattiin toisessa välilehdessä. Yhdistetään uudelleen..." + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Avata", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Jaettu välilehti", + "addToSplit": "Lisää Splitiin", + "removeFromSplit": "Poista jaosta" + } }, "fileManager": { - "noHostSelected": "Ei isäntää valittuna", - "initializingEditor": "Alustetaan editoriaa...", - "file": "Tiedosto", - "folder": "Kansio", - "uploadFile": "Lataa Tiedosto", - "downloadFile": "Lataa", - "extractArchive": "Pura Arkisto", - "extractingArchive": "Puretaan {{name}}...", - "archiveExtractedSuccessfully": "{{name}} purettu onnistuneesti", - "extractFailed": "Poisto epäonnistui", - "compressFile": "Pakkaa Tiedosto", - "compressFiles": "Pakkaa Tiedostoja", - "compressFilesDesc": "Pakkaa {{count}} kohdetta arkistoon", - "archiveName": "Arkiston Nimi", - "enterArchiveName": "Kirjoita arkiston nimi...", - "compressionFormat": "Pakkausmuoto", - "selectedFiles": "Valitut tiedostot", - "andMoreFiles": "ja {{count}} lisää...", - "compress": "Pakkaa", - "compressingFiles": "Pakkaamalla {{count}} alkiota {{name}}...", - "filesCompressedSuccessfully": "{{name}} luotu onnistuneesti", - "compressFailed": "Pakkaus epäonnistui", - "edit": "Muokkaa", - "preview": "Esikatselu", - "previous": "Edellinen", - "next": "Seuraava", - "pageXOfY": "Sivu {{current}} / {{total}}", - "zoomOut": "Zoomaa Ulos", - "zoomIn": "Zoomaa Sisään", - "newFile": "Uusi Tiedosto", - "newFolder": "Uusi Kansio", - "rename": "Uudelleennimeä", - "uploading": "Lähetetään...", - "uploadingFile": "Ladataan {{name}}...", - "fileName": "Tiedoston Nimi", - "folderName": "Kansion Nimi", - "fileUploadedSuccessfully": "Tiedosto \"{{name}}\" ladattu onnistuneesti", - "failedToUploadFile": "Tiedoston lataaminen epäonnistui", - "fileDownloadedSuccessfully": "Tiedosto \"{{name}}\" ladattu onnistuneesti", - "failedToDownloadFile": "Tiedoston lataaminen epäonnistui", - "fileCreatedSuccessfully": "Tiedosto \"{{name}}\" luotu onnistuneesti", - "folderCreatedSuccessfully": "Kansio \"{{name}}\" luotu onnistuneesti", - "failedToCreateItem": "Kohteen luominen epäonnistui", - "operationFailed": "{{operation}} toiminto epäonnistui kohteelle {{name}}: {{error}}", - "failedToResolveSymlink": "Symlinkin poistaminen epäonnistui", - "itemsDeletedSuccessfully": "{{count}} kohdetta poistettu onnistuneesti", - "failedToDeleteItems": "Kohteiden poistaminen epäonnistui", - "sudoPasswordRequired": "Ylläpitäjän Salasana Vaaditaan", - "enterSudoPassword": "Syötä sudo salasana jatkaaksesi tätä toimintoa", - "sudoPassword": "Sudo salasana", - "sudoOperationFailed": "Sudo toiminto epäonnistui", - "sudoAuthFailed": "Sudo todennus epäonnistui", - "dragFilesToUpload": "Pudota tiedostot tähän ladataksesi", - "emptyFolder": "Tämä kansio on tyhjä", - "searchFiles": "Etsi tiedostoja...", - "upload": "Lähetä", - "selectHostToStart": "Valitse isäntä aloittaaksesi tiedostonhallinnan", - "sshRequiredForFileManager": "Tiedostonhallinta vaatii SSH:n. Tässä palvelimessa ei ole SSH käytössä.", - "failedToConnect": "Yhteyden muodostaminen SSH:ään epäonnistui", - "failedToLoadDirectory": "Hakemiston lataaminen epäonnistui", - "noSSHConnection": "SSH yhteyttä ei saatavilla", - "copy": "Kopioi", - "cut": "Leikkaa", - "paste": "Liitä", - "copyPath": "Kopioi Polku", - "copyPaths": "Kopioi Polut", - "delete": "Poista", - "properties": "Ominaisuudet", - "refresh": "Päivitä", - "downloadFiles": "Lataa {{count}} tiedostoa selaimelle", - "copyFiles": "Kopioi {{count}} kohdetta", - "cutFiles": "Leikkaa {{count}} kohdetta", - "deleteFiles": "Poista {{count}} kohdetta", - "filesCopiedToClipboard": "{{count}} kohdetta kopioitu leikepöydälle", - "filesCutToClipboard": "{{count}} kohdetta leikattu leikepöydälle", - "pathCopiedToClipboard": "Polku kopioitu leikepöydälle", - "pathsCopiedToClipboard": "{{count}} polkua kopioitu leikepöydälle", - "failedToCopyPath": "Polun kopiointi leikepöydälle epäonnistui", - "movedItems": "Siirretty {{count}} kohdetta", - "failedToDeleteItem": "Kohteen poistaminen epäonnistui", - "itemRenamedSuccessfully": "{{type}} uudelleennimetty onnistuneesti", - "failedToRenameItem": "Kohteen nimeäminen uudelleen epäonnistui", - "download": "Lataa", - "permissions": "Käyttöoikeudet", - "size": "Koko", - "modified": "Muokattu", - "path": "Polku", - "confirmDelete": "Oletko varma, että haluat poistaa {{name}}?", - "permissionDenied": "Lupa evätty", - "serverError": "Palvelin Virhe", - "fileSavedSuccessfully": "Tiedosto tallennettu onnistuneesti", - "failedToSaveFile": "Tiedoston tallennus epäonnistui", - "confirmDeleteSingleItem": "Oletko varma, että haluat poistaa pysyvästi \"{{name}}\"?", - "confirmDeleteMultipleItems": "Oletko varma, että haluat pysyvästi poistaa {{count}} kohteita?", - "confirmDeleteMultipleItemsWithFolders": "Oletko varma, että haluat poistaa pysyvästi {{count}} kohteita? Tämä sisältää kansiot ja niiden sisällön.", - "confirmDeleteFolder": "Oletko varma, että haluat pysyvästi poistaa kansion \"{{name}}\" ja kaiken sen sisällön?", - "permanentDeleteWarning": "Tätä toimintoa ei voi peruuttaa. Nimike (kohteet) poistetaan pysyvästi palvelimelta.", - "recent": "Viimeisimmät", - "pinned": "Kiinnitetty", - "folderShortcuts": "Kansion Pikanäppäimet", - "failedToReconnectSSH": "SSH istunnon yhdistäminen uudelleen epäonnistui", - "openTerminalHere": "Avaa Pääte Tähän", - "run": "Suorita", - "openTerminalInFolder": "Avaa pääte tässä kansiossa", - "openTerminalInFileLocation": "Avaa pääte tiedoston sijainnissa", - "runningFile": "Käynnissä - {{file}}", - "onlyRunExecutableFiles": "Voi suorittaa vain suoritettavia tiedostoja", - "directories": "Hakemistot", - "removedFromRecentFiles": "Poistettu \"{{name}}\" viimeisimmistä tiedostoista", - "removeFailed": "Poistaminen epäonnistui", - "unpinnedSuccessfully": "Unpeed \"{{name}}\" onnistui", - "unpinFailed": "Kiinnityksen poisto epäonnistui", - "removedShortcut": "Poistettu pikakuvake \"{{name}}\"", - "removeShortcutFailed": "Pikakuvakkeen poisto epäonnistui", - "clearedAllRecentFiles": "Tyhjennetty kaikki viimeaikaiset tiedostot", - "clearFailed": "Tyhjennys epäonnistui", - "removeFromRecentFiles": "Poista viimeaikaisista tiedostoista", - "clearAllRecentFiles": "Tyhjennä kaikki viimeaikaiset tiedostot", - "unpinFile": "Irroita tiedosto", - "removeShortcut": "Poista pikakuvake", - "pinFile": "Kiinnitä tiedosto", - "addToShortcuts": "Lisää pikakuvakkeisiin", - "pasteFailed": "Liitä epäonnistui", - "noUndoableActions": "Ei kelpaamattomia toimintoja", - "undoCopySuccess": "Päivitetty kopiointitoiminto: Poistettu {{count}} kopioitu tiedosto", - "undoCopyFailedDelete": "Peruminen epäonnistui: Ei voitu poistaa kopioitavia tiedostoja", - "undoCopyFailedNoInfo": "Peruminen epäonnistui: Kopioituja tiedostotietoja ei löytynyt", - "undoMoveSuccess": "Peruttu toiminto: Siirretty {{count}} tiedostoa takaisin alkuperäiseen sijaintiin", - "undoMoveFailedMove": "Peruminen epäonnistui: Ei voitu siirtää yhtään tiedostoa takaisin", - "undoMoveFailedNoInfo": "Peruminen epäonnistui: Siirretyn tiedoston tietoja ei löytynyt", - "undoDeleteNotSupported": "Poistotoimintoa ei voi peruuttaa: Tiedostot on poistettu pysyvästi palvelimelta", - "undoTypeNotSupported": "Kumoa toimintotyyppi ei tueta", - "undoOperationFailed": "Toiminnon peruminen epäonnistui", - "unknownError": "Tuntematon virhe", - "confirm": "Vahvista", - "find": "Etsi...", - "replace": "Korvaa", - "downloadInstead": "Lataa Sen sijaan", - "keyboardShortcuts": "Näppäimistön Pikanäppäimet", - "searchAndReplace": "Etsi Ja Korvaa", - "editing": "Muokataan", - "search": "Etsi", - "findNext": "Etsi Seuraava", - "findPrevious": "Etsi Edellinen", - "save": "Tallenna", - "selectAll": "Valitse Kaikki", - "undo": "Kumoa", - "redo": "Toista", - "moveLineUp": "Siirrä Rivi Ylös", - "moveLineDown": "Siirrä Rivi Alas", - "toggleComment": "Vaihda Kommentin Tilaa", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Juokse", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Kuvan lataaminen epäonnistui", - "startTyping": "Aloita kirjoittaminen...", - "unknownSize": "Tuntematon koko", - "fileIsEmpty": "Tiedosto on tyhjä", - "largeFileWarning": "Suuri Tiedostojen Varoitus", - "largeFileWarningDesc": "Tämä tiedosto on kooltaan {{size}} ja se voi aiheuttaa suoritusongelmia kun se avataan tekstinä.", - "fileNotFoundAndRemoved": "Tiedostoa \"{{name}}\" ei löydy ja se on poistettu viimeisimmistä / pinned tiedostoista", - "failedToLoadFile": "Tiedoston lataaminen epäonnistui: {{error}}", - "serverErrorOccurred": "Palvelinvirhe tapahtui. Yritä myöhemmin uudelleen.", - "autoSaveFailed": "Automaattitallennus epäonnistui", - "fileAutoSaved": "Tiedosto tallennettu automaattisesti", - "moveFileFailed": "{{name}} siirtäminen epäonnistui", - "moveOperationFailed": "Toiminnon siirtäminen epäonnistui", - "canOnlyCompareFiles": "Voi vain verrata kahta tiedostoa", - "comparingFiles": "Tiedostojen vertailu: {{file1}} ja {{file2}}", - "dragFailed": "Vedä toiminto epäonnistui", - "filePinnedSuccessfully": "Tiedosto \"{{name}}\" kiinnitetty onnistuneesti", - "pinFileFailed": "Tiedoston kiinnitys epäonnistui", - "fileUnpinnedSuccessfully": "Tiedosto \"{{name}}\" kiinnitetty onnistuneesti", - "unpinFileFailed": "Tiedoston kiinnitys epäonnistui", - "shortcutAddedSuccessfully": "Pikakuvake kansiossa \"{{name}}\" lisätty onnistuneesti", - "addShortcutFailed": "Pikakuvakkeen lisääminen epäonnistui", - "operationCompletedSuccessfully": "{{operation}} {{count}} kohteita onnistuneesti", - "operationCompleted": "{{operation}} {{count}} kohdetta", - "downloadFileSuccess": "Tiedosto {{name}} ladattu onnistuneesti", - "downloadFileFailed": "Lataus epäonnistui", - "moveTo": "Siirrä {{name}}", - "diffCompareWith": "Vertaa {{name}} versioon", - "dragOutsideToDownload": "Lataa vedä ikkunan ulkopuolelle ({{count}} tiedostoa)", - "newFolderDefault": "Uusi Kansio", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "{{count}} kohdetta siirretty onnistuneesti kohteeseen {{target}}", - "move": "Siirrä", - "searchInFile": "Etsi tiedostosta (Ctrl+F)", - "showKeyboardShortcuts": "Näytä pikakuvakkeet", - "startWritingMarkdown": "Aloita markdown sisällön kirjoittaminen...", - "loadingFileComparison": "Ladataan tiedoston vertailua...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Vertaa", - "sideBySide": "Sivu sivulta", + "compare": "Compare", + "sideBySide": "Side by Side", "inline": "Inline", - "fileComparison": "Tiedostovertailu: {{file1}} vs. {{file2}}", - "fileTooLarge": "Tiedosto liian suuri: {{error}}", - "sshConnectionFailed": "SSH-yhteys epäonnistui. Tarkista yhteytesi kohteeseen {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Tiedoston lataaminen epäonnistui: {{error}}", - "connecting": "Yhdistetään...", - "connectedSuccessfully": "Yhdistetty onnistuneesti", - "totpVerificationFailed": "TOTP vahvistus epäonnistui", - "warpgateVerificationFailed": "Varmennuksen varmennus epäonnistui", - "authenticationFailed": "Todennus epäonnistui", - "verificationCodePrompt": "Vahvistuskoodi:", - "changePermissions": "Muuta Käyttöoikeuksia", - "currentPermissions": "Nykyiset Käyttöoikeudet", - "owner": "Omistaja", - "group": "Ryhmä", - "others": "Muut", - "read": "Lue", - "write": "Kirjoita", - "execute": "Suorita", - "permissionsChangedSuccessfully": "Oikeuksien vaihto onnistui", - "failedToChangePermissions": "Käyttöoikeuksien muuttaminen epäonnistui", - "name": "Nimi", - "sortByName": "Nimi", - "sortByDate": "Muokkaus Päivämäärä", - "sortBySize": "Koko", - "ascending": "Nouseva", - "descending": "Laskeva", - "root": "Juuri", - "new": "Uusi", - "sortBy": "Järjestä Mukaan", - "items": "Kohteet", - "selected": "Valittu", - "editor": "Muokkain", - "octal": "Oktaali", - "storage": "Tallennustila", - "disk": "Levy", - "used": "Käytetty", - "of": "jostakin", - "toggleSidebar": "Vaihda Sivupalkkia", - "cannotLoadPdf": "Ei voi ladata PDF:ää", - "pdfLoadError": "Tämän PDF-tiedoston lataamisessa tapahtui virhe.", - "loadingPdf": "Ladataan PDF...", - "loadingPage": "Ladataan sivua..." + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopioi isäntäkoneeseen…", - "moveToHost": "Siirrä isäntäkoneeseen…", - "copyItemsToHost": "Kopioi {{count}} kohdetta isäntään…", - "moveItemsToHost": "Siirrä {{count}} kohdetta isäntään…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Muita tiedostonhallintaohjelmia ei ole saatavilla.", "noHostsConnectedHint": "Lisää toinen SSH-isäntä, jonka tiedostonhallinta on käytössä isäntähallinnassa.", "selectDestinationHost": "Valitse kohdeisäntä", @@ -1162,50 +1358,50 @@ "expandRecentDestinations": "Laajenna viimeisimmät kohteet", "browseFolders": "Selaa kohdekansioita", "browseDestination": "Selaa tai anna polku", - "confirmCopy": "Kopioida", - "confirmMove": "Liikkua", - "transferring": "Siirretään…", - "compressing": "Pakkaamalla…", - "extracting": "Poimitaan…", - "transferringItems": "Siirretään {{current}} / {{total}} kohdetta…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Siirto valmis", "transferError": "Siirto epäonnistui", - "transferPartial": "Siirto suoritettu, mutta virheitä on {{count}}", - "transferPartialHint": "Siirto epäonnistui: {{paths}}", - "itemsSummary": "{{count}} kohdetta", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Määränpään on oltava hakemisto useiden kohteiden siirtoja varten", "selectThisFolder": "Valitse tämä kansio", "browsePathWillBeCreated": "Tätä kansiota ei ole vielä olemassa. Se luodaan, kun siirto alkaa.", "browsePathError": "Tätä polkua ei voitu avata kohdepalvelimella.", "goUp": "Mene ylös", - "copyFolderToHost": "Kopioi kansio isäntään…", - "moveFolderToHost": "Siirrä kansio isäntään…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Valmis", - "hostConnecting": "Yhdistetään…", - "hostDisconnected": "Ei yhdistetty", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Todennus vaaditaan — avaa ensin tiedostonhallinta tällä isännöintikoneella", "hostConnectionFailed": "Yhteys epäonnistui", "metricsTitle": "Siirtoajat", - "metricsPrepare": "Valmistele kohde: {{duration}}", - "metricsCompress": "Pakkaa lähdekoodissa: {{duration}}", - "metricsHopSourceRead": "Lähde → palvelin: {{throughput}}", - "metricsHopDestSftpWrite": "Palvelin → kohde (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Palvelin → kohde (paikallinen): {{throughput}}", - "metricsTransfer": "Päästä päähän: {{throughput}} ({{duration}})", - "metricsExtract": "Ote määränpäässä: {{duration}}", - "metricsSourceDelete": "Poista lähteestä: {{duration}}", - "metricsTotal": "Yhteensä: {{duration}}", - "progressCompressing": "Pakkaus lähdepalvelimella…", - "progressExtracting": "Puretaan kohteessa…", - "progressTransferring": "Tiedon siirtäminen…", - "progressReconnecting": "Yhdistetään uudelleen…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Rinnakkaiset siirtokaistat", - "parallelSegmentsOption": "{{count}} kaistaa", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Suuret tiedostot jaetaan 256 Mt:n osiin. Useat kaistat käyttävät erillisiä yhteyksiä (kuten useiden siirtojen aloittaminen) suuremman kokonaisläpivirtauksen saavuttamiseksi.", - "progressTotalSpeed": "{{speed}} yhteensä ({{lanes}} kaistaa)", - "progressTransferringItems": "Tiedostojen siirtäminen ({{current}} / {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} tiedostoa", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Lähdetiedostot säilytetään (osittainen siirto)", "jumpHostLimitation": "Molempien isäntien on oltava tavoitettavissa Termix-palvelimelta. Suoraa isäntien välistä reititystä ei tueta.", "cancel": "Peruuttaa", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Valitsee tar- tai tiedostokohtaisen SFTP:n tiedostomäärän, koon ja pakkautuvuuden perusteella. Yksittäiset tiedostot käyttävät aina suoratoistettavaa SFTP:tä.", "methodTarHint": "Pakkaa lähdekoodissa, siirrä yksi arkisto, pura kohdetiedostossa. Vaatii tar-tiedoston molemmissa Unix-koneissa.", "methodItemSftpHint": "Siirrä jokainen tiedosto erikseen SFTP:n kautta. Toimii kaikilla isännöintijärjestelmillä, mukaan lukien Windows.", - "methodPreviewLoading": "Siirtomenetelmän laskeminen…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Siirtomenetelmän esikatselu ei onnistunut. Palvelin valitsee silti menetelmän käynnistyksen yhteydessä.", "methodPreviewWillUseTar": "Käytetään: Tar-arkistoa", "methodPreviewWillUseItemSftp": "Käytetään: Tiedostokohtaista SFTP:tä", - "methodPreviewScanSummary": "{{fileCount}} tiedostoa, {{totalSize}} yhteensä (skannattu lähdepalvelimella).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Jokainen tiedosto käyttää samaa SFTP-tietovirtaa kuin yksittäiset tiedostokopiot, yksi kerrallaan. Edistyminen yhdistetään kaikkien tiedostojen välillä, joten palkki liikkuu hitaasti suurten tiedostojen käsittelyssä.", "methodReason": { "user_item_sftp": "Valitsit tiedostokohtaisen SFTP:n.", "user_tar": "Valitsit tar-arkiston.", "tar_unavailable": "Tar ei ole käytettävissä yhdellä tai molemmilla isännillä — sen sijaan käytetään tiedostokohtaista SFTP:tä.", "windows_host": "Windows-isäntä on mukana – tar-tiedostoa ei käytetä.", - "auto_multi_large": "Automaattinen: useita tiedostoja, mukaan lukien suuri tiedosto ({{largestSize}}), jossa on pakattavaa dataa — tar niputtaa yhdeksi siirroksi.", - "auto_single_large_in_archive": "Automaattinen: yksi suuri tiedosto ({{largestSize}}) tässä joukossa — tiedostokohtainen SFTP.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automaattinen: enimmäkseen pakkaamatonta dataa — tiedostokohtainen SFTP.", - "auto_many_files": "Automaattinen: monta tiedostoa ({{fileCount}}) — tar vähentää tiedostokohtaista laskentatehoa.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automaattinen: tiedostokohtainen SFTP tälle joukolle." }, "progressCancel": "Peruuttaa", - "progressCancelling": "Peruutetaan…", + "progressCancelling": "Cancelling…", "progressStalled": "Pysähtynyt", "resumedHint": "Yhdistetty uudelleen toisessa ikkunassa aloitettuun aktiiviseen siirtoon.", "transferCancelled": "Siirto peruttu", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Kohteessa säilytettiin vain osa tiedoista. Uudelleenyritys jatkuu, kun yhteys on palannut." }, "tunnels": { - "noSshTunnels": "Ei SSH Tunneleita", - "createFirstTunnelMessage": "Et ole vielä luonut yhtään SSH tunnelia. Määritä tunneliyhteyksiä isäntäpäällikössä aloittaaksesi tämän.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Yhdistetty", - "disconnected": "Yhteys Katkaistu", - "connecting": "Yhdistetään...", - "error": "Virhe", - "canceling": "Peruutetaan...", - "connect": "Yhdistä", - "disconnect": "Katkaise", - "cancel": "Peruuta", - "port": "Portti", - "localPort": "Paikallinen Portti", - "remotePort": "Etäportti", - "currentHostPort": "Nykyinen Isäntäportti", - "endpointPort": "Päätepisteen Portti", - "bindIp": "Paikallinen IP-osoite", - "endpointSshConfig": "Päätepisteen Ssh Asetukset", - "endpointSshHost": "Päätepiste SSH Isäntä", - "endpointSshHostPlaceholder": "Valitse määritetty isäntä", - "endpointSshHostRequired": "Valitse päätepiste SSH isäntä jokaiselle asiakkaan tunneli.", - "attempt": "Yritys {{current}} / {{max}}", - "nextRetryIn": "Seuraava retry {{seconds}} sekunnissa", - "clientTunnels": "Asiakkaan Tunnelit", - "clientTunnel": "Asiakkaan Tunneli", - "addClientTunnel": "Lisää Asiakastunneli", - "noClientTunnels": "Tällä työpöydällä ei ole määritettyjä asiakastunneleita.", - "tunnelName": "Tunnelin Nimi", - "remoteHost": "Etäpalvelin", - "autoStart": "Automaattinen Käynnistys", - "clientAutoStartDesc": "Aloittaa kun työpöytäohjelma avautuu ja pysyy kytkettynä.", - "clientManualStartDesc": "Käytä Käynnistä ja lopeta tämä rivi. Termix ei avaa sitä automaattisesti.", - "clientRemoteServerNote": "Etäsiirto saattaa vaatia AllowTcpForwarding ja GatewayPorts päätepisteessä SSH-palvelimella. Etäsiirros sulkeutuu kun työpöytä irrotetaan.", - "clientTunnelStarted": "Asiakkaan tunneli aloitettu", - "clientTunnelStopped": "Asiakkaan tunneli pysäytetty", - "tunnelTestSucceeded": "Tunnelin testi onnistui", - "tunnelTestFailed": "Tunnelitesti epäonnistui", - "localSaved": "Asiakastunnelit tallennettu", - "localSaveError": "Paikallisten asiakastunneleiden tallennus epäonnistui", - "invalidBindIp": "Paikallisen IP-osoitteen on oltava kelvollinen IPv4-osoite.", - "invalidLocalTargetIp": "Paikallisen kohteen IP-osoitteen on oltava kelvollinen IPv4-osoite.", - "invalidLocalPort": "Paikallinen satama on oltava välillä 1 ja 65535.", - "invalidRemotePort": "Etäportin on oltava välillä 1 ja 65535.", - "invalidLocalTargetPort": "Paikallisen tavoiteportin on oltava välillä 1–65535.", - "invalidEndpointPort": "Päätesataman on oltava välillä 1–65535.", - "duplicateAutoStartBind": "Vain yksi automaattinen käynnistys -asiakastunneli voi käyttää {{bind}} -tunnusta.", - "manualControlError": "Tunnelin tilan päivitys epäonnistui.", - "active": "Aktiivinen", - "start": "Aloita", - "stop": "Pysäytä", - "test": "Testi", - "type": "Tunnelin Tyyppi", - "typeLocal": "Paikallinen (-L)", - "typeRemote": "Etäkäyttö (-R)", - "typeDynamic": "Dynaaminen (-D)", - "typeServerLocalDesc": "Nykyinen isäntä päätepisteeseen.", - "typeServerRemoteDesc": "Päätä piste takaisin nykyiseen isäntään.", - "typeClientLocalDesc": "Paikallinen tietokone tutkittavaksi.", - "typeClientRemoteDesc": "Endpoint takaisin paikalliseen tietokoneeseen.", - "typeClientDynamicDesc": "SOCKS paikallisella tietokoneella.", - "typeDynamicDesc": "Siirrä SOCKS5 CONNECT liikennettä SSH:n kautta", - "forwardDescriptionServerLocal": "Nykyinen isäntä {{sourcePort}} → päätepiste {{endpointPort}}.", - "forwardDescriptionServerRemote": "Päätepiste {{endpointPort}} → nykyinen isäntä {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS nykyisellä koneella {{sourcePort}}.", - "forwardDescriptionClientLocal": "Paikallinen {{sourcePort}} → etäinen {{endpointPort}}.", - "forwardDescriptionClientRemote": "Etäinen {{sourcePort}} → paikallinen {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS paikallisessa portissa {{sourcePort}}.", + "disconnected": "Yhteys katkennut", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Peruuttaa", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SUKAT {{endpoint}} kautta", - "autoNameClientLocal": "Paikallinen {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → paikallinen {{localPort}}", - "autoNameClientDynamic": "SUKAT {{localPort}} kautta {{endpoint}}", - "route": "Reitti:", - "lastStarted": "Viimeksi aloitettu", - "lastTested": "Viimeksi testattu", - "lastError": "Viimeisin virhe", - "maxRetries": "Maksimi Uudelleen", - "maxRetriesDescription": "Enimmäismäärä uudelleen kokeilevia yrityksiä.", - "retryInterval": "Uudelleen Aikaväli (Sekuntia)", - "retryIntervalDescription": "Aika odottaa yritysten uudelleenkokeilun välillä.", - "local": "Paikallinen", - "remote": "Etä", - "destination": "Kohde", - "host": "Isäntä", - "mode": "Tila", - "noHostSelected": "Ei isäntää valittuna", - "working": "Työskennellään..." + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "Suoritin", - "memory": "Muisti", - "disk": "Levy", - "network": "Verkko", - "uptime": "Käyttöaika", - "processes": "Prosessit", - "available": "Saatavilla", - "free": "Ilmainen", - "connecting": "Yhdistetään...", - "connectionFailed": "Yhteyden muodostaminen palvelimeen epäonnistui", - "naCpus": "N/A CPU", - "cpuCores_one": "{{count}} Ydin", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Suorittimen Käyttö", - "memoryUsage": "Muistin Käyttö", - "diskUsage": "Levyn Käyttö", - "failedToFetchHostConfig": "Palvelimen asetusten noutaminen epäonnistui", - "serverOffline": "Palvelin Offline-tilassa", - "cannotFetchMetrics": "Mittareita ei voi hakea offline-palvelimelta", - "totpFailed": "TOTP vahvistus epäonnistui", - "noneAuthNotSupported": "Palvelimen tilastot eivät tue 'ei mitään' todennusta.", - "load": "Lataa", - "systemInfo": "Järjestelmän Tiedot", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Käyttöjärjestelmä", - "kernel": "Ydin", - "seconds": "sekuntia", - "networkInterfaces": "Verkon Liitännät", - "noInterfacesFound": "Verkkoliittymiä ei löytynyt", - "noProcessesFound": "Prosesseja ei löytynyt", - "loginStats": "Ssh Kirjautumistilastot", - "noRecentLoginData": "Ei viimeaikaisia kirjautumistietoja", - "executingQuickAction": "Suoritetaan {{name}}...", - "quickActionSuccess": "{{name}} suoritettu onnistuneesti", - "quickActionFailed": "{{name}} epäonnistui", - "quickActionError": "{{name}} suoritus epäonnistui", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Kuunnellaan Satamia", - "protocol": "Protocol", - "port": "Portti", - "address": "Osoite", - "process": "Prosessi", - "noData": "Ei kuunnella porttien tietoja" + "title": "Listening Ports", + "protocol": "Protokolla", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Palomuuri", - "inactive": "Passiivinen", - "policy": "Politiikka", - "rules": "säännöt", - "noData": "Palomuurin tietoja ei ole saatavilla", - "action": "Toiminto", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Portti", - "source": "Lähde", - "anywhere": "Missä" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Lataa Keskim.", - "swap": "Vaihda", - "architecture": "Arkkitehtuuri", - "refresh": "Päivitä", - "retry": "Yritä Uudelleen" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Yritä uudelleen", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Juokse", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Itse isännöity SSH ja etätyöpöytähallinta", - "loginTitle": "Kirjaudu Termixiin", - "registerTitle": "Luo Tili", - "forgotPassword": "Unohditko Salasanan?", - "rememberMe": "Muista laite 30 päivän ajan (sisältää TOTP)", - "noAccount": "Eikö sinulla ole tiliä?", - "hasAccount": "Onko sinulla jo tili?", - "twoFactorAuth": "Kaksivaiheinen Todennus", - "enterCode": "Syötä vahvistuskoodi", - "backupCode": "Tai käytä varmuuskopion koodia", - "verifyCode": "Vahvista Koodi", - "redirectingToApp": "Uudelleenohjataan sovellukseen...", - "sshAuthenticationRequired": "Ssh Todennus Vaaditaan", - "sshNoKeyboardInteractive": "Näppäimistö-Interaktiivinen Todennus Ei Saatavilla", - "sshAuthenticationFailed": "Todennus Epäonnistui", - "sshAuthenticationTimeout": "Todennus Aikakatkaistiin", - "sshNoKeyboardInteractiveDescription": "Palvelin ei tue näppäimistön interaktiivista tunnistautumista. Anna salasanasi tai SSH avain.", - "sshAuthFailedDescription": "Annetut tunnukset olivat virheellisiä. Yritä uudelleen oikeilla tunnuksilla.", - "sshTimeoutDescription": "Todennusyritys aikakatkaistiin. Ole hyvä ja yritä uudelleen.", - "sshProvideCredentialsDescription": "Ole hyvä ja anna SSH käyttäjätunnuksesi yhdistääksesi tähän palvelimeen.", - "sshPasswordDescription": "Syötä tämän SSH yhteyden salasana.", - "sshKeyPasswordDescription": "Jos SSH avaimesi on salattu, kirjoita tunnuslause tähän.", - "passphraseRequired": "Tunnuslause Vaaditaan", - "passphraseRequiredDescription": "SSH avain on salattu. Ole hyvä ja kirjoita salasana avataksesi sen.", - "back": "Takaisin", - "firstUser": "Ensimmäinen Käyttäjä", - "firstUserMessage": "Olet ensimmäinen käyttäjä ja siitä tehdään ylläpitäjä. Voit tarkastella järjestelmänvalvojan asetuksia sivupalkin käyttäjän pudotusvalikossa. Jos luulet tämän olevan virhe, tarkista telakan lokit, tai luo GitHub-ongelma.", - "external": "Ulkoinen", - "loginWithExternal": "Kirjaudu ulkoiseen palveluntarjoajaan", - "loginWithExternalDesc": "Kirjaudu käyttäen määritettyä ulkoista identiteettitarjoajaa", - "externalNotSupportedInElectron": "Ulkoista todennusta ei ole vielä tuettu Electron sovelluksessa. Ole hyvä ja käytä OIDC kirjautumiseen tarkoitettua web-versiota.", - "resetPasswordButton": "Nollaa Salasana", - "sendResetCode": "Lähetä Nollauskoodi", - "resetCodeDesc": "Syötä käyttäjänimesi, jotta saat salasanan nollauskoodin. Koodi on kirjautunut telakkakontin lokeihin.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Vahvista Koodi", - "enterResetCode": "Syötä 6-numeroinen koodi telakan kontin lokeista käyttäjälle:", - "newPassword": "Uusi Salasana", - "confirmNewPassword": "Vahvista Salasana", - "enterNewPassword": "Anna käyttäjälle uusi salasana:", - "signUp": "Rekisteröidy", - "desktopApp": "Työpöytäsovellus", - "loggingInToDesktopApp": "Kirjaudutaan sisään työpöytäsovellukseen", - "loadingServer": "Ladataan palvelinta...", - "dataLossWarning": "Salasanan palauttaminen tällä tavalla poistaa kaikki tallennetut SSH palvelimet, tunnukset ja muut salatut tiedot. Tätä toimintoa ei voi peruuttaa. Käytä tätä vain, jos olet unohtanut salasanasi ja et ole kirjautunut sisään.", - "authenticationDisabled": "Tunnistautuminen Pois Käytöstä", - "authenticationDisabledDesc": "Kaikki todennusmenetelmät on tällä hetkellä poistettu käytöstä. Ota yhteyttä järjestelmänvalvojaan.", - "attemptsRemaining": "{{count}} yritystä jäljellä" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Vahvista Ssh Isäntäavain", - "keyChangedWarning": "Ssh Isäntäavain Vaihdettu", - "firstConnectionTitle": "Yhteyden muodostaminen tähän palvelimeen ensimmäistä kertaa", - "firstConnectionDescription": "Tämän isännän aitoutta ei voida vahvistaa. Varmista sormenjälki vastaa sitä, mitä odotat.", - "keyChangedDescription": "Palvelimen isäntäavain on muuttunut viimeisen yhteytesi jälkeen. Tämä saattaa merkitä tietoturvaongelmaa.", - "previousKey": "Edellinen Avain", - "newFingerprint": "Uusi Sormenjälki", - "fingerprint": "Sormenjälki", - "verifyInstructions": "Jos luotat tähän isäntään, jatka ja tallenna sormenjälki tulevia yhteyksiä varten.", - "securityWarning": "Turvallisuusvaroitus", - "acceptAndContinue": "Hyväksy & Jatka", - "acceptNewKey": "Hyväksy Uusi Avain Ja Jatka" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Tietokantaan ei saatu yhteyttä", - "unknownError": "Tuntematon virhe", - "loginFailed": "Kirjautuminen epäonnistui", - "failedPasswordReset": "Salasanan nollaamisen aloittaminen epäonnistui", - "failedVerifyCode": "Ei voitu todentaa nollakoodia", - "failedCompleteReset": "Salasanan nollaus epäonnistui", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "OIDC kirjautumisen käynnistäminen epäonnistui", - "silentSigninOidcUnavailable": "Äänetön kirjautuminen on pyydetty, mutta OIDC kirjautuminen ei ole käytettävissä.", - "failedUserInfo": "Käyttäjätietojen saaminen epäonnistui kirjautumisen jälkeen", - "oidcAuthFailed": "OIDC todennus epäonnistui", - "invalidAuthUrl": "Virheellinen varmenteen URL-osoite vastaanotettu taustaosasta", - "requiredField": "Tämä kenttä on pakollinen", - "minLength": "Minimi pituus on {{min}}", - "passwordMismatch": "Salasanat eivät täsmää", - "passwordLoginDisabled": "Käyttäjätunnus/salasanan kirjautuminen on poistettu käytöstä", - "sessionExpired": "Istunto vanhentunut - Kirjaudu sisään uudelleen", - "totpRateLimited": "Hintarajoitus: Liian monta TOTP vahvistusyritystä. Yritä myöhemmin uudelleen.", - "totpRateLimitedWithTime": "Nopeus rajoitettu: Liian monta TOTP-vahvistusyritystä. Odota {{time}} sekuntia ennen kuin yrität uudelleen.", - "resetCodeRateLimited": "Hintarajoitus: Liian monta vahvistusyritystä. Yritä myöhemmin uudelleen.", - "resetCodeRateLimitedWithTime": "Hintarajoitus: Liian monta vahvistusyritystä. Odota {{time}} sekuntia ennen kuin yrität uudelleen.", - "authTokenSaveFailed": "Todennustunnuksen tallennus epäonnistui", - "failedToLoadServer": "Palvelimen lataaminen epäonnistui" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Uuden tilin rekisteröinti on tällä hetkellä poistettu käytöstä. Kirjaudu sisään tai ota yhteyttä järjestelmänvalvojaan.", - "userNotAllowed": "Tililläsi ei ole oikeutta rekisteröityä. Ota yhteyttä järjestelmänvalvojaan.", - "databaseConnectionFailed": "Yhteyden muodostaminen tietokantapalvelimeen epäonnistui", - "resetCodeSent": "Nollaa Dockerin lokeihin lähetetty koodi", - "codeVerified": "Koodi vahvistettu onnistuneesti", - "passwordResetSuccess": "Salasanan vaihtaminen onnistui", - "loginSuccess": "Kirjautuminen onnistui", - "registrationSuccess": "Rekisteröinti onnistui" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Paikalliset työpöydän tunnelit kohdennettu määritetty SSH isännät.", - "c2sTunnelPresets": "Asiakkaan Tunnelin Esiasetukset", - "c2sTunnelPresetsDesc": "Tallenna tämä työpöytäasiakkaan paikallinen tunneliluettelo nimenä palvelimen esiasetuksena tai lataa esiasetus takaisin tähän ohjelmaan.", - "c2sTunnelPresetsUnavailable": "Asiakkaan tunnelin esiasetukset ovat käytettävissä vain työpöytäsovelluksessa.", - "c2sPresetName": "Esiasetuksen Nimi", - "c2sPresetNamePlaceholder": "Asiakkaan esiasetus nimi", - "c2sPresetToLoad": "Esiasetus Ladattavaksi", - "c2sNoPresetSelected": "Ei esiasetusta valittuna", - "c2sNoPresets": "Ei tallennettuja esiasetuksia", - "c2sLoadPreset": "Lataa", - "c2sCurrentLocalConfig": "{{count}} paikallista asiakastunnelia määritetty tällä työpöydällä.", - "c2sPresetSyncNote": "Esiasetukset ovat nimenomaisia kuvakaappauksia; lataus korvaa tämän työpöytäasiakkaan paikallisen tunneliluettelon.", - "c2sPresetSaved": "Asiakkaan tunnelin esiasetus tallennettu", - "c2sPresetLoaded": "Asiakastunnelin esiasetus ladattu paikallisesti", - "c2sPresetRenamed": "Asiakkaan tunnelin esiasetus uudelleen nimetty", - "c2sPresetDeleted": "Asiakkaan tunnelin esiasetus poistettu", - "c2sPresetLoadError": "Asiakastunnelin esiasetusten lataaminen epäonnistui" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Kieli", - "keyPassword": "avaimen salasana", - "pastePrivateKey": "Liitä yksityinen avain tähän...", - "localListenerHost": "127.0.0.1 (kuuntele paikallisesti)", - "localTargetHost": "127.0.0.1 (tämän tietokoneen tavoite)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Syötä salasanasi", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Hallintapaneeli", - "loading": "Ladataan kojelautaa...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Tuki", + "support": "Support", "discord": "Discord", - "serverOverview": "Palvelimen Yleiskatsaus", - "version": "Versio", - "upToDate": "Enintään päivämäärä", - "updateAvailable": "Päivitys Saatavilla", - "beta": "Beeta", - "uptime": "Käyttöaika", - "database": "Tietokanta", - "healthy": "Terveet", - "error": "Virhe", - "totalHosts": "Isännät Yhteensä", - "totalTunnels": "Tunnelit Yhteensä", - "totalCredentials": "Käyttäjätunnukset Yhteensä", - "recentActivity": "Viimeaikainen Toiminta", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Ladataan viimeaikaista toimintaa...", - "noRecentActivity": "Ei viimeaikaista toimintaa", - "quickActions": "Nopeat Toiminnot", - "addHost": "Lisää Isäntä", - "addCredential": "Lisää Käyttöoikeustieto", - "adminSettings": "Ylläpitäjän Asetukset", - "userProfile": "Käyttäjän Profiili", - "serverStats": "Palvelimen Tilastot", - "loadingServerStats": "Ladataan palvelimen tilastoja...", - "noServerData": "Palvelimen tietoja ei ole saatavilla", - "cpu": "Suoritin", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Muokkaa Kojelautaa", - "dashboardSettings": "Hallintapaneelin Asetukset", - "enableDisableCards": "Ota Kortit Käyttöön/Poista Käytöstä", - "resetLayout": "Palauta oletukset", - "serverOverviewCard": "Palvelimen Yleiskatsaus", - "recentActivityCard": "Viimeaikainen Toiminta", - "networkGraphCard": "Verkkokaavio", - "networkGraph": "Verkkokaavio", - "quickActionsCard": "Nopeat Toiminnot", - "serverStatsCard": "Palvelimen Tilastot", - "panelMain": "Ensisijainen", - "panelSide": "Sivu", - "justNow": "juuri nyt" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "VAKUUTUS", - "hostsOnline": "Isäntä Paikalla", - "activeTunnels": "Aktiiviset Tunnelit", - "registerNewServer": "Rekisteröi uusi palvelin", - "storeSshKeysOrPasswords": "Tallenna SSH näppäimet tai salasanat", - "manageUsersAndRoles": "Hallinnoi käyttäjiä ja rooleja", - "manageYourAccount": "Hallinnoi tiliäsi", - "hostStatus": "Isäntäpisteen Tila", - "noHostsConfigured": "Ei isäntiä määritetty", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", - "offline": "OFFLINE-TILA", - "onlineLower": "Paikalla", + "offline": "OFFLINE", + "onlineLower": "Verkossa", "nodes": "{{count}} nodes", - "add": "Lisää:", - "commandPalette": "Komentopaletti", - "done": "Valmis", - "editModeInstructions": "Vedä kortteja järjestääksesi uudelleen · Vedä sarakkeen jakajaa muuttaaksesi sarakkeita · Vedä kortin alareunaa muuttaaksesi sen korkeutta · Roskakorttia poistaaksesi", - "empty": "Tyhjä", - "clear": "Tyhjennä" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Lisää Isäntä", - "addGroup": "Lisää Ryhmä", - "addLink": "Lisää Linkki", - "zoomIn": "Zoomaa Sisään", - "zoomOut": "Zoomaa Ulos", - "resetView": "Palauta Näkymä", - "selectHost": "Valitse Isäntä", - "chooseHost": "Valitse isäntä...", - "parentGroup": "Ylätason Ryhmä", - "noGroup": "Ei Ryhmää", - "groupName": "Ryhmän Nimi", - "color": "Väri", - "source": "Lähde", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Siirrä ryhmään", - "selectGroup": "Valitse ryhmä...", - "addConnection": "Lisää Yhteys", - "hostDetails": "Palvelimen Tiedot", - "removeFromGroup": "Poista ryhmästä", - "addHostHere": "Lisää Isäntä Tähän", - "editGroup": "Muokkaa Ryhmää", - "delete": "Poista", - "add": "Lisää", - "create": "Luo", - "move": "Siirrä", - "connect": "Yhdistä", - "createGroup": "Luo Ryhmä", - "selectSourcePlaceholder": "Valitse Lähdekoodi...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Virheellinen Tiedosto", - "hostAlreadyExists": "Isäntä on jo rakenteessa", - "connectionExists": "Yhteys on jo olemassa", - "unknown": "Tuntematon", - "name": "Nimi", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "Tila", - "failedToAddNode": "Solmun lisääminen epäonnistui", - "sourceDifferentFromTarget": "Lähteen ja kohteen on oltava erilainen", - "exportJSON": "Vie JSON", - "importJSON": "Tuo JSON", - "terminal": "Pääte", - "fileManager": "Tiedostojen Hallinta", - "tunnel": "Tunneli", - "docker": "Telakoitsija", - "serverStats": "Palvelimen Tilastot", - "noNodes": "Ei vielä solmuja" + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminaali", + "fileManager": "Tiedostonhallinta", + "tunnel": "Tunnel", + "docker": "Satamatyöläinen", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Telakointi ei ole käytössä tälle isännälle", - "validating": "Tarkistetaan Dockeria...", - "connecting": "Yhdistetään...", - "error": "Virhe", - "version": "Telakoija {{version}}", - "connectionFailed": "Yhteyden muodostaminen Dockeriin epäonnistui", - "containerStarted": "Kontti {{name}} aloitettu", - "failedToStartContainer": "Säiliön {{name}} käynnistäminen epäonnistui", - "containerStopped": "Säiliö {{name}} pysäytetty", - "failedToStopContainer": "{{name}} säilytyksen pysäyttäminen epäonnistui", - "containerRestarted": "Kontti {{name}} uudelleenkäynnistetty", - "failedToRestartContainer": "Kontin uudelleenkäynnistys epäonnistui {{name}}", - "containerPaused": "Säiliö {{name}} keskeytetty", - "containerUnpaused": "Säiliö {{name}} keskeytetty", - "failedToTogglePauseContainer": "Paketin tilan vaihto epäonnistui kontin {{name}}", - "containerRemoved": "Säiliö {{name}} poistettu", - "failedToRemoveContainer": "{{name}} laatikon poisto epäonnistui", - "image": "Kuva", - "ports": "Satamat", - "noPorts": "Ei portteja", - "start": "Aloita", - "confirmRemoveContainer": "Oletko varma, että haluat poistaa säiliön '{{name}}'? Tätä toimintoa ei voi perua.", - "runningContainerWarning": "Varoitus: Tämä säiliö on käynnissä. Pakkauksen poistaminen pysäyttää ensin pakkauksen.", - "loadingContainers": "Ladataan säiliöitä...", - "manager": "Telakoitsijoiden Hallinta", - "autoRefresh": "Automaattinen Päivitys", - "timestamps": "Aikaleimat", - "lines": "Rivejä", - "filterLogs": "Suodata lokia...", - "refresh": "Päivitä", - "download": "Lataa", - "clear": "Tyhjennä", - "logsDownloaded": "Lokit ladattu onnistuneesti", - "last50": "Viimeiset 50", - "last100": "Viimeiset 100", - "last500": "Viimeiset 500", - "last1000": "Viimeiset 1000", - "allLogs": "Kaikki Lokit", - "noLogsMatching": "Ei vastaavia lokeja \"{{query}}\"", - "noLogsAvailable": "Lokeja ei saatavilla", - "noContainersFound": "Säiliöitä ei löytynyt", - "noContainersFoundHint": "Telakointikontteja ei ole saatavilla tässä palvelimessa", - "searchPlaceholder": "Etsi kontteja...", - "allStatuses": "Kaikki Tilat", - "stateRunning": "Käynnissä", - "statePaused": "Keskeytetty", - "stateExited": "Poistui", - "stateRestarting": "Käynnistetään Uudelleen", - "noContainersMatchFilters": "Suodattimet eivät täsmää", - "noContainersMatchFiltersHint": "Yritä muokata haku- tai suodatinkriteerejäsi", - "failedToFetchStats": "Konttitilastojen noutaminen epäonnistui", - "containerNotRunning": "Kontti ei ole käynnissä", - "startContainerToViewStats": "Käynnistä kontti nähdäksesi tilastot", - "loadingStats": "Ladataan tilastoja...", - "errorLoadingStats": "Virhe tilastoja ladattaessa", - "noStatsAvailable": "Ei tilastoja saatavilla", - "cpuUsage": "Suorittimen Käyttö", - "current": "Nykyinen", - "memoryUsage": "Muistin Käyttö", - "networkIo": "Verkko I/O", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Ulostulo", - "blockIo": "Lohko I/O", - "read": "Lue", - "write": "Kirjoita", - "pids": "PID:t", - "containerInformation": "Kontin Tiedot", - "name": "Nimi", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Tila", - "containerMustBeRunning": "Kontin on oltava käynnissä päästäksesi konsoliin", - "verificationCodePrompt": "Syötä vahvistuskoodi", - "totpVerificationFailed": "TOTP vahvistus epäonnistui. Yritä uudelleen.", - "warpgateVerificationFailed": "Varmennus epäonnistui. Yritä uudelleen.", - "connectedTo": "Yhdistetty {{containerName}}", - "disconnected": "Yhteys Katkaistu", - "consoleError": "Konsolivirhe", - "errorMessage": "Virhe: {{message}}", - "failedToConnect": "Yhteyden muodostaminen konttiin epäonnistui", - "console": "Konsoli", - "selectShell": "Valitse tulkki", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Yhteys katkennut", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "tuhka", - "connect": "Yhdistä", - "disconnect": "Katkaise", - "notConnected": "Ei yhdistetty", - "clickToConnect": "Napsauta Yhdistä aloittaaksesi komentotulkin istunnon", - "connectingTo": "Yhdistetään {{containerName}} tiedostoon...", - "containerNotFound": "Säiliötä ei löytynyt", - "backToList": "Takaisin listaan", - "logs": "Lokit", - "stats": "Tilastot", - "consoleTab": "Konsoli", - "startContainerToAccess": "Käynnistä kontti päästäksesi konsoliin" + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Yleiset", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Käyttäjät", - "sectionSessions": "Istunnot", - "sectionRoles": "Roolit", - "sectionDatabase": "Tietokanta", - "sectionApiKeys": "Api Avaimet", - "allowRegistration": "Salli Käyttäjien Rekisteröinti", - "allowRegistrationDesc": "Anna uusien käyttäjien itse rekisteröityä", - "allowPasswordLogin": "Salli Salasanan Kirjautuminen", - "allowPasswordLoginDesc": "Käyttäjätunnus/salasana kirjautuminen", - "oidcAutoProvision": "Oidc Auto-Provision", - "oidcAutoProvisionDesc": "Luo automaattisesti tilejä OIDC käyttäjille, vaikka rekisteröinti on poistettu käytöstä", - "allowPasswordReset": "Salli Salasanan Nollaus", - "allowPasswordResetDesc": "Nollaa koodi Dockerin lokeilla", - "sessionTimeout": "Istunnon Aikakatkaisu", - "hours": "tuntia", - "sessionTimeoutRange": "Minimi 1 h · Max 720 h", - "monitoringDefaults": "Oletusten Seuranta", - "statusCheck": "Tilan Tarkistus", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Tyhjennä suodattimet", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", "metrics": "Metrics", - "sec": "sek", - "logLevel": "Lokin Taso", - "enableGuacamole": "Ota Guacamoli Käyttöön", - "enableGuacamoleDesc": "RD- NC etätyöpöytä", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "Määritä OpenID Connect SSO:lle. * merkityt kentät ovat pakollisia.", - "oidcClientId": "Asiakkaan Tunnus", - "oidcClientSecret": "Asiakkaan Salainen", - "oidcAuthUrl": "Valtuutuksen URL", - "oidcIssuerUrl": "Myöntäjän URL", - "oidcTokenUrl": "Tokenin URL", - "oidcUserIdentifier": "Käyttäjän Tunnisteen Polku", - "oidcDisplayName": "Näytä Nimen Polku", - "oidcScopes": "Soveltamisalueet", - "oidcUserinfoUrl": "Ohita Käyttäjäinfo Url", - "oidcAllowedUsers": "Sallitut Käyttäjät", - "oidcAllowedUsersDesc": "Yksi sähköposti riviä kohden. Jätä tyhjäksi, jotta kaikki sallitaan.", - "removeOidc": "Poista", - "usersCount": "{{count}} käyttäjää", - "createUser": "Luo", - "newRole": "Uusi Rooli", - "roleName": "Nimi", - "roleDisplayName": "Näytön Nimi", - "roleDescription": "Kuvaus", - "rolesCount": "{{count}} roolia", - "createRole": "Luo", - "creating": "Luodaan...", - "exportDatabase": "Vie Tietokanta", - "exportDatabaseDesc": "Lataa varmuuskopio kaikista palvelimista, käyttäjätunnuksista ja asetuksista", - "export": "Vie", - "exporting": "Viedään...", - "importDatabase": "Tuo Tietokanta", - "importDatabaseDesc": "Palauta .sqlite varmuuskopio tiedostosta", - "importDatabaseSelected": "Valittu: {{name}}", - "selectFile": "Valitse Tiedosto", - "changeFile": "Muuta", - "import": "Tuo", - "importing": "Tuoda...", - "apiKeysCount": "{{count}} avainta", - "newApiKey": "Uusi API-avain", - "apiKeyCreatedWarning": "Avain luotu - kopioi se nyt, sitä ei näytetä uudelleen.", - "apiKeyName": "Nimi", - "apiKeyUser": "Käyttäjä", - "apiKeySelectUser": "Valitse käyttäjä...", - "apiKeyExpiresAt": "Vanhenee", - "createKey": "Luo Avain", - "apiKeyNoExpiry": "Ei vanhentunut", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Poistaa", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Kaksoisaukko", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Paikallinen", - "adminStatusAdministrator": "Ylläpitäjä", - "adminStatusRegularUser": "Tavallinen Käyttäjä", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "TULLI", - "youBadge": "SINÄ", - "sessionsActive": "{{count}} aktiivinen", - "sessionActive": "Aktiivinen: {{time}}", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "Kaikki", - "revokeAllSessionsSuccess": "Kaikki istunnot käyttäjälle peruutettu", - "revokeAllSessionsFailed": "Istuntojen peruuttaminen epäonnistui", - "revokeSessionFailed": "Istunnon peruuttaminen epäonnistui", - "addRole": "Lisää rooli", - "noCustomRoles": "Mukautettuja rooleja ei määritelty", - "removeRoleFailed": "Roolin poistaminen epäonnistui", - "assignRoleFailed": "Roolin määrittäminen epäonnistui", - "deleteRoleFailed": "Roolin poistaminen epäonnistui", - "userAdminAccess": "Ylläpitäjä", - "userAdminAccessDesc": "Täysi pääsy kaikkiin järjestelmänvalvojan asetuksiin", - "userRoles": "Roolit", - "revokeAllUserSessions": "Peruuta Kaikki Istunnot", - "revokeAllUserSessionsDesc": "Pakota uudelleen kirjautumaan kaikkiin laitteisiin", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Tämän käyttäjän poistaminen on pysyvää.", - "deleteUser": "Poista {{username}}", - "deleting": "Poistetaan...", - "deleteUserFailed": "Käyttäjän poistaminen epäonnistui", - "deleteUserSuccess": "Käyttäjä \"{{username}}\" poistettu", - "deleteRoleSuccess": "Rooli \"{{name}}\" poistettu", - "revokeKeySuccess": "Key \"{{name}}\" peruttu", - "revokeKeyFailed": "Avaimen peruuttaminen epäonnistui", - "copiedToClipboard": "Kopioitu leikepöydälle", - "done": "Valmis", - "createUserTitle": "Luo Käyttäjä", - "createUserDesc": "Luo uusi paikallinen tili.", - "createUserUsername": "Käyttäjätunnus", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Salasana", - "createUserPasswordHint": "Vähintään 6 merkkiä.", - "createUserEnterUsername": "Syötä käyttäjänimi", - "createUserEnterPassword": "Syötä salasana", - "createUserSubmit": "Luo Käyttäjä", - "editUserTitle": "Käyttäjän Hallinta: {{username}}", - "editUserDesc": "Muokkaa rooleja, ylläpitäjän tilaa, istuntoja ja tilin asetuksia.", - "editUserUsername": "Käyttäjätunnus", - "editUserAuthType": "Todennuksen Tyyppi", - "editUserAdminStatus": "Ylläpitäjän Tila", - "editUserUserId": "Käyttäjän Tunnus", - "linkAccountTitle": "Linkitä OIDC salasanatilille", - "linkAccountDesc": "Yhdistä OIDC tili {{username}} olemassa olevaan paikalliseen tiliin.", - "linkAccountWarningTitle": "Näin voidaan", - "linkAccountEffect1": "Poista vain OIDC tili", - "linkAccountEffect2": "Lisää OIDC kirjautuminen kohdetilille", - "linkAccountEffect3": "Salli sekä OIDC että salasana kirjautuminen", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Syötä paikallisen tilin käyttäjänimi linkittääksesi käyttäjätunnuksen", - "linkAccounts": "Linkitä Tilit", - "linkAccountSuccess": "OIDC-tili linkitetty kohteeseen \"{{username}}\"", - "linkAccountFailed": "OIDC-tilin linkittäminen epäonnistui", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Valtuutustyyppi", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Linkitetään...", - "saving": "Tallennetaan...", - "updateRegistrationFailed": "Rekisteröintiasetuksen päivittäminen epäonnistui", - "updatePasswordLoginFailed": "Salasanan sisäänkirjautumisen asetusta ei voitu päivittää", - "updateOidcAutoProvisionFailed": "OIDC automaattisen varauksen asetuksen päivittäminen epäonnistui", - "updatePasswordResetFailed": "Salasanan nollausasetuksen päivittäminen epäonnistui", - "sessionTimeoutRange2": "Istunnon aikakatkaisun on oltava 1 - 720 tuntia", - "sessionTimeoutSaved": "Istunnon aikakatkaisu tallennettu", - "sessionTimeoutSaveFailed": "Istunnon aikakatkaisun tallennus epäonnistui", - "monitoringIntervalInvalid": "Virheelliset aika-arvot", - "monitoringSaved": "Seuranta-asetukset tallennettu", - "monitoringSaveFailed": "Seuranta-asetusten tallentaminen epäonnistui", - "guacamoleSaved": "Guacamolen asetukset tallennettu", - "guacamoleSaveFailed": "Guacamolen asetusten tallennus epäonnistui", - "guacamoleUpdateFailed": "Guacamole asetuksen päivittäminen epäonnistui", - "logLevelUpdateFailed": "Lokitason päivitys epäonnistui", - "oidcSaved": "OIDC asetukset tallennettu", - "oidcSaveFailed": "OIDC config tallennus epäonnistui", - "oidcRemoved": "OIDC asetukset poistettu", - "oidcRemoveFailed": "OIDC config poistaminen epäonnistui", - "createUserRequired": "Käyttäjätunnus ja salasana vaaditaan", - "createUserPasswordTooShort": "Salasanan on oltava vähintään 6 merkkiä", - "createUserSuccess": "Käyttäjä \"{{username}}\" luotu", - "createUserFailed": "Käyttäjän luonti epäonnistui", - "updateAdminStatusFailed": "Ylläpitäjän tilan päivitys epäonnistui", - "allSessionsRevoked": "Kaikki istunnot peruutettu", - "revokeSessionsFailed": "Istuntojen peruuttaminen epäonnistui", - "createRoleRequired": "Nimi ja nimi vaaditaan", - "createRoleSuccess": "Rooli \"{{name}}\" luotu", - "createRoleFailed": "Roolin luonti epäonnistui", - "apiKeyNameRequired": "Avaimen nimi vaaditaan", - "apiKeyUserRequired": "Käyttäjätunnus on pakollinen", - "apiKeyCreatedSuccess": "API-avain \"{{name}}\" luotu", - "apiKeyCreateFailed": "API-avaimen luonti epäonnistui", - "exportSuccess": "Tietokannan vienti onnistui", - "exportFailed": "Tietokannan vienti epäonnistui", - "importSelectFile": "Ole hyvä ja valitse tiedosto ensin", - "importCompleted": "Tuonti valmis: {{total}} kohdetta tuotu, {{skipped}} ohitettu", - "importFailed": "Tuonti epäonnistui: {{error}}", - "importError": "Tietokannan tuonti epäonnistui" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminaali", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Isäntä", - "hostPlaceholder": "192.168.1.1 tai esimerkki.com", - "portLabel": "Portti", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Käyttäjätunnus", - "usernamePlaceholder": "käyttäjätunnus", - "authLabel": "Todennus", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Salasana", - "passwordPlaceholder": "salasana", - "privateKeyLabel": "Yksityinen Avain", - "privateKeyPlaceholder": "Liitä yksityinen avain...", - "credentialLabel": "Käyttöoikeustiedot", - "credentialPlaceholder": "Valitse tallennettu käyttäjätunnus", - "connectToTerminal": "Yhdistä päätteeseen", - "connectToFiles": "Yhdistä tiedostoihin" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Valtakirja", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Päätettä ei ole valittu", - "noTerminalSelectedHint": "Avaa SSH terminaalin välilehti nähdäksesi komennon historian", - "searchPlaceholder": "Etsi historiaa...", - "clearAll": "Tyhjennä Kaikki", - "noHistoryEntries": "Ei historiatietoja", - "trackingDisabled": "Historian seuranta on poistettu käytöstä", - "trackingDisabledHint": "Ota se käyttöön profiilisi asetuksissa nauhoittaaksesi komentoja." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Avaimen Tallennus", - "recordToTerminals": "Tietue päätelaitteisiin", - "selectAll": "Kaikki", - "selectNone": "Ei Mitään", - "noTerminalTabsOpen": "Päätevälilehtiä ei ole avoinna", - "selectTerminalsAbove": "Valitse yläpuolella olevat päätteet", - "broadcastInputPlaceholder": "Kirjoita tähän lähettääksesi näppäimistöjä...", - "stopRecording": "Lopeta Tallennus", - "startRecording": "Aloita Nauhoitus", - "settingsTitle": "Asetukset", - "enableRightClickCopyPaste": "Käytä hiiren kakkospainikkeella kopiota/liitä" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Ei mitään", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Asettelu", - "selectLayoutAbove": "Valitse asettelu yläpuolella", - "selectLayoutHint": "Valitse kuinka monta paneelia näytetään", - "panesTitle": "Paneelit", - "openTabsTitle": "Avaa Välilehdet", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Vedä välilehdet yllä oleviin ruutuihin tai käytä pikamääritystä", - "dropHere": "Pudota tähän", - "emptyPane": "Tyhjä", - "dashboard": "Hallintapaneeli", - "clearSplitScreen": "Tyhjennä Jaettu Näyttö", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Pikamääritys", - "alreadyAssigned": "Ruutu {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Jaettu välilehti", "addToSplit": "Lisää Splitiin", "removeFromSplit": "Poista jaosta", - "assignToPane": "Määritä ruutuun" + "assignToPane": "Määritä ruutuun", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Luo Projekti", - "createSnippetDescription": "Luo uusi komennon tiedosto nopeaa suoritusta varten", - "nameLabel": "Nimi", - "namePlaceholder": "esim., Uudelleenkäynnistä Nginx", - "descriptionLabel": "Kuvaus", - "descriptionPlaceholder": "Valinnainen kuvaus", - "optional": "Valinnainen", - "folderLabel": "Kansio", - "noFolder": "Ei kansiota (Luokittelematon)", - "commandLabel": "Komento", - "commandPlaceholder": "esim. sudo systemctl restart nginx", - "cancel": "Peruuta", - "createSnippetButton": "Luo Projekti", - "createFolderTitle": "Luo Kansio", - "createFolderDescription": "Järjestä leikkeet kansioihin", - "folderNameLabel": "Kansion Nimi", - "folderNamePlaceholder": "esim., System Commands, Docker Scripts", - "folderColorLabel": "Kansion Väri", - "folderIconLabel": "Kansion Kuvake", - "previewLabel": "Esikatselu", - "folderNameFallback": "Kansion Nimi", - "createFolderButton": "Luo Kansio", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Peruuttaa", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Kaikki", - "selectNone": "Ei Mitään", - "noTerminalTabsOpen": "Päätevälilehtiä ei ole avoinna", - "searchPlaceholder": "Etsi tiedostoja...", - "newSnippet": "Uusi Projekti", - "newFolder": "Uusi Kansio", - "run": "Suorita", - "noSnippetsInFolder": "Tässä kansiossa ei ole leikkauksia", - "uncategorized": "Luokittelematon", - "editSnippetTitle": "Muokkaa Kirjoitusta", - "editSnippetDescription": "Päivitä tämä komento tiedosto", - "saveSnippetButton": "Tallenna Muutokset", - "createSuccess": "Projektin luominen onnistui", - "createFailed": "Snippetin luonti epäonnistui", - "updateSuccess": "Projekti päivitetty onnistuneesti", - "updateFailed": "Virhe päivitettäessä tiedosto", - "deleteFailed": "Virhe poistettaessa tiedosto", - "folderCreateSuccess": "Kansio luotu onnistuneesti", - "folderCreateFailed": "Kansion luonti epäonnistui", - "editFolderTitle": "Muokkaa Kansiota", - "editFolderDescription": "Nimeä tai muuta tämän kansion ulkonäköä", - "saveFolderButton": "Tallenna Muutokset", - "editFolder": "Muokkaa kansiota", - "deleteFolder": "Poista kansio", - "folderDeleteSuccess": "Kansio \"{{name}}\" poistettu", - "folderDeleteFailed": "Kansion poistaminen epäonnistui", - "folderEditSuccess": "Kansio päivitetty onnistuneesti", - "folderEditFailed": "Kansion päivitys epäonnistui", - "confirmRunMessage": "Suorittaa \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Ei mitään", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Juokse", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Juokse", - "runSuccess": "Suoritti komennon \"{{name}}\" {{count}} päätteessä/päätteissä", - "copySuccess": "Kopioitu \"{{name}}\" leikepöydälle", - "shareTitle": "Jaa Projekti", - "shareUser": "Käyttäjä", - "shareRole": "Rooli", - "selectUser": "Valitse käyttäjä...", - "selectRole": "Valitse rooli...", - "shareSuccess": "Projekti jaettu onnistuneesti", - "shareFailed": "Snippetin jakaminen epäonnistui", - "revokeSuccess": "Pääsy peruttu", - "revokeFailed": "Käyttöoikeuksien peruuttaminen epäonnistui", - "currentAccess": "Nykyinen Käyttöoikeus", - "shareLoadError": "Jakamisen tietojen lataaminen epäonnistui", - "loading": "Ladataan...", - "close": "Sulje", - "reorderFailed": "Katkelmien järjestyksen tallentaminen epäonnistui" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Katkelmien järjestyksen tallentaminen epäonnistui", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Tili", - "sectionAppearance": "Ulkoasu", - "sectionSecurity": "Turvallisuus", - "sectionApiKeys": "Api Avaimet", - "sectionC2sTunnels": "C2S-Tunnelit", - "usernameLabel": "Käyttäjätunnus", - "roleLabel": "Rooli", - "roleAdministrator": "Ylläpitäjä", - "authMethodLabel": "Todistusmenetelmä", - "authMethodLocal": "Paikallinen", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "Päällä", - "twoFaOff": "Pois", - "versionLabel": "Versio", - "deleteAccount": "Poista Tili", - "deleteAccountDescription": "Poista tilisi pysyvästi", - "deleteButton": "Poista", - "deleteAccountPermanent": "Tämä toiminto on pysyvä, eikä sitä voi peruuttaa.", - "deleteAccountWarning": "Kaikki istunnot, isännät, tunnukset ja asetukset poistetaan pysyvästi.", - "confirmPasswordDeletePlaceholder": "Anna salasanasi vahvistaaksesi", - "languageLabel": "Kieli", - "themeLabel": "Teema", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Korostettu Väri", - "settingsTerminal": "Pääte", - "commandAutocomplete": "Komennon Automaattitäydennys", - "commandAutocompleteDesc": "Näytä automaattitäydennys kirjoitettaessa", - "historyTracking": "Historian Seuranta", - "historyTrackingDesc": "Seuraa päätekomentoja", - "syntaxHighlighting": "Syntaksin Korostus", - "syntaxHighlightingDesc": "Korosta päätteen ulostulo", - "commandPalette": "Komentopaletti", - "commandPaletteDesc": "Ota käyttöön pikanäppäin", + "accentColorLabel": "Accent Color", + "settingsTerminal": "Terminaali", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Avaa välilehdet uudelleen kirjautumisen yhteydessä", "reopenTabsOnLoginDesc": "Palauta avoimet välilehdet, kun kirjaudut sisään tai päivität sivun, jopa toiselta laitteelta", - "confirmTabClose": "Vahvista Välilehti Sulje", - "confirmTabCloseDesc": "Kysy ennen päätevälilehtien sulkemista", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Näytä Isäntätunnisteet", - "showHostTagsDesc": "Näytä tagit isäntäluettelossa", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Napsauta laajentaaksesi isäntätoiminnot", "hostTrayOnClickDesc": "Näytä aina yhteyspainikkeet; napsauta laajentaaksesi hallinta-asetuksia hiiren osoittimen sijaan", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Kiinnitä sovellusraide", "pinAppRailDesc": "Pidä vasemman sivupalkin sovelluspalkki aina laajennettuna sen sijaan, että se laajenisi hiiren osoittimen vaikutuksesta", - "settingsSnippets": "Projekti", - "foldersCollapsed": "Kansiot Tiivistetty", - "foldersCollapsedDesc": "Pienennä kansiot oletuksena", - "confirmExecution": "Vahvista Suoritus", - "confirmExecutionDesc": "Vahvista ennen leikkauksia", - "settingsUpdates": "Päivitykset", - "disableUpdateChecks": "Poista Päivitystarkistukset Käytöstä", - "disableUpdateChecksDesc": "Lopeta päivitysten tarkistus", - "totpAuthenticator": "TOTP Todennuslaite", - "totpEnabled": "2FA on käytössä", - "totpDisabled": "Lisää ylimääräinen kirjautumissuojaus", - "disable": "Poista Käytöstä", - "enable": "Aktivoi", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Skannaa QR-koodi tai kirjoita salaisuus todennussovelluksessasi ja kirjoita sitten 6-numeroinen koodi", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Vahvista", - "changePassword": "Vaihda Salasana", - "currentPasswordLabel": "Nykyinen Salasana", - "currentPasswordPlaceholder": "Nykyinen salasana", - "newPasswordLabel": "Uusi Salasana", - "newPasswordPlaceholder": "Uusi salasana", - "confirmPasswordLabel": "Vahvista Uusi Salasana", - "confirmPasswordPlaceholder": "Vahvista uusi salasana", - "updatePassword": "Päivitä Salasana", - "createApiKeyTitle": "Luo API-avain", - "createApiKeyDescription": "Luo uusi API-avain ohjelmoitavalle pääsylle.", - "apiKeyNameLabel": "Nimi", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "valinnainen", - "cancel": "Peruuta", - "createKey": "Luo Avain", - "apiKeyCount": "{{count}} avainta", - "newKey": "Uusi Avain", - "noApiKeys": "Ei vielä API-avaimia.", - "apiKeyActive": "Aktiivinen", - "apiKeyUsageHint": "Sisällytä avaimesi tähän", - "apiKeyUsageHintHeader": "otsikko.", - "apiKeyPermissionsHint": "Avaimet perivät luomisen käyttäjän oikeudet.", - "roleUser": "Käyttäjä", - "authMethodDual": "Kaksoisaukko", + "optional": "optional", + "cancel": "Peruuttaa", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "TOTP-asennuksen käynnistäminen epäonnistui", - "totpEnter6Digits": "Syötä 6-numeroinen koodi", - "totpEnabledSuccess": "Kaksivaiheinen todennus käytössä", - "totpInvalidCode": "Virheellinen koodi, yritä uudelleen", - "totpDisableInputRequired": "Syötä TOTP koodi tai salasana", - "totpDisabledSuccess": "Kaksivaiheinen todennus pois käytöstä", - "totpDisableFailed": "2FA:n poistaminen käytöstä epäonnistui", - "totpDisableTitle": "Poista 2FA Käytöstä", - "totpDisablePlaceholder": "Syötä TOTP koodi tai salasana", - "totpDisableConfirm": "Poista 2FA Käytöstä", - "totpContinueVerify": "Jatka tarkistamista", - "totpVerifyTitle": "Vahvista Koodi", - "totpBackupTitle": "Varmuuskopioi Koodit", - "totpDownloadBackup": "Lataa Varmuuskopion Koodit", - "done": "Valmis", - "secretCopied": "Salainen kopioitu leikepöydälle", - "apiKeyNameRequired": "Avaimen nimi vaaditaan", - "apiKeyCreated": "API-avain \"{{name}}\" luotu", - "apiKeyCreateFailed": "API-avaimen luonti epäonnistui", - "apiKeyUser": "Käyttäjä", - "apiKeyExpires": "Vanhenee", - "apiKeyRevoked": "API-avain \"{{name}}\" kumottu", - "apiKeyRevokeFailed": "API-avaimen peruuttaminen epäonnistui", - "passwordFieldsRequired": "Nykyiset ja uudet salasanat vaaditaan", - "passwordMismatch": "Salasanat eivät täsmää", - "passwordTooShort": "Salasanan on oltava vähintään 6 merkkiä", - "passwordUpdated": "Salasana päivitetty onnistuneesti", - "passwordUpdateFailed": "Salasanan päivittäminen epäonnistui", - "deletePasswordRequired": "Salasana vaaditaan tilin poistamiseen", - "deleteFailed": "Tiliä ei voitu poistaa", - "deleting": "Poistetaan...", - "colorPickerTooltip": "Avaa värivalitsin", - "themeSystem": "Järjestelmä", - "themeLight": "Vaalea", - "themeDark": "Tumma", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solaroitu", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Yksi Tumma", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tunnisteet", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Yritä uudelleen", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Poistaa", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/fr_FR.json b/src/ui/locales/translated/fr_FR.json index ebe46c0f..89a42527 100644 --- a/src/ui/locales/translated/fr_FR.json +++ b/src/ui/locales/translated/fr_FR.json @@ -1,579 +1,744 @@ { "credentials": { "folders": "Dossiers", - "folder": "Répertoire", + "folder": "Folder", "password": "Mot de passe", - "key": "Clés", - "sshPrivateKey": "Clé privée SSH", - "upload": "Charger", - "keyPassword": "Mot de passe de la clé", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "Clé SSH", - "uploadPrivateKeyFile": "Charger un fichier de clé privée", - "searchCredentials": "Rechercher des identifiants...", - "addCredential": "Ajouter un mot de passe", - "caCertificate": "Certificat d'AC (-cert.pub)", - "caCertificateDescription": "Optionnel: Chargez ou collez le fichier de certificat signé par CA (par exemple id_ed25519-cert.pub). Requis lorsque votre serveur SSH utilise une autorisation basée sur un certificat.", - "uploadCertFile": "Télécharger le fichier -cert.pub", - "clearCert": "Nettoyer", - "certLoaded": "Certificat chargé", - "certPublicKeyLabel": "Certificat d'AC", - "certTypeLabel": "Type de certificat", - "pasteOrUploadCert": "Collez ou téléchargez un certificat -cert.pub...", - "hasCaCert": "A un certificat d’AC", - "noCaCert": "Pas de certificat d’AC" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Ordre par défaut", + "sortNameAsc": "Nom (A → Z)", + "sortNameDesc": "Nom (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Filtres transparents", + "filterTypeGroup": "Type", + "filterTypePassword": "Mot de passe", + "filterTypeKey": "Clé SSH", + "filterTagsGroup": "Étiquettes" }, "homepage": { - "failedToLoadAlerts": "Impossible de charger les alertes", - "failedToDismissAlert": "Échec de la suppression de l'alerte" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Configuration du serveur", - "description": "Configurer l'URL du serveur Termix pour vous connecter à vos services backend", - "serverUrl": "URL du serveur", - "enterServerUrl": "Veuillez entrer une URL de serveur", - "saveFailed": "Échec de l'enregistrement de la configuration", - "saveError": "Erreur lors de l'enregistrement de la configuration", - "saving": "Sauvegarde en cours...", - "saveConfig": "Enregistrer la configuration", - "helpText": "Entrez l'URL où fonctionne votre serveur Termix (par exemple, http://localhost:30001 ou https://votre-serveur.com)", - "changeServer": "Changer de serveur", - "mustIncludeProtocol": "L'URL du serveur doit commencer par http:// ou https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Autoriser un certificat invalide", "allowInvalidCertificateDesc": "À utiliser uniquement pour des serveurs auto-hébergés de confiance avec des certificats auto-signés ou des certificats d'adresse IP.", - "useEmbedded": "Utiliser le serveur local", - "embeddedDesc": "Exécuter Termix avec le serveur local intégré (aucun serveur distant nécessaire)", - "embeddedConnecting": "Connexion au serveur local...", - "embeddedNotReady": "Le serveur local n'est pas encore prêt. Veuillez patienter un instant et réessayer.", - "localServer": "Serveur local" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Retirer" }, "versionCheck": { - "error": "Erreur de vérification de version", - "checkFailed": "Impossible de vérifier les mises à jour", - "upToDate": "L'application est à jour", - "currentVersion": "Vous utilisez la version {{version}}", - "updateAvailable": "Mise à jour disponible", - "newVersionAvailable": "Une nouvelle version est disponible ! Vous utilisez {{current}}, mais {{latest}} est disponible.", - "betaVersion": "Version bêta", - "betaVersionDesc": "Vous utilisez {{current}}, qui est plus récent que la dernière version stable {{latest}}.", - "releasedOn": "Publié sur {{date}}", - "downloadUpdate": "Télécharger la mise à jour", - "checking": "Vérification des mises à jour...", - "checkUpdates": "Vérifier les mises à jour", - "checkingUpdates": "Vérification des mises à jour...", - "updateRequired": "Mise à jour requise" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Fermer", + "close": "Close", "minimize": "Minimize", "online": "En ligne", "offline": "Hors ligne", - "continue": "Continuer", - "maintenance": "Entretien", - "degraded": "Dégradé", - "error": "Erreur", - "warning": "Avertissement", - "unsavedChanges": "Modifications non enregistrées", - "dismiss": "Refuser", - "loading": "Chargement en cours...", - "optional": "Optionnel", - "connect": "Connecter", - "copied": "Copié", - "connecting": "Connexion en cours...", - "updateAvailable": "Mise à jour disponible", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Ouvrir dans un nouvel onglet", - "noReleases": "Aucune publication", - "updatesAndReleases": "Mises à jour et versions", - "newVersionAvailable": "Une nouvelle version ({{version}}) est disponible.", - "failedToFetchUpdateInfo": "Impossible de récupérer les informations de mise à jour", - "preRelease": "Pré-version", - "noReleasesFound": "Aucune version trouvée.", - "cancel": "Abandonner", - "username": "Nom d'utilisateur", - "login": "Se connecter", - "register": "Inscription", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Annuler", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Mot de passe", - "confirmPassword": "Confirmer le mot de passe", - "back": "Précédent", - "save": "Enregistrer", - "saving": "Sauvegarde en cours...", - "delete": "Supprimez", - "rename": "Renommer", - "edit": "Editer", - "add": "Ajouter", - "confirm": "Valider", - "no": "Non", - "or": "OU", - "next": "Suivant", - "previous": "Précédent", - "refresh": "Rafraîchir", - "language": "Langue", - "checking": "Vérification...", - "checkingDatabase": "Vérification de la connexion à la base de données...", - "checkingAuthentication": "Vérification de l'authentification...", - "backendReconnected": "Connexion au serveur restaurée", - "connectionDegraded": "Connexion au serveur perdue, récupération de…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", "remove": "Retirer", - "create": "Créer", - "update": "Mise à jour", + "create": "Create", + "update": "Update", "copy": "Copie", - "copyFailed": "Échec de la copie dans le presse-papiers", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Restaurer", - "of": "de" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Domicile", + "home": "Home", "terminal": "Terminal", "docker": "Docker", "tunnels": "Tunnels", "fileManager": "Gestionnaire de fichiers", - "serverStats": "Statistiques du serveur", - "admin": "Administrateur", - "userProfile": "Profil de l'utilisateur", - "splitScreen": "Écran partagé", - "confirmClose": "Fermer cette session active ?", - "close": "Fermer", - "cancel": "Abandonner", - "sshManager": "Gestionnaire SSH", - "cannotSplitTab": "Impossible de diviser cet onglet", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Annuler", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Copier le mot de passe", - "copySudoPassword": "Copier le mot de passe Sudo", - "passwordCopied": "Mot de passe copié dans le presse-papiers", - "noPasswordAvailable": "Aucun mot de passe disponible", - "failedToCopyPassword": "Impossible de copier le mot de passe", - "refreshTab": "Rafraîchir la connexion", - "openFileManager": "Ouvrir le gestionnaire de fichiers", - "dashboard": "Tableau de bord", - "networkGraph": "Graphique réseau", - "quickConnect": "Connexion Rapide", - "sshTools": "Outils SSH", - "history": "Historique", - "hosts": "Hôtes", - "snippets": "Extraits", - "hostManager": "Responsable d'hôte", - "credentials": "Identifiants", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Relations", - "roleAdministrator": "Administrateur", - "roleUser": "Utilisateur" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Hôtes", - "noHosts": "Aucun hôte SSH", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", "retry": "Réessayer", - "refresh": "Rafraîchir", - "optional": "Optionnel", - "downloadSample": "Télécharger un exemple", - "failedToDeleteHost": "Échec de la suppression de {{name}}", - "importSkipExisting": "Importer (sauter le existant)", - "connectionDetails": "Détails de la connexion", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Bureau distant", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Nom d'utilisateur", - "folder": "Répertoire", - "tags": "Tags", - "pin": "Épingler", - "addHost": "Ajouter un hôte", - "editHost": "Modifier l'hôte", - "cloneHost": "Cloner l'hôte", - "enableTerminal": "Activer le Terminal", - "enableTunnel": "Activer le tunnel", - "enableFileManager": "Activer le gestionnaire de fichiers", - "enableDocker": "Activer Docker", - "defaultPath": "Chemin par défaut", - "connection": "Raccordement", - "upload": "Charger", - "authentication": "Authentification", + "username": "Username", + "folder": "Folder", + "tags": "Étiquettes", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Mot de passe", - "key": "Clés", - "credential": "Identification", + "key": "Key", + "credential": "Attestation", "none": "Aucun", - "sshPrivateKey": "Clé privée SSH", - "keyType": "Type de clé", - "uploadFile": "Charger un fichier", - "tabGeneral": "Généraux", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", "tabTunnels": "Tunnels", "tabDocker": "Docker", - "tabFiles": "Fichiers", - "tabStats": "Stats", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Partage en cours", - "tabAuthentication": "Authentification", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunnel", "fileManager": "Gestionnaire de fichiers", - "serverStats": "Statistiques du serveur", + "serverStats": "Host Metrics", "status": "Statut", - "folderRenamed": "Le dossier \"{{oldName}}\" a été renommé en \"{{newName}}\" avec succès", - "failedToRenameFolder": "Impossible de renommer le dossier", - "movedToFolder": "Déplacé vers \"{{folder}}\"", - "editHostTooltip": "Modifier l'hôte", - "statusChecks": "Contrôles de statut", - "metricsCollection": "Collection de métriques", - "metricsInterval": "Intervalle de collecte des métriques", - "metricsIntervalDesc": "Fréquence de collecte des statistiques du serveur (5s - 1h)", - "behavior": "Comportement", - "themePreview": "Aperçu du thème", - "theme": "Thème", - "fontFamily": "Famille de police", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Espacement des lettres", - "lineHeight": "Hauteur de la ligne", - "cursorStyle": "Style du curseur", - "cursorBlink": "Clignotement du curseur", - "scrollbackBuffer": "Défilement du tampon", - "bellStyle": "Style de la cloche", - "rightClickSelectsWord": "Clic droit sélectionne le mot", - "fastScrollModifier": "Modificateur de défilement rapide", - "fastScrollSensitivity": "Sensibilité au défilement rapide", - "sshAgentForwarding": "Transfert d'Agent SSH", - "backspaceMode": "Mode Retour arrière", - "startupSnippet": "Snippet de démarrage", - "selectSnippet": "Sélectionner un snippet", - "forceKeyboardInteractive": "Forcer l'interaction du clavier", - "overrideCredentialUsername": "Remplacer le nom d'utilisateur de l'identifiant", - "overrideCredentialUsernameDesc": "Utilisez le nom d'utilisateur spécifié ci-dessus au lieu du nom d'utilisateur", - "jumpHostChain": "Chaîne de saut d'hôte", - "portKnocking": "Saut du port", - "addKnock": "Ajouter un port", - "addProxyNode": "Ajouter un noeud", - "proxyNode": "Noeud Proxy", - "proxyType": "Type de proxy", - "quickActions": "Actions rapides", - "sudoPasswordAutoFill": "Remplissage automatique du mot de passe Sudo", - "sudoPassword": "Mot de passe Sudo", - "keepaliveInterval": "Intervalle de Keepalive (ms)", - "moshCommand": "Commande MOSH", - "environmentVariables": "Variables d'environnement", - "addVariable": "Ajouter une variable", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Copier l'URL du terminal", - "copyFileManagerUrl": "Copier l'URL du gestionnaire de fichiers", - "copyRemoteDesktopUrl": "Copier l'URL du bureau distant", - "failedToConnect": "Impossible de se connecter à la console", - "connect": "Connecter", - "disconnect": "Déconnecter", - "start": "Début", - "enableStatusCheck": "Activer la vérification de l'état", - "enableMetrics": "Activer les métriques", - "bulkUpdateFailed": "La mise à jour en bloc a échoué", - "selectAll": "Tout sélectionner", - "deselectAll": "Désélectionner tout", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Shell sécurisé", - "virtualNetwork": "Réseau virtuel", - "unencryptedShell": "shell non chiffré", - "addressIp": "Adresse / IP", - "friendlyName": "Nom convivial", - "folderAndAdvanced": "Dossier & Avancé", - "privateNotes": "Notes privées", - "privateNotesPlaceholder": "Détails sur ce serveur...", - "pinToTop": "Épingler en haut", - "pinToTopDesc": "Toujours afficher cet hôte en haut de la liste", - "portKnockingSequence": "Séquence de mise à terre du port", - "addKnockBtn": "Ajouter un Knock", - "noPortKnocking": "Aucune frappe de port configurée.", - "knockPort": "Port Knock", - "protocol": "Protocol", - "delayAfterMs": "Délai après (ms)", - "useSocks5Proxy": "Utiliser le proxy SOCKS5", - "useSocks5ProxyDesc": "Router la connexion à travers un serveur proxy", - "proxyHost": "Hôte du Proxy", - "proxyPort": "Port du proxy", - "proxyUsername": "Nom d'utilisateur du proxy", - "proxyPassword": "Mot de passe du proxy", - "proxySingleMode": "Proxy unique", - "proxyChainMode": "Chaîne de Proxy", - "you": "Vous", - "jumpHostChainLabel": "Chaîne de saut d'hôte", - "addJumpBtn": "Ajouter un saut", - "noJumpHosts": "Aucun hôte de saut configuré.", - "selectAServer": "Sélectionnez un serveur...", - "sshPort": "Port SSH", - "authMethod": "Méthode d'authentification", - "storedCredential": "Identification enregistrée", - "selectACredential": "Sélectionnez un identifiant...", - "keyTypeLabel": "Type de clé", - "keyTypeAuto": "Détection automatique", - "keyPasteTab": "Coller", - "keyUploadTab": "Charger", - "keyFileLoaded": "Fichier de clé chargé", - "keyUploadClick": "Cliquez pour télécharger .pem / .key / .ppk", - "clearKey": "Effacer la clé", - "keySaved": "Clé SSH enregistrée", - "keyReplaceNotice": "collez une nouvelle clé ci-dessous pour la remplacer", - "keyPassphraseSaved": "Phrase de passe enregistrée, tapez pour changer", - "replaceKey": "Remplacer la clé", - "forceKeyboardInteractiveLabel": "Forcer l'interaction du clavier", - "forceKeyboardInteractiveShortDesc": "Forcer la saisie manuelle du mot de passe même si les clés sont présentes", - "terminalAppearance": "Apparence du terminal", - "colorTheme": "Thème de couleur", - "fontFamilyLabel": "Famille de police", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protocole", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Style du curseur", - "letterSpacingPx": "Espacement de la lettre (px)", - "lineHeightLabel": "Hauteur de la ligne", - "bellStyleLabel": "Style de la cloche", - "backspaceModeLabel": "Mode Retour arrière", - "cursorBlinking": "Clignotement du curseur", - "cursorBlinkingDesc": "Activer l'animation clignotant pour le curseur du terminal", - "rightClickSelectsWordLabel": "Clic droit sélectionne le mot", - "rightClickSelectsWordShortDesc": "Sélectionnez le mot sous le curseur sur le clic droit", - "behaviorAndAdvanced": "Comportement & Avancé", - "scrollbackBufferLabel": "Défilement du tampon", - "scrollbackMaxLines": "Nombre maximum de lignes conservées dans l'historique", - "sshAgentForwardingLabel": "Transfert d'Agent SSH", - "sshAgentForwardingShortDesc": "Transmettez vos clés SSH locales à cet hôte", - "enableAutoMosh": "Activer le Mosh automatique", - "enableAutoMoshDesc": "Préférer Mosh à SSH si disponible", - "enableAutoTmux": "Activer automatiquement Tmux", - "enableAutoTmuxDesc": "Lancer ou attacher automatiquement à la session tmux", - "sudoPasswordAutoFillLabel": "Remplissage automatique du mot de passe Sudo", - "sudoPasswordAutoFillShortDesc": "Fournir automatiquement le mot de passe sudo lorsque vous y êtes invité", - "sudoPasswordLabel": "Mot de passe Sudo", - "environmentVariablesLabel": "Variables d'environnement", - "addVariableBtn": "Ajouter une variable", - "noEnvVars": "Aucune variable d'environnement configurée.", - "fastScrollModifierLabel": "Modificateur de défilement rapide", - "fastScrollSensitivityLabel": "Sensibilité au défilement rapide", - "moshCommandLabel": "Commande Mosh", - "startupSnippetLabel": "Snippet de démarrage", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Intervalle de maintien en vie (secondes)", - "maxKeepaliveMisses": "Nombre max de manques de Keepalive", - "tunnelSettings": "Paramètres du tunnel", - "enableTunneling": "Activer le Tunneling", - "enableTunnelingDesc": "Activer les fonctionnalités du tunnel SSH pour cet hôte", - "serverTunnelsSection": "Tunnels serveur", - "addTunnelBtn": "Ajouter un tunnel", - "noTunnelsConfigured": "Aucun tunnel configuré.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", - "tunnelType": "Type de tunnel", - "tunnelModeLocalDesc": "Transférer un port local vers un port sur le serveur distant (ou un hôte accessible depuis celui-ci).", - "tunnelModeRemoteDesc": "Rediriger un port sur le serveur distant vers un port local sur votre machine.", - "tunnelModeDynamicDesc": "Créer un proxy SOCKS5 sur un port local pour une redirection de port dynamique.", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Cet hôte (tunnel direct)", - "endpointHost": "Hôte de point d'extrémité", - "endpointPort": "Port de terminaison", - "bindHost": "Lier l'hôte", - "sourcePort": "Port source", - "maxRetries": "Nombre maximum de tentatives", - "retryIntervalS": "Intervalle d'essai (s)", - "autoStartLabel": "Démarrage automatique", - "autoStartDesc": "Connecter automatiquement ce tunnel lorsque l'hôte est chargé", - "tunnelConnecting": "Connexion du tunnel...", - "tunnelDisconnected": "Tunnel déconnecté", - "failedToConnectTunnel": "Échec de la connexion", - "failedToDisconnectTunnel": "Échec de la déconnexion", - "dockerIntegration": "Intégration de Docker", - "enableDockerMonitor": "Activer Docker", - "enableDockerMonitorDesc": "Surveiller et gérer les conteneurs sur cet hôte via Docker", - "enableFileManagerMonitor": "Activer le gestionnaire de fichiers", - "enableFileManagerMonitorDesc": "Parcourir et gérer les fichiers sur cet hôte via SFTP", - "defaultPathLabel": "Chemin par défaut", - "fileManagerPathHint": "Le répertoire à ouvrir lorsque le gestionnaire de fichiers démarre pour cet hôte.", - "statusChecksLabel": "Contrôles de statut", - "enableStatusChecks": "Activer les vérifications de statut", - "enableStatusChecksDesc": "Passe périodiquement sur cet hôte pour vérifier la disponibilité", - "useGlobalInterval": "Utiliser l'intervalle global", - "useGlobalIntervalDesc": "Remplacer par l'intervalle de vérification de l'état du serveur", - "checkIntervalS": "Intervalle de vérification (s)", - "checkIntervalDesc": "Secondes entre chaque ping de connectivité", - "metricsCollectionLabel": "Collection de métriques", - "enableMetricsLabel": "Activer les métriques", - "enableMetricsDesc": "Collecter l'utilisation du CPU, de la RAM, du disque et du réseau depuis cet hôte", - "useGlobalMetrics": "Utiliser l'intervalle global", - "useGlobalMetricsDesc": "Remplacer par l'intervalle de métriques à l'échelle du serveur", - "metricsIntervalS": "Intervalle métrique (s)", - "metricsIntervalDesc2": "Secondes entre les instantanés métriques", - "visibleWidgets": "Widgets visibles", - "cpuUsageLabel": "Usage du CPU", - "cpuUsageDesc": "Pourcentage du processeur, charge moyenne, graphique de la ligne d'étincelles", - "memoryLabel": "Utilisation de la mémoire", - "memoryDesc": "Utilisation de la mémoire, swap, mise en cache", - "storageLabel": "Utilisation du disque", - "storageDesc": "Utilisation du disque par point de montage", - "networkLabel": "Interfaces réseau", - "networkDesc": "Liste des interfaces et bande passante", - "uptimeLabel": "Délai de disponibilité", - "uptimeDesc": "Durée de disponibilité et de démarrage du système", - "systemInfoLabel": "Infos système", - "systemInfoDesc": "OS, noyau, nom d'hôte, architecture", - "recentLoginsLabel": "Connexions récentes", - "recentLoginsDesc": "Événements de connexion réussis et échoués", - "topProcessesLabel": "Les meilleurs processus", - "topProcessesDesc": "PID, CPU%, MEM%, commande", - "listeningPortsLabel": "Ports d'écoute", - "listeningPortsDesc": "Ouvrir les ports avec processus et état", - "firewallLabel": "Pare-feu", - "firewallDesc": "Pare-feu, AppArmor, statut SELinux", - "quickActionsLabel": "Actions rapides", - "quickActionsToolbar": "Les actions rapides apparaissent sous forme de boutons dans la barre d'outils Stats du serveur pour l'exécution d'une commande en un clic.", - "noQuickActions": "Aucune action rapide pour le moment.", - "buttonLabel": "Libellé du bouton", - "selectSnippetPlaceholder": "Sélectionner un snippet...", - "addActionBtn": "Ajouter une action", - "hostSharedSuccessfully": "Hôte partagé avec succès", - "failedToShareHost": "Impossible de partager l'hôte", - "accessRevoked": "Accès révoqué", - "failedToRevokeAccess": "Impossible de révoquer l'accès", - "cancelBtn": "Abandonner", - "savingBtn": "Sauvegarde en cours...", - "addHostBtn": "Ajouter un hôte", - "hostUpdated": "Hôte mis à jour", - "hostCreated": "Hôte créé", - "failedToSave": "Échec de l'enregistrement de l'hôte", - "credentialUpdated": "Identification mise à jour", - "credentialCreated": "Identification créée", - "failedToSaveCredential": "Échec de l'enregistrement des informations d'identification", - "backToHosts": "Retour aux hôtes", - "backToCredentials": "Retour aux informations d'identification", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Mot de passe", + "authTypeKey": "Clé SSH", + "authTypeCredential": "Attestation", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Aucun", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Annuler", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Épinglé", - "noHostsFound": "Aucun hôte trouvé", - "tryDifferentTerm": "Essayez un terme différent", - "addFirstHost": "Ajoutez votre premier hôte pour commencer", - "noCredentialsFound": "Aucun identifiant trouvé", - "addCredentialBtn": "Ajouter un mot de passe", - "updateCredentialBtn": "Mettre à jour les informations d'identification", - "features": "Fonctionnalités", - "noFolder": "(Aucun dossier)", - "deleteSelected": "Supprimez", - "exitSelection": "Quitter la sélection", - "importSkip": "Importer (sauter le existant)", - "importOverwrite": "Importer (écraser)", - "collapseBtn": "Réduire", - "importExportBtn": "Importer/Exporter", - "hostStatusesRefreshed": "Statuts de l'hôte actualisés", - "failedToRefreshHosts": "Échec de l'actualisation des hôtes", - "movedHostTo": "A déplacé {{host}} vers \"{{folder}}\"", - "failedToMoveHost": "Impossible de déplacer l'hôte", - "folderRenamedTo": "Dossier renommé en \"{{name}}\"", - "deletedFolder": "Dossier \"{{name}} \" supprimé", - "failedToDeleteFolder": "Échec de la suppression du dossier", - "deleteAllInFolder": "Supprimer tous les hôtes de \"{{name}}\" ? Cette action est irréversible.", - "deletedHost": "Supprimé {{name}}", - "copiedToClipboard": "Copié dans le presse-papiers", - "terminalUrlCopied": "URL du terminal copiée", - "fileManagerUrlCopied": "URL du gestionnaire de fichiers copiée", - "tunnelUrlCopied": "URL du tunnel copiée", - "dockerUrlCopied": "URL de Docker copiée", - "serverStatsUrlCopied": "URL des statistiques du serveur copiée", - "rdpUrlCopied": "URL RDP copiée", - "vncUrlCopied": "URL VNC copiée", - "telnetUrlCopied": "URL Telnet copiée", - "remoteDesktopUrlCopied": "URL du bureau distant copiée", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Caractéristiques", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Annuler", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Statut", + "GroupByProtocol": "Protocole", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Développer les actions", "collapseActions": "Actions d'effondrement", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Paquet magique envoyé à {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Échec de l'envoi du paquet magique", - "cloneHostAction": "Cloner l'hôte", - "copyAddress": "Copier l'adresse", - "copyLink": "Copier le lien", - "copyTerminalUrlAction": "Copier l'URL du terminal", - "copyFileManagerUrlAction": "Copier l'URL du gestionnaire de fichiers", - "copyTunnelUrlAction": "Copier l'URL du tunnel", - "copyDockerUrlAction": "Copier l'URL de Docker", - "copyServerStatsUrlAction": "Copier l'URL des statistiques du serveur", - "copyRdpUrlAction": "Copier l'URL RDP", - "copyVncUrlAction": "Copier l'URL VNC", - "copyTelnetUrlAction": "Copier l'URL Telnet", - "copyRemoteDesktopUrlAction": "Copier l'URL du bureau distant", - "deleteCredentialConfirm": "Supprimer les identifiants \"{{name}} \" ?", - "deletedCredential": "Supprimé {{name}}", - "deploySSHKeyTitle": "Déployer la clé SSH", - "deployingBtn": "Déploiement...", - "deployBtn": "Déployer", - "failedToDeployKey": "Échec du déploiement de la clé", - "deleteHostsConfirm": "Supprimer l'hôte {{count}}{{plural}}? Cette action est irréversible.", - "movedToRoot": "Déplacé vers la racine", - "failedToMoveHosts": "Impossible de déplacer les hôtes", - "enableTerminalFeature": "Activer le Terminal", - "disableTerminalFeature": "Désactiver le terminal", - "enableFilesFeature": "Activer les fichiers", - "disableFilesFeature": "Désactiver les fichiers", - "enableTunnelsFeature": "Activer les tunnels", - "disableTunnelsFeature": "Désactiver les tunnels", - "enableDockerFeature": "Activer Docker", - "disableDockerFeature": "Désactiver Docker", - "addTagsPlaceholder": "Ajouter des tags...", - "authDetails": "Détails d'authentification", - "credType": "Type de texte", - "generateKeyPairDesc": "Générer une nouvelle paire de clés, les clés privées et publiques seront remplies automatiquement.", - "generatingKey": "Génération en cours...", - "generateLabel": "Générer {{label}}", - "uploadFileBtn": "Charger un fichier", - "keyPassphraseOptional": "Phrase de passe de la clé (facultatif)", - "sshPublicKeyOptional": "Clé publique SSH (facultatif)", - "publicKeyGenerated": "Clé publique générée", - "failedToGeneratePublicKey": "Impossible de dériver la clé publique", - "publicKeyCopied": "Clé publique copiée", - "keyPairGenerated": "{{label}} paire de clés générée", - "failedToGenerateKeyPair": "Impossible de générer la paire de clés", - "searchHostsPlaceholder": "Rechercher des hôtes, adresses, tags…", - "searchCredentialsPlaceholder": "Rechercher les identifiants…", - "refreshBtn": "Rafraîchir", - "addTag": "Ajouter des tags...", - "deleteConfirmBtn": "Supprimez", - "tunnelRequirementsText": "Le serveur SSH doit avoir GatewayPorts yes, AllowTcpForwarding oui, et PermitRootLogin yes défini dans /etc/ssh/sshd_config.", - "deleteHostConfirm": "Supprimer \"{{name}}\" ?", - "enableAtLeastOneProtocol": "Activez au moins un protocole ci-dessus pour configurer les paramètres d'authentification et de connexion.", - "keyPassphrase": "Mot de passe de la clé", - "connectBtn": "Connecter", - "disconnectBtn": "Déconnecter", - "basicInformation": "Informations de base", - "authDetailsSection": "Détails d'authentification", - "credTypeLabel": "Type de texte", - "hostsTab": "Hôtes", - "credentialsTab": "Identifiants", - "selectMultiple": "Sélectionner plusieurs", - "selectHosts": "Sélectionner les hôtes", - "connectionLabel": "Raccordement", - "authenticationLabel": "Authentification", - "generateKeyPairTitle": "Générer une paire de clés", - "generateKeyPairDescription": "Générer une nouvelle paire de clés, les clés privées et publiques seront remplies automatiquement.", - "generateFromPrivateKey": "Générer à partir de la clé privée", - "refreshBtn2": "Rafraîchir", - "exitSelectionTitle": "Quitter la sélection", - "exportAll": "Exporter tout", - "addHostBtn2": "Ajouter un hôte", - "addCredentialBtn2": "Ajouter un mot de passe", - "checkingHostStatuses": "Vérification des statuts des hôtes...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Épinglé", - "hostsExported": "Hôtes exportés avec succès", + "hostsExported": "Hosts exported successfully", "exportFailed": "Échec de l'exportation des hôtes", - "sampleDownloaded": "Exemple de fichier téléchargé", - "failedToDeleteCredential2": "Échec de la suppression des identifiants", - "noFolderOption": "(Aucun dossier)", - "nSelected": "{{count}} sélectionné", - "featuresMenu": "Fonctionnalités", - "moveMenu": "Déplacer", - "cancelSelection": "Abandonner", - "deployDialogDesc": "Déployer {{name}} sur les clefs authorized_keys d'un hôte.", - "targetHostLabel": "Hôte cible", - "selectHostOption": "Sélectionnez un hôte...", - "keyDeployedSuccess": "Clé déployée avec succès", - "failedToDeployKey2": "Échec du déploiement de la clé", - "deletedCount": "Hôtes {{count}} supprimés", - "failedToDeleteCount": "Impossible de supprimer les hôtes {{count}}", - "duplicatedHost": "Dupliqué \"{{name}}\"", - "failedToDuplicateHost": "Impossible de dupliquer l'hôte", - "updatedCount": "Hôtes {{count}} mis à jour", - "friendlyNameLabel": "Nom convivial", - "descriptionLabel": "Libellé", - "loadingHost": "Chargement de l'hôte...", - "loadingHosts": "Chargement des hôtes...", - "loadingCredentials": "Chargement des identifiants...", - "noHostsYet": "Pas encore d'hôtes", - "noHostsMatchSearch": "Aucun hôte ne correspond à votre recherche", - "hostNotFound": "Hôte introuvable", - "searchHosts": "Rechercher des hôtes...", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Caractéristiques", + "moveMenu": "Se déplacer", + "connectSelected": "Connect", + "cancelSelection": "Annuler", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Trier les hôtes", "sortDefault": "Ordre par défaut", "sortNameAsc": "Nom (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "Étiquettes", - "shareHost": "Partager l'hôte", - "shareHostTitle": "Partager: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Cet hôte doit utiliser un identifiant pour activer le partage. Modifiez l'hôte et assignez d'abord un identifiant." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Raccordement", - "authentication": "Authentification", - "connectionSettings": "Paramètres de connexion", - "displaySettings": "Paramètres d'affichage", - "audioSettings": "Paramètres audio", - "rdpPerformance": "Performance RDP", - "deviceRedirection": "Redirection de l'appareil", - "session": "Séance", - "gateway": "Passerelle", - "remoteApp": "Application distante", - "clipboard": "Presse-papiers", - "sessionRecording": "Enregistrement de session", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Attestation", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Paramètres VNC", - "terminalSettings": "Paramètres du terminal", - "rdpPort": "Port RDP", - "username": "Nom d'utilisateur", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Mot de passe", - "domain": "Domaine", - "securityMode": "Mode de sécurité", - "colorDepth": "Profondeur des couleurs", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Hauteur", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Redimensionner la méthode", - "clientName": "Nom du client", - "initialProgram": "Programme initial", - "serverLayout": "Mise en page du serveur", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Port de la passerelle", - "gatewayUsername": "Nom d'utilisateur de la passerelle", - "gatewayPassword": "Mot de passe de la passerelle", - "gatewayDomain": "Domaine de la passerelle", - "remoteAppProgram": "Programme RemoteApp", - "workingDirectory": "Répertoire de travail", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", "arguments": "Arguments", - "normalizeLineEndings": "Normaliser les terminaisons de ligne", - "recordingPath": "Chemin de l'enregistrement", - "recordingName": "Nom de l'enregistrement", - "macAddress": "Adresse MAC", - "broadcastAddress": "Adresse de diffusion", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Temps d'attente (s)", - "driveName": "Nom du lecteur", - "drivePath": "Chemin du lecteur", - "ignoreCertificate": "Ignorer le certificat", - "ignoreCertificateDesc": "Autoriser les connexions aux hôtes avec des certificats auto-signés", - "forceLossless": "Forcer sans perte", - "forceLosslessDesc": "Forcer l'encodage sans perte d'image (meilleure qualité, plus de bande passante)", - "disableAudio": "Désactiver l'audio", - "disableAudioDesc": "Couper tous les sons de la session distante", - "enableAudioInput": "Activer la saisie audio (Microphone)", - "enableAudioInputDesc": "Transférer le microphone local vers la session distante", - "wallpaper": "Fond d'écran", - "wallpaperDesc": "Afficher le fond d'écran du bureau (désactiver améliore les performances)", - "theming": "Thème", - "themingDesc": "Activer les thèmes et styles visuels", - "fontSmoothing": "Lissage de la police", - "fontSmoothingDesc": "Activer le rendu de police ClearType", - "fullWindowDrag": "Glisser la fenêtre entière", - "fullWindowDragDesc": "Afficher le contenu de la fenêtre en faisant glisser", - "desktopComposition": "Composition de bureau", - "desktopCompositionDesc": "Activer les effets de verre Aero", - "menuAnimations": "Animations du menu", - "menuAnimationsDesc": "Activer les animations de fondu du menu et de diapositives", - "disableBitmapCaching": "Désactiver la mise en cache des Bitmaps", - "disableBitmapCachingDesc": "Désactiver le cache bitmap (peut aider à résoudre les bugs)", - "disableOffscreenCaching": "Désactiver la mise en cache hors écran", - "disableOffscreenCachingDesc": "Désactiver le cache de l'écran", - "disableGlyphCaching": "Désactiver la mise en cache des glyphes", - "disableGlyphCachingDesc": "Désactiver le cache des glyphes", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Utiliser le pipeline graphique de RemoteFX", - "enablePrinting": "Activer l'impression", - "enablePrintingDesc": "Rediriger les imprimantes locales vers la session distante", - "enableDriveRedirection": "Activer la redirection du lecteur", - "enableDriveRedirectionDesc": "Mapper un dossier local en tant que lecteur dans la session distante", - "createDrivePath": "Créer un chemin d'accès", - "createDrivePathDesc": "Créer automatiquement le dossier s'il n'existe pas", - "disableDownload": "Désactiver le téléchargement", - "disableDownloadDesc": "Empêcher le téléchargement des fichiers de la session distante", - "disableUpload": "Désactiver le téléchargement", - "disableUploadDesc": "Empêcher le téléversement de fichiers vers la session distante", - "enableTouch": "Activer le Toucher", - "enableTouchDesc": "Activer le transfert tactile", - "consoleSession": "Session de la console", - "consoleSessionDesc": "Se connecter à la console (session 0) au lieu d'une nouvelle session", - "sendWolPacket": "Envoyer le paquet WOL", - "sendWolPacketDesc": "Envoyer un paquet magique pour réveiller cet hôte avant de se connecter", - "disableCopy": "Désactiver la copie", - "disableCopyDesc": "Empêcher la copie du texte de la session distante", - "disablePaste": "Désactiver Coller", - "disablePasteDesc": "Empêcher le collage du texte dans la session distante", - "createPathIfMissing": "Créer un chemin si manquant", - "createPathIfMissingDesc": "Créer automatiquement le répertoire d'enregistrement", - "excludeOutput": "Exclure la sortie", - "excludeOutputDesc": "Ne pas enregistrer la sortie de l'écran (métadonnées seulement)", - "excludeMouse": "Exclure la souris", - "excludeMouseDesc": "Ne pas enregistrer les mouvements de la souris", - "includeKeystrokes": "Inclure les touches", - "includeKeystrokesDesc": "Enregistrer les traits de touches brutes en plus de la sortie de l'écran", - "vncPort": "Port VNC", - "vncPassword": "Mot de passe VNC", - "vncUsernameOptional": "Nom d'utilisateur (facultatif)", - "vncLeaveBlank": "Laisser vide si non requis", - "cursorMode": "Mode Curseur", - "swapRedBlue": "Échanger Rouge/Bleu", - "swapRedBlueDesc": "Inverser les canaux de couleur rouge et bleu (corrige quelques problèmes de couleur)", - "readOnly": "Lecture seule", - "readOnlyDesc": "Afficher l'écran distant sans envoyer de saisie", - "telnetPort": "Port Telnet", - "terminalType": "Type de terminal", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Schéma de couleurs", - "backspaceKey": "Clé de Retour arrière", - "saveHostFirst": "Enregistrez d'abord l'hôte.", - "sharingOptionsAfterSave": "Les options de partage sont disponibles après l'enregistrement de l'hôte.", - "sharingLoadError": "Impossible de charger les données de partage. Vérifiez votre connexion et réessayez.", - "shareHostSection": "Partager l'hôte", - "shareWithUser": "Partager avec l'utilisateur", - "shareWithRole": "Partager avec le rôle", - "selectUser": "Sélectionner un utilisateur", - "selectRole": "Sélectionner un rôle", - "selectUserOption": "Sélectionnez un utilisateur...", - "selectRoleOption": "Sélectionnez un rôle...", - "permissionLevel": "Niveau de permission", - "expiresInHours": "Expire dans (heures)", - "noExpiryPlaceholder": "Laisser vide pour aucune expiration", - "shareBtn": "Partager", - "currentAccess": "Accès actuel", - "typeHeader": "Type de texte", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", "permissionHeader": "Permission", - "grantedByHeader": "Accepté par", - "expiresHeader": "Expire", - "noAccessEntries": "Pas encore d'entrées d'accès.", - "expiredLabel": "Expiré", - "neverLabel": "Jamais", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Abandonner", - "savingBtn": "Sauvegarde en cours...", - "updateHostBtn": "Mettre à jour l'hôte", - "addHostBtn": "Ajouter un hôte" + "cancelBtn": "Annuler", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Rechercher des hôtes, des commandes ou des paramètres...", - "quickActions": "Actions rapides", - "hostManager": "Responsable d'hôte", - "hostManagerDesc": "Gérer, ajouter ou éditer des hôtes", - "addNewHost": "Ajouter un nouvel hôte", - "addNewHostDesc": "Enregistrer un nouvel hôte", - "adminSettings": "Paramètres de l'administrateur", - "adminSettingsDesc": "Configurer les préférences système et les utilisateurs", - "userProfile": "Profil de l'utilisateur", - "userProfileDesc": "Gérer votre compte et vos préférences", - "addCredential": "Ajouter un mot de passe", - "addCredentialDesc": "Stocker les clés SSH ou les mots de passe", - "recentActivity": "Activité récente", - "serversAndHosts": "Serveurs & Hôtes", - "noHostsFound": "Aucun hôte ne correspond à \"{{search}}\"", - "links": "Liens", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Sélectionner", - "toggleWith": "Basculer avec" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Aucun onglet assigné", + "noTabAssigned": "No tab assigned", "focusedPane": "Volet actif" }, "connections": { "noConnections": "Aucune connexion", "noConnectionsDesc": "Ouvrez un terminal, un gestionnaire de fichiers ou un bureau à distance pour voir les connexions ici.", - "connectedFor": "Connecté pour {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Connecté", "disconnected": "Déconnecté", "closeTab": "Fermer l'onglet", @@ -801,358 +981,374 @@ "sectionBackground": "Arrière-plan", "backgroundDesc": "Les sessions restent actives pendant 30 minutes après la déconnexion et peuvent être reconnectées.", "persisted": "Persistant en arrière-plan", - "expiresIn": "Expire dans {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Rechercher des connexions...", - "noSearchResults": "Aucun résultat ne correspond à votre recherche" + "noSearchResults": "Aucun résultat ne correspond à votre recherche", + "rename": "Rename session" }, "guacamole": { - "connecting": "Connexion à la session {{type}}...", - "connectionError": "Erreur de connexion", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Échec de la connexion", - "failedToConnect": "Impossible d'obtenir le jeton de connexion", - "hostNotFound": "Hôte introuvable", - "noHostSelected": "Aucun hôte sélectionné", - "reconnect": "Reconnecter", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", "retry": "Réessayer", - "guacdUnavailable": "Le service de bureau à distance (guacd) n'est pas disponible. Veuillez vous assurer que guacd fonctionne et est accessible et configuré correctement dans les paramètres d'administration.", - "ctrlAltDel": "Ctrl+Alt+Suppr", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", + "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { - "ctrlAltDel": "Ctrl+Alt+Suppr", - "winL": "Win+L (Écran de verrouillage)", - "winKey": "Clé Windows", + "ctrlAltDel": "Ctrl+Alt+Del", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Maj", - "win": "Victoire", - "stickyActive": "{{key}} (accroché - cliquez pour libérer)", - "stickyInactive": "{{key}} (cliquez pour verrouiller)", - "esc": "Échapper", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Domicile", - "end": "Fin", - "pageUp": "Page Haut", - "pageDown": "Page Bas", - "arrowUp": "Flèche vers le haut", - "arrowDown": "Flèche vers le bas", - "arrowLeft": "Flèche Gauche", - "arrowRight": "Flèche droite", - "fnToggle": "Touches de fonction", - "reconnect": "Reconnecter la session", - "collapse": "Réduire la barre d'outils", - "expand": "Développer la barre d'outils", - "dragHandle": "Faites glisser pour repositionner" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Se connecter à l'hôte", - "clear": "Nettoyer", - "paste": "Coller", - "reconnect": "Reconnecter", - "connectionLost": "Connexion perdue", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", + "connectionLost": "Connection lost", "connected": "Connecté", - "clipboardWriteFailed": "Échec de la copie dans le presse-papiers. Assurez-vous que la page est servie via HTTPS ou localhost.", - "clipboardReadFailed": "Échec de lecture du presse-papiers. Assurez-vous que les permissions du presse-papiers sont accordées.", - "clipboardHttpWarning": "Coller nécessite HTTPS. Utilisez Ctrl+Maj+V ou servir Termix via HTTPS.", - "unknownError": "Une erreur inconnue s'est produite", - "websocketError": "Erreur de connexion WebSocket", - "connecting": "Connexion en cours...", - "noHostSelected": "Aucun hôte sélectionné", - "reconnecting": "Reconnexion en cours... ({{attempt}}/{{max}})", - "reconnected": "Reconnexion réussie", - "tmuxSessionCreated": "session tmux créée : {{name}}", - "tmuxSessionAttached": "Session tmux attachée : {{name}}", - "tmuxUnavailable": "tmux n'est pas installé sur l'hôte distant, passant à l'interpréteur de commandes standard", - "tmuxSessionPickerTitle": "Sessions tmux", - "tmuxSessionPickerDesc": "Sessions tmux existantes trouvées sur cet hôte. Sélectionnez-en une pour réattacher ou créer une nouvelle session.", - "tmuxWindows": "Fenêtres", - "tmuxWindowCount": "Fenêtre {{count}}", - "tmuxAttached": "Clients attachés", - "tmuxAttachedCount": "{{count}} attaché", - "tmuxLastActivity": "Dernière activité", - "tmuxTimeJustNow": "à l'instant", - "tmuxTimeMinutes": "{{count}}il y a m", - "tmuxTimeHours": "{{count}}il y a h", - "tmuxTimeDays": "{{count}}il y a j jours", - "tmuxCreateNew": "Démarrer une nouvelle session", - "tmuxCopyHint": "Ajuster la sélection et appuyer sur Entrée pour copier dans le presse-papiers", - "tmuxDetach": "Détacher de la session tmux", - "tmuxDetached": "Détaché de la session tmux", - "maxReconnectAttemptsReached": "Nombre maximum de tentatives de reconnexion atteint", - "closeTab": "Fermer", - "connectionTimeout": "Délai de connexion dépassé", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Exécution {{command}} - {{host}}", - "totpRequired": "Authentification à deux facteurs requise", - "totpCodeLabel": "Code de vérification", - "totpVerify": "Vérifier", - "warpgateAuthRequired": "Authentification de Warpgate requise", - "warpgateSecurityKey": "Clé de sécurité", - "warpgateAuthUrl": "URL d'authentification", - "warpgateOpenBrowser": "Ouvrir dans le navigateur", - "warpgateContinue": "J'ai terminé l'authentification", - "opksshAuthRequired": "Authentification OPKSSH requise", - "opksshAuthDescription": "Authentification complète dans votre navigateur pour continuer. Cette session restera valide pendant 24 heures.", - "opksshOpenBrowser": "Ouvrez le navigateur pour vous authentifier", - "opksshWaitingForAuth": "En attente d'authentification dans le navigateur...", - "opksshAuthenticating": "Traitement de l'authentification...", - "opksshTimeout": "Délai d'authentification dépassé. Veuillez réessayer.", - "opksshAuthFailed": "L'authentification a échoué. Veuillez vérifier vos identifiants et réessayer.", - "opksshSignInWith": "Connectez-vous avec {{provider}}", - "sudoPasswordPopupTitle": "Insérer un mot de passe ?", - "websocketAbnormalClose": "Connexion fermée de manière inattendue. Cela peut être dû à un problème de proxy inversé ou de configuration SSL. Veuillez vérifier les journaux du serveur.", - "connectionLogTitle": "Journal de connexion", - "connectionLogCopy": "Copier les logs dans le presse-papiers", - "connectionLogEmpty": "Aucun journal de connexion pour l'instant", - "connectionLogWaiting": "En attente de logs de connexion...", - "connectionLogCopied": "Journaux de connexion copiés dans le presse-papiers", - "connectionLogCopyFailed": "Impossible de copier les logs dans le presse-papiers", - "connectionRejected": "Connexion refusée par le serveur. Veuillez vérifier votre authentification et la configuration du réseau.", - "hostKeyRejected": "La vérification de la clé d'hôte SSH a été rejetée. La connexion a été annulée.", - "sessionTakenOver": "La session a été ouverte dans un autre onglet. Reconnexion..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Ouvrir", + "linkDialogCopy": "Copie", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Onglet fractionné", + "addToSplit": "Ajouter au fractionnement", + "removeFromSplit": "Retirer de la division" + } }, "fileManager": { - "noHostSelected": "Aucun hôte sélectionné", - "initializingEditor": "Initialisation de l'éditeur...", - "file": "Fichier", - "folder": "Répertoire", - "uploadFile": "Charger un fichier", - "downloadFile": "Télécharger", - "extractArchive": "Extraire les archives", - "extractingArchive": "Extraction de {{name}}...", - "archiveExtractedSuccessfully": "{{name}} extrait avec succès", - "extractFailed": "L'extraction a échoué", - "compressFile": "Compresser le fichier", - "compressFiles": "Compresser les fichiers", - "compressFilesDesc": "Compresser les éléments {{count}} dans une archive", - "archiveName": "Nom de l'archive", - "enterArchiveName": "Entrez le nom de l'archive...", - "compressionFormat": "Format de compression", - "selectedFiles": "Fichiers sélectionnés", - "andMoreFiles": "et {{count}} de plus...", - "compress": "Compresser", - "compressingFiles": "Compression des éléments {{count}} en {{name}}...", - "filesCompressedSuccessfully": "{{name}} créé avec succès", - "compressFailed": "La compression a échoué", - "edit": "Editer", - "preview": "Aperçu", - "previous": "Précédent", - "next": "Suivant", - "pageXOfY": "Page {{current}} de {{total}}", - "zoomOut": "Zoom arrière", - "zoomIn": "Zoom avant", - "newFile": "Nouveau fichier", - "newFolder": "Nouveau dossier", - "rename": "Renommer", - "uploading": "Téléversement...", - "uploadingFile": "Envoi de {{name}}...", - "fileName": "Nom du fichier", - "folderName": "Nom du dossier", - "fileUploadedSuccessfully": "Le fichier «{{name}}» a été téléchargé avec succès", - "failedToUploadFile": "Impossible de télécharger le fichier", - "fileDownloadedSuccessfully": "Le fichier «{{name}}» a été téléchargé avec succès", - "failedToDownloadFile": "Impossible de télécharger le fichier", - "fileCreatedSuccessfully": "Le fichier \"{{name}}\" a été créé avec succès", - "folderCreatedSuccessfully": "Le dossier \"{{name}}\" a été créé avec succès", - "failedToCreateItem": "Impossible de créer l'élément", - "operationFailed": "L'opération {{operation}} a échoué pour {{name}}: {{error}}", - "failedToResolveSymlink": "Impossible de résoudre le lien symbolique", - "itemsDeletedSuccessfully": "Les éléments {{count}} ont été supprimés avec succès", - "failedToDeleteItems": "Impossible de supprimer les éléments", - "sudoPasswordRequired": "Mot de passe de l'administrateur requis", - "enterSudoPassword": "Entrez le mot de passe sudo pour continuer cette opération", - "sudoPassword": "Mot de passe Sudo", - "sudoOperationFailed": "L'opération Sudo a échoué", - "sudoAuthFailed": "L'authentification de Sudo a échoué", - "dragFilesToUpload": "Déposez les fichiers ici pour les télécharger", - "emptyFolder": "Ce dossier est vide", - "searchFiles": "Rechercher des fichiers...", - "upload": "Charger", - "selectHostToStart": "Sélectionnez un hôte pour démarrer la gestion des fichiers", - "sshRequiredForFileManager": "Le gestionnaire de fichiers nécessite SSH. Cet hôte n'a pas de SSH activé.", - "failedToConnect": "Impossible de se connecter à SSH", - "failedToLoadDirectory": "Impossible de charger le répertoire", - "noSSHConnection": "Aucune connexion SSH disponible", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "copy": "Copie", - "cut": "Couper", - "paste": "Coller", - "copyPath": "Copier le chemin", - "copyPaths": "Copier les chemins", - "delete": "Supprimez", - "properties": "Propriétés", - "refresh": "Rafraîchir", - "downloadFiles": "Télécharger les fichiers {{count}} vers le navigateur", - "copyFiles": "Copier les éléments {{count}}", - "cutFiles": "Couper les éléments {{count}}", - "deleteFiles": "Supprimer les éléments {{count}}", - "filesCopiedToClipboard": "Les éléments {{count}} ont été copiés dans le presse-papiers", - "filesCutToClipboard": "{{count}} éléments découpés dans le presse-papiers", - "pathCopiedToClipboard": "Chemin copié dans le presse-papiers", - "pathsCopiedToClipboard": "Chemins {{count}} copiés dans le presse-papiers", - "failedToCopyPath": "Impossible de copier le chemin vers le presse-papiers", - "movedItems": "Éléments {{count}} déplacés", - "failedToDeleteItem": "Échec de la suppression de l'élément", - "itemRenamedSuccessfully": "{{type}} renommé avec succès", - "failedToRenameItem": "Impossible de renommer l'élément", - "download": "Télécharger", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", "permissions": "Permissions", - "size": "Taille", - "modified": "Modifié", - "path": "Chemin d'accès", - "confirmDelete": "Êtes-vous sûr de vouloir supprimer {{name}}?", - "permissionDenied": "Autorisation refusée", - "serverError": "Erreur serveur", - "fileSavedSuccessfully": "Fichier enregistré avec succès", - "failedToSaveFile": "Échec de l'enregistrement du fichier", - "confirmDeleteSingleItem": "Êtes-vous sûr de vouloir supprimer définitivement \"{{name}} \" ?", - "confirmDeleteMultipleItems": "Êtes-vous sûr de vouloir supprimer définitivement les éléments {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Êtes-vous sûr de vouloir supprimer définitivement les éléments {{count}} ? Cela inclut les dossiers et leur contenu.", - "confirmDeleteFolder": "Êtes-vous sûr de vouloir supprimer définitivement le dossier \"{{name}}\" et tout son contenu ?", - "permanentDeleteWarning": "Cette action ne peut pas être annulée. Le(s) élément(s) seront définitivement supprimés du serveur.", - "recent": "Récentes", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Épinglé", - "folderShortcuts": "Raccourcis du dossier", - "failedToReconnectSSH": "Échec de la reconnexion de la session SSH", - "openTerminalHere": "Ouvrir le Terminal ici", - "run": "Exécuter", - "openTerminalInFolder": "Ouvrir le terminal dans ce dossier", - "openTerminalInFileLocation": "Ouvrir le terminal à l'emplacement du fichier", - "runningFile": "En cours d'exécution - {{file}}", - "onlyRunExecutableFiles": "Peut uniquement exécuter des fichiers exécutables", - "directories": "Répertoires", - "removedFromRecentFiles": "Suppression de «{{name}}» des fichiers récents", - "removeFailed": "La suppression a échoué", - "unpinnedSuccessfully": "Déépinglé avec succès \"{{name}}\"", - "unpinFailed": "Échec de la dépinglage", - "removedShortcut": "Raccourci \"{{name}} \" supprimé", - "removeShortcutFailed": "La suppression du raccourci a échoué", - "clearedAllRecentFiles": "Tous les fichiers récents ont été effacés", - "clearFailed": "Échec de l'effacement", - "removeFromRecentFiles": "Supprimer des fichiers récents", - "clearAllRecentFiles": "Effacer tous les fichiers récents", - "unpinFile": "Désépingler fichier", - "removeShortcut": "Supprimer le raccourci", - "pinFile": "Épingler le fichier", - "addToShortcuts": "Ajouter aux raccourcis", - "pasteFailed": "Échec du collage", - "noUndoableActions": "Aucune action annulable", - "undoCopySuccess": "Opération de copie annulée : fichiers copiés {{count}} supprimés", - "undoCopyFailedDelete": "Échec de l'annulation : impossible de supprimer les fichiers copiés", - "undoCopyFailedNoInfo": "Échec de l'annulation : impossible de trouver les informations sur le fichier copié", - "undoMoveSuccess": "Opération de déplacement annulée : les fichiers {{count}} ont été déplacés vers l'emplacement d'origine", - "undoMoveFailedMove": "Échec de l'annulation : impossible de déplacer les fichiers en arrière", - "undoMoveFailedNoInfo": "Échec de l'annulation : impossible de trouver les informations sur le fichier déplacé", - "undoDeleteNotSupported": "L'opération de suppression ne peut pas être annulée : les fichiers ont été définitivement supprimés du serveur", - "undoTypeNotSupported": "Type d'opération d'annulation non pris en charge", - "undoOperationFailed": "Échec de l'annulation de l'opération", - "unknownError": "Erreur inconnue", - "confirm": "Valider", - "find": "Rechercher...", - "replace": "Remplacer", - "downloadInstead": "Télécharger plutôt", - "keyboardShortcuts": "Raccourcis clavier", - "searchAndReplace": "Recherche & Remplacer", - "editing": "Édition en cours", - "search": "Chercher", - "findNext": "Rechercher suivant", - "findPrevious": "Trouver le Précédent", - "save": "Enregistrer", - "selectAll": "Tout sélectionner", - "undo": "Annuler", - "redo": "Refaire", - "moveLineUp": "Déplacer la ligne vers le haut", - "moveLineDown": "Déplacer la ligne vers le bas", - "toggleComment": "Basculer le commentaire", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Courir", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Impossible de charger l'image", - "startTyping": "Commencez à taper...", - "unknownSize": "Taille inconnue", - "fileIsEmpty": "Le fichier est vide", - "largeFileWarning": "Avertissement de fichier volumineux", - "largeFileWarningDesc": "Ce fichier est de taille {{size}} en taille, ce qui peut causer des problèmes de performance lorsqu'il est ouvert en tant que texte.", - "fileNotFoundAndRemoved": "Le fichier «{{name}}» est introuvable et a été supprimé des fichiers récents/épinglés", - "failedToLoadFile": "Impossible de charger le fichier : {{error}}", - "serverErrorOccurred": "Une erreur de serveur s'est produite. Veuillez réessayer plus tard.", - "autoSaveFailed": "Échec de la sauvegarde automatique", - "fileAutoSaved": "Fichier enregistré automatiquement", - "moveFileFailed": "Impossible de déplacer {{name}}", - "moveOperationFailed": "Échec de l'opération de déplacement", - "canOnlyCompareFiles": "Peut seulement comparer deux fichiers", - "comparingFiles": "Comparaison des fichiers : {{file1}} et {{file2}}", - "dragFailed": "Échec de l'opération de glissement", - "filePinnedSuccessfully": "Le fichier \"{{name}}\" a été épinglé avec succès", - "pinFileFailed": "Impossible d'épingler le fichier", - "fileUnpinnedSuccessfully": "Le fichier \"{{name}}\" a été déépinglé avec succès", - "unpinFileFailed": "Échec de la déverrouillage du fichier", - "shortcutAddedSuccessfully": "Raccourci du dossier \"{{name}}\" ajouté avec succès", - "addShortcutFailed": "Impossible d'ajouter le raccourci", - "operationCompletedSuccessfully": "{{operation}} {{count}} éléments avec succès", - "operationCompleted": "Articles {{operation}} {{count}}", - "downloadFileSuccess": "Fichier {{name}} téléchargé avec succès", - "downloadFileFailed": "Échec du téléchargement", - "moveTo": "Déplacer vers {{name}}", - "diffCompareWith": "Comparaison de différences avec {{name}}", - "dragOutsideToDownload": "Faites glisser vers l'extérieur de la fenêtre pour télécharger (fichiers{{count}})", - "newFolderDefault": "Nouveau dossier", - "newFileDefault": "Nouveau fichier.txt", - "successfullyMovedItems": "Les éléments {{count}} ont été déplacés avec succès vers {{target}}", - "move": "Déplacer", - "searchInFile": "Rechercher dans le fichier (Ctrl+F)", - "showKeyboardShortcuts": "Afficher les raccourcis clavier", - "startWritingMarkdown": "Commencez à écrire votre contenu de markdown...", - "loadingFileComparison": "Chargement de la comparaison de fichiers...", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Se déplacer", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Comparer", - "sideBySide": "Côté à côte", - "inline": "En ligne", - "fileComparison": "Comparaison de fichiers : {{file1}} vs {{file2}}", - "fileTooLarge": "Fichier trop volumineux: {{error}}", - "sshConnectionFailed": "La connexion SSH a échoué. Veuillez vérifier votre connexion à {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Impossible de charger le fichier : {{error}}", - "connecting": "Connexion en cours...", - "connectedSuccessfully": "Connecté avec succès", - "totpVerificationFailed": "La vérification TOTP a échoué", - "warpgateVerificationFailed": "Échec de l'authentification de Warpgate", - "authenticationFailed": "Échec de l'authentification", - "verificationCodePrompt": "Code de vérification :", - "changePermissions": "Modifier les permissions", - "currentPermissions": "Autorisations actuelles", - "owner": "Propriétaire", - "group": "Groupes", - "others": "Autres", - "read": "Lu", - "write": "Écrire", - "execute": "Exécuter", - "permissionsChangedSuccessfully": "Permissions modifiées avec succès", - "failedToChangePermissions": "Impossible de modifier les autorisations", - "name": "Nom", - "sortByName": "Nom", - "sortByDate": "Date de modification", - "sortBySize": "Taille", - "ascending": "Ascendant", - "descending": "Descendant", - "root": "Racine", - "new": "Nouveau", - "sortBy": "Trier par", - "items": "Éléments", - "selected": "Sélectionnés", - "editor": "Editeur", - "octal": "Octales", - "storage": "Stockage", - "disk": "Disque", - "used": "Utilisé", - "of": "de", - "toggleSidebar": "Activer/désactiver la barre latérale", - "cannotLoadPdf": "Impossible de charger le PDF", - "pdfLoadError": "Une erreur s'est produite lors du chargement de ce fichier PDF.", - "loadingPdf": "Chargement du PDF...", - "loadingPage": "Chargement de la page..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Copier vers l'hôte…", - "moveToHost": "Déplacer vers l'hôte…", - "copyItemsToHost": "Copiez les éléments {{count}} vers l'hôte…", - "moveItemsToHost": "Déplacer les éléments {{count}} vers l'hôte…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Aucun autre hébergeur de gestionnaires de fichiers n'est disponible.", "noHostsConnectedHint": "Ajoutez un autre hôte SSH avec le gestionnaire de fichiers activé dans le gestionnaire d'hôtes.", "selectDestinationHost": "Sélectionnez l'hôte de destination", @@ -1164,48 +1360,48 @@ "browseDestination": "Parcourez ou saisissez le chemin", "confirmCopy": "Copie", "confirmMove": "Se déplacer", - "transferring": "Transfert…", - "compressing": "Compression…", - "extracting": "Extraction de…", - "transferringItems": "Transfert de {{current}} d'éléments {{total}}…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transfert terminé", "transferError": "Échec du transfert", - "transferPartial": "Transfert terminé avec {{count}} erreurs", - "transferPartialHint": "Impossible de transférer : {{paths}}", - "itemsSummary": "{{count}} articles", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "La destination doit être un répertoire pour les transferts multi-articles", "selectThisFolder": "Sélectionnez ce dossier", "browsePathWillBeCreated": "Ce dossier n'existe pas encore. Il sera créé au début du transfert.", "browsePathError": "Impossible d'ouvrir ce chemin sur l'hôte de destination.", "goUp": "Monter", - "copyFolderToHost": "Copier le dossier sur l'hôte…", - "moveFolderToHost": "Déplacer le dossier vers l'hôte…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Prêt", - "hostConnecting": "Connexion…", + "hostConnecting": "Connecting…", "hostDisconnected": "Non connecté", "hostAuthRequired": "Authentification requise — ouvrez d’abord le Gestionnaire de fichiers sur cet hôte", "hostConnectionFailed": "Échec de la connexion", "metricsTitle": "Horaires de transfert", - "metricsPrepare": "Préparer la destination : {{duration}}", - "metricsCompress": "Compression à la source : {{duration}}", - "metricsHopSourceRead": "Source → serveur : {{throughput}}", - "metricsHopDestSftpWrite": "Serveur → destination (SFTP) : {{throughput}}", - "metricsHopDestLocalWrite": "Serveur → destination (locale) : {{throughput}}", - "metricsTransfer": "De bout en bout : {{throughput}} ({{duration}})", - "metricsExtract": "Extraire à destination : {{duration}}", - "metricsSourceDelete": "Supprimer de la source : {{duration}}", - "metricsTotal": "Total : {{duration}}", - "progressCompressing": "Compression sur l'hôte source…", - "progressExtracting": "Extraction sur la destination…", - "progressTransferring": "Transfert de données…", - "progressReconnecting": "Reconnexion…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "voies de transfert parallèles", - "parallelSegmentsOption": "{{count}} voies", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Les fichiers volumineux sont divisés en segments de 256 Mo. Plusieurs voies utilisent des connexions distinctes (comme le lancement de plusieurs transferts) pour un débit total plus élevé.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} voies)", - "progressTransferringItems": "Transfert de fichiers ({{current}} de {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} fichiers", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Fichiers sources conservés (transfert partiel)", "jumpHostLimitation": "Les deux hôtes doivent être accessibles depuis le serveur Termix. Le routage direct entre hôtes n'est pas pris en charge.", "cancel": "Annuler", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Choisit entre l'archive tar et le transfert SFTP par fichier en fonction du nombre de fichiers, de leur taille et de leur compressibilité. Les fichiers uniques utilisent toujours le transfert SFTP en continu.", "methodTarHint": "Compression à la source, transfert d'une archive, extraction à destination. Nécessite tar sur les deux hôtes Unix.", "methodItemSftpHint": "Transférez chaque fichier individuellement via SFTP. Compatible avec tous les systèmes d'exploitation, y compris Windows.", - "methodPreviewLoading": "Méthode de calcul du transfert…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Impossible de prévisualiser la méthode de transfert. Le serveur choisira une méthode au démarrage.", "methodPreviewWillUseTar": "Utilisation : archive Tar", "methodPreviewWillUseItemSftp": "Utilisation : SFTP par fichier", - "methodPreviewScanSummary": "{{fileCount}} fichiers, {{totalSize}} total (analysés sur l'hôte source).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Chaque fichier utilise le même flux SFTP pour une copie individuelle, l'un après l'autre. La progression est cumulée pour tous les fichiers, ce qui explique la lenteur de la barre de progression pour les fichiers volumineux.", "methodReason": { "user_item_sftp": "Vous avez choisi le protocole SFTP par fichier.", "user_tar": "Vous avez choisi l'archive tar.", "tar_unavailable": "Tar n'est pas disponible sur l'un ou les deux hôtes ; le protocole SFTP par fichier sera utilisé à la place.", "windows_host": "Un système hôte Windows est impliqué — tar n'est pas utilisé.", - "auto_multi_large": "Auto : plusieurs fichiers, y compris un fichier volumineux ({{largestSize}}) avec des données compressibles — regroupent les fichiers tar en un seul transfert.", - "auto_single_large_in_archive": "Auto : un fichier volumineux ({{largestSize}}) dans cet ensemble — SFTP par fichier.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto : données majoritairement incompressibles — SFTP par fichier.", - "auto_many_files": "Auto : plusieurs fichiers ({{fileCount}}) — tar réduit la surcharge par fichier.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Auto : SFTP par fichier pour cet ensemble." }, "progressCancel": "Annuler", - "progressCancelling": "Annulation…", + "progressCancelling": "Cancelling…", "progressStalled": "Bloqué", "resumedHint": "Reconnexion à un transfert actif démarré dans une autre fenêtre.", "transferCancelled": "Transfert annulé", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Des données partielles ont été conservées à destination. La tentative de connexion reprendra dès que la connexion sera rétablie." }, "tunnels": { - "noSshTunnels": "Pas de tunnels SSH", - "createFirstTunnelMessage": "Vous n'avez pas encore créé de tunnels SSH. Configurez les connexions de tunnels dans le Gestionnaire d'Hôtes pour commencer.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Connecté", "disconnected": "Déconnecté", - "connecting": "Connexion en cours...", - "error": "Erreur", - "canceling": "Annulation...", - "connect": "Connecter", - "disconnect": "Déconnecter", - "cancel": "Abandonner", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Annuler", "port": "Port", - "localPort": "Port local", - "remotePort": "Port distant", - "currentHostPort": "Port actuel de l'hôte", - "endpointPort": "Port de terminaison", - "bindIp": "IP locale", - "endpointSshConfig": "Configuration SSH du point d'extrémité", - "endpointSshHost": "Hôte SSH du point d'extrémité", - "endpointSshHostPlaceholder": "Sélectionnez un hôte configuré", - "endpointSshHostRequired": "Sélectionnez un serveur SSH de point de terminaison pour chaque tunnel client.", - "attempt": "Tentative {{current}} de {{max}}", - "nextRetryIn": "Prochaine tentative dans {{seconds}} secondes", - "clientTunnels": "Tunnels client", - "clientTunnel": "Tunnel client", - "addClientTunnel": "Ajouter un tunnel client", - "noClientTunnels": "Aucun tunnel client configuré sur ce bureau.", - "tunnelName": "Nom du tunnel", - "remoteHost": "Hôte distant", - "autoStart": "Démarrage automatique", - "clientAutoStartDesc": "Démarre lorsque ce client de bureau s'ouvre et reste connecté.", - "clientManualStartDesc": "Utiliser Démarrer et Arrêter de cette ligne. Termix ne l'ouvrira pas automatiquement.", - "clientRemoteServerNote": "La redirection à distance peut nécessiter AllowTcpForwarding et GatewayPorts sur le serveur SSH de point d'extrémité. Le port distant se ferme lorsque ce bureau se déconnecte.", - "clientTunnelStarted": "Tunnel client démarré", - "clientTunnelStopped": "Tunnel client arrêté", - "tunnelTestSucceeded": "Test du tunnel réussi", - "tunnelTestFailed": "Le test du tunnel a échoué", - "localSaved": "Tunnel client sauvegardé", - "localSaveError": "Impossible d'enregistrer les tunnels du client local", - "invalidBindIp": "L'adresse IP locale doit être une adresse IPv4 valide.", - "invalidLocalTargetIp": "L'IP locale cible doit être une adresse IPv4 valide.", - "invalidLocalPort": "Le port local doit être compris entre 1 et 65535.", - "invalidRemotePort": "Le port distant doit être compris entre 1 et 65535.", - "invalidLocalTargetPort": "Le port local cible doit être compris entre 1 et 65535.", - "invalidEndpointPort": "Le port du point d'entrée doit être compris entre 1 et 65535.", - "duplicateAutoStartBind": "Un seul tunnel client de démarrage automatique peut utiliser {{bind}}.", - "manualControlError": "Impossible de mettre à jour l'état du tunnel.", - "active": "Actif", - "start": "Début", - "stop": "Arrêter", - "test": "Tester", - "type": "Type de tunnel", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", "typeLocal": "Local (-L)", - "typeRemote": "Télécommande (-R)", - "typeDynamic": "Dynamique (-D)", - "typeServerLocalDesc": "Hôte actuel vers point de terminaison.", - "typeServerRemoteDesc": "Point de fin de retour à l'hôte actuel.", - "typeClientLocalDesc": "Ordinateur local à terminal.", - "typeClientRemoteDesc": "Point de fin de retour à l'ordinateur local.", - "typeClientDynamicDesc": "SOCKS sur ordinateur local.", - "typeDynamicDesc": "Transférer le trafic SOCKS5 vers SSH", - "forwardDescriptionServerLocal": "Hôte actuel {{sourcePort}} → point de terminaison {{endpointPort}}.", - "forwardDescriptionServerRemote": "Point de terminaison {{endpointPort}} → hôte actuel {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS sur l'hôte actuel {{sourcePort}}.", - "forwardDescriptionClientLocal": "{{sourcePort}} local → {{endpointPort}} distant.", - "forwardDescriptionClientRemote": "{{sourcePort}} → {{endpointPort}} local.", - "forwardDescriptionClientDynamic": "SOCKS sur le port local {{sourcePort}}.", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → CHAUSSETTES via {{endpoint}}", - "autoNameClientLocal": "{{localPort}} local → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → {{localPort}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", - "route": "Voie :", - "lastStarted": "Dernier démarrage", - "lastTested": "Dernier test", - "lastError": "Dernière erreur", - "maxRetries": "Nombre maximum de tentatives", - "maxRetriesDescription": "Nombre maximum de tentatives de réessai.", - "retryInterval": "Intervalle de réessai (secondes)", - "retryIntervalDescription": "Temps d'attente entre les deux tentatives.", - "local": "Locale", - "remote": "Distante", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Destination", - "host": "Hôte", + "host": "Host", "mode": "Mode", - "noHostSelected": "Aucun hôte sélectionné", - "working": "Traitement..." + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "UC", - "memory": "Mémoire", - "disk": "Disque", - "network": "Réseau", - "uptime": "Délai de disponibilité", - "processes": "Processus", - "available": "Disponible", - "free": "Gratuit", - "connecting": "Connexion en cours...", - "connectionFailed": "Échec de la connexion au serveur", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "Noyau {{count}}", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Usage du CPU", - "memoryUsage": "Utilisation de la mémoire", - "diskUsage": "Utilisation du disque", - "failedToFetchHostConfig": "Impossible de récupérer la configuration de l'hôte", - "serverOffline": "Serveur hors ligne", - "cannotFetchMetrics": "Impossible de récupérer les métriques depuis le serveur hors ligne", - "totpFailed": "La vérification TOTP a échoué", - "noneAuthNotSupported": "Les statistiques du serveur ne supportent pas le type d'authentification 'none'.", - "load": "Charger", - "systemInfo": "Informations du système", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Système d'exploitation", - "kernel": "Noyau", - "seconds": "secondes", - "networkInterfaces": "Interfaces réseau", - "noInterfacesFound": "Aucune interface réseau trouvée", - "noProcessesFound": "Aucun processus trouvé", - "loginStats": "Statistiques de connexion SSH", - "noRecentLoginData": "Aucune donnée de connexion récente", - "executingQuickAction": "Exécution de {{name}}...", - "quickActionSuccess": "{{name}} terminé avec succès", - "quickActionFailed": "{{name}} a échoué", - "quickActionError": "Impossible d'exécuter {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Ports d'écoute", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protocole", "port": "Port", - "address": "Adresses", - "process": "Processus", - "noData": "Aucune donnée de port d'écoute" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Pare-feu", - "inactive": "Inactif", - "policy": "Politique de confidentialité", - "rules": "règles", - "noData": "Aucune donnée de pare-feu disponible", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", "action": "Action", "protocol": "Proto", "port": "Port", "source": "Source", - "anywhere": "Partout" + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Charge Moyenne", - "swap": "Permuter", + "loadAvg": "Load Avg", + "swap": "Swap", "architecture": "Architecture", - "refresh": "Rafraîchir", - "retry": "Réessayer" + "refresh": "Refresh", + "retry": "Réessayer", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Courir", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Gestion SSH et de bureau à distance auto-hébergée", - "loginTitle": "Se connecter à Termix", - "registerTitle": "Créer un compte", - "forgotPassword": "Mot de passe oublié ?", - "rememberMe": "Se souvenir de l'appareil pendant 30 jours (comprend TOTP)", - "noAccount": "Vous n'avez pas de compte ?", - "hasAccount": "Vous avez déjà un compte ?", - "twoFactorAuth": "Authentification à deux facteurs", - "enterCode": "Entrez le code de vérification", - "backupCode": "Ou utilisez le code de sauvegarde", - "verifyCode": "Vérifier le code", - "redirectingToApp": "Redirection vers l'application...", - "sshAuthenticationRequired": "Authentification SSH requise", - "sshNoKeyboardInteractive": "Authentification interactive du clavier indisponible", - "sshAuthenticationFailed": "Échec de l'authentification", - "sshAuthenticationTimeout": "Délai d'authentification dépassé", - "sshNoKeyboardInteractiveDescription": "Le serveur ne supporte pas l'authentification interactive. Veuillez fournir votre mot de passe ou votre clé SSH.", - "sshAuthFailedDescription": "Les identifiants fournis sont incorrects. Veuillez réessayer avec des identifiants valides.", - "sshTimeoutDescription": "La tentative d'authentification a expiré. Veuillez réessayer.", - "sshProvideCredentialsDescription": "Veuillez fournir vos identifiants SSH pour vous connecter à ce serveur.", - "sshPasswordDescription": "Entrez le mot de passe de cette connexion SSH.", - "sshKeyPasswordDescription": "Si votre clé SSH est chiffrée, entrez le mot de passe ici.", - "passphraseRequired": "Phrase de passe requise", - "passphraseRequiredDescription": "La clé SSH est chiffrée. Veuillez entrer le mot de passe pour la déverrouiller.", - "back": "Précédent", - "firstUser": "Premier utilisateur", - "firstUserMessage": "Vous êtes le premier utilisateur à devenir administrateur. Vous pouvez voir les paramètres d'administration dans la liste déroulante de l'utilisateur de la barre latérale. Si vous pensez que c'est une erreur, consultez les journaux de docker ou créez un problème GitHub.", - "external": "Externe", - "loginWithExternal": "Se connecter avec un fournisseur externe", - "loginWithExternalDesc": "Connectez-vous en utilisant votre fournisseur d'identité externe configuré", - "externalNotSupportedInElectron": "L'authentification externe n'est pas encore prise en charge dans l'application Electron. Veuillez utiliser la version web pour la connexion OIDC.", - "resetPasswordButton": "Réinitialiser le mot de passe", - "sendResetCode": "Envoyer le code de réinitialisation", - "resetCodeDesc": "Entrez votre nom d'utilisateur pour recevoir un code de réinitialisation de mot de passe. Le code sera enregistré dans les journaux du conteneur docker.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Vérifier le code", - "enterResetCode": "Entrez le code à 6 chiffres du journal du conteneur docker pour l'utilisateur :", - "newPassword": "Nouveau mot de passe", - "confirmNewPassword": "Confirmer le mot de passe", - "enterNewPassword": "Entrez votre nouveau mot de passe pour l'utilisateur :", - "signUp": "S'inscrire", - "desktopApp": "Application de bureau", - "loggingInToDesktopApp": "Connexion à l'application de bureau", - "loadingServer": "Chargement du serveur...", - "dataLossWarning": "La réinitialisation de votre mot de passe supprimera ainsi tous vos hôtes, identifiants et autres données chiffrées SSH enregistrées. Cette action ne peut pas être annulée. Utilisez cette action uniquement si vous avez oublié votre mot de passe et que vous n'êtes pas connecté.", - "authenticationDisabled": "Authentification désactivée", - "authenticationDisabledDesc": "Toutes les méthodes d'authentification sont actuellement désactivées. Veuillez contacter votre administrateur.", - "attemptsRemaining": "{{count}} tentatives restantes" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Vérifier la clé d'hôte SSH", - "keyChangedWarning": "Clé d'hôte SSH modifiée", - "firstConnectionTitle": "Première connexion à cet hôte", - "firstConnectionDescription": "L'authenticité de cet hôte ne peut pas être établie. Vérifiez que l'empreinte digitale correspond à ce que vous attendez.", - "keyChangedDescription": "La clé hôte de ce serveur a changé depuis votre dernière connexion. Cela pourrait indiquer un problème de sécurité.", - "previousKey": "Clé précédente", - "newFingerprint": "Nouvelle empreinte digitale", - "fingerprint": "Empreinte digitale", - "verifyInstructions": "Si vous faites confiance à cet hôte, cliquez sur Accepter pour continuer et enregistrer cette empreinte digitale pour de futures connexions.", - "securityWarning": "Avertissement de sécurité", - "acceptAndContinue": "Accepter et continuer", - "acceptNewKey": "Accepter la nouvelle clé et continuer" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Impossible de se connecter à la base de données", - "unknownError": "Erreur inconnue", - "loginFailed": "Échec de la connexion", - "failedPasswordReset": "Échec de la réinitialisation du mot de passe", - "failedVerifyCode": "Impossible de vérifier le code de réinitialisation", - "failedCompleteReset": "Échec de la réinitialisation du mot de passe", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Impossible de démarrer la connexion OIDC", - "silentSigninOidcUnavailable": "La connexion silencieuse a été demandée, mais la connexion OIDC n'est pas disponible.", - "failedUserInfo": "Impossible d'obtenir les informations de l'utilisateur après la connexion", - "oidcAuthFailed": "Échec de l'authentification OIDC", - "invalidAuthUrl": "URL d'autorisation invalide reçue du backend", - "requiredField": "Ce champ est obligatoire", - "minLength": "La longueur minimale est {{min}}", - "passwordMismatch": "Les mots de passe ne correspondent pas", - "passwordLoginDisabled": "Le nom d'utilisateur / mot de passe est actuellement désactivé", - "sessionExpired": "La session a expiré - veuillez vous reconnecter", - "totpRateLimited": "Taux limité : Trop de tentatives de vérification TOTP. Veuillez réessayer plus tard.", - "totpRateLimitedWithTime": "Taux limité : Trop de tentatives de vérification TOTP. Veuillez attendre {{time}} secondes avant de réessayer.", - "resetCodeRateLimited": "Taux limité : trop de tentatives de vérification. Veuillez réessayer plus tard.", - "resetCodeRateLimitedWithTime": "Taux limité : trop de tentatives de vérification. Veuillez attendre {{time}} secondes avant de réessayer.", - "authTokenSaveFailed": "Échec de l'enregistrement du jeton d'authentification", - "failedToLoadServer": "Impossible de charger le serveur" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "L'enregistrement d'un nouveau compte est actuellement désactivé par un administrateur. Veuillez vous connecter ou contacter un administrateur.", - "userNotAllowed": "Votre compte n'est pas autorisé à vous inscrire. Veuillez contacter un administrateur.", - "databaseConnectionFailed": "Impossible de se connecter au serveur de base de données", - "resetCodeSent": "Réinitialiser le code envoyé aux logs Docker", - "codeVerified": "Code vérifié avec succès", - "passwordResetSuccess": "Mot de passe réinitialisé avec succès", - "loginSuccess": "Connexion réussie", - "registrationSuccess": "Inscription réussie" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Tunels locaux de bureau ciblant les hôtes SSH configurés.", - "c2sTunnelPresets": "Préréglages du tunnel client", - "c2sTunnelPresetsDesc": "Enregistrez la liste des tunnels locaux de ce client de bureau sous la forme d'un préréglage nommé, ou rechargez un préréglage dans ce client.", - "c2sTunnelPresetsUnavailable": "Les préréglages du tunnel client ne sont disponibles que dans le client de bureau.", - "c2sPresetName": "Nom du préréglage", - "c2sPresetNamePlaceholder": "Nom du préréglage client", - "c2sPresetToLoad": "Préréglage à charger", - "c2sNoPresetSelected": "Aucun préréglage sélectionné", - "c2sNoPresets": "Aucun préréglage enregistré", - "c2sLoadPreset": "Charger", - "c2sCurrentLocalConfig": "{{count}} tunnel(s) client local(aux) configuré(s) sur ce bureau.", - "c2sPresetSyncNote": "Les préréglages sont des instantanés explicites ; le chargement remplace la liste des tunnels clients locaux du client de bureau.", - "c2sPresetSaved": "Préréglage du tunnel client sauvegardé", - "c2sPresetLoaded": "Préréglage du tunnel client chargé localement", - "c2sPresetRenamed": "Préréglage du tunnel client renommé", - "c2sPresetDeleted": "Préréglage du tunnel client supprimé", - "c2sPresetLoadError": "Impossible de charger les préréglages du tunnel client" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Langue", - "keyPassword": "mot de passe de la clé", - "pastePrivateKey": "Collez votre clé privée ici...", - "localListenerHost": "127.0.0.1 (écouter localement)", - "localTargetHost": "127.0.0.1 (cible sur cet ordinateur)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Entrez votre mot de passe", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Tableau de bord", - "loading": "Chargement du tableau de bord...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Soutien", - "discord": "Discord.", - "serverOverview": "Vue d'ensemble du serveur", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", "version": "Version", - "upToDate": "À jour", - "updateAvailable": "Mise à jour disponible", - "beta": "Bêta", - "uptime": "Délai de disponibilité", - "database": "Base de données", - "healthy": "Sain", - "error": "Erreur", - "totalHosts": "Nombre total d'hôtes", - "totalTunnels": "Tunnels totaux", - "totalCredentials": "Identifiants totaux", - "recentActivity": "Activité récente", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Chargement de l'activité récente...", - "noRecentActivity": "Aucune activité récente", - "quickActions": "Actions rapides", - "addHost": "Ajouter un hôte", - "addCredential": "Ajouter un mot de passe", - "adminSettings": "Paramètres de l'administrateur", - "userProfile": "Profil de l'utilisateur", - "serverStats": "Statistiques du serveur", - "loadingServerStats": "Chargement des statistiques du serveur...", - "noServerData": "Aucune donnée de serveur disponible", - "cpu": "UC", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personnaliser le tableau de bord", - "dashboardSettings": "Paramètres du tableau de bord", - "enableDisableCards": "Activer/Désactiver les cartes", - "resetLayout": "Revenir à la valeur par défaut", - "serverOverviewCard": "Vue d'ensemble du serveur", - "recentActivityCard": "Activité récente", - "networkGraphCard": "Graphique réseau", - "networkGraph": "Graphique réseau", - "quickActionsCard": "Actions rapides", - "serverStatsCard": "Statistiques du serveur", - "panelMain": "Principal", - "panelSide": "Côté", - "justNow": "à l'instant" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABLE", - "hostsOnline": "Hôtes en ligne", - "activeTunnels": "Tunnels actifs", - "registerNewServer": "Enregistrer un nouveau serveur", - "storeSshKeysOrPasswords": "Stocker les clés SSH ou les mots de passe", - "manageUsersAndRoles": "Gérer les utilisateurs et les rôles", - "manageYourAccount": "Gérer votre compte", - "hostStatus": "Statut de l'Hôte", - "noHostsConfigured": "Aucun hôte configuré", - "online": "LIGNE", - "offline": "Hors ligne", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", "onlineLower": "En ligne", "nodes": "{{count}} nodes", - "add": "Ajouter :", - "commandPalette": "Palette de commandes", - "done": "Fait", - "editModeInstructions": "Glissez les cartes pour réorganiser · Faites glisser le diviseur de colonnes pour redimensionner les colonnes · Faites glisser le bord inférieur d'une carte pour redimensionner sa hauteur · Corbeille pour supprimer", - "empty": "Vide", - "clear": "Nettoyer" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copie", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Ajouter un hôte", - "addGroup": "Ajouter un groupe", - "addLink": "Ajouter un lien", - "zoomIn": "Zoom avant", - "zoomOut": "Zoom arrière", - "resetView": "Réinitialiser la vue", - "selectHost": "Sélectionner l'hôte", - "chooseHost": "Choisissez un hôte...", - "parentGroup": "Groupe parent", - "noGroup": "Aucun groupe", - "groupName": "Nom du groupe", - "color": "Couleur", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", "source": "Source", "target": "Target", - "moveToGroup": "Déplacer vers le groupe", - "selectGroup": "Sélectionner un groupe...", - "addConnection": "Ajouter une connexion", - "hostDetails": "Détails de l'hôte", - "removeFromGroup": "Retirer du groupe", - "addHostHere": "Ajouter un hôte ici", - "editGroup": "Modifier le groupe", - "delete": "Supprimez", - "add": "Ajouter", - "create": "Créer", - "move": "Déplacer", - "connect": "Connecter", - "createGroup": "Créer un groupe", - "selectSourcePlaceholder": "Sélectionnez la source...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Se déplacer", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Fichier invalide", - "hostAlreadyExists": "L'hôte est déjà dans la topologie", - "connectionExists": "La connexion existe déjà", - "unknown": "Inconnu", - "name": "Nom", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Statut", - "failedToAddNode": "Impossible d'ajouter le noeud", - "sourceDifferentFromTarget": "La source et la cible doivent être différentes", - "exportJSON": "Exporter JSON", - "importJSON": "Importer JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", "fileManager": "Gestionnaire de fichiers", "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Statistiques du serveur", - "noNodes": "Pas encore de nœuds" + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker n'est pas activé pour cet hôte", - "validating": "Validation de Docker...", - "connecting": "Connexion en cours...", - "error": "Erreur", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Impossible de se connecter à Docker", - "containerStarted": "Le conteneur {{name}} a commencé", - "failedToStartContainer": "Impossible de démarrer le conteneur {{name}}", - "containerStopped": "Conteneur {{name}} arrêté", - "failedToStopContainer": "Impossible d’arrêter le conteneur {{name}}", - "containerRestarted": "Le conteneur {{name}} a redémarré", - "failedToRestartContainer": "Impossible de redémarrer le conteneur {{name}}", - "containerPaused": "Conteneur {{name}} suspendu", - "containerUnpaused": "Le conteneur {{name}} a été rétabli", - "failedToTogglePauseContainer": "Impossible d'activer/désactiver l'état de pause du conteneur {{name}}", - "containerRemoved": "Conteneur {{name}} supprimé", - "failedToRemoveContainer": "Impossible de supprimer le conteneur {{name}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", "image": "Image", "ports": "Ports", - "noPorts": "Aucun port", - "start": "Début", - "confirmRemoveContainer": "Êtes-vous sûr de vouloir supprimer le conteneur '{{name}}' ? Cette action ne peut pas être annulée.", - "runningContainerWarning": "Avertissement: Ce conteneur est en cours d'exécution. Le retirer arrêtera le conteneur en premier.", - "loadingContainers": "Chargement des conteneurs...", - "manager": "Gestionnaire de Docker", - "autoRefresh": "Rafraîchissement automatique", - "timestamps": "Horodatage", - "lines": "Lignes", - "filterLogs": "Filtrer les journaux...", - "refresh": "Rafraîchir", - "download": "Télécharger", - "clear": "Nettoyer", - "logsDownloaded": "Logs téléchargés avec succès", - "last50": "Les 50 derniers", - "last100": "100 derniers", - "last500": "500 derniers", - "last1000": "1000 Derniers", - "allLogs": "Tous les logs", - "noLogsMatching": "Aucun journal correspondant à \"{{query}}\"", - "noLogsAvailable": "Aucun journal disponible", - "noContainersFound": "Aucun conteneur trouvé", - "noContainersFoundHint": "Aucun conteneur Docker n'est disponible sur cet hôte", - "searchPlaceholder": "Rechercher dans les conteneurs...", - "allStatuses": "Tous les statuts", - "stateRunning": "En cours d'exécution", - "statePaused": "En pause", - "stateExited": "Sortie", - "stateRestarting": "Redémarrage en cours", - "noContainersMatchFilters": "Aucun conteneur ne correspond à vos filtres", - "noContainersMatchFiltersHint": "Essayez d'ajuster vos critères de recherche ou de filtre", - "failedToFetchStats": "Impossible de récupérer les statistiques du conteneur", - "containerNotRunning": "Conteneur non en cours d'exécution", - "startContainerToViewStats": "Lancer le conteneur pour afficher les statistiques", - "loadingStats": "Chargement des statistiques...", - "errorLoadingStats": "Erreur lors du chargement des statistiques", - "noStatsAvailable": "Aucune statistique disponible", - "cpuUsage": "Usage du CPU", - "current": "Actuel", - "memoryUsage": "Utilisation de la mémoire", - "networkIo": "E/S réseau", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Sortie", - "blockIo": "Bloquer E/S", - "read": "Lu", - "write": "Écrire", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "Informations sur le conteneur", - "name": "Nom", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "État", - "containerMustBeRunning": "Le conteneur doit être en cours d'exécution pour accéder à la console", - "verificationCodePrompt": "Entrez le code de vérification", - "totpVerificationFailed": "La vérification TOTP a échoué. Veuillez réessayer.", - "warpgateVerificationFailed": "Échec de l'authentification de Warpgate. Veuillez réessayer.", - "connectedTo": "Connecté à {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Déconnecté", - "consoleError": "Erreur de la console", - "errorMessage": "Erreur: {{message}}", - "failedToConnect": "Impossible de se connecter au conteneur", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", "console": "Console", - "selectShell": "Sélectionner une coquille", - "bash": "Frappe", - "sh": "shu", - "ash": "cendres", - "connect": "Connecter", - "disconnect": "Déconnecter", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Non connecté", - "clickToConnect": "Cliquez sur Se connecter pour démarrer une session shell", - "connectingTo": "Connexion à {{containerName}}...", - "containerNotFound": "Conteneur introuvable", - "backToList": "Retour à la liste", - "logs": "Journaux", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", "stats": "Stats", "consoleTab": "Console", - "startContainerToAccess": "Démarrez le conteneur pour accéder à la console" + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Généraux", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Utilisateurs", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Sessions", - "sectionRoles": "Rôles", - "sectionDatabase": "Base de données", - "sectionApiKeys": "Clés API", - "allowRegistration": "Autoriser l'enregistrement de l'utilisateur", - "allowRegistrationDesc": "Laisser les nouveaux utilisateurs s'inscrire", - "allowPasswordLogin": "Autoriser la connexion par mot de passe", - "allowPasswordLoginDesc": "Nom d'utilisateur/mot de passe", - "oidcAutoProvision": "Proposition automatique OIDC", - "oidcAutoProvisionDesc": "Création automatique de comptes pour les utilisateurs OIDC même lorsque l'inscription est désactivée", - "allowPasswordReset": "Autoriser la réinitialisation du mot de passe", - "allowPasswordResetDesc": "Réinitialiser le code via les logs Docker", - "sessionTimeout": "Délai de session dépassé", - "hours": "heures", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Filtres transparents", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Statut", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "Surveillance par défaut", - "statusCheck": "Vérification de l'état", - "metrics": "Métriques", - "sec": "s", - "logLevel": "Niveau du journal", - "enableGuacamole": "Activer Guacamole", - "enableGuacamoleDesc": "Bureau distant RDP/VNC", - "guacdUrl": "URL guacd", - "oidcDescription": "Configurer OpenID Connect pour SSO. Les champs marqués * sont obligatoires.", - "oidcClientId": "ID du client", - "oidcClientSecret": "Secret du client", - "oidcAuthUrl": "URL d'autorisation", - "oidcIssuerUrl": "URL de l'émetteur", - "oidcTokenUrl": "URL du jeton", - "oidcUserIdentifier": "Chemin d'accès de l'utilisateur", - "oidcDisplayName": "Afficher le chemin du nom", - "oidcScopes": "Portées", - "oidcUserinfoUrl": "Remplacer l'URL Userinfo", - "oidcAllowedUsers": "Utilisateurs autorisés", - "oidcAllowedUsersDesc": "Un email par ligne. Laissez vide pour autoriser tous.", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", "removeOidc": "Retirer", - "usersCount": "Utilisateurs {{count}}", - "createUser": "Créer", - "newRole": "Nouveau rôle", - "roleName": "Nom", - "roleDisplayName": "Nom affiché", - "roleDescription": "Libellé", - "rolesCount": "Rôles {{count}}", - "createRole": "Créer", - "creating": "Création en cours...", - "exportDatabase": "Exporter la base de données", - "exportDatabaseDesc": "Télécharger une sauvegarde de tous les hôtes, identifiants et paramètres", - "export": "Exportation", - "exporting": "Exportation en cours...", - "importDatabase": "Importer la base de données", - "importDatabaseDesc": "Restaurer à partir d'un fichier de sauvegarde .sqlite", - "importDatabaseSelected": "Sélectionné: {{name}}", - "selectFile": "Sélectionner un fichier", - "changeFile": "Changement", - "import": "Importation", - "importing": "Importation en cours...", - "apiKeysCount": "Clés {{count}}", - "newApiKey": "Nouvelle clé API", - "apiKeyCreatedWarning": "Clé créée - copiez-la maintenant, elle ne sera plus affichée.", - "apiKeyName": "Nom", - "apiKeyUser": "Utilisateur", - "apiKeySelectUser": "Sélectionnez un utilisateur...", - "apiKeyExpiresAt": "Expire à", - "createKey": "Créer une clé", - "apiKeyNoExpiry": "Pas d'expiration", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Double Auth", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Locale", - "adminStatusAdministrator": "Administrateur", - "adminStatusRegularUser": "Utilisateur normal", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "PERSONNALISÉ", - "youBadge": "TU", - "sessionsActive": "{{count}} actif", - "sessionActive": "Actif : {{time}}", - "sessionExpires": "Exp : {{time}}", - "revokeAll": "Tous", - "revokeAllSessionsSuccess": "Toutes les sessions pour l'utilisateur révoquées", - "revokeAllSessionsFailed": "Impossible de révoquer les sessions", - "revokeSessionFailed": "Échec de la révocation de la session", - "addRole": "Ajouter un rôle", - "noCustomRoles": "Aucun rôle personnalisé défini", - "removeRoleFailed": "Impossible de supprimer le rôle", - "assignRoleFailed": "Échec de l'attribution du rôle", - "deleteRoleFailed": "Impossible de supprimer le rôle", - "userAdminAccess": "Administrateur", - "userAdminAccessDesc": "Accès complet à tous les paramètres d'administration", - "userRoles": "Rôles", - "revokeAllUserSessions": "Révoquer toutes les sessions", - "revokeAllUserSessionsDesc": "Forcer la reconnexion sur tous les appareils", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "La suppression de cet utilisateur est permanente.", - "deleteUser": "Supprimer {{username}}", - "deleting": "Suppression en cours...", - "deleteUserFailed": "Échec de la suppression de l'utilisateur", - "deleteUserSuccess": "Utilisateur \"{{username}}\" supprimé", - "deleteRoleSuccess": "Rôle \"{{name}}\" supprimé", - "revokeKeySuccess": "Clé \"{{name}}\" révoquée", - "revokeKeyFailed": "Impossible de révoquer la clé", - "copiedToClipboard": "Copié dans le presse-papiers", - "done": "Fait", - "createUserTitle": "Créer un utilisateur", - "createUserDesc": "Créer un nouveau compte local.", - "createUserUsername": "Nom d'utilisateur", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Mot de passe", - "createUserPasswordHint": "6 caractères minimum.", - "createUserEnterUsername": "Entrez le nom d'utilisateur", - "createUserEnterPassword": "Entrez le mot de passe", - "createUserSubmit": "Créer un utilisateur", - "editUserTitle": "Gérer l'utilisateur : {{username}}", - "editUserDesc": "Modifier les rôles, le statut d'administrateur, les sessions et les paramètres du compte.", - "editUserUsername": "Nom d'utilisateur", - "editUserAuthType": "Type d'authentification", - "editUserAdminStatus": "Statut de l'administrateur", - "editUserUserId": "Identifiant de l'utilisateur", - "linkAccountTitle": "Lier OIDC au compte de mot de passe", - "linkAccountDesc": "Fusionner le compte OIDC {{username}} avec un compte local existant.", - "linkAccountWarningTitle": "Cela vaudra :", - "linkAccountEffect1": "Supprimer le compte OIDC uniquement", - "linkAccountEffect2": "Ajouter une connexion OIDC au compte cible", - "linkAccountEffect3": "Autoriser la connexion OIDC et mot de passe", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Entrez le nom d'utilisateur du compte local à lier à", - "linkAccounts": "Lier les comptes", - "linkAccountSuccess": "Compte OIDC lié à \"{{username}}\"", - "linkAccountFailed": "Échec de la liaison du compte OIDC", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Type d'autorisation", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Enchaînement...", - "saving": "Sauvegarde en cours...", - "updateRegistrationFailed": "Échec de la mise à jour des paramètres d'enregistrement", - "updatePasswordLoginFailed": "Échec de la mise à jour des paramètres de connexion du mot de passe", - "updateOidcAutoProvisionFailed": "Impossible de mettre à jour les paramètres de la fourniture automatique OIDC", - "updatePasswordResetFailed": "Échec de la mise à jour des paramètres de réinitialisation du mot de passe", - "sessionTimeoutRange2": "Le délai d'attente de la session doit être compris entre 1 et 720 heures", - "sessionTimeoutSaved": "Délai de session enregistré", - "sessionTimeoutSaveFailed": "Impossible d'enregistrer le délai d'attente de la session", - "monitoringIntervalInvalid": "Valeurs d'intervalle non valides", - "monitoringSaved": "Paramètres de surveillance enregistrés", - "monitoringSaveFailed": "Échec de l'enregistrement des paramètres de surveillance", - "guacamoleSaved": "Paramètres Guacamole enregistrés", - "guacamoleSaveFailed": "Impossible d'enregistrer les paramètres de Guacamole", - "guacamoleUpdateFailed": "Impossible de mettre à jour le paramètre Guacamole", - "logLevelUpdateFailed": "Impossible de mettre à jour le niveau du journal", - "oidcSaved": "Configuration OIDC enregistrée", - "oidcSaveFailed": "Échec de l'enregistrement de la configuration OIDC", - "oidcRemoved": "Configuration OIDC supprimée", - "oidcRemoveFailed": "Impossible de supprimer la configuration OIDC", - "createUserRequired": "Le nom d'utilisateur et le mot de passe sont requis", - "createUserPasswordTooShort": "Le mot de passe doit comporter au moins 6 caractères", - "createUserSuccess": "L'utilisateur \"{{username}}\" créé", - "createUserFailed": "Impossible de créer l'utilisateur", - "updateAdminStatusFailed": "Impossible de mettre à jour le statut d'administrateur", - "allSessionsRevoked": "Toutes les sessions révoquées", - "revokeSessionsFailed": "Impossible de révoquer les sessions", - "createRoleRequired": "Le nom et le nom d'affichage sont requis", - "createRoleSuccess": "Rôle \"{{name}}\" créé", - "createRoleFailed": "Impossible de créer le rôle", - "apiKeyNameRequired": "Le nom de la clé est requis", - "apiKeyUserRequired": "L'identifiant de l'utilisateur est requis", - "apiKeyCreatedSuccess": "Clé API \"{{name}}\" créée", - "apiKeyCreateFailed": "Impossible de créer la clé API", - "exportSuccess": "Base de données exportée avec succès", - "exportFailed": "L'exportation de la base de données a échoué", - "importSelectFile": "Veuillez d'abord sélectionner un fichier", - "importCompleted": "Importation terminée : {{total}} éléments importés, {{skipped}} ignorée", - "importFailed": "Échec de l'import : {{error}}", - "importError": "Échec de l'importation de la base de données" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Hôte", - "hostPlaceholder": "192.168.1.1 ou exemple.com", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Nom d'utilisateur", - "usernamePlaceholder": "nom d'utilisateur", - "authLabel": "Auteur", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Mot de passe", - "passwordPlaceholder": "mot de passe", - "privateKeyLabel": "Clé privée", - "privateKeyPlaceholder": "Coller la clé privée...", - "credentialLabel": "Identification", - "credentialPlaceholder": "Sélectionnez un identifiant enregistré", - "connectToTerminal": "Se connecter au terminal", - "connectToFiles": "Se connecter aux fichiers" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Attestation", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Aucun terminal sélectionné", - "noTerminalSelectedHint": "Ouvrir un onglet de terminal SSH pour afficher l'historique de ses commandes", - "searchPlaceholder": "Rechercher dans l'historique...", - "clearAll": "Tout effacer", - "noHistoryEntries": "Aucune entrée d'historique", - "trackingDisabled": "Le suivi de l'historique est désactivé", - "trackingDisabledHint": "Activez-le dans les paramètres de votre profil pour enregistrer des commandes." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Enregistrement de la clé", - "recordToTerminals": "Enregistrer dans les terminaux", - "selectAll": "Tous", + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", "selectNone": "Aucun", - "noTerminalTabsOpen": "Aucun onglet de terminal ouvert", - "selectTerminalsAbove": "Sélectionnez les terminaux ci-dessus", - "broadcastInputPlaceholder": "Tapez ici pour diffuser les touches...", - "stopRecording": "Arrêter l'enregistrement", - "startRecording": "Démarrer l'enregistrement", - "settingsTitle": "Réglages", - "enableRightClickCopyPaste": "Activer le clic droit copier/coller" + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Mise en page", - "selectLayoutAbove": "Sélectionnez une mise en page ci-dessus", - "selectLayoutHint": "Choisir le nombre de panneaux à afficher", - "panesTitle": "Panneaux", - "openTabsTitle": "Onglets ouverts", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Faites glisser les onglets dans les volets ci-dessus ou utilisez l'attribution rapide.", - "dropHere": "Déposer ici", - "emptyPane": "Vide", - "dashboard": "Tableau de bord", - "clearSplitScreen": "Nettoyer l'écran partagé", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Affectation rapide", - "alreadyAssigned": "Volet {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Onglet fractionné", "addToSplit": "Ajouter au fractionnement", "removeFromSplit": "Retirer de la division", - "assignToPane": "Affecter au volet" + "assignToPane": "Affecter au volet", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Créer un snippet", - "createSnippetDescription": "Créer un nouveau snippet de commande pour une exécution rapide", - "nameLabel": "Nom", - "namePlaceholder": "ex: Redémarrer Nginx", - "descriptionLabel": "Libellé", - "descriptionPlaceholder": "Description facultative", - "optional": "Optionnel", - "folderLabel": "Répertoire", - "noFolder": "Aucun dossier (non catégorisé)", - "commandLabel": "Commandes", - "commandPlaceholder": "ex: sudo systemctl redémarrage nginx", - "cancel": "Abandonner", - "createSnippetButton": "Créer un snippet", - "createFolderTitle": "Créer un dossier", - "createFolderDescription": "Organiser vos modules de texte dans des dossiers", - "folderNameLabel": "Nom du dossier", - "folderNamePlaceholder": "ex: Commandes système, Scripts Docker", - "folderColorLabel": "Couleur du dossier", - "folderIconLabel": "Icône du dossier", - "previewLabel": "Aperçu", - "folderNameFallback": "Nom du dossier", - "createFolderButton": "Créer un dossier", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Annuler", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Tous", + "selectAll": "All", "selectNone": "Aucun", - "noTerminalTabsOpen": "Aucun onglet de terminal ouvert", - "searchPlaceholder": "Rechercher des snippets...", - "newSnippet": "Nouveau Snippet", - "newFolder": "Nouveau dossier", - "run": "Exécuter", - "noSnippetsInFolder": "Aucun extrait dans ce dossier", - "uncategorized": "Non catégorisé", - "editSnippetTitle": "Modifier le Snippet", - "editSnippetDescription": "Mettre à jour ce snippet de commande", - "saveSnippetButton": "Enregistrer les modifications", - "createSuccess": "Snippet créé avec succès", - "createFailed": "Impossible de créer un snippet", - "updateSuccess": "Snippet mis à jour avec succès", - "updateFailed": "Échec de la mise à jour du snippet", - "deleteFailed": "Impossible de supprimer le snippet", - "folderCreateSuccess": "Dossier créé avec succès", - "folderCreateFailed": "Impossible de créer le dossier", - "editFolderTitle": "Modifier le dossier", - "editFolderDescription": "Renommer ou modifier l'apparence de ce dossier", - "saveFolderButton": "Enregistrer les modifications", - "editFolder": "Modifier le dossier", - "deleteFolder": "Supprimer le dossier", - "folderDeleteSuccess": "Le dossier \"{{name}}\" a été supprimé", - "folderDeleteFailed": "Échec de la suppression du dossier", - "folderEditSuccess": "Dossier mis à jour avec succès", - "folderEditFailed": "Échec de la mise à jour du dossier", - "confirmRunMessage": "Exécutez \"{{name}}\"?", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Courir", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Courir", - "runSuccess": "Exécuter \"{{name}}\" dans un terminal {{count}}", - "copySuccess": "Copié «{{name}}» dans le presse-papiers", - "shareTitle": "Partager le Snippet", - "shareUser": "Utilisateur", - "shareRole": "Rôle", - "selectUser": "Sélectionnez un utilisateur...", - "selectRole": "Sélectionnez un rôle...", - "shareSuccess": "Snippet partagé avec succès", - "shareFailed": "Impossible de partager le snippet", - "revokeSuccess": "Accès révoqué", - "revokeFailed": "Impossible de révoquer l'accès", - "currentAccess": "Accès actuel", - "shareLoadError": "Impossible de charger les données de partage", - "loading": "Chargement en cours...", - "close": "Fermer", - "reorderFailed": "Impossible d'enregistrer l'ordre des extraits" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Impossible d'enregistrer l'ordre des extraits", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Compte client", - "sectionAppearance": "Apparence", - "sectionSecurity": "Sécurité", - "sectionApiKeys": "Clés API", - "sectionC2sTunnels": "Tunnels C2S", - "usernameLabel": "Nom d'utilisateur", - "roleLabel": "Rôle", - "roleAdministrator": "Administrateur", - "authMethodLabel": "Méthode d'authentification", - "authMethodLocal": "Locale", - "twoFaLabel": "A2F", - "twoFaOn": "Activé", - "twoFaOff": "Désactivé", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", "versionLabel": "Version", - "deleteAccount": "Supprimer le compte", - "deleteAccountDescription": "Supprimer définitivement votre compte", - "deleteButton": "Supprimez", - "deleteAccountPermanent": "Cette action est permanente et ne peut être annulée.", - "deleteAccountWarning": "Toutes les sessions, les hôtes, les identifiants et les paramètres seront supprimés définitivement.", - "confirmPasswordDeletePlaceholder": "Entrez votre mot de passe pour confirmer", - "languageLabel": "Langue", - "themeLabel": "Thème", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Couleur d'accentuation", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Auto-complétion de commande", - "commandAutocompleteDesc": "Afficher la saisie automatique lors de la saisie", - "historyTracking": "Suivi de l'historique", - "historyTrackingDesc": "Commandes de terminal de suivi", - "syntaxHighlighting": "Coloration syntaxique", - "syntaxHighlightingDesc": "Surligner la sortie du terminal", - "commandPalette": "Palette de commandes", - "commandPaletteDesc": "Activer le raccourci clavier", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Rouvrir les onglets à la connexion", "reopenTabsOnLoginDesc": "Vos onglets ouverts seront restaurés lorsque vous vous connectez ou actualisez la page, même depuis un autre appareil.", - "confirmTabClose": "Confirmer la fermeture de l'onglet", - "confirmTabCloseDesc": "Demander avant de fermer les onglets du terminal", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Afficher les tags de l'hôte", - "showHostTagsDesc": "Afficher les tags dans la liste des hôtes", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Cliquez pour afficher les actions de l'hôte", "hostTrayOnClickDesc": "Afficher systématiquement les boutons de connexion ; cliquer pour afficher les options de gestion au lieu de survoler.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Rail d'application Pin", "pinAppRailDesc": "Conserver le panneau latéral gauche toujours déployé au lieu de le déployer au survol.", - "settingsSnippets": "Extraits", - "foldersCollapsed": "Dossiers réduits", - "foldersCollapsedDesc": "Réduire les dossiers par défaut", - "confirmExecution": "Confirmer l'exécution", - "confirmExecutionDesc": "Confirmer avant d'exécuter des snippets", - "settingsUpdates": "Mises à jour", - "disableUpdateChecks": "Désactiver les vérifications de mise à jour", - "disableUpdateChecksDesc": "Arrêter la vérification des mises à jour", - "totpAuthenticator": "Authentificateur TOTP", - "totpEnabled": "L'authentification à deux facteurs est activée", - "totpDisabled": "Ajouter une sécurité de connexion supplémentaire", - "disable": "Désactiver", - "enable": "Activer", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Scannez le code QR ou entrez le secret dans votre application d'authentification, puis saisissez le code à 6 chiffres", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Vérifier", - "changePassword": "Changer le mot de passe", - "currentPasswordLabel": "Mot de passe actuel", - "currentPasswordPlaceholder": "Mot de passe actuel", - "newPasswordLabel": "Nouveau mot de passe", - "newPasswordPlaceholder": "Nouveau mot de passe", - "confirmPasswordLabel": "Confirmer le nouveau mot de passe", - "confirmPasswordPlaceholder": "Confirmer le nouveau mot de passe", - "updatePassword": "Mettre à jour le mot de passe", - "createApiKeyTitle": "Créer une clé API", - "createApiKeyDescription": "Générer une nouvelle clé API pour l'accès programmatique.", - "apiKeyNameLabel": "Nom", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "optionnel", - "cancel": "Abandonner", - "createKey": "Créer une clé", - "apiKeyCount": "Clés {{count}}", - "newKey": "Nouvelle clé", - "noApiKeys": "Aucune clé API pour le moment.", - "apiKeyActive": "Actif", - "apiKeyUsageHint": "Inclure votre clé dans le", - "apiKeyUsageHintHeader": "en-tête.", - "apiKeyPermissionsHint": "Les clés héritent des permissions de l'utilisateur créateur.", - "roleUser": "Utilisateur", - "authMethodDual": "Double Auth", + "optional": "optional", + "cancel": "Annuler", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Impossible de démarrer la configuration TOTP", - "totpEnter6Digits": "Entrez un code à 6 chiffres", - "totpEnabledSuccess": "Authentification à deux facteurs activée", - "totpInvalidCode": "Code invalide, veuillez réessayer", - "totpDisableInputRequired": "Entrez votre code TOTP ou votre mot de passe", - "totpDisabledSuccess": "Authentification à deux facteurs désactivée", - "totpDisableFailed": "Échec de la désactivation de l'A2F", - "totpDisableTitle": "Désactiver l'A2F", - "totpDisablePlaceholder": "Entrez le code TOTP ou le mot de passe", - "totpDisableConfirm": "Désactiver l'A2F", - "totpContinueVerify": "Continuer à vérifier", - "totpVerifyTitle": "Vérifier le code", - "totpBackupTitle": "Codes de sauvegarde", - "totpDownloadBackup": "Télécharger les codes de sauvegarde", - "done": "Fait", - "secretCopied": "Secret copié dans le presse-papiers", - "apiKeyNameRequired": "Le nom de la clé est requis", - "apiKeyCreated": "Clé API \"{{name}}\" créée", - "apiKeyCreateFailed": "Impossible de créer la clé API", - "apiKeyUser": "Utilisateur", - "apiKeyExpires": "Expire", - "apiKeyRevoked": "Clé API \"{{name}}\" révoquée", - "apiKeyRevokeFailed": "Impossible de révoquer la clé API", - "passwordFieldsRequired": "Les mots de passe actuels et nouveaux sont requis", - "passwordMismatch": "Les mots de passe ne correspondent pas", - "passwordTooShort": "Le mot de passe doit comporter au moins 6 caractères", - "passwordUpdated": "Mot de passe mis à jour avec succès", - "passwordUpdateFailed": "Échec de la mise à jour du mot de passe", - "deletePasswordRequired": "Le mot de passe est requis pour supprimer votre compte", - "deleteFailed": "Échec de la suppression du compte", - "deleting": "Suppression en cours...", - "colorPickerTooltip": "Ouvrir le sélecteur de couleurs", - "themeSystem": "Système", - "themeLight": "Lumière", - "themeDark": "Sombre", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarisé", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Un Noir", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Étiquettes", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Réessayer", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Retirer", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/he_IL.json b/src/ui/locales/translated/he_IL.json index daceed89..4cd0fb28 100644 --- a/src/ui/locales/translated/he_IL.json +++ b/src/ui/locales/translated/he_IL.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "תיקיות", - "folder": "תיקייה", - "password": "סִיסמָה", - "key": "מַפְתֵחַ", - "sshPrivateKey": "מפתח פרטי SSH", - "upload": "העלאה", - "keyPassword": "סיסמת מפתח", - "sshKey": "מפתח SSH", - "uploadPrivateKeyFile": "העלאת קובץ מפתח פרטי", - "searchCredentials": "חיפוש פרטי גישה...", - "addCredential": "הוסף אישור", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "תעודת CA (-cert.pub)", "caCertificateDescription": "אופציונלי: העלה או הדבק את קובץ האישור החתום על ידי רשות האישור (לדוגמה, id_ed25519-cert.pub). נדרש כאשר שרת ה-SSH שלך משתמש בהרשאה מבוססת אישורים.", "uploadCertFile": "העלאת קובץ -cert.pub", - "clearCert": "בָּרוּר", + "clearCert": "Clear", "certLoaded": "האישור נטען", "certPublicKeyLabel": "תעודת CA", "certTypeLabel": "סוג התעודה", "pasteOrUploadCert": "הדבק או העלה אישור -cert.pub...", "hasCaCert": "בעל תעודת CA", - "noCaCert": "אין תעודת CA" + "noCaCert": "אין תעודת CA", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "סדר ברירת מחדל", + "sortNameAsc": "שם (א' → ת')", + "sortNameDesc": "שם (ת → א)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "נקה מסננים", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "טעינת ההתראות נכשלה", - "failedToDismissAlert": "נכשלה סגירת ההתראה" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "תצורת שרת", - "description": "הגדר את כתובת ה-URL של שרת Termix כדי להתחבר לשירותי ה-backend שלך", - "serverUrl": "כתובת URL של השרת", - "enterServerUrl": "אנא הזן כתובת URL של שרת", - "saveFailed": "שמירת התצורה נכשלה", - "saveError": "שגיאה בשמירת התצורה", - "saving": "חִסָכוֹן...", - "saveConfig": "שמור תצורה", - "helpText": "הזן את כתובת ה-URL שבה פועל שרת ה-Termix שלך (לדוגמה, http://localhost:30001 או https://your-server.com)", - "changeServer": "שנה שרת", - "mustIncludeProtocol": "כתובת השרת חייבת להתחיל ב-http:// או https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "אפשר אישור לא חוקי", "allowInvalidCertificateDesc": "השתמש רק עבור שרתים מהימנים המתארחים בעצמם עם אישורי חתימה עצמית או אישורי כתובת IP.", - "useEmbedded": "השתמש בשרת מקומי", - "embeddedDesc": "הפעל את Termix עם השרת המקומי המובנה (אין צורך בשרת מרוחק)", - "embeddedConnecting": "מתחבר לשרת מקומי...", - "embeddedNotReady": "השרת המקומי עדיין לא מוכן. אנא המתן רגע ונסה שוב.", - "localServer": "שרת מקומי" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "שרת מקומי", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "שגיאת בדיקת גרסה", - "checkFailed": "נכשל בבדיקת עדכונים", - "upToDate": "האפליקציה מעודכנת", - "currentVersion": "אתה משתמש בגרסה {{version}}", - "updateAvailable": "עדכון זמין", - "newVersionAvailable": "גרסה חדשה זמינה! אתה מפעיל את {{current}}, אבל {{latest}} זמין.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "גרסת בטא", - "betaVersionDesc": "אתה מפעיל את {{current}}, שהוא חדש יותר מהגרסה היציבה האחרונה {{latest}}.", - "releasedOn": "יצא לאור בתאריך {{date}}", - "downloadUpdate": "הורד עדכון", - "checking": "בודק עדכונים...", - "checkUpdates": "בדוק אם יש עדכונים", - "checkingUpdates": "בודק עדכונים...", - "updateRequired": "נדרש עדכון" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "לִסְגוֹר", - "minimize": "לְצַמְצֵם", - "online": "באינטרנט", - "offline": "לא מקוון", - "continue": "לְהַמשִׁיך", - "maintenance": "תַחזוּקָה", - "degraded": "מוּשׁפָל", - "error": "שְׁגִיאָה", - "warning": "אַזהָרָה", - "unsavedChanges": "שינויים שלא נשמרו", - "dismiss": "לְפַטֵר", - "loading": "טְעִינָה...", - "optional": "אופציונלי", - "connect": "לְחַבֵּר", - "copied": "מוּעֲתָק", - "connecting": "מְקַשֵׁר...", - "updateAvailable": "עדכון זמין", - "appName": "טרמיקס", - "openInNewTab": "פתח בכרטיסייה חדשה", - "noReleases": "אין פרסומים", - "updatesAndReleases": "עדכונים ומהדורות", - "newVersionAvailable": "גרסה חדשה ({{version}}זמינה.", - "failedToFetchUpdateInfo": "נכשל באחזור פרטי העדכון", - "preRelease": "טרום-הפצה", - "noReleasesFound": "לא נמצאו מהדורות.", - "cancel": "לְבַטֵל", - "username": "שם משתמש", - "login": "כְּנִיסָה לַמַעֲרֶכֶת", - "register": "לִרְשׁוֹם", - "password": "סִיסמָה", - "confirmPassword": "אשר סיסמה", - "back": "בְּחֲזָרָה", - "save": "לְהַצִיל", - "saving": "חִסָכוֹן...", - "delete": "לִמְחוֹק", - "rename": "שינוי שם", - "edit": "לַעֲרוֹך", - "add": "לְהוֹסִיף", - "confirm": "לְאַשֵׁר", - "no": "לֹא", - "or": "אוֹ", - "next": "הַבָּא", - "previous": "קוֹדֵם", - "refresh": "לְרַעֲנֵן", - "language": "שָׂפָה", - "checking": "בודק...", - "checkingDatabase": "בודק חיבור למסד הנתונים...", - "checkingAuthentication": "בודק אימות...", - "backendReconnected": "חיבור השרת שוחזר", - "connectionDegraded": "חיבור השרת אבד, מתאושש…", - "reload": "לִטעוֹן מִחָדָשׁ", - "remove": "לְהַסִיר", - "create": "לִיצוֹר", - "update": "לְעַדְכֵּן", - "copy": "לְהַעְתִיק", - "copyFailed": "נכשל בהעתקה ללוח", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "לְהַגדִיל", "restore": "לְשַׁחְזֵר", - "of": "שֶׁל" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "בַּיִת", - "terminal": "מָסוֹף", - "docker": "דוקר", - "tunnels": "מנהרות", - "fileManager": "מנהל הקבצים", - "serverStats": "סטטיסטיקות שרת", - "admin": "מנהל", - "userProfile": "פרופיל משתמש", - "splitScreen": "מסך מפוצל", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "לסגור את ההפעלה הפעילה הזו?", - "close": "לִסְגוֹר", - "cancel": "לְבַטֵל", - "sshManager": "מנהל SSH", - "cannotSplitTab": "לא ניתן לפצל את הכרטיסייה הזו", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "העתקת סיסמה", - "copySudoPassword": "העתקת סיסמת סודו", - "passwordCopied": "הסיסמה הועתקה ללוח", - "noPasswordAvailable": "אין סיסמה זמינה", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "העתקת הסיסמה נכשלה", "refreshTab": "רענן את החיבור", - "openFileManager": "פתח את מנהל הקבצים", - "dashboard": "לוּחַ מַחווָנִים", - "networkGraph": "גרף הרשת", - "quickConnect": "חיבור מהיר", - "sshTools": "כלי SSH", - "history": "הִיסטוֹרִיָה", - "hosts": "מארחים", - "snippets": "קטעי טקסט", - "hostManager": "מנהל מארח", - "credentials": "אישורים", - "connections": "חיבורים", - "roleAdministrator": "מְנַהֵל", - "roleUser": "מִשׁתַמֵשׁ" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "מארחים", - "noHosts": "אין מארחי SSH", - "retry": "נסה שוב", - "refresh": "לְרַעֲנֵן", - "optional": "אופציונלי", - "downloadSample": "הורד דוגמה", - "failedToDeleteHost": "נכשלה המחיקה של {{name}}", - "importSkipExisting": "ייבוא (דלג על קיים)", - "connectionDetails": "פרטי חיבור", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "טלנט", - "remoteDesktop": "שולחן עבודה מרוחק", - "port": "נָמָל", - "username": "שם משתמש", - "folder": "תיקייה", - "tags": "תגיות", - "pin": "פִּין", - "addHost": "הוסף מארח", - "editHost": "עריכת מארח", - "cloneHost": "מארח משוכפל", - "enableTerminal": "הפעלת טרמינל", - "enableTunnel": "הפעלת מנהרה", - "enableFileManager": "הפעל את מנהל הקבצים", - "enableDocker": "הפעל את Docker", - "defaultPath": "נתיב ברירת מחדל", - "connection": "קֶשֶׁר", - "upload": "העלאה", - "authentication": "אימות", - "password": "סִיסמָה", - "key": "מַפְתֵחַ", - "credential": "תְעוּדָה", - "none": "אַף לֹא אֶחָד", - "sshPrivateKey": "מפתח פרטי SSH", - "keyType": "סוג מפתח", - "uploadFile": "העלאת קובץ", - "tabGeneral": "כְּלָלִי", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "מנהרות", - "tabDocker": "דוקר", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "קבצים", - "tabStats": "סטטיסטיקות", - "tabTelnet": "טלנט", - "tabSharing": "שיתוף", - "tabAuthentication": "אימות", - "terminal": "מָסוֹף", - "tunnel": "מִנהָרָה", - "fileManager": "מנהל הקבצים", - "serverStats": "סטטיסטיקות שרת", - "status": "סטָטוּס", - "folderRenamed": "תיקיית \"{{oldName}}\" שמה שונה בהצלחה ל- \"{{newName}}\"", - "failedToRenameFolder": "נכשל שינוי שם התיקייה", - "movedToFolder": "הועבר אל \"{{folder}}\"", - "editHostTooltip": "עריכת מארח", - "statusChecks": "בדיקות סטטוס", - "metricsCollection": "אוסף מדדים", - "metricsInterval": "מרווח איסוף מדדים", - "metricsIntervalDesc": "באיזו תדירות לאסוף סטטיסטיקות שרת (5 שניות - שעה)", - "behavior": "הִתְנַהֲגוּת", - "themePreview": "תצוגה מקדימה של ערכת נושא", - "theme": "נוֹשֵׂא", - "fontFamily": "משפחת גופנים", - "fontSize": "גודל גופן", - "letterSpacing": "ריווח אותיות", - "lineHeight": "גובה הקו", - "cursorStyle": "סגנון הסמן", - "cursorBlink": "מצמוץ סמן", - "scrollbackBuffer": "מאגר גלילה לאחור", - "bellStyle": "סגנון בל", - "rightClickSelectsWord": "לחיצה ימנית בוחרת מילה", - "fastScrollModifier": "שינוי גלילה מהירה", - "fastScrollSensitivity": "רגישות גלילה מהירה", - "sshAgentForwarding": "העברת סוכן SSH", - "backspaceMode": "מצב Backspace", - "startupSnippet": "קטע הפעלה", - "selectSnippet": "בחר קטע", - "forceKeyboardInteractive": "כפיית מקלדת אינטראקטיבית", - "overrideCredentialUsername": "עקיפת שם משתמש של פרטי כניסה", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "השתמש בשם המשתמש שצוין למעלה במקום שם המשתמש של פרטי האישור", - "jumpHostChain": "שרשרת מארח קפיצה", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "פורט נוקינג", "addKnock": "הוסף יציאה", "addProxyNode": "הוסף צומת", - "proxyNode": "צומת פרוקסי", - "proxyType": "סוג פרוקסי", - "quickActions": "פעולות מהירות", - "sudoPasswordAutoFill": "מילוי אוטומטי של סיסמאות Sudo", - "sudoPassword": "סיסמת סודו", - "keepaliveInterval": "מרווח זמן שמירה (מילישניות)", - "moshCommand": "פיקוד MOSH", - "environmentVariables": "משתני סביבה", - "addVariable": "הוסף משתנה", - "docker": "דוקר", - "copyTerminalUrl": "העתקת כתובת URL של הטרמינל", - "copyFileManagerUrl": "העתקת כתובת URL של מנהל הקבצים", - "copyRemoteDesktopUrl": "העתקת כתובת URL של שולחן עבודה מרוחק", - "failedToConnect": "נכשלה ההתחברות לקונסולה", - "connect": "לְחַבֵּר", - "disconnect": "לְנַתֵק", - "start": "הַתחָלָה", - "enableStatusCheck": "הפעל בדיקת סטטוס", - "enableMetrics": "הפעל מדדים", - "bulkUpdateFailed": "עדכון בכמות גדולה נכשל", - "selectAll": "בחר הכל", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "בטל את הבחירה של הכל", "protocols": "פרוטוקולים", "secureShell": "מעטפת מאובטחת", @@ -272,6 +303,9 @@ "unencryptedShell": "מעטפת לא מוצפנת", "addressIp": "כתובת / IP", "friendlyName": "שם ידידותי", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "תיקיות ומתקדם", "privateNotes": "הערות פרטיות", "privateNotesPlaceholder": "פרטים על השרת הזה...", @@ -281,18 +315,18 @@ "addKnockBtn": "הוסף דפיקה", "noPortKnocking": "לא הוגדרה הגדרת \"קישור לפורט\".", "knockPort": "נוק פורט", - "protocol": "פּרוֹטוֹקוֹל", + "protocol": "Protocol", "delayAfterMs": "עיכוב לאחר (מילישניות)", "useSocks5Proxy": "השתמש בפרוקסי SOCKS5", "useSocks5ProxyDesc": "ניתוב חיבור דרך שרת פרוקסי", - "proxyHost": "מארח פרוקסי", - "proxyPort": "יציאת פרוקסי", - "proxyUsername": "שם משתמש פרוקסי", - "proxyPassword": "סיסמת פרוקסי", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "פרוקסי יחיד", - "proxyChainMode": "שרשרת פרוקסי", + "proxyChainMode": "Proxy Chain", "you": "אַתָה", - "jumpHostChainLabel": "שרשרת מארח קפיצה", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "הוסף קפיצה", "noJumpHosts": "לא הוגדרו מארחי קפיצה.", "selectAServer": "בחר שרת...", @@ -300,10 +334,10 @@ "authMethod": "שיטת אימות", "storedCredential": "אישורים מאוחסנים", "selectACredential": "בחר אישור...", - "keyTypeLabel": "סוג מפתח", - "keyTypeAuto": "זיהוי אוטומטי", - "keyPasteTab": "לְהַדבִּיק", - "keyUploadTab": "העלאה", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "קובץ המפתח נטען", "keyUploadClick": "לחץ כדי להעלות קובץ .pem / .key / .ppk", "clearKey": "מקש נקה", @@ -311,59 +345,105 @@ "keyReplaceNotice": "הדבק מפתח חדש למטה כדי להחליף אותו", "keyPassphraseSaved": "סיסמת הסיסמה נשמרה, הקלד כדי לשנות", "replaceKey": "החלפת מפתח", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "כוח מקלדת אינטראקטיבי", "forceKeyboardInteractiveShortDesc": "כפיית הזנת סיסמה ידנית גם אם קיימים מפתחות", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "מראה הטרמינל", "colorTheme": "ערכת צבעים", - "fontFamilyLabel": "משפחת גופנים", - "fontSizeLabel": "גודל גופן", - "cursorStyleLabel": "סגנון הסמן", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "ריווח בין אותיות (פיקסלים)", - "lineHeightLabel": "גובה הקו", - "bellStyleLabel": "סגנון בל", - "backspaceModeLabel": "מצב Backspace", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "סמן מהבהב", "cursorBlinkingDesc": "הפעל אנימציה מהבהבת עבור סמן הטרמינל", "rightClickSelectsWordLabel": "לחיצה ימנית בוחרת מילה", "rightClickSelectsWordShortDesc": "בחר את המילה שמתחת לסמן בלחיצה ימנית", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "הדגשת תחביר", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "חותמות זמן", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "התנהגות ומתקדם", - "scrollbackBufferLabel": "מאגר גלילה לאחור", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "מספר השורות המרבי שנשמר בהיסטוריה", - "sshAgentForwardingLabel": "העברת סוכן SSH", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "העבירו את מפתחות ה-SSH המקומיים שלכם למארח הזה", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "הפעלת מודעות אוטומטית", "enableAutoMoshDesc": "העדיפו Mosh על פני SSH אם זמין", "enableAutoTmux": "הפעל את Auto-Tmux", "enableAutoTmuxDesc": "הפעל או צורף אוטומטית לסשן tmux", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "מילוי אוטומטי של סיסמת סודו", "sudoPasswordAutoFillShortDesc": "ספק סיסמת sudo באופן אוטומטי כאשר תתבקש", - "sudoPasswordLabel": "סיסמת סודו", - "environmentVariablesLabel": "משתני סביבה", - "addVariableBtn": "הוסף משתנה", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "לא הוגדרו משתני סביבה.", - "fastScrollModifierLabel": "שינוי גלילה מהירה", - "fastScrollSensitivityLabel": "רגישות גלילה מהירה", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "פיקוד מוש", - "startupSnippetLabel": "קטע הפעלה", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "מרווח זמן שמירה (שניות)", "maxKeepaliveMisses": "מקס קיפלייב מחמיץ", "tunnelSettings": "הגדרות מנהרה", "enableTunneling": "הפעלת מנהור", "enableTunnelingDesc": "הפעל פונקציונליות מנהרת SSH עבור מארח זה", "serverTunnelsSection": "מנהרות שרתים", - "addTunnelBtn": "הוסף מנהרה", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "לא הוגדרו מנהרות.", - "tunnelLabel": "מנהרה {{number}}", - "tunnelType": "סוג מנהרה", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "העברת פורט מקומי לפורט בשרת מרוחק (או למארח שניתן להגיע אליו ממנו).", "tunnelModeRemoteDesc": "העבר פורט בשרת המרוחק חזרה לפורט מקומי במחשב שלך.", "tunnelModeDynamicDesc": "צור פרוקסי SOCKS5 בפורט מקומי עבור העברת פורטים דינמית.", "sameHost": "מארח זה (מנהרה ישירה)", "endpointHost": "מארח נקודת קצה", - "endpointPort": "יציאת נקודת קצה", + "endpointPort": "Endpoint Port", "bindHost": "מארח קשירה", - "sourcePort": "יציאת מקור", - "maxRetries": "מקסימום ניסיונות חוזרים", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "מרווח זמן של ניסיון חוזר (ים)", "autoStartLabel": "הפעלה אוטומטית", "autoStartDesc": "חבר אוטומטית את המנהרה הזו כאשר המארח נטען", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "נכשל בחיבור", "failedToDisconnectTunnel": "נכשל הניתוק", "dockerIntegration": "אינטגרציה עם Docker", - "enableDockerMonitor": "הפעל את Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "ניטור וניהול של מכולות במארח זה באמצעות Docker", - "enableFileManagerMonitor": "הפעל את מנהל הקבצים", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "עיון וניהול קבצים במארח זה דרך SFTP", - "defaultPathLabel": "נתיב ברירת מחדל", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "הספרייה שתיפתח כאשר מנהל הקבצים יופעל עבור מארח זה.", - "statusChecksLabel": "בדיקות סטטוס", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "הפעל בדיקות סטטוס", "enableStatusChecksDesc": "בצע פינג מעת לעת למארח הזה כדי לוודא זמינות", "useGlobalInterval": "השתמש במרווח גלובלי", "useGlobalIntervalDesc": "עקיפה עם מרווח בדיקת המצב הכולל של השרת", "checkIntervalS": "מרווח זמן בדיקה (ים)", "checkIntervalDesc": "שניות בין כל פינג קישוריות", - "metricsCollectionLabel": "אוסף מדדים", - "enableMetricsLabel": "הפעל מדדים", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "איסוף נתוני שימוש במעבד, זיכרון RAM, דיסק ורשת ממארח זה", "useGlobalMetrics": "השתמש במרווח גלובלי", "useGlobalMetricsDesc": "עקיפה עם מרווח המדדים הכולל של השרת", "metricsIntervalS": "מרווח מדדים (ים)", "metricsIntervalDesc2": "שניות בין תמונות מצב של מדדים", "visibleWidgets": "ווידג'טים גלויים", - "cpuUsageLabel": "שימוש במעבד", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "אחוז המעבד, ממוצעי עומס, גרף תרשים ניצוץ", - "memoryLabel": "שימוש בזיכרון", + "memoryLabel": "Memory Usage", "memoryDesc": "שימוש ב-RAM, החלפה, אחסון במטמון", - "storageLabel": "שימוש בדיסק", + "storageLabel": "Disk Usage", "storageDesc": "שימוש בדיסק לכל נקודת הרכבה", - "networkLabel": "ממשקי רשת", + "networkLabel": "Network Interfaces", "networkDesc": "רשימת ממשקים ורוחב פס", - "uptimeLabel": "זמן פעולה", + "uptimeLabel": "Uptime", "uptimeDesc": "זמן פעולה וזמן אתחול של המערכת", "systemInfoLabel": "מידע מערכת", "systemInfoDesc": "מערכת הפעלה, ליבה, שם מארח, ארכיטקטורה", @@ -409,61 +532,100 @@ "recentLoginsDesc": "אירועי התחברות מוצלחים ונכשלים", "topProcessesLabel": "תהליכים מובילים", "topProcessesDesc": "PID, CPU%, MEM%, פקודה", - "listeningPortsLabel": "יציאות האזנה", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "פתיחת פורטים עם תהליך ומצב", - "firewallLabel": "חומת אש", + "firewallLabel": "Firewall", "firewallDesc": "חומת אש, AppArmor, סטטוס SELinux", - "quickActionsLabel": "פעולות מהירות", - "quickActionsToolbar": "פעולות מהירות מופיעות ככפתורים בסרגל הכלים של סטטיסטיקות השרת לביצוע פקודה בלחיצה אחת.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "אין עדיין פעולות מהירות.", "buttonLabel": "תווית כפתור", "selectSnippetPlaceholder": "בחר קטע...", "addActionBtn": "הוסף פעולה", "hostSharedSuccessfully": "המארח שותף בהצלחה", - "failedToShareHost": "נכשל בשיתוף המארח", + "failedToShareHost": "Failed to share host", "accessRevoked": "הגישה בוטלה", - "failedToRevokeAccess": "ביטול הגישה נכשל", - "cancelBtn": "לְבַטֵל", - "savingBtn": "חִסָכוֹן...", - "addHostBtn": "הוסף מארח", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "המארח עודכן", "hostCreated": "מארח נוצר", "failedToSave": "שמירת המארח נכשלה", "credentialUpdated": "אישור עודכן", "credentialCreated": "נוצר אישור", - "failedToSaveCredential": "שמירת האישורים נכשלה", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "חזרה למארחים", "backToCredentials": "חזרה לאישורים", - "pinned": "מוצמד", - "noHostsFound": "לא נמצאו מארחים", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "נסה מונח אחר", "addFirstHost": "הוסף את המארח הראשון שלך כדי להתחיל", "noCredentialsFound": "לא נמצאו אישורים", - "addCredentialBtn": "הוסף אישור", - "updateCredentialBtn": "עדכון אישורים", - "features": "תכונות", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(אין תיקייה)", - "deleteSelected": "לִמְחוֹק", + "deleteSelected": "Delete", "exitSelection": "יציאה מבחירה", - "importSkip": "ייבוא (דלג על קיים)", + "importSkip": "Import (skip existing)", "importOverwrite": "ייבוא (החלפה)", "collapseBtn": "הִתמוֹטְטוּת", "importExportBtn": "ייבוא / ייצוא", "hostStatusesRefreshed": "סטטוסים של מארחים רעננו", "failedToRefreshHosts": "רענון המארחים נכשל", - "movedHostTo": "הועבר {{host}} ל-\"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "העברת המארח נכשלה", - "folderRenamedTo": "שם התיקייה הוא \"{{name}}\"", - "deletedFolder": "תיקייה שנמחקה \"{{name}}\"", - "failedToDeleteFolder": "מחיקת התיקייה נכשלה", - "deleteAllInFolder": "למחוק את כל המארחים ב-\"{{name}}\"? לא ניתן לבטל פעולה זו.", - "deletedHost": "נמחק {{name}}", - "copiedToClipboard": "הועתק ללוח", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "עריכת תיקייה", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "עריכת תיקייה", + "deleteFolder": "מחיקת תיקייה", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "העברת המארחים נכשלה", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "כתובת ה-URL של הטרמינל הועתקה", "fileManagerUrlCopied": "כתובת ה-URL של מנהל הקבצים הועתקה", "tunnelUrlCopied": "כתובת ה-URL של המנהרה הועתקה", "dockerUrlCopied": "כתובת ה-URL של Docker הועתקה", - "serverStatsUrlCopied": "כתובת האתר של סטטיסטיקות השרת הועתקה", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "כתובת ה-URL של RDP הועתקה", "vncUrlCopied": "כתובת ה-URL של VNC הועתקה", "telnetUrlCopied": "כתובת ה-URL של Telnet הועתקה", @@ -471,109 +633,112 @@ "expandActions": "הרחב פעולות", "collapseActions": "פעולות כיווץ", "wakeOnLanAction": "התעוררות ברשת מקומית (LAN)", - "wakeOnLanSuccess": "חבילת קסם נשלחה אל {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "שליחת חבילת הקסם נכשלה", - "cloneHostAction": "מארח משוכפל", + "cloneHostAction": "Clone Host", "copyAddress": "העתקת כתובת", "copyLink": "העתק קישור", - "copyTerminalUrlAction": "העתקת כתובת URL של הטרמינל", - "copyFileManagerUrlAction": "העתקת כתובת URL של מנהל הקבצים", - "copyTunnelUrlAction": "העתקת כתובת URL של המנהרה", - "copyDockerUrlAction": "העתקת כתובת URL של Docker", - "copyServerStatsUrlAction": "העתקת כתובת URL של סטטיסטיקות שרת", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "העתקת כתובת URL של RDP", "copyVncUrlAction": "העתקת כתובת URL של VNC", "copyTelnetUrlAction": "העתקת כתובת URL של Telnet", - "copyRemoteDesktopUrlAction": "העתקת כתובת URL של שולחן עבודה מרוחק", - "deleteCredentialConfirm": "למחוק את פרטי הכניסה \"{{name}}\"?", - "deletedCredential": "נמחק {{name}}", - "deploySSHKeyTitle": "פריסת מפתח SSH", - "deployingBtn": "פריסה...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "לִפְרוֹס", "failedToDeployKey": "פריסת המפתח נכשלה", - "deleteHostsConfirm": "מחיקת {{count}} מארח{{plural}}? לא ניתן לבטל פעולה זו.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "הועבר לשורש", - "failedToMoveHosts": "העברת המארחים נכשלה", - "enableTerminalFeature": "הפעלת טרמינל", - "disableTerminalFeature": "השבתת הטרמינל", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "הפעל קבצים", "disableFilesFeature": "השבת קבצים", "enableTunnelsFeature": "הפעל מנהרות", "disableTunnelsFeature": "השבת מנהרות", - "enableDockerFeature": "הפעל את Docker", - "disableDockerFeature": "השבת את Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "הוסף תגיות...", "authDetails": "פרטי אימות", - "credType": "סוּג", + "credType": "Type", "generateKeyPairDesc": "צור זוג מפתחות חדש, המפתחות הפרטיים והציבוריים ימולאו אוטומטית.", "generatingKey": "יוצר...", - "generateLabel": "צור {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "העלאת קובץ", "keyPassphraseOptional": "סיסמת מפתח (אופציונלי)", "sshPublicKeyOptional": "מפתח ציבורי SSH (אופציונלי)", "publicKeyGenerated": "מפתח ציבורי נוצר", "failedToGeneratePublicKey": "נכשל ביצירת מפתח ציבורי", "publicKeyCopied": "המפתח הציבורי הועתק", - "keyPairGenerated": "נוצר זוג מפתחות {{label}}", - "failedToGenerateKeyPair": "נכשל ביצירת זוג המפתחות", - "searchHostsPlaceholder": "חיפוש מארחים, כתובות, תגיות…", - "searchCredentialsPlaceholder": "פרטי חיפוש…", - "refreshBtn": "לְרַעֲנֵן", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "הוסף תגיות...", - "deleteConfirmBtn": "לִמְחוֹק", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "שרת ה-SSH חייב להגדיר את האפשרויות GatewayPorts כן, AllowTcpForwarding כן, ו-PermitRootLogin כן ב-/etc/ssh/sshd_config.", - "deleteHostConfirm": "למחוק את \"{{name}}\"?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "הפעל לפחות פרוטוקול אחד לעיל כדי להגדיר הגדרות אימות וחיבור.", - "keyPassphrase": "סיסמת מפתח", - "connectBtn": "לְחַבֵּר", - "disconnectBtn": "לְנַתֵק", - "basicInformation": "מידע בסיסי", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "פרטי אימות", - "credTypeLabel": "סוּג", - "hostsTab": "מארחים", - "credentialsTab": "אישורים", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "בחר מספר רב", "selectHosts": "בחירת מארחים", - "connectionLabel": "קֶשֶׁר", - "authenticationLabel": "אימות", - "generateKeyPairTitle": "צור זוג מפתחות", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "צור זוג מפתחות חדש, המפתחות הפרטיים והציבוריים ימולאו אוטומטית.", - "generateFromPrivateKey": "יצירה ממפתח פרטי", - "refreshBtn2": "לְרַעֲנֵן", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "יציאה מבחירה", "exportAll": "ייצוא הכל", - "addHostBtn2": "הוסף מארח", - "addCredentialBtn2": "הוסף אישור", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "בודק סטטוסים של מארחים...", - "pinnedSection": "מוצמד", + "pinnedSection": "Pinned", "hostsExported": "מארחים יוצאו בהצלחה", "exportFailed": "ייצוא המארחים נכשל", "sampleDownloaded": "קובץ לדוגמה שהורד", - "failedToDeleteCredential2": "מחיקת האישורים נכשלה", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(אין תיקייה)", - "nSelected": "{{count}} נבחר", - "featuresMenu": "תכונות", - "moveMenu": "מַהֲלָך", - "cancelSelection": "לְבַטֵל", - "deployDialogDesc": "פרוס את {{name}} למפתחות authorized של מחשב מארח.", - "targetHostLabel": "מארח היעד", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "בחר מארח...", "keyDeployedSuccess": "המפתח נפרס בהצלחה", "failedToDeployKey2": "פריסת המפתח נכשלה", - "deletedCount": "מחיקת מארחים {{count}}", - "failedToDeleteCount": "נכשלה מחיקת המארחים {{count}}", - "duplicatedHost": "משוכפל \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "שכפול המארח נכשל", - "updatedCount": "מארחים מעודכנים {{count}}", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "שם ידידותי", - "descriptionLabel": "תֵאוּר", + "descriptionLabel": "Description", "loadingHost": "טוען מארח...", - "loadingHosts": "טוען מארחים...", - "loadingCredentials": "טוען אישורים...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "עדיין אין מארחים", - "noHostsMatchSearch": "אין מארחים התואמים את החיפוש שלך", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "המארח לא נמצא", - "searchHosts": "חיפוש מארחים...", + "searchHosts": "Search hosts...", "sortHosts": "מיין מארחים", "sortDefault": "סדר ברירת מחדל", "sortNameAsc": "שם (א' → ת')", @@ -585,84 +750,97 @@ "sortPinnedFirst": "הוצמד ראשון", "filterHosts": "סנן מארחים", "filterClearAll": "נקה מסננים", - "filterStatusGroup": "סטָטוּס", - "filterOnline": "באינטרנט", - "filterOffline": "לא מקוון", - "filterPinned": "מוצמד", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "סוג אימות", - "filterAuthPassword": "סִיסמָה", - "filterAuthKey": "מפתח SSH", - "filterAuthCredential": "תְעוּדָה", - "filterAuthNone": "אַף לֹא אֶחָד", - "filterAuthOpkssh": "אופקש", - "filterProtocolGroup": "פּרוֹטוֹקוֹל", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", + "filterAuthOpkssh": "OPKSSH", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", - "filterProtocolTelnet": "טלנט", - "filterFeaturesGroup": "תכונות", - "filterFeatureTerminal": "מָסוֹף", - "filterFeatureFileManager": "מנהל הקבצים", - "filterFeatureTunnel": "מִנהָרָה", - "filterFeatureDocker": "דוקר", - "filterTagsGroup": "תגיות", - "shareHost": "שתף מארח", - "shareHostTitle": "שתף: {{name}}", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "מארח זה חייב להשתמש באישור כדי לאפשר שיתוף. ערוך את המארח והקצה אישור תחילה." }, "guac": { - "connection": "קֶשֶׁר", - "authentication": "אימות", - "connectionSettings": "הגדרות חיבור", - "displaySettings": "הגדרות תצוגה", - "audioSettings": "הגדרות שמע", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "אישורים מאוחסנים", + "noCredential": "No credential (direct credentials below)", + "authMethod": "שיטת אימות", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "בחר אישור...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "ביצועי RDP", - "deviceRedirection": "ניתוב מחדש של מכשירים", - "session": "מוֹשָׁב", - "gateway": "כְּנִיסָה", - "remoteApp": "אפליקציה מרחוק", - "clipboard": "לוח גזירה", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "הקלטת סשן", - "wakeOnLan": "התעוררות ברשת LAN", - "vncSettings": "הגדרות VNC", - "terminalSettings": "הגדרות מסוף", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "יציאת RDP", - "username": "שם משתמש", - "password": "סִיסמָה", - "domain": "תְחוּם", - "securityMode": "מצב אבטחה", - "colorDepth": "עומק צבע", - "width": "רוֹחַב", - "height": "גוֹבַה", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "שיטת שינוי גודל", - "clientName": "שם הלקוח", - "initialProgram": "תוכנית ראשונית", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "פריסת שרת", - "timezone": "אזור זמן", - "gatewayHostname": "שם מארח השער", - "gatewayPort": "שער היציאה", - "gatewayUsername": "שם משתמש של השער", - "gatewayPassword": "סיסמת השער", - "gatewayDomain": "דומיין שער", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "תוכנית RemoteApp", "workingDirectory": "ספריית עבודה", "arguments": "טיעונים", "normalizeLineEndings": "נרמול סיומות שורות", - "recordingPath": "נתיב ההקלטה", - "recordingName": "שם ההקלטה", - "macAddress": "כתובת MAC", - "broadcastAddress": "כתובת שידור", - "udpPort": "יציאת UDP", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "זמן המתנה (שניות)", - "driveName": "שם הכונן", - "drivePath": "נתיב הנסיעה", - "ignoreCertificate": "התעלם מהתעודה", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "אפשר חיבורים למארחים עם אישורים חתומים עצמית", - "forceLossless": "כפיית אובדן נתונים", + "forceLossless": "Force Lossless", "forceLosslessDesc": "כפיית קידוד תמונה ללא אובדן נתונים (איכות גבוהה יותר, רוחב פס גדול יותר)", - "disableAudio": "השבתת שמע", + "disableAudio": "Disable Audio", "disableAudioDesc": "השתקת כל האודיו מההפעלה המרוחקת", "enableAudioInput": "הפעלת קלט שמע (מיקרופון)", "enableAudioInputDesc": "העברת המיקרופון המקומי לסשן המרוחק", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "הפעלת אפקטים של Aero Glass", "menuAnimations": "אנימציות תפריטים", "menuAnimationsDesc": "הפעלת אנימציות של דהייה והחלקה בתפריט", - "disableBitmapCaching": "השבתת אחסון במטמון של מפת סיביות", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "כבה את מטמון הסיביות (עשוי לעזור עם תקלות)", - "disableOffscreenCaching": "השבתת אחסון במטמון מחוץ למסך", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "כבה את המטמון מחוץ למסך", - "disableGlyphCaching": "השבתת אחסון גליפים במטמון", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "כבה את מטמון הגליפים", - "enableGfx": "הפעלת GFX", + "enableGfx": "Enable GFX", "enableGfxDesc": "השתמש בצינור הגרפיקה של RemoteFX", - "enablePrinting": "הפעל הדפסה", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "ניתוב מחדש של מדפסות מקומיות להפעלה מרוחקת", - "enableDriveRedirection": "הפעל ניתוב מחדש של כונן", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "מיפוי תיקייה מקומית ככונן בהפעלה מרוחקת", - "createDrivePath": "צור נתיב כונן", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "צור את התיקייה באופן אוטומטי אם היא אינה קיימת", - "disableDownload": "השבתת הורדה", + "disableDownload": "Disable Download", "disableDownloadDesc": "מניעת הורדת קבצים מההפעלה המרוחקת", - "disableUpload": "השבתת העלאה", + "disableUpload": "Disable Upload", "disableUploadDesc": "מניעת העלאת קבצים לסשן מרחוק", - "enableTouch": "הפעל מגע", + "enableTouch": "Enable Touch", "enableTouchDesc": "הפעל העברת קלט מגע", - "consoleSession": "סשן קונסולה", + "consoleSession": "Console Session", "consoleSessionDesc": "התחברות לקונסולה (סשן 0) במקום סשן חדש", "sendWolPacket": "שלח חבילת WOL", "sendWolPacketDesc": "שלח חבילת קסם כדי להעיר את המארח הזה לפני התחברות", - "disableCopy": "השבתת העתקה", + "disableCopy": "Disable Copy", "disableCopyDesc": "מניעת העתקת טקסט מההפעלה המרוחקת", - "disablePaste": "השבתת הדבקה", + "disablePaste": "Disable Paste", "disablePasteDesc": "מניעת הדבקת טקסט לתוך ההפעלה המרוחקת", "createPathIfMissing": "צור נתיב אם חסר", "createPathIfMissingDesc": "צור אוטומטית את ספריית ההקלטה", - "excludeOutput": "אי הכללת פלט", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "אל תקליטו פלט מסך (מטא-נתונים בלבד)", - "excludeMouse": "אי הכללת עכבר", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "אל תתעדו תנועות עכבר", "includeKeystrokes": "כלול הקשות מקשים", "includeKeystrokesDesc": "הקלטת הקשות גולמיות בנוסף לפלט המסך", @@ -718,117 +896,120 @@ "vncPassword": "סיסמת VNC", "vncUsernameOptional": "שם משתמש (אופציונלי)", "vncLeaveBlank": "השאר ריק אם לא נדרש", - "cursorMode": "מצב סמן", - "swapRedBlue": "החלפת אדום/כחול", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "החלפת ערוצי הצבע האדום והכחול (תיקון של כמה בעיות צבע)", "readOnly": "לקריאה בלבד", "readOnlyDesc": "צפה במסך השלט הרחוק מבלי לשלוח קלט כלשהו", "telnetPort": "יציאת טלנט", - "terminalType": "סוג הטרמינל", - "fontName": "שם הגופן", - "fontSize": "גודל גופן", - "colorScheme": "ערכת צבעים", - "backspaceKey": "מקש Backspace", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "שמור את המארח קודם.", "sharingOptionsAfterSave": "אפשרויות שיתוף זמינות לאחר שמירת המארח.", "sharingLoadError": "טעינת נתוני השיתוף נכשלה. בדוק את החיבור ונסה שוב.", - "shareHostSection": "שתף מארח", - "shareWithUser": "שתף עם משתמש", - "shareWithRole": "שתף עם תפקיד", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "בחר משתמש", - "selectRole": "בחר תפקיד", + "selectRole": "Select Role", "selectUserOption": "בחר משתמש...", "selectRoleOption": "בחר תפקיד...", - "permissionLevel": "רמת הרשאה", + "permissionLevel": "Permission Level", "expiresInHours": "פג תוקף בעוד (שעות)", "noExpiryPlaceholder": "השאר ריק ללא תפוגה", - "shareBtn": "לַחֲלוֹק", - "currentAccess": "גישה נוכחית", - "typeHeader": "סוּג", - "targetHeader": "יַעַד", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "רְשׁוּת", - "grantedByHeader": "הוענק על ידי", - "expiresHeader": "פג תוקף", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "עדיין אין רשומות גישה.", - "expiredLabel": "פג תוקף", - "neverLabel": "לְעוֹלָם לֹא", - "revokeBtn": "לְבַטֵל", - "cancelBtn": "לְבַטֵל", - "savingBtn": "חִסָכוֹן...", - "updateHostBtn": "עדכון מארח", - "addHostBtn": "הוסף מארח" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "חיפוש מארחים, פקודות או הגדרות...", - "quickActions": "פעולות מהירות", - "hostManager": "מנהל מארח", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "ניהול, הוספה או עריכה של מארחים", "addNewHost": "הוסף מארח חדש", "addNewHostDesc": "רשום מארח חדש", - "adminSettings": "הגדרות מנהל מערכת", + "adminSettings": "Admin Settings", "adminSettingsDesc": "הגדרת העדפות מערכת ומשתמשים", - "userProfile": "פרופיל משתמש", + "userProfile": "User Profile", "userProfileDesc": "ניהול החשבון וההעדפות שלך", - "addCredential": "הוסף אישור", + "addCredential": "Add Credential", "addCredentialDesc": "אחסון מפתחות או סיסמאות SSH", - "recentActivity": "פעילות אחרונה", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "שרתים ומארחים", - "noHostsFound": "לא נמצאו מארחים התואמים ל-\"{{search}}\"", - "links": "קישורים", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "ניווט", - "select": "לִבחוֹר", + "select": "Select", "toggleWith": "החלף עם" }, "splitScreen": { - "paneEmpty": "חלונית {{index}} - ריקה", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "לא הוקצתה לשונית", "focusedPane": "חלונית פעילה" }, "connections": { "noConnections": "אין קשרים", "noConnectionsDesc": "פתח מסוף, מנהל קבצים או שולחן עבודה מרוחק כדי לראות חיבורים כאן", - "connectedFor": "מחובר עבור {{duration}}", - "connected": "מְחוּבָּר", - "disconnected": "מְנוּתָק", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "סגור את הכרטיסייה", "closeConnection": "קשר קרוב", "forgetTab": "לִשְׁכּוֹחַ", - "removeBackground": "לְהַסִיר", - "reconnect": "התחבר מחדש", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "פתיחה מחדש", "sectionOpen": "לִפְתוֹחַ", "sectionBackground": "רֶקַע", "backgroundDesc": "החיבור נשמר למשך 30 דקות לאחר הניתוק וניתן להתחבר מחדש.", "persisted": "נשמר ברקע", - "expiresIn": "פג תוקף בעוד {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "חיפוש חיבורים...", - "noSearchResults": "אין קשרים התואמים את החיפוש שלך" + "noSearchResults": "אין קשרים התואמים את החיפוש שלך", + "rename": "Rename session" }, "guacamole": { - "connecting": "מתחבר לסשן {{type}}...", - "connectionError": "שגיאת חיבור", - "connectionFailed": "החיבור נכשל", - "failedToConnect": "נכשל בקבלת אסימון החיבור", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "המארח לא נמצא", - "noHostSelected": "לא נבחר מארח", - "reconnect": "התחבר מחדש", - "retry": "נסה שוב", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "שירות שולחן עבודה מרוחק (guacd) אינו זמין. אנא ודא ש-guacd פועל, נגיש ומוגדר כראוי בהגדרות המנהל.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", "winL": "Win+L (מסך נעילה)", "winKey": "מפתח חלונות", - "ctrl": "קונטרול", - "alt": "אלט", - "shift": "מִשׁמֶרֶת", + "ctrl": "Ctrl", + "alt": "Alt", + "shift": "Shift", "win": "לְנַצֵחַ", - "stickyActive": "{{key}} (נעול - לחץ לשחרור)", - "stickyInactive": "{{key}} (לחץ כדי לנעול)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "לִברוֹחַ", "tab": "טאב", - "home": "בַּיִת", + "home": "Home", "end": "סוֹף", "pageUp": "עמוד למעלה", "pageDown": "עמוד למטה", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "התחברות למארח", - "clear": "בָּרוּר", - "paste": "לְהַדבִּיק", - "reconnect": "התחבר מחדש", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "החיבור אבד", - "connected": "מְחוּבָּר", - "clipboardWriteFailed": "ההעתקה ללוח נכשלה. ודא שהדף מוגש דרך HTTPS או localhost.", - "clipboardReadFailed": "הקריאה מהלוח נכשלה. ודא שהרשאות הלוח ניתנות.", - "clipboardHttpWarning": "הדבקה דורשת HTTPS. השתמשו ב-Ctrl+Shift+V או הגשת Termix דרך HTTPS.", - "unknownError": "אירעה שגיאה לא ידועה", - "websocketError": "שגיאת חיבור WebSocket", - "connecting": "מְקַשֵׁר...", - "noHostSelected": "לא נבחר מארח", - "reconnecting": "מתחבר מחדש... ({{attempt}}/{{max}})", - "reconnected": "התחבר מחדש בהצלחה", - "tmuxSessionCreated": "נוצרה סשן tmux: {{name}}", - "tmuxSessionAttached": "סשן tmux מצורף: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux אינו מותקן על המארח המרוחק, חוזר למעטפת סטנדרטית", "tmuxSessionPickerTitle": "מפגשי tmux", "tmuxSessionPickerDesc": "נמצאו הפעלות tmux קיימות במארח זה. בחר אחת לחיבור מחדש או צור הפעלות חדשה.", - "tmuxWindows": "חלונות", - "tmuxWindowCount": "חלון {{count}}", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "לקוחות מצורפים", - "tmuxAttachedCount": "{{count}} מצורף", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "פעילות אחרונה", "tmuxTimeJustNow": "זֶה עַתָה", - "tmuxTimeMinutes": "לפני {{count}}דקות", + "tmuxTimeMinutes": "{{count}}m ago", "tmuxTimeHours": "{{count}}h ago", "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "התחל סשן חדש", "tmuxCopyHint": "התאם את הבחירה ולחץ על Enter כדי להעתיק ללוח", "tmuxDetach": "ניתוק מסשן tmux", "tmuxDetached": "מנותק מסשן tmux", - "maxReconnectAttemptsReached": "הגעת למספר המקסימלי של ניסיונות חיבור מחדש", - "closeTab": "לִסְגוֹר", - "connectionTimeout": "זמן קצוב לחיבור", - "terminalTitle": "טרמינל - {{host}}", - "terminalWithPath": "טרמינל - {{host}}:{{path}}", - "runTitle": "ריצה {{command}} - {{host}}", - "totpRequired": "נדרש אימות דו-שלבי", - "totpCodeLabel": "קוד אימות", - "totpVerify": "לְאַמֵת", - "warpgateAuthRequired": "נדרש אימות Warpgate", - "warpgateSecurityKey": "מפתח אבטחה", - "warpgateAuthUrl": "כתובת URL לאימות", - "warpgateOpenBrowser": "פתח בדפדפן", - "warpgateContinue": "סיימתי את האימות", - "opksshAuthRequired": "נדרש אימות OPKSSH", - "opksshAuthDescription": "השלם את האימות בדפדפן שלך כדי להמשיך. סשן זה יישאר תקף למשך 24 שעות.", - "opksshOpenBrowser": "פתח את הדפדפן כדי לאמת", - "opksshWaitingForAuth": "ממתין לאימות בדפדפן...", - "opksshAuthenticating": "מעבד אימות...", - "opksshTimeout": "הזמן שהוקצב לאימות הסתיים. אנא נסה שוב.", - "opksshAuthFailed": "האימות נכשל. אנא בדוק את פרטי הגישה שלך ונסה שוב.", - "opksshSignInWith": "התחבר באמצעות {{provider}}", - "sudoPasswordPopupTitle": "להכניס סיסמה?", - "websocketAbnormalClose": "החיבור נסגר באופן בלתי צפוי. ייתכן שהדבר נובע מבעיית פרוקסי הפוך או מבעיית תצורת SSL. אנא בדוק את יומני השרת.", - "connectionLogTitle": "יומן חיבור", - "connectionLogCopy": "העתקת יומנים ללוח", - "connectionLogEmpty": "אין עדיין יומני חיבור", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "לִפְתוֹחַ", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "ממתין ליומני חיבור...", - "connectionLogCopied": "יומני חיבור הועתקו ללוח", - "connectionLogCopyFailed": "נכשלה העתקת יומנים ללוח", - "connectionRejected": "החיבור נדחה על ידי השרת. אנא בדוק את האימות ותצורת הרשת שלך.", - "hostKeyRejected": "אימות מפתח מארח SSH נדחה. החיבור בוטל.", - "sessionTakenOver": "הסשן נפתח בכרטיסייה אחרת. מתחבר מחדש..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "פיצול טאב", + "addToSplit": "הוסף לפיצול", + "removeFromSplit": "הסר מפיצול" + } }, "fileManager": { - "noHostSelected": "לא נבחר מארח", + "noHostSelected": "No host selected", "initializingEditor": "מאתחל עורך...", - "file": "קוֹבֶץ", - "folder": "תיקייה", - "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": "שינוי שם", - "uploading": "מעלה...", - "uploadingFile": "מעלה {{name}}...", - "fileName": "שם הקובץ", - "folderName": "שם התיקייה", - "fileUploadedSuccessfully": "הקובץ \"{{name}}\" הועלה בהצלחה", - "failedToUploadFile": "העלאת הקובץ נכשלה", - "fileDownloadedSuccessfully": "הקובץ \"{{name}}\" הורד בהצלחה", - "failedToDownloadFile": "הורדת הקובץ נכשלה", - "fileCreatedSuccessfully": "הקובץ \"{{name}}\" נוצר בהצלחה", - "folderCreatedSuccessfully": "תיקיית \"{{name}}\" נוצרה בהצלחה", - "failedToCreateItem": "יצירת הפריט נכשלה", - "operationFailed": "הפעולה {{operation}} נכשלה עבור {{name}}: {{error}}", - "failedToResolveSymlink": "נכשל בפענוח הסימבילינק", - "itemsDeletedSuccessfully": "{{count}} פריטים נמחקו בהצלחה", - "failedToDeleteItems": "מחיקת הפריטים נכשלה", - "sudoPasswordRequired": "נדרשת סיסמת מנהל", - "enterSudoPassword": "הזן את סיסמת הסודו כדי להמשיך בפעולה זו", - "sudoPassword": "סיסמת סודו", - "sudoOperationFailed": "פעולת הסודו נכשלה", - "sudoAuthFailed": "אימות סודו נכשל", - "dragFilesToUpload": "שחררו קבצים כאן כדי להעלות", - "emptyFolder": "תיקייה זו ריקה", - "searchFiles": "חיפוש קבצים...", - "upload": "העלאה", - "selectHostToStart": "בחר מארח כדי להתחיל בניהול קבצים", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "מנהל הקבצים דורש SSH. שרת זה אינו מופעל באמצעות SSH.", - "failedToConnect": "נכשלה ההתחברות ל-SSH", - "failedToLoadDirectory": "טעינת הספרייה נכשלה", - "noSSHConnection": "אין חיבור SSH זמין", - "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}}?", - "permissionDenied": "ההרשאה נדחתה", - "serverError": "שגיאת שרת", - "fileSavedSuccessfully": "הקובץ נשמר בהצלחה", - "failedToSaveFile": "שמירת הקובץ נכשלה", - "confirmDeleteSingleItem": "האם אתה בטוח שברצונך למחוק לצמיתות את \"{{name}}\"?", - "confirmDeleteMultipleItems": "האם אתה בטוח שברצונך למחוק לצמיתות {{count}} פריטים?", - "confirmDeleteMultipleItemsWithFolders": "האם אתה בטוח שברצונך למחוק לצמיתות את הפריטים {{count}} ? זה כולל תיקיות ותוכן שלהן.", - "confirmDeleteFolder": "האם אתה בטוח שברצונך למחוק לצמיתות את התיקייה \"{{name}}\" ואת כל תוכנה?", - "permanentDeleteWarning": "לא ניתן לבטל פעולה זו. הפריט/ים יימחקו לצמיתות מהשרת.", - "recent": "אחרונים", - "pinned": "מוצמד", - "folderShortcuts": "קיצורי דרך לתיקיות", - "failedToReconnectSSH": "נכשל בחיבור מחדש של סשן SSH", - "openTerminalHere": "פתח את הטרמינל כאן", - "run": "לָרוּץ", - "openTerminalInFolder": "פתח את הטרמינל בתיקייה זו", - "openTerminalInFileLocation": "פתיחת מסוף במיקום הקובץ", - "runningFile": "ריצה - {{file}}", - "onlyRunExecutableFiles": "יכול להריץ רק קבצי הפעלה", - "directories": "מדריכים", - "removedFromRecentFiles": "הוסר \"{{name}}\" מהקבצים האחרונים", - "removeFailed": "ההסרה נכשלה", - "unpinnedSuccessfully": "\"{{name}}\" בוטל בהצלחה", - "unpinFailed": "ביטול ההצמדה נכשל", - "removedShortcut": "קיצור הדרך \"{{name}}\" הוסר", - "removeShortcutFailed": "הסרת קיצור הדרך נכשלה", - "clearedAllRecentFiles": "ניקה את כל הקבצים האחרונים", - "clearFailed": "ניקוי נכשל", - "removeFromRecentFiles": "הסר מהקבצים האחרונים", - "clearAllRecentFiles": "נקה את כל הקבצים האחרונים", - "unpinFile": "ביטול הצמדת קובץ", - "removeShortcut": "הסר קיצור דרך", - "pinFile": "קובץ הצמדה", - "addToShortcuts": "הוסף לקיצורי דרך", - "pasteFailed": "ההדבקה נכשלה", - "noUndoableActions": "אין פעולות שניתן לבטל", - "undoCopySuccess": "פעולת העתקה שבוטלה: מחיקת {{count}} קבצים שהועתקו", - "undoCopyFailedDelete": "ביטול נכשל: לא ניתן היה למחוק קבצים שהועתקו", - "undoCopyFailedNoInfo": "ביטול נכשל: לא ניתן היה למצוא את פרטי הקובץ שהועתק", - "undoMoveSuccess": "פעולת העברה שבוטלה: העבירו {{count}} קבצים חזרה למיקום המקורי", - "undoMoveFailedMove": "ביטול נכשל: לא ניתן היה להעביר קבצים בחזרה", - "undoMoveFailedNoInfo": "ביטול נכשל: לא ניתן היה למצוא מידע על הקובץ שהועבר", - "undoDeleteNotSupported": "לא ניתן לבטל את פעולת המחיקה: הקבצים נמחקו לצמיתות מהשרת", - "undoTypeNotSupported": "סוג פעולת ביטול לא נתמך", - "undoOperationFailed": "פעולת הביטול נכשלה", - "unknownError": "שגיאה לא ידועה", - "confirm": "לְאַשֵׁר", - "find": "לִמצוֹא...", - "replace": "לְהַחלִיף", - "downloadInstead": "הורד במקום זאת", - "keyboardShortcuts": "קיצורי מקלדת", - "searchAndReplace": "חיפוש והחלפה", - "editing": "עֲרִיכָה", - "search": "לְחַפֵּשׂ", - "findNext": "מצא את הבא", - "findPrevious": "מצא את הקודם", - "save": "לְהַצִיל", - "selectAll": "בחר הכל", - "undo": "לְבַטֵל", - "redo": "לַעֲשׂוֹת שׁוּב", - "moveLineUp": "הזזת שורה למעלה", - "moveLineDown": "הזזת שורה למטה", - "toggleComment": "החלף/הפעל תגובה", - "autoComplete": "השלמה אוטומטית", - "imageLoadError": "טעינת התמונה נכשלה", - "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": "קובץ חדש.txt", - "successfullyMovedItems": "הועבר בהצלחה {{count}} פריטים אל {{target}}", - "move": "מַהֲלָך", - "searchInFile": "חיפוש בקובץ (Ctrl+F)", - "showKeyboardShortcuts": "הצג קיצורי מקלדת", - "startWritingMarkdown": "התחל לכתוב את תוכן ההנחה שלך...", - "loadingFileComparison": "טוען השוואת קבצים...", - "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": "שינוי הרשאות", - "currentPermissions": "הרשאות נוכחיות", - "owner": "בַּעַל", - "group": "קְבוּצָה", - "others": "אחרים", - "read": "לִקְרוֹא", - "write": "לִכתוֹב", - "execute": "לְבַצֵעַ", - "permissionsChangedSuccessfully": "ההרשאות שונו בהצלחה", - "failedToChangePermissions": "שינוי ההרשאות נכשל", - "name": "שֵׁם", - "sortByName": "שֵׁם", - "sortByDate": "תאריך שינוי", - "sortBySize": "גוֹדֶל", - "ascending": "עוֹלֶה", - "descending": "יורד", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "שׁוֹרֶשׁ", "new": "חָדָשׁ", "sortBy": "מיין לפי", @@ -1139,20 +1335,20 @@ "editor": "עוֹרֵך", "octal": "אוקטלי", "storage": "אִחסוּן", - "disk": "דִיסק", - "used": "מְשׁוּמָשׁ", - "of": "שֶׁל", - "toggleSidebar": "הפעלה/כיבוי סרגל צד", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "לא ניתן לטעון את ה-PDF", "pdfLoadError": "אירעה שגיאה בטעינת קובץ PDF זה.", "loadingPdf": "טוען PDF...", "loadingPage": "טוען דף..." }, "transfer": { - "copyToHost": "העתק למארח…", - "moveToHost": "מעבר למארח…", - "copyItemsToHost": "העתק את הפריטים {{count}} לאירוח…", - "moveItemsToHost": "העבר {{count}} פריטים לאירוח…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "אין מארחי מנהל קבצים אחרים זמינים.", "noHostsConnectedHint": "הוסף מארח SSH נוסף כאשר מנהל הקבצים מופעל במנהל המארחים.", "selectDestinationHost": "בחר מארח יעד", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "הרחב יעדים אחרונים", "browseFolders": "עיון בתיקיות יעד", "browseDestination": "עיון או הזנת נתיב", - "confirmCopy": "לְהַעְתִיק", - "confirmMove": "מַהֲלָך", - "transferring": "מעביר…", - "compressing": "דחיסת…", - "extracting": "מחלץ…", - "transferringItems": "העברת {{current}} מתוך {{total}} פריטים…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "ההעברה הושלמה", "transferError": "ההעברה נכשלה", - "transferPartial": "ההעברה הושלמה עם שגיאות {{count}}", - "transferPartialHint": "לא ניתן היה להעביר: {{paths}}", - "itemsSummary": "פריטים {{count}}", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "היעד חייב להיות ספרייה עבור העברות מרובות פריטים", "selectThisFolder": "בחר תיקייה זו", "browsePathWillBeCreated": "תיקייה זו עדיין לא קיימת. היא תיווצר כאשר ההעברה תתחיל.", "browsePathError": "לא ניתן היה לפתוח נתיב זה במארח היעד.", "goUp": "לַעֲלוֹת", - "copyFolderToHost": "העתקת תיקייה למארח…", - "moveFolderToHost": "העברת תיקייה למארח…", - "hostReady": "מוּכָן", - "hostConnecting": "חיבור…", - "hostDisconnected": "לא מחובר", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "נדרש אימות - פתח תחילה את מנהל הקבצים במארח זה", - "hostConnectionFailed": "החיבור נכשל", + "hostConnectionFailed": "Connection failed", "metricsTitle": "זמני העברה", - "metricsPrepare": "הכנת יעד: {{duration}}", - "metricsCompress": "דחיסה במקור: {{duration}}", - "metricsHopSourceRead": "מקור → שרת: {{throughput}}", - "metricsHopDestSftpWrite": "שרת → יעד (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "שרת → יעד (מקומי): {{throughput}}", - "metricsTransfer": "מקצה לקצה: {{throughput}} ({{duration}})", - "metricsExtract": "חילוץ ביעד: {{duration}}", - "metricsSourceDelete": "הסר מהמקור: {{duration}}", - "metricsTotal": "סה\"כ: {{duration}}", - "progressCompressing": "דחיסה במארח המקור…", - "progressExtracting": "מחלץ ביעד…", - "progressTransferring": "העברת נתונים…", - "progressReconnecting": "מתחבר מחדש…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "נתיבי מעבר מקבילים", - "parallelSegmentsOption": "נתיבים {{count}}", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "קבצים גדולים מחולקים לחתיכות של 256 מגה-בייט. מספר נתיבים משתמשים בחיבורים נפרדים (כמו התחלת מספר העברות) לקבלת תפוקה כוללת גבוהה יותר.", - "progressTotalSpeed": "סה\"כ {{speed}} (נתיבים{{lanes}})", - "progressTransferringItems": "העברת קבצים ({{current}} מתוך {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "קבצים {{current}} / {{total}}", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "קבצי המקור נשמרו (העברה חלקית)", "jumpHostLimitation": "שני המארחים חייבים להיות נגישים משרת Termix. ניתוב ישיר ממארח למארח אינו נתמך.", - "cancel": "לְבַטֵל", + "cancel": "Cancel", "methodLabel": "שיטת העברה", "methodAuto": "אוטומטי", "methodTar": "ארכיון טאר", @@ -1216,25 +1412,25 @@ "methodAutoHint": "בוחר SFTP לפי קובץ או tar בהתבסס על ספירת הקבצים, גודלם ויכולת הדחיסה. קבצים בודדים תמיד משתמשים ב-SFTP בסטרימינג.", "methodTarHint": "דחיסה במקור, העברת ארכיון אחד, חילוץ ביעד. דורש tar בשני מארחי יוניקס.", "methodItemSftpHint": "העבר כל קובץ בנפרד דרך SFTP. עובד על כל המארחים כולל Windows.", - "methodPreviewLoading": "חישוב שיטת ההעברה…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "לא ניתן היה להציג תצוגה מקדימה של שיטת ההעברה. השרת עדיין יבחר שיטה כשתתחיל.", "methodPreviewWillUseTar": "אשתמש ב: ארכיון Tar", "methodPreviewWillUseItemSftp": "ישתמש ב: SFTP לפי קובץ", - "methodPreviewScanSummary": "{{fileCount}} קבצים, {{totalSize}} סה\"כ (נסרק במארח המקור).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "כל קובץ משתמש באותו זרם SFTP כעותק של קובץ בודד, אחד אחרי השני. ההתקדמות משולבת על פני כל הקבצים, כך שהסרגל נע לאט במהלך קבצים גדולים.", "methodReason": { "user_item_sftp": "בחרת SFTP לפי קובץ.", "user_tar": "בחרת בארכיון tar.", "tar_unavailable": "Tar אינו זמין באחד המארחים או בשניהם - במקום זאת ייעשה שימוש ב-SFTP לפי קובץ.", "windows_host": "מחשב מארח של Windows מעורב - tar אינו בשימוש.", - "auto_multi_large": "אוטומטי: קבצים מרובים כולל קובץ גדול ({{largestSize}}) עם נתונים הניתנים לדחיסה - tar מאחד את הנתונים להעברה אחת.", - "auto_single_large_in_archive": "אוטומטי: קובץ אחד גדול ({{largestSize}}) בקבוצה זו - SFTP לכל קובץ.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "אוטומטי: נתונים לרוב בלתי ניתנים לדחיסה - SFTP לכל קובץ.", - "auto_many_files": "אוטומטי: קבצים רבים ({{fileCount}}) — tar מפחית את התקורה של כל קובץ.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "אוטומטי: SFTP לכל קובץ עבור קבוצה זו." }, - "progressCancel": "לְבַטֵל", - "progressCancelling": "מבטל…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "אָבוּס", "resumedHint": "התחבר מחדש להעברה פעילה שהתחילה בחלון אחר.", "transferCancelled": "ההעברה בוטלה", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "לא ניתן היה להסיר חלק מהקבצים", "cleanupDestFilesNothing": "אין מה לנקות ביעד", "cleanupDestFilesError": "הניקוי נכשל", - "retryTransfer": "נסה שוב", + "retryTransfer": "Retry", "retryTransferError": "ניסיון חוזר נכשל", "transferFailedRetryHint": "נתונים חלקיים נשמרו ביעד. ניסיון חוזר יתחדש כאשר החיבור יחזור." }, "tunnels": { - "noSshTunnels": "אין מנהרות SSH", - "createFirstTunnelMessage": "עדיין לא יצרת מנהרות SSH. הגדר חיבורי מנהרות במנהל המארח כדי להתחיל.", - "connected": "מְחוּבָּר", - "disconnected": "מְנוּתָק", - "connecting": "מְקַשֵׁר...", - "error": "שְׁגִיאָה", - "canceling": "מבטל...", - "connect": "לְחַבֵּר", - "disconnect": "לְנַתֵק", - "cancel": "לְבַטֵל", - "port": "נָמָל", - "localPort": "נמל מקומי", - "remotePort": "יציאה מרוחקת", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "יציאת המארח הנוכחית", - "endpointPort": "יציאת נקודת קצה", + "endpointPort": "Endpoint Port", "bindIp": "IP מקומי", - "endpointSshConfig": "תצורת SSH של נקודת קצה", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "מארח SSH של נקודת קצה", "endpointSshHostPlaceholder": "בחר מארח מוגדר", "endpointSshHostRequired": "בחר מארח SSH של נקודת קצה עבור כל מנהרת לקוח.", - "attempt": "ניסיון {{current}} של {{max}}", - "nextRetryIn": "ניסיון חוזר הבא בעוד {{seconds}} שניות", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "מנהרות לקוח", "clientTunnel": "מנהרת לקוח", "addClientTunnel": "הוסף מנהרת לקוח", "noClientTunnels": "לא הוגדרו מנהרות לקוח בשולחן עבודה זה.", - "tunnelName": "שם המנהרה", - "remoteHost": "מארח מרוחק", - "autoStart": "הפעלה אוטומטית", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "מתחיל כאשר לקוח שולחן עבודה זה נפתח ונשאר מחובר.", "clientManualStartDesc": "השתמשו בפקודות התחל ועצירה משורה זו. טרמיקס לא יפתח אותה אוטומטית.", "clientRemoteServerNote": "ייתכן שהעברת נתונים מרחוק תדרוש את AllowTcpForwarding ו-GatewayPorts בשרת ה-SSH של נקודת הקצה. היציאה המרוחקת נסגרת כאשר שולחן עבודה זה מתנתק.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "היציאה המרוחקת חייבת להיות בין 1 ל-65535.", "invalidLocalTargetPort": "יציאת היעד המקומית חייבת להיות בין 1 ל-65535.", "invalidEndpointPort": "יציאת נקודת הקצה חייבת להיות בין 1 ל-65535.", - "duplicateAutoStartBind": "רק מנהרת לקוח אחת עם הפעלה אוטומטית יכולה להשתמש ב- {{bind}}.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "עדכון מצב המנהרה נכשל.", - "active": "פָּעִיל", - "start": "הַתחָלָה", - "stop": "לְהַפְסִיק", - "test": "מִבְחָן", - "type": "סוג המנהרה", - "typeLocal": "מקומי (-L)", - "typeRemote": "מרחוק (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "דינמי (-D)", "typeServerLocalDesc": "מהמארח הנוכחי לנקודת הקצה.", "typeServerRemoteDesc": "נקודת הקצה חזרה למארח הנוכחי.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "נקודת הקצה חזרה למחשב המקומי.", "typeClientDynamicDesc": "גרביים במחשב מקומי.", "typeDynamicDesc": "העברת תעבורת SOCKS5 CONNECT דרך SSH", - "forwardDescriptionServerLocal": "מארח נוכחי {{sourcePort}} → נקודת קצה {{endpointPort}}.", - "forwardDescriptionServerRemote": "נקודת קצה {{endpointPort}} → מארח נוכחי {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS על המארח הנוכחי {{sourcePort}}.", - "forwardDescriptionClientLocal": "מקומי {{sourcePort}} → מרוחק {{endpointPort}}.", - "forwardDescriptionClientRemote": "מרוחק {{sourcePort}} → מקומי {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS בפורט המקומי {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → גרביים דרך {{endpoint}}", - "autoNameClientLocal": "מקומי {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → מקומי {{localPort}}", - "autoNameClientDynamic": "גרביים {{localPort}} דרך {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "מַסלוּל:", "lastStarted": "התחיל לאחרונה", "lastTested": "נבדק לאחרונה", "lastError": "השגיאה האחרונה", - "maxRetries": "מקסימום ניסיונות חוזרים", + "maxRetries": "Max Retries", "maxRetriesDescription": "מספר מקסימלי של ניסיונות ניסיון חוזר.", - "retryInterval": "מרווח זמן לניסיון חוזר (שניות)", - "retryIntervalDescription": "זמן המתנה בין ניסיונות חוזרים.", - "local": "מְקוֹמִי", - "remote": "מְרוּחָק", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "יַעַד", "host": "מְאָרֵחַ", "mode": "מצב", - "noHostSelected": "לא נבחר מארח", + "noHostSelected": "No host selected", "working": "עובד..." }, - "serverStats": { - "cpu": "מעבד", - "memory": "זֵכֶר", - "disk": "דִיסק", - "network": "רֶשֶׁת", - "uptime": "זמן פעולה", - "processes": "תהליכים", - "available": "זָמִין", - "free": "לְשַׁחְרֵר", - "connecting": "מְקַשֵׁר...", - "connectionFailed": "נכשלה ההתחברות לשרת", - "naCpus": "מעבדים לא רלוונטיים", - "cpuCores_one": "{{count}} ליבה", - "cpuCores_other": "{{count}} ליבות", - "cpuUsage": "שימוש במעבד", - "memoryUsage": "שימוש בזיכרון", - "diskUsage": "שימוש בדיסק", - "failedToFetchHostConfig": "נכשל באחזור תצורת המארח", - "serverOffline": "שרת לא מקוון", - "cannotFetchMetrics": "לא ניתן לאחזר מדדים משרת לא מקוון", - "totpFailed": "אימות TOTP נכשל", - "noneAuthNotSupported": "סטטיסטיקות השרת אינן תומכות בסוג אימות 'ללא'.", - "load": "לִטעוֹן", - "systemInfo": "מידע מערכת", - "hostname": "שם מארח", - "operatingSystem": "מַעֲרֶכֶת הַפעָלָה", - "kernel": "גַרעִין", - "seconds": "שניות", - "networkInterfaces": "ממשקי רשת", - "noInterfacesFound": "לא נמצאו ממשקי רשת", - "noProcessesFound": "לא נמצאו תהליכים", - "loginStats": "סטטיסטיקות כניסה ל-SSH", - "noRecentLoginData": "אין נתוני התחברות אחרונים", - "executingQuickAction": "מבצע {{name}}...", - "quickActionSuccess": "{{name}} הושלם בהצלחה", - "quickActionFailed": "{{name}} נכשל", - "quickActionError": "נכשל בביצוע {{name}}", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "יציאות האזנה", - "protocol": "פּרוֹטוֹקוֹל", - "port": "נָמָל", - "address": "כְּתוֹבֶת", - "process": "תַהֲלִיך", - "noData": "אין נתוני יציאות האזנה" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "כֹּל", + "noData": "No listening ports data" }, "firewall": { - "title": "חומת אש", - "inactive": "לֹא פָּעִיל", - "policy": "מְדִינִיוּת", - "rules": "כללים", - "noData": "אין נתוני חומת אש זמינים", - "action": "פְּעוּלָה", - "protocol": "פרוטו", - "port": "נָמָל", - "source": "מָקוֹר", - "anywhere": "בְּכָל מָקוֹם" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "טען ממוצע", "swap": "לְהַחלִיף", "architecture": "אַדְרִיכָלוּת", - "refresh": "לְרַעֲנֵן", - "retry": "נסה שוב" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "עובד...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "ניהול SSH ושולחן עבודה מרוחק באחסון עצמי", - "loginTitle": "התחברות לטרמיקס", - "registerTitle": "צור חשבון", - "forgotPassword": "שכחת סיסמה?", - "rememberMe": "זכור את המכשיר למשך 30 יום (כולל TOTP)", - "noAccount": "אין לך חשבון?", - "hasAccount": "כבר יש לך חשבון?", - "twoFactorAuth": "אימות דו-שלבי", - "enterCode": "הזן קוד אימות", - "backupCode": "או להשתמש בקוד גיבוי", - "verifyCode": "אימות קוד", - "redirectingToApp": "מפנה לאפליקציה...", - "sshAuthenticationRequired": "נדרש אימות SSH", - "sshNoKeyboardInteractive": "אימות אינטראקטיבי באמצעות מקלדת אינו זמין", - "sshAuthenticationFailed": "האימות נכשל", - "sshAuthenticationTimeout": "פסק זמן לאימות", - "sshNoKeyboardInteractiveDescription": "השרת אינו תומך באימות אינטראקטיבי באמצעות מקלדת. אנא ספק את הסיסמה או מפתח ה-SSH שלך.", - "sshAuthFailedDescription": "האישורים שסופקו היו שגויים. אנא נסה שוב עם אישורי גישה תקפים.", - "sshTimeoutDescription": "ניסיון האימות הסתיים. אנא נסה שוב.", - "sshProvideCredentialsDescription": "אנא ספק את פרטי ה-SSH שלך כדי להתחבר לשרת זה.", - "sshPasswordDescription": "הזן את הסיסמה עבור חיבור SSH זה.", - "sshKeyPasswordDescription": "אם מפתח ה-SSH שלך מוצפן, הזן את סיסמתך כאן.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "נדרשת סיסמה", "passphraseRequiredDescription": "מפתח ה-SSH מוצפן. אנא הזן את סיסמת הגישה כדי לפתוח אותו.", - "back": "בְּחֲזָרָה", - "firstUser": "משתמש ראשון", - "firstUserMessage": "אתה המשתמש הראשון ותהפוך למנהל. תוכל לצפות בהגדרות מנהל המערכת בתפריט הנפתח של המשתמשים בסרגל הצד. אם אתה חושב שזו טעות, בדוק את יומני ה-docker או צור בעיה ב-GitHub.", - "external": "חִיצוֹנִי", - "loginWithExternal": "התחברות עם ספק חיצוני", - "loginWithExternalDesc": "התחבר באמצעות ספק הזהויות החיצוני שתצורתו נקבעה", - "externalNotSupportedInElectron": "אימות חיצוני אינו נתמך עדיין באפליקציית Electron. אנא השתמש בגרסת האינטרנט לצורך כניסה ל-OIDC.", - "resetPasswordButton": "איפוס סיסמה", - "sendResetCode": "שלח קוד איפוס", - "resetCodeDesc": "הזן את שם המשתמש שלך כדי לקבל קוד איפוס סיסמה. הקוד יירשם ביומני המכולה של docker.", - "resetCode": "איפוס קוד", - "verifyCodeButton": "אימות קוד", - "enterResetCode": "הזן את הקוד בן 6 הספרות מיומני המכולה של docker עבור המשתמש:", - "newPassword": "סיסמה חדשה", - "confirmNewPassword": "אשר סיסמה", - "enterNewPassword": "הזן את הסיסמה החדשה שלך עבור המשתמש:", - "signUp": "הרשמה", - "desktopApp": "אפליקציית שולחן עבודה", - "loggingInToDesktopApp": "כניסה לאפליקציית שולחן העבודה", - "loadingServer": "טוען שרת...", - "dataLossWarning": "איפוס הסיסמה שלך בדרך זו ימחק את כל מארחי ה-SSH השמורים, פרטי הגישה ונתונים מוצפנים אחרים. לא ניתן לבטל פעולה זו. השתמש באפשרות זו רק אם שכחת את הסיסמה שלך ואינך מחובר.", - "authenticationDisabled": "אימות מושבת", - "authenticationDisabledDesc": "כל שיטות האימות מושבתות כעת. אנא צור קשר עם מנהל המערכת שלך.", - "attemptsRemaining": "{{count}} ניסיונות נותרו" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "אימות מפתח מארח SSH", - "keyChangedWarning": "מפתח מארח SSH שונה", - "firstConnectionTitle": "בפעם הראשונה שמתחברת למארח הזה", - "firstConnectionDescription": "לא ניתן לקבוע את האותנטיות של מארח זה. ודא שטביעת האצבע תואמת את מה שאתה מצפה.", - "keyChangedDescription": "מפתח המארח של שרת זה השתנה מאז החיבור האחרון שלך. זה יכול להצביע על בעיית אבטחה.", - "previousKey": "מפתח קודם", - "newFingerprint": "טביעת אצבע חדשה", - "fingerprint": "טְבִיעַת אֶצבָּעוֹת", - "verifyInstructions": "אם אתה בוטח במארח זה, לחץ על קבל כדי להמשיך ולשמור את טביעת האצבע הזו לחיבורים עתידיים.", - "securityWarning": "אזהרת אבטחה", - "acceptAndContinue": "קבל והמשך", - "acceptNewKey": "קבל את המפתח החדש והמשך" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "לא ניתן היה להתחבר למסד הנתונים", - "unknownError": "שגיאה לא ידועה", - "loginFailed": "הכניסה נכשלה", - "failedPasswordReset": "נכשלה הפעלת איפוס הסיסמה", - "failedVerifyCode": "נכשל אימות קוד האיפוס", - "failedCompleteReset": "נכשל השלמת איפוס הסיסמה", - "invalidTotpCode": "קוד TOTP לא חוקי", - "failedOidcLogin": "נכשל בהתחלת הכניסה ל-OIDC", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "התבקשה כניסה שקטה, אך כניסה ל-OIDC אינה זמינה.", "failedUserInfo": "נכשלה קבלת פרטי המשתמש לאחר הכניסה", - "oidcAuthFailed": "אימות OIDC נכשל", - "invalidAuthUrl": "כתובת URL לא חוקית להרשאה התקבלה מה-backend", - "requiredField": "שדה זה נדרש", - "minLength": "אורך מינימלי הוא {{min}}", - "passwordMismatch": "הסיסמאות אינן תואמות", - "passwordLoginDisabled": "כניסה באמצעות שם משתמש/סיסמה מושבתת כעת", - "sessionExpired": "הסשן פג תוקפו - אנא התחבר שוב", - "totpRateLimited": "קצב מוגבל: יותר מדי ניסיונות אימות TOTP. אנא נסה שוב מאוחר יותר.", - "totpRateLimitedWithTime": "קצב מוגבל: יותר מדי ניסיונות אימות TOTP. אנא המתן {{time}} שניות לפני שתנסה שוב.", - "resetCodeRateLimited": "קצב מוגבל: יותר מדי ניסיונות אימות. אנא נסה שוב מאוחר יותר.", - "resetCodeRateLimitedWithTime": "קצב מוגבל: יותר מדי ניסיונות אימות. אנא המתן {{time}} שניות לפני שתנסה שוב.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "נכשלה שמירת אסימון האימות", "failedToLoadServer": "טעינת השרת נכשלה" }, "messages": { - "registrationDisabled": "רישום חשבון חדש מושבת כעת על ידי מנהל. אנא התחבר או צור קשר עם מנהל.", - "userNotAllowed": "החשבון שלך אינו מורשה להירשם. אנא צור קשר עם מנהל מערכת.", - "databaseConnectionFailed": "נכשלה ההתחברות לשרת מסד הנתונים", - "resetCodeSent": "איפוס קוד שנשלח ליומני Docker", - "codeVerified": "הקוד אומת בהצלחה", - "passwordResetSuccess": "איפוס הסיסמה בהצלחה", - "loginSuccess": "הכניסה הצליחה", - "registrationSuccess": "ההרשמה הצליחה" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "מנהרות שולחן עבודה מקומיות המכוונות למארחי SSH שהוגדרו.", "c2sTunnelPresets": "קביעות מוגדרות מראש של מנהרת לקוח", "c2sTunnelPresetsDesc": "שמור את רשימת המנהרות המקומית של לקוח שולחן עבודה זה כקביעה מוגדרת מראש של שרת בעל שם, או טען קביעה מוגדרת מראש בחזרה ללקוח זה.", "c2sTunnelPresetsUnavailable": "הגדרות קבועות מראש של מנהרת לקוח זמינות רק בלקוח שולחן העבודה.", - "c2sPresetName": "שם מוגדר מראש", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "שם קבוע מראש של הלקוח", "c2sPresetToLoad": "הגדרה מראש לטעינה", "c2sNoPresetSelected": "לא נבחרה הגדרה מוגדרת מראש", "c2sNoPresets": "לא נשמרו הגדרות קבועות מראש", - "c2sLoadPreset": "לִטעוֹן", - "c2sCurrentLocalConfig": "מנהרה/ות לקוח מקומיות {{count}} מוגדרות בשולחן עבודה זה.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "קביעות מוגדרות מראש הן תמונות בזק מפורשות; טעינת אחת מהן מחליפה את רשימת מנהרות הלקוחות המקומיות של לקוח שולחן העבודה הזה.", "c2sPresetSaved": "מנהרת הלקוח מוגדרת מראש נשמרה", "c2sPresetLoaded": "מנהרת לקוח מוגדרת מראש נטענת באופן מקומי", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "שָׂפָה", - "keyPassword": "סיסמת מפתח", - "pastePrivateKey": "הדבק את המפתח הפרטי שלך כאן...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (האזנה מקומית)", "localTargetHost": "127.0.0.1 (היעד במחשב זה)", "socksListenerHost": "127.0.0.1 (מאזין SOCKS)", - "enterPassword": "הזן את הסיסמה שלך", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "לוּחַ מַחווָנִים", - "loading": "טוען לוח מחוונים...", - "github": "גיטהאב", - "support": "תְמִיכָה", - "discord": "מַחֲלוֹקֶת", - "serverOverview": "סקירת שרת", - "version": "גִרְסָה", - "upToDate": "מעודכן", - "updateAvailable": "עדכון זמין", + "title": "Dashboard", + "loading": "Loading dashboard...", + "github": "GitHub", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "בטא", - "uptime": "זמן פעולה", - "database": "מסד נתונים", - "healthy": "בָּרִיא", - "error": "שְׁגִיאָה", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "סך כל המארחים", - "totalTunnels": "סך המנהרות", - "totalCredentials": "סך כל האישורים", - "recentActivity": "פעילות אחרונה", - "reset": "אִתחוּל", - "loadingRecentActivity": "טוען פעילות אחרונה...", - "noRecentActivity": "אין פעילות אחרונה", - "quickActions": "פעולות מהירות", - "addHost": "הוסף מארח", - "addCredential": "הוסף אישור", - "adminSettings": "הגדרות מנהל מערכת", - "userProfile": "פרופיל משתמש", - "serverStats": "סטטיסטיקות שרת", - "loadingServerStats": "טוען סטטיסטיקות שרת...", - "noServerData": "אין נתוני שרת זמינים", - "cpu": "מעבד", - "ram": "אַיִל", - "customizeLayout": "התאמה אישית של לוח המחוונים", - "dashboardSettings": "הגדרות לוח המחוונים", - "enableDisableCards": "הפעלה/השבתה של כרטיסים", - "resetLayout": "איפוס לברירת מחדל", - "serverOverviewCard": "סקירת שרת", - "recentActivityCard": "פעילות אחרונה", - "networkGraphCard": "גרף הרשת", - "networkGraph": "גרף הרשת", - "quickActionsCard": "פעולות מהירות", - "serverStatsCard": "סטטיסטיקות שרת", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "רָאשִׁי", "panelSide": "צַד", - "justNow": "זֶה עַתָה" + "justNow": "זֶה עַתָה", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "יַצִיב", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "לא הוגדרו מארחים", "online": "באינטרנט", "offline": "לא מקוון", - "onlineLower": "באינטרנט", - "nodes": "צמתים {{count}}", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "לְהוֹסִיף:", "commandPalette": "לוח פקודות", "done": "נַעֲשָׂה", "editModeInstructions": "גרור כרטיסים כדי לשנות את הסדר · גרור את מפריד העמודות כדי לשנות את גודל העמודות · גרור את הקצה התחתון של הכרטיס כדי לשנות את גודל הגובה שלו · אשפה כדי להסיר", "empty": "רֵיק", - "clear": "בָּרוּר" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "הוסף מארח", - "addGroup": "הוסף קבוצה", - "addLink": "הוסף קישור", - "zoomIn": "לְהִתְמַקֵד", - "zoomOut": "התקרבות", - "resetView": "איפוס תצוגה", - "selectHost": "בחר מארח", - "chooseHost": "בחר מארח...", - "parentGroup": "קבוצת הורים", - "noGroup": "אין קבוצה", - "groupName": "שם הקבוצה", - "color": "צֶבַע", - "source": "מָקוֹר", - "target": "יַעַד", - "moveToGroup": "העבר לקבוצה", - "selectGroup": "בחירת קבוצה...", - "addConnection": "הוסף חיבור", - "hostDetails": "פרטי המארח", - "removeFromGroup": "הסר מהקבוצה", - "addHostHere": "הוסף מארח כאן", - "editGroup": "עריכת קבוצה", - "delete": "לִמְחוֹק", - "add": "לְהוֹסִיף", - "create": "לִיצוֹר", - "move": "מַהֲלָך", - "connect": "לְחַבֵּר", - "createGroup": "צור קבוצה", - "selectSourcePlaceholder": "בחר מקור...", - "selectTargetPlaceholder": "בחר יעד...", - "invalidFile": "קובץ לא חוקי", - "hostAlreadyExists": "המארח כבר נמצא בטופולוגיה", - "connectionExists": "החיבור כבר קיים", - "unknown": "לֹא יְדוּעַ", - "name": "שֵׁם", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "סטָטוּס", - "failedToAddNode": "נכשל בהוספת הצומת", - "sourceDifferentFromTarget": "המקור והיעד חייבים להיות שונים", - "exportJSON": "ייצוא JSON", - "importJSON": "ייבוא JSON", - "terminal": "מָסוֹף", - "fileManager": "מנהל הקבצים", - "tunnel": "מִנהָרָה", - "docker": "דוקר", - "serverStats": "סטטיסטיקות שרת", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "עדיין אין צמתים" }, "docker": { - "notEnabled": "Docker אינו מופעל עבור מארח זה", - "validating": "מאמת את Docker...", - "connecting": "מְקַשֵׁר...", - "error": "שְׁגִיאָה", - "version": "דוקר {{version}}", - "connectionFailed": "נכשלה ההתחברות ל-Docker", - "containerStarted": "מיכל {{name}} הופעל", - "failedToStartContainer": "נכשל בהפעלת המכולה {{name}}", - "containerStopped": "מיכל {{name}} נעצר", - "failedToStopContainer": "נכשלה עצירת המכולה {{name}}", - "containerRestarted": "המיכל {{name}} הופעל מחדש", - "failedToRestartContainer": "נכשלה ההפעלה מחדש של המכולה {{name}}", - "containerPaused": "מיכל {{name}} הושהה", - "containerUnpaused": "השהייתה של המיכל {{name}} בוטלה", - "failedToTogglePauseContainer": "נכשל הניסיון להחליף בין מצב השהייה עבור המכולה {{name}}", - "containerRemoved": "המיכל {{name}} הוסר", - "failedToRemoveContainer": "נכשלה הסרת המיכל {{name}}", - "image": "תְמוּנָה", - "ports": "נמלים", - "noPorts": "אין יציאות", - "start": "הַתחָלָה", - "confirmRemoveContainer": "האם אתה בטוח שברצונך להסיר את המכולה '{{name}}'? לא ניתן לבטל פעולה זו.", - "runningContainerWarning": "אזהרה: מיכל זה פועל כעת. הסרתו תעצור את המיכל תחילה.", - "loadingContainers": "טוען מכולות...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "מנהל דוקר", - "autoRefresh": "רענון אוטומטי", + "autoRefresh": "Auto Refresh", "timestamps": "חותמות זמן", "lines": "קווים", - "filterLogs": "סנן יומני רישום...", - "refresh": "לְרַעֲנֵן", - "download": "הורדה", - "clear": "בָּרוּר", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "יומני הרישום הורדו בהצלחה", "last50": "50 האחרונים", "last100": "100 האחרונים", "last500": "500 האחרונים", "last1000": "1000 האחרונים", "allLogs": "כל היומנים", - "noLogsMatching": "אין יומנים התואמים ל-\"{{query}}\"", - "noLogsAvailable": "אין יומנים זמינים", - "noContainersFound": "לא נמצאו מכולות", - "noContainersFoundHint": "אין מכולות Docker זמינות במארח זה", - "searchPlaceholder": "חיפוש מכולות...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "כל הסטטוסים", - "stateRunning": "רִיצָה", + "stateRunning": "Running", "statePaused": "מושהה", "stateExited": "יצא", "stateRestarting": "הפעלה מחדש", - "noContainersMatchFilters": "אין מכולות התואמות את המסננים שלך", - "noContainersMatchFiltersHint": "נסה להתאים את קריטריוני החיפוש או הסינון שלך", - "failedToFetchStats": "נכשלה אחזור סטטיסטיקות המכולה", - "containerNotRunning": "המכולה לא פועלת", - "startContainerToViewStats": "הפעל את המכולה כדי להציג נתונים סטטיסטיים", - "loadingStats": "טוען סטטיסטיקות...", - "errorLoadingStats": "שגיאה בטעינת סטטיסטיקות", - "noStatsAvailable": "אין סטטיסטיקות זמינות", - "cpuUsage": "שימוש במעבד", - "current": "נוֹכְחִי", - "memoryUsage": "שימוש בזיכרון", - "networkIo": "קלט/פלט של הרשת", - "input": "קֶלֶט", - "output": "תְפוּקָה", - "blockIo": "בלוק קלט/פלט", - "read": "לִקְרוֹא", - "write": "לִכתוֹב", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "מידע על המכולה", - "name": "שֵׁם", - "id": "תְעוּדַת זֶהוּת", - "state": "מְדִינָה", - "containerMustBeRunning": "יש לפעול על מנת לגשת למסוף.", - "verificationCodePrompt": "הזן קוד אימות", - "totpVerificationFailed": "אימות TOTP נכשל. אנא נסה שוב.", - "warpgateVerificationFailed": "אימות Warpgate נכשל. אנא נסה שוב.", - "connectedTo": "מחובר אל {{containerName}}", - "disconnected": "מְנוּתָק", - "consoleError": "שגיאת קונסולה", - "errorMessage": "שגיאה: {{message}}", - "failedToConnect": "נכשל החיבור למכולה", - "console": "לְנַחֵם", - "selectShell": "בחר מעטפת", - "bash": "לַחֲבוֹט", - "sh": "ש", - "ash": "אֵפֶר", - "connect": "לְחַבֵּר", - "disconnect": "לְנַתֵק", - "notConnected": "לא מחובר", - "clickToConnect": "לחץ על התחבר כדי להתחיל סשן מעטפת", - "connectingTo": "מתחבר אל {{containerName}}...", - "containerNotFound": "המיכל לא נמצא", - "backToList": "חזרה לרשימה", - "logs": "יומני רישום", - "stats": "סטטיסטיקות", - "consoleTab": "לְנַחֵם", - "startContainerToAccess": "הפעל את המכולה כדי לגשת לקונסולה" + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "כְּלָלִי", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "משתמשים", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "מפגשים", - "sectionRoles": "תפקידים", - "sectionDatabase": "מסד נתונים", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "מפתחות API", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "נקה מסננים", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "כֹּל", "allowRegistration": "אפשר רישום משתמש", - "allowRegistrationDesc": "אפשרו למשתמשים חדשים להירשם באופן עצמאי", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "אפשר כניסה עם סיסמה", "allowPasswordLoginDesc": "שם משתמש/סיסמה להתחברות", "oidcAutoProvision": "הקצאה אוטומטית של OIDC", - "oidcAutoProvisionDesc": "יצירה אוטומטית של חשבונות עבור משתמשי OIDC גם כאשר ההרשמה מושבתת", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "אפשר איפוס סיסמה", "allowPasswordResetDesc": "איפוס קוד דרך יומני Docker", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "פסק זמן של סשן", - "hours": "שעות", + "hours": "hours", "sessionTimeoutRange": "מינימום שעה · מקסימום 720 שעות", - "monitoringDefaults": "ניטור ברירות מחדל", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "בדיקת סטטוס", - "metrics": "מדדים", + "metrics": "Metrics", "sec": "שניות", "logLevel": "רמת יומן", "enableGuacamole": "הפעל גוואקמולי", "enableGuacamoleDesc": "שולחן עבודה מרוחק RDP/VNC", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "כתובת אתר של guacd", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "הגדר את OpenID Connect עבור SSO. שדות המסומנים ב-* הם שדות חובה.", - "oidcClientId": "מזהה לקוח", - "oidcClientSecret": "סוד הלקוח", - "oidcAuthUrl": "כתובת אתר להרשאה", - "oidcIssuerUrl": "כתובת URL של המנפיק", - "oidcTokenUrl": "כתובת אתר של אסימון", - "oidcUserIdentifier": "נתיב מזהה המשתמש", - "oidcDisplayName": "נתיב שם התצוגה", - "oidcScopes": "טווחים", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "עקיפת כתובת URL של פרטי משתמש", - "oidcAllowedUsers": "משתמשים מורשים", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "אימייל אחד בכל שורה. יש להשאיר ריק כדי לאפשר את כולם.", - "removeOidc": "לְהַסִיר", - "usersCount": "{{count}} משתמשים", - "createUser": "לִיצוֹר", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "תפקיד חדש", - "roleName": "שֵׁם", - "roleDisplayName": "שם תצוגה", - "roleDescription": "תֵאוּר", - "rolesCount": "תפקידים {{count}}", - "createRole": "לִיצוֹר", - "creating": "יוצר...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "ייצוא מסד נתונים", "exportDatabaseDesc": "הורד גיבוי של כל המארחים, האישורים וההגדרות", - "export": "יְצוּא", - "exporting": "מייצא...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "ייבוא מסד נתונים", "importDatabaseDesc": "שחזור מקובץ גיבוי .sqlite", - "importDatabaseSelected": "נבחר: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "בחר קובץ", - "changeFile": "לְשַׁנוֹת", - "import": "יְבוּא", - "importing": "מייבא...", - "apiKeysCount": "מקשים {{count}}", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "מפתח API חדש", "apiKeyCreatedWarning": "המפתח נוצר - העתק אותו עכשיו, הוא לא יוצג שוב.", - "apiKeyName": "שֵׁם", - "apiKeyUser": "מִשׁתַמֵשׁ", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "בחר משתמש...", - "apiKeyExpiresAt": "פג תוקף ב", + "apiKeyExpiresAt": "Expires At", "createKey": "צור מפתח", "apiKeyNoExpiry": "אין תפוגה", "revokedBadge": "בוטל", - "authTypeDual": "אימות כפול", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "מְקוֹמִי", - "adminStatusAdministrator": "מְנַהֵל", - "adminStatusRegularUser": "משתמש רגיל", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "אדמין", "systemBadge": "מערכת", "customBadge": "מִנְהָג", "youBadge": "אַתָה", - "sessionsActive": "{{count}} פעיל", - "sessionActive": "פעיל: {{time}}", - "sessionExpires": "תוקף: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "כֹּל", "revokeAllSessionsSuccess": "כל ההפעלות עבור המשתמש בוטלו", - "revokeAllSessionsFailed": "נכשלה ביטול ההפעלות", - "revokeSessionFailed": "ביטול ההפעלה נכשל", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "הוסף תפקיד", "noCustomRoles": "לא הוגדרו תפקידים מותאמים אישית", - "removeRoleFailed": "הסרת התפקיד נכשלה", - "assignRoleFailed": "הקצאת התפקיד נכשלה", - "deleteRoleFailed": "מחיקת התפקיד נכשלה", - "userAdminAccess": "מְנַהֵל", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "גישה מלאה לכל הגדרות המנהל", - "userRoles": "תפקידים", - "revokeAllUserSessions": "ביטול כל ההפעלות", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "כפיית כניסה מחדש בכל המכשירים", - "revoke": "לְבַטֵל", + "revoke": "Revoke", "deleteUserWarning": "מחיקת משתמש זה היא לצמיתות.", - "deleteUser": "מחק {{username}}", - "deleting": "מוחק...", - "deleteUserFailed": "מחיקת המשתמש נכשלה", - "deleteUserSuccess": "המשתמש \"{{username}}\" נמחק", - "deleteRoleSuccess": "התפקיד \"{{name}}\" נמחק", - "revokeKeySuccess": "המפתח \"{{name}}\" בוטל", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "ביטול המפתח נכשל", - "copiedToClipboard": "הועתק ללוח", + "copiedToClipboard": "Copied to clipboard", "done": "נַעֲשָׂה", - "createUserTitle": "צור משתמש", + "createUserTitle": "Create User", "createUserDesc": "צור חשבון מקומי חדש.", - "createUserUsername": "שם משתמש", - "createUserPassword": "סִיסמָה", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "מינימום 6 תווים.", - "createUserEnterUsername": "הזן שם משתמש", - "createUserEnterPassword": "הזן סיסמה", - "createUserSubmit": "צור משתמש", - "editUserTitle": "ניהול משתמש: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "עריכת תפקידים, סטטוס מנהל, הפעלות והגדרות חשבון.", - "editUserUsername": "שם משתמש", + "editUserUsername": "Username", "editUserAuthType": "סוג אימות", - "editUserAdminStatus": "סטטוס מנהל", - "editUserUserId": "מזהה משתמש", - "linkAccountTitle": "קישור OIDC לחשבון סיסמה", - "linkAccountDesc": "מזג את חשבון OIDC {{username}} עם חשבון מקומי קיים.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "זה יעשה את הדברים הבאים:", "linkAccountEffect1": "מחיקת חשבון OIDC בלבד", "linkAccountEffect2": "הוסף שם משתמש של OIDC לחשבון היעד", "linkAccountEffect3": "אפשר כניסה באמצעות OIDC וסיסמה", - "linkAccountTargetUsername": "שם משתמש יעד", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "הזן את שם המשתמש של החשבון המקומי שאליו ברצונך לקשר", - "linkAccounts": "קישור חשבונות", - "linkAccountSuccess": "חשבון OIDC מקושר אל \"{{username}}\"", - "linkAccountFailed": "קישור חשבון OIDC נכשל", - "linkAccountInProgress": "מְקַשֵׁר...", - "saving": "חִסָכוֹן...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "עדכון הגדרות הרישום נכשל", "updatePasswordLoginFailed": "נכשל עדכון הגדרות הכניסה באמצעות סיסמה", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "נכשל עדכון הגדרת הקצאת הנתונים האוטומטית של OIDC", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "נכשל עדכון הגדרת איפוס הסיסמה", "sessionTimeoutRange2": "זמן הקצוב לסשן חייב להיות בין שעה ל-720 שעות", "sessionTimeoutSaved": "פסק זמן של סשן נשמר", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "ערכי מרווח לא חוקיים", "monitoringSaved": "הגדרות הניטור נשמרו", "monitoringSaveFailed": "שמירת הגדרות הניטור נכשלה", - "guacamoleSaved": "הגדרות הגוואקמולי נשמרו", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "שמירת הגדרות הגוואקמולי נכשלה", "guacamoleUpdateFailed": "נכשל עדכון הגדרת הגוואקמולי", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "נכשל עדכון רמת היומן", "oidcSaved": "תצורת OIDC נשמרה", "oidcSaveFailed": "שמירת תצורת OIDC נכשלה", "oidcRemoved": "תצורת OIDC הוסרה", "oidcRemoveFailed": "הסרת תצורת OIDC נכשלה", "createUserRequired": "נדרשים שם משתמש וסיסמה", - "createUserPasswordTooShort": "הסיסמה חייבת להיות באורך של לפחות 6 תווים", - "createUserSuccess": "משתמש \"{{username}}\" נוצר", - "createUserFailed": "יצירת המשתמש נכשלה", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "נכשל עדכון סטטוס מנהל המערכת", "allSessionsRevoked": "כל הפעילויות בוטלו", - "revokeSessionsFailed": "נכשלה ביטול ההפעלות", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "חובה להזין שם ושם תצוגה", - "createRoleSuccess": "התפקיד \"{{name}}\" נוצר", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "יצירת התפקיד נכשלה", "apiKeyNameRequired": "נדרש שם מפתח", "apiKeyUserRequired": "נדרש מזהה משתמש", - "apiKeyCreatedSuccess": "מפתח ה-API \"{{name}}\" נוצר", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "נכשלה יצירת מפתח ה-API", "exportSuccess": "מסד הנתונים יוצא בהצלחה", "exportFailed": "ייצוא מסד הנתונים נכשל", "importSelectFile": "אנא בחר קובץ תחילה", - "importCompleted": "ייבוא הושלם: {{total}} פריטים יובאו, {{skipped}} דילג", - "importFailed": "ייבוא נכשל: {{error}}", - "importError": "ייבוא מסד הנתונים נכשל" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "ייבוא מסד הנתונים נכשל", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "מְאָרֵחַ", - "hostPlaceholder": "192.168.1.1 או example.com", - "portLabel": "נָמָל", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "שם משתמש", - "usernamePlaceholder": "שם משתמש", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "אישור", - "passwordLabel": "סִיסמָה", - "passwordPlaceholder": "סִיסמָה", - "privateKeyLabel": "מפתח פרטי", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "הדבק מפתח פרטי...", - "credentialLabel": "תְעוּדָה", + "credentialLabel": "Credential", "credentialPlaceholder": "בחר אישור שמור", - "connectToTerminal": "התחברות לטרמינל", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "התחברות לקבצים" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "נקה הכל", "noHistoryEntries": "אין רשומות היסטוריה", "trackingDisabled": "מעקב אחר היסטוריה מושבת", - "trackingDisabledHint": "הפעל זאת בהגדרות הפרופיל שלך כדי להקליט פקודות." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "רישום מפתח", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "הקלטה למסופים", "selectAll": "כֹּל", - "selectNone": "אַף לֹא אֶחָד", + "selectNone": "None", "noTerminalTabsOpen": "אין לשוניות מסוף פתוחות", "selectTerminalsAbove": "בחר טרמינלים למעלה", "broadcastInputPlaceholder": "הקלד כאן כדי לשדר הקשות מקלדת...", "stopRecording": "הפסקת ההקלטה", "startRecording": "התחל הקלטה", - "settingsTitle": "הגדרות", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "הפעלת העתקה/הדבקה באמצעות לחיצה ימנית" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "גררו כרטיסיות לחלוניות למעלה, או השתמשו באפשרות 'הקצאה מהירה'", "dropHere": "זרוק כאן", "emptyPane": "רֵיק", - "dashboard": "לוּחַ מַחווָנִים", + "dashboard": "Dashboard", "clearSplitScreen": "נקה מסך מפוצל", "quickAssign": "הקצאה מהירה", - "alreadyAssigned": "חלונית {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "פיצול טאב", "addToSplit": "הוסף לפיצול", "removeFromSplit": "הסר מפיצול", - "assignToPane": "הקצאה לחלונית" + "assignToPane": "הקצאה לחלונית", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "צור קטע", - "createSnippetDescription": "צור קטע פקודה חדש לביצוע מהיר", - "nameLabel": "שֵׁם", - "namePlaceholder": "לדוגמה, הפעל מחדש את Nginx", - "descriptionLabel": "תֵאוּר", - "descriptionPlaceholder": "תיאור אופציונלי", - "optional": "אופציונלי", - "folderLabel": "תיקייה", - "noFolder": "אין תיקייה (ללא קטגוריה)", - "commandLabel": "פְּקוּדָה", - "commandPlaceholder": "לדוגמה, sudo systemctl הפעל מחדש את nginx", - "cancel": "לְבַטֵל", - "createSnippetButton": "צור קטע", - "createFolderTitle": "צור תיקייה", - "createFolderDescription": "ארגנו את הקטעים שלכם בתיקיות", - "folderNameLabel": "שם התיקייה", - "folderNamePlaceholder": "לדוגמה, פקודות מערכת, סקריפטים של Docker", - "folderColorLabel": "צבע התיקייה", - "folderIconLabel": "סמל תיקייה", - "previewLabel": "תצוגה מקדימה", - "folderNameFallback": "שם התיקייה", - "createFolderButton": "צור תיקייה", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "טרמינלים של טארגט", "selectAll": "כֹּל", - "selectNone": "אַף לֹא אֶחָד", + "selectNone": "None", "noTerminalTabsOpen": "אין לשוניות מסוף פתוחות", - "searchPlaceholder": "חיפוש קטעי טקסט...", - "newSnippet": "קטע חדש", - "newFolder": "תיקייה חדשה", - "run": "לָרוּץ", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "אין קטעי טקסט בתיקייה זו", - "uncategorized": "ללא קטגוריה", - "editSnippetTitle": "עריכת קטע", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "עדכן את קטע הפקודה הזה", "saveSnippetButton": "שמירת שינויים", - "createSuccess": "קטע הקוד נוצר בהצלחה", - "createFailed": "נכשלה יצירת קטע הקוד", - "updateSuccess": "קטע הקוד עודכן בהצלחה", - "updateFailed": "נכשל עדכון הקטע", - "deleteFailed": "מחיקת קטע הקוד נכשלה", - "folderCreateSuccess": "תיקייה נוצרה בהצלחה", - "folderCreateFailed": "יצירת התיקייה נכשלה", - "editFolderTitle": "עריכת תיקייה", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "שינוי שם או שינוי מראה של תיקייה זו", "saveFolderButton": "שמירת שינויים", "editFolder": "עריכת תיקייה", "deleteFolder": "מחיקת תיקייה", - "folderDeleteSuccess": "תיקייה \"{{name}}\" נמחקה", - "folderDeleteFailed": "מחיקת התיקייה נכשלה", - "folderEditSuccess": "התיקייה עודכנה בהצלחה", - "folderEditFailed": "עדכון התיקייה נכשל", - "confirmRunMessage": "להפעיל את \"{{name}}\"?", - "confirmRunButton": "לָרוּץ", - "runSuccess": "הריץ את \"{{name}}\" בטרמינל/ים {{count}}", - "copySuccess": "הועתק \"{{name}}\" ללוח", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "שתף קטע", - "shareUser": "מִשׁתַמֵשׁ", - "shareRole": "תַפְקִיד", + "shareUser": "User", + "shareRole": "Role", "selectUser": "בחר משתמש...", "selectRole": "בחר תפקיד...", "shareSuccess": "קטע הטקסט שותף בהצלחה", "shareFailed": "נכשל שיתוף הקטע", "revokeSuccess": "הגישה בוטלה", - "revokeFailed": "ביטול הגישה נכשל", - "currentAccess": "גישה נוכחית", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "טעינת נתוני השיתוף נכשלה", - "loading": "טְעִינָה...", - "close": "לִסְגוֹר", - "reorderFailed": "שמירת סדר הקטעים נכשלה" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "שמירת סדר הקטעים נכשלה", + "importExport": "ייבוא / ייצוא", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "לא הוגדרו מארחים", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "חֶשְׁבּוֹן", - "sectionAppearance": "הוֹפָעָה", - "sectionSecurity": "בִּטָחוֹן", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "מפתחות API", "sectionC2sTunnels": "מנהרות C2S", - "usernameLabel": "שם משתמש", - "roleLabel": "תַפְקִיד", - "roleAdministrator": "מְנַהֵל", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "שיטת אימות", - "authMethodLocal": "מְקוֹמִי", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "עַל", "twoFaOff": "כבוי", - "versionLabel": "גִרְסָה", - "deleteAccount": "מחיקת חשבון", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "מחיקת החשבון שלך לצמיתות", - "deleteButton": "לִמְחוֹק", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "פעולה זו היא קבועה ולא ניתן לבטלה.", "deleteAccountWarning": "כל ההפעלות, המארחים, האישורים וההגדרות יימחקו לצמיתות.", - "confirmPasswordDeletePlaceholder": "הזן את הסיסמה שלך כדי לאשר", - "languageLabel": "שָׂפָה", - "themeLabel": "נוֹשֵׂא", - "fontSizeLabel": "גודל גופן", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "צבע מבטא", - "settingsTerminal": "מָסוֹף", - "commandAutocomplete": "השלמה אוטומטית של הפקודה", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "הצג השלמה אוטומטית בעת הקלדה", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "מעקב אחר היסטוריה", "historyTrackingDesc": "פקודות מסוף מעקב", - "syntaxHighlighting": "הדגשת תחביר", - "syntaxHighlightingDesc": "הדגש את פלט הטרמינל", "commandPalette": "לוח פקודות", "commandPaletteDesc": "הפעל קיצור מקלדת", "reopenTabsOnLogin": "פתח מחדש כרטיסיות בעת הכניסה", "reopenTabsOnLoginDesc": "שחזר את הכרטיסיות הפתוחות שלך בעת כניסה או רענון הדף, אפילו ממכשיר אחר", "confirmTabClose": "אישור סגירת כרטיסייה", "confirmTabCloseDesc": "שאל לפני סגירת כרטיסיות הטרמינל", - "settingsSidebar": "סרגל צד", - "showHostTags": "הצג תגיות מארח", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "הצגת תגיות ברשימת המארחים", "hostTrayOnClick": "לחץ להרחבת פעולות מארח", "hostTrayOnClickDesc": "הצג תמיד כפתורי חיבור; לחץ כדי להרחיב את אפשרויות הניהול במקום לרחף מעל העכבר", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "אפליקציית Pin Rail", "pinAppRailDesc": "השאר את פס האפליקציה של הצד השמאלי פתוח תמיד במקום להרחיב בעת ריחוף", - "settingsSnippets": "קטעי טקסט", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "תיקיות מכווצות", "foldersCollapsedDesc": "כיווץ תיקיות כברירת מחדל", "confirmExecution": "אישור ביצוע", "confirmExecutionDesc": "אשר לפני הרצת קטעי טקסט", - "settingsUpdates": "עדכונים", + "settingsUpdates": "Updates", "disableUpdateChecks": "השבת בדיקות עדכונים", "disableUpdateChecksDesc": "תפסיקו לבדוק עדכונים", "totpAuthenticator": "מאמת TOTP", @@ -2109,68 +2612,68 @@ "qrCode": "קוד QR", "totpInstructions": "סרוק את קוד ה-QR או הזן את הקוד הסודי באפליקציית האימות שלך, לאחר מכן הזן את הקוד בן 6 הספרות", "totpCodePlaceholder": "000000", - "verify": "לְאַמֵת", - "changePassword": "שינוי סיסמה", - "currentPasswordLabel": "סיסמה נוכחית", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "סיסמה נוכחית", - "newPasswordLabel": "סיסמה חדשה", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "סיסמה חדשה", "confirmPasswordLabel": "אשר סיסמה חדשה", "confirmPasswordPlaceholder": "אשר סיסמה חדשה", "updatePassword": "עדכון סיסמה", "createApiKeyTitle": "צור מפתח API", "createApiKeyDescription": "צור מפתח API חדש עבור גישה תכנותית.", - "apiKeyNameLabel": "שֵׁם", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "לדוגמה צינור CI", "expiryDateLabel": "תאריך תפוגה", "optional": "אופציונלי", - "cancel": "לְבַטֵל", + "cancel": "Cancel", "createKey": "צור מפתח", - "apiKeyCount": "מקשים {{count}}", + "apiKeyCount": "{{count}} keys", "newKey": "מפתח חדש", "noApiKeys": "עדיין אין מפתחות API.", - "apiKeyActive": "פָּעִיל", + "apiKeyActive": "Active", "apiKeyUsageHint": "כלול את המפתח שלך ב-", "apiKeyUsageHintHeader": "כּוֹתֶרֶת.", "apiKeyPermissionsHint": "מפתחות יורשים את ההרשאות של המשתמש היוצר.", - "roleUser": "מִשׁתַמֵשׁ", - "authMethodDual": "אימות כפול", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "נכשל בהתחלת הגדרת TOTP", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "הזן קוד בן 6 ספרות", "totpEnabledSuccess": "אימות דו-שלבי מופעל", "totpInvalidCode": "קוד לא תקין, אנא נסה שוב", "totpDisableInputRequired": "הזן את קוד ה-TOTP או הסיסמה שלך", - "totpDisabledSuccess": "אימות דו-שלבי מושבת", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "נכשל בהשבתת 2FA", - "totpDisableTitle": "השבת 2FA", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "הזן קוד או סיסמה של TOTP", - "totpDisableConfirm": "השבת 2FA", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "המשך לאימות", - "totpVerifyTitle": "אימות קוד", - "totpBackupTitle": "קודי גיבוי", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "הורד קודי גיבוי", "done": "נַעֲשָׂה", "secretCopied": "סוד הועתק ללוח", "apiKeyNameRequired": "נדרש שם מפתח", - "apiKeyCreated": "מפתח ה-API \"{{name}}\" נוצר", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "נכשלה יצירת מפתח ה-API", - "apiKeyUser": "מִשׁתַמֵשׁ", - "apiKeyExpires": "פג תוקף", - "apiKeyRevoked": "מפתח ה-API \"{{name}}\" בוטל", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "נכשל בביטול מפתח ה-API", "passwordFieldsRequired": "נדרשות סיסמאות נוכחיות וחדשות", - "passwordMismatch": "הסיסמאות אינן תואמות", - "passwordTooShort": "הסיסמה חייבת להיות באורך של לפחות 6 תווים", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "הסיסמה עודכנה בהצלחה", "passwordUpdateFailed": "עדכון הסיסמה נכשל", "deletePasswordRequired": "נדרשת סיסמה כדי למחוק את החשבון שלך", - "deleteFailed": "מחיקת החשבון נכשלה", - "deleting": "מוחק...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "פתח את בורר הצבעים", - "themeSystem": "מַעֲרֶכֶת", - "themeLight": "אוֹר", - "themeDark": "כֵּהֶה", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "דרקולה", "themeCatppuccin": "קאטפוצ'ין", "themeNord": "נורד", @@ -2180,5 +2683,105 @@ "themeGruvbox": "גראבבוקס" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "זֶה עַתָה", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "טאב", + "backTab": "⇥", + "arrowUp": "חץ למעלה", + "arrowDown": "חץ למטה", + "arrowLeft": "חץ שמאלה", + "arrowRight": "חץ ימינה", + "home": "Home", + "end": "סוֹף", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "נַעֲשָׂה" } } diff --git a/src/ui/locales/translated/hi_IN.json b/src/ui/locales/translated/hi_IN.json index 4eb57bb7..ea803835 100644 --- a/src/ui/locales/translated/hi_IN.json +++ b/src/ui/locales/translated/hi_IN.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "फ़ोल्डर", - "folder": "फ़ोल्डर", - "password": "पासवर्ड", - "key": "चाबी", - "sshPrivateKey": "एसएसएच निजी कुंजी", - "upload": "अपलोड करें", - "keyPassword": "कुंजी पासवर्ड", - "sshKey": "एसएसएच कुंजी", - "uploadPrivateKeyFile": "निजी कुंजी फ़ाइल अपलोड करें", - "searchCredentials": "खोज क्रेडेंशियल...", - "addCredential": "क्रेडेंशियल जोड़ें", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "सीए प्रमाणपत्र (-cert.pub)", "caCertificateDescription": "वैकल्पिक: सीए द्वारा हस्ताक्षरित प्रमाणपत्र फ़ाइल अपलोड करें या पेस्ट करें (उदाहरण के लिए id_ed25519-cert.pub)। यह तब आवश्यक है जब आपका एसएसएच सर्वर प्रमाणपत्र-आधारित प्रमाणीकरण का उपयोग करता हो।", "uploadCertFile": "-cert.pub फ़ाइल अपलोड करें", - "clearCert": "स्पष्ट", + "clearCert": "Clear", "certLoaded": "प्रमाणपत्र लोड हो गया", "certPublicKeyLabel": "सीए प्रमाणपत्र", "certTypeLabel": "सर्टिफिकेट टाइप", "pasteOrUploadCert": "-cert.pub प्रमाणपत्र पेस्ट करें या अपलोड करें...", "hasCaCert": "सीए प्रमाणपत्र प्राप्त है", - "noCaCert": "सीए प्रमाणपत्र की आवश्यकता नहीं है" + "noCaCert": "सीए प्रमाणपत्र की आवश्यकता नहीं है", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "डिफ़ॉल्ट ऑर्डर", + "sortNameAsc": "नाम (अ से जेड तक)", + "sortNameDesc": "नाम (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "फ़िल्टर साफ़ करें", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "अलर्ट लोड करने में विफल", - "failedToDismissAlert": "अलर्ट को खारिज करने में विफल" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "सर्वर कॉन्फ़िगरेशन", - "description": "अपने बैकएंड सेवाओं से कनेक्ट करने के लिए टर्मिक्स सर्वर यूआरएल को कॉन्फ़िगर करें।", - "serverUrl": "सर्वर यूआरएल", - "enterServerUrl": "कृपया सर्वर URL दर्ज करें", - "saveFailed": "कॉन्फ़िगरेशन सहेजने में विफल", - "saveError": "कॉन्फ़िगरेशन सहेजने में त्रुटि", - "saving": "सहेजा जा रहा है...", - "saveConfig": "कॉन्फ़िगरेशन सहेजें", - "helpText": "वह URL दर्ज करें जहां आपका टर्मिक्स सर्वर चल रहा है (उदाहरण के लिए, http://localhost:30001 या https://your-server.com)", - "changeServer": "सर्वर बदलें", - "mustIncludeProtocol": "सर्वर URL की शुरुआत http:// या https:// से होनी चाहिए।", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "अमान्य प्रमाणपत्र की अनुमति दें", "allowInvalidCertificateDesc": "इसका उपयोग केवल विश्वसनीय सेल्फ-होस्टेड सर्वरों के लिए करें जिनमें सेल्फ-साइन किए गए या आईपी-एड्रेस प्रमाणपत्र हों।", - "useEmbedded": "स्थानीय सर्वर का उपयोग करें", - "embeddedDesc": "Termix को बिल्ट-इन लोकल सर्वर के साथ चलाएं (रिमोट सर्वर की आवश्यकता नहीं है)", - "embeddedConnecting": "स्थानीय सर्वर से कनेक्ट हो रहा है...", - "embeddedNotReady": "स्थानीय सर्वर अभी तैयार नहीं है। कृपया थोड़ी देर प्रतीक्षा करें और पुनः प्रयास करें।", - "localServer": "स्थानीय सर्वर" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "स्थानीय सर्वर", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "संस्करण जाँच त्रुटि", - "checkFailed": "अपडेट की जाँच करने में विफल", - "upToDate": "ऐप अपडेटेड है", - "currentVersion": "आप संस्करण {{version}} चला रहे हैं", - "updateAvailable": "उपलब्ध अद्यतन", - "newVersionAvailable": "एक नया संस्करण उपलब्ध है! आप {{current}}चला रहे हैं, लेकिन {{latest}} भी उपलब्ध है।", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "बीटा संस्करण", - "betaVersionDesc": "आप {{current}}चला रहे हैं, जो नवीनतम स्थिर रिलीज़ {{latest}} से नया है।", - "releasedOn": "{{date}} को जारी किया गया", - "downloadUpdate": "अपडेट डाउनलोड करें", - "checking": "अपडेट के लिए जांच कर रहा है...", - "checkUpdates": "अद्यतन के लिए जाँच", - "checkingUpdates": "अपडेट के लिए जांच कर रहा है...", - "updateRequired": "अद्यतन आवश्यक है" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "बंद करना", - "minimize": "छोटा करना", - "online": "ऑनलाइन", - "offline": "ऑफलाइन", - "continue": "जारी रखना", - "maintenance": "रखरखाव", - "degraded": "अपमानित", - "error": "गलती", - "warning": "चेतावनी", - "unsavedChanges": "असहेजित परिवर्तन", - "dismiss": "नकार देना", - "loading": "लोड हो रहा है...", - "optional": "वैकल्पिक", - "connect": "जोड़ना", - "copied": "कॉपी किया गया", - "connecting": "कनेक्ट हो रहा है...", - "updateAvailable": "उपलब्ध अद्यतन", - "appName": "टर्मिक्स", - "openInNewTab": "वेब टेब में खोलें", - "noReleases": "कोई रिलीज़ नहीं", - "updatesAndReleases": "अपडेट और रिलीज़", - "newVersionAvailable": "एक नया संस्करण ({{version}}) उपलब्ध है।", - "failedToFetchUpdateInfo": "अद्यतन जानकारी प्राप्त करने में विफल", - "preRelease": "पूर्व-रिलीज़", - "noReleasesFound": "कोई रिलीज़ नहीं मिली।", - "cancel": "रद्द करना", - "username": "उपयोगकर्ता नाम", - "login": "लॉग इन करें", - "register": "पंजीकरण करवाना", - "password": "पासवर्ड", - "confirmPassword": "पासवर्ड की पुष्टि कीजिये", - "back": "पीछे", - "save": "बचाना", - "saving": "सहेजा जा रहा है...", - "delete": "मिटाना", - "rename": "नाम बदलें", - "edit": "संपादन करना", - "add": "जोड़ना", - "confirm": "पुष्टि करना", - "no": "नहीं", - "or": "या", - "next": "अगला", - "previous": "पहले का", - "refresh": "ताज़ा करना", - "language": "भाषा", - "checking": "जाँच चल रही है...", - "checkingDatabase": "डेटाबेस कनेक्शन की जाँच की जा रही है...", - "checkingAuthentication": "प्रमाणीकरण की जाँच की जा रही है...", - "backendReconnected": "सर्वर कनेक्शन बहाल हो गया", - "connectionDegraded": "सर्वर कनेक्शन टूट गया, पुनः प्राप्त किया जा रहा है…", - "reload": "पुनः लोड करें", - "remove": "निकालना", - "create": "बनाएं", - "update": "अद्यतन", - "copy": "प्रतिलिपि", - "copyFailed": "क्लिपबोर्ड पर कॉपी करने में विफल", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "अधिकतम", "restore": "पुनर्स्थापित करना", - "of": "का" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "घर", - "terminal": "टर्मिनल", - "docker": "डाक में काम करनेवाला मज़दूर", - "tunnels": "सुरंगों", - "fileManager": "फ़ाइल मैनेजर", - "serverStats": "सर्वर आँकड़े", - "admin": "व्यवस्थापक", - "userProfile": "उपयोगकर्ता रूपरेखा", - "splitScreen": "स्प्लिट स्क्रीन", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "क्या आप इस सक्रिय सत्र को बंद करना चाहते हैं?", - "close": "बंद करना", - "cancel": "रद्द करना", - "sshManager": "एसएसएच प्रबंधक", - "cannotSplitTab": "इस टैब को विभाजित नहीं किया जा सकता", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "पासवर्ड कॉपी करें", - "copySudoPassword": "सूडो पासवर्ड कॉपी करें", - "passwordCopied": "पासवर्ड क्लिपबोर्ड पर कॉपी हो गया है", - "noPasswordAvailable": "कोई पासवर्ड उपलब्ध नहीं है", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "पासवर्ड कॉपी करने में विफल", "refreshTab": "कनेक्शन रीफ़्रेश करें", - "openFileManager": "फ़ाइल प्रबंधक खोलें", - "dashboard": "डैशबोर्ड", - "networkGraph": "नेटवर्क ग्राफ", - "quickConnect": "त्वरित कनेक्ट", - "sshTools": "एसएसएच उपकरण", - "history": "इतिहास", - "hosts": "मेजबान", - "snippets": "स्निपेट्स", - "hostManager": "मेजबान प्रबंधक", - "credentials": "साख", - "connections": "कनेक्शन", - "roleAdministrator": "प्रशासक", - "roleUser": "उपयोगकर्ता" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "मेजबान", - "noHosts": "कोई एसएसएच होस्ट नहीं", - "retry": "पुन: प्रयास करें", - "refresh": "ताज़ा करना", - "optional": "वैकल्पिक", - "downloadSample": "नमूना डाउनलोड करें", - "failedToDeleteHost": "{{name}} को हटाने में विफल", - "importSkipExisting": "आयात करें (मौजूदा को छोड़ दें)", - "connectionDetails": "कनेक्शन विवरण", - "ssh": "एसएसएच", - "telnet": "टेलनेट", - "remoteDesktop": "दूरवर्ती डेस्कटॉप", - "port": "पत्तन", - "username": "उपयोगकर्ता नाम", - "folder": "फ़ोल्डर", - "tags": "टैग", - "pin": "नत्थी करना", - "addHost": "होस्ट जोड़ें", - "editHost": "होस्ट संपादित करें", - "cloneHost": "क्लोन होस्ट", - "enableTerminal": "टर्मिनल सक्षम करें", - "enableTunnel": "सुरंग सक्षम करें", - "enableFileManager": "फ़ाइल प्रबंधक को सक्षम करें", - "enableDocker": "डॉकर को सक्षम करें", - "defaultPath": "डिफ़ॉल्ट पथ", - "connection": "संबंध", - "upload": "अपलोड करें", - "authentication": "प्रमाणीकरण", - "password": "पासवर्ड", - "key": "चाबी", - "credential": "क्रेडेंशियल", - "none": "कोई नहीं", - "sshPrivateKey": "एसएसएच निजी कुंजी", - "keyType": "कुंजी प्रकार", - "uploadFile": "फ़ाइल अपलोड करें", - "tabGeneral": "सामान्य", - "tabSsh": "एसएसएच", - "tabRdp": "आरडीपी", - "tabVnc": "वीएनसी", - "tabTunnels": "सुरंगों", - "tabDocker": "डाक में काम करनेवाला मज़दूर", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", + "ssh": "SSH", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", + "tabSsh": "SSH", + "tabTerminal": "Terminal", + "tabRdp": "RDP", + "tabVnc": "VNC", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "फ़ाइलें", - "tabStats": "आँकड़े", - "tabTelnet": "टेलनेट", - "tabSharing": "शेयरिंग", - "tabAuthentication": "प्रमाणीकरण", - "terminal": "टर्मिनल", - "tunnel": "सुरंग", - "fileManager": "फ़ाइल मैनेजर", - "serverStats": "सर्वर आँकड़े", - "status": "स्थिति", - "folderRenamed": "फ़ोल्डर \"{{oldName}}\" का नाम बदलकर \"{{newName}}\" सफलतापूर्वक कर दिया गया है", - "failedToRenameFolder": "फ़ोल्डर का नाम बदलने में विफल", - "movedToFolder": "\"{{folder}} \" पर स्थानांतरित किया गया", - "editHostTooltip": "होस्ट संपादित करें", - "statusChecks": "स्थिति जांच", - "metricsCollection": "मैट्रिक्स संग्रह", - "metricsInterval": "मैट्रिक्स संग्रह अंतराल", - "metricsIntervalDesc": "सर्वर सांख्यिकी कितनी बार एकत्र करें (5 सेकंड - 1 घंटा)", - "behavior": "व्यवहार", - "themePreview": "थीम पूर्वावलोकन", - "theme": "विषय", - "fontFamily": "फुहारा परिवार", - "fontSize": "फ़ॉन्ट आकार", - "letterSpacing": "पत्र अंतराल", - "lineHeight": "ऊंची लाईन", - "cursorStyle": "कर्सर शैली", - "cursorBlink": "कर्सर ब्लिंक", - "scrollbackBuffer": "स्क्रॉलबैक बफर", - "bellStyle": "घंटी शैली", - "rightClickSelectsWord": "दायाँ क्लिक करने पर वर्ड का चयन होता है", - "fastScrollModifier": "फास्ट स्क्रॉल मॉडिफायर", - "fastScrollSensitivity": "तेज़ स्क्रॉल संवेदनशीलता", - "sshAgentForwarding": "एसएसएच एजेंट फ़ॉरवर्डिंग", - "backspaceMode": "बैकस्पेस मोड", - "startupSnippet": "स्टार्टअप स्निपेट", - "selectSnippet": "स्निपेट का चयन करें", - "forceKeyboardInteractive": "फ़ोर्स कीबोर्ड-इंटरैक्टिव", - "overrideCredentialUsername": "क्रेडेंशियल उपयोगकर्ता नाम को ओवरराइड करें", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "क्रेडेंशियल के उपयोगकर्ता नाम के बजाय ऊपर निर्दिष्ट उपयोगकर्ता नाम का उपयोग करें।", - "jumpHostChain": "जंप होस्ट चेन", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "पोर्ट नॉकिंग", "addKnock": "पोर्ट जोड़ें", "addProxyNode": "नोड जोड़ें", - "proxyNode": "प्रॉक्सी नोड", - "proxyType": "प्रॉक्सी प्रकार", - "quickActions": "त्वरित कार्रवाइयां", - "sudoPasswordAutoFill": "सूडो पासवर्ड ऑटो-फिल", - "sudoPassword": "सूडो पासवर्ड", - "keepaliveInterval": "कीपअलाइव अंतराल (मिलीसेकंड)", - "moshCommand": "MOSH कमांड", - "environmentVariables": "पर्यावरण चर", - "addVariable": "चर जोड़ें", - "docker": "डाक में काम करनेवाला मज़दूर", - "copyTerminalUrl": "टर्मिनल यूआरएल कॉपी करें", - "copyFileManagerUrl": "फ़ाइल मैनेजर यूआरएल कॉपी करें", - "copyRemoteDesktopUrl": "रिमोट डेस्कटॉप यूआरएल कॉपी करें", - "failedToConnect": "कंसोल से कनेक्ट करने में विफल", - "connect": "जोड़ना", - "disconnect": "डिस्कनेक्ट", - "start": "शुरू", - "enableStatusCheck": "स्थिति जांच सक्षम करें", - "enableMetrics": "मैट्रिक्स सक्षम करें", - "bulkUpdateFailed": "बल्क अपडेट विफल रहा", - "selectAll": "सबका चयन करें", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "सबको अचयनित करो", "protocols": "प्रोटोकॉल", "secureShell": "सुरक्षित खोल", @@ -272,6 +303,9 @@ "unencryptedShell": "अनएन्क्रिप्टेड शेल", "addressIp": "पता / आईपी", "friendlyName": "मित्रवत नाम", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "फ़ोल्डर और उन्नत", "privateNotes": "निजी नोट्स", "privateNotesPlaceholder": "इस सर्वर के बारे में विवरण...", @@ -281,18 +315,18 @@ "addKnockBtn": "खटखटाहट जोड़ें", "noPortKnocking": "पोर्ट नॉकिंग कॉन्फ़िगर नहीं किया गया है।", "knockPort": "नॉक पोर्ट", - "protocol": "शिष्टाचार", + "protocol": "Protocol", "delayAfterMs": "विलंब (मिलीसेकंड में)", "useSocks5Proxy": "SOCKS5 प्रॉक्सी का उपयोग करें", "useSocks5ProxyDesc": "प्रॉक्सी सर्वर के माध्यम से रूट कनेक्शन", - "proxyHost": "छद्म मेजबान", - "proxyPort": "प्रॉक्सी पोर्ट", - "proxyUsername": "प्रॉक्सी उपयोगकर्ता नाम", - "proxyPassword": "प्रॉक्सी पासवर्ड", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "एकल प्रॉक्सी", - "proxyChainMode": "प्रॉक्सी श्रृंखला", + "proxyChainMode": "Proxy Chain", "you": "आप", - "jumpHostChainLabel": "जंप होस्ट चेन", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "जंप जोड़ें", "noJumpHosts": "कोई जंप होस्ट कॉन्फ़िगर नहीं किया गया है।", "selectAServer": "एक सर्वर चुनें...", @@ -300,10 +334,10 @@ "authMethod": "प्रमाणीकरण विधि", "storedCredential": "संग्रहीत क्रेडेंशियल", "selectACredential": "एक क्रेडेंशियल चुनें...", - "keyTypeLabel": "कुंजी प्रकार", - "keyTypeAuto": "ऑटो का पता लगाने", - "keyPasteTab": "पेस्ट करें", - "keyUploadTab": "अपलोड करें", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "कुंजी फ़ाइल लोड हो गई", "keyUploadClick": ".pem / .key / .ppk फ़ाइलें अपलोड करने के लिए क्लिक करें", "clearKey": "साफ़ कुंजी", @@ -311,59 +345,105 @@ "keyReplaceNotice": "इसे बदलने के लिए नीचे एक नई कुंजी पेस्ट करें", "keyPassphraseSaved": "पासफ़्रेज़ सहेज लिया गया है, बदलने के लिए टाइप करें", "replaceKey": "चाबी बदलें", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "फोर्स कीबोर्ड इंटरेक्टिव", "forceKeyboardInteractiveShortDesc": "कुंजी मौजूद होने पर भी पासवर्ड को मैन्युअल रूप से दर्ज करने के लिए बाध्य करें", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "टर्मिनल उपस्थिति", "colorTheme": "रंग थीम", - "fontFamilyLabel": "फुहारा परिवार", - "fontSizeLabel": "फ़ॉन्ट आकार", - "cursorStyleLabel": "कर्सर शैली", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "अक्षरों के बीच की दूरी (px)", - "lineHeightLabel": "ऊंची लाईन", - "bellStyleLabel": "घंटी शैली", - "backspaceModeLabel": "बैकस्पेस मोड", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "कर्सर का झपकना", "cursorBlinkingDesc": "टर्मिनल कर्सर के लिए ब्लिंकिंग एनीमेशन सक्षम करें", "rightClickSelectsWordLabel": "दाएँ क्लिक करने पर Word का चयन होता है", "rightClickSelectsWordShortDesc": "कर्सर के नीचे वाले शब्द को दाएँ क्लिक करके चुनें", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "वाक्य - विन्यास पर प्रकाश डालना", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "मुहर", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "व्यवहार और उन्नत", - "scrollbackBufferLabel": "स्क्रॉलबैक बफर", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "इतिहास में रखी जाने वाली पंक्तियों की अधिकतम संख्या", - "sshAgentForwardingLabel": "एसएसएच एजेंट फ़ॉरवर्डिंग", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "अपनी स्थानीय SSH कुंजी इस होस्ट को भेजें", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "ऑटो-मोश को सक्षम करें", "enableAutoMoshDesc": "यदि उपलब्ध हो तो SSH के बजाय Mosh को प्राथमिकता दें।", "enableAutoTmux": "ऑटो-टीमक्स सक्षम करें", "enableAutoTmuxDesc": "tmux सेशन को स्वचालित रूप से लॉन्च करें या उससे जुड़ें", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "सूडो पासवर्ड ऑटो-फिल", "sudoPasswordAutoFillShortDesc": "पूछे जाने पर स्वचालित रूप से sudo पासवर्ड प्रदान करें", - "sudoPasswordLabel": "सूडो पासवर्ड", - "environmentVariablesLabel": "पर्यावरण चर", - "addVariableBtn": "चर जोड़ें", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "कोई पर्यावरण चर कॉन्फ़िगर नहीं किया गया है।", - "fastScrollModifierLabel": "फास्ट स्क्रॉल मॉडिफायर", - "fastScrollSensitivityLabel": "तेज़ स्क्रॉल संवेदनशीलता", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "मोश कमांड", - "startupSnippetLabel": "स्टार्टअप स्निपेट", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "कीपअलाइव अंतराल (सेकंड)", "maxKeepaliveMisses": "मैक्स कीपअलाइव चूक", "tunnelSettings": "टनल सेटिंग्स", "enableTunneling": "टनलिंग सक्षम करें", "enableTunnelingDesc": "इस होस्ट के लिए SSH टनल कार्यक्षमता सक्षम करें", "serverTunnelsSection": "सर्वर टनल", - "addTunnelBtn": "सुरंग जोड़ें", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "कोई सुरंगें कॉन्फ़िगर नहीं की गई हैं।", - "tunnelLabel": "सुरंग {{number}}", - "tunnelType": "सुरंग प्रकार", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "स्थानीय पोर्ट को रिमोट सर्वर (या उससे पहुंच योग्य होस्ट) पर स्थित पोर्ट पर फॉरवर्ड करें।", "tunnelModeRemoteDesc": "रिमोट सर्वर पर मौजूद पोर्ट को अपनी मशीन के लोकल पोर्ट पर फॉरवर्ड करें।", "tunnelModeDynamicDesc": "डायनामिक पोर्ट फॉरवर्डिंग के लिए लोकल पोर्ट पर SOCKS5 प्रॉक्सी बनाएं।", "sameHost": "यह होस्ट (प्रत्यक्ष सुरंग)", "endpointHost": "एंडपॉइंट होस्ट", - "endpointPort": "एंडपॉइंट पोर्ट", + "endpointPort": "Endpoint Port", "bindHost": "होस्ट को बांधें", - "sourcePort": "स्रोत पोर्ट", - "maxRetries": "अधिकतम पुनः प्रयास", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "पुनः प्रयास अंतराल (सेकंड)", "autoStartLabel": "ऑटो स्टार्ट", "autoStartDesc": "होस्ट लोड होने पर यह टनल स्वचालित रूप से कनेक्ट हो जाएगी", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "जोडने में विफल", "failedToDisconnectTunnel": "डिस्कनेक्ट करने में विफल", "dockerIntegration": "डॉकर एकीकरण", - "enableDockerMonitor": "डॉकर को सक्षम करें", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "डॉकर के माध्यम से इस होस्ट पर कंटेनरों की निगरानी और प्रबंधन करें।", - "enableFileManagerMonitor": "फ़ाइल प्रबंधक को सक्षम करें", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "SFTP के माध्यम से इस होस्ट पर फ़ाइलों को ब्राउज़ करें और प्रबंधित करें।", - "defaultPathLabel": "डिफ़ॉल्ट पथ", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "इस होस्ट के लिए फ़ाइल मैनेजर लॉन्च होने पर खुलने वाली निर्देशिका।", - "statusChecksLabel": "स्थिति जांच", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "स्थिति जांच सक्षम करें", "enableStatusChecksDesc": "उपलब्धता की पुष्टि करने के लिए समय-समय पर इस होस्ट को पिंग करें।", "useGlobalInterval": "वैश्विक अंतराल का उपयोग करें", "useGlobalIntervalDesc": "सर्वर-व्यापी स्थिति जांच अंतराल के साथ ओवरराइड करें", "checkIntervalS": "जाँच अंतराल(ओं)", "checkIntervalDesc": "प्रत्येक कनेक्टिविटी पिंग के बीच सेकंड का अंतर", - "metricsCollectionLabel": "मैट्रिक्स संग्रह", - "enableMetricsLabel": "मैट्रिक्स सक्षम करें", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "इस होस्ट से CPU, RAM, डिस्क और नेटवर्क उपयोग की जानकारी एकत्र करें।", "useGlobalMetrics": "वैश्विक अंतराल का उपयोग करें", "useGlobalMetricsDesc": "सर्वर-व्यापी मेट्रिक्स अंतराल के साथ ओवरराइड करें", "metricsIntervalS": "मैट्रिक्स अंतराल (सेकंड)", "metricsIntervalDesc2": "मीट्रिक स्नैपशॉट के बीच सेकंड", "visibleWidgets": "दृश्यमान विजेट", - "cpuUsageLabel": "सीपीयू उपयोग", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "सीपीयू प्रतिशत, लोड औसत, स्पार्कलाइन ग्राफ", - "memoryLabel": "स्मृति प्रयोग", + "memoryLabel": "Memory Usage", "memoryDesc": "रैम उपयोग, स्वैप, कैश किया गया", - "storageLabel": "डिस्क उपयोग", + "storageLabel": "Disk Usage", "storageDesc": "प्रति माउंट पॉइंट डिस्क उपयोग", - "networkLabel": "नेटवर्क इंटरफेस", + "networkLabel": "Network Interfaces", "networkDesc": "इंटरफ़ेस सूची और बैंडविड्थ", - "uptimeLabel": "अपटाइम", + "uptimeLabel": "Uptime", "uptimeDesc": "सिस्टम अपटाइम और बूट समय", "systemInfoLabel": "व्यवस्था की सूचना", "systemInfoDesc": "ऑपरेटिंग सिस्टम, कर्नेल, होस्टनाम, आर्किटेक्चर", @@ -409,61 +532,100 @@ "recentLoginsDesc": "सफल और असफल लॉगिन इवेंट", "topProcessesLabel": "शीर्ष प्रक्रियाएँ", "topProcessesDesc": "पीआईडी, सीपीयू%, एमईएम%, कमांड", - "listeningPortsLabel": "श्रवण पोर्ट", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "प्रक्रिया और स्थिति के साथ पोर्ट खोलें", - "firewallLabel": "फ़ायरवॉल", + "firewallLabel": "Firewall", "firewallDesc": "फ़ायरवॉल, ऐपआर्मर, SELinux स्थिति", - "quickActionsLabel": "त्वरित कार्रवाइयां", - "quickActionsToolbar": "त्वरित क्रियाएं सर्वर सांख्यिकी टूलबार में बटन के रूप में दिखाई देती हैं, जिन्हें एक क्लिक में निष्पादित किया जा सकता है।", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "अभी तक कोई त्वरित कार्रवाई नहीं की गई है।", "buttonLabel": "बटन लेबल", "selectSnippetPlaceholder": "अंश का चयन करें...", "addActionBtn": "कार्रवाई जोड़ें", "hostSharedSuccessfully": "होस्ट ने सफलतापूर्वक साझा किया", - "failedToShareHost": "होस्ट साझा करने में विफल", + "failedToShareHost": "Failed to share host", "accessRevoked": "पहुँच रद्द कर दी गई", - "failedToRevokeAccess": "पहुँच रद्द करने में विफल", - "cancelBtn": "रद्द करना", - "savingBtn": "सहेजा जा रहा है...", - "addHostBtn": "होस्ट जोड़ें", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "होस्ट अपडेट किया गया", "hostCreated": "होस्ट ने बनाया", "failedToSave": "होस्ट को सहेजने में विफल", "credentialUpdated": "क्रेडेंशियल अपडेट किया गया", "credentialCreated": "क्रेडेंशियल बनाया गया", - "failedToSaveCredential": "क्रेडेंशियल सहेजने में विफल", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "मेज़बानों पर वापस जाएँ", "backToCredentials": "क्रेडेंशियल्स पर वापस जाएँ", - "pinned": "पिन की गई", - "noHostsFound": "कोई होस्ट नहीं मिला", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "कोई दूसरा शब्द आजमाएँ", "addFirstHost": "शुरुआत करने के लिए अपना पहला होस्ट जोड़ें", "noCredentialsFound": "कोई क्रेडेंशियल नहीं मिला", - "addCredentialBtn": "क्रेडेंशियल जोड़ें", - "updateCredentialBtn": "क्रेडेंशियल अपडेट करें", - "features": "विशेषताएँ", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(कोई फ़ोल्डर नहीं)", - "deleteSelected": "मिटाना", + "deleteSelected": "Delete", "exitSelection": "निकास चयन", - "importSkip": "आयात करें (मौजूदा को छोड़ दें)", + "importSkip": "Import (skip existing)", "importOverwrite": "आयात (ओवरराइट)", "collapseBtn": "गिर जाना", "importExportBtn": "आयात / निर्यात", "hostStatusesRefreshed": "होस्ट की स्थिति रीफ्रेश हो गई है", "failedToRefreshHosts": "होस्ट को रीफ़्रेश करने में विफल", - "movedHostTo": "{{host}} को \"{{folder}} \" में स्थानांतरित किया गया", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "होस्ट को स्थानांतरित करने में विफल", - "folderRenamedTo": "फ़ोल्डर का नाम बदलकर \"{{name}} \" कर दिया गया है", - "deletedFolder": "फ़ोल्डर \"{{name}} \" हटा दिया गया", - "failedToDeleteFolder": "फ़ोल्डर को हटाने में विफल", - "deleteAllInFolder": "\"{{name}}\" में सभी होस्ट हटाएँ? इसे पूर्ववत नहीं किया जा सकता है।", - "deletedHost": "हटा दिया गया {{name}}", - "copiedToClipboard": "क्लिपबोर्ड पर कॉपी हो गया", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "फ़ोल्डर संपादित करें", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "फ़ोल्डर संपादित करें", + "deleteFolder": "फ़ोल्डर हटाएं", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "होस्ट को स्थानांतरित करने में विफल", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "टर्मिनल यूआरएल कॉपी हो गया", "fileManagerUrlCopied": "फ़ाइल मैनेजर यूआरएल कॉपी हो गया", "tunnelUrlCopied": "टनल यूआरएल कॉपी किया गया", "dockerUrlCopied": "डॉकर यूआरएल कॉपी किया गया", - "serverStatsUrlCopied": "सर्वर स्टैट्स यूआरएल कॉपी किया गया", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "आरडीपी यूआरएल कॉपी हो गया", "vncUrlCopied": "VNC URL कॉपी हो गया", "telnetUrlCopied": "टेलनेट यूआरएल कॉपी हो गया", @@ -471,109 +633,112 @@ "expandActions": "कार्यों का विस्तार करें", "collapseActions": "कार्यों को संक्षिप्त करें", "wakeOnLanAction": "लैन पर जागो", - "wakeOnLanSuccess": "मैजिक पैकेट {{name}} को भेजा गया", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "मैजिक पैकेट भेजने में विफल", - "cloneHostAction": "क्लोन होस्ट", + "cloneHostAction": "Clone Host", "copyAddress": "पता कॉपी करें", "copyLink": "लिंक की प्रतिलिपि करें", - "copyTerminalUrlAction": "टर्मिनल यूआरएल कॉपी करें", - "copyFileManagerUrlAction": "फ़ाइल मैनेजर यूआरएल कॉपी करें", - "copyTunnelUrlAction": "टनल यूआरएल कॉपी करें", - "copyDockerUrlAction": "डॉकर यूआरएल कॉपी करें", - "copyServerStatsUrlAction": "सर्वर सांख्यिकी यूआरएल कॉपी करें", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "आरडीपी यूआरएल कॉपी करें", "copyVncUrlAction": "VNC URL कॉपी करें", "copyTelnetUrlAction": "टेलनेट यूआरएल कॉपी करें", - "copyRemoteDesktopUrlAction": "रिमोट डेस्कटॉप यूआरएल कॉपी करें", - "deleteCredentialConfirm": "क्रेडेंशियल \"{{name}} \" हटाएं?", - "deletedCredential": "हटा दिया गया {{name}}", - "deploySSHKeyTitle": "एसएसएच कुंजी तैनात करें", - "deployingBtn": "तैनाती जारी है...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "तैनात करना", "failedToDeployKey": "कुंजी तैनात करने में विफल", - "deleteHostsConfirm": "{{count}} होस्ट{{plural}}को हटाएँ? इसे पूर्ववत नहीं किया जा सकता।", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "रूट में स्थानांतरित किया गया", - "failedToMoveHosts": "होस्ट को स्थानांतरित करने में विफल", - "enableTerminalFeature": "टर्मिनल सक्षम करें", - "disableTerminalFeature": "टर्मिनल को अक्षम करें", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "फ़ाइलें सक्षम करें", "disableFilesFeature": "फ़ाइलें अक्षम करें", "enableTunnelsFeature": "सुरंगों को सक्षम करें", "disableTunnelsFeature": "सुरंगों को निष्क्रिय करें", - "enableDockerFeature": "डॉकर को सक्षम करें", - "disableDockerFeature": "डॉकर को अक्षम करें", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "टैगों को जोड़ें...", "authDetails": "प्रमाणीकरण विवरण", - "credType": "प्रकार", + "credType": "Type", "generateKeyPairDesc": "एक नया कुंजी युग्म उत्पन्न करें, निजी और सार्वजनिक दोनों कुंजियाँ स्वचालित रूप से भर दी जाएंगी।", "generatingKey": "जनरेट हो रहा है...", - "generateLabel": "जनरेट {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "फ़ाइल अपलोड करें", "keyPassphraseOptional": "कुंजी पासफ़्रेज़ (वैकल्पिक)", "sshPublicKeyOptional": "एसएसएच सार्वजनिक कुंजी (वैकल्पिक)", "publicKeyGenerated": "जनित सार्वजनिक कुंजी", "failedToGeneratePublicKey": "सार्वजनिक कुंजी प्राप्त करने में विफल", "publicKeyCopied": "सार्वजनिक कुंजी कॉपी कर ली गई", - "keyPairGenerated": "{{label}} कुंजी युग्म उत्पन्न हुआ", - "failedToGenerateKeyPair": "कुंजी युग्म उत्पन्न करने में विफल", - "searchHostsPlaceholder": "होस्ट, पते, टैग खोजें…", - "searchCredentialsPlaceholder": "खोज क्रेडेंशियल…", - "refreshBtn": "ताज़ा करना", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "टैगों को जोड़ें...", - "deleteConfirmBtn": "मिटाना", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH सर्वर के लिए /etc/ssh/sshd_config में GatewayPorts yes, AllowTcpForwarding yes और PermitRootLogin yes सेट होना आवश्यक है।", - "deleteHostConfirm": "\"{{name}} \" को हटाएँ?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "प्रमाणीकरण और कनेक्शन सेटिंग्स को कॉन्फ़िगर करने के लिए ऊपर दिए गए प्रोटोकॉल में से कम से कम एक को सक्षम करें।", - "keyPassphrase": "कुंजी पासफ़्रेज़", - "connectBtn": "जोड़ना", - "disconnectBtn": "डिस्कनेक्ट", - "basicInformation": "मूल जानकारी", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "प्रमाणीकरण विवरण", - "credTypeLabel": "प्रकार", - "hostsTab": "मेजबान", - "credentialsTab": "साख", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "एकाधिक का चयन करें", "selectHosts": "होस्ट चुनें", - "connectionLabel": "संबंध", - "authenticationLabel": "प्रमाणीकरण", - "generateKeyPairTitle": "कुंजी युग्म उत्पन्न करें", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "एक नया कुंजी युग्म उत्पन्न करें, निजी और सार्वजनिक दोनों कुंजियाँ स्वचालित रूप से भर दी जाएंगी।", - "generateFromPrivateKey": "निजी कुंजी से उत्पन्न करें", - "refreshBtn2": "ताज़ा करना", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "निकास चयन", "exportAll": "सभी निर्यात करें", - "addHostBtn2": "होस्ट जोड़ें", - "addCredentialBtn2": "क्रेडेंशियल जोड़ें", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "होस्ट की स्थिति की जाँच की जा रही है...", - "pinnedSection": "पिन की गई", + "pinnedSection": "Pinned", "hostsExported": "होस्ट सफलतापूर्वक निर्यात हो गए", "exportFailed": "होस्ट निर्यात करने में विफल", "sampleDownloaded": "नमूना फ़ाइल डाउनलोड हो गई", - "failedToDeleteCredential2": "क्रेडेंशियल हटाने में विफल", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(कोई फ़ोल्डर नहीं)", - "nSelected": "{{count}} चयनित", - "featuresMenu": "विशेषताएँ", - "moveMenu": "कदम", - "cancelSelection": "रद्द करना", - "deployDialogDesc": "होस्ट के authorized_keys पर {{name}} तैनात करें।", - "targetHostLabel": "लक्ष्य मेजबान", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "एक होस्ट का चयन करें...", "keyDeployedSuccess": "कुंजी सफलतापूर्वक तैनात की गई", "failedToDeployKey2": "कुंजी तैनात करने में विफल", - "deletedCount": "हटाए गए {{count}} होस्ट", - "failedToDeleteCount": "{{count}} होस्ट को हटाने में विफल", - "duplicatedHost": "डुप्लिकेट \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "होस्ट को डुप्लिकेट करने में विफल", - "updatedCount": "अपडेट किए गए {{count}} होस्ट", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "मित्रवत नाम", - "descriptionLabel": "विवरण", + "descriptionLabel": "Description", "loadingHost": "होस्ट लोड हो रहा है...", - "loadingHosts": "होस्ट लोड हो रहे हैं...", - "loadingCredentials": "क्रेडेंशियल लोड हो रहे हैं...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "अभी तक कोई होस्ट नहीं है", - "noHostsMatchSearch": "आपकी खोज से मेल खाने वाले कोई होस्ट नहीं हैं", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "होस्ट नहीं मिला", - "searchHosts": "होस्ट खोजें...", + "searchHosts": "Search hosts...", "sortHosts": "होस्ट को क्रमबद्ध करें", "sortDefault": "डिफ़ॉल्ट ऑर्डर", "sortNameAsc": "नाम (अ से जेड तक)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "पहले पिन किया गया", "filterHosts": "होस्ट को फ़िल्टर करें", "filterClearAll": "फ़िल्टर साफ़ करें", - "filterStatusGroup": "स्थिति", - "filterOnline": "ऑनलाइन", - "filterOffline": "ऑफलाइन", - "filterPinned": "पिन की गई", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "प्राधिकरण प्रकार", - "filterAuthPassword": "पासवर्ड", - "filterAuthKey": "एसएसएच कुंजी", - "filterAuthCredential": "क्रेडेंशियल", - "filterAuthNone": "कोई नहीं", - "filterAuthOpkssh": "ओपीकेएसएच", - "filterProtocolGroup": "शिष्टाचार", - "filterProtocolSsh": "एसएसएच", - "filterProtocolRdp": "आरडीपी", - "filterProtocolVnc": "वीएनसी", - "filterProtocolTelnet": "टेलनेट", - "filterFeaturesGroup": "विशेषताएँ", - "filterFeatureTerminal": "टर्मिनल", - "filterFeatureFileManager": "फ़ाइल मैनेजर", - "filterFeatureTunnel": "सुरंग", - "filterFeatureDocker": "डाक में काम करनेवाला मज़दूर", - "filterTagsGroup": "टैग", - "shareHost": "होस्ट साझा करें", - "shareHostTitle": "शेयर करें: {{name}}", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", + "filterAuthOpkssh": "OPKSSH", + "filterProtocolGroup": "Protocol", + "filterProtocolSsh": "SSH", + "filterProtocolRdp": "RDP", + "filterProtocolVnc": "VNC", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "इस होस्ट को शेयरिंग सक्षम करने के लिए क्रेडेंशियल का उपयोग करना होगा। पहले होस्ट को संपादित करें और एक क्रेडेंशियल असाइन करें।" }, "guac": { - "connection": "संबंध", - "authentication": "प्रमाणीकरण", - "connectionSettings": "कनेक्शन सेटिंग्स", - "displaySettings": "प्रदर्शन सेटिंग्स", - "audioSettings": "श्रव्य विन्यास", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "संग्रहीत क्रेडेंशियल", + "noCredential": "No credential (direct credentials below)", + "authMethod": "प्रमाणीकरण विधि", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "एक क्रेडेंशियल चुनें...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "आरडीपी प्रदर्शन", - "deviceRedirection": "डिवाइस पुनर्निर्देशन", - "session": "सत्र", - "gateway": "द्वार", - "remoteApp": "रिमोटऐप", - "clipboard": "क्लिपबोर्ड", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "सत्र रिकॉर्डिंग", - "wakeOnLan": "लैन पर जागो", - "vncSettings": "वीएनसी सेटिंग्स", - "terminalSettings": "टर्मिनल सेटिंग्स", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "आरडीपी पोर्ट", - "username": "उपयोगकर्ता नाम", - "password": "पासवर्ड", - "domain": "कार्यक्षेत्र", - "securityMode": "सुरक्षा मोड", - "colorDepth": "रंग की गहराई", - "width": "चौड़ाई", - "height": "ऊंचाई", - "dpi": "डीपीआई", - "resizeMethod": "आकार बदलने की विधि", - "clientName": "ग्राहक नाम", - "initialProgram": "प्रारंभिक कार्यक्रम", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "सर्वर लेआउट", - "timezone": "समय क्षेत्र", - "gatewayHostname": "गेटवे होस्टनाम", - "gatewayPort": "गेटवे पोर्ट", - "gatewayUsername": "गेटवे उपयोगकर्ता नाम", - "gatewayPassword": "गेटवे पासवर्ड", - "gatewayDomain": "गेटवे डोमेन", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "रिमोटऐप प्रोग्राम", "workingDirectory": "कार्यकारी डाइरेक्टरी", "arguments": "बहस", "normalizeLineEndings": "लाइन के अंत को सामान्य करें", - "recordingPath": "रिकॉर्डिंग पथ", - "recordingName": "रिकॉर्डिंग नाम", - "macAddress": "मैक पता", - "broadcastAddress": "ब्रॉडकास्ट पता", - "udpPort": "यूडीपी पोर्ट", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "प्रतीक्षा समय (सेकंड में)", - "driveName": "ड्राइव का नाम", - "drivePath": "ड्राइव पथ", - "ignoreCertificate": "प्रमाणपत्र को अनदेखा करें", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "सेल्फ-साइन किए गए प्रमाणपत्रों वाले होस्ट से कनेक्शन की अनुमति दें", - "forceLossless": "बल हानि रहित", + "forceLossless": "Force Lossless", "forceLosslessDesc": "दोषरहित छवि एन्कोडिंग को लागू करें (उच्च गुणवत्ता, अधिक बैंडविड्थ)", - "disableAudio": "ऑडियो अक्षम करें", + "disableAudio": "Disable Audio", "disableAudioDesc": "रिमोट सेशन से सभी ऑडियो म्यूट करें", "enableAudioInput": "ऑडियो इनपुट (माइक्रोफ़ोन) चालू करें", "enableAudioInputDesc": "स्थानीय माइक्रोफ़ोन को रिमोट सेशन पर फ़ॉरवर्ड करें", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "एयरो ग्लास प्रभाव सक्षम करें", "menuAnimations": "मेनू एनिमेशन", "menuAnimationsDesc": "मेनू फेड और स्लाइड एनिमेशन सक्षम करें", - "disableBitmapCaching": "बिटमैप कैशिंग को अक्षम करें", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "बिटमैप कैश बंद करें (इससे तकनीकी गड़बड़ियों को ठीक करने में मदद मिल सकती है)", - "disableOffscreenCaching": "ऑफस्क्रीन कैशिंग को अक्षम करें", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "ऑफस्क्रीन कैश बंद करें", - "disableGlyphCaching": "ग्लिफ़ कैशिंग को अक्षम करें", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "ग्लिफ़ कैश बंद करें", - "enableGfx": "जीएफएक्स सक्षम करें", + "enableGfx": "Enable GFX", "enableGfxDesc": "RemoteFX ग्राफिक्स पाइपलाइन का उपयोग करें", - "enablePrinting": "मुद्रण सक्षम करें", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "स्थानीय प्रिंटरों को रिमोट सेशन पर रीडायरेक्ट करें", - "enableDriveRedirection": "ड्राइव रीडायरेक्शन सक्षम करें", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "रिमोट सेशन में स्थानीय फ़ोल्डर को ड्राइव के रूप में मैप करें", - "createDrivePath": "ड्राइव पथ बनाएँ", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "यदि फ़ोल्डर मौजूद नहीं है तो उसे स्वचालित रूप से बना दें", - "disableDownload": "डाउनलोड अक्षम करें", + "disableDownload": "Disable Download", "disableDownloadDesc": "रिमोट सेशन से फ़ाइलें डाउनलोड करने से रोकें", - "disableUpload": "अपलोड अक्षम करें", + "disableUpload": "Disable Upload", "disableUploadDesc": "रिमोट सेशन में फ़ाइलें अपलोड करने से रोकें", - "enableTouch": "टच सक्षम करें", + "enableTouch": "Enable Touch", "enableTouchDesc": "टच इनपुट फ़ॉरवर्डिंग सक्षम करें", - "consoleSession": "कंसोल सत्र", + "consoleSession": "Console Session", "consoleSessionDesc": "नए सत्र के बजाय कंसोल (सत्र 0) से कनेक्ट करें", "sendWolPacket": "WOL पैकेट भेजें", "sendWolPacketDesc": "कनेक्ट करने से पहले इस होस्ट को जगाने के लिए एक मैजिक पैकेट भेजें।", - "disableCopy": "कॉपी अक्षम करें", + "disableCopy": "Disable Copy", "disableCopyDesc": "रिमोट सेशन से टेक्स्ट कॉपी करने से रोकें", - "disablePaste": "पेस्ट अक्षम करें", + "disablePaste": "Disable Paste", "disablePasteDesc": "रिमोट सेशन में टेक्स्ट पेस्ट करने से रोकें", "createPathIfMissing": "यदि पथ मौजूद नहीं है तो उसे बनाएं", "createPathIfMissingDesc": "रिकॉर्डिंग डायरेक्टरी स्वचालित रूप से बनाएं", - "excludeOutput": "आउटपुट को बाहर रखें", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "स्क्रीन आउटपुट रिकॉर्ड न करें (केवल मेटाडेटा)।", - "excludeMouse": "माउस को बाहर रखें", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "माउस की गतिविधियों को रिकॉर्ड न करें", "includeKeystrokes": "कीस्ट्रोक्स शामिल करें", "includeKeystrokesDesc": "स्क्रीन आउटपुट के अलावा मूल कीस्ट्रोक्स को भी रिकॉर्ड करें", @@ -718,117 +896,120 @@ "vncPassword": "वीएनसी पासवर्ड", "vncUsernameOptional": "उपयोगकर्ता नाम (वैकल्पिक)", "vncLeaveBlank": "यदि आवश्यक न हो तो इसे खाली छोड़ दें", - "cursorMode": "कर्सर मोड", - "swapRedBlue": "लाल/नीले रंग की अदला-बदली करें", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "लाल और नीले रंग के चैनलों को आपस में बदलें (इससे कुछ रंग संबंधी समस्याएं ठीक हो जाती हैं)", "readOnly": "केवल पढ़ने के लिए", "readOnlyDesc": "बिना कोई इनपुट भेजे रिमोट स्क्रीन देखें", "telnetPort": "टेलनेट पोर्ट", - "terminalType": "टर्मिनल प्रकार", - "fontName": "फ़ॉन्ट नाम", - "fontSize": "फ़ॉन्ट आकार", - "colorScheme": "रंग योजना", - "backspaceKey": "बैकस्पेस कुंजी", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "पहले होस्ट को सेव करें।", "sharingOptionsAfterSave": "होस्ट को सेव करने के बाद शेयरिंग के विकल्प उपलब्ध हो जाते हैं।", "sharingLoadError": "शेयरिंग डेटा लोड करने में विफल। कृपया अपना कनेक्शन जांचें और पुनः प्रयास करें।", - "shareHostSection": "होस्ट साझा करें", - "shareWithUser": "उपयोगकर्ता के साथ साझा करें", - "shareWithRole": "भूमिका के साथ साझा करें", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "उपयोगकर्ता का चयन करें", - "selectRole": "भूमिका का चयन करें", + "selectRole": "Select Role", "selectUserOption": "किसी उपयोगकर्ता का चयन करें...", "selectRoleOption": "एक भूमिका चुनें...", - "permissionLevel": "अनुमति स्तर", + "permissionLevel": "Permission Level", "expiresInHours": "समाप्ति तिथि (घंटे)", "noExpiryPlaceholder": "समाप्ति तिथि से पहले खाली छोड़ दें", - "shareBtn": "शेयर करना", - "currentAccess": "वर्तमान पहुंच", - "typeHeader": "प्रकार", - "targetHeader": "लक्ष्य", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "अनुमति", - "grantedByHeader": "अनुमती देना", - "expiresHeader": "समय-सीमा समाप्त", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "अभी तक प्रवेश के लिए कोई प्रविष्टियाँ नहीं हैं।", - "expiredLabel": "खत्म हो चुका", - "neverLabel": "कभी नहीं", - "revokeBtn": "रद्द करना", - "cancelBtn": "रद्द करना", - "savingBtn": "सहेजा जा रहा है...", - "updateHostBtn": "होस्ट को अपडेट करें", - "addHostBtn": "होस्ट जोड़ें" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "होस्ट, कमांड या सेटिंग्स खोजें...", - "quickActions": "त्वरित कार्रवाइयां", - "hostManager": "मेजबान प्रबंधक", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "होस्ट को प्रबंधित करें, जोड़ें या संपादित करें", "addNewHost": "नया होस्ट जोड़ें", "addNewHostDesc": "नए होस्ट को पंजीकृत करें", - "adminSettings": "व्यवस्थापक सेटिंग्स", + "adminSettings": "Admin Settings", "adminSettingsDesc": "सिस्टम प्राथमिकताएं और उपयोगकर्ता कॉन्फ़िगर करें", - "userProfile": "उपयोगकर्ता रूपरेखा", + "userProfile": "User Profile", "userProfileDesc": "अपना खाता और प्राथमिकताएं प्रबंधित करें", - "addCredential": "क्रेडेंशियल जोड़ें", + "addCredential": "Add Credential", "addCredentialDesc": "SSH कुंजी या पासवर्ड संग्रहीत करें", - "recentActivity": "हाल की गतिविधि", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "सर्वर और होस्ट", - "noHostsFound": "\"{{search}} \" से मेल खाने वाले कोई होस्ट नहीं मिले", - "links": "लिंक", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "नेविगेट", - "select": "चुनना", + "select": "Select", "toggleWith": "टॉगल करें" }, "splitScreen": { - "paneEmpty": "फलक {{index}} - खाली", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "कोई टैब आवंटित नहीं किया गया", "focusedPane": "सक्रिय फलक" }, "connections": { "noConnections": "कोई कनेक्शन नहीं", "noConnectionsDesc": "यहां कनेक्शन देखने के लिए टर्मिनल, फ़ाइल मैनेजर या रिमोट डेस्कटॉप खोलें।", - "connectedFor": "{{duration}} के लिए कनेक्टेड", - "connected": "जुड़े हुए", - "disconnected": "डिस्कनेक्ट किया गया", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "टैब बंद करें", "closeConnection": "घनिष्ठ संबंध", "forgetTab": "भूल जाओ", - "removeBackground": "निकालना", - "reconnect": "रिकनेक्ट", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "फिर से खोलना", "sectionOpen": "खुला", "sectionBackground": "पृष्ठभूमि", "backgroundDesc": "कनेक्शन टूटने के बाद भी सेशन 30 मिनट तक जारी रहता है और दोबारा कनेक्ट किया जा सकता है।", "persisted": "पृष्ठभूमि में बना रहा", - "expiresIn": "समाप्ति तिथि {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "कनेक्शन खोजें...", - "noSearchResults": "आपकी खोज से कोई संबंध नहीं मिला" + "noSearchResults": "आपकी खोज से कोई संबंध नहीं मिला", + "rename": "Rename session" }, "guacamole": { - "connecting": "{{type}} सत्र से कनेक्ट हो रहा है...", - "connectionError": "संपर्क त्रुटि", - "connectionFailed": "कनेक्शन विफल", - "failedToConnect": "कनेक्शन टोकन प्राप्त करने में विफल", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "होस्ट नहीं मिला", - "noHostSelected": "कोई होस्ट चयनित नहीं है", - "reconnect": "रिकनेक्ट", - "retry": "पुन: प्रयास करें", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "रिमोट डेस्कटॉप सेवा (guacd) उपलब्ध नहीं है। कृपया सुनिश्चित करें कि guacd चल रहा है, सुलभ है और प्रशासनिक सेटिंग्स में ठीक से कॉन्फ़िगर किया गया है।", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", "winL": "Win+L (लॉक स्क्रीन)", "winKey": "विंडोज़ कुंजी", - "ctrl": "कंट्रोल", + "ctrl": "Ctrl", "alt": "Alt", - "shift": "बदलाव", + "shift": "Shift", "win": "जीतना", - "stickyActive": "{{key}} (लॉक हो गया - छोड़ने के लिए क्लिक करें)", - "stickyInactive": "{{key}} (लॉक करने के लिए क्लिक करें)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "पलायन", "tab": "टैब", - "home": "घर", + "home": "Home", "end": "अंत", "pageUp": "पेज अप", "pageDown": "पेज नीचे", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "होस्ट से कनेक्ट करें", - "clear": "स्पष्ट", - "paste": "पेस्ट करें", - "reconnect": "रिकनेक्ट", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "कनेक्शन टूट गया", - "connected": "जुड़े हुए", - "clipboardWriteFailed": "क्लिपबोर्ड पर कॉपी करने में विफल। सुनिश्चित करें कि पृष्ठ HTTPS या लोकलहोस्ट पर चल रहा है।", - "clipboardReadFailed": "क्लिपबोर्ड से पढ़ने में विफलता। सुनिश्चित करें कि क्लिपबोर्ड की अनुमतियाँ दी गई हैं।", - "clipboardHttpWarning": "पेस्ट करने के लिए HTTPS आवश्यक है। Ctrl+Shift+V का उपयोग करें या HTTPS पर Termix को सर्व करें।", - "unknownError": "अज्ञात त्रुटि उत्पन्न हुई", - "websocketError": "वेबसॉकेट कनेक्शन त्रुटि", - "connecting": "कनेक्ट हो रहा है...", - "noHostSelected": "कोई होस्ट चयनित नहीं है", - "reconnecting": "पुनः कनेक्ट हो रहा है... ({{attempt}}/{{max}})", - "reconnected": "सफलतापूर्वक पुनः कनेक्ट हो गया", - "tmuxSessionCreated": "tmux सत्र बनाया गया: {{name}}", - "tmuxSessionAttached": "tmux सत्र संलग्न: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "रिमोट होस्ट पर tmux इंस्टॉल नहीं है, इसलिए स्टैंडर्ड शेल का उपयोग किया जा रहा है।", "tmuxSessionPickerTitle": "tmux सत्र", "tmuxSessionPickerDesc": "इस होस्ट पर पहले से मौजूद tmux सेशन पाए गए हैं। पुनः जुड़ने के लिए किसी एक का चयन करें या नया सेशन बनाएं।", - "tmuxWindows": "विंडोज़", - "tmuxWindowCount": "{{count}} विंडो", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "संलग्न ग्राहक", - "tmuxAttachedCount": "{{count}} संलग्न", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "अंतिम गतिविधि", "tmuxTimeJustNow": "बस अब", - "tmuxTimeMinutes": "{{count}}मीटर पहले", - "tmuxTimeHours": "{{count}}घंटे पहले", - "tmuxTimeDays": "{{count}}दिन पहले", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "नया सत्र शुरू करें", "tmuxCopyHint": "चयन को समायोजित करें और क्लिपबोर्ड पर कॉपी करने के लिए एंटर दबाएं।", "tmuxDetach": "tmux सत्र से अलग हो जाएं", "tmuxDetached": "tmux सत्र से अलग हो गया", - "maxReconnectAttemptsReached": "अधिकतम पुनः कनेक्शन प्रयासों की सीमा पूरी हो गई है।", - "closeTab": "बंद करना", - "connectionTimeout": "रिश्तों का समय बाहर", - "terminalTitle": "टर्मिनल - {{host}}", - "terminalWithPath": "टर्मिनल - {{host}}:{{path}}", - "runTitle": "चल रहा है {{command}} - {{host}}", - "totpRequired": "दो-कारक प्रमाणीकरण आवश्यक है", - "totpCodeLabel": "सत्यापन कोड", - "totpVerify": "सत्यापित करें", - "warpgateAuthRequired": "वॉरपगेट प्रमाणीकरण आवश्यक है", - "warpgateSecurityKey": "सुरक्षा कुंजी", - "warpgateAuthUrl": "प्रमाणीकरण यूआरएल", - "warpgateOpenBrowser": "ब्राउज़र में खोलें", - "warpgateContinue": "मैंने प्रमाणीकरण पूरा कर लिया है", - "opksshAuthRequired": "OPKSSH प्रमाणीकरण आवश्यक है", - "opksshAuthDescription": "आगे बढ़ने के लिए अपने ब्राउज़र में प्रमाणीकरण पूरा करें। यह सत्र 24 घंटे तक वैध रहेगा।", - "opksshOpenBrowser": "प्रमाणीकरण के लिए ब्राउज़र खोलें", - "opksshWaitingForAuth": "ब्राउज़र में प्रमाणीकरण की प्रतीक्षा हो रही है...", - "opksshAuthenticating": "प्रमाणीकरण प्रक्रिया जारी है...", - "opksshTimeout": "प्रमाणीकरण का समय समाप्त हो गया। कृपया पुनः प्रयास करें।", - "opksshAuthFailed": "प्रमाणीकरण विफल रहा। कृपया अपनी पहचान सत्यापित करें और पुनः प्रयास करें।", - "opksshSignInWith": "{{provider}} से साइन इन करें", - "sudoPasswordPopupTitle": "पासवर्ड डालें?", - "websocketAbnormalClose": "कनेक्शन अप्रत्याशित रूप से बंद हो गया। यह रिवर्स प्रॉक्सी या एसएसएल कॉन्फ़िगरेशन समस्या के कारण हो सकता है। कृपया सर्वर लॉग की जाँच करें।", - "connectionLogTitle": "कनेक्शन लॉग", - "connectionLogCopy": "लॉग को क्लिपबोर्ड पर कॉपी करें", - "connectionLogEmpty": "अभी तक कोई कनेक्शन लॉग उपलब्ध नहीं हैं।", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "खुला", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "कनेक्शन लॉग की प्रतीक्षा की जा रही है...", - "connectionLogCopied": "कनेक्शन लॉग क्लिपबोर्ड पर कॉपी हो गए हैं", - "connectionLogCopyFailed": "लॉग फ़ाइलों को क्लिपबोर्ड पर कॉपी करने में विफल रहा।", - "connectionRejected": "सर्वर द्वारा कनेक्शन अस्वीकृत कर दिया गया है। कृपया अपनी प्रमाणीकरण और नेटवर्क कॉन्फ़िगरेशन की जाँच करें।", - "hostKeyRejected": "SSH होस्ट कुंजी सत्यापन अस्वीकृत। कनेक्शन रद्द।", - "sessionTakenOver": "सेशन दूसरे टैब में खुल गया था। पुनः कनेक्ट हो रहा है..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "स्प्लिट टैब", + "addToSplit": "स्प्लिट में जोड़ें", + "removeFromSplit": "स्प्लिट से निकालें" + } }, "fileManager": { - "noHostSelected": "कोई होस्ट चयनित नहीं है", + "noHostSelected": "No host selected", "initializingEditor": "एडिटर को आरंभ किया जा रहा है...", - "file": "फ़ाइल", - "folder": "फ़ोल्डर", - "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": "नाम बदलें", - "uploading": "अपलोड हो रहा है...", - "uploadingFile": "अपलोड हो रहा है {{name}}...", - "fileName": "फ़ाइल नाम", - "folderName": "फ़ोल्डर का नाम", - "fileUploadedSuccessfully": "फ़ाइल \"{{name}}\" सफलतापूर्वक अपलोड हो गई", - "failedToUploadFile": "फ़ाइल अपलोड करने में विफल", - "fileDownloadedSuccessfully": "फ़ाइल \"{{name}}\" सफलतापूर्वक डाउनलोड हो गई", - "failedToDownloadFile": "फ़ाइल डाउनलोड करने में विफल", - "fileCreatedSuccessfully": "फ़ाइल \"{{name}}\" सफलतापूर्वक बनाई गई", - "folderCreatedSuccessfully": "फ़ोल्डर \"{{name}}\" सफलतापूर्वक बनाया गया", - "failedToCreateItem": "आइटम बनाने में विफल", - "operationFailed": "{{operation}} ऑपरेशन {{name}}के लिए विफल रहा : {{error}}", - "failedToResolveSymlink": "सिम्लिंक को हल करने में विफल", - "itemsDeletedSuccessfully": "{{count}} आइटम सफलतापूर्वक हटा दिए गए", - "failedToDeleteItems": "आइटम हटाने में विफल", - "sudoPasswordRequired": "व्यवस्थापक पासवर्ड आवश्यक है", - "enterSudoPassword": "इस प्रक्रिया को जारी रखने के लिए sudo पासवर्ड दर्ज करें।", - "sudoPassword": "सूडो पासवर्ड", - "sudoOperationFailed": "Sudo ऑपरेशन विफल रहा", - "sudoAuthFailed": "सूडो प्रमाणीकरण विफल रहा", - "dragFilesToUpload": "फ़ाइलें अपलोड करने के लिए उन्हें यहाँ ड्रॉप करें", - "emptyFolder": "यह फ़ोल्डर खाली है", - "searchFiles": "फ़ाइलें खोजें...", - "upload": "अपलोड करें", - "selectHostToStart": "फ़ाइल प्रबंधन शुरू करने के लिए एक होस्ट चुनें", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "फ़ाइल मैनेजर को SSH की आवश्यकता होती है। इस होस्ट पर SSH सक्षम नहीं है।", - "failedToConnect": "एसएसएच से कनेक्ट करने में विफल", - "failedToLoadDirectory": "निर्देशिका लोड करने में विफल", - "noSSHConnection": "कोई SSH कनेक्शन उपलब्ध नहीं है", - "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}} को हटाना चाहते हैं?", - "permissionDenied": "अनुमति नहीं मिली", - "serverError": "सर्वर त्रुटि", - "fileSavedSuccessfully": "फ़ाइल सफलतापूर्वक सहेज ली गई", - "failedToSaveFile": "फ़ाइल सहेजने में विफल", - "confirmDeleteSingleItem": "क्या आप वाकई \"{{name}} \" को स्थायी रूप से हटाना चाहते हैं?", - "confirmDeleteMultipleItems": "क्या आप वाकई {{count}} आइटम को स्थायी रूप से हटाना चाहते हैं?", - "confirmDeleteMultipleItemsWithFolders": "क्या आप वाकई {{count}} आइटम को स्थायी रूप से हटाना चाहते हैं? इसमें फ़ोल्डर और उनकी सामग्री शामिल है।", - "confirmDeleteFolder": "क्या आप वाकई फोल्डर \"{{name}}\" और उसकी सभी सामग्री को स्थायी रूप से हटाना चाहते हैं?", - "permanentDeleteWarning": "यह कार्रवाई पूर्ववत नहीं की जा सकती। आइटम सर्वर से स्थायी रूप से हटा दिए जाएंगे।", - "recent": "हाल ही का", - "pinned": "पिन की गई", - "folderShortcuts": "फ़ोल्डर शॉर्टकट", - "failedToReconnectSSH": "एसएसएच सत्र को पुनः कनेक्ट करने में विफल।", - "openTerminalHere": "टर्मिनल यहाँ खोलें", - "run": "दौड़ना", - "openTerminalInFolder": "इस फ़ोल्डर में टर्मिनल खोलें", - "openTerminalInFileLocation": "फ़ाइल स्थान पर टर्मिनल खोलें", - "runningFile": "दौड़ना - {{file}}", - "onlyRunExecutableFiles": "केवल निष्पादन योग्य फ़ाइलें ही चला सकते हैं", - "directories": "निर्देशिका", - "removedFromRecentFiles": "हाल की फ़ाइलों से \"{{name}}\" हटा दिया गया है", - "removeFailed": "हटाने में विफलता", - "unpinnedSuccessfully": "\"{{name}}\" को सफलतापूर्वक अनपिन कर दिया गया", - "unpinFailed": "अनपिन विफल", - "removedShortcut": "शॉर्टकट \"{{name}} \" हटा दिया गया", - "removeShortcutFailed": "शॉर्टकट हटाने में विफलता", - "clearedAllRecentFiles": "सभी हालिया फ़ाइलें हटा दी गईं", - "clearFailed": "क्लियर विफल", - "removeFromRecentFiles": "हाल की फ़ाइलों से हटाएँ", - "clearAllRecentFiles": "सभी हालिया फ़ाइलें साफ़ करें", - "unpinFile": "फ़ाइल को अनपिन करें", - "removeShortcut": "शॉर्टकट हटाएँ", - "pinFile": "पिन फ़ाइल", - "addToShortcuts": "शॉर्टकट में जोड़ें", - "pasteFailed": "पेस्ट विफल", - "noUndoableActions": "कोई भी कार्य पूर्ववत नहीं किया जा सकता", - "undoCopySuccess": "कॉपी करने की प्रक्रिया पूर्ववत की गई: कॉपी की गई {{count}} फ़ाइलें हटाई गईं", - "undoCopyFailedDelete": "पूर्ववत करने का प्रयास विफल: प्रतिलिपि की गई कोई भी फ़ाइल हटाई नहीं जा सकी", - "undoCopyFailedNoInfo": "पूर्ववत करने में विफल: प्रतिलिपि की गई फ़ाइल की जानकारी नहीं मिल सकी", - "undoMoveSuccess": "स्थानांतरण प्रक्रिया को पूर्ववत किया गया: {{count}} फ़ाइलों को वापस मूल स्थान पर स्थानांतरित कर दिया गया", - "undoMoveFailedMove": "पूर्ववत करने में विफल: कोई भी फ़ाइल वापस नहीं ले जा सका", - "undoMoveFailedNoInfo": "पूर्ववत करने में विफल: स्थानांतरित फ़ाइल की जानकारी नहीं मिल सकी", - "undoDeleteNotSupported": "डिलीट ऑपरेशन को पूर्ववत नहीं किया जा सकता: फ़ाइलें सर्वर से स्थायी रूप से हटा दी गई हैं।", - "undoTypeNotSupported": "असमर्थित पूर्ववत करें ऑपरेशन प्रकार", - "undoOperationFailed": "अनडू ऑपरेशन विफल रहा", - "unknownError": "अज्ञात त्रुटि", - "confirm": "पुष्टि करना", - "find": "खोजो...", - "replace": "प्रतिस्थापित करें", - "downloadInstead": "इसके बजाय डाउनलोड करें", - "keyboardShortcuts": "कुंजीपटल अल्प मार्ग", - "searchAndReplace": "खोजें और बदलें", - "editing": "संपादन", - "search": "खोज", - "findNext": "दूसरा खोजो", - "findPrevious": "पिछला खोजें", - "save": "बचाना", - "selectAll": "सबका चयन करें", - "undo": "पूर्ववत", - "redo": "फिर से करना", - "moveLineUp": "लाइन अप को आगे बढ़ाएं", - "moveLineDown": "लाइन को नीचे ले जाएं", - "toggleComment": "टिप्पणी को टॉगल करें", - "autoComplete": "स्वतः पूर्ण", - "imageLoadError": "छवि लोड करने में विफल", - "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": "नया फ़ोल्डर", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "{{count}} आइटम सफलतापूर्वक {{target}} में स्थानांतरित कर दिए गए हैं।", - "move": "कदम", - "searchInFile": "फ़ाइल में खोजें (Ctrl+F)", - "showKeyboardShortcuts": "कीबोर्ड शॉर्टकट दिखाएँ", - "startWritingMarkdown": "अपना मार्कडाउन कंटेंट लिखना शुरू करें...", - "loadingFileComparison": "फ़ाइल तुलना लोड हो रही है...", - "reload": "पुनः लोड करें", - "compare": "तुलना करना", - "sideBySide": "अगल बगल", - "inline": "इन - लाइन", - "fileComparison": "फ़ाइल तुलना: {{file1}} बनाम {{file2}}", - "fileTooLarge": "फ़ाइल बहुत बड़ी है: {{error}}", - "sshConnectionFailed": "SSH कनेक्शन विफल हो गया। कृपया {{name}} ({{ip}}:{{port}} ) से अपना कनेक्शन जांचें।", - "loadFileFailed": "फ़ाइल लोड करने में विफल: {{error}}", - "connecting": "कनेक्ट हो रहा है...", - "connectedSuccessfully": "सफलतापूर्वक कनेक्ट हो गया", - "totpVerificationFailed": "टीओटीपी सत्यापन विफल रहा", - "warpgateVerificationFailed": "वॉरपगेट प्रमाणीकरण विफल रहा", - "authenticationFailed": "प्रमाणीकरण विफल होना", - "verificationCodePrompt": "सत्यापन कोड:", - "changePermissions": "अनुमतियाँ बदलें", - "currentPermissions": "वर्तमान अनुमतियाँ", - "owner": "मालिक", - "group": "समूह", - "others": "अन्य", - "read": "पढ़ना", - "write": "लिखना", - "execute": "निष्पादित करना", - "permissionsChangedSuccessfully": "अनुमतियाँ सफलतापूर्वक बदल दी गईं", - "failedToChangePermissions": "अनुमतियाँ बदलने में विफल", - "name": "नाम", - "sortByName": "नाम", - "sortByDate": "डेटा संशोधित", - "sortBySize": "आकार", - "ascending": "आरोही", - "descending": "अवरोही", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "जड़", "new": "नया", "sortBy": "इसके अनुसार क्रमबद्ध करें", @@ -1139,20 +1335,20 @@ "editor": "संपादक", "octal": "अष्टभुजाकार", "storage": "भंडारण", - "disk": "डिस्क", - "used": "इस्तेमाल किया गया", - "of": "का", - "toggleSidebar": "साइडबार टॉगल करें", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "पीडीएफ लोड नहीं हो पा रही है", "pdfLoadError": "इस पीडीएफ फाइल को लोड करने में त्रुटि हुई।", "loadingPdf": "पीडीएफ लोड हो रही है...", "loadingPage": "लोडिंग पृष्ठ..." }, "transfer": { - "copyToHost": "होस्ट को कॉपी करें…", - "moveToHost": "होस्ट पर जाएँ…", - "copyItemsToHost": "आइटम को होस्ट… पर कॉपी करें {{count}}", - "moveItemsToHost": "{{count}} आइटम को होस्ट… पर ले जाएं", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "कोई अन्य फाइल-मैनेजर होस्ट उपलब्ध नहीं है।", "noHostsConnectedHint": "होस्ट मैनेजर में फाइल मैनेजर सक्षम करके एक और एसएसएच होस्ट जोड़ें।", "selectDestinationHost": "गंतव्य होस्ट का चयन करें", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "हाल के गंतव्यों का विस्तार करें", "browseFolders": "गंतव्य फ़ोल्डरों को ब्राउज़ करें", "browseDestination": "ब्राउज़ करें या पथ दर्ज करें", - "confirmCopy": "प्रतिलिपि", - "confirmMove": "कदम", - "transferring": "स्थानांतरण…", - "compressing": "संपीड़ित करना…", - "extracting": "… को निकालना", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "स्थानांतरण पूरा हुआ", "transferError": "स्थानांतरण विफल", - "transferPartial": "स्थानांतरण {{count}} त्रुटियों के साथ पूरा हुआ", - "transferPartialHint": "स्थानांतरण नहीं हो सका: {{paths}}", - "itemsSummary": "{{count}} आइटम", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "एक से अधिक वस्तुओं के स्थानांतरण के लिए गंतव्य एक निर्देशिका होनी चाहिए।", "selectThisFolder": "इस फ़ोल्डर का चयन करें", "browsePathWillBeCreated": "यह फ़ोल्डर अभी मौजूद नहीं है। स्थानांतरण शुरू होने पर यह बन जाएगा।", "browsePathError": "गंतव्य होस्ट पर यह पथ नहीं खोला जा सका।", "goUp": "ऊपर जाना", - "copyFolderToHost": "फ़ोल्डर को होस्ट पर कॉपी करें…", - "moveFolderToHost": "फ़ोल्डर को होस्ट… पर ले जाएं", - "hostReady": "तैयार", - "hostConnecting": "कनेक्टिंग…", - "hostDisconnected": "जुड़े नहीं हैं", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "प्रमाणीकरण आवश्यक है — पहले इस होस्ट पर फ़ाइल मैनेजर खोलें", - "hostConnectionFailed": "कनेक्शन विफल", + "hostConnectionFailed": "Connection failed", "metricsTitle": "स्थानांतरण समय", - "metricsPrepare": "गंतव्य तैयार करें: {{duration}}", - "metricsCompress": "स्रोत पर संपीड़ित करें: {{duration}}", - "metricsHopSourceRead": "स्रोत → सर्वर: {{throughput}}", - "metricsHopDestSftpWrite": "सर्वर → गंतव्य (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "सर्वर → गंतव्य (स्थानीय): {{throughput}}", - "metricsTransfer": "अंत से अंत तक: {{throughput}} ({{duration}})", - "metricsExtract": "गंतव्य पर निष्कर्षण: {{duration}}", - "metricsSourceDelete": "स्रोत से हटाएँ: {{duration}}", - "metricsTotal": "कुल: {{duration}}", - "progressCompressing": "स्रोत होस्ट पर संपीड़न…", - "progressExtracting": "गंतव्य… पर निष्कर्षण", - "progressTransferring": "डेटा स्थानांतरित करना…", - "progressReconnecting": "पुनः कनेक्ट हो रहा है…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "समानांतर स्थानांतरण लेन", - "parallelSegmentsOption": "{{count}} लेन", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "बड़ी फाइलों को 256 एमबी के टुकड़ों में विभाजित किया जाता है। उच्च कुल थ्रूपुट के लिए कई लेन अलग-अलग कनेक्शनों का उपयोग करते हैं (जैसे कई स्थानांतरण शुरू करना)।", "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", - "progressTransferringItems": "फ़ाइलें स्थानांतरित करना ({{current}} का {{total}})…", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} फ़ाइलें", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "मूल फाइलें सुरक्षित रखी गई हैं (आंशिक स्थानांतरण)", "jumpHostLimitation": "टर्मिक्स सर्वर से दोनों होस्ट तक पहुंच होनी चाहिए। होस्ट-टू-होस्ट डायरेक्ट रूटिंग समर्थित नहीं है।", - "cancel": "रद्द करना", + "cancel": "Cancel", "methodLabel": "स्थानांतरण विधि", "methodAuto": "ऑटो", "methodTar": "टार संग्रह", @@ -1216,25 +1412,25 @@ "methodAutoHint": "यह फ़ाइल संख्या, आकार और संपीड़नीयता के आधार पर tar या प्रति-फ़ाइल SFTP का चयन करता है। एकल फ़ाइलें हमेशा स्ट्रीमिंग SFTP का उपयोग करती हैं।", "methodTarHint": "स्रोत पर संपीड़न करें, एक संग्रह स्थानांतरित करें, गंतव्य पर निष्कर्षण करें। दोनों यूनिक्स होस्ट पर टार फ़ाइल का होना आवश्यक है।", "methodItemSftpHint": "प्रत्येक फ़ाइल को SFTP के माध्यम से अलग-अलग स्थानांतरित करें। यह विंडोज़ सहित सभी होस्ट पर काम करता है।", - "methodPreviewLoading": "स्थानांतरण विधि की गणना…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "स्थानांतरण विधि का पूर्वावलोकन नहीं किया जा सका। सर्वर प्रारंभ होने पर विधि का चयन करेगा।", "methodPreviewWillUseTar": "उपयोग करेगा: टार संग्रह", "methodPreviewWillUseItemSftp": "उपयोग किया जाएगा: प्रति-फ़ाइल SFTP", - "methodPreviewScanSummary": "{{fileCount}} फाइलें, {{totalSize}} कुल (स्रोत होस्ट पर स्कैन किया गया)।", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "प्रत्येक फ़ाइल एक के बाद एक, सिंगल-फ़ाइल कॉपी के रूप में एक ही SFTP स्ट्रीम का उपयोग करती है। सभी फ़ाइलों की प्रगति को एक साथ जोड़ा जाता है, इसलिए बड़ी फ़ाइलों के दौरान बार धीरे-धीरे चलता है।", "methodReason": { "user_item_sftp": "आपने प्रति-फाइल SFTP का विकल्प चुना।", "user_tar": "आपने tar आर्काइव चुना।", "tar_unavailable": "एक या दोनों होस्ट पर टार उपलब्ध नहीं है — इसके बजाय प्रति-फाइल एसएफटीपी का उपयोग किया जाएगा।", "windows_host": "इसमें विंडोज होस्ट का उपयोग किया गया है — tar का उपयोग नहीं किया गया है।", - "auto_multi_large": "ऑटो: संपीड़ित डेटा वाली एक बड़ी फ़ाइल ({{largestSize}}) सहित कई फ़ाइलें - टार बंडलों को एक ही स्थानांतरण में शामिल करता है।", - "auto_single_large_in_archive": "ऑटो: इस सेट में एक बड़ी फ़ाइल ({{largestSize}}) — प्रति-फ़ाइल SFTP.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "ऑटो: अधिकतर असंपीड़ित डेटा — प्रति-फ़ाइल SFTP।", - "auto_many_files": "ऑटो: कई फाइलें ({{fileCount}}) — टार प्रति-फाइल ओवरहेड को कम करता है।", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "ऑटो: इस सेट के लिए प्रति-फ़ाइल SFTP।" }, - "progressCancel": "रद्द करना", - "progressCancelling": "रद्द करना…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "ठप", "resumedHint": "किसी अन्य विंडो में शुरू किए गए सक्रिय स्थानांतरण से पुनः कनेक्ट हो गया।", "transferCancelled": "स्थानांतरण रद्द", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "कुछ आंशिक फ़ाइलें हटाई नहीं जा सकीं", "cleanupDestFilesNothing": "गंतव्य पर सफाई करने के लिए कुछ भी नहीं है।", "cleanupDestFilesError": "सफाई विफल रही", - "retryTransfer": "पुन: प्रयास करें", + "retryTransfer": "Retry", "retryTransferError": "पुनः प्रयास विफल रहा", "transferFailedRetryHint": "गंतव्य स्थान पर आंशिक डेटा सुरक्षित रखा गया है। कनेक्शन बहाल होने पर पुनः प्रयास शुरू होगा।" }, "tunnels": { - "noSshTunnels": "कोई एसएसएच टनल नहीं", - "createFirstTunnelMessage": "आपने अभी तक कोई SSH टनल नहीं बनाई है। शुरुआत करने के लिए होस्ट मैनेजर में टनल कनेक्शन कॉन्फ़िगर करें।", - "connected": "जुड़े हुए", - "disconnected": "डिस्कनेक्ट किया गया", - "connecting": "कनेक्ट हो रहा है...", - "error": "गलती", - "canceling": "रद्द किया जा रहा है...", - "connect": "जोड़ना", - "disconnect": "डिस्कनेक्ट", - "cancel": "रद्द करना", - "port": "पत्तन", - "localPort": "स्थानीय बंदरगाह", - "remotePort": "रिमोट पोर्ट", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "वर्तमान होस्ट पोर्ट", - "endpointPort": "एंडपॉइंट पोर्ट", + "endpointPort": "Endpoint Port", "bindIp": "स्थानीय आईपी", - "endpointSshConfig": "एंडपॉइंट एसएसएच कॉन्फ़िगरेशन", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "एंडपॉइंट एसएसएच होस्ट", "endpointSshHostPlaceholder": "एक कॉन्फ़िगर किए गए होस्ट का चयन करें", "endpointSshHostRequired": "प्रत्येक क्लाइंट टनल के लिए एक एंडपॉइंट एसएसएच होस्ट का चयन करें।", - "attempt": "प्रयास {{current}} का {{max}}", - "nextRetryIn": "अगला प्रयास {{seconds}} सेकंड में होगा", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "क्लाइंट टनल", "clientTunnel": "क्लाइंट टनल", "addClientTunnel": "क्लाइंट टनल जोड़ें", "noClientTunnels": "इस डेस्कटॉप पर कोई क्लाइंट टनल कॉन्फ़िगर नहीं किया गया है।", - "tunnelName": "सुरंग का नाम", - "remoteHost": "रिमोट होस्ट", - "autoStart": "ऑटो स्टार्ट", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "यह डेस्कटॉप क्लाइंट के खुलने पर शुरू होता है और कनेक्टेड रहता है।", "clientManualStartDesc": "स्टार्ट और स्टॉप बटन का इस्तेमाल इसी पंक्ति से करें। टर्मिक्स इसे अपने आप नहीं खोलेगा।", "clientRemoteServerNote": "रिमोट पोर्ट फॉरवर्डिंग के लिए एंडपॉइंट एसएसएच सर्वर पर AllowTcpForwarding और GatewayPorts की आवश्यकता हो सकती है। डेस्कटॉप के डिस्कनेक्ट होने पर रिमोट पोर्ट बंद हो जाता है।", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "रिमोट पोर्ट का मान 1 और 65535 के बीच होना चाहिए।", "invalidLocalTargetPort": "स्थानीय लक्ष्य पोर्ट 1 और 65535 के बीच होना चाहिए।", "invalidEndpointPort": "एंडपॉइंट पोर्ट 1 और 65535 के बीच होना चाहिए।", - "duplicateAutoStartBind": "केवल एक ऑटो-स्टार्ट क्लाइंट टनल {{bind}} का उपयोग कर सकता है।", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "टनल की स्थिति अपडेट करने में विफल।", - "active": "सक्रिय", - "start": "शुरू", - "stop": "रुकना", - "test": "परीक्षा", - "type": "सुरंग प्रकार", - "typeLocal": "स्थानीय (-एल)", - "typeRemote": "रिमोट (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "गतिशील (-डी)", "typeServerLocalDesc": "वर्तमान होस्ट से एंडपॉइंट तक।", "typeServerRemoteDesc": "एंडपॉइंट वापस वर्तमान होस्ट पर।", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "एंडपॉइंट वापस स्थानीय कंप्यूटर पर।", "typeClientDynamicDesc": "स्थानीय कंप्यूटर पर SOCKS।", "typeDynamicDesc": "SSH के माध्यम से SOCKS5 CONNECT ट्रैफ़िक को आगे भेजें", - "forwardDescriptionServerLocal": "वर्तमान होस्ट {{sourcePort}} → एंडपॉइंट {{endpointPort}}.", - "forwardDescriptionServerRemote": "एंडपॉइंट {{endpointPort}} → वर्तमान होस्ट {{sourcePort}}.", - "forwardDescriptionServerDynamic": "वर्तमान होस्ट पर मोज़े {{sourcePort}}.", - "forwardDescriptionClientLocal": "स्थानीय {{sourcePort}} → दूरस्थ {{endpointPort}}.", - "forwardDescriptionClientRemote": "रिमोट {{sourcePort}} → लोकल {{endpointPort}}.", - "forwardDescriptionClientDynamic": "स्थानीय पोर्ट {{sourcePort}} पर SOCKS .", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → मोज़े वाया {{endpoint}}", - "autoNameClientLocal": "स्थानीय {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → स्थानीय {{localPort}}", - "autoNameClientDynamic": "मोज़े {{localPort}} के माध्यम से {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "मार्ग:", "lastStarted": "आखिरी बार शुरू हुआ", "lastTested": "अंतिम बार परीक्षण किया गया", "lastError": "अंतिम त्रुटि", - "maxRetries": "अधिकतम पुनः प्रयास", + "maxRetries": "Max Retries", "maxRetriesDescription": "पुनः प्रयास करने की अधिकतम संख्या।", - "retryInterval": "पुनः प्रयास अंतराल (सेकंड)", - "retryIntervalDescription": "पुनः प्रयास करने के बीच प्रतीक्षा करने का समय।", - "local": "स्थानीय", - "remote": "दूर", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "गंतव्य", "host": "मेज़बान", "mode": "तरीका", - "noHostSelected": "कोई होस्ट चयनित नहीं है", + "noHostSelected": "No host selected", "working": "कार्यरत..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "याद", - "disk": "डिस्क", - "network": "नेटवर्क", - "uptime": "अपटाइम", - "processes": "प्रक्रियाओं", - "available": "उपलब्ध", - "free": "मुक्त", - "connecting": "कनेक्ट हो रहा है...", - "connectionFailed": "सर्वर से कनेक्ट करने में विफल", - "naCpus": "लागू नहीं सीपीयू(ओं)", - "cpuCores_one": "{{count}} कोर", - "cpuCores_other": "{{count}} कोर", - "cpuUsage": "सीपीयू उपयोग", - "memoryUsage": "स्मृति प्रयोग", - "diskUsage": "डिस्क उपयोग", - "failedToFetchHostConfig": "होस्ट कॉन्फ़िगरेशन प्राप्त करने में विफल", - "serverOffline": "सर्वर ऑफ़लाइन", - "cannotFetchMetrics": "ऑफ़लाइन सर्वर से मेट्रिक्स प्राप्त नहीं किए जा सकते", - "totpFailed": "टीओटीपी सत्यापन विफल रहा", - "noneAuthNotSupported": "सर्वर स्टैट्स 'none' प्रमाणीकरण प्रकार का समर्थन नहीं करता है।", - "load": "भार", - "systemInfo": "व्यवस्था जानकारी", - "hostname": "होस्ट का नाम", - "operatingSystem": "ऑपरेटिंग सिस्टम", - "kernel": "गुठली", - "seconds": "सेकंड", - "networkInterfaces": "नेटवर्क इंटरफेस", - "noInterfacesFound": "कोई नेटवर्क इंटरफ़ेस नहीं मिला", - "noProcessesFound": "कोई प्रक्रिया नहीं मिली", - "loginStats": "एसएसएच लॉगिन सांख्यिकी", - "noRecentLoginData": "हाल ही में लॉगिन डेटा उपलब्ध नहीं है", - "executingQuickAction": "{{name}} निष्पादित किया जा रहा है...", - "quickActionSuccess": "{{name}} सफलतापूर्वक पूरा हुआ", - "quickActionFailed": "{{name}} असफल", - "quickActionError": "{{name}} को निष्पादित करने में विफल", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "श्रवण पोर्ट", - "protocol": "शिष्टाचार", - "port": "पत्तन", - "address": "पता", - "process": "प्रक्रिया", - "noData": "कोई श्रवण पोर्ट डेटा नहीं" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "सभी", + "noData": "No listening ports data" }, "firewall": { - "title": "फ़ायरवॉल", - "inactive": "निष्क्रिय", - "policy": "नीति", - "rules": "नियम", - "noData": "फ़ायरवॉल से संबंधित कोई डेटा उपलब्ध नहीं है", - "action": "कार्रवाई", - "protocol": "आद्य", - "port": "पत्तन", - "source": "स्रोत", - "anywhere": "कहीं भी" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "लोड औसत", "swap": "बदलना", "architecture": "वास्तुकला", - "refresh": "ताज़ा करना", - "retry": "पुन: प्रयास करें" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "कार्यरत...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "सेल्फ-होस्टेड एसएसएच और रिमोट डेस्कटॉप प्रबंधन", - "loginTitle": "टर्मिक्स में लॉग इन करें", - "registerTitle": "खाता बनाएं", - "forgotPassword": "पासवर्ड भूल गए?", - "rememberMe": "डिवाइस को 30 दिनों तक याद रखें (इसमें TOTP शामिल है)", - "noAccount": "क्या आपके पास खाता नहीं है?", - "hasAccount": "क्या आपके पास पहले से एक खाता मौजूद है?", - "twoFactorAuth": "दो-कारक प्रमाणीकरण", - "enterCode": "सत्यापन कोड दर्ज करें", - "backupCode": "या बैकअप कोड का उपयोग करें", - "verifyCode": "कोड सत्यापित करें", - "redirectingToApp": "ऐप पर रीडायरेक्ट किया जा रहा है...", - "sshAuthenticationRequired": "SSH प्रमाणीकरण आवश्यक है", - "sshNoKeyboardInteractive": "कीबोर्ड-इंटरैक्टिव प्रमाणीकरण अनुपलब्ध है", - "sshAuthenticationFailed": "प्रमाणीकरण विफल होना", - "sshAuthenticationTimeout": "प्रमाणीकरण समय सीमा समाप्त", - "sshNoKeyboardInteractiveDescription": "सर्वर कीबोर्ड-आधारित प्रमाणीकरण का समर्थन नहीं करता है। कृपया अपना पासवर्ड या SSH कुंजी प्रदान करें।", - "sshAuthFailedDescription": "आपके द्वारा दी गई जानकारी गलत थी। कृपया सही जानकारी के साथ पुनः प्रयास करें।", - "sshTimeoutDescription": "प्रमाणीकरण का प्रयास समय के साथ समाप्त हो गया। कृपया पुनः प्रयास करें।", - "sshProvideCredentialsDescription": "इस सर्वर से कनेक्ट करने के लिए कृपया अपने SSH क्रेडेंशियल प्रदान करें।", - "sshPasswordDescription": "इस एसएसएच कनेक्शन के लिए पासवर्ड दर्ज करें।", - "sshKeyPasswordDescription": "यदि आपकी SSH कुंजी एन्क्रिप्टेड है, तो यहां पासफ़्रेज़ दर्ज करें।", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "पासफ़्रेज़ आवश्यक है", "passphraseRequiredDescription": "एसएसएच कुंजी एन्क्रिप्टेड है। इसे अनलॉक करने के लिए कृपया पासफ़्रेज़ दर्ज करें।", - "back": "पीछे", - "firstUser": "पहला उपयोगकर्ता", - "firstUserMessage": "आप पहले उपयोगकर्ता हैं और आपको व्यवस्थापक बनाया जाएगा। आप साइडबार में उपयोगकर्ता ड्रॉपडाउन में व्यवस्थापक सेटिंग्स देख सकते हैं। यदि आपको लगता है कि यह कोई गलती है, तो डॉकर लॉग्स की जाँच करें या GitHub पर एक समस्या दर्ज करें।", - "external": "बाहरी", - "loginWithExternal": "बाह्य प्रदाता के साथ लॉगिन करें", - "loginWithExternalDesc": "अपने कॉन्फ़िगर किए गए बाहरी पहचान प्रदाता का उपयोग करके लॉग इन करें", - "externalNotSupportedInElectron": "इलेक्ट्रॉन ऐप में अभी तक बाहरी प्रमाणीकरण समर्थित नहीं है। कृपया OIDC लॉगिन के लिए वेब संस्करण का उपयोग करें।", - "resetPasswordButton": "पासवर्ड रीसेट", - "sendResetCode": "रीसेट कोड भेजें", - "resetCodeDesc": "पासवर्ड रीसेट कोड प्राप्त करने के लिए अपना उपयोगकर्ता नाम दर्ज करें। यह कोड डॉकर कंटेनर लॉग में दर्ज हो जाएगा।", - "resetCode": "कोड फिर ठीक करें", - "verifyCodeButton": "कोड सत्यापित करें", - "enterResetCode": "उपयोगकर्ता के लिए डॉकर कंटेनर लॉग से 6-अंकीय कोड दर्ज करें:", - "newPassword": "नया पासवर्ड", - "confirmNewPassword": "पासवर्ड की पुष्टि कीजिये", - "enterNewPassword": "उपयोगकर्ता के लिए अपना नया पासवर्ड दर्ज करें:", - "signUp": "साइन अप करें", - "desktopApp": "डेस्कटॉप ऐप", - "loggingInToDesktopApp": "डेस्कटॉप ऐप में लॉग इन करना", - "loadingServer": "सर्वर लोड हो रहा है...", - "dataLossWarning": "इस तरह से पासवर्ड रीसेट करने पर आपके सभी सेव किए गए SSH होस्ट, क्रेडेंशियल और अन्य एन्क्रिप्टेड डेटा डिलीट हो जाएंगे। इस कार्रवाई को वापस नहीं लिया जा सकता। इसका उपयोग केवल तभी करें जब आप अपना पासवर्ड भूल गए हों और लॉग इन न हों।", - "authenticationDisabled": "प्रमाणीकरण अक्षम", - "authenticationDisabledDesc": "सभी प्रमाणीकरण विधियाँ वर्तमान में निष्क्रिय हैं। कृपया अपने व्यवस्थापक से संपर्क करें।", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSH होस्ट कुंजी सत्यापित करें", - "keyChangedWarning": "SSH होस्ट कुंजी बदल गई", - "firstConnectionTitle": "पहली बार इस होस्ट से कनेक्ट हो रहा है", - "firstConnectionDescription": "इस होस्ट की प्रामाणिकता स्थापित नहीं की जा सकती। कृपया सुनिश्चित करें कि फिंगरप्रिंट आपकी अपेक्षा के अनुरूप है।", - "keyChangedDescription": "आपके पिछले कनेक्शन के बाद से इस सर्वर की होस्ट कुंजी बदल गई है। यह किसी सुरक्षा समस्या का संकेत हो सकता है।", - "previousKey": "पिछली कुंजी", - "newFingerprint": "नया फिंगरप्रिंट", - "fingerprint": "अंगुली की छाप", - "verifyInstructions": "यदि आप इस होस्ट पर भरोसा करते हैं, तो जारी रखने के लिए स्वीकार करें पर क्लिक करें और भविष्य के कनेक्शनों के लिए इस फिंगरप्रिंट को सहेजें।", - "securityWarning": "सुरक्षा चेतावनी", - "acceptAndContinue": "स्वीकार करें और जारी रखें", - "acceptNewKey": "नई कुंजी स्वीकार करें और जारी रखें" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "डेटाबेस के कनेक्ट नहीं कर सके", - "unknownError": "अज्ञात त्रुटि", - "loginFailed": "लॉगिन विफल", - "failedPasswordReset": "पासवर्ड रीसेट शुरू करने में विफल", - "failedVerifyCode": "रीसेट कोड को सत्यापित करने में विफल", - "failedCompleteReset": "पासवर्ड रीसेट करने में विफलता", - "invalidTotpCode": "अमान्य टीओटीपी कोड", - "failedOidcLogin": "OIDC लॉगिन शुरू करने में विफल", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "साइलेंट साइन-इन का अनुरोध किया गया था, लेकिन OIDC लॉगिन उपलब्ध नहीं है।", "failedUserInfo": "लॉगिन के बाद उपयोगकर्ता की जानकारी प्राप्त करने में विफल रहा", - "oidcAuthFailed": "OIDC प्रमाणीकरण विफल रहा", - "invalidAuthUrl": "बैकएंड से अमान्य प्राधिकरण यूआरएल प्राप्त हुआ।", - "requiredField": "यह फ़ील्ड आवश्यक है", - "minLength": "न्यूनतम लंबाई {{min}} है", - "passwordMismatch": "सांकेतिक शब्द मेल नहीं खाते", - "passwordLoginDisabled": "उपयोगकर्ता नाम/पासवर्ड लॉगिन वर्तमान में अक्षम है", - "sessionExpired": "सत्र समाप्त हो गया है - कृपया दोबारा लॉग इन करें", - "totpRateLimited": "दर सीमित: TOTP सत्यापन के बहुत अधिक प्रयास हो चुके हैं। कृपया बाद में पुनः प्रयास करें।", - "totpRateLimitedWithTime": "दर सीमित: TOTP सत्यापन के बहुत अधिक प्रयास हो चुके हैं। कृपया पुनः प्रयास करने से पहले {{time}} सेकंड प्रतीक्षा करें।", - "resetCodeRateLimited": "दर सीमित: सत्यापन के बहुत अधिक प्रयास हो चुके हैं। कृपया बाद में पुनः प्रयास करें।", - "resetCodeRateLimitedWithTime": "दर सीमित: सत्यापन के बहुत अधिक प्रयास हो चुके हैं। कृपया पुनः प्रयास करने से पहले {{time}} सेकंड प्रतीक्षा करें।", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "प्रमाणीकरण टोकन सहेजने में विफल", "failedToLoadServer": "सर्वर लोड करने में विफल" }, "messages": { - "registrationDisabled": "प्रशासक द्वारा नए खाते का पंजीकरण फिलहाल बंद कर दिया गया है। कृपया लॉग इन करें या प्रशासक से संपर्क करें।", - "userNotAllowed": "आपके खाते को पंजीकरण करने की अनुमति नहीं है। कृपया व्यवस्थापक से संपर्क करें।", - "databaseConnectionFailed": "डेटाबेस सर्वर से कनेक्ट करने में विफल।", - "resetCodeSent": "रीसेट कोड डॉकर लॉग्स को भेजा गया", - "codeVerified": "कोड सफलतापूर्वक सत्यापित हो गया", - "passwordResetSuccess": "पासवर्ड सफलतापूर्वक रीसेट हो गया", - "loginSuccess": "लॉग इन सफल", - "registrationSuccess": "सफल पंजीकरण" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "कॉन्फ़िगर किए गए SSH होस्ट को लक्षित करने वाले स्थानीय डेस्कटॉप टनल।", "c2sTunnelPresets": "क्लाइंट टनल प्रीसेट", "c2sTunnelPresetsDesc": "इस डेस्कटॉप क्लाइंट की स्थानीय टनल सूची को एक नामित सर्वर प्रीसेट के रूप में सहेजें, या इस क्लाइंट में एक प्रीसेट लोड करें।", "c2sTunnelPresetsUnavailable": "क्लाइंट टनल प्रीसेट केवल डेस्कटॉप क्लाइंट में ही उपलब्ध हैं।", - "c2sPresetName": "प्रीसेट नाम", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "क्लाइंट प्रीसेट नाम", "c2sPresetToLoad": "लोड करने के लिए पूर्व निर्धारित", "c2sNoPresetSelected": "कोई पूर्व निर्धारित सेटिंग नहीं चुनी गई", "c2sNoPresets": "कोई प्रीसेट सहेजा नहीं गया", - "c2sLoadPreset": "भार", - "c2sCurrentLocalConfig": "{{count}} इस डेस्कटॉप पर कॉन्फ़िगर किए गए स्थानीय क्लाइंट टनल।", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "प्रीसेट स्पष्ट स्नैपशॉट होते हैं; इनमें से किसी एक को लोड करने से इस डेस्कटॉप क्लाइंट की स्थानीय क्लाइंट टनल सूची बदल जाती है।", "c2sPresetSaved": "क्लाइंट टनल प्रीसेट सहेजा गया", "c2sPresetLoaded": "क्लाइंट टनल प्रीसेट स्थानीय रूप से लोड किया गया", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "भाषा", - "keyPassword": "कुंजी पासवर्ड", - "pastePrivateKey": "अपनी निजी कुंजी यहाँ पेस्ट करें...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (स्थानीय स्तर पर सुनें)", "localTargetHost": "127.0.0.1 (इस कंप्यूटर पर लक्ष्य)", "socksListenerHost": "127.0.0.1 (सॉक्स श्रोता)", - "enterPassword": "अपना कूटशब्द भरें", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "डैशबोर्ड", - "loading": "डैशबोर्ड लोड हो रहा है...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "सहायता", - "discord": "कलह", - "serverOverview": "सर्वर अवलोकन", - "version": "संस्करण", - "upToDate": "अप टू डेट", - "updateAvailable": "उपलब्ध अद्यतन", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "बीटा", - "uptime": "अपटाइम", - "database": "डेटाबेस", - "healthy": "स्वस्थ", - "error": "गलती", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "कुल मेजबान", - "totalTunnels": "कुल सुरंगें", - "totalCredentials": "कुल प्रमाण पत्र", - "recentActivity": "हाल की गतिविधि", - "reset": "रीसेट करें", - "loadingRecentActivity": "हाल की गतिविधि लोड हो रही है...", - "noRecentActivity": "कोई हालिया गतिविधि नहीं", - "quickActions": "त्वरित कार्रवाइयां", - "addHost": "होस्ट जोड़ें", - "addCredential": "क्रेडेंशियल जोड़ें", - "adminSettings": "व्यवस्थापक सेटिंग्स", - "userProfile": "उपयोगकर्ता रूपरेखा", - "serverStats": "सर्वर आँकड़े", - "loadingServerStats": "सर्वर के आंकड़े लोड हो रहे हैं...", - "noServerData": "कोई सर्वर डेटा उपलब्ध नहीं है", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", - "ram": "टक्कर मारना", - "customizeLayout": "डैशबोर्ड को अनुकूलित करें", - "dashboardSettings": "डैशबोर्ड सेटिंग्स", - "enableDisableCards": "कार्ड सक्षम/अक्षम करें", - "resetLayout": "वितथ पर ले जाएं", - "serverOverviewCard": "सर्वर अवलोकन", - "recentActivityCard": "हाल की गतिविधि", - "networkGraphCard": "नेटवर्क ग्राफ", - "networkGraph": "नेटवर्क ग्राफ", - "quickActionsCard": "त्वरित कार्रवाइयां", - "serverStatsCard": "सर्वर आँकड़े", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "मुख्य", "panelSide": "ओर", - "justNow": "बस अब" + "justNow": "बस अब", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "स्थिर", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "कोई होस्ट कॉन्फ़िगर नहीं किया गया है", "online": "ऑनलाइन", "offline": "ऑफलाइन", - "onlineLower": "ऑनलाइन", - "nodes": "{{count}} नोड्स", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "जोड़ना:", "commandPalette": "कमांड पैलेट", "done": "हो गया", "editModeInstructions": "कार्डों को खींचकर उनका क्रम बदलें · कॉलम विभाजक को खींचकर कॉलम का आकार बदलें · कार्ड के निचले किनारे को खींचकर उसकी ऊंचाई बदलें · हटाने के लिए ट्रैश में डालें", "empty": "खाली", - "clear": "स्पष्ट" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "होस्ट जोड़ें", - "addGroup": "समूह जोड़ें", - "addLink": "लिंक जोड़ें", - "zoomIn": "ज़ूम इन", - "zoomOut": "ज़ूम आउट", - "resetView": "फिर से देख्ना", - "selectHost": "होस्ट का चयन करें", - "chooseHost": "एक मेज़बान चुनें...", - "parentGroup": "अभिभावक समूह", - "noGroup": "कोई समूह नहीं", - "groupName": "समूह नाम", - "color": "रंग", - "source": "स्रोत", - "target": "लक्ष्य", - "moveToGroup": "समूह में ले जाएं", - "selectGroup": "समूह का चयन करें...", - "addConnection": "कनेक्शन जोड़ें", - "hostDetails": "मेज़बान का विवरण", - "removeFromGroup": "समूह से हटाएँ", - "addHostHere": "यहां होस्ट जोड़ें", - "editGroup": "समूह संपादित करें", - "delete": "मिटाना", - "add": "जोड़ना", - "create": "बनाएं", - "move": "कदम", - "connect": "जोड़ना", - "createGroup": "समूह बनाना", - "selectSourcePlaceholder": "स्रोत का चयन करें...", - "selectTargetPlaceholder": "लक्ष्य का चयन करें...", - "invalidFile": "अमान्य लेख्यपत्र", - "hostAlreadyExists": "होस्ट पहले से ही टोपोलॉजी में मौजूद है", - "connectionExists": "कनेक्शन पहले से मौजूद है", - "unknown": "अज्ञात", - "name": "नाम", - "ip": "आई पी", - "status": "स्थिति", - "failedToAddNode": "नोड जोड़ने में विफल", - "sourceDifferentFromTarget": "स्रोत और लक्ष्य अलग-अलग होने चाहिए", - "exportJSON": "JSON निर्यात करें", - "importJSON": "JSON आयात करें", - "terminal": "टर्मिनल", - "fileManager": "फ़ाइल मैनेजर", - "tunnel": "सुरंग", - "docker": "डाक में काम करनेवाला मज़दूर", - "serverStats": "सर्वर आँकड़े", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "अभी तक कोई नोड नहीं" }, "docker": { - "notEnabled": "इस होस्ट के लिए डॉकर सक्षम नहीं है।", - "validating": "डॉकर का सत्यापन किया जा रहा है...", - "connecting": "कनेक्ट हो रहा है...", - "error": "गलती", - "version": "डॉकर {{version}}", - "connectionFailed": "डॉकर से कनेक्ट करने में विफल", - "containerStarted": "कंटेनर {{name}} शुरू हो गया", - "failedToStartContainer": "कंटेनर {{name}} को प्रारंभ करने में विफल", - "containerStopped": "कंटेनर {{name}} रुक गया", - "failedToStopContainer": "कंटेनर {{name}} को रोकने में विफल", - "containerRestarted": "कंटेनर {{name}} पुनः आरंभ हुआ", - "failedToRestartContainer": "कंटेनर {{name}} को पुनः आरंभ करने में विफल रहा", - "containerPaused": "कंटेनर {{name}} रुका हुआ है", - "containerUnpaused": "कंटेनर {{name}} अनपॉज़ किया गया", - "failedToTogglePauseContainer": "कंटेनर {{name}} के लिए पॉज़ स्थिति को टॉगल करने में विफल।", - "containerRemoved": "कंटेनर {{name}} हटा दिया गया", - "failedToRemoveContainer": "कंटेनर {{name}} को हटाने में विफल", - "image": "छवि", - "ports": "बंदरगाहों", - "noPorts": "कोई बंदरगाह नहीं", - "start": "शुरू", - "confirmRemoveContainer": "क्या आप वाकई कंटेनर '{{name}}' को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।", - "runningContainerWarning": "चेतावनी: यह कंटेनर वर्तमान में चल रहा है। इसे हटाने से पहले यह कंटेनर बंद हो जाएगा।", - "loadingContainers": "कंटेनर लोड हो रहे हैं...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "डॉकर मैनेजर", - "autoRefresh": "ऑटो रिफ्रेश", + "autoRefresh": "Auto Refresh", "timestamps": "मुहर", "lines": "पंक्तियां", - "filterLogs": "लॉग फ़िल्टर करें...", - "refresh": "ताज़ा करना", - "download": "डाउनलोड करना", - "clear": "स्पष्ट", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "लॉग सफलतापूर्वक डाउनलोड हो गए", "last50": "पिछले 50", "last100": "पिछले 100", "last500": "अंतिम 500", "last1000": "पिछले 1000", "allLogs": "सभी लॉग", - "noLogsMatching": "\"{{query}} \" से मेल खाने वाली कोई लॉग नहीं मिली", - "noLogsAvailable": "कोई लॉग उपलब्ध नहीं हैं", - "noContainersFound": "कोई कंटेनर नहीं मिला", - "noContainersFoundHint": "इस होस्ट पर कोई डॉकर कंटेनर उपलब्ध नहीं हैं।", - "searchPlaceholder": "कंटेनर खोजें...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "सभी स्थितियाँ", - "stateRunning": "दौड़ना", + "stateRunning": "Running", "statePaused": "रुका हुआ", "stateExited": "बाहर निकल गया", "stateRestarting": "पुन: प्रारंभ हो", - "noContainersMatchFilters": "आपके फ़िल्टर से कोई कंटेनर मेल नहीं खाता।", - "noContainersMatchFiltersHint": "अपनी खोज या फ़िल्टर के मानदंडों को समायोजित करने का प्रयास करें", - "failedToFetchStats": "कंटेनर सांख्यिकी प्राप्त करने में विफल", - "containerNotRunning": "कंटेनर नहीं चल रहा है", - "startContainerToViewStats": "आंकड़े देखने के लिए कंटेनर शुरू करें", - "loadingStats": "आंकड़े लोड हो रहे हैं...", - "errorLoadingStats": "सांख्यिकी लोड करने में त्रुटि", - "noStatsAvailable": "कोई आंकड़े उपलब्ध नहीं हैं", - "cpuUsage": "सीपीयू उपयोग", - "current": "मौजूदा", - "memoryUsage": "स्मृति प्रयोग", - "networkIo": "नेटवर्क I/O", - "input": "इनपुट", - "output": "उत्पादन", - "blockIo": "ब्लॉक I/O", - "read": "पढ़ना", - "write": "लिखना", - "pids": "पीआईडी", - "containerInformation": "कंटेनर जानकारी", - "name": "नाम", - "id": "पहचान", - "state": "राज्य", - "containerMustBeRunning": "कंसोल तक पहुँचने के लिए कंटेनर का चालू होना आवश्यक है।", - "verificationCodePrompt": "सत्यापन कोड दर्ज करें", - "totpVerificationFailed": "टीओटीपी सत्यापन विफल रहा। कृपया पुनः प्रयास करें।", - "warpgateVerificationFailed": "वॉरपगेट प्रमाणीकरण विफल रहा। कृपया पुनः प्रयास करें।", - "connectedTo": "{{containerName}} से जुड़ा हुआ", - "disconnected": "डिस्कनेक्ट किया गया", - "consoleError": "कंसोल त्रुटि", - "errorMessage": "त्रुटि: {{message}}", - "failedToConnect": "कंटेनर से कनेक्ट करने में विफल", - "console": "सांत्वना देना", - "selectShell": "शेल का चयन करें", - "bash": "दे घुमा के", - "sh": "श", - "ash": "राख", - "connect": "जोड़ना", - "disconnect": "डिस्कनेक्ट", - "notConnected": "जुड़े नहीं हैं", - "clickToConnect": "शेल सेशन शुरू करने के लिए कनेक्ट पर क्लिक करें", - "connectingTo": "{{containerName}} से कनेक्ट हो रहा है...", - "containerNotFound": "कंटेनर नहीं मिला", - "backToList": "सूची पर वापस जाएं", - "logs": "लॉग्स", - "stats": "आँकड़े", - "consoleTab": "सांत्वना देना", - "startContainerToAccess": "कंसोल तक पहुँचने के लिए कंटेनर को प्रारंभ करें" + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "सामान्य", - "sectionOidc": "ओआईडीसी", - "sectionUsers": "उपयोगकर्ताओं", + "sectionGeneral": "General", + "sectionOidc": "OIDC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "सत्रों", - "sectionRoles": "भूमिकाएँ", - "sectionDatabase": "डेटाबेस", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "एपीआई कुंजी", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "फ़िल्टर साफ़ करें", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "सभी", "allowRegistration": "उपयोगकर्ता पंजीकरण की अनुमति दें", - "allowRegistrationDesc": "नए उपयोगकर्ताओं को स्वयं पंजीकरण करने दें", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "पासवर्ड लॉगिन की अनुमति दें", "allowPasswordLoginDesc": "उपयोगकर्ता नाम/पासवर्ड लॉगिन", "oidcAutoProvision": "ओआईडीसी ऑटो-प्रोविजन", - "oidcAutoProvisionDesc": "पंजीकरण अक्षम होने पर भी OIDC उपयोगकर्ताओं के लिए स्वचालित रूप से खाते बनाएँ", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "पासवर्ड रीसेट की अनुमति दें", "allowPasswordResetDesc": "डॉकर लॉग के माध्यम से कोड रीसेट करें", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "सेशन खत्म", - "hours": "घंटे", + "hours": "hours", "sessionTimeoutRange": "न्यूनतम 1 घंटा · अधिकतम 720 घंटे", - "monitoringDefaults": "मॉनिटरिंग डिफ़ॉल्ट", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "स्थिति जांच", - "metrics": "मेट्रिक्स", + "metrics": "Metrics", "sec": "सेकंड", "logLevel": "लॉग स्तर", "enableGuacamole": "गुआकामोल को सक्षम करें", "enableGuacamoleDesc": "आरडीपी/वीएनसी रिमोट डेस्कटॉप", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "गुआकडी यूआरएल", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "SSO के लिए OpenID Connect को कॉन्फ़िगर करें। जिन फ़ील्ड्स पर * का निशान लगा है, उन्हें भरना अनिवार्य है।", - "oidcClientId": "क्लाइंट आईडी", - "oidcClientSecret": "ग्राहक रहस्य", - "oidcAuthUrl": "प्राधिकरण यूआरएल", - "oidcIssuerUrl": "जारीकर्ता यूआरएल", - "oidcTokenUrl": "टोकन यूआरएल", - "oidcUserIdentifier": "उपयोगकर्ता पहचानकर्ता पथ", - "oidcDisplayName": "नाम पथ प्रदर्शित करें", - "oidcScopes": "कार्यक्षेत्र", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "उपयोगकर्ता जानकारी यूआरएल को ओवरराइड करें", - "oidcAllowedUsers": "अनुमत उपयोगकर्ता", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "एक पंक्ति में एक ही ईमेल लिखें। सभी ईमेल भेजने के लिए इसे खाली छोड़ दें।", - "removeOidc": "निकालना", - "usersCount": "{{count}} उपयोगकर्ता", - "createUser": "बनाएं", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "नयी भूमिका", - "roleName": "नाम", - "roleDisplayName": "प्रदर्शित होने वाला नाम", - "roleDescription": "विवरण", - "rolesCount": "{{count}} भूमिकाएँ", - "createRole": "बनाएं", - "creating": "सृजन...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "डेटाबेस निर्यात करें", "exportDatabaseDesc": "सभी होस्ट, क्रेडेंशियल और सेटिंग्स का बैकअप डाउनलोड करें", - "export": "निर्यात", - "exporting": "निर्यात हो रहा है...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "डेटाबेस आयात करें", "importDatabaseDesc": ".sqlite बैकअप फ़ाइल से पुनर्स्थापित करें", - "importDatabaseSelected": "चयनित: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "फ़ाइल का चयन करें", - "changeFile": "परिवर्तन", - "import": "आयात", - "importing": "आयात हो रहा है...", - "apiKeysCount": "{{count}} कुंजियाँ", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "नई एपीआई कुंजी", "apiKeyCreatedWarning": "कुंजी बन गई है - इसे अभी कॉपी कर लें, यह दोबारा नहीं दिखाई देगी।", - "apiKeyName": "नाम", - "apiKeyUser": "उपयोगकर्ता", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "किसी उपयोगकर्ता का चयन करें...", - "apiKeyExpiresAt": "समाप्ति तिथि", + "apiKeyExpiresAt": "Expires At", "createKey": "कुंजी बनाएँ", "apiKeyNoExpiry": "कोई समाप्ति नहीं", "revokedBadge": "निरस्त किया गया", - "authTypeDual": "दोहरी प्राधिकरण", - "authTypeOidc": "ओआईडीसी", - "authTypeLocal": "स्थानीय", - "adminStatusAdministrator": "प्रशासक", - "adminStatusRegularUser": "नियमित उपयोगकर्ता", + "authTypeDual": "Dual Auth", + "authTypeOidc": "OIDC", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "व्यवस्थापक", "systemBadge": "एसवाईएस", "customBadge": "रिवाज़", "youBadge": "आप", - "sessionsActive": "{{count}} सक्रिय", - "sessionActive": "सक्रिय: {{time}}", - "sessionExpires": "एक्सप: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "सभी", "revokeAllSessionsSuccess": "उपयोगकर्ता के लिए सभी सत्र रद्द कर दिए गए हैं।", - "revokeAllSessionsFailed": "सत्र रद्द करने में विफल", - "revokeSessionFailed": "सत्र रद्द करने में विफल", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "भूमिका जोड़ें", "noCustomRoles": "कोई कस्टम भूमिकाएँ परिभाषित नहीं हैं", - "removeRoleFailed": "भूमिका हटाने में विफल", - "assignRoleFailed": "भूमिका निर्धारित करने में विफल", - "deleteRoleFailed": "भूमिका हटाने में विफल", - "userAdminAccess": "प्रशासक", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "सभी प्रशासनिक सेटिंग्स तक पूर्ण पहुंच", - "userRoles": "भूमिकाएँ", - "revokeAllUserSessions": "सभी सत्र रद्द करें", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "सभी डिवाइसों पर पुनः लॉगिन करने के लिए बाध्य करें", - "revoke": "रद्द करना", + "revoke": "Revoke", "deleteUserWarning": "इस उपयोगकर्ता को हटाना स्थायी है।", - "deleteUser": "{{username}} को हटाएँ", - "deleting": "हटा रहा हूँ...", - "deleteUserFailed": "उपयोगकर्ता को हटाने में विफल", - "deleteUserSuccess": "उपयोगकर्ता \"{{username}}\" हटा दिया गया", - "deleteRoleSuccess": "भूमिका \"{{name}}\" हटा दी गई", - "revokeKeySuccess": "कुंजी \"{{name}}\" निरस्त कर दी गई", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "कुंजी रद्द करने में विफल", - "copiedToClipboard": "क्लिपबोर्ड पर कॉपी हो गया", + "copiedToClipboard": "Copied to clipboard", "done": "हो गया", - "createUserTitle": "उपयोगकर्ता बनाएँ", + "createUserTitle": "Create User", "createUserDesc": "एक नया स्थानीय खाता बनाएं।", - "createUserUsername": "उपयोगकर्ता नाम", - "createUserPassword": "पासवर्ड", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "कम से कम 6 अक्षर।", - "createUserEnterUsername": "उपयोगकर्ता नाम दर्ज करें", - "createUserEnterPassword": "पास वर्ड दर्ज करें", - "createUserSubmit": "उपयोगकर्ता बनाएँ", - "editUserTitle": "उपयोगकर्ता प्रबंधित करें: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "भूमिकाओं, व्यवस्थापक स्थिति, सत्रों और खाता सेटिंग्स को संपादित करें।", - "editUserUsername": "उपयोगकर्ता नाम", + "editUserUsername": "Username", "editUserAuthType": "प्राधिकरण प्रकार", - "editUserAdminStatus": "व्यवस्थापक स्थिति", - "editUserUserId": "उपयोगकर्ता पहचान", - "linkAccountTitle": "OIDC को पासवर्ड खाते से लिंक करें", - "linkAccountDesc": "OIDC खाते {{username}} को मौजूदा स्थानीय खाते के साथ मर्ज करें।", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "यह करेगा:", "linkAccountEffect1": "केवल OIDC खाते को हटाएँ", "linkAccountEffect2": "लक्ष्य खाते में OIDC लॉगिन जोड़ें", "linkAccountEffect3": "OIDC और पासवर्ड लॉगिन दोनों की अनुमति दें", - "linkAccountTargetUsername": "लक्ष्य उपयोगकर्ता नाम", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "लिंक करने के लिए स्थानीय खाते का उपयोगकर्ता नाम दर्ज करें", - "linkAccounts": "खाते लिंक करें", - "linkAccountSuccess": "\"{{username}} \" से जुड़ा OIDC खाता", - "linkAccountFailed": "OIDC खाते को लिंक करने में विफल।", - "linkAccountInProgress": "लिंक हो रहा है...", - "saving": "सहेजा जा रहा है...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "पंजीकरण सेटिंग को अपडेट करने में विफल", "updatePasswordLoginFailed": "पासवर्ड लॉगिन सेटिंग अपडेट करने में विफल", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "OIDC ऑटो-प्रोविजन सेटिंग को अपडेट करने में विफलता", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "पासवर्ड रीसेट सेटिंग को अपडेट करने में विफलता", "sessionTimeoutRange2": "सेशन टाइमआउट 1 से 720 घंटे के बीच होना चाहिए।", "sessionTimeoutSaved": "सेशन टाइमआउट सहेजा गया", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "अमान्य अंतराल मान", "monitoringSaved": "मॉनिटरिंग सेटिंग्स सहेजी गईं", "monitoringSaveFailed": "मॉनिटरिंग सेटिंग्स सहेजने में विफल", - "guacamoleSaved": "गुआकामोल की सेटिंग सहेज ली गई", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "गुआकामोल की सेटिंग्स सहेजने में विफल।", "guacamoleUpdateFailed": "गुआकामोल सेटिंग को अपडेट करने में विफलता", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "लॉग स्तर को अपडेट करने में विफल", "oidcSaved": "OIDC कॉन्फ़िगरेशन सहेजा गया", "oidcSaveFailed": "OIDC कॉन्फ़िगरेशन को सहेजने में विफल", "oidcRemoved": "OIDC कॉन्फ़िगरेशन हटा दिया गया", "oidcRemoveFailed": "OIDC कॉन्फ़िगरेशन को हटाने में विफल", "createUserRequired": "उपयोगकर्ता नाम और पासवर्ड आवश्यक हैं", - "createUserPasswordTooShort": "पासवर्ड कम से कम 6 अंकों का होना चाहिए", - "createUserSuccess": "उपयोगकर्ता \"{{username}}\" ने बनाया", - "createUserFailed": "उपयोगकर्ता बनाने में विफल", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "व्यवस्थापक की स्थिति अपडेट करने में विफल", "allSessionsRevoked": "सभी सत्र रद्द कर दिए गए", - "revokeSessionsFailed": "सत्र रद्द करने में विफल", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "नाम और डिस्प्ले नाम आवश्यक हैं", - "createRoleSuccess": "भूमिका \"{{name}}\" बनाई गई", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "भूमिका बनाने में विफल", "apiKeyNameRequired": "कुंजी का नाम आवश्यक है", "apiKeyUserRequired": "उपयोगकर्ता आईडी आवश्यक है", - "apiKeyCreatedSuccess": "एपीआई कुंजी \"{{name}}\" बनाई गई", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "एपीआई कुंजी बनाने में विफल", "exportSuccess": "डेटाबेस सफलतापूर्वक निर्यात हो गया", "exportFailed": "डेटाबेस निर्यात विफल रहा", "importSelectFile": "कृपया पहले एक फ़ाइल चुनें", - "importCompleted": "आयात पूर्ण हुआ: {{total}} आइटम आयात किए गए, {{skipped}} छोड़े गए", - "importFailed": "आयात विफल: {{error}}", - "importError": "डेटाबेस आयात विफल रहा" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "डेटाबेस आयात विफल रहा", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "मेज़बान", - "hostPlaceholder": "192.168.1.1 या example.com", - "portLabel": "पत्तन", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "उपयोगकर्ता नाम", - "usernamePlaceholder": "उपयोगकर्ता नाम", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "प्रमाणीकरण", - "passwordLabel": "पासवर्ड", - "passwordPlaceholder": "पासवर्ड", - "privateKeyLabel": "निजी चाबी", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "निजी कुंजी पेस्ट करें...", - "credentialLabel": "क्रेडेंशियल", + "credentialLabel": "Credential", "credentialPlaceholder": "सहेजे गए क्रेडेंशियल का चयन करें", - "connectToTerminal": "टर्मिनल से कनेक्ट करें", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "फ़ाइलों से कनेक्ट करें" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "सभी साफ करें", "noHistoryEntries": "कोई इतिहास प्रविष्टियाँ नहीं हैं", "trackingDisabled": "इतिहास ट्रैकिंग अक्षम है", - "trackingDisabledHint": "कमांड रिकॉर्ड करने के लिए इसे अपनी प्रोफ़ाइल सेटिंग में सक्षम करें।" + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "मुख्य रिकॉर्डिंग", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "टर्मिनलों पर रिकॉर्ड करें", "selectAll": "सभी", - "selectNone": "कोई नहीं", + "selectNone": "None", "noTerminalTabsOpen": "कोई टर्मिनल टैब खुला नहीं है", "selectTerminalsAbove": "ऊपर दिए गए टर्मिनलों का चयन करें", "broadcastInputPlaceholder": "यहां टाइप करके कीस्ट्रोक्स को प्रसारित करें...", "stopRecording": "रिकॉर्डिंग बंद करें", "startRecording": "रिकॉर्डिंग शुरू करें", - "settingsTitle": "सेटिंग्स", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "राइट-क्लिक कॉपी/पेस्ट को सक्षम करें" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "टैब को ऊपर दिए गए पैन में खींचें, या क्विक असाइनमेंट का उपयोग करें।", "dropHere": "यहां छोड़ें", "emptyPane": "खाली", - "dashboard": "डैशबोर्ड", + "dashboard": "Dashboard", "clearSplitScreen": "स्प्लिट स्क्रीन साफ़ करें", "quickAssign": "त्वरित असाइनमेंट", - "alreadyAssigned": "फलक {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "स्प्लिट टैब", "addToSplit": "स्प्लिट में जोड़ें", "removeFromSplit": "स्प्लिट से निकालें", - "assignToPane": "फलक को असाइन करें" + "assignToPane": "फलक को असाइन करें", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "स्निपेट बनाएं", - "createSnippetDescription": "त्वरित निष्पादन के लिए एक नया कमांड स्निपेट बनाएं", - "nameLabel": "नाम", - "namePlaceholder": "उदाहरण के लिए, Nginx को रीस्टार्ट करें", - "descriptionLabel": "विवरण", - "descriptionPlaceholder": "वैकल्पिक विवरण", - "optional": "वैकल्पिक", - "folderLabel": "फ़ोल्डर", - "noFolder": "कोई फ़ोल्डर नहीं (अवर्गीकृत)", - "commandLabel": "आज्ञा", - "commandPlaceholder": "उदाहरण के लिए, sudo systemctl restart nginx", - "cancel": "रद्द करना", - "createSnippetButton": "स्निपेट बनाएं", - "createFolderTitle": "फ़ोल्डर बनाएँ", - "createFolderDescription": "अपने लेखों के अंशों को फ़ोल्डरों में व्यवस्थित करें।", - "folderNameLabel": "फ़ोल्डर का नाम", - "folderNamePlaceholder": "उदाहरण के लिए, सिस्टम कमांड, डॉकर स्क्रिप्ट", - "folderColorLabel": "फ़ोल्डर का रंग", - "folderIconLabel": "फ़ोल्डर आइकन", - "previewLabel": "पूर्व दर्शन", - "folderNameFallback": "फ़ोल्डर का नाम", - "createFolderButton": "फ़ोल्डर बनाएँ", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "लक्ष्य टर्मिनल", "selectAll": "सभी", - "selectNone": "कोई नहीं", + "selectNone": "None", "noTerminalTabsOpen": "कोई टर्मिनल टैब खुला नहीं है", - "searchPlaceholder": "खोज के अंश...", - "newSnippet": "नया अंश", - "newFolder": "नया फ़ोल्डर", - "run": "दौड़ना", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "इस फ़ोल्डर में कोई स्निपेट नहीं हैं", - "uncategorized": "अवर्गीकृत", - "editSnippetTitle": "स्निपेट संपादित करें", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "इस कमांड स्निपेट को अपडेट करें", "saveSnippetButton": "परिवर्तनों को सुरक्षित करें", - "createSuccess": "स्निपेट सफलतापूर्वक बनाया गया", - "createFailed": "स्निपेट बनाने में विफल", - "updateSuccess": "स्निपेट सफलतापूर्वक अपडेट हो गया", - "updateFailed": "स्निपेट को अपडेट करने में विफल", - "deleteFailed": "स्निपेट को हटाने में विफल", - "folderCreateSuccess": "फ़ोल्डर सफलतापूर्वक बनाया गया", - "folderCreateFailed": "फ़ोल्डर बनाने में विफल", - "editFolderTitle": "फ़ोल्डर संपादित करें", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "इस फ़ोल्डर का नाम बदलें या इसका स्वरूप बदलें", "saveFolderButton": "परिवर्तनों को सुरक्षित करें", "editFolder": "फ़ोल्डर संपादित करें", "deleteFolder": "फ़ोल्डर हटाएं", - "folderDeleteSuccess": "फ़ोल्डर \"{{name}}\" हटा दिया गया", - "folderDeleteFailed": "फ़ोल्डर को हटाने में विफल", - "folderEditSuccess": "फ़ोल्डर सफलतापूर्वक अपडेट हो गया", - "folderEditFailed": "फ़ोल्डर को अपडेट करने में विफल", - "confirmRunMessage": "\"{{name}} \" चलाएँ?", - "confirmRunButton": "दौड़ना", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", - "copySuccess": "क्लिपबोर्ड पर \"{{name}}\" कॉपी किया गया", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "स्निपेट साझा करें", - "shareUser": "उपयोगकर्ता", - "shareRole": "भूमिका", + "shareUser": "User", + "shareRole": "Role", "selectUser": "किसी उपयोगकर्ता का चयन करें...", "selectRole": "एक भूमिका चुनें...", "shareSuccess": "अंश सफलतापूर्वक साझा किया गया", "shareFailed": "अंश साझा करने में विफल", "revokeSuccess": "पहुँच रद्द कर दी गई", - "revokeFailed": "पहुँच रद्द करने में विफल", - "currentAccess": "वर्तमान पहुंच", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "शेयर डेटा लोड करने में विफल", - "loading": "लोड हो रहा है...", - "close": "बंद करना", - "reorderFailed": "स्निपेट क्रम को सहेजने में विफल" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "स्निपेट क्रम को सहेजने में विफल", + "importExport": "आयात / निर्यात", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "कोई होस्ट कॉन्फ़िगर नहीं किया गया है", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "खाता", - "sectionAppearance": "उपस्थिति", - "sectionSecurity": "सुरक्षा", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "एपीआई कुंजी", "sectionC2sTunnels": "सी2एस सुरंगें", - "usernameLabel": "उपयोगकर्ता नाम", - "roleLabel": "भूमिका", - "roleAdministrator": "प्रशासक", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "प्रमाणीकरण विधि", - "authMethodLocal": "स्थानीय", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "पर", "twoFaOff": "बंद", - "versionLabel": "संस्करण", - "deleteAccount": "खाता हटा दो", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "अपना खाता स्थायी रूप से हटाएँ", - "deleteButton": "मिटाना", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "यह कार्रवाई स्थायी है और इसे पूर्ववत नहीं किया जा सकता है।", "deleteAccountWarning": "सभी सेशन, होस्ट, क्रेडेंशियल और सेटिंग्स स्थायी रूप से हटा दिए जाएंगे।", - "confirmPasswordDeletePlaceholder": "पुष्टि करने के लिए अपना पासवर्ड दर्ज करें", - "languageLabel": "भाषा", - "themeLabel": "विषय", - "fontSizeLabel": "फ़ॉन्ट आकार", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "एक्सेंट रंग", - "settingsTerminal": "टर्मिनल", - "commandAutocomplete": "कमांड ऑटो-कंप्लीट", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "टाइप करते समय ऑटो-कंप्लीट दिखाएं", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "इतिहास ट्रैकिंग", "historyTrackingDesc": "टर्मिनल कमांड को ट्रैक करें", - "syntaxHighlighting": "वाक्य - विन्यास पर प्रकाश डालना", - "syntaxHighlightingDesc": "टर्मिनल आउटपुट को हाइलाइट करें", "commandPalette": "कमांड पैलेट", "commandPaletteDesc": "कीबोर्ड शॉर्टकट सक्षम करें", "reopenTabsOnLogin": "लॉगिन करने पर टैब दोबारा खोलें", "reopenTabsOnLoginDesc": "लॉग इन करने या पेज को रिफ्रेश करने पर, यहां तक कि किसी अन्य डिवाइस से भी, आपके खुले टैब रीस्टोर हो जाएंगे।", "confirmTabClose": "टैब बंद करने की पुष्टि करें", "confirmTabCloseDesc": "टर्मिनल टैब बंद करने से पहले पूछें", - "settingsSidebar": "साइड बार", - "showHostTags": "शो होस्ट टैग", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "होस्ट सूची में टैग प्रदर्शित करें", "hostTrayOnClick": "होस्ट की कार्रवाइयों का विस्तार करने के लिए क्लिक करें", "hostTrayOnClickDesc": "कनेक्शन बटन हमेशा दिखाएं; प्रबंधन विकल्पों को विस्तारित करने के लिए होवर करने के बजाय क्लिक करें।", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "पिन ऐप रेल", "pinAppRailDesc": "होवर करने पर विस्तार करने के बजाय, बाएँ साइडबार ऐप रेल को हमेशा विस्तारित रखें।", - "settingsSnippets": "स्निपेट्स", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "फ़ोल्डर बंद कर दिए गए", "foldersCollapsedDesc": "फ़ोल्डर डिफ़ॉल्ट रूप से बंद हो जाते हैं", "confirmExecution": "निष्पादन की पुष्टि करें", "confirmExecutionDesc": "स्निपेट चलाने से पहले पुष्टि करें", - "settingsUpdates": "अपडेट", + "settingsUpdates": "Updates", "disableUpdateChecks": "अपडेट जांच अक्षम करें", "disableUpdateChecksDesc": "अपडेट की जाँच करना बंद करें", "totpAuthenticator": "टीओटीपी प्रमाणीकरणकर्ता", @@ -2109,68 +2612,68 @@ "qrCode": "क्यू आर संहिता", "totpInstructions": "QR कोड स्कैन करें या अपने प्रमाणीकरण ऐप में गुप्त कोड दर्ज करें, फिर 6 अंकों का कोड दर्ज करें।", "totpCodePlaceholder": "000000", - "verify": "सत्यापित करें", - "changePassword": "पासवर्ड बदलें", - "currentPasswordLabel": "वर्तमान पासवर्ड", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "वर्तमान पासवर्ड", - "newPasswordLabel": "नया पासवर्ड", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "नया पासवर्ड", "confirmPasswordLabel": "नए पासवर्ड की पुष्टि करें", "confirmPasswordPlaceholder": "नए पासवर्ड की पुष्टि करें", "updatePassword": "पासवर्ड अपडेट करें", "createApiKeyTitle": "एपीआई कुंजी बनाएं", "createApiKeyDescription": "प्रोग्रामेटिक एक्सेस के लिए एक नई एपीआई कुंजी जनरेट करें।", - "apiKeyNameLabel": "नाम", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "उदाहरण के लिए सीआई पाइपलाइन", "expiryDateLabel": "समाप्ति तिथि", "optional": "वैकल्पिक", - "cancel": "रद्द करना", + "cancel": "Cancel", "createKey": "कुंजी बनाएँ", - "apiKeyCount": "{{count}} कुंजियाँ", + "apiKeyCount": "{{count}} keys", "newKey": "नई कुंजी", "noApiKeys": "अभी तक कोई एपीआई कुंजी उपलब्ध नहीं है।", - "apiKeyActive": "सक्रिय", + "apiKeyActive": "Active", "apiKeyUsageHint": "अपनी चाबी भी साथ में रखें।", "apiKeyUsageHintHeader": "शीर्षक।", "apiKeyPermissionsHint": "कुंजी बनाने वाले उपयोगकर्ता की अनुमतियों को विरासत में प्राप्त करती है।", - "roleUser": "उपयोगकर्ता", - "authMethodDual": "दोहरी प्राधिकरण", - "authMethodOidc": "ओआईडीसी", - "totpSetupFailed": "TOTP सेटअप शुरू करने में विफल", + "roleUser": "User", + "authMethodDual": "Dual Auth", + "authMethodOidc": "OIDC", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "6 अंकों का कोड दर्ज करें", "totpEnabledSuccess": "दो-कारक प्रमाणीकरण सक्षम", "totpInvalidCode": "अवैध कोड, पुन: प्रयास करें", "totpDisableInputRequired": "अपना TOTP कोड या पासवर्ड दर्ज करें", - "totpDisabledSuccess": "दो-कारक प्रमाणीकरण अक्षम", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "2FA को अक्षम करने में विफल।", - "totpDisableTitle": "2FA को अक्षम करें", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "टीओटीपी कोड या पासवर्ड दर्ज करें", - "totpDisableConfirm": "2FA को अक्षम करें", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "सत्यापन जारी रखें", - "totpVerifyTitle": "कोड सत्यापित करें", - "totpBackupTitle": "बैकअप कोड", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "बैकअप कोड डाउनलोड करें", "done": "हो गया", "secretCopied": "गुप्त कुंजी क्लिपबोर्ड पर कॉपी हो गई", "apiKeyNameRequired": "कुंजी का नाम आवश्यक है", - "apiKeyCreated": "एपीआई कुंजी \"{{name}}\" बनाई गई", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "एपीआई कुंजी बनाने में विफल", - "apiKeyUser": "उपयोगकर्ता", - "apiKeyExpires": "समय-सीमा समाप्त", - "apiKeyRevoked": "एपीआई कुंजी \"{{name}}\" निरस्त कर दी गई", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "एपीआई कुंजी रद्द करने में विफल", "passwordFieldsRequired": "वर्तमान और नए पासवर्ड आवश्यक हैं", - "passwordMismatch": "सांकेतिक शब्द मेल नहीं खाते", - "passwordTooShort": "पासवर्ड कम से कम 6 अंकों का होना चाहिए", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "पासवर्ड सफलतापूर्वक अद्यतन", "passwordUpdateFailed": "पासवर्ड अपडेट करने में विफल", "deletePasswordRequired": "अपना खाता हटाने के लिए पासवर्ड आवश्यक है।", - "deleteFailed": "खाता हटाने में विफल", - "deleting": "हटा रहा हूँ...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "कलर पिकर खोलें", - "themeSystem": "प्रणाली", - "themeLight": "रोशनी", - "themeDark": "अँधेरा", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "ड्रेकुला", "themeCatppuccin": "कैटपुचिन", "themeNord": "नॉर्ड", @@ -2180,5 +2683,105 @@ "themeGruvbox": "ग्रुवबॉक्स" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "बस अब", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "टैब", + "backTab": "⇥", + "arrowUp": "ऊपर की ओर तीर", + "arrowDown": "नीचे की ओर तीर", + "arrowLeft": "बाएँ तीर", + "arrowRight": "दाएँ तीर", + "home": "Home", + "end": "अंत", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "हो गया" } } diff --git a/src/ui/locales/translated/hu_HU.json b/src/ui/locales/translated/hu_HU.json index 370b3a65..2792cb9a 100644 --- a/src/ui/locales/translated/hu_HU.json +++ b/src/ui/locales/translated/hu_HU.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Mappák", - "folder": "Mappa", - "password": "Jelszó", - "key": "Kulcsfontosságú", - "sshPrivateKey": "SSH privát kulcs", - "upload": "Feltöltés", - "keyPassword": "Kulcs jelszó", - "sshKey": "SSH-kulcs", - "uploadPrivateKeyFile": "Privátkulcsfájl feltöltése", - "searchCredentials": "Hitelesítő adatok keresése...", - "addCredential": "Hitelesítő adat hozzáadása", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "CA tanúsítvány (-cert.pub)", "caCertificateDescription": "Opcionális: Töltse fel vagy illessze be a CA által aláírt tanúsítványfájlt (pl. id_ed25519-cert.pub). Kötelező, ha az SSH-kiszolgáló tanúsítványalapú hitelesítést használ.", "uploadCertFile": "Feltöltés -cert.pub fájl", - "clearCert": "Világos", + "clearCert": "Clear", "certLoaded": "Tanúsítvány betöltve", "certPublicKeyLabel": "CA tanúsítvány", "certTypeLabel": "Tanúsítvány típusa", "pasteOrUploadCert": "Illesszen be vagy töltsön fel egy -cert.pub tanúsítványt...", "hasCaCert": "CA tanúsítvánnyal rendelkezik", - "noCaCert": "Nincs CA tanúsítvány" + "noCaCert": "Nincs CA tanúsítvány", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Alapértelmezett sorrend", + "sortNameAsc": "Név (A → Z)", + "sortNameDesc": "Név (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Szűrők törlése", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Nem sikerült betölteni az értesítéseket", - "failedToDismissAlert": "Nem sikerült elvetni a riasztást" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Szerver konfiguráció", - "description": "Konfigurálja a Termix szerver URL-címét a háttérszolgáltatásokhoz való csatlakozáshoz", - "serverUrl": "Szerver URL-címe", - "enterServerUrl": "Kérjük, adjon meg egy szerver URL-címét", - "saveFailed": "Nem sikerült menteni a konfigurációt", - "saveError": "Hiba a konfiguráció mentése során", - "saving": "Megtakarítás...", - "saveConfig": "Konfiguráció mentése", - "helpText": "Add meg az URL-címet, ahol a Termix szervered fut (pl. http://localhost:30001 vagy https://your-server.com)", - "changeServer": "Szerverváltás", - "mustIncludeProtocol": "A szerver URL-címének http:// vagy https:// előtaggal kell kezdődnie.", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Érvénytelen tanúsítvány engedélyezése", "allowInvalidCertificateDesc": "Csak megbízható, saját üzemeltetésű szerverekhez használja, amelyek önaláírt vagy IP-cím alapú tanúsítvánnyal rendelkeznek.", - "useEmbedded": "Helyi szerver használata", - "embeddedDesc": "Futtassa a Termixet a beépített helyi szerverrel (nincs szükség távoli szerverre)", - "embeddedConnecting": "Kapcsolódás a helyi szerverhez...", - "embeddedNotReady": "A helyi szerver még nem áll készen. Kérjük, várjon egy pillanatot, és próbálja újra.", - "localServer": "Helyi szerver" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Helyi szerver", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Verzióellenőrzési hiba", - "checkFailed": "Nem sikerült ellenőrizni a frissítéseket", - "upToDate": "Az alkalmazás naprakész", - "currentVersion": "A(z) {{version}} verziót futtatja", - "updateAvailable": "Frissítés elérhető", - "newVersionAvailable": "Új verzió érhető el! A(z) {{current}}verziót futtatod, de a(z) {{latest}} verzió már elérhető.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Béta verzió", - "betaVersionDesc": "A(z) {{current}}verziót futtatod, ami újabb, mint a legújabb stabil kiadás {{latest}}.", - "releasedOn": "Megjelent: {{date}}", - "downloadUpdate": "Frissítés letöltése", - "checking": "Frissítések keresése...", - "checkUpdates": "Frissítések keresése", - "checkingUpdates": "Frissítések keresése...", - "updateRequired": "Frissítés szükséges" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Közeli", - "minimize": "Minimalizálás", + "close": "Close", + "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Folytatás", - "maintenance": "Karbantartás", - "degraded": "Leromlott", - "error": "Hiba", - "warning": "Figyelmeztetés", - "unsavedChanges": "Nem mentett változtatások", - "dismiss": "Elvetés", - "loading": "Terhelés...", - "optional": "Választható", - "connect": "Csatlakozás", - "copied": "Másolva", - "connecting": "Kapcsolódás...", - "updateAvailable": "Frissítés elérhető", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Megnyitás új lapon", - "noReleases": "Nincsenek kiadások", - "updatesAndReleases": "Frissítések és kiadások", - "newVersionAvailable": "Új verzió ({{version}}) érhető el.", - "failedToFetchUpdateInfo": "Nem sikerült lekérni a frissítési információkat", - "preRelease": "Kiadás előtti", - "noReleasesFound": "Nem találhatók kiadások.", - "cancel": "Mégsem", - "username": "Felhasználónév", - "login": "Bejelentkezés", - "register": "Nyilvántartás", - "password": "Jelszó", - "confirmPassword": "Jelszó megerősítése", - "back": "Vissza", - "save": "Megtakarítás", - "saving": "Megtakarítás...", - "delete": "Töröl", - "rename": "Átnevezés", - "edit": "Szerkesztés", - "add": "Hozzáadás", - "confirm": "Megerősítés", - "no": "Nem", - "or": "VAGY", - "next": "Következő", - "previous": "Előző", - "refresh": "Frissítés", - "language": "Nyelv", - "checking": "Ellenőrzés...", - "checkingDatabase": "Adatbázis-kapcsolat ellenőrzése...", - "checkingAuthentication": "Hitelesítés ellenőrzése...", - "backendReconnected": "Szerverkapcsolat helyreállt", - "connectionDegraded": "Megszakadt a szerverkapcsolat, helyreáll a kapcsolat…", - "reload": "Újratöltés", - "remove": "Eltávolítás", - "create": "Teremt", - "update": "Frissítés", - "copy": "Másolat", - "copyFailed": "Nem sikerült a vágólapra másolni", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximalizálás", "restore": "Visszaállítás", - "of": "a" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Otthon", - "terminal": "Terminál", - "docker": "Dokkmunkás", - "tunnels": "Alagutak", - "fileManager": "Fájlkezelő", - "serverStats": "Szerver statisztikák", - "admin": "Adminisztrátor", - "userProfile": "Felhasználói profil", - "splitScreen": "Osztott képernyő", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Bezárja ezt az aktív munkamenetet?", - "close": "Közeli", - "cancel": "Mégsem", - "sshManager": "SSH-kezelő", - "cannotSplitTab": "Ez a lap nem osztható fel", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Jelszó másolása", - "copySudoPassword": "Sudo jelszó másolása", - "passwordCopied": "Jelszó a vágólapra másolva", - "noPasswordAvailable": "Nincs elérhető jelszó", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "Nem sikerült másolni a jelszót", "refreshTab": "Kapcsolat frissítése", - "openFileManager": "Fájlkezelő megnyitása", - "dashboard": "Műszerfal", - "networkGraph": "Hálózati gráf", - "quickConnect": "Gyors csatlakozás", - "sshTools": "SSH eszközök", - "history": "Történelem", - "hosts": "Házigazdák", - "snippets": "Kódrészletek", - "hostManager": "Házigazda-kezelő", - "credentials": "Hitelesítő adatok", - "connections": "Kapcsolatok", - "roleAdministrator": "Adminisztrátor", - "roleUser": "Felhasználó" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Házigazdák", - "noHosts": "Nincsenek SSH-hosztok", - "retry": "Újrapróbálkozás", - "refresh": "Frissítés", - "optional": "Választható", - "downloadSample": "Minta letöltése", - "failedToDeleteHost": "Nem sikerült törölni a(z) {{name}} fájlt.", - "importSkipExisting": "Importálás (meglévő kihagyása)", - "connectionDetails": "Kapcsolat részletei", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Távoli asztal", - "port": "Kikötő", - "username": "Felhasználónév", - "folder": "Mappa", - "tags": "Címkék", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", "pin": "Pin", - "addHost": "Gazdagép hozzáadása", - "editHost": "Gazdagép szerkesztése", - "cloneHost": "Klónozó gazdagép", - "enableTerminal": "Terminál engedélyezése", - "enableTunnel": "Alagút engedélyezése", - "enableFileManager": "Fájlkezelő engedélyezése", - "enableDocker": "Docker engedélyezése", - "defaultPath": "Alapértelmezett elérési út", - "connection": "Kapcsolat", - "upload": "Feltöltés", - "authentication": "Hitelesítés", - "password": "Jelszó", - "key": "Kulcsfontosságú", - "credential": "Hitelesítő adat", - "none": "Egyik sem", - "sshPrivateKey": "SSH privát kulcs", - "keyType": "Kulcstípus", - "uploadFile": "Fájl feltöltése", - "tabGeneral": "Általános", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "Vidékfejlesztési Program", + "tabTerminal": "Terminal", + "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Alagutak", - "tabDocker": "Dokkmunkás", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "Fájlok", - "tabStats": "Statisztikák", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Megosztás", - "tabAuthentication": "Hitelesítés", - "terminal": "Terminál", - "tunnel": "Alagút", - "fileManager": "Fájlkezelő", - "serverStats": "Szerver statisztikák", - "status": "Állapot", - "folderRenamed": "A(z) „{{oldName}}” mappa sikeresen átnevezve erre: „{{newName}}”", - "failedToRenameFolder": "Nem sikerült átnevezni a mappát", - "movedToFolder": "Áthelyezve ide: \"{{folder}}\"", - "editHostTooltip": "Gazdagép szerkesztése", - "statusChecks": "Állapotellenőrzések", - "metricsCollection": "Metrikagyűjtemény", - "metricsInterval": "Metrikagyűjtési intervallum", - "metricsIntervalDesc": "Milyen gyakran gyűjtsünk szerverstatisztikákat (5 másodperc - 1 óra)", - "behavior": "Viselkedés", - "themePreview": "Téma előnézete", - "theme": "Téma", - "fontFamily": "Betűcsalád", - "fontSize": "Betűméret", - "letterSpacing": "Betűköz", - "lineHeight": "Vonalmagasság", - "cursorStyle": "Kurzor stílusa", - "cursorBlink": "Kurzor villogása", - "scrollbackBuffer": "Görgetési puffer", - "bellStyle": "Harang stílus", - "rightClickSelectsWord": "Jobb klikk kijelöli a szót", - "fastScrollModifier": "Gyors görgetési módosító", - "fastScrollSensitivity": "Gyors görgetési érzékenység", - "sshAgentForwarding": "SSH ügynöktovábbítás", - "backspaceMode": "Visszatörlés mód", - "startupSnippet": "Indítási kódrészlet", - "selectSnippet": "Kódrészlet kiválasztása", - "forceKeyboardInteractive": "Kényszerítse a billentyűzet interaktivitását", - "overrideCredentialUsername": "Hitelesítő adat felülírása Felhasználónév", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Használja a fent megadott felhasználónevet a hitelesítő adat felhasználóneve helyett.", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", "addKnock": "Port hozzáadása", "addProxyNode": "Csomópont hozzáadása", - "proxyNode": "Proxy csomópont", - "proxyType": "Proxy típusa", - "quickActions": "Gyors műveletek", - "sudoPasswordAutoFill": "Sudo jelszó automatikus kitöltése", - "sudoPassword": "Sudo jelszó", - "keepaliveInterval": "Életben tartási intervallum (ms)", - "moshCommand": "MOSH parancs", - "environmentVariables": "Környezeti változók", - "addVariable": "Változó hozzáadása", - "docker": "Dokkmunkás", - "copyTerminalUrl": "Terminál URL másolása", - "copyFileManagerUrl": "Fájlkezelő URL-címének másolása", - "copyRemoteDesktopUrl": "Távoli asztal URL-címének másolása", - "failedToConnect": "Nem sikerült csatlakozni a konzolhoz", - "connect": "Csatlakozás", - "disconnect": "Leválasztás", - "start": "Indul", - "enableStatusCheck": "Állapotellenőrzés engedélyezése", - "enableMetrics": "Metrikák engedélyezése", - "bulkUpdateFailed": "Tömeges frissítés sikertelen", - "selectAll": "Összes kijelölése", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Összes kijelölés törlése", "protocols": "Protokollok", "secureShell": "Biztonságos shell", @@ -272,6 +303,9 @@ "unencryptedShell": "Titkosítatlan shell", "addressIp": "Cím / IP-cím", "friendlyName": "Barátságos név", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Mappa és Speciális", "privateNotes": "Privát jegyzetek", "privateNotesPlaceholder": "Részletek erről a szerverről...", @@ -281,16 +315,16 @@ "addKnockBtn": "Knock hozzáadása", "noPortKnocking": "Nincs portkopogás konfigurálva.", "knockPort": "Knock kikötő", - "protocol": "Jegyzőkönyv", + "protocol": "Protocol", "delayAfterMs": "Késleltetés után (ms)", "useSocks5Proxy": "Használjon SOCKS5 proxyt", "useSocks5ProxyDesc": "Kapcsolat átirányítása proxy szerveren keresztül", - "proxyHost": "Proxy állomás", - "proxyPort": "Proxy port", - "proxyUsername": "Proxy felhasználónév", - "proxyPassword": "Proxy jelszó", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Egyetlen proxy", - "proxyChainMode": "Proxy lánc", + "proxyChainMode": "Proxy Chain", "you": "Te", "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Ugrás hozzáadása", @@ -300,10 +334,10 @@ "authMethod": "Aut. módszer", "storedCredential": "Tárolt hitelesítő adatok", "selectACredential": "Válasszon hitelesítő adatot...", - "keyTypeLabel": "Kulcstípus", - "keyTypeAuto": "Automatikus felismerés", - "keyPasteTab": "Paszta", - "keyUploadTab": "Feltöltés", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Kulcsfájl betöltve", "keyUploadClick": "Kattintson a .pem / .key / .ppk fájlok feltöltéséhez", "clearKey": "Törlés gomb", @@ -311,59 +345,105 @@ "keyReplaceNotice": "illesszen be egy új kulcsot alább a helyére", "keyPassphraseSaved": "Jelszó mentve, gépelje be a módosításhoz", "replaceKey": "Kulcs cseréje", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", "forceKeyboardInteractiveShortDesc": "Kézi jelszó megadásának kényszerítése akkor is, ha a kulcsok jelen vannak", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Terminál megjelenése", "colorTheme": "Színtéma", - "fontFamilyLabel": "Betűcsalád", - "fontSizeLabel": "Betűméret", - "cursorStyleLabel": "Kurzor stílusa", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Betűköz (px)", - "lineHeightLabel": "Vonalmagasság", - "bellStyleLabel": "Harang stílus", - "backspaceModeLabel": "Visszatörlés mód", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Kurzor villog", "cursorBlinkingDesc": "Villogó animáció engedélyezése a terminálkurzorhoz", "rightClickSelectsWordLabel": "Jobb klikk Kijelöli a szót", "rightClickSelectsWordShortDesc": "Jobb klikk esetén jelölje ki a kurzor alatti szót", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Szintaxis kiemelése", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Időbélyegek", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Viselkedés és haladó", - "scrollbackBufferLabel": "Görgetési puffer", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "A történetben tárolt sorok maximális száma", - "sshAgentForwardingLabel": "SSH ügynöktovábbítás", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Adja át a helyi SSH-kulcsait ennek a gazdagépnek", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Auto-Mosh engedélyezése", "enableAutoMoshDesc": "Ha elérhető, akkor a Mosh-t részesítsd előnyben az SSH-val szemben.", "enableAutoTmux": "Auto-Tmux engedélyezése", "enableAutoTmuxDesc": "Automatikus indítás vagy csatlakozás tmux munkamenethez", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Sudo jelszó automatikus kitöltése", "sudoPasswordAutoFillShortDesc": "Automatikusan adja meg a sudo jelszót, amikor a rendszer kéri", - "sudoPasswordLabel": "Sudo jelszó", - "environmentVariablesLabel": "Környezeti változók", - "addVariableBtn": "Változó hozzáadása", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Nincsenek konfigurált környezeti változók.", - "fastScrollModifierLabel": "Gyors görgetési módosító", - "fastScrollSensitivityLabel": "Gyors görgetési érzékenység", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Mosh parancsnokság", - "startupSnippetLabel": "Indítási kódrészlet", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Életben tartási időköz (másodperc)", "maxKeepaliveMisses": "Max Keepalive kihagyások", "tunnelSettings": "Alagútbeállítások", "enableTunneling": "Alagútkezelés engedélyezése", "enableTunnelingDesc": "SSH alagút funkció engedélyezése ehhez a gazdagéphez", "serverTunnelsSection": "Szerver alagutak", - "addTunnelBtn": "Alagút hozzáadása", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Nincsenek konfigurált alagutak.", - "tunnelLabel": "Alagút {{number}}", - "tunnelType": "Alagút típusa", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Továbbítson egy helyi portot a távoli szerveren (vagy egy onnan elérhető gépen) lévő portra.", "tunnelModeRemoteDesc": "Továbbítsd a távoli szerver egyik portját a saját gépeden lévő helyi portra.", "tunnelModeDynamicDesc": "Hozz létre egy SOCKS5 proxyt egy helyi porton a dinamikus porttovábbításhoz.", "sameHost": "Ez a gazdagép (közvetlen alagút)", "endpointHost": "Végponti gazdagép", - "endpointPort": "Végponti port", + "endpointPort": "Endpoint Port", "bindHost": "Kötőállomás", - "sourcePort": "Forrásport", - "maxRetries": "Max. újrapróbálkozások", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Újrapróbálkozási intervallum (s)", "autoStartLabel": "Automatikus indítás", "autoStartDesc": "Automatikus csatlakozás ehhez az alagúthoz, amikor a gazdagép betöltődik", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Sikertelen csatlakozás", "failedToDisconnectTunnel": "Nem sikerült lecsatlakozni", "dockerIntegration": "Docker-integráció", - "enableDockerMonitor": "Docker engedélyezése", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Dockeren keresztül figyelheti és kezelheti a konténereket ezen a gazdagépen", - "enableFileManagerMonitor": "Fájlkezelő engedélyezése", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Fájlok böngészése és kezelése ezen a gazdagépen SFTP-n keresztül", - "defaultPathLabel": "Alapértelmezett elérési út", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "A könyvtár, amely megnyílik, amikor a fájlkezelő elindul ehhez a gazdagéphez.", - "statusChecksLabel": "Állapotellenőrzések", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Állapotellenőrzések engedélyezése", "enableStatusChecksDesc": "Rendszeresen pingelje ezt a gazdagépet az elérhetőség ellenőrzéséhez", "useGlobalInterval": "Globális intervallum használata", "useGlobalIntervalDesc": "Felülbírálás a szerver szintű állapotellenőrzési intervallummal", "checkIntervalS": "Ellenőrzési intervallum (s)", "checkIntervalDesc": "Másodpercek az egyes csatlakozási pingek között", - "metricsCollectionLabel": "Metrikagyűjtemény", - "enableMetricsLabel": "Metrikák engedélyezése", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Gyűjtse össze a CPU, RAM, lemez és hálózati használat adatait erről a gazdagépről", "useGlobalMetrics": "Globális intervallum használata", "useGlobalMetricsDesc": "Felülbírálás a szerverszintű metrika intervallummal", "metricsIntervalS": "Mérési intervallum (s)", "metricsIntervalDesc2": "Metrika pillanatképek között eltelt másodpercek", "visibleWidgets": "Látható widgetek", - "cpuUsageLabel": "CPU-használat", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "CPU százalék, terhelési átlagok, sparkline grafikon", - "memoryLabel": "Memóriahasználat", + "memoryLabel": "Memory Usage", "memoryDesc": "RAM-használat, swap, gyorsítótárban tárolt", - "storageLabel": "Lemezhasználat", + "storageLabel": "Disk Usage", "storageDesc": "Lemezhasználat csatolási pontonként", - "networkLabel": "Hálózati interfészek", + "networkLabel": "Network Interfaces", "networkDesc": "Interfészek listája és sávszélesség", - "uptimeLabel": "Üzemidő", + "uptimeLabel": "Uptime", "uptimeDesc": "Rendszer üzemideje és rendszerindítási ideje", "systemInfoLabel": "Rendszerinformáció", "systemInfoDesc": "Operációs rendszer, kernel, hostname, architektúra", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Sikeres és sikertelen bejelentkezési események", "topProcessesLabel": "Legfontosabb folyamatok", "topProcessesDesc": "PID, CPU%, MEM%, parancs", - "listeningPortsLabel": "Figyelő portok", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Portok megnyitása folyamattal és állapottal", - "firewallLabel": "Tűzfal", + "firewallLabel": "Firewall", "firewallDesc": "Tűzfal, AppArmor, SELinux állapota", - "quickActionsLabel": "Gyors műveletek", - "quickActionsToolbar": "A gyors műveletek gombokként jelennek meg a Kiszolgáló statisztikái eszköztáron, így egyetlen kattintással végrehajthatók a parancsok.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Még nincsenek gyors intézkedések.", "buttonLabel": "Gombcímke", "selectSnippetPlaceholder": "Válasszon részletet...", "addActionBtn": "Művelet hozzáadása", "hostSharedSuccessfully": "A gazdagép megosztása sikeresen megtörtént", - "failedToShareHost": "Nem sikerült megosztani a gazdagépet", + "failedToShareHost": "Failed to share host", "accessRevoked": "Hozzáférés visszavonva", - "failedToRevokeAccess": "Nem sikerült visszavonni a hozzáférést", - "cancelBtn": "Mégsem", - "savingBtn": "Megtakarítás...", - "addHostBtn": "Gazdagép hozzáadása", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Gazdagép frissítve", "hostCreated": "Gazdagép létrehozva", "failedToSave": "Nem sikerült menteni a gazdagépet", "credentialUpdated": "Hitelesítő adat frissítve", "credentialCreated": "Hitelesítő adat létrehozva", - "failedToSaveCredential": "Nem sikerült menteni a hitelesítő adatokat", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Vissza a házigazdákhoz", "backToCredentials": "Vissza a hitelesítő adatokhoz", - "pinned": "Rögzítve", - "noHostsFound": "Nem találhatók hostok", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Próbáljon ki egy másik kifejezést", "addFirstHost": "Add hozzá az első gazdagépedet a kezdéshez", "noCredentialsFound": "Nem találhatók hitelesítő adatok", - "addCredentialBtn": "Hitelesítő adat hozzáadása", - "updateCredentialBtn": "Hitelesítő adatok frissítése", - "features": "Jellemzők", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Nincs mappa)", - "deleteSelected": "Töröl", + "deleteSelected": "Delete", "exitSelection": "Kilépés a kijelölésből", - "importSkip": "Importálás (meglévő kihagyása)", + "importSkip": "Import (skip existing)", "importOverwrite": "Importálás (felülírás)", "collapseBtn": "Összeomlás", "importExportBtn": "Importálás / Exportálás", "hostStatusesRefreshed": "Gazdagép állapotok frissítve", "failedToRefreshHosts": "Nem sikerült frissíteni a gazdagépeket", - "movedHostTo": "Áthelyezve a {{host}} elemet ide: \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Nem sikerült áthelyezni a gazdagépet", - "folderRenamedTo": "Mappa átnevezve erre: \"{{name}}\"", - "deletedFolder": "Törölt mappa: \"{{name}}\"", - "failedToDeleteFolder": "Nem sikerült törölni a mappát", - "deleteAllInFolder": "Törli az összes gazdagépet a(z) \"{{name}}\" helyen? Ez nem vonható vissza.", - "deletedHost": "Törölt {{name}}", - "copiedToClipboard": "Vágólapra másolva", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Mappa szerkesztése", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Mappa szerkesztése", + "deleteFolder": "Mappa törlése", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Nem sikerült áthelyezni a gazdagépeket", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "Terminál URL-címe másolva", "fileManagerUrlCopied": "Fájlkezelő URL-címe másolva", "tunnelUrlCopied": "Alagút URL-címe másolva", "dockerUrlCopied": "Docker URL másolva", - "serverStatsUrlCopied": "Szerverstatisztikák URL-címe másolva", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP URL másolva", "vncUrlCopied": "VNC URL másolva", "telnetUrlCopied": "Telnet URL másolva", @@ -471,109 +633,112 @@ "expandActions": "Műveletek kibontása", "collapseActions": "Műveletek összecsukása", "wakeOnLanAction": "Ébresztés LAN-on keresztül", - "wakeOnLanSuccess": "Mágikus csomag elküldve a {{name}} címre", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Nem sikerült elküldeni a mágikus csomagot", - "cloneHostAction": "Klónozó gazdagép", + "cloneHostAction": "Clone Host", "copyAddress": "Cím másolása", "copyLink": "Link másolása", - "copyTerminalUrlAction": "Terminál URL másolása", - "copyFileManagerUrlAction": "Fájlkezelő URL-címének másolása", - "copyTunnelUrlAction": "Alagút URL-címének másolása", - "copyDockerUrlAction": "Docker URL másolása", - "copyServerStatsUrlAction": "Szerverstatisztikák URL-címének másolása", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "RDP URL másolása", "copyVncUrlAction": "VNC URL másolása", "copyTelnetUrlAction": "Telnet URL másolása", - "copyRemoteDesktopUrlAction": "Távoli asztal URL-címének másolása", - "deleteCredentialConfirm": "Törli a hitelesítő adatokat: \"{{name}}\"?", - "deletedCredential": "Törölt {{name}}", - "deploySSHKeyTitle": "SSH-kulcs telepítése", - "deployingBtn": "Telepítés...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Telepítés", "failedToDeployKey": "Nem sikerült telepíteni a kulcsot", - "deleteHostsConfirm": "Törli a {{count}} gazdagépet{{plural}}? Ez nem vonható vissza.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Áthelyezve a rootba", - "failedToMoveHosts": "Nem sikerült áthelyezni a gazdagépeket", - "enableTerminalFeature": "Terminál engedélyezése", - "disableTerminalFeature": "Terminál letiltása", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Fájlok engedélyezése", "disableFilesFeature": "Fájlok letiltása", "enableTunnelsFeature": "Alagutak engedélyezése", "disableTunnelsFeature": "Alagutak letiltása", - "enableDockerFeature": "Docker engedélyezése", - "disableDockerFeature": "Docker letiltása", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Címkék hozzáadása...", "authDetails": "Hitelesítési adatok", - "credType": "Típus", + "credType": "Type", "generateKeyPairDesc": "Generáljon új kulcspárt, mind a privát, mind a nyilvános kulcsok automatikusan kitöltődnek.", "generatingKey": "Generálás...", - "generateLabel": "{{label}} generálása", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Fájl feltöltése", "keyPassphraseOptional": "Kulcs jelszó (opcionális)", "sshPublicKeyOptional": "SSH nyilvános kulcs (opcionális)", "publicKeyGenerated": "Nyilvános kulcs generálva", "failedToGeneratePublicKey": "Nem sikerült a nyilvános kulcsot kinyerni", "publicKeyCopied": "Nyilvános kulcs lemásolva", - "keyPairGenerated": "{{label}} kulcspár generálva", - "failedToGenerateKeyPair": "Nem sikerült kulcspárt generálni", - "searchHostsPlaceholder": "Keresés hosztok, címek, címkék…", - "searchCredentialsPlaceholder": "Hitelesítő adatok keresése…", - "refreshBtn": "Frissítés", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Címkék hozzáadása...", - "deleteConfirmBtn": "Töröl", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "Az SSH szervernek a /etc/ssh/sshd_config fájlban be kell állítania a GatewayPorts yes, az AllowTcpForwarding yes és a PermitRootLogin yes értékeket.", - "deleteHostConfirm": "Törölni a \"{{name}}\"?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Engedélyezzen legalább egy protokollt a fentiekből a hitelesítés és a kapcsolat beállításainak konfigurálásához.", - "keyPassphrase": "Kulcs jelszó", - "connectBtn": "Csatlakozás", - "disconnectBtn": "Leválasztás", - "basicInformation": "Alapvető információk", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Hitelesítési adatok", - "credTypeLabel": "Típus", - "hostsTab": "Házigazdák", - "credentialsTab": "Hitelesítő adatok", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Több kiválasztása", "selectHosts": "Válasszon hosztokat", - "connectionLabel": "Kapcsolat", - "authenticationLabel": "Hitelesítés", - "generateKeyPairTitle": "Kulcspár generálása", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Generáljon új kulcspárt, mind a privát, mind a nyilvános kulcsok automatikusan kitöltődnek.", - "generateFromPrivateKey": "Privát kulcsból generálás", - "refreshBtn2": "Frissítés", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Kilépés a kijelölésből", "exportAll": "Összes exportálása", - "addHostBtn2": "Gazdagép hozzáadása", - "addCredentialBtn2": "Hitelesítő adat hozzáadása", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Gazdagépek állapotának ellenőrzése...", - "pinnedSection": "Rögzítve", + "pinnedSection": "Pinned", "hostsExported": "A hosztok exportálása sikeresen megtörtént.", "exportFailed": "Nem sikerült exportálni a gazdagépeket", "sampleDownloaded": "Mintafájl letöltve", - "failedToDeleteCredential2": "Nem sikerült törölni a hitelesítő adatokat", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Nincs mappa)", - "nSelected": "{{count}} kiválasztva", - "featuresMenu": "Jellemzők", - "moveMenu": "Mozog", - "cancelSelection": "Mégsem", - "deployDialogDesc": "Telepítse a {{name}} kulcsot egy gazdagép authorized_keys kulcsaira.", - "targetHostLabel": "Célállomás", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Válasszon egy hosztot...", "keyDeployedSuccess": "Kulcs sikeresen telepítve", "failedToDeployKey2": "Nem sikerült telepíteni a kulcsot", - "deletedCount": "Törölt {{count}} gazdagépek", - "failedToDeleteCount": "Nem sikerült törölni a(z) {{count}} gazdagépet", - "duplicatedHost": "Duplikálva: \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Nem sikerült a gazdagépet duplikálni", - "updatedCount": "Frissített {{count}} gazdagépek", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Barátságos név", - "descriptionLabel": "Leírás", + "descriptionLabel": "Description", "loadingHost": "Gazdagép betöltése...", - "loadingHosts": "Gazdagépek betöltése...", - "loadingCredentials": "Hitelesítő adatok betöltése...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Még nincsenek házigazdák", - "noHostsMatchSearch": "Nincsenek a keresésnek megfelelő házigazdák", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Nem található gazdagép", - "searchHosts": "Gazdagépek keresése...", + "searchHosts": "Search hosts...", "sortHosts": "Gazdagépek rendezése", "sortDefault": "Alapértelmezett sorrend", "sortNameAsc": "Név (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "Elsőként rögzítve", "filterHosts": "Szűrőállomások", "filterClearAll": "Szűrők törlése", - "filterStatusGroup": "Állapot", + "filterStatusGroup": "Status", "filterOnline": "Online", "filterOffline": "Offline", - "filterPinned": "Rögzítve", + "filterPinned": "Pinned", "filterAuthGroup": "Aut. típus", - "filterAuthPassword": "Jelszó", - "filterAuthKey": "SSH-kulcs", - "filterAuthCredential": "Hitelesítő adat", - "filterAuthNone": "Egyik sem", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "Jegyzőkönyv", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", - "filterProtocolRdp": "Vidékfejlesztési Program", + "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "Jellemzők", - "filterFeatureTerminal": "Terminál", - "filterFeatureFileManager": "Fájlkezelő", - "filterFeatureTunnel": "Alagút", - "filterFeatureDocker": "Dokkmunkás", - "filterTagsGroup": "Címkék", - "shareHost": "Megosztási házigazda", - "shareHostTitle": "Megosztás: {{name}}", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Ennek a gazdagépnek hitelesítő adatot kell használnia a megosztás engedélyezéséhez. Először szerkessze a gazdagépet, és rendeljen hozzá egy hitelesítő adatot." }, "guac": { - "connection": "Kapcsolat", - "authentication": "Hitelesítés", - "connectionSettings": "Kapcsolati beállítások", - "displaySettings": "Kijelzőbeállítások", - "audioSettings": "Hangbeállítások", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Tárolt hitelesítő adatok", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Aut. módszer", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Válasszon hitelesítő adatot...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "RDP-teljesítmény", - "deviceRedirection": "Eszközátirányítás", - "session": "Ülés", - "gateway": "Átjáró", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Vágólap", + "clipboard": "Clipboard", "sessionRecording": "Munkamenet-felvétel", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC-beállítások", - "terminalSettings": "Terminálbeállítások", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "RDP-port", - "username": "Felhasználónév", - "password": "Jelszó", + "username": "Username", + "password": "Password", "domain": "Domain", - "securityMode": "Biztonsági mód", - "colorDepth": "Színmélység", - "width": "Szélesség", - "height": "Magasság", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Átméretezési módszer", - "clientName": "Ügyfél neve", - "initialProgram": "Kezdeti program", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Szerver elrendezése", - "timezone": "Időzóna", - "gatewayHostname": "Átjáró állomásneve", - "gatewayPort": "Átjáró kikötő", - "gatewayUsername": "Átjáró felhasználóneve", - "gatewayPassword": "Átjáró jelszava", - "gatewayDomain": "Átjáró domain", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "RemoteApp program", "workingDirectory": "Munkakönyvtár", "arguments": "érvek", "normalizeLineEndings": "Sorvégek normalizálása", - "recordingPath": "Felvételi útvonal", - "recordingName": "Felvétel neve", - "macAddress": "MAC-cím", - "broadcastAddress": "Sugárzási cím", - "udpPort": "UDP port", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Várakozási idő (s)", - "driveName": "Meghajtó neve", - "drivePath": "Útvonal", - "ignoreCertificate": "Tanúsítvány figyelmen kívül hagyása", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Kapcsolódás engedélyezése önaláírt tanúsítványokkal rendelkező gazdagépekhez", - "forceLossless": "Veszteségmentes erő", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Veszteségmentes képkódolás kényszerítése (jobb minőség, nagyobb sávszélesség)", - "disableAudio": "Hang letiltása", + "disableAudio": "Disable Audio", "disableAudioDesc": "Némítsa el az összes hangot a távoli munkamenetből", "enableAudioInput": "Hangbemenet engedélyezése (mikrofon)", "enableAudioInputDesc": "Helyi mikrofon továbbítása a távoli munkamenetbe", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Aero Glass effektek engedélyezése", "menuAnimations": "Menüanimációk", "menuAnimationsDesc": "Menü elhalványulásának és diaanimációk engedélyezése", - "disableBitmapCaching": "Bitképes gyorsítótár letiltása", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Kapcsold ki a bitképes gyorsítótárat (segíthet a hibákon)", - "disableOffscreenCaching": "Képernyőn kívüli gyorsítótár letiltása", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Kapcsolja ki a képernyőn kívüli gyorsítótárat", - "disableGlyphCaching": "Karakterjel-gyorsítótár letiltása", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Kapcsolja ki a karakterjel-gyorsítótárat", - "enableGfx": "GFX engedélyezése", + "enableGfx": "Enable GFX", "enableGfxDesc": "RemoteFX grafikus folyamatsor használata", - "enablePrinting": "Nyomtatás engedélyezése", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Helyi nyomtatók átirányítása a távoli munkamenetre", - "enableDriveRedirection": "Meghajtó átirányításának engedélyezése", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Helyi mappa meghajtóként való leképezése a távoli munkamenetben", - "createDrivePath": "Útvonal létrehozása", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Automatikusan létrehozza a mappát, ha az nem létezik", - "disableDownload": "Letöltés letiltása", + "disableDownload": "Disable Download", "disableDownloadDesc": "Fájlok letöltésének megakadályozása a távoli munkamenetből", - "disableUpload": "Feltöltés letiltása", + "disableUpload": "Disable Upload", "disableUploadDesc": "Fájlok távoli munkamenetbe való feltöltésének megakadályozása", - "enableTouch": "Érintés engedélyezése", + "enableTouch": "Enable Touch", "enableTouchDesc": "Érintéses bevitel továbbításának engedélyezése", - "consoleSession": "Konzol munkamenet", + "consoleSession": "Console Session", "consoleSessionDesc": "Csatlakozás a konzolhoz (0. munkamenet) egy új munkamenet helyett", "sendWolPacket": "WOL csomag küldése", "sendWolPacketDesc": "Küldjön egy varázslatos csomagot a gazdagép felébresztéséhez a csatlakozás előtt", - "disableCopy": "Másolás letiltása", + "disableCopy": "Disable Copy", "disableCopyDesc": "Szöveg másolásának megakadályozása a távoli munkamenetből", - "disablePaste": "Beillesztés letiltása", + "disablePaste": "Disable Paste", "disablePasteDesc": "Szöveg beillesztésének megakadályozása a távoli munkamenetbe", "createPathIfMissing": "Útvonal létrehozása, ha hiányzik", "createPathIfMissingDesc": "Felvételi könyvtár automatikus létrehozása", - "excludeOutput": "Kimenet kizárása", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Ne rögzítse a képernyőkimenetet (csak metaadatok)", - "excludeMouse": "Egér kizárása", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Ne rögzítse az egér mozgását", "includeKeystrokes": "Billentyűleütések belefoglalása", "includeKeystrokesDesc": "Nyers billentyűleütések rögzítése a képernyőn megjelenő kimenet mellett", @@ -718,102 +896,105 @@ "vncPassword": "VNC jelszó", "vncUsernameOptional": "Felhasználónév (opcionális)", "vncLeaveBlank": "Hagyja üresen, ha nem szükséges", - "cursorMode": "Kurzor mód", - "swapRedBlue": "Piros/Kék csere", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Cserélje fel a piros és kék színcsatornákat (javít néhány színproblémát)", "readOnly": "Csak olvasható", "readOnlyDesc": "Távoli képernyő megtekintése bemenet küldése nélkül", "telnetPort": "Telnet port", - "terminalType": "Terminál típusa", - "fontName": "Betűtípus neve", - "fontSize": "Betűméret", - "colorScheme": "Színséma", - "backspaceKey": "Visszatörlés billentyű", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Először mentsd el a gazdagépet.", "sharingOptionsAfterSave": "A megosztási beállítások a gazdagép mentése után érhetők el.", "sharingLoadError": "Nem sikerült betölteni a megosztási adatokat. Ellenőrizd a kapcsolatot, és próbáld újra.", - "shareHostSection": "Megosztási házigazda", - "shareWithUser": "Megosztás a felhasználóval", - "shareWithRole": "Megosztás szerepkörrel", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Felhasználó kiválasztása", - "selectRole": "Szerepkör kiválasztása", + "selectRole": "Select Role", "selectUserOption": "Válasszon ki egy felhasználót...", "selectRoleOption": "Válasszon egy szerepet...", - "permissionLevel": "Engedélyszint", + "permissionLevel": "Permission Level", "expiresInHours": "Lejár (órán belül)", "noExpiryPlaceholder": "Hagyja üresen, ha nincs lejárati idő", - "shareBtn": "Részesedés", - "currentAccess": "Jelenlegi hozzáférés", - "typeHeader": "Típus", - "targetHeader": "Cél", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "Engedély", - "grantedByHeader": "Megadta", - "expiresHeader": "Lejár", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Még nincsenek hozzáférési bejegyzések.", - "expiredLabel": "Lejárt", - "neverLabel": "Soha", - "revokeBtn": "Visszavonás", - "cancelBtn": "Mégsem", - "savingBtn": "Megtakarítás...", - "updateHostBtn": "Frissítse a gazdagépet", - "addHostBtn": "Gazdagép hozzáadása" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Keresés állomások, parancsok vagy beállítások között...", - "quickActions": "Gyors műveletek", - "hostManager": "Házigazda-kezelő", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Gazdagépek kezelése, hozzáadása vagy szerkesztése", "addNewHost": "Új állomás hozzáadása", "addNewHostDesc": "Új házigazda regisztrálása", - "adminSettings": "Adminisztrátori beállítások", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Rendszerbeállítások és felhasználók konfigurálása", - "userProfile": "Felhasználói profil", + "userProfile": "User Profile", "userProfileDesc": "Fiókod és beállításaid kezelése", - "addCredential": "Hitelesítő adat hozzáadása", + "addCredential": "Add Credential", "addCredentialDesc": "SSH-kulcsok vagy jelszavak tárolása", - "recentActivity": "Legutóbbi tevékenységek", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Szerverek és hosztok", - "noHostsFound": "Nem található a következőnek megfelelő gazdagép: \"{{search}}\"", - "links": "Linkek", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigálás", - "select": "Válasszon", + "select": "Select", "toggleWith": "Váltás erre:" }, "splitScreen": { - "paneEmpty": "{{index}} ablaktábla - üres", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Nincs hozzárendelve tabulátor", "focusedPane": "Aktív ablaktábla" }, "connections": { "noConnections": "Nincsenek kapcsolatok", "noConnectionsDesc": "Nyisson meg egy terminált, fájlkezelőt vagy távoli asztalt a kapcsolatok megtekintéséhez.", - "connectedFor": "Csatlakoztatva ehhez: {{duration}}", - "connected": "Csatlakoztatva", - "disconnected": "Szétkapcsolt", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Lap bezárása", "closeConnection": "Szoros kapcsolat", "forgetTab": "Felejtsd el", - "removeBackground": "Eltávolítás", - "reconnect": "Újracsatlakozás", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Újranyitás", "sectionOpen": "Nyitott", "sectionBackground": "Háttér", "backgroundDesc": "A munkamenetek a leválasztás után 30 percig megmaradnak, majd újracsatlakoztathatók.", "persisted": "A háttérben maradt", - "expiresIn": "Lejár {{duration}} múlva", + "expiresIn": "Expires in {{duration}}", "search": "Kapcsolatok keresése...", - "noSearchResults": "Nincsenek a keresésnek megfelelő kapcsolatok" + "noSearchResults": "Nincsenek a keresésnek megfelelő kapcsolatok", + "rename": "Rename session" }, "guacamole": { - "connecting": "Kapcsolódás ehhez: {{type}} munkamenet...", - "connectionError": "Csatlakozási hiba", - "connectionFailed": "Kapcsolódás sikertelen", - "failedToConnect": "Nem sikerült lekérni a kapcsolati tokent", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Nem található gazdagép", - "noHostSelected": "Nincs kiválasztva gazdagép", - "reconnect": "Újracsatlakozás", - "retry": "Újrapróbálkozás", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "A távoli asztali szolgáltatás (guacd) nem érhető el. Kérjük, győződjön meg róla, hogy a guacd fut, elérhető és megfelelően van konfigurálva az adminisztrátori beállításokban.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -822,13 +1003,13 @@ "winKey": "Windows billentyű", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Váltás", + "shift": "Shift", "win": "Győzelem", - "stickyActive": "{{key}} (reteszelve - kattintson a kioldáshoz)", - "stickyInactive": "{{key}} (kattintson a rögzítéshez)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Menekülés", "tab": "Fül", - "home": "Otthon", + "home": "Home", "end": "Vége", "pageUp": "Oldal fel", "pageDown": "Oldal le", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Csatlakozás a gazdagéphez", - "clear": "Világos", - "paste": "Paszta", - "reconnect": "Újracsatlakozás", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Kapcsolat megszakadt", - "connected": "Csatlakoztatva", - "clipboardWriteFailed": "Nem sikerült a vágólapra másolni. Győződjön meg arról, hogy az oldal HTTPS vagy localhost protokollon keresztül jelenik meg.", - "clipboardReadFailed": "Nem sikerült beolvasni a vágólapról. Győződjön meg arról, hogy a vágólapra vonatkozó engedélyek meg vannak adva.", - "clipboardHttpWarning": "A beillesztéshez HTTPS szükséges. Használd a Ctrl+Shift+V billentyűkombinációt, vagy HTTPS-en keresztül szolgáltasd ki a Termixet.", - "unknownError": "Ismeretlen hiba történt", - "websocketError": "WebSocket csatlakozási hiba", - "connecting": "Kapcsolódás...", - "noHostSelected": "Nincs kiválasztva gazdagép", - "reconnecting": "Újracsatlakozás... ({{attempt}}/{{max}})", - "reconnected": "Sikeresen újrakapcsolódott", - "tmuxSessionCreated": "tmux munkamenet létrehozva: {{name}}", - "tmuxSessionAttached": "tmux munkamenet csatolva: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "A tmux nincs telepítve a távoli gépre, a standard shell-t használja.", "tmuxSessionPickerTitle": "tmux munkamenetek", "tmuxSessionPickerDesc": "Meglévő tmux munkamenetek találhatók ezen a gazdagépen. Válasszon ki egyet az újracsatlakozáshoz, vagy hozzon létre egy új munkamenetet.", - "tmuxWindows": "Ablakok", - "tmuxWindowCount": "{{count}} ablak", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Csatlakoztatott ügyfelek", - "tmuxAttachedCount": "{{count}} csatolva", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Utolsó tevékenység", "tmuxTimeJustNow": "éppen most", - "tmuxTimeMinutes": "{{count}}perccel ezelőtt", - "tmuxTimeHours": "{{count}}órával ezelőtt", - "tmuxTimeDays": "{{count}}nappal ezelőtt", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Új munkamenet indítása", "tmuxCopyHint": "Módosítsa a kijelölést, és nyomja meg az Enter billentyűt a vágólapra másoláshoz", "tmuxDetach": "Leválasztás a tmux munkamenetről", "tmuxDetached": "Leválasztva a tmux munkamenetről", - "maxReconnectAttemptsReached": "Elérte az újracsatlakozási kísérletek maximális számát", - "closeTab": "Közeli", - "connectionTimeout": "Kapcsolati időtúllépés", - "terminalTitle": "Terminál - {{host}}", - "terminalWithPath": "Terminál - {{host}}:{{path}}", - "runTitle": "Futás {{command}} - {{host}}", - "totpRequired": "Kétfaktoros hitelesítés szükséges", - "totpCodeLabel": "Ellenőrző kód", - "totpVerify": "Ellenőrzés", - "warpgateAuthRequired": "Warpgate hitelesítés szükséges", - "warpgateSecurityKey": "Biztonsági kulcs", - "warpgateAuthUrl": "Hitelesítési URL", - "warpgateOpenBrowser": "Megnyitás böngészőben", - "warpgateContinue": "Befejeztem a hitelesítést", - "opksshAuthRequired": "OPKSSH hitelesítés szükséges", - "opksshAuthDescription": "A folytatáshoz végezze el a hitelesítést a böngészőjében. Ez a munkamenet 24 órán át érvényes marad.", - "opksshOpenBrowser": "Böngésző megnyitása a hitelesítéshez", - "opksshWaitingForAuth": "Várakozás a böngésző hitelesítésére...", - "opksshAuthenticating": "Hitelesítés feldolgozása...", - "opksshTimeout": "A hitelesítés időtúllépést okozott. Kérjük, próbálja újra.", - "opksshAuthFailed": "Sikertelen hitelesítés. Kérjük, ellenőrizze a hitelesítő adatait, és próbálja újra.", - "opksshSignInWith": "Bejelentkezés {{provider}} felhasználónévvel", - "sudoPasswordPopupTitle": "Jelszó beszúrása?", - "websocketAbnormalClose": "A kapcsolat váratlanul megszakadt. Ennek oka lehet fordított proxy vagy SSL konfigurációs probléma. Kérjük, ellenőrizze a szervernaplókat.", - "connectionLogTitle": "Kapcsolati napló", - "connectionLogCopy": "Naplók másolása a vágólapra", - "connectionLogEmpty": "Még nincsenek kapcsolati naplók", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Nyitott", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Várakozás a kapcsolati naplókra...", - "connectionLogCopied": "Kapcsolati naplók másolva a vágólapra", - "connectionLogCopyFailed": "Nem sikerült a naplókat a vágólapra másolni", - "connectionRejected": "A szerver elutasította a kapcsolatot. Kérjük, ellenőrizze a hitelesítést és a hálózati konfigurációt.", - "hostKeyRejected": "SSH host kulcs ellenőrzése elutasítva. Kapcsolat megszakítva.", - "sessionTakenOver": "A munkamenet egy másik lapon nyílt meg. Újrakapcsolódás..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Osztott lap", + "addToSplit": "Hozzáadás Splithez", + "removeFromSplit": "Eltávolítás a felosztásból" + } }, "fileManager": { - "noHostSelected": "Nincs kiválasztva gazdagép", + "noHostSelected": "No host selected", "initializingEditor": "Szerkesztő inicializálása...", - "file": "Fájl", - "folder": "Mappa", - "uploadFile": "Fájl feltöltése", - "downloadFile": "Letöltés", - "extractArchive": "Archívum kibontása", - "extractingArchive": "{{name}} kinyerése ...", - "archiveExtractedSuccessfully": "{{name}} sikeresen kibontva", - "extractFailed": "Kibontás sikertelen", - "compressFile": "Fájl tömörítése", - "compressFiles": "Fájlok tömörítése", - "compressFilesDesc": "Tömörítsen {{count}} elemet archívumba", - "archiveName": "Archívum neve", - "enterArchiveName": "Adja meg az archívum nevét...", - "compressionFormat": "Tömörítési formátum", - "selectedFiles": "Kiválasztott fájlok", - "andMoreFiles": "és {{count}} több...", - "compress": "Borogatás", - "compressingFiles": "{{count}} elem tömörítése {{name}}...", - "filesCompressedSuccessfully": "{{name}} sikeresen létrehozva", - "compressFailed": "Sikertelen tömörítés", - "edit": "Szerkesztés", - "preview": "Előnézet", - "previous": "Előző", - "next": "Következő", - "pageXOfY": "{{total}} oldalból a {{current}} oldal", - "zoomOut": "Kicsinyítés", - "zoomIn": "Nagyítás", - "newFile": "Új fájl", - "newFolder": "Új mappa", - "rename": "Átnevezés", - "uploading": "Feltöltés...", - "uploadingFile": "Feltöltés {{name}}...", - "fileName": "Fájlnév", - "folderName": "Mappa neve", - "fileUploadedSuccessfully": "A(z) \"{{name}}\" fájl feltöltése sikeresen megtörtént.", - "failedToUploadFile": "Nem sikerült feltölteni a fájlt", - "fileDownloadedSuccessfully": "A(z) \"{{name}}\" fájl sikeresen letöltve", - "failedToDownloadFile": "Nem sikerült letölteni a fájlt", - "fileCreatedSuccessfully": "A(z) \"{{name}}\" fájl sikeresen létrehozva", - "folderCreatedSuccessfully": "A(z) \"{{name}}\" mappa sikeresen létrehozva", - "failedToCreateItem": "Nem sikerült létrehozni az elemet", - "operationFailed": "{{operation}} művelet sikertelen a következőhöz: {{name}}: {{error}}", - "failedToResolveSymlink": "Nem sikerült feloldani a szimbolikus linket", - "itemsDeletedSuccessfully": "{{count}} elem sikeresen törölve", - "failedToDeleteItems": "Nem sikerült törölni az elemeket", - "sudoPasswordRequired": "Rendszergazdai jelszó szükséges", - "enterSudoPassword": "Írja be a sudo jelszót a művelet folytatásához", - "sudoPassword": "Sudo jelszó", - "sudoOperationFailed": "Sudo művelet sikertelen", - "sudoAuthFailed": "Sudo hitelesítés sikertelen", - "dragFilesToUpload": "Húzd ide a fájlokat a feltöltéshez", - "emptyFolder": "Ez a mappa üres", - "searchFiles": "Fájlok keresése...", - "upload": "Feltöltés", - "selectHostToStart": "Válasszon ki egy gazdagépet a fájlkezelés megkezdéséhez", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "A fájlkezelő SSH-t igényel. Ezen a gazdagépen nincs engedélyezve az SSH.", - "failedToConnect": "Nem sikerült csatlakozni az SSH-hoz", - "failedToLoadDirectory": "Nem sikerült betölteni a könyvtárat", - "noSSHConnection": "Nincs elérhető SSH-kapcsolat", - "copy": "Másolat", - "cut": "Vágott", - "paste": "Paszta", - "copyPath": "Útvonal másolása", - "copyPaths": "Útvonalak másolása", - "delete": "Töröl", - "properties": "Tulajdonságok", - "refresh": "Frissítés", - "downloadFiles": "{{count}} fájlok letöltése böngészőbe", - "copyFiles": "{{count}} elem másolása", - "cutFiles": "{{count}} elem kivágása", - "deleteFiles": "{{count}} elem törlése", - "filesCopiedToClipboard": "{{count}} elem másolva a vágólapra", - "filesCutToClipboard": "{{count}} elem a vágólapra vágva", - "pathCopiedToClipboard": "Útvonal a vágólapra másolva", - "pathsCopiedToClipboard": "{{count}} elérési utak másolva a vágólapra", - "failedToCopyPath": "Nem sikerült a vágólapra másolni az elérési utat", - "movedItems": "Áthelyezett {{count}} elem", - "failedToDeleteItem": "Nem sikerült törölni az elemet", - "itemRenamedSuccessfully": "{{type}} átnevezése sikeresen megtörtént", - "failedToRenameItem": "Nem sikerült átnevezni az elemet", - "download": "Letöltés", - "permissions": "Engedélyek", - "size": "Méret", - "modified": "Módosított", - "path": "Útvonal", - "confirmDelete": "Biztosan törölni szeretnéd ezt: {{name}}?", - "permissionDenied": "Engedély megtagadva", - "serverError": "Szerverhiba", - "fileSavedSuccessfully": "Fájl mentése sikeresen megtörtént", - "failedToSaveFile": "Nem sikerült menteni a fájlt", - "confirmDeleteSingleItem": "Biztosan véglegesen törölni szeretnéd a(z) \"{{name}} \" fájlt?", - "confirmDeleteMultipleItems": "Biztosan véglegesen törölni szeretnéd a(z) {{count}} elemet?", - "confirmDeleteMultipleItemsWithFolders": "Biztosan véglegesen törölni szeretnéd a(z) {{count}} elemet? Ez a mappákat és azok tartalmát is tartalmazza.", - "confirmDeleteFolder": "Biztosan véglegesen törölni szeretné a(z) \"{{name}}\" mappát és annak teljes tartalmát?", - "permanentDeleteWarning": "Ez a művelet nem vonható vissza. Az elem(ek) véglegesen törlődnek a szerverről.", - "recent": "Legutóbbi", - "pinned": "Rögzítve", - "folderShortcuts": "Mappa parancsikonok", - "failedToReconnectSSH": "Nem sikerült újracsatlakozni az SSH-munkamenethez", - "openTerminalHere": "Nyissa meg a terminált itt", - "run": "Fut", - "openTerminalInFolder": "Nyissa meg a terminált ebben a mappában", - "openTerminalInFileLocation": "Nyissa meg a terminált a fájl helyén", - "runningFile": "Futás - {{file}}", - "onlyRunExecutableFiles": "Csak futtatható fájlokat futtathat", - "directories": "Könyvtárak", - "removedFromRecentFiles": "Eltávolította a(z) „{{name}}” elemet a legutóbbi fájlok közül", - "removeFailed": "Eltávolítás sikertelen", - "unpinnedSuccessfully": "A(z) \"{{name}}\" rögzítésének feloldása sikeresen megtörtént.", - "unpinFailed": "Feloldás sikertelen", - "removedShortcut": "Eltávolította a(z) \"{{name}} \" parancsikont", - "removeShortcutFailed": "A parancsikon eltávolítása sikertelen", - "clearedAllRecentFiles": "Az összes legutóbbi fájl törölve", - "clearFailed": "Törlés sikertelen", - "removeFromRecentFiles": "Eltávolítás a legutóbbi fájlok közül", - "clearAllRecentFiles": "Az összes legutóbbi fájl törlése", - "unpinFile": "Fájl rögzítésének feloldása", - "removeShortcut": "Parancsikon eltávolítása", - "pinFile": "Fájl rögzítése", - "addToShortcuts": "Hozzáadás a parancsikonokhoz", - "pasteFailed": "Beillesztés sikertelen", - "noUndoableActions": "Nincsenek visszavonható műveletek", - "undoCopySuccess": "Visszavont másolási művelet: Törölt {{count}} másolt fájlok", - "undoCopyFailedDelete": "Visszavonás sikertelen: Nem sikerült törölni a másolt fájlokat", - "undoCopyFailedNoInfo": "Visszavonás sikertelen: Nem találhatók másolt fájlinformációk", - "undoMoveSuccess": "Visszavont áthelyezési művelet: {{count}} fájl visszahelyezése az eredeti helyére", - "undoMoveFailedMove": "Visszavonás sikertelen: Nem sikerült visszahelyezni a fájlokat", - "undoMoveFailedNoInfo": "Visszavonás sikertelen: Nem találhatók áthelyezett fájlinformációk", - "undoDeleteNotSupported": "A törlési művelet nem vonható vissza: A fájlok véglegesen törölve lettek a szerverről.", - "undoTypeNotSupported": "Nem támogatott visszavonási művelettípus", - "undoOperationFailed": "A visszavonási művelet sikertelen", - "unknownError": "Ismeretlen hiba", - "confirm": "Megerősítés", - "find": "Lelet...", - "replace": "Csere", - "downloadInstead": "Letöltés helyett", - "keyboardShortcuts": "Billentyűparancsok", - "searchAndReplace": "Keresés és csere", - "editing": "Szerkesztés", - "search": "Keresés", - "findNext": "Következő keresése", - "findPrevious": "Előző keresése", - "save": "Megtakarítás", - "selectAll": "Összes kijelölése", - "undo": "Visszavonás", - "redo": "Újra", - "moveLineUp": "Sor felfelé mozgatása", - "moveLineDown": "Sor mozgatása lejjebb", - "toggleComment": "Hozzászólás be-/kikapcsolása", - "autoComplete": "Automatikus kiegészítés", - "imageLoadError": "Nem sikerült betölteni a képet", - "startTyping": "Kezdj el gépelni...", - "unknownSize": "Ismeretlen méret", - "fileIsEmpty": "A fájl üres", - "largeFileWarning": "Nagy fájlra vonatkozó figyelmeztetés", - "largeFileWarningDesc": "A fájl mérete {{size}} , ami teljesítményproblémákat okozhat szövegként megnyitva.", - "fileNotFoundAndRemoved": "A(z) „{{name}}” fájl nem található, és eltávolításra került a legutóbbi/rögzített fájlok közül.", - "failedToLoadFile": "Nem sikerült betölteni a fájlt: {{error}}", - "serverErrorOccurred": "Szerverhiba történt. Kérjük, próbálja meg később.", - "autoSaveFailed": "Automatikus mentés sikertelen", - "fileAutoSaved": "Fájl automatikusan mentve", - "moveFileFailed": "Nem sikerült áthelyezni {{name}}", - "moveOperationFailed": "Áthelyezési művelet sikertelen", - "canOnlyCompareFiles": "Csak két fájlt lehet összehasonlítani", - "comparingFiles": "Fájlok összehasonlítása: {{file1}} és {{file2}}", - "dragFailed": "Húzási művelet sikertelen", - "filePinnedSuccessfully": "A(z) „{{name}}” fájl rögzítése sikeresen megtörtént.", - "pinFileFailed": "Nem sikerült rögzíteni a fájlt", - "fileUnpinnedSuccessfully": "A(z) „{{name}}” fájl rögzítése sikeresen feloldva", - "unpinFileFailed": "Nem sikerült feloldani a fájl rögzítését", - "shortcutAddedSuccessfully": "A(z) „{{name}}” mappa parancsikonja sikeresen hozzáadva", - "addShortcutFailed": "Nem sikerült hozzáadni a parancsikont", - "operationCompletedSuccessfully": "{{operation}} {{count}} elem sikeresen", - "operationCompleted": "{{operation}} {{count}} elem", - "downloadFileSuccess": "A {{name}} fájl sikeresen letöltve", - "downloadFileFailed": "Letöltés sikertelen", - "moveTo": "Áthelyezés ide: {{name}}", - "diffCompareWith": "Különbség összehasonlítása {{name}}-val", - "dragOutsideToDownload": "Húzd az ablakon kívülre a letöltéshez ({{count}} fájl)", - "newFolderDefault": "Új mappa", - "newFileDefault": "ÚjFájl.txt", - "successfullyMovedItems": "{{count}} elem sikeresen áthelyezve ide: {{target}}", - "move": "Mozog", - "searchInFile": "Keresés a fájlban (Ctrl+F)", - "showKeyboardShortcuts": "Billentyűparancsok megjelenítése", - "startWritingMarkdown": "Kezdj el írni a Markdown tartalmaidat...", - "loadingFileComparison": "Fájl-összehasonlítás betöltése...", - "reload": "Újratöltés", - "compare": "Összehasonlítás", - "sideBySide": "Egymás mellett", - "inline": "Beágyazott", - "fileComparison": "Fájl-összehasonlítás: {{file1}} vs {{file2}}", - "fileTooLarge": "A fájl túl nagy: {{error}}", - "sshConnectionFailed": "SSH kapcsolat sikertelen. Kérjük, ellenőrizze a kapcsolatot a következővel: {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Nem sikerült betölteni a fájlt: {{error}}", - "connecting": "Kapcsolódás...", - "connectedSuccessfully": "Sikeres csatlakozás", - "totpVerificationFailed": "TOTP-ellenőrzés sikertelen", - "warpgateVerificationFailed": "Warpgate hitelesítés sikertelen", - "authenticationFailed": "Hitelesítés sikertelen", - "verificationCodePrompt": "Ellenőrző kód:", - "changePermissions": "Engedélyek módosítása", - "currentPermissions": "Jelenlegi engedélyek", - "owner": "Tulajdonos", - "group": "Csoport", - "others": "Mások", - "read": "Olvas", - "write": "Írás", - "execute": "Végrehajtás", - "permissionsChangedSuccessfully": "Engedélyek sikeresen módosítva", - "failedToChangePermissions": "Nem sikerült módosítani az engedélyeket", - "name": "Név", - "sortByName": "Név", - "sortByDate": "Módosítás dátuma", - "sortBySize": "Méret", - "ascending": "Növekvő", - "descending": "Csökkenő", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Gyökér", "new": "Új", "sortBy": "Rendezés alapja", @@ -1139,20 +1335,20 @@ "editor": "Szerkesztő", "octal": "Oktális", "storage": "Tárolás", - "disk": "Korong", - "used": "Használt", - "of": "a", - "toggleSidebar": "Oldalsáv be- és kikapcsolása", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "Nem tudom betölteni a PDF-et", "pdfLoadError": "Hiba történt a PDF fájl betöltésekor.", "loadingPdf": "PDF betöltése...", "loadingPage": "Oldal betöltése..." }, "transfer": { - "copyToHost": "Másolás a… gazdagépre", - "moveToHost": "Áthelyezés a… gazdagépre", - "copyItemsToHost": "Másolja a {{count}} elemet a… hosztba", - "moveItemsToHost": "Mozgass {{count}} elemet a… tárhelyre", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Nincsenek más elérhető fájlkezelő gazdagépek.", "noHostsConnectedHint": "Adjon hozzá egy másik SSH-hosztot, amelynél a Fájlkezelő engedélyezve van a Host Managerben.", "selectDestinationHost": "Célállomás kiválasztása", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Legutóbbi úti célok kibontása", "browseFolders": "Célmappák böngészése", "browseDestination": "Böngészés vagy elérési út megadása", - "confirmCopy": "Másolat", - "confirmMove": "Mozog", - "transferring": "… átvitele", - "compressing": "Tömörítés…", - "extracting": "… kinyerése", - "transferringItems": "{{current}} {{total}} elem… átvitele", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Átvitel befejezve", "transferError": "Átvitel sikertelen", - "transferPartial": "Az átvitel {{count}} hibával fejeződött be.", - "transferPartialHint": "Nem sikerült átvinni: {{paths}}", - "itemsSummary": "{{count}} elem", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Több elem átviteléhez a célnak egy könyvtárnak kell lennie", "selectThisFolder": "Jelölje ki ezt a mappát", "browsePathWillBeCreated": "Ez a mappa még nem létezik. Létrejön, amikor az átvitel megkezdődik.", "browsePathError": "Nem sikerült megnyitni ezt az elérési utat a célgépen.", "goUp": "Felmegy", - "copyFolderToHost": "Mappa másolása a… gazdagépre", - "moveFolderToHost": "Mappa áthelyezése a… gazdagépre", - "hostReady": "Kész", - "hostConnecting": "… csatlakoztatása", - "hostDisconnected": "Nincs csatlakoztatva", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Hitelesítés szükséges — először nyissa meg a Fájlkezelőt ezen a gépen", - "hostConnectionFailed": "Kapcsolódás sikertelen", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Átszállási idők", - "metricsPrepare": "Célhely előkészítése: {{duration}}", - "metricsCompress": "Tömörítés forráskód szerint: {{duration}}", - "metricsHopSourceRead": "Forrás → szerver: {{throughput}}", - "metricsHopDestSftpWrite": "Szerver → cél (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Szerver → cél (helyi): {{throughput}}", - "metricsTransfer": "Végtől végig: {{throughput}} ({{duration}})", - "metricsExtract": "Kivonat a rendeltetési helyen: {{duration}}", - "metricsSourceDelete": "Eltávolítás a forrásból: {{duration}}", - "metricsTotal": "Összesen: {{duration}}", - "progressCompressing": "Tömörítés a forrásgépen…", - "progressExtracting": "Kibontás a célállomáson…", - "progressTransferring": "Adatátvitel…", - "progressReconnecting": "Újracsatlakozás…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Párhuzamos átszállósávok", - "parallelSegmentsOption": "{{count}} sávok", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "A nagy fájlokat 256 MB-os darabokra osztja a rendszer. Több sáv külön kapcsolatokat használ (például több átvitel indítása) a nagyobb összátviteli sebesség érdekében.", - "progressTotalSpeed": "{{speed}} összesen ({{lanes}} sávok)", - "progressTransferringItems": "Fájlok átvitele ({{current}} / {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} fájlok", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Forrásfájlok megtartása (részleges átvitel)", "jumpHostLimitation": "Mindkét gépnek elérhetőnek kell lennie a Termix szerverről. A közvetlen gépközi útvonalválasztás nem támogatott.", - "cancel": "Mégsem", + "cancel": "Cancel", "methodLabel": "Átviteli módszer", "methodAuto": "Autó", "methodTar": "Tar archívum", @@ -1216,25 +1412,25 @@ "methodAutoHint": "A fájlok száma, mérete és tömöríthetősége alapján választja ki a tar vagy a fájlonkénti SFTP protokollt. Az egyes fájlok mindig folyamatos SFTP-t használnak.", "methodTarHint": "Tömörítés a forráskódban, egy archívum átvitele, kibontás a célkódban. Tar fájlt igényel mindkét Unix gépen.", "methodItemSftpHint": "Minden fájlt külön-külön átvihet SFTP-n keresztül. Minden gazdagépen működik, beleértve a Windowst is.", - "methodPreviewLoading": "Átviteli módszer kiszámítása…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Nem sikerült megtekinteni az átviteli módot. A szerver továbbra is kiválaszt egy módszert az indításkor.", "methodPreviewWillUseTar": "Felhasználás: Tar archívum", "methodPreviewWillUseItemSftp": "Használat: Fájlonkénti SFTP", - "methodPreviewScanSummary": "{{fileCount}} fájl, {{totalSize}} összesen (a forrásgépen beolvasva).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Minden fájl ugyanazt az SFTP-folyamot használja, mint egyetlen fájl másolata, egymás után. A folyamat az összes fájlban összevonódik, így a sáv lassan mozog nagy fájlok esetén.", "methodReason": { "user_item_sftp": "Fájlonkénti SFTP-t választottál.", "user_tar": "A tar archívumot választottad.", "tar_unavailable": "A Tar nem érhető el az egyik vagy mindkét hoszton – helyette fájlonkénti SFTP-t fog használni.", "windows_host": "Egy Windows gazdagép érintett – tar-t nem használunk.", - "auto_multi_large": "Automatikus: több fájl, beleértve egy nagy fájlt ({{largestSize}}) tömöríthető adatokkal — a tar egyetlen átvitelbe csomagolja.", - "auto_single_large_in_archive": "Automatikus: egy nagy fájl ({{largestSize}}) ebben a készletben — fájlonként SFTP.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automatikus: többnyire tömöríthetetlen adatok — fájlonkénti SFTP.", - "auto_many_files": "Auto: sok fájl ({{fileCount}}) — a tar csökkenti a fájlonkénti terhelést.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automatikus: fájlonkénti SFTP ehhez a készlethez." }, - "progressCancel": "Mégsem", - "progressCancelling": "Törlés…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Elakadt", "resumedHint": "Újracsatlakozva egy másik ablakban indított aktív átvitelhez.", "transferCancelled": "Átutalás törölve", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Néhány részleges fájlt nem sikerült eltávolítani", "cleanupDestFilesNothing": "Nincs mit takarítani a célállomáson", "cleanupDestFilesError": "Sikertelen takarítás", - "retryTransfer": "Újrapróbálkozás", + "retryTransfer": "Retry", "retryTransferError": "Újrapróbálkozás sikertelen", "transferFailedRetryHint": "Részleges adatok maradtak a célállomáson. Az újrapróbálkozás a kapcsolat helyreállásakor folytatódik." }, "tunnels": { - "noSshTunnels": "Nincsenek SSH alagutak", - "createFirstTunnelMessage": "Még nem hozott létre SSH alagutakat. A kezdéshez konfigurálja az alagútkapcsolatokat a Host Managerben.", - "connected": "Csatlakoztatva", - "disconnected": "Szétkapcsolt", - "connecting": "Kapcsolódás...", - "error": "Hiba", - "canceling": "Lemondás...", - "connect": "Csatlakozás", - "disconnect": "Leválasztás", - "cancel": "Mégsem", - "port": "Kikötő", - "localPort": "Helyi kikötő", - "remotePort": "Távoli port", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Jelenlegi host port", - "endpointPort": "Végponti port", + "endpointPort": "Endpoint Port", "bindIp": "Helyi IP-cím", - "endpointSshConfig": "Végpont SSH konfiguráció", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Végpont SSH-gazdagép", "endpointSshHostPlaceholder": "Válasszon ki egy konfigurált gazdagépet", "endpointSshHostRequired": "Válasszon ki egy végponti SSH-hosztot minden kliens alagúthoz.", - "attempt": "{{current}} kísérlet a {{max}}-ből", - "nextRetryIn": "Következő újrapróbálkozás {{seconds}} másodperc múlva", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Ügyfél alagutak", "clientTunnel": "Ügyfél alagút", "addClientTunnel": "Ügyfélalagút hozzáadása", "noClientTunnels": "Nincsenek kliens alagutak konfigurálva ezen az asztalon.", - "tunnelName": "Alagút neve", - "remoteHost": "Távoli gép", - "autoStart": "Automatikus indítás", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Akkor indul el, amikor ez az asztali kliens megnyílik és csatlakoztatva marad.", "clientManualStartDesc": "Használd a Start és Stop gombokat ebből a sorból. A Termix nem nyitja meg automatikusan.", "clientRemoteServerNote": "A távoli továbbításhoz szükség lehet az AllowTcpForwarding és a GatewayPorts paraméterekre a végponti SSH-kiszolgálón. A távoli port bezárul, amikor ez az asztal lecsatlakozik.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "A távoli portnak 1 és 65535 között kell lennie.", "invalidLocalTargetPort": "A helyi célportnak 1 és 65535 között kell lennie.", "invalidEndpointPort": "A végpont portjának 1 és 65535 között kell lennie.", - "duplicateAutoStartBind": "Csak egy automatikusan induló kliens alagút használhatja a {{bind}} kapcsolót.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Nem sikerült frissíteni az alagút állapotát.", - "active": "Aktív", - "start": "Indul", + "active": "Active", + "start": "Start", "stop": "Stop", - "test": "Teszt", - "type": "Alagút típusa", - "typeLocal": "Helyi (-L)", - "typeRemote": "Távoli (-R)", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Dinamikus (-D)", "typeServerLocalDesc": "Aktuális gazdagéptől a végpontig.", "typeServerRemoteDesc": "Végpont vissza az aktuális gazdagépre.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Végpont vissza a helyi számítógépre.", "typeClientDynamicDesc": "SOCKS a helyi számítógépen.", "typeDynamicDesc": "SOCKS5 CONNECT forgalom továbbítása SSH-n keresztül", - "forwardDescriptionServerLocal": "Aktuális hoszt {{sourcePort}} → végpont {{endpointPort}}.", - "forwardDescriptionServerRemote": "Végpont {{endpointPort}} → aktuális gazdagép {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS a jelenlegi gépen {{sourcePort}}.", - "forwardDescriptionClientLocal": "Helyi {{sourcePort}} → távoli {{endpointPort}}.", - "forwardDescriptionClientRemote": "Távoli {{sourcePort}} → helyi {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS a helyi {{sourcePort}} porton.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → ZOKNIK {{endpoint}}-on keresztül", - "autoNameClientLocal": "Lokális {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → helyi {{localPort}}", - "autoNameClientDynamic": "ZOKNIK {{localPort}} via {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Útvonal:", "lastStarted": "Utolsó indítás", "lastTested": "Utolsó tesztelés", "lastError": "Utolsó hiba", - "maxRetries": "Max. újrapróbálkozások", + "maxRetries": "Max Retries", "maxRetriesDescription": "Az újrapróbálkozások maximális száma.", - "retryInterval": "Újrapróbálkozási intervallum (másodperc)", - "retryIntervalDescription": "Várakozási idő az újrapróbálkozások között.", - "local": "Helyi", - "remote": "Távoli", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Rendeltetési hely", "host": "Házigazda", "mode": "Mód", - "noHostSelected": "Nincs kiválasztva gazdagép", + "noHostSelected": "No host selected", "working": "Dolgozó..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Memória", - "disk": "Korong", - "network": "Hálózat", - "uptime": "Üzemidő", - "processes": "Folyamatok", - "available": "Elérhető", - "free": "Ingyenes", - "connecting": "Kapcsolódás...", - "connectionFailed": "Nem sikerült csatlakozni a szerverhez", - "naCpus": "Nincs CPU", - "cpuCores_one": "{{count}} Mag", - "cpuCores_other": "{{count}} Magok", - "cpuUsage": "CPU-használat", - "memoryUsage": "Memóriahasználat", - "diskUsage": "Lemezhasználat", - "failedToFetchHostConfig": "Nem sikerült lekérni a gazdagép konfigurációját", - "serverOffline": "Szerver offline állapotban", - "cannotFetchMetrics": "Nem lehet metrikákat lekérni az offline szerverről", - "totpFailed": "TOTP-ellenőrzés sikertelen", - "noneAuthNotSupported": "A kiszolgáló statisztikái nem támogatják a „nincs” hitelesítési típust.", - "load": "Terhelés", - "systemInfo": "Rendszerinformációk", - "hostname": "Gazdagépnév", - "operatingSystem": "Operációs rendszer", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "másodperc", - "networkInterfaces": "Hálózati interfészek", - "noInterfacesFound": "Nem találhatók hálózati interfészek", - "noProcessesFound": "Nem találhatók folyamatok", - "loginStats": "SSH bejelentkezési statisztikák", - "noRecentLoginData": "Nincsenek friss bejelentkezési adatok", - "executingQuickAction": "{{name}} végrehajtása ...", - "quickActionSuccess": "{{name}} sikeresen befejeződött", - "quickActionFailed": "{{name}} sikertelen", - "quickActionError": "Nem sikerült végrehajtani a {{name}} parancsot.", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Figyelő portok", - "protocol": "Jegyzőkönyv", - "port": "Kikötő", - "address": "Cím", - "process": "Folyamat", - "noData": "Nincsenek figyelőport-adatok" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Minden", + "noData": "No listening ports data" }, "firewall": { - "title": "Tűzfal", - "inactive": "Inaktív", - "policy": "Politika", - "rules": "szabályok", - "noData": "Nincsenek elérhető tűzfaladatok", - "action": "Akció", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Kikötő", - "source": "Forrás", - "anywhere": "Bárhol" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Átlagos betöltés", "swap": "Csere", "architecture": "Építészet", - "refresh": "Frissítés", - "retry": "Újrapróbálkozás" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Dolgozó...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Saját üzemeltetésű SSH és távoli asztalkezelés", - "loginTitle": "Bejelentkezés a Termixbe", - "registerTitle": "Fiók létrehozása", - "forgotPassword": "Elfelejtett jelszó?", - "rememberMe": "Eszköz megjegyzése 30 napig (TOTP-t is tartalmaz)", - "noAccount": "Nincs fiókod?", - "hasAccount": "Már van fiókod?", - "twoFactorAuth": "Kétfaktoros hitelesítés", - "enterCode": "Írja be az ellenőrző kódot", - "backupCode": "Vagy használjon biztonsági kódot", - "verifyCode": "Kód ellenőrzése", - "redirectingToApp": "Átirányítás az alkalmazáshoz...", - "sshAuthenticationRequired": "SSH-hitelesítés szükséges", - "sshNoKeyboardInteractive": "Billentyűzet-interaktív hitelesítés nem érhető el", - "sshAuthenticationFailed": "Hitelesítés sikertelen", - "sshAuthenticationTimeout": "Hitelesítési időtúllépés", - "sshNoKeyboardInteractiveDescription": "A szerver nem támogatja a billentyűzet-interaktív hitelesítést. Kérjük, adja meg jelszavát vagy SSH-kulcsát.", - "sshAuthFailedDescription": "A megadott hitelesítő adatok helytelenek voltak. Kérjük, próbálkozzon újra érvényes hitelesítő adatokkal.", - "sshTimeoutDescription": "A hitelesítési kísérlet időtúllépést okozott. Kérjük, próbálja újra.", - "sshProvideCredentialsDescription": "Kérjük, adja meg SSH hitelesítő adatait a szerverhez való csatlakozáshoz.", - "sshPasswordDescription": "Add meg az SSH-kapcsolat jelszavát.", - "sshKeyPasswordDescription": "Ha az SSH-kulcsa titkosított, adja meg itt a jelszót.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Jelszó szükséges", "passphraseRequiredDescription": "Az SSH-kulcs titkosított. Kérjük, adja meg a jelszót a feloldáshoz.", - "back": "Vissza", - "firstUser": "Első felhasználó", - "firstUserMessage": "Te vagy az első felhasználó, és rendszergazda leszel. Az adminisztrátori beállításokat az oldalsáv felhasználói legördülő menüjében tekintheted meg. Ha úgy gondolod, hogy ez egy hiba, ellenőrizd a Docker naplókat, vagy hozz létre egy GitHub-problémát.", - "external": "Külső", - "loginWithExternal": "Bejelentkezés külső szolgáltatóval", - "loginWithExternalDesc": "Bejelentkezés a konfigurált külső identitásszolgáltató használatával", - "externalNotSupportedInElectron": "Az Electron alkalmazás egyelőre nem támogatja a külső hitelesítést. Kérjük, használja a webes verziót az OIDC bejelentkezéshez.", - "resetPasswordButton": "Jelszó visszaállítása", - "sendResetCode": "Visszaállítási kód küldése", - "resetCodeDesc": "Add meg a felhasználóneved, hogy jelszó-visszaállító kódot kapj. A kód a Docker konténer naplóiban lesz rögzítve.", - "resetCode": "Kód visszaállítása", - "verifyCodeButton": "Kód ellenőrzése", - "enterResetCode": "Írja be a felhasználó 6 számjegyű kódját a Docker konténer naplóiból:", - "newPassword": "Új jelszó", - "confirmNewPassword": "Jelszó megerősítése", - "enterNewPassword": "Írja be az új jelszavát a következő felhasználóhoz:", - "signUp": "Regisztráció", - "desktopApp": "Asztali alkalmazás", - "loggingInToDesktopApp": "Bejelentkezés az asztali alkalmazásba", - "loadingServer": "Szerver betöltése...", - "dataLossWarning": "A jelszó ilyen módon történő visszaállítása törli az összes mentett SSH-hosztot, hitelesítő adatot és egyéb titkosított adatot. Ez a művelet nem vonható vissza. Csak akkor használja ezt a funkciót, ha elfelejtette jelszavát, és nincs bejelentkezve.", - "authenticationDisabled": "Hitelesítés letiltva", - "authenticationDisabledDesc": "Jelenleg minden hitelesítési módszer le van tiltva. Kérjük, vegye fel a kapcsolatot a rendszergazdával.", - "attemptsRemaining": "{{count}} próbálkozás van hátra" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSH host kulcs ellenőrzése", - "keyChangedWarning": "SSH állomáskulcs megváltozott", - "firstConnectionTitle": "Első csatlakozás ehhez a gazdagéphez", - "firstConnectionDescription": "A gazdagép hitelessége nem állapítható meg. Ellenőrizze, hogy az ujjlenyomat megfelel-e a vártnak.", - "keyChangedDescription": "A szerver host key-je megváltozott az utolsó csatlakozás óta. Ez biztonsági problémára utalhat.", - "previousKey": "Előző kulcs", - "newFingerprint": "Új ujjlenyomat", - "fingerprint": "Ujjlenyomat", - "verifyInstructions": "Ha megbízik ebben a gazdagépben, kattintson az Elfogadás gombra a folytatáshoz és az ujjlenyomat mentéséhez a jövőbeli kapcsolatokhoz.", - "securityWarning": "Biztonsági figyelmeztetés", - "acceptAndContinue": "Elfogadom és folytatom", - "acceptNewKey": "Új kulcs elfogadása és folytatás" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Nem sikerült csatlakozni az adatbázishoz", - "unknownError": "Ismeretlen hiba", - "loginFailed": "Bejelentkezés sikertelen", - "failedPasswordReset": "Nem sikerült elindítani a jelszó-visszaállítást", - "failedVerifyCode": "Nem sikerült ellenőrizni a visszaállítási kódot", - "failedCompleteReset": "Nem sikerült befejezni a jelszó visszaállítását", - "invalidTotpCode": "Érvénytelen TOTP-kód", - "failedOidcLogin": "Nem sikerült elindítani az OIDC bejelentkezést", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Csendes bejelentkezést kértek, de az OIDC bejelentkezés nem érhető el.", "failedUserInfo": "Bejelentkezés után nem sikerült lekérni a felhasználói adatokat", - "oidcAuthFailed": "OIDC hitelesítés sikertelen", - "invalidAuthUrl": "Érvénytelen engedélyezési URL érkezett a háttérrendszertől", - "requiredField": "Ez a mező kötelező", - "minLength": "A minimális hossz {{min}}", - "passwordMismatch": "A jelszavak nem egyeznek", - "passwordLoginDisabled": "A felhasználónév/jelszó bejelentkezés jelenleg le van tiltva.", - "sessionExpired": "Lejárt a munkamenet - kérjük, jelentkezzen be újra", - "totpRateLimited": "Korlátozott sebesség: Túl sok TOTP ellenőrzési kísérlet. Kérjük, próbálja újra később.", - "totpRateLimitedWithTime": "Korlátozott sebesség: Túl sok TOTP ellenőrzési kísérlet. Kérjük, várjon {{time}} másodpercet, mielőtt újra próbálkozna.", - "resetCodeRateLimited": "Korlátozott sebesség: Túl sok ellenőrzési kísérlet. Kérjük, próbálja újra később.", - "resetCodeRateLimitedWithTime": "Korlátozott sebesség: Túl sok ellenőrzési kísérlet. Kérjük, várjon {{time}} másodpercet, mielőtt újra próbálkozik.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Nem sikerült menteni a hitelesítési tokent", "failedToLoadServer": "Nem sikerült betölteni a szervert" }, "messages": { - "registrationDisabled": "Az új fiók regisztrációját jelenleg egy adminisztrátor letiltotta. Kérjük, jelentkezzen be, vagy vegye fel a kapcsolatot egy adminisztrátorral.", - "userNotAllowed": "A fiókod nem jogosult a regisztrációra. Kérjük, vedd fel a kapcsolatot egy rendszergazdával.", - "databaseConnectionFailed": "Nem sikerült csatlakozni az adatbázis-kiszolgálóhoz", - "resetCodeSent": "Docker naplókba küldött kód visszaállítása", - "codeVerified": "Kód sikeresen ellenőrizve", - "passwordResetSuccess": "Jelszó visszaállítása sikeresen megtörtént", - "loginSuccess": "Bejelentkezés sikeres", - "registrationSuccess": "Regisztráció sikeres" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Konfigurált SSH-hosztokat célzó helyi asztali alagutak.", "c2sTunnelPresets": "Kliens alagút előbeállításai", "c2sTunnelPresetsDesc": "Mentse el az asztali kliens helyi alagútlistáját elnevezett kiszolgálói előbeállításként, vagy töltsön be egy előbeállítást vissza ebbe a kliensbe.", "c2sTunnelPresetsUnavailable": "Az ügyfélalagút-előbeállítások csak az asztali kliensben érhetők el.", - "c2sPresetName": "Előbeállítás neve", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Ügyfél előre beállított neve", "c2sPresetToLoad": "Betöltendő előbeállítás", "c2sNoPresetSelected": "Nincs kiválasztva előre beállított érték", "c2sNoPresets": "Nincsenek mentett előbeállítások", - "c2sLoadPreset": "Terhelés", - "c2sCurrentLocalConfig": "{{count}} helyi kliens alagút(ok) konfigurálva ezen az asztalon.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Az előbeállítások explicit pillanatképek; egyik betöltése felülírja az asztali kliens helyi kliens alagútlistáját.", "c2sPresetSaved": "Kliens alagút előre beállított értéke mentve", "c2sPresetLoaded": "A kliens alagút presetje helyben betöltött", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Nyelv", - "keyPassword": "kulcs jelszó", - "pastePrivateKey": "Illeszd be ide a privát kulcsodat...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (helyben hallgatható)", "localTargetHost": "127.0.0.1 (cél ezen a számítógépen)", "socksListenerHost": "127.0.0.1 (SOCKS figyelő)", - "enterPassword": "Írja be a jelszavát", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Műszerfal", - "loading": "Irányítópult betöltése...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Támogatás", - "discord": "Viszály", - "serverOverview": "Szerver áttekintése", - "version": "Változat", - "upToDate": "Naprakész", - "updateAvailable": "Frissítés elérhető", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Béta", - "uptime": "Üzemidő", - "database": "Adatbázis", - "healthy": "Egészséges", - "error": "Hiba", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "Összes házigazda", - "totalTunnels": "Összes alagutak", - "totalCredentials": "Összes hitelesítő adat", - "recentActivity": "Legutóbbi tevékenységek", - "reset": "Visszaállítás", - "loadingRecentActivity": "Legutóbbi tevékenységek betöltése...", - "noRecentActivity": "Nincs friss tevékenység", - "quickActions": "Gyors műveletek", - "addHost": "Gazdagép hozzáadása", - "addCredential": "Hitelesítő adat hozzáadása", - "adminSettings": "Adminisztrátori beállítások", - "userProfile": "Felhasználói profil", - "serverStats": "Szerver statisztikák", - "loadingServerStats": "Szerverstatisztikák betöltése...", - "noServerData": "Nincsenek elérhető szerveradatok", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Irányítópult testreszabása", - "dashboardSettings": "Irányítópult beállításai", - "enableDisableCards": "Kártyák engedélyezése/letiltása", - "resetLayout": "Alapértelmezett visszaállítás", - "serverOverviewCard": "Szerver áttekintése", - "recentActivityCard": "Legutóbbi tevékenységek", - "networkGraphCard": "Hálózati gráf", - "networkGraph": "Hálózati gráf", - "quickActionsCard": "Gyors műveletek", - "serverStatsCard": "Szerver statisztikák", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Fő", "panelSide": "Oldal", - "justNow": "éppen most" + "justNow": "éppen most", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABIL", @@ -1591,296 +1891,431 @@ "online": "ONLINE", "offline": "OFFLINE", "onlineLower": "Online", - "nodes": "{{count}} csomópontok", + "nodes": "{{count}} nodes", "add": "Hozzáadás:", "commandPalette": "Parancspaletta", "done": "Kész", "editModeInstructions": "Kártyák húzásával átrendezheted a sorrendet · Az oszlopelválasztó húzásával átméretezheted az oszlopokat · A kártya alsó szélének húzásával átméretezheted a magasságát · A kukába helyezéssel eltávolíthatod", "empty": "Üres", - "clear": "Világos" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Gazdagép hozzáadása", - "addGroup": "Csoport hozzáadása", - "addLink": "Link hozzáadása", - "zoomIn": "Nagyítás", - "zoomOut": "Kicsinyítés", - "resetView": "Nézet visszaállítása", - "selectHost": "Válasszon gazdagépet", - "chooseHost": "Válassz egy tárhelyszolgáltatót...", - "parentGroup": "Szülőcsoport", - "noGroup": "Nincs csoport", - "groupName": "Csoport neve", - "color": "Szín", - "source": "Forrás", - "target": "Cél", - "moveToGroup": "Áthelyezés csoportba", - "selectGroup": "Csoport kiválasztása...", - "addConnection": "Kapcsolat hozzáadása", - "hostDetails": "Gazdagép adatai", - "removeFromGroup": "Eltávolítás a csoportból", - "addHostHere": "Gazdagép hozzáadása ide", - "editGroup": "Csoport szerkesztése", - "delete": "Töröl", - "add": "Hozzáadás", - "create": "Teremt", - "move": "Mozog", - "connect": "Csatlakozás", - "createGroup": "Csoport létrehozása", - "selectSourcePlaceholder": "Forrás kiválasztása...", - "selectTargetPlaceholder": "Cél kiválasztása...", - "invalidFile": "Érvénytelen fájl", - "hostAlreadyExists": "A gazdagép már szerepel a topológiában", - "connectionExists": "A kapcsolat már létezik", - "unknown": "Ismeretlen", - "name": "Név", - "ip": "IP-cím", - "status": "Állapot", - "failedToAddNode": "Nem sikerült hozzáadni a csomópontot", - "sourceDifferentFromTarget": "A forrásnak és a célnak eltérőnek kell lennie", - "exportJSON": "JSON exportálása", - "importJSON": "JSON importálása", - "terminal": "Terminál", - "fileManager": "Fájlkezelő", - "tunnel": "Alagút", - "docker": "Dokkmunkás", - "serverStats": "Szerver statisztikák", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Még nincsenek csomópontok" }, "docker": { - "notEnabled": "A Docker nincs engedélyezve ehhez a gazdagéphez", - "validating": "Docker érvényesítése...", - "connecting": "Kapcsolódás...", - "error": "Hiba", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Nem sikerült csatlakozni a Dockerhez", - "containerStarted": "{{name}} konténer elindítva", - "failedToStartContainer": "Nem sikerült elindítani a(z) {{name}} konténert", - "containerStopped": "Konténer {{name}} leállítva", - "failedToStopContainer": "Nem sikerült leállítani a(z) {{name}} konténert", - "containerRestarted": "{{name}} konténer újraindítva", - "failedToRestartContainer": "Nem sikerült újraindítani a konténert {{name}}", - "containerPaused": "{{name}} konténer szünetel", - "containerUnpaused": "{{name}} konténer szüneteltetése feloldva", - "failedToTogglePauseContainer": "Nem sikerült a szüneteltetési állapotot be- és kikapcsolni a következő konténernél: {{name}}", - "containerRemoved": "{{name}} konténer eltávolítva", - "failedToRemoveContainer": "Nem sikerült eltávolítani a(z) {{name}} konténert", - "image": "Kép", - "ports": "kikötők", - "noPorts": "Nincsenek portok", - "start": "Indul", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", - "runningContainerWarning": "Figyelmeztetés: Ez a konténer jelenleg fut. Eltávolítása először a konténer leállítását jelenti.", - "loadingContainers": "Konténerek betöltése...", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker-kezelő", - "autoRefresh": "Automatikus frissítés", + "autoRefresh": "Auto Refresh", "timestamps": "Időbélyegek", "lines": "Vonalak", - "filterLogs": "Naplók szűrése...", - "refresh": "Frissítés", - "download": "Letöltés", - "clear": "Világos", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Naplók sikeresen letöltve", "last50": "Utolsó 50", "last100": "Utolsó 100", "last500": "Utolsó 500", "last1000": "Utolsó 1000", "allLogs": "Minden napló", - "noLogsMatching": "Nincsenek a következőnek megfelelő naplók: \"{{query}}\"", - "noLogsAvailable": "Nincsenek elérhető naplók", - "noContainersFound": "Nem találhatók konténerek", - "noContainersFoundHint": "Nincsenek elérhető Docker konténerek ezen a gazdagépen", - "searchPlaceholder": "Konténerek keresése...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Minden állapot", - "stateRunning": "Futás", + "stateRunning": "Running", "statePaused": "Szüneteltetett", "stateExited": "Kilépett", "stateRestarting": "Újraindítás", - "noContainersMatchFilters": "Egyetlen tároló sem felel meg a szűrőknek", - "noContainersMatchFiltersHint": "Próbálja meg módosítani a keresési vagy szűrési feltételeket", - "failedToFetchStats": "Nem sikerült lekérni a konténer statisztikáit", - "containerNotRunning": "A konténer nem működik", - "startContainerToViewStats": "Indítsa el a konténert a statisztikák megtekintéséhez", - "loadingStats": "Statisztikák betöltése...", - "errorLoadingStats": "Hiba a statisztikák betöltése során", - "noStatsAvailable": "Nincsenek elérhető statisztikák", - "cpuUsage": "CPU-használat", - "current": "Jelenlegi", - "memoryUsage": "Memóriahasználat", - "networkIo": "Hálózati I/O", - "input": "Bemenet", - "output": "Kimenet", - "blockIo": "Blokk I/O", - "read": "Olvas", - "write": "Írás", - "pids": "PID-ek", - "containerInformation": "Konténerinformációk", - "name": "Név", - "id": "azonosító", - "state": "Állami", - "containerMustBeRunning": "A konténernek futnia kell a konzol eléréséhez", - "verificationCodePrompt": "Írja be az ellenőrző kódot", - "totpVerificationFailed": "A TOTP ellenőrzése sikertelen. Próbáld újra.", - "warpgateVerificationFailed": "A Warpgate hitelesítése sikertelen. Próbáld újra.", - "connectedTo": "Csatlakoztatva ehhez: {{containerName}}", - "disconnected": "Szétkapcsolt", - "consoleError": "Konzolhiba", - "errorMessage": "Hiba: {{message}}", - "failedToConnect": "Nem sikerült csatlakozni a konténerhez", - "console": "Konzol", - "selectShell": "Válassza ki a héjat", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "hamu", - "connect": "Csatlakozás", - "disconnect": "Leválasztás", - "notConnected": "Nincs csatlakoztatva", - "clickToConnect": "Kattintson a Csatlakozás gombra a shell munkamenet elindításához", - "connectingTo": "Kapcsolódás ehhez: {{containerName}}...", - "containerNotFound": "A konténer nem található", - "backToList": "Vissza a listához", - "logs": "Naplók", - "stats": "Statisztikák", - "consoleTab": "Konzol", - "startContainerToAccess": "Indítsa el a konténert a konzol eléréséhez" + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Általános", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Felhasználók", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Munkamenetek", - "sectionRoles": "Szerepkörök", - "sectionDatabase": "Adatbázis", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API-kulcsok", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Szűrők törlése", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Minden", "allowRegistration": "Felhasználói regisztráció engedélyezése", - "allowRegistrationDesc": "Új felhasználók önregisztrációjának engedélyezése", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Jelszó bejelentkezés engedélyezése", "allowPasswordLoginDesc": "Felhasználónév/jelszó bejelentkezés", "oidcAutoProvision": "OIDC automatikus kiépítés", - "oidcAutoProvisionDesc": "Automatikus fiókok létrehozása OIDC-felhasználók számára, még akkor is, ha a regisztráció le van tiltva", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Jelszó-visszaállítás engedélyezése", "allowPasswordResetDesc": "Kód visszaállítása Docker naplókon keresztül", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Munkamenet időkorlátja", - "hours": "órák", + "hours": "hours", "sessionTimeoutRange": "Minimum 1 óra · Max. 720 óra", - "monitoringDefaults": "Monitorozási alapértelmezések", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Állapotellenőrzés", - "metrics": "Metrikák", + "metrics": "Metrics", "sec": "másodperc", "logLevel": "Naplózási szint", "enableGuacamole": "Guacamole engedélyezése", "enableGuacamoleDesc": "RDP/VNC távoli asztal", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "OpenID Connect konfigurálása SSO-hoz. A csillaggal (*) jelölt mezők kitöltése kötelező.", - "oidcClientId": "Ügyfél-azonosító", - "oidcClientSecret": "Ügyféltitkos kód", - "oidcAuthUrl": "Engedélyezési URL", - "oidcIssuerUrl": "Kibocsátó URL-címe", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", "oidcTokenUrl": "Token URL", - "oidcUserIdentifier": "Felhasználói azonosító útvonala", - "oidcDisplayName": "Megjelenített név útvonala", - "oidcScopes": "Hatókör", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Felhasználói adatok URL-címének felülbírálása", - "oidcAllowedUsers": "Engedélyezett felhasználók", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Egy e-mail cím soronként. Hagyja üresen, ha az összeset engedélyezi.", - "removeOidc": "Eltávolítás", - "usersCount": "{{count}} felhasználó", - "createUser": "Teremt", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Új szerepkör", - "roleName": "Név", - "roleDisplayName": "Megjelenített név", - "roleDescription": "Leírás", - "rolesCount": "{{count}} szerepkörök", - "createRole": "Teremt", - "creating": "Létrehozás...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Adatbázis exportálása", "exportDatabaseDesc": "Töltsön le egy biztonsági másolatot az összes gazdagépről, hitelesítő adatokról és beállításokról", "export": "Export", - "exporting": "Exportálás...", + "exporting": "Exporting...", "importDatabase": "Adatbázis importálása", "importDatabaseDesc": "Visszaállítás .sqlite biztonsági mentésfájlból", - "importDatabaseSelected": "Kiválasztva: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Fájl kiválasztása", - "changeFile": "Változás", - "import": "Importálás", - "importing": "Importálás...", - "apiKeysCount": "{{count}} billentyűk", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Új API-kulcs", "apiKeyCreatedWarning": "Kulcs létrehozva - másolja le most, nem fog újra megjelenni.", - "apiKeyName": "Név", - "apiKeyUser": "Felhasználó", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Válasszon ki egy felhasználót...", - "apiKeyExpiresAt": "Lejár ekkor:", + "apiKeyExpiresAt": "Expires At", "createKey": "Kulcs létrehozása", "apiKeyNoExpiry": "Nincs lejárati idő", "revokedBadge": "VISSZAVONVA", - "authTypeDual": "Kettős hitelesítés", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Helyi", - "adminStatusAdministrator": "Adminisztrátor", - "adminStatusRegularUser": "Rendszeres felhasználó", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMINISZTRÁCIÓ", "systemBadge": "RENDSZER", "customBadge": "SZOKÁS", "youBadge": "TE", - "sessionsActive": "{{count}} aktív", - "sessionActive": "Aktív: {{time}}", - "sessionExpires": "Lejárati idő: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "Minden", "revokeAllSessionsSuccess": "A felhasználó összes munkamenete visszavonva", - "revokeAllSessionsFailed": "Nem sikerült visszavonni a munkameneteket", - "revokeSessionFailed": "Nem sikerült visszavonni a munkamenetet", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Szerepkör hozzáadása", "noCustomRoles": "Nincsenek definiált egyéni szerepkörök", - "removeRoleFailed": "Nem sikerült eltávolítani a szerepkört", - "assignRoleFailed": "Nem sikerült hozzárendelni a szerepkört", - "deleteRoleFailed": "Nem sikerült törölni a szerepkört", - "userAdminAccess": "Adminisztrátor", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Teljes hozzáférés az összes adminisztrátori beállításhoz", - "userRoles": "Szerepkörök", - "revokeAllUserSessions": "Összes munkamenet visszavonása", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Újrabejelentkezés kényszerítése minden eszközön", - "revoke": "Visszavonás", + "revoke": "Revoke", "deleteUserWarning": "A felhasználó törlése végleges.", - "deleteUser": "Törlés {{username}}", - "deleting": "Törlés...", - "deleteUserFailed": "Nem sikerült törölni a felhasználót", - "deleteUserSuccess": "„{{username}}” felhasználó törölve", - "deleteRoleSuccess": "„{{name}}” szerepkör törölve", - "revokeKeySuccess": "A \"{{name}}\" kulcs visszavonva", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Nem sikerült visszavonni a kulcsot", - "copiedToClipboard": "Vágólapra másolva", + "copiedToClipboard": "Copied to clipboard", "done": "Kész", - "createUserTitle": "Felhasználó létrehozása", + "createUserTitle": "Create User", "createUserDesc": "Hozz létre egy új helyi fiókot.", - "createUserUsername": "Felhasználónév", - "createUserPassword": "Jelszó", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Minimum 6 karakter.", - "createUserEnterUsername": "Felhasználónév megadása", - "createUserEnterPassword": "Jelszó megadása", - "createUserSubmit": "Felhasználó létrehozása", - "editUserTitle": "Felhasználó kezelése: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Szerkesztheti a szerepköröket, az adminisztrátori állapotot, a munkameneteket és a fiókbeállításokat.", - "editUserUsername": "Felhasználónév", + "editUserUsername": "Username", "editUserAuthType": "Aut. típus", - "editUserAdminStatus": "Adminisztrátori állapot", - "editUserUserId": "Felhasználói azonosító", - "linkAccountTitle": "OIDC összekapcsolása Jelszófiókkal", - "linkAccountDesc": "Egyesítsd az OIDC fiókot {{username}} egy meglévő helyi fiókkal.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Ez a következőket fogja eredményezni:", "linkAccountEffect1": "Csak OIDC-t tartalmazó fiók törlése", "linkAccountEffect2": "OIDC bejelentkezés hozzáadása a célfiókhoz", "linkAccountEffect3": "OIDC és jelszó bejelentkezésének engedélyezése", - "linkAccountTargetUsername": "Cél felhasználónév", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Add meg a helyi fiók felhasználónevét a csatoláshoz", - "linkAccounts": "Fiókok összekapcsolása", - "linkAccountSuccess": "OIDC-fiók összekapcsolva a következővel: \"{{username}}\"", - "linkAccountFailed": "Nem sikerült összekapcsolni az OIDC-fiókot", - "linkAccountInProgress": "Összekapcsolás...", - "saving": "Megtakarítás...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Nem sikerült frissíteni a regisztrációs beállításokat", "updatePasswordLoginFailed": "Nem sikerült frissíteni a jelszó bejelentkezési beállítását", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Nem sikerült frissíteni az OIDC automatikus kiépítési beállítását", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Nem sikerült frissíteni a jelszó-visszaállítási beállítást", "sessionTimeoutRange2": "A munkamenet időkorlátjának 1 és 720 óra között kell lennie.", "sessionTimeoutSaved": "Munkamenet időkorlátja mentve", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Érvénytelen intervallumértékek", "monitoringSaved": "Monitorozási beállítások mentve", "monitoringSaveFailed": "Nem sikerült menteni a megfigyelési beállításokat", - "guacamoleSaved": "Guacamole beállítások mentve", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Nem sikerült menteni a guacamole beállításait", "guacamoleUpdateFailed": "Nem sikerült frissíteni a guacamole beállítást", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Nem sikerült frissíteni a naplózási szintet", "oidcSaved": "OIDC konfiguráció mentése", "oidcSaveFailed": "Nem sikerült menteni az OIDC konfigurációt", "oidcRemoved": "OIDC konfiguráció eltávolítva", "oidcRemoveFailed": "Nem sikerült eltávolítani az OIDC konfigurációt", "createUserRequired": "Felhasználónév és jelszó szükséges", - "createUserPasswordTooShort": "A jelszónak legalább 6 karakterből kell állnia", - "createUserSuccess": "„{{username}}” felhasználó létrehozva", - "createUserFailed": "Nem sikerült létrehozni a felhasználót", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Nem sikerült frissíteni az adminisztrátori állapotot", "allSessionsRevoked": "Minden munkamenet visszavonva", - "revokeSessionsFailed": "Nem sikerült visszavonni a munkameneteket", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Név és megjelenített név megadása kötelező", - "createRoleSuccess": "\"{{name}}\" szerepkör létrehozva", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Nem sikerült létrehozni a szerepkört", "apiKeyNameRequired": "Kulcsnév megadása kötelező", "apiKeyUserRequired": "Felhasználói azonosító megadása kötelező", - "apiKeyCreatedSuccess": "„{{name}}” API-kulcs létrehozva", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Nem sikerült létrehozni az API-kulcsot", "exportSuccess": "Az adatbázis exportálása sikeresen megtörtént", "exportFailed": "Adatbázis exportálása sikertelen", "importSelectFile": "Kérjük, először válasszon ki egy fájlt", - "importCompleted": "Importálás befejezve: {{total}} elem importálva, {{skipped}} kihagyva", - "importFailed": "Importálás sikertelen: {{error}}", - "importError": "Adatbázis importálása sikertelen" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Adatbázis importálása sikertelen", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Házigazda", - "hostPlaceholder": "192.168.1.1 vagy example.com", - "portLabel": "Kikötő", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Felhasználónév", - "usernamePlaceholder": "felhasználónév", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Aut.", - "passwordLabel": "Jelszó", - "passwordPlaceholder": "jelszó", - "privateKeyLabel": "Privát kulcs", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Privát kulcs beillesztése...", - "credentialLabel": "Hitelesítő adat", + "credentialLabel": "Credential", "credentialPlaceholder": "Válasszon ki egy mentett hitelesítő adatot", - "connectToTerminal": "Csatlakozás a terminálhoz", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Kapcsolódás fájlokhoz" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Összes törlése", "noHistoryEntries": "Nincsenek előzménybejegyzések", "trackingDisabled": "Az előzmények követése le van tiltva", - "trackingDisabledHint": "Engedélyezd a profilbeállításaidban a parancsok rögzítését." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Kulcsfelvétel", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Felvétel terminálokra", "selectAll": "Minden", - "selectNone": "Egyik sem", + "selectNone": "None", "noTerminalTabsOpen": "Nincsenek megnyitott terminálfülek", "selectTerminalsAbove": "Válassza ki a fenti terminálokat", "broadcastInputPlaceholder": "Írjon ide a billentyűleütések küldéséhez...", "stopRecording": "Felvétel leállítása", "startRecording": "Felvétel indítása", - "settingsTitle": "Beállítások", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Jobb klikkes másolás/beillesztés engedélyezése" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "Húzza a lapokat a fenti panelekbe, vagy használja a Gyors hozzárendelés funkciót", "dropHere": "Dobd ide", "emptyPane": "Üres", - "dashboard": "Műszerfal", + "dashboard": "Dashboard", "clearSplitScreen": "Tiszta osztott képernyő", "quickAssign": "Gyors hozzárendelés", - "alreadyAssigned": "{{index}} panel", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Osztott lap", "addToSplit": "Hozzáadás Splithez", "removeFromSplit": "Eltávolítás a felosztásból", - "assignToPane": "Hozzárendelés panelhez" + "assignToPane": "Hozzárendelés panelhez", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Kódrészlet létrehozása", - "createSnippetDescription": "Hozzon létre egy új parancsrészletet a gyors végrehajtáshoz", - "nameLabel": "Név", - "namePlaceholder": "pl. Indítsd újra az Nginx-et", - "descriptionLabel": "Leírás", - "descriptionPlaceholder": "Opcionális leírás", - "optional": "Választható", - "folderLabel": "Mappa", - "noFolder": "Nincs mappa (Nincs kategorizálva)", - "commandLabel": "Parancs", - "commandPlaceholder": "Pl.: sudo systemctl indítsa újra az nginx-et", - "cancel": "Mégsem", - "createSnippetButton": "Kódrészlet létrehozása", - "createFolderTitle": "Mappa létrehozása", - "createFolderDescription": "Rendezd a kódrészleteket mappákba", - "folderNameLabel": "Mappa neve", - "folderNamePlaceholder": "pl. rendszerparancsok, Docker szkriptek", - "folderColorLabel": "Mappa színe", - "folderIconLabel": "Mappa ikon", - "previewLabel": "Előnézet", - "folderNameFallback": "Mappa neve", - "createFolderButton": "Mappa létrehozása", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Célterminálok", "selectAll": "Minden", - "selectNone": "Egyik sem", + "selectNone": "None", "noTerminalTabsOpen": "Nincsenek megnyitott terminálfülek", - "searchPlaceholder": "Keresési kódrészletek...", - "newSnippet": "Új részlet", - "newFolder": "Új mappa", - "run": "Fut", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Nincsenek kódrészletek ebben a mappában", - "uncategorized": "Kategorizálatlan", - "editSnippetTitle": "Kódrészlet szerkesztése", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Frissítse ezt a parancsrészletet", "saveSnippetButton": "Változtatások mentése", - "createSuccess": "A kódrészlet sikeresen létrehozva", - "createFailed": "Nem sikerült létrehozni a kódrészletet", - "updateSuccess": "A részlet sikeresen frissítve", - "updateFailed": "Nem sikerült frissíteni a kódrészletet", - "deleteFailed": "Nem sikerült törölni a részletet", - "folderCreateSuccess": "Mappa sikeresen létrehozva", - "folderCreateFailed": "Nem sikerült létrehozni a mappát", - "editFolderTitle": "Mappa szerkesztése", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Nevezze át vagy módosítsa a mappa megjelenését", "saveFolderButton": "Változtatások mentése", "editFolder": "Mappa szerkesztése", "deleteFolder": "Mappa törlése", - "folderDeleteSuccess": "A(z) „{{name}}” mappa törölve", - "folderDeleteFailed": "Nem sikerült törölni a mappát", - "folderEditSuccess": "Mappa sikeresen frissítve", - "folderEditFailed": "Nem sikerült frissíteni a mappát", - "confirmRunMessage": "Futtassa a \"{{name}} \" programot?", - "confirmRunButton": "Fut", - "runSuccess": "Futtatta a következőt: \"{{name}}\" {{count}} terminál(ok)ban", - "copySuccess": "A(z) „{{name}}” a vágólapra másolva", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Részlet megosztása", - "shareUser": "Felhasználó", - "shareRole": "Szerep", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Válasszon ki egy felhasználót...", "selectRole": "Válasszon egy szerepet...", "shareSuccess": "A részlet sikeresen megosztva", "shareFailed": "Nem sikerült megosztani a részletet", "revokeSuccess": "Hozzáférés visszavonva", - "revokeFailed": "Nem sikerült visszavonni a hozzáférést", - "currentAccess": "Jelenlegi hozzáférés", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Nem sikerült betölteni a megosztott adatokat", - "loading": "Terhelés...", - "close": "Közeli", - "reorderFailed": "Nem sikerült menteni a kódrészlet sorrendjét" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Nem sikerült menteni a kódrészlet sorrendjét", + "importExport": "Importálás / Exportálás", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Nincsenek konfigurált gazdagépek", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Fiók", - "sectionAppearance": "Megjelenés", - "sectionSecurity": "Biztonság", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API-kulcsok", "sectionC2sTunnels": "C2S alagutak", - "usernameLabel": "Felhasználónév", - "roleLabel": "Szerep", - "roleAdministrator": "Adminisztrátor", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Aut. módszer", - "authMethodLocal": "Helyi", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "On", "twoFaOff": "Le", - "versionLabel": "Változat", - "deleteAccount": "Fiók törlése", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Fiók végleges törlése", - "deleteButton": "Töröl", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Ez a művelet végleges és nem vonható vissza.", "deleteAccountWarning": "Minden munkamenet, gazdagép, hitelesítő adat és beállítás véglegesen törlődik.", - "confirmPasswordDeletePlaceholder": "Írja be jelszavát a megerősítéshez", - "languageLabel": "Nyelv", - "themeLabel": "Téma", - "fontSizeLabel": "Betűméret", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "hangsúlyos szín", - "settingsTerminal": "Terminál", - "commandAutocomplete": "Parancs automatikus kiegészítése", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Automatikus kiegészítés megjelenítése gépelés közben", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Előzménykövetés", "historyTrackingDesc": "Terminálparancsok követés", - "syntaxHighlighting": "Szintaxis kiemelése", - "syntaxHighlightingDesc": "Jelölje ki a terminál kimenetét", "commandPalette": "Parancspaletta", "commandPaletteDesc": "Billentyűparancs engedélyezése", "reopenTabsOnLogin": "Lapok újranyitása bejelentkezéskor", "reopenTabsOnLoginDesc": "Állítsa vissza a megnyitott lapokat bejelentkezéskor vagy az oldal frissítésekor, akár egy másik eszközről is", "confirmTabClose": "Lap bezárásának megerősítése", "confirmTabCloseDesc": "Kérdezzen rá a terminálfülek bezárása előtt", - "settingsSidebar": "Oldalsáv", - "showHostTags": "Gazdagép címkék megjelenítése", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Címkék megjelenítése a gazdagépek listájában", "hostTrayOnClick": "Kattintson a Gazdagép-műveletek kibontásához", "hostTrayOnClickDesc": "Mindig jelenjenek meg a kapcsolat gombok; kattints a kezelési lehetőségek kibontásához az egérrel való mozgatás helyett", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Alkalmazássín rögzítése", "pinAppRailDesc": "A bal oldalsáv alkalmazássávjának mindig legyen kibontva, ne pedig az egérmutatóra történő kibontás esetén", - "settingsSnippets": "Kódrészletek", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Mappák összecsukva", "foldersCollapsedDesc": "Mappák összecsukása alapértelmezés szerint", "confirmExecution": "Végrehajtás megerősítése", "confirmExecutionDesc": "Kódrészletek futtatása előtti megerősítés", - "settingsUpdates": "Frissítések", + "settingsUpdates": "Updates", "disableUpdateChecks": "Frissítés-ellenőrzések letiltása", "disableUpdateChecksDesc": "Frissítések keresésének leállítása", "totpAuthenticator": "TOTP hitelesítő", @@ -2109,68 +2612,68 @@ "qrCode": "QR-kód", "totpInstructions": "Olvasd be a QR-kódot, vagy írd be a titkos kódot a hitelesítő alkalmazásodba, majd írd be a 6 jegyű kódot", "totpCodePlaceholder": "000000", - "verify": "Ellenőrzés", - "changePassword": "Jelszó módosítása", - "currentPasswordLabel": "Jelenlegi jelszó", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Jelenlegi jelszó", - "newPasswordLabel": "Új jelszó", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Új jelszó", "confirmPasswordLabel": "Új jelszó megerősítése", "confirmPasswordPlaceholder": "Új jelszó megerősítése", "updatePassword": "Jelszó frissítése", "createApiKeyTitle": "API-kulcs létrehozása", "createApiKeyDescription": "Új API-kulcs létrehozása programozott hozzáféréshez.", - "apiKeyNameLabel": "Név", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "pl. CI Pipeline", "expiryDateLabel": "Lejárati dátum", "optional": "választható", - "cancel": "Mégsem", + "cancel": "Cancel", "createKey": "Kulcs létrehozása", - "apiKeyCount": "{{count}} billentyűk", + "apiKeyCount": "{{count}} keys", "newKey": "Új kulcs", "noApiKeys": "Még nincsenek API-kulcsok.", - "apiKeyActive": "Aktív", + "apiKeyActive": "Active", "apiKeyUsageHint": "Tedd bele a kulcsodat", "apiKeyUsageHintHeader": "fejléc.", "apiKeyPermissionsHint": "A kulcsok öröklik a létrehozó felhasználó jogosultságait.", - "roleUser": "Felhasználó", - "authMethodDual": "Kettős hitelesítés", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Nem sikerült elindítani a TOTP beállítását", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Adjon meg egy 6 jegyű kódot", "totpEnabledSuccess": "Kétfaktoros hitelesítés engedélyezve", "totpInvalidCode": "Érvénytelen kód, kérjük, próbálja újra", "totpDisableInputRequired": "Add meg a TOTP kódodat vagy jelszavadat", - "totpDisabledSuccess": "Kétfaktoros hitelesítés letiltva", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "Nem sikerült letiltani a 2FA-t", - "totpDisableTitle": "2FA letiltása", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Írja be a TOTP kódot vagy jelszót", - "totpDisableConfirm": "2FA letiltása", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Tovább az ellenőrzéshez", - "totpVerifyTitle": "Kód ellenőrzése", - "totpBackupTitle": "Biztonsági kódok", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Tartalékkódok letöltése", "done": "Kész", "secretCopied": "Titkos kód a vágólapra másolva", "apiKeyNameRequired": "Kulcsnév megadása kötelező", - "apiKeyCreated": "„{{name}}” API-kulcs létrehozva", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Nem sikerült létrehozni az API-kulcsot", - "apiKeyUser": "Felhasználó", - "apiKeyExpires": "Lejár", - "apiKeyRevoked": "„{{name}}” API-kulcs visszavonva", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "Nem sikerült visszavonni az API-kulcsot", "passwordFieldsRequired": "A jelenlegi és az új jelszó megadása kötelező", - "passwordMismatch": "A jelszavak nem egyeznek", - "passwordTooShort": "A jelszónak legalább 6 karakterből kell állnia", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Jelszó sikeresen frissítve", "passwordUpdateFailed": "Nem sikerült frissíteni a jelszót", "deletePasswordRequired": "Jelszó szükséges a fiók törléséhez", - "deleteFailed": "Nem sikerült törölni a fiókot", - "deleting": "Törlés...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Színválasztó megnyitása", - "themeSystem": "Rendszer", - "themeLight": "Fény", - "themeDark": "Sötét", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Drakula", "themeCatppuccin": "Catppuccin", "themeNord": "Észak", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "éppen most", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Fül", + "backTab": "⇥", + "arrowUp": "Felfelé nyíl", + "arrowDown": "Lefelé mutató nyíl", + "arrowLeft": "Balra nyíl", + "arrowRight": "Jobbra nyíl", + "home": "Home", + "end": "Vége", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Kész" } } diff --git a/src/ui/locales/translated/id_ID.json b/src/ui/locales/translated/id_ID.json index 25de029b..2d699553 100644 --- a/src/ui/locales/translated/id_ID.json +++ b/src/ui/locales/translated/id_ID.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Folder", - "folder": "Map", - "password": "Kata sandi", - "key": "Kunci", - "sshPrivateKey": "Kunci Pribadi SSH", - "upload": "Mengunggah", - "keyPassword": "Kata Sandi Kunci", - "sshKey": "Kunci SSH", - "uploadPrivateKeyFile": "Unggah File Kunci Pribadi", - "searchCredentials": "Cari kredensial...", - "addCredential": "Tambahkan Kredensial", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "Sertifikat CA (-cert.pub)", "caCertificateDescription": "Opsional: Unggah atau tempel file sertifikat yang ditandatangani CA (misalnya id_ed25519-cert.pub). Diperlukan jika server SSH Anda menggunakan otorisasi berbasis sertifikat.", "uploadCertFile": "Unggah File -cert.pub", - "clearCert": "Jernih", + "clearCert": "Clear", "certLoaded": "Sertifikat telah dimuat.", "certPublicKeyLabel": "Sertifikat CA", "certTypeLabel": "Jenis sertifikat", "pasteOrUploadCert": "Tempel atau unggah sertifikat -cert.pub...", "hasCaCert": "Memiliki Sertifikat CA", - "noCaCert": "Tidak memiliki Sertifikat CA" + "noCaCert": "Tidak memiliki Sertifikat CA", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Urutan Default", + "sortNameAsc": "Nama (A → Z)", + "sortNameDesc": "Nama (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Hapus Filter", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Peringatan gagal dimuat.", - "failedToDismissAlert": "Gagal menutup peringatan" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Konfigurasi Server", - "description": "Konfigurasikan URL server Termix untuk terhubung ke layanan backend Anda.", - "serverUrl": "URL Server", - "enterServerUrl": "Silakan masukkan URL server", - "saveFailed": "Gagal menyimpan konfigurasi", - "saveError": "Terjadi kesalahan saat menyimpan konfigurasi.", - "saving": "Penghematan...", - "saveConfig": "Simpan Konfigurasi", - "helpText": "Masukkan URL tempat server Termix Anda berjalan (misalnya, http://localhost:30001 atau https://your-server.com)", - "changeServer": "Ubah Server", - "mustIncludeProtocol": "URL server harus diawali dengan http:// atau https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Izinkan sertifikat tidak valid", "allowInvalidCertificateDesc": "Gunakan hanya untuk server mandiri tepercaya dengan sertifikat yang ditandatangani sendiri atau sertifikat alamat IP.", - "useEmbedded": "Gunakan Server Lokal", - "embeddedDesc": "Jalankan Termix dengan server lokal bawaan (tidak memerlukan server jarak jauh)", - "embeddedConnecting": "Menghubungkan ke server lokal...", - "embeddedNotReady": "Server lokal belum siap. Mohon tunggu sebentar dan coba lagi.", - "localServer": "Server Lokal" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Server Lokal", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Kesalahan Pemeriksaan Versi", - "checkFailed": "Gagal memeriksa pembaruan.", - "upToDate": "Aplikasi sudah diperbarui.", - "currentVersion": "Anda menjalankan versi {{version}}", - "updateAvailable": "Pembaruan Tersedia", - "newVersionAvailable": "Versi baru tersedia! Anda menjalankan {{current}}, tetapi {{latest}} tersedia.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Versi Beta", - "betaVersionDesc": "Anda menjalankan {{current}}, yang lebih baru daripada rilis stabil terbaru {{latest}}.", - "releasedOn": "Dirilis pada {{date}}", - "downloadUpdate": "Unduh Pembaruan", - "checking": "Memeriksa pembaruan...", - "checkUpdates": "Periksa Pembaruan", - "checkingUpdates": "Memeriksa pembaruan...", - "updateRequired": "Pembaruan Diperlukan" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Menutup", - "minimize": "Memperkecil", - "online": "On line", + "close": "Close", + "minimize": "Minimize", + "online": "Online", "offline": "Offline", - "continue": "Melanjutkan", - "maintenance": "Pemeliharaan", - "degraded": "Terdegradasi", - "error": "Kesalahan", - "warning": "Peringatan", - "unsavedChanges": "Perubahan yang belum disimpan", - "dismiss": "Membubarkan", - "loading": "Memuat...", - "optional": "Opsional", - "connect": "Menghubungkan", - "copied": "Disalin", - "connecting": "Menghubungkan...", - "updateAvailable": "Pembaruan Tersedia", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Buka di Tab Baru", - "noReleases": "Tidak ada rilis", - "updatesAndReleases": "Pembaruan & Rilis", - "newVersionAvailable": "Versi baru ({{version}}) tersedia.", - "failedToFetchUpdateInfo": "Gagal mengambil informasi pembaruan.", - "preRelease": "Pra-rilis", - "noReleasesFound": "Tidak ada rilis yang ditemukan.", - "cancel": "Membatalkan", - "username": "Nama pengguna", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", "login": "Login", - "register": "Daftar", - "password": "Kata sandi", - "confirmPassword": "Konfirmasi Kata Sandi", - "back": "Kembali", - "save": "Menyimpan", - "saving": "Penghematan...", - "delete": "Menghapus", - "rename": "Ganti nama", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", "edit": "Edit", - "add": "Menambahkan", - "confirm": "Mengonfirmasi", - "no": "TIDAK", - "or": "ATAU", - "next": "Berikutnya", - "previous": "Sebelumnya", - "refresh": "Menyegarkan", - "language": "Bahasa", - "checking": "Sedang memeriksa...", - "checkingDatabase": "Memeriksa koneksi basis data...", - "checkingAuthentication": "Memeriksa autentikasi...", - "backendReconnected": "Koneksi server dipulihkan.", - "connectionDegraded": "Koneksi server terputus, sedang memulihkan…", - "reload": "Muat Ulang", - "remove": "Menghapus", - "create": "Membuat", - "update": "Memperbarui", - "copy": "Menyalin", - "copyFailed": "Gagal menyalin ke papan klip", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maksimalkan", "restore": "Memulihkan", - "of": "dari" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Rumah", + "home": "Home", "terminal": "Terminal", - "docker": "Buruh pelabuhan", + "docker": "Docker", "tunnels": "Tunnels", - "fileManager": "Pengelola File", - "serverStats": "Statistik Server", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "admin": "Admin", - "userProfile": "Profil Pengguna", - "splitScreen": "Layar Terpisah", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Tutup sesi aktif ini?", - "close": "Menutup", - "cancel": "Membatalkan", - "sshManager": "Manajer SSH", - "cannotSplitTab": "Tidak dapat memisahkan tab ini", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Salin Kata Sandi", - "copySudoPassword": "Salin Kata Sandi Sudo", - "passwordCopied": "Kata sandi disalin ke papan klip", - "noPasswordAvailable": "Tidak ada kata sandi yang tersedia", - "failedToCopyPassword": "Gagal menyalin kata sandi", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", "refreshTab": "Segarkan koneksi", - "openFileManager": "Buka Pengelola File", - "dashboard": "Dasbor", - "networkGraph": "Grafik Jaringan", - "quickConnect": "Koneksi Cepat", - "sshTools": "Alat SSH", - "history": "Sejarah", - "hosts": "Tuan rumah", - "snippets": "Cuplikan", - "hostManager": "Manajer Host", - "credentials": "Kredensial", - "connections": "Koneksi", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", "roleAdministrator": "Administrator", - "roleUser": "Pengguna" + "roleUser": "User" }, "hosts": { - "hosts": "Tuan rumah", - "noHosts": "Tidak ada Host SSH", - "retry": "Mencoba kembali", - "refresh": "Menyegarkan", - "optional": "Opsional", - "downloadSample": "Unduh Sampel", - "failedToDeleteHost": "Gagal menghapus {{name}}", - "importSkipExisting": "Impor (lewati yang sudah ada)", - "connectionDetails": "Detail Koneksi", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Desktop Jarak Jauh", - "port": "Pelabuhan", - "username": "Nama pengguna", - "folder": "Map", - "tags": "Tag", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", "pin": "Pin", - "addHost": "Tambahkan Host", + "addHost": "Add Host", "editHost": "Edit Host", - "cloneHost": "Kloning Host", - "enableTerminal": "Aktifkan Terminal", - "enableTunnel": "Aktifkan Tunnel", - "enableFileManager": "Aktifkan Pengelola File", - "enableDocker": "Aktifkan Docker", - "defaultPath": "Jalur Default", - "connection": "Koneksi", - "upload": "Mengunggah", - "authentication": "Autentikasi", - "password": "Kata sandi", - "key": "Kunci", - "credential": "Mandat", - "none": "Tidak ada", - "sshPrivateKey": "Kunci Pribadi SSH", - "keyType": "Jenis Kunci", - "uploadFile": "Unggah File", - "tabGeneral": "Umum", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Terowongan", - "tabDocker": "Buruh pelabuhan", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "Berkas", - "tabStats": "Statistik", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Membagikan", - "tabAuthentication": "Autentikasi", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunnel", - "fileManager": "Pengelola File", - "serverStats": "Statistik Server", + "fileManager": "File Manager", + "serverStats": "Host Metrics", "status": "Status", - "folderRenamed": "Folder \"{{oldName}}\" berhasil diganti namanya menjadi \"{{newName}}\"", - "failedToRenameFolder": "Gagal mengganti nama folder", - "movedToFolder": "Dipindahkan ke \"{{folder}}\"", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", "editHostTooltip": "Edit host", - "statusChecks": "Pemeriksaan Status", - "metricsCollection": "Pengumpulan Metrik", - "metricsInterval": "Interval Pengumpulan Metrik", - "metricsIntervalDesc": "Seberapa sering mengumpulkan statistik server (5 detik - 1 jam)", - "behavior": "Perilaku", - "themePreview": "Pratinjau Tema", - "theme": "Tema", - "fontFamily": "Keluarga Font", - "fontSize": "Ukuran Huruf", - "letterSpacing": "Jarak Antar Huruf", - "lineHeight": "Tinggi Baris", - "cursorStyle": "Gaya Kursor", - "cursorBlink": "Kedipan Kursor", - "scrollbackBuffer": "Buffer Gulir Balik", - "bellStyle": "Gaya Lonceng", - "rightClickSelectsWord": "Klik kanan memilih Word", - "fastScrollModifier": "Pengubah Gulir Cepat", - "fastScrollSensitivity": "Sensitivitas Gulir Cepat", - "sshAgentForwarding": "Penerusan Agen SSH", - "backspaceMode": "Mode Hapus", - "startupSnippet": "Cuplikan Startup", - "selectSnippet": "Pilih cuplikan", - "forceKeyboardInteractive": "Paksa Interaktif Keyboard", - "overrideCredentialUsername": "Ganti Nama Pengguna Kredensial", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Gunakan nama pengguna yang telah ditentukan di atas, bukan nama pengguna kredensial.", - "jumpHostChain": "Rantai Host Lompatan", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", - "addKnock": "Tambah Port", + "addKnock": "Add Port", "addProxyNode": "Tambahkan Node", - "proxyNode": "Node Proksi", - "proxyType": "Jenis Proksi", - "quickActions": "Tindakan Cepat", - "sudoPasswordAutoFill": "Isi Otomatis Kata Sandi Sudo", - "sudoPassword": "Kata Sandi Sudo", - "keepaliveInterval": "Interval Keepalive (ms)", - "moshCommand": "Komando MOSH", - "environmentVariables": "Variabel Lingkungan", - "addVariable": "Tambahkan Variabel", - "docker": "Buruh pelabuhan", - "copyTerminalUrl": "Salin URL Terminal", - "copyFileManagerUrl": "Salin URL Pengelola File", - "copyRemoteDesktopUrl": "Salin URL Remote Desktop", - "failedToConnect": "Gagal terhubung ke konsol", - "connect": "Menghubungkan", - "disconnect": "Memutuskan", - "start": "Awal", - "enableStatusCheck": "Aktifkan Pemeriksaan Status", - "enableMetrics": "Aktifkan Metrik", - "bulkUpdateFailed": "Pembaruan massal gagal", - "selectAll": "Pilih Semua", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Batalkan Pilihan Semua", "protocols": "Protokol", "secureShell": "Secure Shell", @@ -272,6 +303,9 @@ "unencryptedShell": "Shell yang tidak terenkripsi", "addressIp": "Alamat / IP", "friendlyName": "Nama yang Ramah", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Folder & Lanjutan", "privateNotes": "Catatan Pribadi", "privateNotesPlaceholder": "Detail tentang server ini...", @@ -281,18 +315,18 @@ "addKnockBtn": "Tambahkan Ketukan", "noPortKnocking": "Tidak ada port knocking yang dikonfigurasi.", "knockPort": "Lubang Ketuk", - "protocol": "Protokol", + "protocol": "Protocol", "delayAfterMs": "Penundaan Setelah (ms)", "useSocks5Proxy": "Gunakan Proxy SOCKS5", "useSocks5ProxyDesc": "Rute koneksi melalui server proxy.", - "proxyHost": "Host Proksi", - "proxyPort": "Port Proksi", - "proxyUsername": "Nama Pengguna Proksi", - "proxyPassword": "Kata Sandi Proksi", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Proksi Tunggal", - "proxyChainMode": "Rantai Proksi", + "proxyChainMode": "Proxy Chain", "you": "Anda", - "jumpHostChainLabel": "Rantai Host Lompatan", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Tambahkan Lompatan", "noJumpHosts": "Tidak ada jump host yang dikonfigurasi.", "selectAServer": "Pilih server...", @@ -300,10 +334,10 @@ "authMethod": "Metode Otentikasi", "storedCredential": "Kredensial Tersimpan", "selectACredential": "Pilih kredensial...", - "keyTypeLabel": "Jenis Kunci", - "keyTypeAuto": "Deteksi Otomatis", - "keyPasteTab": "Pasta", - "keyUploadTab": "Mengunggah", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Berkas kunci telah dimuat.", "keyUploadClick": "Klik untuk mengunggah file .pem / .key / .ppk", "clearKey": "Hapus kunci", @@ -311,59 +345,105 @@ "keyReplaceNotice": "Tempelkan kunci baru di bawah ini untuk menggantinya.", "keyPassphraseSaved": "Kata sandi tersimpan, ketik untuk mengubahnya", "replaceKey": "Ganti kunci", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Paksa Keyboard Interaktif", "forceKeyboardInteractiveShortDesc": "Paksa memasukkan kata sandi secara manual meskipun kunci tersedia.", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Tampilan Terminal", "colorTheme": "Tema Warna", - "fontFamilyLabel": "Keluarga Font", - "fontSizeLabel": "Ukuran Huruf", - "cursorStyleLabel": "Gaya Kursor", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Jarak Antar Huruf (px)", - "lineHeightLabel": "Tinggi Baris", - "bellStyleLabel": "Gaya Lonceng", - "backspaceModeLabel": "Mode Hapus", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Kursor Berkedip", "cursorBlinkingDesc": "Aktifkan animasi berkedip untuk kursor terminal.", "rightClickSelectsWordLabel": "Klik kanan Pilih Word", "rightClickSelectsWordShortDesc": "Pilih kata di bawah kursor dengan klik kanan.", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Penyorotan Sintaksis", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Cap waktu", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Perilaku & Tingkat Lanjut", - "scrollbackBufferLabel": "Buffer Gulir Balik", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Jumlah maksimum baris yang disimpan dalam riwayat", - "sshAgentForwardingLabel": "Penerusan Agen SSH", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Berikan kunci SSH lokal Anda ke host ini.", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Aktifkan Auto-Mosh", "enableAutoMoshDesc": "Lebih baik menggunakan Mosh daripada SSH jika tersedia.", "enableAutoTmux": "Aktifkan Auto-Tmux", "enableAutoTmuxDesc": "Secara otomatis meluncurkan atau terhubung ke sesi tmux.", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Isi Otomatis Kata Sandi Sudo", "sudoPasswordAutoFillShortDesc": "Secara otomatis memberikan kata sandi sudo saat diminta.", - "sudoPasswordLabel": "Kata Sandi Sudo", - "environmentVariablesLabel": "Variabel Lingkungan", - "addVariableBtn": "Tambahkan Variabel", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Tidak ada variabel lingkungan yang dikonfigurasi.", - "fastScrollModifierLabel": "Pengubah Gulir Cepat", - "fastScrollSensitivityLabel": "Sensitivitas Gulir Cepat", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Perintah Mosh", - "startupSnippetLabel": "Cuplikan Startup", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Interval Keepalive (detik)", "maxKeepaliveMisses": "Max Keepalive Gagal", "tunnelSettings": "Pengaturan Terowongan", "enableTunneling": "Aktifkan Tunneling", "enableTunnelingDesc": "Aktifkan fungsi terowongan SSH untuk host ini.", "serverTunnelsSection": "Terowongan Server", - "addTunnelBtn": "Tambahkan Terowongan", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Tidak ada terowongan yang dikonfigurasi.", - "tunnelLabel": "Terowongan {{number}}", - "tunnelType": "Jenis Tunnel", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Teruskan port lokal ke port pada server jarak jauh (atau host yang dapat dijangkau dari server tersebut).", "tunnelModeRemoteDesc": "Teruskan port pada server jarak jauh kembali ke port lokal pada mesin Anda.", "tunnelModeDynamicDesc": "Buat proxy SOCKS5 pada port lokal untuk penerusan port dinamis.", "sameHost": "Host ini (terowongan langsung)", "endpointHost": "Host Titik Akhir", - "endpointPort": "Port Titik Akhir", + "endpointPort": "Endpoint Port", "bindHost": "Host Terikat", - "sourcePort": "Port Sumber", - "maxRetries": "Jumlah Percobaan Maksimum", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Interval Percobaan Ulang (detik)", "autoStartLabel": "Mulai otomatis", "autoStartDesc": "Terowongan ini akan terhubung secara otomatis saat host dimuat.", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Gagal terhubung", "failedToDisconnectTunnel": "Gagal memutuskan koneksi", "dockerIntegration": "Integrasi Docker", - "enableDockerMonitor": "Aktifkan Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Pantau dan kelola kontainer di host ini melalui Docker.", - "enableFileManagerMonitor": "Aktifkan Pengelola File", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Jelajahi dan kelola file di host ini melalui SFTP.", - "defaultPathLabel": "Jalur Default", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "Direktori yang akan dibuka saat pengelola file diluncurkan untuk host ini.", - "statusChecksLabel": "Pemeriksaan Status", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Aktifkan Pemeriksaan Status", "enableStatusChecksDesc": "Lakukan ping secara berkala ke host ini untuk memverifikasi ketersediaan.", "useGlobalInterval": "Gunakan Interval Global", "useGlobalIntervalDesc": "Ganti dengan interval pemeriksaan status di seluruh server.", "checkIntervalS": "Interval Pemeriksaan (detik)", "checkIntervalDesc": "Detik antara setiap ping konektivitas", - "metricsCollectionLabel": "Pengumpulan Metrik", - "enableMetricsLabel": "Aktifkan Metrik", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Kumpulkan data penggunaan CPU, RAM, disk, dan jaringan dari host ini.", "useGlobalMetrics": "Gunakan Interval Global", "useGlobalMetricsDesc": "Ganti dengan interval metrik di seluruh server.", "metricsIntervalS": "Interval Metrik (detik)", "metricsIntervalDesc2": "Detik antara pengambilan snapshot metrik", "visibleWidgets": "Widget yang Terlihat", - "cpuUsageLabel": "Penggunaan CPU", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "Persentase CPU, rata-rata beban, grafik sparkline", - "memoryLabel": "Penggunaan Memori", + "memoryLabel": "Memory Usage", "memoryDesc": "Penggunaan RAM, swap, cache", - "storageLabel": "Penggunaan Disk", + "storageLabel": "Disk Usage", "storageDesc": "Penggunaan disk per titik pemasangan", - "networkLabel": "Antarmuka Jaringan", + "networkLabel": "Network Interfaces", "networkDesc": "Daftar antarmuka dan bandwidth", - "uptimeLabel": "Waktu aktif", + "uptimeLabel": "Uptime", "uptimeDesc": "Waktu aktif sistem dan waktu booting", "systemInfoLabel": "Informasi Sistem", "systemInfoDesc": "Sistem operasi, kernel, nama host, arsitektur", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Peristiwa login berhasil dan gagal", "topProcessesLabel": "Proses Teratas", "topProcessesDesc": "PID, CPU%, MEM%, perintah", - "listeningPortsLabel": "Port Pendengaran", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Buka port dengan proses dan status.", "firewallLabel": "Firewall", "firewallDesc": "Status Firewall, AppArmor, SELinux", - "quickActionsLabel": "Tindakan Cepat", - "quickActionsToolbar": "Tindakan cepat muncul sebagai tombol di bilah alat Statistik Server untuk eksekusi perintah sekali klik.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Belum ada tindakan cepat.", "buttonLabel": "Label tombol", "selectSnippetPlaceholder": "Pilih cuplikan...", "addActionBtn": "Tambahkan Tindakan", "hostSharedSuccessfully": "Host berhasil berbagi.", - "failedToShareHost": "Gagal berbagi host", + "failedToShareHost": "Failed to share host", "accessRevoked": "Akses dicabut", - "failedToRevokeAccess": "Gagal mencabut akses", - "cancelBtn": "Membatalkan", - "savingBtn": "Penghematan...", - "addHostBtn": "Tambahkan Host", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Host diperbarui", "hostCreated": "Host membuat", "failedToSave": "Gagal menyimpan host", "credentialUpdated": "Kredensial telah diperbarui.", "credentialCreated": "Kredensial telah dibuat.", - "failedToSaveCredential": "Gagal menyimpan kredensial", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Kembali ke Host", "backToCredentials": "Kembali ke Kredensial", - "pinned": "Disematkan", - "noHostsFound": "Tidak ada host yang ditemukan.", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Coba istilah lain", "addFirstHost": "Tambahkan host pertama Anda untuk memulai.", "noCredentialsFound": "Tidak ditemukan kredensial.", - "addCredentialBtn": "Tambahkan Kredensial", - "updateCredentialBtn": "Perbarui Kredensial", - "features": "Fitur", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Tidak ada folder)", - "deleteSelected": "Menghapus", + "deleteSelected": "Delete", "exitSelection": "Keluar dari pilihan", - "importSkip": "Impor (lewati yang sudah ada)", + "importSkip": "Import (skip existing)", "importOverwrite": "Impor (timpa)", "collapseBtn": "Runtuh", "importExportBtn": "Impor / Ekspor", "hostStatusesRefreshed": "Status host diperbarui", "failedToRefreshHosts": "Gagal memperbarui host", - "movedHostTo": "Memindahkan {{host}} ke \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Gagal memindahkan host", - "folderRenamedTo": "Folder diubah namanya menjadi \"{{name}}\"", - "deletedFolder": "Folder \"{{name}} \" telah dihapus", - "failedToDeleteFolder": "Gagal menghapus folder", - "deleteAllInFolder": "Hapus semua host di \"{{name}}\"? Ini tidak dapat dibatalkan.", - "deletedHost": "Dihapus {{name}}", - "copiedToClipboard": "Disalin ke papan klip", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Hapus folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Gagal memindahkan host", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "URL terminal disalin", "fileManagerUrlCopied": "URL Pengelola File disalin", "tunnelUrlCopied": "URL terowongan disalin", "dockerUrlCopied": "URL Docker disalin", - "serverStatsUrlCopied": "URL Statistik Server disalin", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "URL RDP disalin", "vncUrlCopied": "URL VNC disalin", "telnetUrlCopied": "URL Telnet disalin", @@ -471,109 +633,112 @@ "expandActions": "Perluas tindakan", "collapseActions": "Ciutkan tindakan", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Paket ajaib dikirim ke {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Gagal mengirim paket ajaib", - "cloneHostAction": "Kloning Host", + "cloneHostAction": "Clone Host", "copyAddress": "Salin Alamat", "copyLink": "Salin Tautan", - "copyTerminalUrlAction": "Salin URL Terminal", - "copyFileManagerUrlAction": "Salin URL Pengelola File", - "copyTunnelUrlAction": "Salin URL Terowongan", - "copyDockerUrlAction": "Salin URL Docker", - "copyServerStatsUrlAction": "Salin URL Statistik Server", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "Salin URL RDP", "copyVncUrlAction": "Salin URL VNC", "copyTelnetUrlAction": "Salin URL Telnet", - "copyRemoteDesktopUrlAction": "Salin URL Remote Desktop", - "deleteCredentialConfirm": "Hapus kredensial \"{{name}}\"?", - "deletedCredential": "Dihapus {{name}}", - "deploySSHKeyTitle": "Sebarkan Kunci SSH", - "deployingBtn": "Sedang melakukan penyebaran...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Menyebarkan", "failedToDeployKey": "Gagal menerapkan kunci", - "deleteHostsConfirm": "Hapus {{count}} host{{plural}}? Ini tidak dapat dibatalkan.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Dipindahkan ke root", - "failedToMoveHosts": "Gagal memindahkan host", - "enableTerminalFeature": "Aktifkan Terminal", - "disableTerminalFeature": "Nonaktifkan Terminal", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Aktifkan File", "disableFilesFeature": "Nonaktifkan File", "enableTunnelsFeature": "Aktifkan Terowongan", "disableTunnelsFeature": "Nonaktifkan Terowongan", - "enableDockerFeature": "Aktifkan Docker", - "disableDockerFeature": "Nonaktifkan Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Tambahkan tag...", "authDetails": "Detail Otentikasi", - "credType": "Jenis", + "credType": "Type", "generateKeyPairDesc": "Buat pasangan kunci baru, baik kunci privat maupun kunci publik akan terisi secara otomatis.", "generatingKey": "Sedang menghasilkan...", - "generateLabel": "Hasilkan {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Unggah file", "keyPassphraseOptional": "Kata Sandi Utama (Opsional)", "sshPublicKeyOptional": "Kunci Publik SSH (Opsional)", "publicKeyGenerated": "Kunci publik dihasilkan", "failedToGeneratePublicKey": "Gagal mendapatkan kunci publik.", "publicKeyCopied": "Kunci publik disalin", - "keyPairGenerated": "{{label}} pasangan kunci dihasilkan", - "failedToGenerateKeyPair": "Gagal menghasilkan pasangan kunci", - "searchHostsPlaceholder": "Cari host, alamat, tag…", - "searchCredentialsPlaceholder": "Cari kredensial…", - "refreshBtn": "Menyegarkan", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Tambahkan tag...", - "deleteConfirmBtn": "Menghapus", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "Server SSH harus memiliki pengaturan GatewayPorts yes, AllowTcpForwarding yes, dan PermitRootLogin yes di /etc/ssh/sshd_config.", - "deleteHostConfirm": "Hapus \"{{name}}\"?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Aktifkan setidaknya satu protokol di atas untuk mengkonfigurasi pengaturan otentikasi dan koneksi.", - "keyPassphrase": "Kata Sandi Kunci", - "connectBtn": "Menghubungkan", - "disconnectBtn": "Memutuskan", - "basicInformation": "Informasi Dasar", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Detail Otentikasi", - "credTypeLabel": "Jenis", - "hostsTab": "Tuan rumah", - "credentialsTab": "Kredensial", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Pilih beberapa", "selectHosts": "Pilih tuan rumah", - "connectionLabel": "Koneksi", - "authenticationLabel": "Autentikasi", - "generateKeyPairTitle": "Hasilkan Pasangan Kunci", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Buat pasangan kunci baru, baik kunci privat maupun kunci publik akan terisi secara otomatis.", - "generateFromPrivateKey": "Hasilkan dari Kunci Pribadi", - "refreshBtn2": "Menyegarkan", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Keluar dari pilihan", "exportAll": "Ekspor Semua", - "addHostBtn2": "Tambahkan Host", - "addCredentialBtn2": "Tambahkan Kredensial", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Memeriksa status host...", - "pinnedSection": "Disematkan", + "pinnedSection": "Pinned", "hostsExported": "Host berhasil diekspor.", "exportFailed": "Gagal mengekspor host", "sampleDownloaded": "File contoh yang diunduh", - "failedToDeleteCredential2": "Gagal menghapus kredensial", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Tidak ada folder)", - "nSelected": "{{count}} terpilih", - "featuresMenu": "Fitur", - "moveMenu": "Bergerak", - "cancelSelection": "Membatalkan", - "deployDialogDesc": "Sebarkan {{name}} ke authorized_keys host.", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", "targetHostLabel": "Target Host", "selectHostOption": "Pilih tuan rumah...", "keyDeployedSuccess": "Kunci berhasil diterapkan.", "failedToDeployKey2": "Gagal menerapkan kunci", - "deletedCount": "Host {{count}} yang dihapus", - "failedToDeleteCount": "Gagal menghapus {{count}} host", - "duplicatedHost": "Duplikat \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Gagal menduplikasi host", - "updatedCount": "Host {{count}} yang diperbarui", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Nama yang Ramah", - "descriptionLabel": "Keterangan", + "descriptionLabel": "Description", "loadingHost": "Memuat host...", - "loadingHosts": "Memuat host...", - "loadingCredentials": "Sedang memuat kredensial...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Belum ada host", - "noHostsMatchSearch": "Tidak ada host yang sesuai dengan pencarian Anda.", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Host tidak ditemukan", - "searchHosts": "Cari host...", + "searchHosts": "Search hosts...", "sortHosts": "Urutkan Host", "sortDefault": "Urutan Default", "sortNameAsc": "Nama (A → Z)", @@ -586,83 +751,96 @@ "filterHosts": "Filter Host", "filterClearAll": "Hapus Filter", "filterStatusGroup": "Status", - "filterOnline": "On line", + "filterOnline": "Online", "filterOffline": "Offline", - "filterPinned": "Disematkan", + "filterPinned": "Pinned", "filterAuthGroup": "Jenis Otorisasi", - "filterAuthPassword": "Kata sandi", - "filterAuthKey": "Kunci SSH", - "filterAuthCredential": "Mandat", - "filterAuthNone": "Tidak ada", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "Protokol", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "Fitur", + "filterFeaturesGroup": "Features", "filterFeatureTerminal": "Terminal", - "filterFeatureFileManager": "Pengelola File", - "filterFeatureTunnel": "Terowongan", - "filterFeatureDocker": "Buruh pelabuhan", - "filterTagsGroup": "Tag", - "shareHost": "Bagikan Host", - "shareHostTitle": "Bagikan: {{name}}", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Host ini harus menggunakan kredensial agar dapat berbagi. Edit host dan tetapkan kredensial terlebih dahulu." }, "guac": { - "connection": "Koneksi", - "authentication": "Autentikasi", - "connectionSettings": "Pengaturan Koneksi", - "displaySettings": "Pengaturan Tampilan", - "audioSettings": "Pengaturan Audio", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Kredensial Tersimpan", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Metode Otentikasi", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Pilih kredensial...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "Kinerja RDP", - "deviceRedirection": "Pengalihan Perangkat", - "session": "Sidang", - "gateway": "Gerbang", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Papan klip", + "clipboard": "Clipboard", "sessionRecording": "Rekaman Sesi", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Pengaturan VNC", - "terminalSettings": "Pengaturan Terminal", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "Port RDP", - "username": "Nama belakang", - "password": "Kata sandi", + "username": "Username", + "password": "Password", "domain": "Domain", - "securityMode": "Mode Keamanan", - "colorDepth": "Kedalaman Warna", - "width": "Lebar", - "height": "Tinggi", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Metode Pengubahan Ukuran", - "clientName": "Nama Klien", - "initialProgram": "Program Awal", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Tata Letak Server", - "timezone": "Zona waktu", - "gatewayHostname": "Nama Host Gateway", - "gatewayPort": "Port Gerbang", - "gatewayUsername": "Nama Pengguna Gateway", - "gatewayPassword": "Kata Sandi Gerbang", - "gatewayDomain": "Domain Gerbang", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "Program RemoteApp", "workingDirectory": "Direktori Kerja", "arguments": "Argumen", "normalizeLineEndings": "Normalisasi Akhiran Baris", - "recordingPath": "Jalur Perekaman", - "recordingName": "Nama Rekaman", - "macAddress": "Alamat MAC", - "broadcastAddress": "Pidato Siaran", - "udpPort": "Port UDP", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Waktu Tunggu (detik)", - "driveName": "Nama Drive", - "drivePath": "Jalur Berkendara", - "ignoreCertificate": "Abaikan Sertifikat", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Izinkan koneksi ke host dengan sertifikat yang ditandatangani sendiri.", - "forceLossless": "Paksa Tanpa Kehilangan", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Paksa pengkodean gambar tanpa kehilangan data (kualitas lebih tinggi, bandwidth lebih besar)", - "disableAudio": "Nonaktifkan Audio", + "disableAudio": "Disable Audio", "disableAudioDesc": "Nonaktifkan semua audio dari sesi jarak jauh.", "enableAudioInput": "Aktifkan Input Audio (Mikrofon)", "enableAudioInputDesc": "Teruskan mikrofon lokal ke sesi jarak jauh.", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Aktifkan efek kaca Aero", "menuAnimations": "Animasi Menu", "menuAnimationsDesc": "Aktifkan animasi pudar dan geser menu", - "disableBitmapCaching": "Nonaktifkan Cache Bitmap", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Matikan cache bitmap (dapat membantu mengatasi gangguan)", - "disableOffscreenCaching": "Nonaktifkan Cache di Luar Layar", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Matikan cache di luar layar.", - "disableGlyphCaching": "Nonaktifkan Cache Glif", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Matikan cache glif", - "enableGfx": "Aktifkan GFX", + "enableGfx": "Enable GFX", "enableGfxDesc": "Gunakan pipeline grafis RemoteFX.", - "enablePrinting": "Aktifkan Pencetakan", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Alihkan printer lokal ke sesi jarak jauh.", - "enableDriveRedirection": "Aktifkan Pengalihan Drive", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Petakan folder lokal sebagai drive di sesi jarak jauh.", - "createDrivePath": "Buat Jalur Mengemudi", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Buat folder secara otomatis jika belum ada.", - "disableDownload": "Nonaktifkan Unduhan", + "disableDownload": "Disable Download", "disableDownloadDesc": "Mencegah pengunduhan file dari sesi jarak jauh", - "disableUpload": "Nonaktifkan Unggahan", + "disableUpload": "Disable Upload", "disableUploadDesc": "Mencegah pengunggahan file ke sesi jarak jauh", - "enableTouch": "Aktifkan Sentuhan", + "enableTouch": "Enable Touch", "enableTouchDesc": "Aktifkan penerusan input sentuh", - "consoleSession": "Sesi Konsol", + "consoleSession": "Console Session", "consoleSessionDesc": "Hubungkan ke konsol (sesi 0) alih-alih sesi baru.", "sendWolPacket": "Kirim Paket WOL", "sendWolPacketDesc": "Kirim paket ajaib untuk membangunkan host ini sebelum terhubung.", - "disableCopy": "Nonaktifkan Salin", + "disableCopy": "Disable Copy", "disableCopyDesc": "Mencegah penyalinan teks dari sesi jarak jauh", - "disablePaste": "Nonaktifkan Tempel", + "disablePaste": "Disable Paste", "disablePasteDesc": "Mencegah penyisipan teks ke dalam sesi jarak jauh", "createPathIfMissing": "Buat Jalur jika Belum Ada", "createPathIfMissingDesc": "Membuat direktori rekaman secara otomatis.", - "excludeOutput": "Kecualikan Output", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Jangan merekam output layar (hanya metadata)", - "excludeMouse": "Kecualikan Tikus", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Jangan merekam pergerakan mouse.", "includeKeystrokes": "Sertakan Penekanan Tombol", "includeKeystrokesDesc": "Rekam setiap ketukan keyboard mentah selain output layar.", @@ -718,102 +896,105 @@ "vncPassword": "Kata Sandi VNC", "vncUsernameOptional": "Nama pengguna (opsional)", "vncLeaveBlank": "Kosongkan jika tidak diperlukan", - "cursorMode": "Mode Kursor", - "swapRedBlue": "Tukar Merah/Biru", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Tukar saluran warna merah dan biru (memperbaiki beberapa masalah warna)", "readOnly": "Hanya baca", "readOnlyDesc": "Lihat layar jarak jauh tanpa mengirimkan input apa pun.", "telnetPort": "Port Telnet", - "terminalType": "Jenis Terminal", - "fontName": "Nama Font", - "fontSize": "Ukuran Huruf", - "colorScheme": "Skema Warna", - "backspaceKey": "Tombol Backspace", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Selamatkan tuan rumah terlebih dahulu.", "sharingOptionsAfterSave": "Opsi berbagi tersedia setelah host disimpan.", "sharingLoadError": "Gagal memuat data berbagi. Periksa koneksi Anda dan coba lagi.", - "shareHostSection": "Bagikan Host", - "shareWithUser": "Bagikan dengan Pengguna", - "shareWithRole": "Bagikan dengan Peran", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Pilih Pengguna", - "selectRole": "Pilih Peran", + "selectRole": "Select Role", "selectUserOption": "Pilih pengguna...", "selectRoleOption": "Pilih peran...", - "permissionLevel": "Tingkat Izin", + "permissionLevel": "Permission Level", "expiresInHours": "Berakhir dalam (jam)", "noExpiryPlaceholder": "Biarkan kosong agar tidak ada tanggal kedaluwarsa.", - "shareBtn": "Membagikan", - "currentAccess": "Akses Saat Ini", - "typeHeader": "Jenis", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", "permissionHeader": "Izin", - "grantedByHeader": "Diberikan Oleh", - "expiresHeader": "Berakhir", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Belum ada entri akses.", - "expiredLabel": "Kedaluwarsa", - "neverLabel": "Tidak pernah", - "revokeBtn": "Menarik kembali", - "cancelBtn": "Membatalkan", - "savingBtn": "Penghematan...", - "updateHostBtn": "Perbarui Host", - "addHostBtn": "Tambahkan Host" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Cari host, perintah, atau pengaturan...", - "quickActions": "Tindakan Cepat", - "hostManager": "Manajer Host", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Kelola, tambahkan, atau edit host", "addNewHost": "Tambahkan Host Baru", "addNewHostDesc": "Daftarkan host baru", - "adminSettings": "Pengaturan Admin", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Konfigurasi preferensi sistem dan pengguna.", - "userProfile": "Profil Pengguna", + "userProfile": "User Profile", "userProfileDesc": "Kelola akun dan preferensi Anda", - "addCredential": "Tambahkan Kredensial", + "addCredential": "Add Credential", "addCredentialDesc": "Simpan kunci atau kata sandi SSH", - "recentActivity": "Aktivitas Terkini", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Server & Host", - "noHostsFound": "Tidak ditemukan host yang cocok dengan \"{{search}}\"", - "links": "Tautan", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigasi", - "select": "Memilih", + "select": "Select", "toggleWith": "Beralih dengan" }, "splitScreen": { - "paneEmpty": "Panel {{index}} - kosong", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Tidak ada tab yang ditetapkan", "focusedPane": "Panel aktif" }, "connections": { "noConnections": "Tidak ada koneksi", "noConnectionsDesc": "Buka terminal, pengelola file, atau desktop jarak jauh untuk melihat koneksi di sini.", - "connectedFor": "Terhubung untuk {{duration}}", - "connected": "Terhubung", - "disconnected": "Terputus", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Tutup tab", "closeConnection": "Hubungan yang erat", "forgetTab": "Lupa", - "removeBackground": "Menghapus", - "reconnect": "Terhubung kembali", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Buka kembali", "sectionOpen": "Membuka", "sectionBackground": "Latar belakang", "backgroundDesc": "Sesi tetap aktif selama 30 menit setelah terputus dan dapat disambungkan kembali.", "persisted": "Tetap ada di latar belakang", - "expiresIn": "Berakhir dalam {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Cari koneksi...", - "noSearchResults": "Tidak ada koneksi yang sesuai dengan pencarian Anda." + "noSearchResults": "Tidak ada koneksi yang sesuai dengan pencarian Anda.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Menghubungkan ke sesi {{type}}...", - "connectionError": "Kesalahan koneksi", - "connectionFailed": "Koneksi gagal", - "failedToConnect": "Gagal mendapatkan token koneksi.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Host tidak ditemukan", - "noHostSelected": "Tidak ada pembawa acara yang dipilih.", - "reconnect": "Terhubung kembali", - "retry": "Mencoba kembali", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "Layanan desktop jarak jauh (guacd) tidak tersedia. Pastikan guacd berjalan, dapat diakses, dan dikonfigurasi dengan benar di pengaturan admin.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "Win+L (Kunci Layar)", "winKey": "Kunci Windows", "ctrl": "Ctrl", - "alt": "Alternatif", - "shift": "Menggeser", + "alt": "Alt", + "shift": "Shift", "win": "Menang", - "stickyActive": "{{key}} (terkunci - klik untuk membuka)", - "stickyInactive": "{{key}} (klik untuk mengunci)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Melarikan diri", "tab": "Tab", - "home": "Rumah", + "home": "Home", "end": "Akhir", "pageUp": "Halaman Atas", "pageDown": "Halaman ke Bawah", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Terhubung ke Host", - "clear": "Jernih", - "paste": "Pasta", - "reconnect": "Terhubung kembali", - "connectionLost": "Koneksi terputus", - "connected": "Terhubung", - "clipboardWriteFailed": "Gagal menyalin ke papan klip. Pastikan halaman disajikan melalui HTTPS atau localhost.", - "clipboardReadFailed": "Gagal membaca dari clipboard. Pastikan izin clipboard telah diberikan.", - "clipboardHttpWarning": "Paste membutuhkan HTTPS. Gunakan Ctrl+Shift+V atau sajikan Termix melalui HTTPS.", - "unknownError": "Terjadi kesalahan yang tidak diketahui.", - "websocketError": "Kesalahan koneksi WebSocket", - "connecting": "Menghubungkan...", - "noHostSelected": "Tidak ada pembawa acara yang dipilih.", - "reconnecting": "Menghubungkan kembali... ({{attempt}}/{{max}})", - "reconnected": "Berhasil terhubung kembali", - "tmuxSessionCreated": "tmux session dibuat: {{name}}", - "tmuxSessionAttached": "sesi tmux terhubung: {{name}}", - "tmuxUnavailable": "tmux tidak terinstal di host, beralih ke shell standar", - "tmuxSessionPickerTitle": "sesi tmux", - "tmuxSessionPickerDesc": "Sesi tmux yang sudah ada ditemukan di host ini. Pilih salah satu untuk disambungkan kembali atau buat sesi baru.", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", + "connectionLost": "Connection lost", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", "tmuxWindows": "Windows", "tmuxWindowCount": "{{count}} window", - "tmuxAttached": "Client terhubung", - "tmuxAttachedCount": "{{count}} terhubung", - "tmuxLastActivity": "Aktivitas terakhir", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", "tmuxTimeJustNow": "baru saja", - "tmuxTimeMinutes": "{{count}} menit lalu", - "tmuxTimeHours": "{{count}} jam lalu", - "tmuxTimeDays": "{{count}} detik lalu", - "tmuxCreateNew": "Buat session baru", - "tmuxCopyHint": "Sesuaikan seleksi lalu tekan Enter untuk salin ke clipboard", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", "tmuxDetach": "Lepaskan diri dari sesi tmux", "tmuxDetached": "Terputus dari sesi tmux", - "maxReconnectAttemptsReached": "Upaya penyambungan kembali maksimum telah tercapai.", - "closeTab": "Tutup", - "connectionTimeout": "Waktu habis koneksi", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Menjalankan {{command}} - {{host}}", - "totpRequired": "Diperlukan Otentikasi Dua Faktor", - "totpCodeLabel": "Kode Verifikasi", - "totpVerify": "Memeriksa", - "warpgateAuthRequired": "Autentikasi Warpgate Diperlukan", - "warpgateSecurityKey": "Kunci Keamanan", - "warpgateAuthUrl": "URL Otentikasi", - "warpgateOpenBrowser": "Buka di Browser", - "warpgateContinue": "Saya telah menyelesaikan otentikasi.", - "opksshAuthRequired": "Otentikasi OPKSSH Diperlukan", - "opksshAuthDescription": "Lakukan otentikasi di browser Anda untuk melanjutkan. Sesi ini akan tetap berlaku selama 24 jam.", - "opksshOpenBrowser": "Buka Browser untuk Melakukan Otentikasi", - "opksshWaitingForAuth": "Menunggu otentikasi di browser...", - "opksshAuthenticating": "Memproses otentikasi...", - "opksshTimeout": "Autentikasi habis waktu. Silakan coba lagi.", - "opksshAuthFailed": "Autentikasi gagal. Silakan periksa kredensial Anda dan coba lagi.", - "opksshSignInWith": "Masuk dengan {{provider}}", - "sudoPasswordPopupTitle": "Masukkan kata sandi?", - "websocketAbnormalClose": "Koneksi terputus secara tidak terduga. Ini mungkin disebabkan oleh masalah konfigurasi reverse proxy atau SSL. Silakan periksa log server.", - "connectionLogTitle": "Log Koneksi", - "connectionLogCopy": "Salin log ke papan klip", - "connectionLogEmpty": "Belum ada log koneksi.", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Membuka", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Menunggu log koneksi...", - "connectionLogCopied": "Log koneksi disalin ke papan klip.", - "connectionLogCopyFailed": "Gagal menyalin log ke papan klip.", - "connectionRejected": "Koneksi ditolak oleh server. Harap periksa otentikasi dan konfigurasi jaringan Anda.", - "hostKeyRejected": "Verifikasi kunci host SSH ditolak. Koneksi dibatalkan.", - "sessionTakenOver": "Sesi dibuka di tab lain. Sedang menyambungkan kembali..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Tab Terpisah", + "addToSplit": "Tambahkan ke Split", + "removeFromSplit": "Hapus dari Split" + } }, "fileManager": { - "noHostSelected": "Tidak ada pembawa acara yang dipilih.", + "noHostSelected": "No host selected", "initializingEditor": "Menginisialisasi editor...", - "file": "Mengajukan", - "folder": "Map", - "uploadFile": "Unggah File", - "downloadFile": "Unduh", - "extractArchive": "Ekstrak Arsip", - "extractingArchive": "Mengekstrak {{name}}...", - "archiveExtractedSuccessfully": "{{name}} berhasil diekstrak", - "extractFailed": "Ekstraksi gagal", - "compressFile": "Kompres File", - "compressFiles": "Kompres File", - "compressFilesDesc": "Kompres {{count}} item ke dalam arsip", - "archiveName": "Nama Arsip", - "enterArchiveName": "Masukkan nama arsip...", - "compressionFormat": "Format Kompresi", - "selectedFiles": "File terpilih", - "andMoreFiles": "dan {{count}} lainnya...", - "compress": "Kompres", - "compressingFiles": "Mengompres {{count}} item menjadi {{name}}...", - "filesCompressedSuccessfully": "{{name}} berhasil dibuat", - "compressFailed": "Kompresi gagal", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", "edit": "Edit", - "preview": "Pratinjau", - "previous": "Sebelumnya", - "next": "Berikutnya", - "pageXOfY": "Halaman {{current}} dari {{total}}", - "zoomOut": "Perkecil tampilan", - "zoomIn": "Perbesar", - "newFile": "Berkas Baru", - "newFolder": "Folder Baru", - "rename": "Ganti nama", - "uploading": "Sedang mengunggah...", - "uploadingFile": "Mengunggah {{name}}...", - "fileName": "Nama File", - "folderName": "Nama Folder", - "fileUploadedSuccessfully": "Berkas \"{{name}}\" berhasil diunggah", - "failedToUploadFile": "Gagal mengunggah file", - "fileDownloadedSuccessfully": "File \"{{name}}\" berhasil diunduh", - "failedToDownloadFile": "Gagal mengunduh file", - "fileCreatedSuccessfully": "File \"{{name}}\" berhasil dibuat", - "folderCreatedSuccessfully": "Folder \"{{name}}\" berhasil dibuat", - "failedToCreateItem": "Gagal membuat item", - "operationFailed": "Operasi {{operation}} gagal untuk {{name}}: {{error}}", - "failedToResolveSymlink": "Gagal menyelesaikan symlink", - "itemsDeletedSuccessfully": "{{count}} item berhasil dihapus", - "failedToDeleteItems": "Gagal menghapus item", - "sudoPasswordRequired": "Kata Sandi Administrator Diperlukan", - "enterSudoPassword": "Masukkan kata sandi sudo untuk melanjutkan operasi ini.", - "sudoPassword": "Kata sandi Sudo", - "sudoOperationFailed": "Operasi Sudo gagal", - "sudoAuthFailed": "Autentikasi Sudo gagal", - "dragFilesToUpload": "Seret file ke sini untuk mengunggah", - "emptyFolder": "Folder ini kosong", - "searchFiles": "Cari file...", - "upload": "Mengunggah", - "selectHostToStart": "Pilih host untuk memulai manajemen file.", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "Pengelola file memerlukan SSH. Host ini tidak mengaktifkan SSH.", - "failedToConnect": "Gagal terhubung ke SSH", - "failedToLoadDirectory": "Gagal memuat direktori", - "noSSHConnection": "Tidak ada koneksi SSH yang tersedia.", - "copy": "Menyalin", - "cut": "Memotong", - "paste": "Pasta", - "copyPath": "Salin Jalur", - "copyPaths": "Salin Jalur", - "delete": "Menghapus", - "properties": "Properti", - "refresh": "Menyegarkan", - "downloadFiles": "Unduh {{count}} file ke Browser", - "copyFiles": "Salin {{count}} item", - "cutFiles": "Potong {{count}} item", - "deleteFiles": "Hapus {{count}} item", - "filesCopiedToClipboard": "{{count}} item disalin ke papan klip", - "filesCutToClipboard": "{{count}} item dipotong ke papan klip", - "pathCopiedToClipboard": "Jalur disalin ke papan klip", - "pathsCopiedToClipboard": "{{count}} jalur disalin ke papan klip", - "failedToCopyPath": "Gagal menyalin jalur ke papan klip.", - "movedItems": "Memindahkan {{count}} item", - "failedToDeleteItem": "Gagal menghapus item", - "itemRenamedSuccessfully": "{{type}} berhasil diganti namanya", - "failedToRenameItem": "Gagal mengganti nama item", - "download": "Unduh", - "permissions": "Izin", - "size": "Ukuran", - "modified": "Dimodifikasi", - "path": "Jalur", - "confirmDelete": "Apakah Anda yakin ingin menghapus {{name}}?", - "permissionDenied": "Izin ditolak", - "serverError": "Kesalahan Server", - "fileSavedSuccessfully": "Berkas berhasil disimpan.", - "failedToSaveFile": "Gagal menyimpan file", - "confirmDeleteSingleItem": "Apakah Anda yakin ingin menghapus \"{{name}} \" secara permanen?", - "confirmDeleteMultipleItems": "Apakah Anda yakin ingin menghapus {{count}} item secara permanen?", - "confirmDeleteMultipleItemsWithFolders": "Apakah Anda yakin ingin menghapus {{count}} item secara permanen? Ini termasuk folder dan isinya.", - "confirmDeleteFolder": "Apakah Anda yakin ingin menghapus folder \"{{name}}\" beserta seluruh isinya secara permanen?", - "permanentDeleteWarning": "Tindakan ini tidak dapat dibatalkan. Item tersebut akan dihapus secara permanen dari server.", - "recent": "Terkini", - "pinned": "Disematkan", - "folderShortcuts": "Pintasan Folder", - "failedToReconnectSSH": "Gagal menyambungkan kembali sesi SSH", - "openTerminalHere": "Buka Terminal di Sini", - "run": "Berlari", - "openTerminalInFolder": "Buka Terminal di Folder Ini", - "openTerminalInFileLocation": "Buka Terminal di Lokasi File", - "runningFile": "Berlari - {{file}}", - "onlyRunExecutableFiles": "Hanya dapat menjalankan file yang dapat dieksekusi.", - "directories": "Direktori", - "removedFromRecentFiles": "Menghapus \"{{name}}\" dari file terbaru", - "removeFailed": "Hapus yang gagal", - "unpinnedSuccessfully": "Pin \"{{name}}\" berhasil dilepas", - "unpinFailed": "Gagal membuka pin", - "removedShortcut": "Pintasan \"{{name}} \" telah dihapus", - "removeShortcutFailed": "Penghapusan pintasan gagal.", - "clearedAllRecentFiles": "Semua file terbaru telah dihapus.", - "clearFailed": "Hapus gagal", - "removeFromRecentFiles": "Hapus dari berkas terbaru", - "clearAllRecentFiles": "Hapus semua file terbaru", - "unpinFile": "Lepaskan pin file", - "removeShortcut": "Hapus pintasan", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", "pinFile": "Pin file", - "addToShortcuts": "Tambahkan ke pintasan", - "pasteFailed": "Pasta gagal", - "noUndoableActions": "Tidak ada tindakan yang tidak dapat dibatalkan.", - "undoCopySuccess": "Batalkan operasi penyalinan: Menghapus {{count}} file yang disalin", - "undoCopyFailedDelete": "Pembatalan gagal: Tidak dapat menghapus file yang disalin.", - "undoCopyFailedNoInfo": "Pembatalan gagal: Informasi file yang disalin tidak ditemukan.", - "undoMoveSuccess": "Operasi pemindahan dibatalkan: {{count}} berkas dipindahkan kembali ke lokasi semula", - "undoMoveFailedMove": "Pembatalan gagal: Tidak dapat memindahkan file apa pun kembali.", - "undoMoveFailedNoInfo": "Pembatalan gagal: Informasi file yang dipindahkan tidak ditemukan.", - "undoDeleteNotSupported": "Operasi penghapusan tidak dapat dibatalkan: File telah dihapus secara permanen dari server.", - "undoTypeNotSupported": "Jenis operasi undo yang tidak didukung", - "undoOperationFailed": "Operasi pembatalan gagal", - "unknownError": "Kesalahan tidak dikenal", - "confirm": "Mengonfirmasi", - "find": "Menemukan...", - "replace": "Mengganti", - "downloadInstead": "Unduh sebagai gantinya", - "keyboardShortcuts": "Pintasan Keyboard", - "searchAndReplace": "Cari & Ganti", - "editing": "Pengeditan", - "search": "Mencari", - "findNext": "Temukan Selanjutnya", - "findPrevious": "Temukan Sebelumnya", - "save": "Menyimpan", - "selectAll": "Pilih Semua", - "undo": "Membuka", - "redo": "Mengulangi", - "moveLineUp": "Susunan Langkah", - "moveLineDown": "Geser Garis ke Bawah", - "toggleComment": "Alihkan Komentar", - "autoComplete": "Pelengkapan Otomatis", - "imageLoadError": "Gambar gagal dimuat", - "startTyping": "Mulai mengetik...", - "unknownSize": "Ukuran tidak diketahui", - "fileIsEmpty": "Berkas kosong", - "largeFileWarning": "Peringatan Ukuran File Besar", - "largeFileWarningDesc": "File ini berukuran {{size}} , yang dapat menyebabkan masalah kinerja saat dibuka sebagai teks.", - "fileNotFoundAndRemoved": "Berkas \"{{name}}\" tidak ditemukan dan telah dihapus dari berkas terbaru/yang disematkan", - "failedToLoadFile": "Gagal memuat file: {{error}}", - "serverErrorOccurred": "Terjadi kesalahan server. Silakan coba lagi nanti.", - "autoSaveFailed": "Penyimpanan otomatis gagal", - "fileAutoSaved": "Berkas tersimpan otomatis", - "moveFileFailed": "Gagal memindahkan {{name}}", - "moveOperationFailed": "Operasi pemindahan gagal", - "canOnlyCompareFiles": "Hanya dapat membandingkan dua file.", - "comparingFiles": "Membandingkan berkas: {{file1}} dan {{file2}}", - "dragFailed": "Operasi seret gagal", - "filePinnedSuccessfully": "Berkas \"{{name}}\" berhasil disematkan", - "pinFileFailed": "Gagal menyematkan file", - "fileUnpinnedSuccessfully": "Berkas \"{{name}}\" berhasil dilepas dari pin", - "unpinFileFailed": "Gagal melepaskan pin file", - "shortcutAddedSuccessfully": "Pintasan folder \"{{name}}\" berhasil ditambahkan", - "addShortcutFailed": "Gagal menambahkan pintasan", - "operationCompletedSuccessfully": "{{operation}} {{count}} item berhasil", - "operationCompleted": "{{operation}} {{count}} item", - "downloadFileSuccess": "File {{name}} berhasil diunduh", - "downloadFileFailed": "Pengunduhan gagal", - "moveTo": "Pindah ke {{name}}", - "diffCompareWith": "Bandingkan perbedaan dengan {{name}}", - "dragOutsideToDownload": "Seret ke luar jendela untuk mengunduh ({{count}} file)", - "newFolderDefault": "Folder Baru", - "newFileDefault": "File Baru.txt", - "successfullyMovedItems": "Berhasil memindahkan {{count}} item ke {{target}}", - "move": "Bergerak", - "searchInFile": "Cari di dalam file (Ctrl+F)", - "showKeyboardShortcuts": "Tampilkan pintasan keyboard", - "startWritingMarkdown": "Mulailah menulis konten markdown Anda...", - "loadingFileComparison": "Sedang memuat perbandingan file...", - "reload": "Muat ulang", - "compare": "Membandingkan", - "sideBySide": "Berdampingan", - "inline": "Sejajar", - "fileComparison": "Perbandingan File: {{file1}} vs {{file2}}", - "fileTooLarge": "Ukuran file terlalu besar: {{error}}", - "sshConnectionFailed": "Koneksi SSH gagal. Harap periksa koneksi Anda ke {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Gagal memuat file: {{error}}", - "connecting": "Menghubungkan...", - "connectedSuccessfully": "Terhubung berhasil", - "totpVerificationFailed": "Verifikasi TOTP gagal", - "warpgateVerificationFailed": "Autentikasi Warpgate gagal", - "authenticationFailed": "Autentikasi gagal", - "verificationCodePrompt": "Kode verifikasi:", - "changePermissions": "Ubah Izin", - "currentPermissions": "Izin Saat Ini", - "owner": "Pemilik", - "group": "Kelompok", - "others": "Yang lain", - "read": "Membaca", - "write": "Menulis", - "execute": "Menjalankan", - "permissionsChangedSuccessfully": "Izin berhasil diubah.", - "failedToChangePermissions": "Gagal mengubah izin", - "name": "Nama", - "sortByName": "Nama", - "sortByDate": "Tanggal Diubah", - "sortBySize": "Ukuran", - "ascending": "Naik", - "descending": "Menurun", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Akar", "new": "Baru", "sortBy": "Urutkan Berdasarkan", @@ -1140,19 +1336,19 @@ "octal": "Oktal", "storage": "Penyimpanan", "disk": "Disk", - "used": "Digunakan", - "of": "dari", - "toggleSidebar": "Alihkan Sidebar", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "Tidak dapat memuat PDF", "pdfLoadError": "Terjadi kesalahan saat memuat file PDF ini.", "loadingPdf": "Sedang memuat PDF...", "loadingPage": "Sedang memuat halaman..." }, "transfer": { - "copyToHost": "Salin ke host…", - "moveToHost": "Pindah ke host…", - "copyItemsToHost": "Salin {{count}} item ke host…", - "moveItemsToHost": "Pindahkan {{count}} item ke host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Tidak ada penyedia pengelola file lain yang tersedia.", "noHostsConnectedHint": "Tambahkan host SSH lain dengan File Manager diaktifkan di Host Manager.", "selectDestinationHost": "Pilih host tujuan", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Perluas destinasi terbaru", "browseFolders": "Telusuri folder tujuan", "browseDestination": "Telusuri atau masukkan jalur", - "confirmCopy": "Menyalin", - "confirmMove": "Bergerak", - "transferring": "Mentransfer…", - "compressing": "Mengompresi…", - "extracting": "Mengekstrak…", - "transferringItems": "Memindahkan {{current}} dari {{total}} item…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transfer selesai", "transferError": "Transfer gagal", - "transferPartial": "Transfer selesai dengan {{count}} kesalahan", - "transferPartialHint": "Tidak dapat mentransfer: {{paths}}", - "itemsSummary": "{{count}} item", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Tujuan harus berupa direktori untuk transfer multi-item.", "selectThisFolder": "Pilih folder ini", "browsePathWillBeCreated": "Folder ini belum ada. Folder ini akan dibuat saat transfer dimulai.", "browsePathError": "Tidak dapat membuka jalur ini pada host tujuan.", "goUp": "Naik", - "copyFolderToHost": "Salin folder ke host…", - "moveFolderToHost": "Pindahkan folder ke host…", - "hostReady": "Siap", - "hostConnecting": "Menghubungkan…", - "hostDisconnected": "Tidak terhubung", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Diperlukan autentikasi — buka File Manager di host ini terlebih dahulu.", - "hostConnectionFailed": "Koneksi gagal", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Waktu transfer", - "metricsPrepare": "Siapkan tujuan: {{duration}}", - "metricsCompress": "Kompres pada sumber: {{duration}}", - "metricsHopSourceRead": "Sumber → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → tujuan (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → tujuan (lokal): {{throughput}}", - "metricsTransfer": "Ujung ke ujung: {{throughput}} ({{duration}})", - "metricsExtract": "Ekstrak pada tujuan: {{duration}}", - "metricsSourceDelete": "Hapus dari sumber: {{duration}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", "metricsTotal": "Total: {{duration}}", - "progressCompressing": "Kompresi pada host sumber…", - "progressExtracting": "Mengekstraksi pada tujuan…", - "progressTransferring": "Mentransfer data…", - "progressReconnecting": "Menghubungkan kembali…", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Jalur transfer paralel", - "parallelSegmentsOption": "{{count}} jalur", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "File berukuran besar dibagi menjadi bagian-bagian berukuran 256 MB. Beberapa jalur menggunakan koneksi terpisah (seperti memulai beberapa transfer) untuk throughput total yang lebih tinggi.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} lajur)", - "progressTransferringItems": "Mentransfer berkas ({{current}} dari {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "berkas {{current}} / {{total}}", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Berkas sumber tetap disimpan (transfer sebagian)", "jumpHostLimitation": "Kedua host harus dapat dijangkau dari server Termix. Perutean langsung antar host tidak didukung.", - "cancel": "Membatalkan", + "cancel": "Cancel", "methodLabel": "Metode transfer", "methodAuto": "Mobil", "methodTar": "Arsip Tar", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Memilih antara tar atau SFTP per-file berdasarkan jumlah file, ukuran, dan kemampuan kompresi. File tunggal selalu menggunakan SFTP streaming.", "methodTarHint": "Kompres di sumber, transfer satu arsip, ekstrak di tujuan. Membutuhkan tar di kedua host Unix.", "methodItemSftpHint": "Transfer setiap file secara individual melalui SFTP. Berfungsi di semua host termasuk Windows.", - "methodPreviewLoading": "Metode perhitungan transfer…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Metode transfer tidak dapat dipratinjau. Server akan tetap memilih metode saat Anda memulai.", "methodPreviewWillUseTar": "Akan menggunakan: Arsip Tar", "methodPreviewWillUseItemSftp": "Akan menggunakan: SFTP per file", - "methodPreviewScanSummary": "{{fileCount}} berkas, {{totalSize}} total (dipindai pada host sumber).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Setiap berkas menggunakan aliran SFTP yang sama sebagai salinan berkas tunggal, satu demi satu. Kemajuan digabungkan di semua berkas, sehingga bilah kemajuan bergerak lambat selama pemrosesan berkas berukuran besar.", "methodReason": { "user_item_sftp": "Anda memilih SFTP per-file.", "user_tar": "Anda memilih arsip tar.", "tar_unavailable": "Tar tidak tersedia di salah satu atau kedua host — SFTP per-file akan digunakan sebagai gantinya.", "windows_host": "Sistem operasi yang digunakan adalah Windows — tar tidak digunakan.", - "auto_multi_large": "Otomatis: beberapa file termasuk file besar ({{largestSize}}) dengan data yang dapat dikompresi — tar menggabungkan menjadi satu transfer.", - "auto_single_large_in_archive": "Otomatis: satu file besar ({{largestSize}}) dalam set ini — SFTP per file.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Otomatis: sebagian besar data tidak dapat dikompresi — SFTP per file.", - "auto_many_files": "Otomatis: banyak file ({{fileCount}}) — tar mengurangi overhead per file.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Otomatis: SFTP per-file untuk set ini." }, - "progressCancel": "Membatalkan", - "progressCancelling": "Membatalkan…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Terhenti", "resumedHint": "Terhubung kembali ke transfer aktif yang dimulai di jendela lain.", "transferCancelled": "Transfer dibatalkan", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Beberapa file parsial tidak dapat dihapus.", "cleanupDestFilesNothing": "Tidak ada yang perlu dibersihkan di tempat tujuan.", "cleanupDestFilesError": "Pembersihan gagal", - "retryTransfer": "Mencoba kembali", + "retryTransfer": "Retry", "retryTransferError": "Percobaan ulang gagal.", "transferFailedRetryHint": "Sebagian data tersimpan di tujuan. Upaya pengulangan akan dilanjutkan saat koneksi kembali pulih." }, "tunnels": { - "noSshTunnels": "Tidak ada tunnel SSH", - "createFirstTunnelMessage": "Anda belum membuat tunnel SSH apa pun. Konfigurasikan koneksi tunnel di Host Manager untuk memulai.", - "connected": "Terhubung", - "disconnected": "Terputus", - "connecting": "Menghubungkan...", - "error": "Kesalahan", - "canceling": "Membatalkan...", - "connect": "Menghubungkan", - "disconnect": "Memutuskan", - "cancel": "Membatalkan", - "port": "Pelabuhan", - "localPort": "Pelabuhan Lokal", - "remotePort": "Port Jarak Jauh", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Port Host Saat Ini", - "endpointPort": "Port Titik Akhir", + "endpointPort": "Endpoint Port", "bindIp": "IP Lokal", - "endpointSshConfig": "Konfigurasi Endpoint SSH", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Host SSH Titik Akhir", "endpointSshHostPlaceholder": "Pilih host yang telah dikonfigurasi.", "endpointSshHostRequired": "Pilih host SSH titik akhir untuk setiap terowongan klien.", - "attempt": "Percobaan {{current}} dari {{max}}", - "nextRetryIn": "Percobaan berikutnya dalam {{seconds}} detik", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Terowongan Klien", "clientTunnel": "Terowongan Klien", "addClientTunnel": "Tambahkan Terowongan Klien", "noClientTunnels": "Tidak ada terowongan klien yang dikonfigurasi pada desktop ini.", - "tunnelName": "Nama Tunnel", - "remoteHost": "Host Jarak Jauh", - "autoStart": "Mulai Otomatis", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Proses dimulai saat klien desktop ini dibuka dan tetap terhubung.", "clientManualStartDesc": "Gunakan tombol Mulai dan Berhenti dari baris ini. Termix tidak akan membukanya secara otomatis.", "clientRemoteServerNote": "Penerusan jarak jauh mungkin memerlukan AllowTcpForwarding dan GatewayPorts pada server SSH titik akhir. Port jarak jauh akan tertutup ketika desktop ini terputus.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "Port jarak jauh harus berada di antara 1 dan 65535.", "invalidLocalTargetPort": "Port target lokal harus berada di antara 1 dan 65535.", "invalidEndpointPort": "Port endpoint harus berada di antara 1 dan 65535.", - "duplicateAutoStartBind": "Hanya satu terowongan klien auto-start yang dapat menggunakan {{bind}}.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Gagal memperbarui status terowongan.", - "active": "Aktif", - "start": "Awal", - "stop": "Berhenti", - "test": "Tes", - "type": "Jenis Terowongan", - "typeLocal": "Lokal (-L)", - "typeRemote": "Jarak Jauh (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Dinamis (-D)", "typeServerLocalDesc": "Host saat ini ke titik akhir.", "typeServerRemoteDesc": "Endpoint kembali ke host saat ini.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Titik akhir kembali ke komputer lokal.", "typeClientDynamicDesc": "SOCKS di komputer lokal.", "typeDynamicDesc": "Meneruskan lalu lintas SOCKS5 CONNECT melalui SSH", - "forwardDescriptionServerLocal": "Host saat ini {{sourcePort}} → titik akhir {{endpointPort}}.", - "forwardDescriptionServerRemote": "Titik akhir {{endpointPort}} → host saat ini {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS pada host saat ini {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokal {{sourcePort}} → jarak jauh {{endpointPort}}.", - "forwardDescriptionClientRemote": "Jarak jauh {{sourcePort}} → lokal {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS pada port lokal {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → KAOS KAKI melalui {{endpoint}}", - "autoNameClientLocal": "Lokal {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokal {{localPort}}", - "autoNameClientDynamic": "KAOS KAKI {{localPort}} melalui {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Rute:", "lastStarted": "Terakhir dimulai", "lastTested": "Terakhir diuji", "lastError": "Kesalahan terakhir", - "maxRetries": "Jumlah Percobaan Maksimum", + "maxRetries": "Max Retries", "maxRetriesDescription": "Jumlah maksimum percobaan ulang.", - "retryInterval": "Interval Percobaan Ulang (detik)", - "retryIntervalDescription": "Waktu tunggu antar upaya percobaan ulang.", - "local": "Lokal", - "remote": "Terpencil", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Tujuan", "host": "Tuan rumah", "mode": "Mode", - "noHostSelected": "Tidak ada pembawa acara yang dipilih.", + "noHostSelected": "No host selected", "working": "Bekerja..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Ingatan", + "memory": "Memory", "disk": "Disk", - "network": "Jaringan", - "uptime": "Waktu aktif", - "processes": "Proses", - "available": "Tersedia", - "free": "Bebas", - "connecting": "Menghubungkan...", - "connectionFailed": "Gagal terhubung ke server", - "naCpus": "CPU tidak tersedia", - "cpuCores_one": "{{count}} Inti", - "cpuCores_other": "{{count}} Inti", - "cpuUsage": "Penggunaan CPU", - "memoryUsage": "Penggunaan Memori", - "diskUsage": "Penggunaan Disk", - "failedToFetchHostConfig": "Gagal mengambil konfigurasi host", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", "serverOffline": "Server Offline", - "cannotFetchMetrics": "Tidak dapat mengambil metrik dari server offline.", - "totpFailed": "Verifikasi TOTP gagal", - "noneAuthNotSupported": "Statistik Server tidak mendukung tipe autentikasi 'none'.", - "load": "Memuat", - "systemInfo": "Informasi Sistem", - "hostname": "Nama host", - "operatingSystem": "Sistem Operasi", - "kernel": "Inti", - "seconds": "detik", - "networkInterfaces": "Antarmuka Jaringan", - "noInterfacesFound": "Tidak ditemukan antarmuka jaringan.", - "noProcessesFound": "Tidak ada proses yang ditemukan.", - "loginStats": "Statistik Login SSH", - "noRecentLoginData": "Tidak ada data login terbaru.", - "executingQuickAction": "Menjalankan {{name}}...", - "quickActionSuccess": "{{name}} berhasil diselesaikan", - "quickActionFailed": "{{name}} gagal", - "quickActionError": "Gagal mengeksekusi {{name}}", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Port Pendengaran", - "protocol": "Protokol", - "port": "Pelabuhan", - "address": "Alamat", - "process": "Proses", - "noData": "Tidak ada data port yang mendengarkan." + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Semua", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Tidak aktif", - "policy": "Kebijakan", - "rules": "aturan", - "noData": "Tidak ada data firewall yang tersedia.", - "action": "Tindakan", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Pelabuhan", - "source": "Sumber", - "anywhere": "Di mana saja" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Beban Rata-rata", "swap": "Menukar", "architecture": "Arsitektur", - "refresh": "Menyegarkan", - "retry": "Mencoba kembali" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Bekerja...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Manajemen SSH dan desktop jarak jauh yang dihosting sendiri", - "loginTitle": "Masuk ke Termix", - "registerTitle": "Buat Akun", - "forgotPassword": "Lupa kata sandi?", - "rememberMe": "Ingat Perangkat Selama 30 Hari (termasuk TOTP)", - "noAccount": "Belum punya akun?", - "hasAccount": "Sudah punya akun?", - "twoFactorAuth": "Autentikasi Dua Faktor", - "enterCode": "Masukkan kode verifikasi", - "backupCode": "Atau gunakan kode cadangan", - "verifyCode": "Verifikasi Kode", - "redirectingToApp": "Mengalihkan ke aplikasi...", - "sshAuthenticationRequired": "Autentikasi SSH Diperlukan", - "sshNoKeyboardInteractive": "Autentikasi Interaktif Keyboard Tidak Tersedia", - "sshAuthenticationFailed": "Autentikasi Gagal", - "sshAuthenticationTimeout": "Batas Waktu Otentikasi", - "sshNoKeyboardInteractiveDescription": "Server ini tidak mendukung otentikasi interaktif keyboard. Harap berikan kata sandi atau kunci SSH Anda.", - "sshAuthFailedDescription": "Kredensial yang diberikan salah. Silakan coba lagi dengan kredensial yang valid.", - "sshTimeoutDescription": "Upaya otentikasi telah habis waktu. Silakan coba lagi.", - "sshProvideCredentialsDescription": "Silakan berikan kredensial SSH Anda untuk terhubung ke server ini.", - "sshPasswordDescription": "Masukkan kata sandi untuk koneksi SSH ini.", - "sshKeyPasswordDescription": "Jika kunci SSH Anda dienkripsi, masukkan kata sandi di sini.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Kata Sandi Diperlukan", "passphraseRequiredDescription": "Kunci SSH dienkripsi. Silakan masukkan kata sandi untuk membukanya.", - "back": "Kembali", - "firstUser": "Pengguna Pertama", - "firstUserMessage": "Anda adalah pengguna pertama dan akan dijadikan admin. Anda dapat melihat pengaturan admin di menu tarik-turun pengguna di sidebar. Jika Anda merasa ini adalah kesalahan, periksa log Docker, atau buat masalah di GitHub.", - "external": "Luar", - "loginWithExternal": "Masuk dengan Penyedia Eksternal", - "loginWithExternalDesc": "Masuk menggunakan penyedia identitas eksternal yang telah Anda konfigurasi.", - "externalNotSupportedInElectron": "Autentikasi eksternal belum didukung di aplikasi Electron. Silakan gunakan versi web untuk login OIDC.", - "resetPasswordButton": "Atur Ulang Kata Sandi", - "sendResetCode": "Kirim Kode Reset", - "resetCodeDesc": "Masukkan nama pengguna Anda untuk menerima kode pengaturan ulang kata sandi. Kode tersebut akan tercatat dalam log kontainer Docker.", - "resetCode": "Atur Ulang Kode", - "verifyCodeButton": "Verifikasi Kode", - "enterResetCode": "Masukkan kode 6 digit dari log kontainer Docker untuk pengguna:", - "newPassword": "Kata Sandi Baru", - "confirmNewPassword": "Konfirmasi Kata Sandi", - "enterNewPassword": "Masukkan kata sandi baru Anda untuk pengguna:", - "signUp": "Mendaftar", - "desktopApp": "Aplikasi Desktop", - "loggingInToDesktopApp": "Masuk ke aplikasi desktop", - "loadingServer": "Memuat server...", - "dataLossWarning": "Mengatur ulang kata sandi Anda dengan cara ini akan menghapus semua host SSH, kredensial, dan data terenkripsi lainnya yang telah Anda simpan. Tindakan ini tidak dapat dibatalkan. Gunakan cara ini hanya jika Anda lupa kata sandi dan belum masuk.", - "authenticationDisabled": "Autentikasi Dinonaktifkan", - "authenticationDisabledDesc": "Semua metode otentikasi saat ini dinonaktifkan. Silakan hubungi administrator Anda.", - "attemptsRemaining": "{{count}} percobaan tersisa" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifikasi Kunci Host SSH", - "keyChangedWarning": "Kunci Host SSH Berubah", - "firstConnectionTitle": "Ini adalah kali pertama terhubung ke host ini.", - "firstConnectionDescription": "Keaslian host ini tidak dapat dipastikan. Verifikasi apakah sidik jari sesuai dengan yang Anda harapkan.", - "keyChangedDescription": "Kunci host untuk server ini telah berubah sejak koneksi terakhir Anda. Ini bisa mengindikasikan masalah keamanan.", - "previousKey": "Kunci Sebelumnya", - "newFingerprint": "Sidik Jari Baru", - "fingerprint": "Sidik jari", - "verifyInstructions": "Jika Anda mempercayai host ini, klik Terima untuk melanjutkan dan simpan sidik jari ini untuk koneksi di masa mendatang.", - "securityWarning": "Peringatan Keamanan", - "acceptAndContinue": "Terima & Lanjutkan", - "acceptNewKey": "Terima Kunci Baru & Lanjutkan" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Tidak dapat terhubung ke basis data.", - "unknownError": "Kesalahan tidak dikenal", - "loginFailed": "Login gagal.", - "failedPasswordReset": "Gagal memulai pengaturan ulang kata sandi.", - "failedVerifyCode": "Gagal memverifikasi kode reset", - "failedCompleteReset": "Gagal menyelesaikan pengaturan ulang kata sandi.", - "invalidTotpCode": "Kode TOTP tidak valid", - "failedOidcLogin": "Gagal memulai login OIDC.", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Login senyap telah diminta, tetapi login OIDC tidak tersedia.", "failedUserInfo": "Gagal mendapatkan informasi pengguna setelah login.", - "oidcAuthFailed": "Autentikasi OIDC gagal", - "invalidAuthUrl": "URL otorisasi yang diterima dari backend tidak valid.", - "requiredField": "Kolom ini wajib diisi.", - "minLength": "Panjang minimumnya adalah {{min}}", - "passwordMismatch": "Kata sandi tidak cocok", - "passwordLoginDisabled": "Login menggunakan nama pengguna/kata sandi saat ini dinonaktifkan.", - "sessionExpired": "Sesi telah berakhir - silakan masuk kembali.", - "totpRateLimited": "Pembatasan laju: Terlalu banyak upaya verifikasi TOTP. Silakan coba lagi nanti.", - "totpRateLimitedWithTime": "Pembatasan laju: Terlalu banyak upaya verifikasi TOTP. Harap tunggu {{time}} detik sebelum mencoba lagi.", - "resetCodeRateLimited": "Pembatasan laju: Terlalu banyak upaya verifikasi. Silakan coba lagi nanti.", - "resetCodeRateLimitedWithTime": "Pembatasan laju: Terlalu banyak upaya verifikasi. Harap tunggu {{time}} detik sebelum mencoba lagi.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Gagal menyimpan token otentikasi.", "failedToLoadServer": "Server gagal dimuat." }, "messages": { - "registrationDisabled": "Pendaftaran akun baru saat ini dinonaktifkan oleh administrator. Silakan masuk atau hubungi administrator.", - "userNotAllowed": "Akun Anda tidak diizinkan untuk mendaftar. Silakan hubungi administrator.", - "databaseConnectionFailed": "Gagal terhubung ke server basis data", - "resetCodeSent": "Kode reset dikirim ke log Docker", - "codeVerified": "Kode berhasil diverifikasi.", - "passwordResetSuccess": "Kata sandi berhasil direset.", - "loginSuccess": "Login berhasil.", - "registrationSuccess": "Pendaftaran berhasil" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Terowongan desktop lokal yang menargetkan host SSH yang telah dikonfigurasi.", "c2sTunnelPresets": "Pengaturan Awal Terowongan Klien", "c2sTunnelPresetsDesc": "Simpan daftar terowongan lokal klien desktop ini sebagai preset server bernama, atau muat preset kembali ke klien ini.", "c2sTunnelPresetsUnavailable": "Pengaturan terowongan klien hanya tersedia di klien desktop.", - "c2sPresetName": "Nama Preset", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Nama preset klien", "c2sPresetToLoad": "Preset untuk Memuat", "c2sNoPresetSelected": "Tidak ada preset yang dipilih.", "c2sNoPresets": "Tidak ada preset yang tersimpan.", - "c2sLoadPreset": "Memuat", - "c2sCurrentLocalConfig": "{{count}} terowongan klien lokal yang dikonfigurasi pada desktop ini.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Preset adalah snapshot eksplisit; memuat salah satunya akan mengganti daftar terowongan klien lokal klien desktop ini.", "c2sPresetSaved": "Pengaturan terowongan klien tersimpan.", "c2sPresetLoaded": "Pengaturan terowongan klien dimuat secara lokal.", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Bahasa", - "keyPassword": "kata sandi kunci", - "pastePrivateKey": "Tempelkan kunci pribadi Anda di sini...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (dengarkan secara lokal)", "localTargetHost": "127.0.0.1 (target pada komputer ini)", "socksListenerHost": "127.0.0.1 (Pendengar SOCKS)", - "enterPassword": "Masukkan kata sandi Anda", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Dasbor", - "loading": "Memuat dasbor...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Mendukung", - "discord": "Perselisihan", - "serverOverview": "Gambaran Umum Server", - "version": "Versi", - "upToDate": "Terkini", - "updateAvailable": "Pembaruan Tersedia", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Waktu aktif", - "database": "Basis data", - "healthy": "Sehat", - "error": "Kesalahan", - "totalHosts": "Total Host", - "totalTunnels": "Total Tunnel", - "totalCredentials": "Kredensial Total", - "recentActivity": "Aktivitas Terkini", - "reset": "Mengatur ulang", - "loadingRecentActivity": "Memuat aktivitas terbaru...", - "noRecentActivity": "Tidak ada aktivitas terbaru.", - "quickActions": "Tindakan Cepat", - "addHost": "Tambahkan Host", - "addCredential": "Tambahkan Kredensial", - "adminSettings": "Pengaturan Admin", - "userProfile": "Profil Pengguna", - "serverStats": "Statistik Server", - "loadingServerStats": "Memuat statistik server...", - "noServerData": "Tidak ada data server yang tersedia.", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Sesuaikan Dasbor", - "dashboardSettings": "Pengaturan Dasbor", - "enableDisableCards": "Aktifkan/Nonaktifkan Kartu", - "resetLayout": "Atur Ulang ke Pengaturan Default", - "serverOverviewCard": "Gambaran Umum Server", - "recentActivityCard": "Aktivitas Terkini", - "networkGraphCard": "Grafik Jaringan", - "networkGraph": "Grafik Jaringan", - "quickActionsCard": "Tindakan Cepat", - "serverStatsCard": "Statistik Server", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Utama", "panelSide": "Samping", - "justNow": "baru saja" + "justNow": "baru saja", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABIL", @@ -1590,350 +1890,507 @@ "noHostsConfigured": "Tidak ada host yang dikonfigurasi.", "online": "ON LINE", "offline": "OFFLINE", - "onlineLower": "On line", - "nodes": "{{count}} node", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Menambahkan:", "commandPalette": "Palet Perintah", "done": "Selesai", "editModeInstructions": "Seret kartu untuk mengubah urutan · Seret pembatas kolom untuk mengubah ukuran kolom · Seret tepi bawah kartu untuk mengubah ukuran tingginya · Gunakan tombol Sampah untuk menghapus", "empty": "Kosong", - "clear": "Jernih" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Tambahkan Host", - "addGroup": "Tambahkan Grup", - "addLink": "Tambahkan Tautan", - "zoomIn": "Perbesar", - "zoomOut": "Perkecil tampilan", - "resetView": "Atur Ulang Tampilan", - "selectHost": "Pilih Host", - "chooseHost": "Pilih tuan rumah...", - "parentGroup": "Kelompok Orang Tua", - "noGroup": "Tidak Ada Grup", - "groupName": "Nama Grup", - "color": "Warna", - "source": "Sumber", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Pindah ke Grup", - "selectGroup": "Pilih grup...", - "addConnection": "Tambahkan Koneksi", - "hostDetails": "Detail Tuan Rumah", - "removeFromGroup": "Hapus dari Grup", - "addHostHere": "Tambahkan Host di Sini", - "editGroup": "Grup Pengeditan", - "delete": "Menghapus", - "add": "Menambahkan", - "create": "Membuat", - "move": "Bergerak", - "connect": "Menghubungkan", - "createGroup": "Buat Grup", - "selectSourcePlaceholder": "Pilih Sumber...", - "selectTargetPlaceholder": "Pilih Target...", - "invalidFile": "Berkas tidak valid", - "hostAlreadyExists": "Host sudah ada dalam topologi.", - "connectionExists": "Koneksi sudah ada.", - "unknown": "Tidak dikenal", - "name": "Nama", - "ip": "AKU P", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", "status": "Status", - "failedToAddNode": "Gagal menambahkan node", - "sourceDifferentFromTarget": "Sumber dan target harus berbeda.", - "exportJSON": "Ekspor JSON", - "importJSON": "Impor JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Pengelola File", + "fileManager": "File Manager", "tunnel": "Tunnel", - "docker": "Buruh pelabuhan", - "serverStats": "Statistik Server", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Belum ada node" }, "docker": { - "notEnabled": "Docker tidak diaktifkan untuk host ini.", - "validating": "Memvalidasi Docker...", - "connecting": "Menghubungkan...", - "error": "Kesalahan", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Gagal terhubung ke Docker", - "containerStarted": "Kontainer {{name}} dimulai", - "failedToStartContainer": "Gagal memulai kontainer {{name}}", - "containerStopped": "Kontainer {{name}} berhenti", - "failedToStopContainer": "Gagal menghentikan kontainer {{name}}", - "containerRestarted": "Kontainer {{name}} dimulai ulang", - "failedToRestartContainer": "Gagal memulai ulang kontainer {{name}}", - "containerPaused": "Kontainer {{name}} berhenti", - "containerUnpaused": "Kontainer {{name}} tidak dijeda", - "failedToTogglePauseContainer": "Gagal mengubah status jeda untuk kontainer {{name}}", - "containerRemoved": "Kontainer {{name}} dihapus", - "failedToRemoveContainer": "Gagal menghapus kontainer {{name}}", - "image": "Gambar", - "ports": "Pelabuhan", - "noPorts": "Tidak ada port", - "start": "Awal", - "confirmRemoveContainer": "Apakah Anda yakin ingin menghapus kontainer '{{name}}'? Tindakan ini tidak dapat dibatalkan.", - "runningContainerWarning": "Peringatan: Kontainer ini sedang berjalan. Menghapusnya akan menghentikan kontainer terlebih dahulu.", - "loadingContainers": "Memuat kontainer...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Manajer Docker", - "autoRefresh": "Penyegaran Otomatis", + "autoRefresh": "Auto Refresh", "timestamps": "Cap waktu", "lines": "Garis", - "filterLogs": "Filter log...", - "refresh": "Menyegarkan", - "download": "Unduh", - "clear": "Jernih", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Log berhasil diunduh.", "last50": "50 Terakhir", "last100": "100 terakhir", "last500": "500 Terakhir", "last1000": "1000 terakhir", "allLogs": "Semua Log", - "noLogsMatching": "Tidak ada log yang cocok dengan \"{{query}}\"", - "noLogsAvailable": "Tidak ada log yang tersedia.", - "noContainersFound": "Tidak ditemukan wadah apa pun", - "noContainersFoundHint": "Tidak ada kontainer Docker yang tersedia di host ini.", - "searchPlaceholder": "Cari kontainer...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Semua Status", - "stateRunning": "Berlari", + "stateRunning": "Running", "statePaused": "Dijeda", "stateExited": "Keluar", "stateRestarting": "Memulai ulang", - "noContainersMatchFilters": "Tidak ada wadah yang sesuai dengan filter Anda.", - "noContainersMatchFiltersHint": "Cobalah menyesuaikan kriteria pencarian atau filter Anda.", - "failedToFetchStats": "Gagal mengambil statistik kontainer", - "containerNotRunning": "Kontainer tidak berjalan", - "startContainerToViewStats": "Jalankan kontainer untuk melihat statistik.", - "loadingStats": "Memuat statistik...", - "errorLoadingStats": "Terjadi kesalahan saat memuat statistik.", - "noStatsAvailable": "Tidak ada statistik yang tersedia.", - "cpuUsage": "Penggunaan CPU", - "current": "Saat ini", - "memoryUsage": "Penggunaan Memori", - "networkIo": "Input/Output Jaringan", - "input": "Masukan", - "output": "Keluaran", - "blockIo": "Blok I/O", - "read": "Membaca", - "write": "Menulis", - "pids": "PID", - "containerInformation": "Informasi Kontainer", - "name": "Nama", - "id": "PENGENAL", - "state": "Negara", - "containerMustBeRunning": "Kontainer harus berjalan agar dapat mengakses konsol.", - "verificationCodePrompt": "Masukkan kode verifikasi", - "totpVerificationFailed": "Verifikasi TOTP gagal. Silakan coba lagi.", - "warpgateVerificationFailed": "Autentikasi Warpgate gagal. Silakan coba lagi.", - "connectedTo": "Terhubung ke {{containerName}}", - "disconnected": "Terputus", - "consoleError": "Kesalahan konsol", - "errorMessage": "Kesalahan: {{message}}", - "failedToConnect": "Gagal terhubung ke kontainer", - "console": "Menghibur", - "selectShell": "Pilih cangkang", - "bash": "Pesta", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", "sh": "sh", - "ash": "abu", - "connect": "Menghubungkan", - "disconnect": "Memutuskan", - "notConnected": "Tidak terhubung", - "clickToConnect": "Klik sambungkan untuk memulai sesi shell.", - "connectingTo": "Menghubungkan ke {{containerName}}...", - "containerNotFound": "Kontainer tidak ditemukan", - "backToList": "Kembali ke Daftar", - "logs": "Log", - "stats": "Statistik", - "consoleTab": "Menghibur", - "startContainerToAccess": "Jalankan kontainer untuk mengakses konsol." + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Umum", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Pengguna", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Sesi", - "sectionRoles": "Peran", - "sectionDatabase": "Basis data", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "Kunci API", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Hapus Filter", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Semua", "allowRegistration": "Izinkan Pendaftaran Pengguna", - "allowRegistrationDesc": "Izinkan pengguna baru mendaftar sendiri.", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Izinkan Login dengan Kata Sandi", "allowPasswordLoginDesc": "Login dengan nama pengguna/kata sandi", "oidcAutoProvision": "Penyediaan Otomatis OIDC", - "oidcAutoProvisionDesc": "Buat akun secara otomatis untuk pengguna OIDC bahkan ketika pendaftaran dinonaktifkan.", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Izinkan Reset Kata Sandi", "allowPasswordResetDesc": "Reset kode melalui log Docker", - "sessionTimeout": "Sesi Kedaluwarsa", - "hours": "jam", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Minimal 1 jam · Maksimal 720 jam", - "monitoringDefaults": "Pemantauan Default", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Pemeriksaan Status", - "metrics": "Metrik", + "metrics": "Metrics", "sec": "detik", - "logLevel": "Level Log", + "logLevel": "Log Level", "enableGuacamole": "Aktifkan Guacamole", "enableGuacamoleDesc": "Desktop jarak jauh RDP/VNC", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "URL guacd", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "Konfigurasikan OpenID Connect untuk SSO. Kolom yang ditandai * wajib diisi.", - "oidcClientId": "ID Klien", - "oidcClientSecret": "Rahasia Klien", - "oidcAuthUrl": "URL Otorisasi", - "oidcIssuerUrl": "URL Penerbit", - "oidcTokenUrl": "URL Token", - "oidcUserIdentifier": "Jalur Pengidentifikasi Pengguna", - "oidcDisplayName": "Jalur Nama Tampilan", - "oidcScopes": "Lingkup", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Ganti URL Informasi Pengguna", - "oidcAllowedUsers": "Pengguna yang Diizinkan", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Satu email per baris. Biarkan kosong untuk mengizinkan semua email.", - "removeOidc": "Menghapus", - "usersCount": "{{count}} pengguna", - "createUser": "Membuat", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Peran Baru", - "roleName": "Nama", - "roleDisplayName": "Nama Tampilan", - "roleDescription": "Keterangan", - "rolesCount": "{{count}} peran", - "createRole": "Membuat", - "creating": "Membuat...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Ekspor Basis Data", "exportDatabaseDesc": "Unduh cadangan semua host, kredensial, dan pengaturan.", - "export": "Ekspor", - "exporting": "Mengekspor...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Impor Basis Data", "importDatabaseDesc": "Pulihkan dari file cadangan .sqlite", - "importDatabaseSelected": "Dipilih: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Pilih File", - "changeFile": "Mengubah", - "import": "Impor", - "importing": "Pengimporan...", - "apiKeysCount": "{{count}} kunci", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Kunci API Baru", "apiKeyCreatedWarning": "Kunci telah dibuat - salin sekarang, kunci ini tidak akan ditampilkan lagi.", - "apiKeyName": "Nama", - "apiKeyUser": "Pengguna", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Pilih pengguna...", - "apiKeyExpiresAt": "Berakhir pada", + "apiKeyExpiresAt": "Expires At", "createKey": "Buat Kunci", "apiKeyNoExpiry": "Tidak ada tanggal kedaluwarsa", "revokedBadge": "DICABUT", - "authTypeDual": "Otorisasi Ganda", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Lokal", + "authTypeLocal": "Local", "adminStatusAdministrator": "Administrator", - "adminStatusRegularUser": "Pengguna Biasa", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "Sistem", "customBadge": "KEBIASAAN", "youBadge": "ANDA", - "sessionsActive": "{{count}} aktif", - "sessionActive": "Aktif: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "Semua", "revokeAllSessionsSuccess": "Semua sesi untuk pengguna telah dicabut.", - "revokeAllSessionsFailed": "Gagal mencabut sesi", - "revokeSessionFailed": "Gagal mencabut sesi", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Tambahkan peran", "noCustomRoles": "Tidak ada peran khusus yang ditentukan.", - "removeRoleFailed": "Gagal menghapus peran", - "assignRoleFailed": "Gagal menetapkan peran", - "deleteRoleFailed": "Gagal menghapus peran", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", "userAdminAccess": "Administrator", "userAdminAccessDesc": "Akses penuh ke semua pengaturan admin.", - "userRoles": "Peran", - "revokeAllUserSessions": "Batalkan Semua Sesi", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Paksa masuk ulang di semua perangkat", - "revoke": "Menarik kembali", + "revoke": "Revoke", "deleteUserWarning": "Penghapusan pengguna ini bersifat permanen.", - "deleteUser": "Hapus {{username}}", - "deleting": "Menghapus...", - "deleteUserFailed": "Gagal menghapus pengguna", - "deleteUserSuccess": "Pengguna \"{{username}}\" dihapus", - "deleteRoleSuccess": "Peran \"{{name}}\" dihapus", - "revokeKeySuccess": "Kunci \"{{name}}\" dicabut", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Gagal mencabut kunci", - "copiedToClipboard": "Disalin ke papan klip", + "copiedToClipboard": "Copied to clipboard", "done": "Selesai", - "createUserTitle": "Buat Pengguna", + "createUserTitle": "Create User", "createUserDesc": "Buat akun lokal baru.", - "createUserUsername": "Nama belakang", - "createUserPassword": "Kata sandi", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Minimal 6 karakter.", - "createUserEnterUsername": "Masukkan nama pengguna", - "createUserEnterPassword": "Masukkan kata sandi", - "createUserSubmit": "Buat Pengguna", - "editUserTitle": "Kelola Pengguna: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Edit peran, status admin, sesi, dan pengaturan akun.", - "editUserUsername": "Nama belakang", + "editUserUsername": "Username", "editUserAuthType": "Jenis Otorisasi", - "editUserAdminStatus": "Status Admin", - "editUserUserId": "ID Pengguna", - "linkAccountTitle": "Hubungkan OIDC ke Akun Kata Sandi", - "linkAccountDesc": "Gabungkan akun OIDC {{username}} dengan akun lokal yang sudah ada.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Ini akan:", "linkAccountEffect1": "Hapus akun khusus OIDC.", "linkAccountEffect2": "Tambahkan login OIDC ke akun target.", "linkAccountEffect3": "Izinkan login melalui OIDC dan kata sandi.", - "linkAccountTargetUsername": "Nama Pengguna Target", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Masukkan nama pengguna akun lokal yang ingin dihubungkan.", - "linkAccounts": "Tautkan Akun", - "linkAccountSuccess": "Akun OIDC terhubung ke \"{{username}}\"", - "linkAccountFailed": "Gagal menautkan akun OIDC", - "linkAccountInProgress": "Menghubungkan...", - "saving": "Penghematan...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Gagal memperbarui pengaturan pendaftaran", "updatePasswordLoginFailed": "Gagal memperbarui pengaturan login kata sandi.", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Gagal memperbarui pengaturan penyediaan otomatis OIDC.", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Gagal memperbarui pengaturan pengaturan ulang kata sandi.", "sessionTimeoutRange2": "Batas waktu sesi harus antara 1 dan 720 jam.", - "sessionTimeoutSaved": "Gagal menyimpan batas waktu sesi", + "sessionTimeoutSaved": "Session timeout saved", "sessionTimeoutSaveFailed": "Gagal menyimpan waktu habis sesi", "monitoringIntervalInvalid": "Nilai interval tidak valid", "monitoringSaved": "Pengaturan pemantauan tersimpan", "monitoringSaveFailed": "Gagal menyimpan pengaturan pemantauan", - "guacamoleSaved": "Pengaturan guacamole tersimpan.", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Gagal menyimpan pengaturan Guacamole", "guacamoleUpdateFailed": "Gagal memperbarui pengaturan Guacamole", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Gagal memperbarui level log.", "oidcSaved": "Konfigurasi OIDC tersimpan", "oidcSaveFailed": "Gagal menyimpan konfigurasi OIDC", "oidcRemoved": "Konfigurasi OIDC dihapus", "oidcRemoveFailed": "Gagal menghapus konfigurasi OIDC", "createUserRequired": "Nama pengguna dan kata sandi diperlukan.", - "createUserPasswordTooShort": "Kata sandi harus minimal 6 karakter.", - "createUserSuccess": "Pengguna \"{{username}}\" membuat", - "createUserFailed": "Gagal membuat pengguna", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Gagal memperbarui status admin", "allSessionsRevoked": "Semua sesi dibatalkan", - "revokeSessionsFailed": "Gagal mencabut sesi", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Nama dan nama tampilan wajib diisi.", - "createRoleSuccess": "Peran \"{{name}}\" dibuat", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Gagal membuat peran", "apiKeyNameRequired": "Nama kunci wajib diisi.", "apiKeyUserRequired": "ID pengguna diperlukan.", - "apiKeyCreatedSuccess": "Kunci API \"{{name}}\" berhasil dibuat", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Gagal membuat kunci API", "exportSuccess": "Basis data berhasil diekspor.", "exportFailed": "Ekspor basis data gagal", "importSelectFile": "Silakan pilih file terlebih dahulu.", - "importCompleted": "Impor selesai: {{total}} item diimpor, {{skipped}} dilewati", - "importFailed": "Impor gagal: {{error}}", - "importError": "Impor basis data gagal" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Impor basis data gagal", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Tuan rumah", - "hostPlaceholder": "192.168.1.1 atau example.com", - "portLabel": "Pelabuhan", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Nama belakang", - "usernamePlaceholder": "nama belakang", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Otorisasi", - "passwordLabel": "Kata sandi", - "passwordPlaceholder": "kata sandi", - "privateKeyLabel": "Kunci Pribadi", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Tempelkan kunci pribadi...", - "credentialLabel": "Mandat", + "credentialLabel": "Credential", "credentialPlaceholder": "Pilih kredensial yang tersimpan", - "connectToTerminal": "Hubungkan ke Terminal", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Menghubungkan ke File" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Hapus Semua", "noHistoryEntries": "Tidak ada entri riwayat.", "trackingDisabled": "Pelacakan riwayat dinonaktifkan", - "trackingDisabledHint": "Aktifkan fitur ini di pengaturan profil Anda untuk merekam perintah." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Rekaman Kunci", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Rekam ke terminal", "selectAll": "Semua", - "selectNone": "Tidak ada", + "selectNone": "None", "noTerminalTabsOpen": "Tidak ada tab terminal yang terbuka.", "selectTerminalsAbove": "Pilih terminal di atas", "broadcastInputPlaceholder": "Ketik di sini untuk menyiarkan ketukan keyboard...", "stopRecording": "Hentikan Perekaman", "startRecording": "Mulai Merekam", - "settingsTitle": "Pengaturan", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Aktifkan salin/tempel dengan klik kanan" }, "splitScreen": { @@ -1967,118 +2424,158 @@ "dragTabsHint": "Seret tab ke panel di atas, atau gunakan Penugasan Cepat.", "dropHere": "Jatuhkan di sini", "emptyPane": "Kosong", - "dashboard": "Dasbor", + "dashboard": "Dashboard", "clearSplitScreen": "Hapus Layar Terpisah", "quickAssign": "Penugasan Cepat", - "alreadyAssigned": "Panel {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Tab Terpisah", "addToSplit": "Tambahkan ke Split", "removeFromSplit": "Hapus dari Split", - "assignToPane": "Tetapkan ke panel" + "assignToPane": "Tetapkan ke panel", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Buat Cuplikan", - "createSnippetDescription": "Buat cuplikan perintah baru untuk eksekusi cepat.", - "nameLabel": "Nama", - "namePlaceholder": "misalnya, Mulai ulang Nginx", - "descriptionLabel": "Keterangan", - "descriptionPlaceholder": "Deskripsi opsional", - "optional": "Opsional", - "folderLabel": "Map", - "noFolder": "Tidak ada folder (Tidak terkategorikan)", - "commandLabel": "Memerintah", - "commandPlaceholder": "misalnya, sudo systemctl restart nginx", - "cancel": "Membatalkan", - "createSnippetButton": "Buat Cuplikan", - "createFolderTitle": "Buat Folder", - "createFolderDescription": "Susun cuplikan Anda ke dalam folder.", - "folderNameLabel": "Nama Folder", - "folderNamePlaceholder": "misalnya, Perintah Sistem, Skrip Docker", - "folderColorLabel": "Warna Folder", - "folderIconLabel": "Ikon Folder", - "previewLabel": "Pratinjau", - "folderNameFallback": "Nama Folder", - "createFolderButton": "Buat Folder", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Terminal Target", "selectAll": "Semua", - "selectNone": "Tidak ada", + "selectNone": "None", "noTerminalTabsOpen": "Tidak ada tab terminal yang terbuka.", - "searchPlaceholder": "Cuplikan pencarian...", - "newSnippet": "Cuplikan Baru", - "newFolder": "Folder Baru", - "run": "Berlari", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Tidak ada cuplikan di folder ini", - "uncategorized": "Tidak dikategorikan", - "editSnippetTitle": "Edit Cuplikan", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Perbarui cuplikan perintah ini", "saveSnippetButton": "Simpan Perubahan", - "createSuccess": "Cuplikan berhasil dibuat.", - "createFailed": "Gagal membuat cuplikan", - "updateSuccess": "Cuplikan berhasil diperbarui.", - "updateFailed": "Gagal memperbarui cuplikan", - "deleteFailed": "Gagal menghapus cuplikan", - "folderCreateSuccess": "Folder berhasil dibuat.", - "folderCreateFailed": "Gagal membuat folder", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", "editFolderTitle": "Edit Folder", "editFolderDescription": "Ganti nama atau ubah tampilan folder ini", "saveFolderButton": "Simpan Perubahan", "editFolder": "Edit folder", "deleteFolder": "Hapus folder", - "folderDeleteSuccess": "Folder \"{{name}}\" dihapus", - "folderDeleteFailed": "Gagal menghapus folder", - "folderEditSuccess": "Folder berhasil diperbarui.", - "folderEditFailed": "Gagal memperbarui folder", - "confirmRunMessage": "Jalankan \"{{name}}\"?", - "confirmRunButton": "Berlari", - "runSuccess": "Menjalankan \"{{name}}\" di {{count}} terminal", - "copySuccess": "\"{{name}}\" disalin ke papan klip", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Bagikan Cuplikan", - "shareUser": "Pengguna", - "shareRole": "Peran", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Pilih pengguna...", "selectRole": "Pilih peran...", "shareSuccess": "Cuplikan berhasil dibagikan", "shareFailed": "Cuplikan gagal dibagikan", "revokeSuccess": "Akses dicabut", - "revokeFailed": "Gagal mencabut akses", - "currentAccess": "Akses Saat Ini", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Gagal memuat data berbagi.", - "loading": "Memuat...", - "close": "Menutup", - "reorderFailed": "Gagal menyimpan urutan cuplikan" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Gagal menyimpan urutan cuplikan", + "importExport": "Impor / Ekspor", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Tidak ada host yang dikonfigurasi.", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Akun", - "sectionAppearance": "Penampilan", - "sectionSecurity": "Keamanan", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "Kunci API", "sectionC2sTunnels": "Terowongan C2S", - "usernameLabel": "Nama belakang", - "roleLabel": "Peran", + "usernameLabel": "Username", + "roleLabel": "Role", "roleAdministrator": "Administrator", "authMethodLabel": "Metode Otentikasi", - "authMethodLocal": "Lokal", + "authMethodLocal": "Local", "twoFaLabel": "Otentikasi Dua Faktor (2FA)", "twoFaOn": "Pada", "twoFaOff": "Mati", - "versionLabel": "Versi", - "deleteAccount": "Hapus Akun", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Hapus akun Anda secara permanen", - "deleteButton": "Menghapus", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Tindakan ini bersifat permanen dan tidak dapat dibatalkan.", "deleteAccountWarning": "Semua sesi, host, kredensial, dan pengaturan akan dihapus secara permanen.", - "confirmPasswordDeletePlaceholder": "Masukkan kata sandi Anda untuk konfirmasi.", - "languageLabel": "Bahasa", - "themeLabel": "Tema", - "fontSizeLabel": "Ukuran Huruf", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Warna Aksen", "settingsTerminal": "Terminal", - "commandAutocomplete": "Pelengkapan Otomatis Perintah", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Tampilkan fitur pelengkapan otomatis saat mengetik.", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Pelacakan Riwayat", "historyTrackingDesc": "Lacak perintah terminal", - "syntaxHighlighting": "Penyorotan Sintaksis", - "syntaxHighlightingDesc": "Sorot keluaran terminal", "commandPalette": "Palet Perintah", "commandPaletteDesc": "Aktifkan pintasan keyboard", "reopenTabsOnLogin": "Buka Kembali Tab saat Masuk", @@ -2086,18 +2583,24 @@ "confirmTabClose": "Konfirmasi Penutupan Tab", "confirmTabCloseDesc": "Tanyakan terlebih dahulu sebelum menutup tab terminal.", "settingsSidebar": "Sidebar", - "showHostTags": "Tag Pembawa Acara", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Tampilkan tag di daftar host", "hostTrayOnClick": "Klik untuk Memperluas Tindakan Host", "hostTrayOnClickDesc": "Selalu tampilkan tombol koneksi; klik untuk memperluas opsi manajemen, bukan dengan mengarahkan kursor.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Pertahankan agar bilah sisi kiri aplikasi selalu terbuka, alih-alih terbuka saat diarahkan kursor.", - "settingsSnippets": "Cuplikan", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Folder Dilipat", "foldersCollapsedDesc": "Secara default, folder akan diciutkan.", "confirmExecution": "Konfirmasi Eksekusi", "confirmExecutionDesc": "Konfirmasikan sebelum menjalankan cuplikan kode.", - "settingsUpdates": "Pembaruan", + "settingsUpdates": "Updates", "disableUpdateChecks": "Nonaktifkan Pemeriksaan Pembaruan", "disableUpdateChecksDesc": "Berhenti memeriksa pembaruan.", "totpAuthenticator": "Otentikator TOTP", @@ -2109,68 +2612,68 @@ "qrCode": "Kode QR", "totpInstructions": "Pindai kode QR atau masukkan kode rahasia di aplikasi otentikasi Anda, lalu masukkan kode 6 digit.", "totpCodePlaceholder": "000000", - "verify": "Memeriksa", - "changePassword": "Ubah Kata Sandi", - "currentPasswordLabel": "Kata Sandi Saat Ini", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Kata sandi saat ini", - "newPasswordLabel": "Kata Sandi Baru", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Kata sandi baru", "confirmPasswordLabel": "Konfirmasi Kata Sandi Baru", "confirmPasswordPlaceholder": "Konfirmasi kata sandi baru", "updatePassword": "Perbarui Kata Sandi", "createApiKeyTitle": "Buat Kunci API", "createApiKeyDescription": "Buat kunci API baru untuk akses terprogram.", - "apiKeyNameLabel": "Nama", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "misalnya, CI Pipeline", "expiryDateLabel": "Tanggal Kedaluwarsa", "optional": "opsional", - "cancel": "Membatalkan", + "cancel": "Cancel", "createKey": "Buat Kunci", - "apiKeyCount": "{{count}} kunci", + "apiKeyCount": "{{count}} keys", "newKey": "Kunci Baru", "noApiKeys": "Belum ada kunci API.", - "apiKeyActive": "Aktif", + "apiKeyActive": "Active", "apiKeyUsageHint": "Sertakan kunci Anda di dalam", "apiKeyUsageHintHeader": "Judul.", "apiKeyPermissionsHint": "Kunci mewarisi izin dari pengguna yang membuatnya.", - "roleUser": "Pengguna", - "authMethodDual": "Otorisasi Ganda", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Gagal memulai pengaturan TOTP", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Masukkan kode 6 digit", "totpEnabledSuccess": "Autentikasi dua faktor diaktifkan", "totpInvalidCode": "Kode tidak valid, silakan coba lagi.", "totpDisableInputRequired": "Masukkan kode TOTP atau kata sandi Anda.", - "totpDisabledSuccess": "Autentikasi dua faktor dinonaktifkan", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "Gagal menonaktifkan 2FA.", - "totpDisableTitle": "Nonaktifkan otentikasi dua faktor (2FA).", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Masukkan kode TOTP atau kata sandi.", - "totpDisableConfirm": "Nonaktifkan otentikasi dua faktor (2FA).", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Lanjutkan Verifikasi", - "totpVerifyTitle": "Verifikasi Kode", - "totpBackupTitle": "Kode Cadangan", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Unduh Kode Cadangan", "done": "Selesai", "secretCopied": "Rahasia disalin ke papan klip", "apiKeyNameRequired": "Nama kunci wajib diisi.", - "apiKeyCreated": "Kunci API \"{{name}}\" berhasil dibuat", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Gagal membuat kunci API", - "apiKeyUser": "Pengguna", - "apiKeyExpires": "Berakhir", - "apiKeyRevoked": "Kunci API \"{{name}}\" dicabut", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "Gagal mencabut kunci API", "passwordFieldsRequired": "Kata sandi lama dan baru wajib diisi.", - "passwordMismatch": "Kata sandi tidak cocok", - "passwordTooShort": "Kata sandi harus minimal 6 karakter.", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Kata sandi berhasil diperbarui.", "passwordUpdateFailed": "Gagal memperbarui kata sandi", "deletePasswordRequired": "Kata sandi diperlukan untuk menghapus akun Anda.", - "deleteFailed": "Gagal menghapus akun", - "deleting": "Menghapus...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Buka pemilih warna", - "themeSystem": "Sistem", - "themeLight": "Lampu", - "themeDark": "Gelap", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Utara", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "baru saja", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Panah Atas", + "arrowDown": "Panah ke Bawah", + "arrowLeft": "Panah Kiri", + "arrowRight": "Panah Kanan", + "home": "Home", + "end": "Akhir", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Selesai" } } diff --git a/src/ui/locales/translated/it_IT.json b/src/ui/locales/translated/it_IT.json index 0456560c..c9428784 100644 --- a/src/ui/locales/translated/it_IT.json +++ b/src/ui/locales/translated/it_IT.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Cartelle", - "folder": "Cartella", + "folders": "Folders", + "folder": "Folder", "password": "Password", - "key": "Chiave", - "sshPrivateKey": "Chiave Privata Ssh", - "upload": "Carica", - "keyPassword": "Password Della Chiave", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "Chiave SSH", - "uploadPrivateKeyFile": "Carica File Chiave Privata", - "searchCredentials": "Cerca credenziali...", - "addCredential": "Aggiungi Credenziali", - "caCertificate": "Certificato CA (-cert.pub)", - "caCertificateDescription": "Opzionale: carica o incolla il file di certificato firmato CA (ad esempio id_ed25519-cert.pub). Richiesto quando il server SSH utilizza autorizzazioni basate su certificati.", - "uploadCertFile": "Carica file -cert.pub", - "clearCert": "Pulisci", - "certLoaded": "Certificato caricato", - "certPublicKeyLabel": "Certificato CA", - "certTypeLabel": "Tipo di certificato", - "pasteOrUploadCert": "Incolla o carica un certificato -cert.pub ...", - "hasCaCert": "Ha Certificato CA", - "noCaCert": "Nessun Certificato Ca" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Ordine predefinito", + "sortNameAsc": "Nome (A → Z)", + "sortNameDesc": "Nome (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Filtri trasparenti", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "Chiave SSH", + "filterTagsGroup": "Etichette" }, "homepage": { - "failedToLoadAlerts": "Impossibile caricare gli avvisi", - "failedToDismissAlert": "Impossibile annullare l'avviso" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Configurazione Del Server", - "description": "Configura l'URL del server Termix per connettersi ai tuoi servizi di backend", - "serverUrl": "Url Del Server", - "enterServerUrl": "Inserisci un URL del server", - "saveFailed": "Impossibile salvare la configurazione", - "saveError": "Errore nel salvataggio della configurazione", - "saving": "Salvataggio...", - "saveConfig": "Salva Configurazione", - "helpText": "Inserisci l'URL in cui è in esecuzione il tuo server Termix (ad esempio, http://localhost:30001 o https://your-server.com)", - "changeServer": "Cambia Server", - "mustIncludeProtocol": "L'URL del server deve iniziare con http:// o ↓ ://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Consenti certificato non valido", "allowInvalidCertificateDesc": "Da utilizzare esclusivamente per server self-hosted affidabili con certificati autofirmati o certificati IP.", - "useEmbedded": "Usa Server Locale", - "embeddedDesc": "Esegue Termix con il server locale integrato (nessun server remoto necessario)", - "embeddedConnecting": "Connessione al server locale...", - "embeddedNotReady": "Il server locale non è ancora pronto. Attendere un attimo e riprovare.", - "localServer": "Server Locale" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Rimuovere" }, "versionCheck": { - "error": "Errore Controllo Versione", - "checkFailed": "Impossibile controllare gli aggiornamenti", - "upToDate": "L'app è aggiornata", - "currentVersion": "Stai eseguendo la versione {{version}}", - "updateAvailable": "Aggiornamento Disponibile", - "newVersionAvailable": "È disponibile una nuova versione! Stai eseguendo {{current}}, ma {{latest}} è disponibile.", - "betaVersion": "Versione Beta", - "betaVersionDesc": "Stai eseguendo {{current}}, che è più recente dell'ultima versione stabile {{latest}}.", - "releasedOn": "Pubblicato il {{date}}", - "downloadUpdate": "Scarica Aggiornamento", - "checking": "Controllo aggiornamenti...", - "checkUpdates": "Controlla aggiornamenti", - "checkingUpdates": "Controllo aggiornamenti...", - "updateRequired": "Aggiornamento Richiesto" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Chiudi", + "close": "Close", "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Continua", - "maintenance": "Manutenzione", + "continue": "Continue", + "maintenance": "Maintenance", "degraded": "Degraded", - "error": "Errore", - "warning": "Attenzione", - "unsavedChanges": "Modifiche non salvate", - "dismiss": "Ignora", - "loading": "Caricamento...", - "optional": "Facoltativo", - "connect": "Connetti", - "copied": "Copiato", - "connecting": "Connessione...", - "updateAvailable": "Aggiornamento Disponibile", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Apri in una nuova scheda", - "noReleases": "Nessuna Rilascio", - "updatesAndReleases": "Aggiornamenti E Rilasci", - "newVersionAvailable": "È disponibile una nuova versione ({{version}}).", - "failedToFetchUpdateInfo": "Recupero delle informazioni di aggiornamento non riuscito", - "preRelease": "Pre-rilascio", - "noReleasesFound": "Nessuna release trovata.", - "cancel": "Annulla", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancellare", "username": "Username", - "login": "Accedi", - "register": "Registrati", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Password", - "confirmPassword": "Conferma Password", - "back": "Indietro", - "save": "Salva", - "saving": "Salvataggio...", - "delete": "Elimina", - "rename": "Rinomina", - "edit": "Modifica", - "add": "Aggiungi", - "confirm": "Conferma", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", "no": "No", - "or": "O", - "next": "Successivo", - "previous": "Precedente", - "refresh": "Aggiorna", - "language": "Lingua", - "checking": "Controllo...", - "checkingDatabase": "Controllo connessione database...", - "checkingAuthentication": "Controllo autenticazione...", - "backendReconnected": "Connessione al server ripristinata", - "connectionDegraded": "Connessione al server persa, recupero…", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Rimuovi", - "create": "Crea", - "update": "Aggiorna", + "remove": "Rimuovere", + "create": "Create", + "update": "Update", "copy": "Copia", - "copyFailed": "Impossibile copiare negli appunti", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Ripristina", - "of": "di" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { "home": "Home", - "terminal": "Terminale", + "terminal": "terminale", "docker": "Docker", - "tunnels": "Gallerie", - "fileManager": "Gestore File", - "serverStats": "Statistiche Server", - "admin": "Amministratore", - "userProfile": "Profilo Utente", - "splitScreen": "Schermo Diviso", - "confirmClose": "Chiudere questa sessione attiva?", - "close": "Chiudi", - "cancel": "Annulla", - "sshManager": "Gestore SSH", - "cannotSplitTab": "Impossibile dividere questa scheda", + "tunnels": "Tunnels", + "fileManager": "Gestore file", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Cancellare", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Copia Password", - "copySudoPassword": "Copia Password Sudo", - "passwordCopied": "Password copiata negli appunti", - "noPasswordAvailable": "Nessuna password disponibile", - "failedToCopyPassword": "Impossibile copiare la password", - "refreshTab": "Aggiorna connessione", - "openFileManager": "Apri File Manager", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", "dashboard": "Dashboard", - "networkGraph": "Grafico Di Rete", - "quickConnect": "Connessione Rapida", - "sshTools": "Strumenti SSH", - "history": "Storico", - "hosts": "Host", - "snippets": "Snippet", - "hostManager": "Gestore Host", - "credentials": "Credenziali", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Connessioni", - "roleAdministrator": "Amministratore", - "roleUser": "Utente" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Host", - "noHosts": "Nessun Host SSH", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", "retry": "Riprova", - "refresh": "Aggiorna", - "optional": "Facoltativo", - "downloadSample": "Scarica Esempio", - "failedToDeleteHost": "Impossibile eliminare {{name}}", - "importSkipExisting": "Importazione (salta esistente)", - "connectionDetails": "Dettagli Della Connessione", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Telnet", - "remoteDesktop": "Desktop Remoto", - "port": "Porta", + "telnet": "Internet", + "remoteDesktop": "Remote Desktop", + "port": "Port", "username": "Username", - "folder": "Cartella", + "folder": "Folder", "tags": "Etichette", "pin": "Pin", - "addHost": "Aggiungi Host", - "editHost": "Modifica Host", - "cloneHost": "Clona Host", - "enableTerminal": "Abilita Terminale", - "enableTunnel": "Abilita Tunnel", - "enableFileManager": "Abilita Gestore File", - "enableDocker": "Abilita Docker", - "defaultPath": "Percorso Predefinito", - "connection": "Connessione", - "upload": "Carica", - "authentication": "Autenticazione", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Password", - "key": "Chiave", + "key": "Key", "credential": "Credenziali", "none": "Nessuno", - "sshPrivateKey": "Chiave Privata Ssh", - "keyType": "Tipo Di Chiave", - "uploadFile": "Carica File", - "tabGeneral": "Generale", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "terminale", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Gallerie", + "tabTunnels": "Tunnels", "tabDocker": "Docker", - "tabFiles": "File", - "tabStats": "Statistiche", - "tabTelnet": "Telnet", - "tabSharing": "Condivisione", - "tabAuthentication": "Autenticazione", - "terminal": "Terminale", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Internet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "terminale", "tunnel": "Tunnel", - "fileManager": "Gestore File", - "serverStats": "Statistiche Server", + "fileManager": "Gestore file", + "serverStats": "Host Metrics", "status": "Stato", - "folderRenamed": "Cartella \"{{oldName}}\" rinominata in \"{{newName}}\" con successo", - "failedToRenameFolder": "Impossibile rinominare la cartella", - "movedToFolder": "Spostato in \"{{folder}}\"", - "editHostTooltip": "Modifica host", - "statusChecks": "Controlli Di Stato", - "metricsCollection": "Collezione Di Metriche", - "metricsInterval": "Intervallo Di Raccolta Metriche", - "metricsIntervalDesc": "Quanto spesso raccogliere statistiche del server (5s - 1h)", - "behavior": "Comportamento", - "themePreview": "Anteprima Tema", - "theme": "Tema", - "fontFamily": "Famiglia Carattere", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Spaziatura Lettera", - "lineHeight": "Altezza Linea", - "cursorStyle": "Stile Del Cursore", - "cursorBlink": "Collegamento Del Cursore", - "scrollbackBuffer": "Buffer Di Scorrimento", - "bellStyle": "Stile Campana", - "rightClickSelectsWord": "Click Destro Seleziona Parola", - "fastScrollModifier": "Modificatore Di Scorrimento Veloce", - "fastScrollSensitivity": "Sensibilità Di Scorrimento Veloce", - "sshAgentForwarding": "Inoltro Agente Ssh", - "backspaceMode": "Modalità Backspace", - "startupSnippet": "Snippet Di Avvio", - "selectSnippet": "Seleziona snippet", - "forceKeyboardInteractive": "Forza Tastiera-Interattiva", - "overrideCredentialUsername": "Ignora Il Nome Utente Credenziale", - "overrideCredentialUsernameDesc": "Usa il nome utente specificato sopra invece del nome utente delle credenziali", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", "jumpHostChain": "Jump Host Chain", - "portKnocking": "Colpo Porta", - "addKnock": "Aggiungi Porta", - "addProxyNode": "Aggiungi Nodo", - "proxyNode": "Nodo Proxy", - "proxyType": "Tipo Proxy", - "quickActions": "Azioni Rapide", - "sudoPasswordAutoFill": "Riempimento Automatico Password Sudo", - "sudoPassword": "Password Sudo", - "keepaliveInterval": "Intervallo Di Mantenimento (Ms)", - "moshCommand": "Comando MOSH", - "environmentVariables": "Variabili Di Ambiente", - "addVariable": "Aggiungi Variabile", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Copia URL Del Terminale", - "copyFileManagerUrl": "Copia URL Del Gestore File", - "copyRemoteDesktopUrl": "Copia Url Del Desktop Remoto", - "failedToConnect": "Connessione alla console non riuscita", - "connect": "Connetti", - "disconnect": "Disconnetti", - "start": "Inizia", - "enableStatusCheck": "Abilita Controllo Stato", - "enableMetrics": "Abilita Le Metriche", - "bulkUpdateFailed": "Aggiornamento di massa non riuscito", - "selectAll": "Seleziona Tutto", - "deselectAll": "Deseleziona Tutto", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Shell Sicuro", - "virtualNetwork": "Rete Virtuale", - "unencryptedShell": "Shell non cifrata", - "addressIp": "Indirizzo / IP", - "friendlyName": "Nome Amichevole", - "folderAndAdvanced": "Cartella & Avanzata", - "privateNotes": "Note Private", - "privateNotesPlaceholder": "Dettagli su questo server...", - "pinToTop": "Pin verso l'alto", - "pinToTopDesc": "Mostra sempre questo host in cima alla lista", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", "portKnockingSequence": "Port Knocking Sequence", - "addKnockBtn": "Aggiungi Knock", - "noPortKnocking": "Nessuna porta bussata configurata.", - "knockPort": "Porta Knock", - "protocol": "Protocol", - "delayAfterMs": "Ritardo Dopo (ms)", - "useSocks5Proxy": "Usa Proxy SOCKS5", - "useSocks5ProxyDesc": "Percorso connessione attraverso un server proxy", - "proxyHost": "Host Proxy", - "proxyPort": "Porta Proxy", - "proxyUsername": "Nome Utente Proxy", - "proxyPassword": "Password Proxy", - "proxySingleMode": "Singolo Proxy", - "proxyChainMode": "Catena Proxy", - "you": "Tu", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protocollo", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", "jumpHostChainLabel": "Jump Host Chain", - "addJumpBtn": "Aggiungi Salto", - "noJumpHosts": "Nessun host jump configurato.", - "selectAServer": "Seleziona un server...", - "sshPort": "Porta SSH", - "authMethod": "Metodo Autenticazione", - "storedCredential": "Credenziali Archiviate", - "selectACredential": "Seleziona una credenziale...", - "keyTypeLabel": "Tipo Di Chiave", - "keyTypeAuto": "Rilevamento Automatico", - "keyPasteTab": "Incolla", - "keyUploadTab": "Carica", - "keyFileLoaded": "File chiave caricato", - "keyUploadClick": "Clicca per caricare .pem / .key / .ppk", - "clearKey": "Pulisci chiave", - "keySaved": "Chiave SSH salvata", - "keyReplaceNotice": "incolla una nuova chiave qui sotto per sostituirla", - "keyPassphraseSaved": "Passphrase salvata, digita per cambiare", - "replaceKey": "Sostituisci chiave", - "forceKeyboardInteractiveLabel": "Forza Tastiera Interattiva", - "forceKeyboardInteractiveShortDesc": "Forza l'inserimento manuale della password anche se le chiavi sono presenti", - "terminalAppearance": "Aspetto Del Terminale", - "colorTheme": "Tema Colore", - "fontFamilyLabel": "Famiglia Carattere", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Stile Del Cursore", - "letterSpacingPx": "Spaziatura Lettera (px)", - "lineHeightLabel": "Altezza Linea", - "bellStyleLabel": "Stile Campana", - "backspaceModeLabel": "Modalità Backspace", - "cursorBlinking": "Scollegamento Del Cursore", - "cursorBlinkingDesc": "Abilita l'animazione lampeggiante per il cursore del terminale", - "rightClickSelectsWordLabel": "Clic Destro Seleziona Parola", - "rightClickSelectsWordShortDesc": "Seleziona la parola sotto il cursore nel clic destro", - "behaviorAndAdvanced": "Comportamento E Avanzate", - "scrollbackBufferLabel": "Buffer Di Scorrimento", - "scrollbackMaxLines": "Numero massimo di righe storiche", - "sshAgentForwardingLabel": "Inoltro Agente Ssh", - "sshAgentForwardingShortDesc": "Passa le tue chiavi SSH locali a questo host", - "enableAutoMosh": "Abilita Auto-Mosh", - "enableAutoMoshDesc": "Preferisci Mosh su SSH se disponibile", - "enableAutoTmux": "Abilita Auto-Tmux", - "enableAutoTmuxDesc": "Lancia o collega automaticamente alla sessione tmux", - "sudoPasswordAutoFillLabel": "Riempimento Automatico Password Sudo", - "sudoPasswordAutoFillShortDesc": "Fornisci automaticamente la password di sudo quando richiesto", - "sudoPasswordLabel": "Password Sudo", - "environmentVariablesLabel": "Variabili Di Ambiente", - "addVariableBtn": "Aggiungi Variabile", - "noEnvVars": "Nessuna variabile d' ambiente configurata.", - "fastScrollModifierLabel": "Modificatore Di Scorrimento Veloce", - "fastScrollSensitivityLabel": "Sensibilità Di Scorrimento Veloce", - "moshCommandLabel": "Comando Mosh", - "startupSnippetLabel": "Snippet Di Avvio", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Intervallo di keep-alive (secondi)", - "maxKeepaliveMisses": "Max Misses Keepalive", - "tunnelSettings": "Impostazioni Tunnel", - "enableTunneling": "Abilita Tunneling", - "enableTunnelingDesc": "Abilita la funzionalità del tunnel SSH per questo host", - "serverTunnelsSection": "Tunnel Del Server", - "addTunnelBtn": "Aggiungi Tunnel", - "noTunnelsConfigured": "Nessun tunnel configurato.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", - "tunnelType": "Tipo Di Tunnel", - "tunnelModeLocalDesc": "Inoltra una porta locale a una porta sul server remoto (o un host da essa raggiungibile).", - "tunnelModeRemoteDesc": "Inoltra una porta sul server remoto a una porta locale sul tuo computer.", - "tunnelModeDynamicDesc": "Crea un proxy SOCKS5 su una porta locale per l'inoltro dinamico delle porte.", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Questo host (tunnel diretto)", - "endpointHost": "Host Endpoint", - "endpointPort": "Porta Endpoint", - "bindHost": "Associa Host", - "sourcePort": "Porta Sorgente", - "maxRetries": "Riprova Massima", - "retryIntervalS": "Riprova Intervallo (s)", - "autoStartLabel": "Avvio Automatico", - "autoStartDesc": "Collega automaticamente questo tunnel quando l'host è caricato", - "tunnelConnecting": "Collegamento tunnel...", - "tunnelDisconnected": "Tunnel disconnesso", - "failedToConnectTunnel": "Impossibile connettersi", - "failedToDisconnectTunnel": "Disconnessione non riuscita", - "dockerIntegration": "Integrazione Docker", - "enableDockerMonitor": "Abilita Docker", - "enableDockerMonitorDesc": "Monitora e gestisci i contenitori su questo host tramite Docker", - "enableFileManagerMonitor": "Abilita Gestore File", - "enableFileManagerMonitorDesc": "Esplora e gestisce i file su questo host tramite SFTP", - "defaultPathLabel": "Percorso Predefinito", - "fileManagerPathHint": "La directory da aprire al lancio del file manager per questo host.", - "statusChecksLabel": "Controlli Di Stato", - "enableStatusChecks": "Abilita Controllo Stato", - "enableStatusChecksDesc": "Ping periodicamente questo host per verificare la disponibilità", - "useGlobalInterval": "Usa Intervallo Globale", - "useGlobalIntervalDesc": "Sovrascrivi con l'intervallo di controllo dello stato a livello server", - "checkIntervalS": "Verifica Intervallo (s)", - "checkIntervalDesc": "Secondi tra ogni ping di connettività", - "metricsCollectionLabel": "Collezione Di Metriche", - "enableMetricsLabel": "Abilita Le Metriche", - "enableMetricsDesc": "Raccogli l'utilizzo di CPU, RAM, disco e rete da questo host", - "useGlobalMetrics": "Usa Intervallo Globale", - "useGlobalMetricsDesc": "Sovrascrivi con l'intervallo di metriche a livello di server", - "metricsIntervalS": "Intervallo Di Metriche", - "metricsIntervalDesc2": "Secondi tra istantanee metriche", - "visibleWidgets": "Widget Visibili", - "cpuUsageLabel": "Utilizzo CPU", - "cpuUsageDesc": "CPU percentuale, media di carico, grafico linea di scintilla", - "memoryLabel": "Utilizzo Memoria", - "memoryDesc": "Utilizzo RAM, swap, memorizzato in cache", - "storageLabel": "Uso Del Disco", - "storageDesc": "Utilizzo disco per punto di montaggio", - "networkLabel": "Interfacce Di Rete", - "networkDesc": "Elenco delle interfacce e larghezza di banda", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "Chiave SSH", + "authTypeCredential": "Credenziali", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Nessuno", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", "uptimeLabel": "Uptime", - "uptimeDesc": "Tempo di funzionamento e avvio del sistema", - "systemInfoLabel": "Informazioni Di Sistema", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", "systemInfoDesc": "OS, kernel, hostname, architecture", - "recentLoginsLabel": "Login Recenti", - "recentLoginsDesc": "Login riuscito e fallito", - "topProcessesLabel": "Migliori Processi", - "topProcessesDesc": "PID, CPU%, MEM%, comando", - "listeningPortsLabel": "Porte Di Ascoltamento", - "listeningPortsDesc": "Apri porte con processo e stato", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, stato SELinux", - "quickActionsLabel": "Azioni Rapide", - "quickActionsToolbar": "Le azioni rapide appaiono come pulsanti nella barra degli strumenti Statistiche server per l'esecuzione di un comando con un clic.", - "noQuickActions": "Ancora nessuna azione rapida.", - "buttonLabel": "Etichetta pulsante", - "selectSnippetPlaceholder": "Seleziona snippet...", - "addActionBtn": "Aggiungi Azione", - "hostSharedSuccessfully": "Host condiviso con successo", - "failedToShareHost": "Impossibile condividere l'host", - "accessRevoked": "Accesso revocato", - "failedToRevokeAccess": "Impossibile revocare l'accesso", - "cancelBtn": "Annulla", - "savingBtn": "Salvataggio...", - "addHostBtn": "Aggiungi Host", - "hostUpdated": "Host aggiornato", - "hostCreated": "Host creato", - "failedToSave": "Impossibile salvare l'host", - "credentialUpdated": "Credenziali aggiornate", - "credentialCreated": "Credenziali create", - "failedToSaveCredential": "Impossibile salvare le credenziali", - "backToHosts": "Torna agli host", - "backToCredentials": "Torna alle credenziali", - "pinned": "Bloccato", - "noHostsFound": "Nessun host trovato", - "tryDifferentTerm": "Prova un termine diverso", - "addFirstHost": "Aggiungi il tuo primo host per iniziare", - "noCredentialsFound": "Nessuna credenziale trovata", - "addCredentialBtn": "Aggiungi Credenziali", - "updateCredentialBtn": "Aggiorna Credenziali", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancellare", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Fissato", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Caratteristiche", - "noFolder": "(Nessun cartella)", - "deleteSelected": "Elimina", - "exitSelection": "Esci dalla selezione", - "importSkip": "Importazione (salta esistente)", - "importOverwrite": "Importa (sovrascrive)", - "collapseBtn": "Comprimi", - "importExportBtn": "Importa / Esporta", - "hostStatusesRefreshed": "Stato host aggiornato", - "failedToRefreshHosts": "Impossibile aggiornare gli host", - "movedHostTo": "Spostato {{host}} in \"{{folder}}\"", - "failedToMoveHost": "Impossibile spostare l'host", - "folderRenamedTo": "Cartella rinominata in \"{{name}}\"", - "deletedFolder": "Cartella eliminata \"{{name}}\"", - "failedToDeleteFolder": "Impossibile eliminare la cartella", - "deleteAllInFolder": "Eliminare tutti gli host in \"{{name}}\"? Questo non può essere annullato.", - "deletedHost": "Eliminato {{name}}", - "copiedToClipboard": "Copiato negli appunti", - "terminalUrlCopied": "URL del terminale copiato", - "fileManagerUrlCopied": "URL del gestore file copiato", - "tunnelUrlCopied": "URL del tunnel copiato", - "dockerUrlCopied": "URL Docker copiato", - "serverStatsUrlCopied": "Url delle Statistiche del Server copiato", - "rdpUrlCopied": "URL RDP copiato", - "vncUrlCopied": "URL VNC copiato", - "telnetUrlCopied": "URL Telnet copiato", - "remoteDesktopUrlCopied": "URL Desktop remoto copiato", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancellare", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Stato", + "GroupByProtocol": "Protocollo", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Espandi le azioni", "collapseActions": "Comprimi le azioni", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Pacchetto magico inviato a {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Invio del pacchetto magico non riuscito", - "cloneHostAction": "Clona Host", - "copyAddress": "Copia Indirizzo", - "copyLink": "Copia Collegamento", - "copyTerminalUrlAction": "Copia URL Del Terminale", - "copyFileManagerUrlAction": "Copia URL Del Gestore File", - "copyTunnelUrlAction": "Copia URL Tunnel", - "copyDockerUrlAction": "Copia URL Docker", - "copyServerStatsUrlAction": "Copia Url Statistiche Server", - "copyRdpUrlAction": "Copia URL RDP", - "copyVncUrlAction": "Copia URL VNC", - "copyTelnetUrlAction": "Copia L'Url Telnet", - "copyRemoteDesktopUrlAction": "Copia Url Del Desktop Remoto", - "deleteCredentialConfirm": "Eliminare le credenziali \"{{name}}\"?", - "deletedCredential": "Eliminato {{name}}", - "deploySSHKeyTitle": "Dispiega Chiave SSH", - "deployingBtn": "Distribuzione...", - "deployBtn": "Dispiega", - "failedToDeployKey": "Impossibile implementare la chiave", - "deleteHostsConfirm": "Eliminare {{count}} host{{plural}}? Questo non può essere annullato.", - "movedToRoot": "Spostato nella root", - "failedToMoveHosts": "Impossibile spostare gli host", - "enableTerminalFeature": "Abilita Terminale", - "disableTerminalFeature": "Disabilita Terminale", - "enableFilesFeature": "Abilita File", - "disableFilesFeature": "Disabilita File", - "enableTunnelsFeature": "Abilita Gallerie", - "disableTunnelsFeature": "Disabilita Tunnel", - "enableDockerFeature": "Abilita Docker", - "disableDockerFeature": "Disabilita Docker", - "addTagsPlaceholder": "Aggiungi tag...", - "authDetails": "Dettagli Di Autenticazione", - "credType": "Tipo", - "generateKeyPairDesc": "Genera una nuova coppia di chiavi, sia le chiavi private che quelle pubbliche verranno riempite automaticamente.", - "generatingKey": "Generazione...", - "generateLabel": "Genera {{label}}", - "uploadFileBtn": "Carica file", - "keyPassphraseOptional": "Passphrase Chiave (Opzionale)", - "sshPublicKeyOptional": "Chiave Pubblica Ssh (Opzionale)", - "publicKeyGenerated": "Chiave pubblica generata", - "failedToGeneratePublicKey": "Impossibile ricavare la chiave pubblica", - "publicKeyCopied": "Chiave pubblica copiata", - "keyPairGenerated": "{{label}} coppia di chiavi generata", - "failedToGenerateKeyPair": "Impossibile generare la coppia di chiavi", - "searchHostsPlaceholder": "Cerca host, indirizzi, tag…", - "searchCredentialsPlaceholder": "Cerca credenziali…", - "refreshBtn": "Aggiorna", - "addTag": "Aggiungi tag...", - "deleteConfirmBtn": "Elimina", - "tunnelRequirementsText": "Il server SSH deve avere GatewayPorts sì, AllowTcpInoltro sì, e PermitRootLogin sì impostato in /etc/ssh/sshd_config.", - "deleteHostConfirm": "Eliminare \"{{name}}\"?", - "enableAtLeastOneProtocol": "Abilita almeno un protocollo sopra per configurare le impostazioni di autenticazione e connessione.", - "keyPassphrase": "Passphrase Chiave", - "connectBtn": "Connetti", - "disconnectBtn": "Disconnetti", - "basicInformation": "Informazioni Di Base", - "authDetailsSection": "Dettagli Di Autenticazione", - "credTypeLabel": "Tipo", - "hostsTab": "Host", - "credentialsTab": "Credenziali", - "selectMultiple": "Seleziona più", - "selectHosts": "Seleziona host", - "connectionLabel": "Connessione", - "authenticationLabel": "Autenticazione", - "generateKeyPairTitle": "Genera Coppia Chiavi", - "generateKeyPairDescription": "Genera una nuova coppia di chiavi, sia le chiavi private che quelle pubbliche verranno riempite automaticamente.", - "generateFromPrivateKey": "Genera da chiave privata", - "refreshBtn2": "Aggiorna", - "exitSelectionTitle": "Esci dalla selezione", - "exportAll": "Esporta Tutto", - "addHostBtn2": "Aggiungi Host", - "addCredentialBtn2": "Aggiungi Credenziali", - "checkingHostStatuses": "Controllo stato host...", - "pinnedSection": "Bloccato", - "hostsExported": "Host esportati con successo", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Fissato", + "hostsExported": "Hosts exported successfully", "exportFailed": "Impossibile esportare gli host", - "sampleDownloaded": "File di esempio scaricato", - "failedToDeleteCredential2": "Impossibile eliminare le credenziali", - "noFolderOption": "(Nessun cartella)", - "nSelected": "{{count}} selezionato", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Caratteristiche", - "moveMenu": "Sposta", - "cancelSelection": "Annulla", + "moveMenu": "Mossa", + "connectSelected": "Connect", + "cancelSelection": "Cancellare", "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", - "targetHostLabel": "Host Destinazione", - "selectHostOption": "Seleziona un host...", - "keyDeployedSuccess": "Chiave distribuita con successo", - "failedToDeployKey2": "Impossibile implementare la chiave", - "deletedCount": "Host eliminati {{count}}", - "failedToDeleteCount": "Impossibile eliminare gli host {{count}}", - "duplicatedHost": "Duplicato \"{{name}}\"", - "failedToDuplicateHost": "Impossibile duplicare l'host", - "updatedCount": "Host {{count}} aggiornati", - "friendlyNameLabel": "Nome Amichevole", - "descriptionLabel": "Descrizione", - "loadingHost": "Caricamento host...", - "loadingHosts": "Caricamento host...", - "loadingCredentials": "Caricamento credenziali...", - "noHostsYet": "Ancora nessun host", - "noHostsMatchSearch": "Nessun host corrisponde alla tua ricerca", - "hostNotFound": "Host non trovato", - "searchHosts": "Cerca host...", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Ordina gli host", "sortDefault": "Ordine predefinito", "sortNameAsc": "Nome (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "Etichette", - "shareHost": "Condividi Host", - "shareHostTitle": "Condividi: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Questo host deve usare una credenziale per abilitare la condivisione. Modificare l'host e assegnare prima una credenziale." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Connessione", - "authentication": "Autenticazione", - "connectionSettings": "Impostazioni Di Connessione", - "displaySettings": "Impostazioni Di Visualizzazione", - "audioSettings": "Impostazioni Audio", - "rdpPerformance": "Prestazioni RDP", - "deviceRedirection": "Reindirizzamento Dispositivo", - "session": "Sessione", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credenziali", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Appunti", - "sessionRecording": "Registrazione Sessione", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Impostazioni VNC", - "terminalSettings": "Impostazioni Del Terminale", - "rdpPort": "Porta RDP", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", "username": "Username", "password": "Password", - "domain": "Dominio", - "securityMode": "Modalità Di Sicurezza", - "colorDepth": "Profondità Colore", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Altezza", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Metodo Di Ridimensiona", - "clientName": "Nome Client", - "initialProgram": "Programma Iniziale", - "serverLayout": "Layout Del Server", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Porta Del Gateway", - "gatewayUsername": "Nome Utente Gateway", - "gatewayPassword": "Password Del Gateway", - "gatewayDomain": "Dominio Gateway", - "remoteAppProgram": "Programma RemoteApp", - "workingDirectory": "Directory Di Lavoro", - "arguments": "Argomenti", - "normalizeLineEndings": "Normalizza Riga Endings", - "recordingPath": "Percorso Di Registrazione", - "recordingName": "Nome Registrazione", - "macAddress": "Indirizzo MAC", - "broadcastAddress": "Indirizzo Di Trasmissione", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Tempo Di Attesa (s)", - "driveName": "Nome Unità", - "drivePath": "Percorso Unità", - "ignoreCertificate": "Ignora Certificato", - "ignoreCertificateDesc": "Consenti connessioni agli host con certificati autofirmati", - "forceLossless": "Forza Senza Perdita", - "forceLosslessDesc": "Forza la codifica delle immagini senza perdita (qualità superiore, larghezza di banda)", - "disableAudio": "Disabilita Audio", - "disableAudioDesc": "Silenzia tutto l'audio dalla sessione remota", - "enableAudioInput": "Abilita Ingresso Audio (Microfono)", - "enableAudioInputDesc": "Inoltra il microfono locale alla sessione remota", - "wallpaper": "Sfondo", - "wallpaperDesc": "Mostra sfondo desktop (disabilitando migliora le prestazioni)", - "theming": "Temi", - "themingDesc": "Abilita temi e stili visivi", - "fontSmoothing": "Sfumatura Carattere", - "fontSmoothingDesc": "Abilita il rendering dei caratteri ClearType", - "fullWindowDrag": "Trascina A Finestra Completa", - "fullWindowDragDesc": "Mostra i contenuti delle finestre durante il trascinamento", - "desktopComposition": "Composizione Desktop", - "desktopCompositionDesc": "Abilita effetti vetro Aero", - "menuAnimations": "Animazioni Menu", - "menuAnimationsDesc": "Abilita dissolvenza menu e animazioni delle diapositive", - "disableBitmapCaching": "Disabilita Bitmap Caching", - "disableBitmapCachingDesc": "Disattiva la cache bitmap (può aiutare con i difetti)", - "disableOffscreenCaching": "Disabilita Cache Fuori Schermo", - "disableOffscreenCachingDesc": "Disattiva cache fuori schermo", - "disableGlyphCaching": "Disabilita Glyph Caching", - "disableGlyphCachingDesc": "Disattiva la cache dei glifi", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Usa pipeline grafica RemoteFX", - "enablePrinting": "Abilita Stampa", - "enablePrintingDesc": "Reindirizza le stampanti locali alla sessione remota", - "enableDriveRedirection": "Abilita Reindirizzamento Unità", - "enableDriveRedirectionDesc": "Mappa una cartella locale come unità nella sessione remota", - "createDrivePath": "Crea Percorso Drive", - "createDrivePathDesc": "Crea automaticamente la cartella se non esiste", - "disableDownload": "Disabilita Download", - "disableDownloadDesc": "Impedisci di scaricare file dalla sessione remota", - "disableUpload": "Disabilita Caricamento", - "disableUploadDesc": "Impedisci di caricare file nella sessione remota", - "enableTouch": "Abilita Touch", - "enableTouchDesc": "Abilita l'inoltro touch input", - "consoleSession": "Sessione Console", - "consoleSessionDesc": "Connetti alla console (sessione 0) invece di una nuova sessione", - "sendWolPacket": "Invia Pacchetto WOL", - "sendWolPacketDesc": "Invia un pacchetto magico per risvegliare questo host prima di connettersi", - "disableCopy": "Disabilita Copia", - "disableCopyDesc": "Impedisci la copia del testo dalla sessione remota", - "disablePaste": "Disabilita Incolla", - "disablePasteDesc": "Impedisci di incollare il testo nella sessione remota", - "createPathIfMissing": "Crea tracciato se mancante", - "createPathIfMissingDesc": "Crea automaticamente la directory di registrazione", - "excludeOutput": "Escludi Output", - "excludeOutputDesc": "Non registrare l'output dello schermo (solo metadati)", - "excludeMouse": "Escludi Il Mouse", - "excludeMouseDesc": "Non registrare i movimenti del mouse", - "includeKeystrokes": "Includi Tasti", - "includeKeystrokesDesc": "Registra le sequenze di tasti grezze oltre all'uscita dello schermo", - "vncPort": "Porta VNC", - "vncPassword": "Password VNC", - "vncUsernameOptional": "Nome Utente (Opzionale)", - "vncLeaveBlank": "Lascia vuoto se non richiesto", - "cursorMode": "Modalità Cursore", - "swapRedBlue": "Scambia Rosso/Blu", - "swapRedBlueDesc": "Scambia i canali di colore rosso e blu (risolve alcuni problemi di colore)", - "readOnly": "Sola Lettura", - "readOnlyDesc": "Visualizza lo schermo remoto senza inviare alcun input", - "telnetPort": "Porta Telnet", - "terminalType": "Tipo Di Terminale", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Schema Colore", - "backspaceKey": "Tasto Backspace", - "saveHostFirst": "Salva prima l'host.", - "sharingOptionsAfterSave": "Le opzioni di condivisione sono disponibili dopo che l'host è stato salvato.", - "sharingLoadError": "Impossibile caricare la condivisione dei dati. Controlla la tua connessione e riprova.", - "shareHostSection": "Condividi Host", - "shareWithUser": "Condividi con l'utente", - "shareWithRole": "Condividi con il ruolo", - "selectUser": "Seleziona Utente", - "selectRole": "Seleziona Ruolo", - "selectUserOption": "Seleziona un utente...", - "selectRoleOption": "Seleziona un ruolo...", - "permissionLevel": "Livello Di Autorizzazione", - "expiresInHours": "Scade in (ore)", - "noExpiryPlaceholder": "Lasciare vuoto per nessuna scadenza", - "shareBtn": "Condividi", - "currentAccess": "Accesso Corrente", - "typeHeader": "Tipo", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Permesso", - "grantedByHeader": "Concesso Da", - "expiresHeader": "Scade", - "noAccessEntries": "Ancora nessun accesso.", - "expiredLabel": "Scaduto", - "neverLabel": "Mai", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Annulla", - "savingBtn": "Salvataggio...", - "updateHostBtn": "Aggiorna Host", - "addHostBtn": "Aggiungi Host" + "cancelBtn": "Cancellare", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Cerca host, comandi o impostazioni...", - "quickActions": "Azioni Rapide", - "hostManager": "Gestore Host", - "hostManagerDesc": "Gestire, aggiungere o modificare host", - "addNewHost": "Aggiungi Nuovo Host", - "addNewHostDesc": "Registra un nuovo host", - "adminSettings": "Impostazioni Amministratore", - "adminSettingsDesc": "Configura le preferenze di sistema e gli utenti", - "userProfile": "Profilo Utente", - "userProfileDesc": "Gestisci il tuo account e le preferenze", - "addCredential": "Aggiungi Credenziali", - "addCredentialDesc": "Memorizza le chiavi o le password SSH", - "recentActivity": "Attività Recenti", - "serversAndHosts": "Server E Host", - "noHostsFound": "Nessun host trovato corrispondente \"{{search}}\"", - "links": "Collegamenti", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Seleziona", - "toggleWith": "Commuta con" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Nessuna scheda assegnata", + "noTabAssigned": "No tab assigned", "focusedPane": "Riquadro attivo" }, "connections": { "noConnections": "Nessuna connessione", "noConnectionsDesc": "Apri un terminale, un gestore di file o un desktop remoto per visualizzare le connessioni qui", - "connectedFor": "Connesso per {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Collegato", "disconnected": "Disconnesso", "closeTab": "Chiudi la scheda", @@ -801,358 +981,374 @@ "sectionBackground": "Sfondo", "backgroundDesc": "Le sessioni rimangono attive per 30 minuti dopo la disconnessione e possono essere ristabilita.", "persisted": "Persisteva in sottofondo", - "expiresIn": "Scade tra {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Cerca connessioni...", - "noSearchResults": "Nessun risultato corrispondente alla ricerca" + "noSearchResults": "Nessun risultato corrispondente alla ricerca", + "rename": "Rename session" }, "guacamole": { - "connecting": "Connessione alla sessione {{type}}...", - "connectionError": "Errore di connessione", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Connessione fallita", - "failedToConnect": "Recupero del token di connessione non riuscito", - "hostNotFound": "Host non trovato", - "noHostSelected": "Nessun host selezionato", - "reconnect": "Riconnetti", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Ricollega", "retry": "Riprova", - "guacdUnavailable": "Il servizio desktop remoto (guacd) non è disponibile. Assicurarsi che guacd sia in esecuzione e accessibile e configurato correttamente nelle impostazioni di amministrazione.", - "ctrlAltDel": "Ctrl+Alt+Canc", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", + "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { - "ctrlAltDel": "Ctrl+Alt+Canc", - "winL": "Win+L (Blocca Schermo)", - "winKey": "Chiave Windows", + "ctrlAltDel": "Ctrl+Alt+Del", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Maiusc", - "win": "Vinci", - "stickyActive": "{{key}} (latched - click per rilasciare)", - "stickyInactive": "{{key}} (clicca per agganciare)", - "esc": "Fuga", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", "home": "Home", - "end": "Fine", - "pageUp": "Pagina Su", - "pageDown": "Pagina Giù", - "arrowUp": "Freccia Su", - "arrowDown": "Freccia Giù", - "arrowLeft": "Freccia A Sinistra", - "arrowRight": "Freccia A Destra", - "fnToggle": "Tasti Funzione", - "reconnect": "Riconnetti Sessione", - "collapse": "Comprimi barra degli strumenti", - "expand": "Espandi barra strumenti", - "dragHandle": "Trascina per riposizionare" + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Connetti a Host", - "clear": "Pulisci", - "paste": "Incolla", - "reconnect": "Riconnetti", - "connectionLost": "Connessione persa", - "connected": "Connesso", - "clipboardWriteFailed": "Impossibile copiare negli appunti. Assicurarsi che la pagina sia servita su HTTPS o localhost.", - "clipboardReadFailed": "Lettura dagli appunti non riuscita. Assicurarsi che i permessi degli appunti siano concessi.", - "clipboardHttpWarning": "Incolla richiede HTTPS. Usa Ctrl+Shift+V o serve Termix su HTTPS.", - "unknownError": "Errore sconosciuto", - "websocketError": "Errore di connessione WebSocket", - "connecting": "Connessione...", - "noHostSelected": "Nessun host selezionato", - "reconnecting": "Riconnessione... ({{attempt}}/{{max}})", - "reconnected": "Riconnesso con successo", - "tmuxSessionCreated": "sessione tmux creata: {{name}}", - "tmuxSessionAttached": "Sessione tmux collegata: {{name}}", - "tmuxUnavailable": "tmux non è installato sull'host remoto, tornando alla shell standard", - "tmuxSessionPickerTitle": "tmux Sessioni", - "tmuxSessionPickerDesc": "Sessioni tmux esistenti trovate su questo host. Selezionane una per ricollegare o creare una nuova sessione.", - "tmuxWindows": "Finestre", - "tmuxWindowCount": "Finestra {{count}}", - "tmuxAttached": "Client allegati", - "tmuxAttachedCount": "{{count}} allegato", - "tmuxLastActivity": "Ultima attività", - "tmuxTimeJustNow": "proprio ora", - "tmuxTimeMinutes": "{{count}}m fa", - "tmuxTimeHours": "{{count}}h fa", - "tmuxTimeDays": "{{count}}fa", - "tmuxCreateNew": "Avvia nuova sessione", - "tmuxCopyHint": "Regola la selezione e premi Invio per copiare negli appunti", - "tmuxDetach": "Staccare dalla sessione tmux", - "tmuxDetached": "Separato dalla sessione tmux", - "maxReconnectAttemptsReached": "Massimi tentativi di riconnessione raggiunti", - "closeTab": "Chiudi", - "connectionTimeout": "Timeout connessione", - "terminalTitle": "Terminale - {{host}}", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Ricollega", + "connectionLost": "Connection lost", + "connected": "Collegato", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Esecuzione {{command}} - {{host}}", - "totpRequired": "Autenticazione A Due Fattori Richiesto", - "totpCodeLabel": "Codice Di Verifica", - "totpVerify": "Verifica", - "warpgateAuthRequired": "Richiesta Autenticazione Warpgate", - "warpgateSecurityKey": "Chiave Di Sicurezza", - "warpgateAuthUrl": "Url Di Autenticazione", - "warpgateOpenBrowser": "Apri nel browser", - "warpgateContinue": "Ho Completato L'Autenticazione", - "opksshAuthRequired": "Richiesta Autenticazione OPKSSH", - "opksshAuthDescription": "Completa l'autenticazione nel tuo browser per continuare. Questa sessione rimarrà valida per 24 ore.", - "opksshOpenBrowser": "Apri Browser per Autenticare", - "opksshWaitingForAuth": "In attesa di autenticazione nel browser...", - "opksshAuthenticating": "Elaborazione autenticazione...", - "opksshTimeout": "Autenticazione scaduta. Riprova.", - "opksshAuthFailed": "Autenticazione non riuscita. Controlla le tue credenziali e riprova.", - "opksshSignInWith": "Accedi con {{provider}}", - "sudoPasswordPopupTitle": "Inserire Password?", - "websocketAbnormalClose": "Connessione chiusa inaspettatamente. Questo potrebbe essere dovuto a un problema di configurazione SSL o proxy inverso. Controllare i log del server.", - "connectionLogTitle": "Registro Di Connessione", - "connectionLogCopy": "Copia i log negli appunti", - "connectionLogEmpty": "Ancora nessun log di connessione", - "connectionLogWaiting": "In attesa dei log di connessione...", - "connectionLogCopied": "Log di connessione copiati negli appunti", - "connectionLogCopyFailed": "Impossibile copiare i log negli appunti", - "connectionRejected": "Connessione rifiutata dal server. Controlla la tua autenticazione e configurazione di rete.", - "hostKeyRejected": "Verifica della chiave host SSH rifiutata. Connessione annullata.", - "sessionTakenOver": "La sessione è stata aperta in un'altra scheda. Riconnessione..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Aprire", + "linkDialogCopy": "Copia", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Scheda divisa", + "addToSplit": "Aggiungi a Divide", + "removeFromSplit": "Rimuovi da Split" + } }, "fileManager": { - "noHostSelected": "Nessun host selezionato", - "initializingEditor": "Inizializzazione dell'editor...", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", "file": "File", - "folder": "Cartella", - "uploadFile": "Carica File", - "downloadFile": "Scarica", - "extractArchive": "Estrai Archivio", - "extractingArchive": "Estrazione {{name}}...", - "archiveExtractedSuccessfully": "{{name}} estratto con successo", - "extractFailed": "Estrazione fallita", - "compressFile": "Comprimi File", - "compressFiles": "Comprimi File", - "compressFilesDesc": "Comprimi gli elementi {{count}} in un archivio", - "archiveName": "Nome Archivio", - "enterArchiveName": "Inserisci il nome dell'archivio...", - "compressionFormat": "Formato Compressione", - "selectedFiles": "File selezionati", - "andMoreFiles": "e {{count}} altro...", - "compress": "Comprimi", - "compressingFiles": "Compressione {{count}} elementi in {{name}}...", - "filesCompressedSuccessfully": "{{name}} creato con successo", - "compressFailed": "Compressione fallita", - "edit": "Modifica", - "preview": "Anteprima", - "previous": "Precedente", - "next": "Successivo", - "pageXOfY": "Pagina {{current}} di {{total}}", - "zoomOut": "Zoom Indietro", - "zoomIn": "Zoom Avanti", - "newFile": "Nuovo File", - "newFolder": "Nuova Cartella", - "rename": "Rinomina", - "uploading": "Caricamento...", - "uploadingFile": "Caricamento {{name}}...", - "fileName": "Nome File", - "folderName": "Nome Cartella", - "fileUploadedSuccessfully": "File \"{{name}}\" caricato con successo", - "failedToUploadFile": "Impossibile caricare il file", - "fileDownloadedSuccessfully": "File \"{{name}}\" scaricato con successo", - "failedToDownloadFile": "Impossibile scaricare il file", - "fileCreatedSuccessfully": "File \"{{name}}\" creato con successo", - "folderCreatedSuccessfully": "Cartella \"{{name}}\" creata con successo", - "failedToCreateItem": "Creazione dell'elemento non riuscita", - "operationFailed": "Operazione {{operation}} fallita per {{name}}: {{error}}", - "failedToResolveSymlink": "Risoluzione del collegamento simbolico non riuscita", - "itemsDeletedSuccessfully": "{{count}} elementi eliminati con successo", - "failedToDeleteItems": "Impossibile eliminare gli elementi", - "sudoPasswordRequired": "Richiesta Password Amministratore", - "enterSudoPassword": "Inserisci la password di sudo per continuare questa operazione", - "sudoPassword": "Password di Sudo", - "sudoOperationFailed": "Operazione Sudo fallita", - "sudoAuthFailed": "Autenticazione Sudo non riuscita", - "dragFilesToUpload": "Trascina i file qui per caricare", - "emptyFolder": "Questa cartella è vuota", - "searchFiles": "Cerca file...", - "upload": "Carica", - "selectHostToStart": "Seleziona un host per avviare la gestione dei file", - "sshRequiredForFileManager": "Il gestore file richiede SSH. Questo host non ha SSH abilitato.", - "failedToConnect": "Connessione a SSH non riuscita", - "failedToLoadDirectory": "Impossibile caricare la directory", - "noSSHConnection": "Nessuna connessione SSH disponibile", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "copy": "Copia", - "cut": "Taglia", - "paste": "Incolla", - "copyPath": "Copia Percorso", - "copyPaths": "Copia Tracciati", - "delete": "Elimina", - "properties": "Proprietà", - "refresh": "Aggiorna", - "downloadFiles": "Scarica i file {{count}} nel browser", - "copyFiles": "Copia {{count}} elementi", - "cutFiles": "Taglia {{count}} elementi", - "deleteFiles": "Elimina {{count}} elementi", - "filesCopiedToClipboard": "{{count}} elementi copiati negli appunti", - "filesCutToClipboard": "{{count}} elementi tagliati negli appunti", - "pathCopiedToClipboard": "Percorso copiato negli appunti", - "pathsCopiedToClipboard": "{{count}} percorsi copiati negli appunti", - "failedToCopyPath": "Impossibile copiare il percorso negli appunti", - "movedItems": "Spostati elementi {{count}}", - "failedToDeleteItem": "Impossibile eliminare l'elemento", - "itemRenamedSuccessfully": "{{type}} rinominato con successo", - "failedToRenameItem": "Impossibile rinominare l'elemento", - "download": "Scarica", - "permissions": "Permessi", - "size": "Dimensione", - "modified": "Modificato", - "path": "Percorso", - "confirmDelete": "Sei sicuro di voler eliminare {{name}}?", - "permissionDenied": "Permesso negato", - "serverError": "Errore Del Server", - "fileSavedSuccessfully": "File salvato con successo", - "failedToSaveFile": "Impossibile salvare il file", - "confirmDeleteSingleItem": "Sei sicuro di voler eliminare definitivamente \"{{name}}\"?", - "confirmDeleteMultipleItems": "Sei sicuro di voler eliminare definitivamente gli elementi {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Sei sicuro di voler eliminare definitivamente gli elementi {{count}} ? Questo include le cartelle e il loro contenuto.", - "confirmDeleteFolder": "Sei sicuro di voler eliminare definitivamente la cartella \"{{name}}\" e tutti i suoi contenuti?", - "permanentDeleteWarning": "Questa azione non può essere annullata. Gli elementi verranno eliminati definitivamente dal server.", - "recent": "Recenti", - "pinned": "Bloccato", - "folderShortcuts": "Scorciatoie Cartella", - "failedToReconnectSSH": "Impossibile riconnettere la sessione SSH", - "openTerminalHere": "Apri Terminale Qui", - "run": "Esegui", - "openTerminalInFolder": "Apri terminale in questa cartella", - "openTerminalInFileLocation": "Apri il terminale alla posizione del file", - "runningFile": "Esecuzione - {{file}}", - "onlyRunExecutableFiles": "Può eseguire solo file eseguibili", - "directories": "Directory", - "removedFromRecentFiles": "Rimosso \"{{name}}\" dai file recenti", - "removeFailed": "Rimozione fallita", - "unpinnedSuccessfully": "Sbloccato \"{{name}}\" con successo", - "unpinFailed": "Sblocco fallito", - "removedShortcut": "Scorciatoia rimossa \"{{name}}\"", - "removeShortcutFailed": "Rimuovi scorciatoia non riuscita", - "clearedAllRecentFiles": "Cancellati tutti i file recenti", - "clearFailed": "Pulizia fallita", - "removeFromRecentFiles": "Rimuovi dai file recenti", - "clearAllRecentFiles": "Cancella tutti i file recenti", - "unpinFile": "Sblocca file", - "removeShortcut": "Rimuovi scorciatoia", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Fissato", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Correre", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", "pinFile": "Pin file", - "addToShortcuts": "Aggiungi alle scorciatoie", - "pasteFailed": "Incolla non riuscita", - "noUndoableActions": "Nessuna azione annullabile", - "undoCopySuccess": "Operazione di copia annullata: eliminati i file copiati {{count}}", - "undoCopyFailedDelete": "Annullamento fallito: Impossibile eliminare i file copiati", - "undoCopyFailedNoInfo": "Annullamento fallito: Impossibile trovare le informazioni del file copiato", - "undoMoveSuccess": "Operazione di spostamento non fatto: i file {{count}} spostati di nuovo alla posizione originale", - "undoMoveFailedMove": "Annullamento non riuscito: impossibile spostare indietro i file", - "undoMoveFailedNoInfo": "Annullamento fallito: Impossibile trovare le informazioni del file spostato", - "undoDeleteNotSupported": "L'operazione di eliminazione non può essere annullata: i file sono stati eliminati definitivamente dal server", - "undoTypeNotSupported": "Tipo di operazione annullata non supportato", - "undoOperationFailed": "Operazione annullamento fallita", - "unknownError": "Errore sconosciuto", - "confirm": "Conferma", - "find": "Trova...", - "replace": "Sostituisci", - "downloadInstead": "Scarica Invece", - "keyboardShortcuts": "Tasti Scorciatoie", - "searchAndReplace": "Cerca E Sostituisci", - "editing": "Modifica", - "search": "Cerca", - "findNext": "Trova Successivo", - "findPrevious": "Trova Precedente", - "save": "Salva", - "selectAll": "Seleziona Tutto", - "undo": "Annulla", - "redo": "Ripeti", - "moveLineUp": "Sposta In Alto", - "moveLineDown": "Sposta In Basso", - "toggleComment": "Attiva/Disattiva Commento", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Impossibile caricare l'immagine", - "startTyping": "Inizia a digitare...", - "unknownSize": "Dimensione sconosciuta", - "fileIsEmpty": "Il file è vuoto", - "largeFileWarning": "Avviso File Grande", - "largeFileWarningDesc": "Questo file è di dimensione {{size}} , il che potrebbe causare problemi di performance quando aperto come testo.", - "fileNotFoundAndRemoved": "File \"{{name}}\" non trovato ed è stato rimosso dai file recenti/bloccati", - "failedToLoadFile": "Impossibile caricare il file: {{error}}", - "serverErrorOccurred": "Si è verificato un errore del server. Riprova più tardi.", - "autoSaveFailed": "Salvataggio automatico fallito", - "fileAutoSaved": "File salvato automaticamente", - "moveFileFailed": "Spostamento di {{name}} non riuscito", - "moveOperationFailed": "Operazione di spostamento fallita", - "canOnlyCompareFiles": "È possibile confrontare solo due file", - "comparingFiles": "Confrontare i file: {{file1}} e {{file2}}", - "dragFailed": "Operazione di trascinamento fallita", - "filePinnedSuccessfully": "File \"{{name}}\" fissato con successo", - "pinFileFailed": "Impossibile bloccare il file", - "fileUnpinnedSuccessfully": "File \"{{name}}\" sbloccato con successo", - "unpinFileFailed": "Sblocco del file non riuscito", - "shortcutAddedSuccessfully": "Scorciatoia cartella \"{{name}}\" aggiunto con successo", - "addShortcutFailed": "Impossibile aggiungere scorciatoia", - "operationCompletedSuccessfully": "{{operation}} {{count}} oggetti con successo", - "operationCompleted": "{{operation}} {{count}} elementi", - "downloadFileSuccess": "File {{name}} scaricato con successo", - "downloadFileFailed": "Download non riuscito", - "moveTo": "Sposta in {{name}}", - "diffCompareWith": "Confronta con {{name}}", - "dragOutsideToDownload": "Trascina la finestra esterna per scaricare (file{{count}})", - "newFolderDefault": "NuovaCartella", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Elementi {{count}} spostati con successo in {{target}}", - "move": "Sposta", - "searchInFile": "Cerca nel file (Ctrl+F)", - "showKeyboardShortcuts": "Mostra scorciatoie da tastiera", - "startWritingMarkdown": "Inizia a scrivere il tuo contenuto di markdown...", - "loadingFileComparison": "Caricamento confronto file...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Mossa", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Confronta", - "sideBySide": "Lato laterale", - "inline": "Incorporato", - "fileComparison": "Confronto file: {{file1}} vs {{file2}}", - "fileTooLarge": "File troppo grande: {{error}}", - "sshConnectionFailed": "Connessione SSH non riuscita. Controlla la tua connessione a {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Impossibile caricare il file: {{error}}", - "connecting": "Connessione...", - "connectedSuccessfully": "Connesso con successo", - "totpVerificationFailed": "Verifica TOTP fallita", - "warpgateVerificationFailed": "Autenticazione Warpgate fallita", - "authenticationFailed": "Autenticazione non riuscita", - "verificationCodePrompt": "Codice di verifica:", - "changePermissions": "Cambia Permessi", - "currentPermissions": "Permessi Attuali", - "owner": "Proprietario", - "group": "Gruppo", - "others": "Altri", - "read": "Leggi", - "write": "Scrivi", - "execute": "Esegui", - "permissionsChangedSuccessfully": "Permessi modificati con successo", - "failedToChangePermissions": "Modifica dei permessi non riuscita", - "name": "Nome", - "sortByName": "Nome", - "sortByDate": "Data Di Modifica", - "sortBySize": "Dimensione", - "ascending": "Crescente", - "descending": "Decrescente", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Root", - "new": "Nuovo", - "sortBy": "Ordina Per", - "items": "Oggetti", - "selected": "Selezionato", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", "editor": "Editor", - "octal": "Ottale", - "storage": "Archiviazione", - "disk": "Disco", - "used": "Usato", - "of": "di", - "toggleSidebar": "Attiva/Disattiva Barra Laterale", - "cannotLoadPdf": "Impossibile caricare il PDF", - "pdfLoadError": "Si è verificato un errore durante il caricamento del file PDF.", - "loadingPdf": "Caricamento PDF...", - "loadingPage": "Caricamento pagina..." + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Copia nell'host…", - "moveToHost": "Spostati sull'host…", - "copyItemsToHost": "Copia {{count}} elementi nell'host…", - "moveItemsToHost": "Sposta {{count}} elementi nell'host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Non sono disponibili altri host per la gestione dei file.", "noHostsConnectedHint": "Aggiungi un altro host SSH con File Manager abilitato in Host Manager.", "selectDestinationHost": "Seleziona l'host di destinazione", @@ -1164,48 +1360,48 @@ "browseDestination": "Sfoglia o inserisci il percorso", "confirmCopy": "Copia", "confirmMove": "Mossa", - "transferring": "Trasferimento…", - "compressing": "Compressione…", - "extracting": "Estrazione di…", - "transferringItems": "Trasferimento di {{current}} di {{total}} elementi…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Trasferimento completato", "transferError": "Trasferimento non riuscito", - "transferPartial": "Trasferimento completato con {{count}} errori", - "transferPartialHint": "Impossibile trasferire: {{paths}}", - "itemsSummary": "{{count}} elementi", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "La destinazione deve essere una directory per trasferimenti di più elementi", "selectThisFolder": "Seleziona questa cartella", "browsePathWillBeCreated": "Questa cartella non esiste ancora. Verrà creata all'avvio del trasferimento.", "browsePathError": "Impossibile aprire questo percorso sull'host di destinazione.", "goUp": "Salire", - "copyFolderToHost": "Copia la cartella sull'host…", - "moveFolderToHost": "Sposta la cartella sull'host…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Pronto", - "hostConnecting": "Connessione in corso…", + "hostConnecting": "Connecting…", "hostDisconnected": "Non connesso", "hostAuthRequired": "Autenticazione richiesta: apri prima Gestione file su questo host", "hostConnectionFailed": "Connessione fallita", "metricsTitle": "Tempi di trasferimento", - "metricsPrepare": "Prepara la destinazione: {{duration}}", - "metricsCompress": "Comprimi sulla sorgente: {{duration}}", - "metricsHopSourceRead": "Sorgente → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → destinazione (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → destinazione (locale): {{throughput}}", - "metricsTransfer": "Da un capo all'altro: {{throughput}} ({{duration}})", - "metricsExtract": "Estrai nella destinazione: {{duration}}", - "metricsSourceDelete": "Rimuovi dalla sorgente: {{duration}}", - "metricsTotal": "Totale: {{duration}}", - "progressCompressing": "Compressione sull'host sorgente…", - "progressExtracting": "Estrazione sulla destinazione…", - "progressTransferring": "Trasferimento dati…", - "progressReconnecting": "Riconnessione…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Corsie di trasferimento parallele", - "parallelSegmentsOption": "{{count}} corsie", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "I file di grandi dimensioni vengono suddivisi in blocchi da 256 MB. Più corsie utilizzano connessioni separate (come l'avvio di più trasferimenti) per una maggiore velocità di trasmissione complessiva.", - "progressTotalSpeed": "{{speed}} totale ({{lanes}} corsie)", - "progressTransferringItems": "Trasferimento dei file ({{current}} di {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} file", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "File sorgente conservati (trasferimento parziale)", "jumpHostLimitation": "Entrambi gli host devono essere raggiungibili dal server Termix. Il routing diretto da host a host non è supportato.", "cancel": "Cancellare", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Il sistema sceglie tra la compressione tar o il trasferimento SFTP per singolo file in base al numero di file, alle dimensioni e alla comprimibilità. I singoli file utilizzano sempre il trasferimento SFTP in streaming.", "methodTarHint": "Comprimere sul file sorgente, trasferire un archivio ed estrarre il file sulla destinazione. Richiede tar su entrambi gli host Unix.", "methodItemSftpHint": "Trasferisci ogni file singolarmente tramite SFTP. Funziona su tutti i sistemi operativi, incluso Windows.", - "methodPreviewLoading": "Calcolo del metodo di trasferimento…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Impossibile visualizzare in anteprima il metodo di trasferimento. Il server sceglierà comunque un metodo all'avvio.", "methodPreviewWillUseTar": "Verrà utilizzato: archivio Tar", "methodPreviewWillUseItemSftp": "Verrà utilizzato: SFTP per file", - "methodPreviewScanSummary": "{{fileCount}} file, {{totalSize}} totale (scansionati sull'host sorgente).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Ogni file utilizza lo stesso flusso SFTP come copia di un singolo file, uno dopo l'altro. L'avanzamento viene combinato per tutti i file, quindi la barra si muove lentamente in caso di file di grandi dimensioni.", "methodReason": { "user_item_sftp": "Hai scelto SFTP per singolo file.", "user_tar": "Hai scelto l'archivio tar.", "tar_unavailable": "Tar non è disponibile su uno o entrambi gli host; in alternativa, verrà utilizzato il trasferimento di file tramite SFTP.", "windows_host": "Si utilizza un sistema host Windows; non viene utilizzato il comando tar.", - "auto_multi_large": "Automatico: più file, incluso un file di grandi dimensioni ({{largestSize}}) con dati comprimibili, vengono raggruppati in un unico trasferimento.", - "auto_single_large_in_archive": "Automatico: un file di grandi dimensioni ({{largestSize}}) in questo set — SFTP per file.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automatico: dati perlopiù incomprimibili — SFTP per file.", - "auto_many_files": "Auto: molti file ({{fileCount}}) — tar riduce l'overhead per file.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automatico: SFTP per file per questo set." }, "progressCancel": "Cancellare", - "progressCancelling": "Annullamento…", + "progressCancelling": "Cancelling…", "progressStalled": "In stallo", "resumedHint": "Riconnessione stabilita a un trasferimento attivo avviato in un'altra finestra.", "transferCancelled": "Trasferimento annullato", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Alcuni dati sono stati conservati nella destinazione. Il tentativo di connessione riprenderà non appena la connessione sarà ripristinata." }, "tunnels": { - "noSshTunnels": "Nessun Tunnel Ssh", - "createFirstTunnelMessage": "Non hai ancora creato nessun tunnel SSH. Configura le connessioni del tunnel nel Gestore Host per iniziare.", - "connected": "Connesso", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Collegato", "disconnected": "Disconnesso", - "connecting": "Connessione...", - "error": "Errore", - "canceling": "Annullamento...", - "connect": "Connetti", - "disconnect": "Disconnetti", - "cancel": "Annulla", - "port": "Porta", - "localPort": "Porta Locale", - "remotePort": "Porta Remota", - "currentHostPort": "Porta Host Corrente", - "endpointPort": "Porta Endpoint", - "bindIp": "IP Locale", - "endpointSshConfig": "Configurazione SSH Endpoint", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancellare", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Endpoint SSH Host", - "endpointSshHostPlaceholder": "Seleziona un host configurato", - "endpointSshHostRequired": "Selezionare un host SSH endpoint per ogni tunnel client.", - "attempt": "Tentativo di {{current}} di {{max}}", - "nextRetryIn": "Prossimo riprovare in {{seconds}} secondi", - "clientTunnels": "Tunnel Client", - "clientTunnel": "Tunnel Client", - "addClientTunnel": "Aggiungi Tunnel Client", - "noClientTunnels": "Nessun tunnel client configurato su questo desktop.", - "tunnelName": "Nome Del Tunnel", - "remoteHost": "Host Remoto", - "autoStart": "Avvio Automatico", - "clientAutoStartDesc": "Avvia quando questo client desktop si apre e rimane connesso.", - "clientManualStartDesc": "Usa Start e Stop da questa riga. Termix non lo aprirà automaticamente.", - "clientRemoteServerNote": "L'inoltro remoto potrebbe richiedere AllowTcpForwarding e GatewayPorts sul server SSH endpoint. La porta remota si chiude quando questo desktop si disconnette.", - "clientTunnelStarted": "Tunnel client avviato", - "clientTunnelStopped": "Tunnel client fermato", - "tunnelTestSucceeded": "Test tunnel riuscito", - "tunnelTestFailed": "Test tunnel fallito", - "localSaved": "Tunnel client salvati", - "localSaveError": "Impossibile salvare i tunnel del client locale", - "invalidBindIp": "L'IP locale deve essere un indirizzo IPv4 valido.", - "invalidLocalTargetIp": "L'IP di destinazione locale deve essere un indirizzo IPv4 valido.", - "invalidLocalPort": "La porta locale deve essere compresa tra 1 e 65535.", - "invalidRemotePort": "La porta remota deve essere compresa tra 1 e 65535.", - "invalidLocalTargetPort": "La porta locale di destinazione deve essere compresa tra 1 e 65535.", - "invalidEndpointPort": "Il porto di endpoint deve essere compreso tra 1 e 65535.", - "duplicateAutoStartBind": "Solo un tunnel client di avvio automatico può usare {{bind}}.", - "manualControlError": "Impossibile aggiornare lo stato del tunnel.", - "active": "Attivo", - "start": "Inizia", - "stop": "Ferma", - "test": "Prova", - "type": "Tipo Di Tunnel", - "typeLocal": "Locale (-L)", - "typeRemote": "Remoto (-R)", - "typeDynamic": "Dinamico (-D)", - "typeServerLocalDesc": "Host attuale all'endpoint.", - "typeServerRemoteDesc": "Endpoint torna all'host corrente.", - "typeClientLocalDesc": "Computer locale all'endpoint.", - "typeClientRemoteDesc": "Endpoint torna al computer locale.", - "typeClientDynamicDesc": "SOCKS sul computer locale.", - "typeDynamicDesc": "Avanti SOCKS5 CONNECT traffico attraverso SSH", - "forwardDescriptionServerLocal": "Host corrente {{sourcePort}} → endpoint {{endpointPort}}.", - "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → host corrente {{sourcePort}}.", - "forwardDescriptionServerDynamic": "CALZINI sull'host corrente {{sourcePort}}.", - "forwardDescriptionClientLocal": "{{sourcePort}} → remoto {{endpointPort}}.", - "forwardDescriptionClientRemote": "{{sourcePort}} → locale {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS sulla porta locale {{sourcePort}}.", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "{{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → locale {{localPort}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", - "route": "Percorso:", - "lastStarted": "Ultimo avvio", - "lastTested": "Ultimo test", - "lastError": "Ultimo errore", - "maxRetries": "Riprova Massima", - "maxRetriesDescription": "Quantità massima di tentativi di riprova.", - "retryInterval": "Intervallo Di Riprova (Secondi)", - "retryIntervalDescription": "Tempo di attesa tra i tentativi di riprova.", - "local": "Locale", - "remote": "Remoto", - "destination": "Destinazione", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", "host": "Host", - "mode": "Modalità", - "noHostSelected": "Nessun host selezionato", - "working": "Lavorando..." + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Memoria", - "disk": "Disco", - "network": "Rete", + "memory": "Memory", + "disk": "Disk", + "network": "Network", "uptime": "Uptime", - "processes": "Processi", - "available": "Disponibile", - "free": "Gratis", - "connecting": "Connessione...", - "connectionFailed": "Connessione al server non riuscita", - "naCpus": "CPU N/A", - "cpuCores_one": "Nucleo {{count}}", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Utilizzo CPU", - "memoryUsage": "Utilizzo Memoria", - "diskUsage": "Uso Del Disco", - "failedToFetchHostConfig": "Impossibile recuperare la configurazione dell'host", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", "serverOffline": "Server Offline", - "cannotFetchMetrics": "Impossibile recuperare le metriche dal server fuori rete", - "totpFailed": "Verifica TOTP fallita", - "noneAuthNotSupported": "Le statistiche del server non supportano il tipo di autenticazione 'nessuno'.", - "load": "Carica", - "systemInfo": "Informazioni Di Sistema", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Sistema Operativo", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "secondi", - "networkInterfaces": "Interfacce Di Rete", - "noInterfacesFound": "Nessuna interfaccia di rete trovata", - "noProcessesFound": "Nessun processo trovato", - "loginStats": "Statistiche Di Accesso SSH", - "noRecentLoginData": "Nessun dato di accesso recente", - "executingQuickAction": "Esecuzione {{name}}...", - "quickActionSuccess": "{{name}} completato con successo", - "quickActionFailed": "{{name}} fallito", - "quickActionError": "Esecuzione di {{name}} non riuscita", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Porte Di Ascoltamento", - "protocol": "Protocol", - "port": "Porta", - "address": "Indirizzo", - "process": "Processo", - "noData": "Nessun dato di porte in ascolto" + "title": "Listening Ports", + "protocol": "Protocollo", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inattivo", - "policy": "Politica", - "rules": "regole", - "noData": "Dati firewall non disponibili", - "action": "Azione", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Porta", - "source": "Fonte", - "anywhere": "Ovunque" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Carica Media", - "swap": "Scambia", - "architecture": "Architettura", - "refresh": "Aggiorna", - "retry": "Riprova" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Riprova", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Correre", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Gestione SSH e desktop remoto self-hosted", - "loginTitle": "Accedi a Termix", - "registerTitle": "Crea Account", - "forgotPassword": "Password Dimenticata?", - "rememberMe": "Ricorda il dispositivo per 30 giorni (include TOTP)", - "noAccount": "Non hai un account?", - "hasAccount": "Hai già un account?", - "twoFactorAuth": "Autenticazione A Due Fattori", - "enterCode": "Inserisci codice di verifica", - "backupCode": "Oppure utilizzare il codice di backup", - "verifyCode": "Verifica Codice", - "redirectingToApp": "Reindirizzamento all'app...", - "sshAuthenticationRequired": "Autenticazione SSH richiesta", - "sshNoKeyboardInteractive": "Autenticazione Tastiera-Interattiva Non Disponibile", - "sshAuthenticationFailed": "Autenticazione Non Riuscita", - "sshAuthenticationTimeout": "Timeout Autenticazione", - "sshNoKeyboardInteractiveDescription": "Il server non supporta l'autenticazione interattiva con tastiera. Si prega di fornire la password o la chiave SSH.", - "sshAuthFailedDescription": "Le credenziali fornite non sono corrette. Riprova con credenziali valide.", - "sshTimeoutDescription": "Il tentativo di autenticazione è scaduto. Riprova.", - "sshProvideCredentialsDescription": "Fornisci le tue credenziali SSH per connetterti a questo server.", - "sshPasswordDescription": "Inserire la password per questa connessione SSH.", - "sshKeyPasswordDescription": "Se la tua chiave SSH è crittografata, inserisci qui la frase segreta.", - "passphraseRequired": "Passphrase Richiesto", - "passphraseRequiredDescription": "La chiave SSH è crittografata. Inserisci la frase segreta per sbloccarla.", - "back": "Indietro", - "firstUser": "Primo Utente", - "firstUserMessage": "Sei il primo utente e verrà creato un amministratore. È possibile visualizzare le impostazioni di amministratore nella barra laterale a discesa. Se pensi che si tratti di un errore, controlla i registri docker o crea un problema GitHub.", - "external": "Esterno", - "loginWithExternal": "Accedi con Provider esterno", - "loginWithExternalDesc": "Accedi utilizzando il tuo provider di identità esterno configurato", - "externalNotSupportedInElectron": "L'autenticazione esterna non è ancora supportata nell'app Electron. Si prega di utilizzare la versione web per l'accesso OIDC.", - "resetPasswordButton": "Reimposta Password", - "sendResetCode": "Invia Codice Di Ripristino", - "resetCodeDesc": "Inserisci il tuo nome utente per ricevere un codice di reimpostazione della password. Il codice verrà registrato nei log del contenitore docker.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verifica Codice", - "enterResetCode": "Inserire il codice a 6 cifre dai registri del contenitore docker per l'utente:", - "newPassword": "Nuova Password", - "confirmNewPassword": "Conferma Password", - "enterNewPassword": "Inserisci la tua nuova password per l'utente:", - "signUp": "Registrati", - "desktopApp": "App Desktop", - "loggingInToDesktopApp": "Accesso all'app desktop", - "loadingServer": "Caricamento server...", - "dataLossWarning": "Reimpostare la password in questo modo eliminerà tutti gli host SSH salvati, le credenziali e altri dati crittografati. Questa azione non può essere annullata. Usa questa opzione solo se hai dimenticato la password e non hai effettuato l'accesso.", - "authenticationDisabled": "Autenticazione Disabilitata", - "authenticationDisabledDesc": "Tutti i metodi di autenticazione sono attualmente disabilitati. Contatta l'amministratore.", - "attemptsRemaining": "{{count}} tentativi rimanenti" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifica La Chiave Host Ssh", - "keyChangedWarning": "Chiave Host Ssh Cambiata", - "firstConnectionTitle": "Prima volta che ci si connette a questo host", - "firstConnectionDescription": "L'autenticità di questo host non può essere stabilita. Verifica che l'impronta digitale corrisponda a quanto ci si aspetta.", - "keyChangedDescription": "La chiave host di questo server è cambiata dall'ultima connessione. Questo potrebbe indicare un problema di sicurezza.", - "previousKey": "Chiave Precedente", - "newFingerprint": "Nuova Impronta Digitale", - "fingerprint": "Impronta", - "verifyInstructions": "Se ti fidi di questo host, fai clic su Accetta per continuare e salvare questa impronta digitale per le connessioni future.", - "securityWarning": "Avviso Di Sicurezza", - "acceptAndContinue": "Accetta E Continua", - "acceptNewKey": "Accetta La Nuova Chiave E Continua" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Impossibile connettersi al database", - "unknownError": "Errore sconosciuto", - "loginFailed": "Accesso fallito", - "failedPasswordReset": "Impossibile avviare il ripristino della password", - "failedVerifyCode": "Impossibile verificare il codice di ripristino", - "failedCompleteReset": "Impossibile completare il ripristino della password", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Avvio del login OIDC non riuscito", - "silentSigninOidcUnavailable": "L'accesso silenzioso è stato richiesto, ma l'accesso OIDC non è disponibile.", - "failedUserInfo": "Recupero delle informazioni utente dopo il login non riuscito", - "oidcAuthFailed": "Autenticazione OIDC non riuscita", - "invalidAuthUrl": "URL di autorizzazione non valido ricevuto dal backend", - "requiredField": "Questo campo è obbligatorio", - "minLength": "La lunghezza minima è {{min}}", - "passwordMismatch": "Le password non corrispondono", - "passwordLoginDisabled": "Nome utente/password di accesso è attualmente disabilitato", - "sessionExpired": "Sessione scaduta - si prega di accedere di nuovo", - "totpRateLimited": "Tasso limitato: troppi tentativi di verifica TOTP. Riprova più tardi.", - "totpRateLimitedWithTime": "Tentativi limitati: troppi tentativi di verifica TOTP. Attendi {{time}} secondi prima di riprovare.", - "resetCodeRateLimited": "Tasso limitato: Troppi tentativi di verifica. Riprova più tardi.", - "resetCodeRateLimitedWithTime": "Tasso limitato: Troppi tentativi di verifica. Si prega di attendere {{time}} secondi prima di riprovare.", - "authTokenSaveFailed": "Impossibile salvare il token di autenticazione", - "failedToLoadServer": "Caricamento del server non riuscito" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "La registrazione del nuovo account è attualmente disabilitata da un amministratore. Effettua il login o contatta un amministratore.", - "userNotAllowed": "Il tuo account non è autorizzato a registrarsi. Contatta un amministratore.", - "databaseConnectionFailed": "Connessione al server del database non riuscita", - "resetCodeSent": "Reimposta il codice inviato ai registri Docker", - "codeVerified": "Codice verificato con successo", - "passwordResetSuccess": "Password reimpostata con successo", - "loginSuccess": "Login riuscito", - "registrationSuccess": "Registrazione completata" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Tunnels desktop locali targeting host SSH configurati.", - "c2sTunnelPresets": "Impostazioni Tunnel Client", - "c2sTunnelPresetsDesc": "Salva l'elenco dei tunnel locali di questo client desktop come preimpostazione server con nome o carica nuovamente un preset in questo client.", - "c2sTunnelPresetsUnavailable": "Le preimpostazioni del tunnel client sono disponibili solo nel client desktop.", - "c2sPresetName": "Nome Predefinito", - "c2sPresetNamePlaceholder": "Nome preset client", + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", "c2sPresetToLoad": "Preset To Load", - "c2sNoPresetSelected": "Nessuna preimpostazione selezionata", - "c2sNoPresets": "Nessun preset salvato", - "c2sLoadPreset": "Carica", - "c2sCurrentLocalConfig": "{{count}} tunnel client locali configurati su questo desktop.", - "c2sPresetSyncNote": "Le preimpostazioni sono istantanee esplicite; il caricamento di una sostituisce l'elenco dei tunnel dei client locali di questo client desktop.", - "c2sPresetSaved": "Preimpostazione tunnel client salvata", - "c2sPresetLoaded": "Preimpostazione tunnel client caricata localmente", - "c2sPresetRenamed": "Preimpostazione tunnel client rinominata", - "c2sPresetDeleted": "Preimpostazione tunnel client eliminata", - "c2sPresetLoadError": "Impossibile caricare le preimpostazioni del tunnel client" + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Lingua", - "keyPassword": "password della chiave", - "pastePrivateKey": "Incolla qui la tua chiave privata...", - "localListenerHost": "127.0.0.1 (ascolta localmente)", - "localTargetHost": "127.0.0.1 (obiettivo su questo computer)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Inserisci la tua password", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { "title": "Dashboard", - "loading": "Caricamento dashboard...", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Supporto", + "support": "Support", "discord": "Discord", - "serverOverview": "Panoramica Del Server", - "version": "Versione", - "upToDate": "Fino alla data", - "updateAvailable": "Aggiornamento Disponibile", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", "uptime": "Uptime", "database": "Database", - "healthy": "Sano", - "error": "Errore", - "totalHosts": "Totale Host", - "totalTunnels": "Totale Gallerie", - "totalCredentials": "Credenziali Totali", - "recentActivity": "Attività Recenti", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Caricamento attività recente...", - "noRecentActivity": "Nessuna attività recente", - "quickActions": "Azioni Rapide", - "addHost": "Aggiungi Host", - "addCredential": "Aggiungi Credenziali", - "adminSettings": "Impostazioni Amministratore", - "userProfile": "Profilo Utente", - "serverStats": "Statistiche Server", - "loadingServerStats": "Caricamento statistiche server...", - "noServerData": "Nessun dato server disponibile", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personalizza Dashboard", - "dashboardSettings": "Impostazioni Dashboard", - "enableDisableCards": "Abilita/Disabilita Carte", - "resetLayout": "Ripristina predefinito", - "serverOverviewCard": "Panoramica Del Server", - "recentActivityCard": "Attività Recenti", - "networkGraphCard": "Grafico Di Rete", - "networkGraph": "Grafico Di Rete", - "quickActionsCard": "Azioni Rapide", - "serverStatsCard": "Statistiche Server", - "panelMain": "Principale", - "panelSide": "Lato", - "justNow": "proprio ora" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABLE", "hostsOnline": "Hosts Online", - "activeTunnels": "Gallerie Attive", - "registerNewServer": "Registra un nuovo server", - "storeSshKeysOrPasswords": "Memorizza le chiavi o le password SSH", - "manageUsersAndRoles": "Gestisci utenti e ruoli", - "manageYourAccount": "Gestisci il tuo account", - "hostStatus": "Stato Host", - "noHostsConfigured": "Nessun host configurato", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Aggiungere:", - "commandPalette": "Tavolozza Comandi", - "done": "Fatto", - "editModeInstructions": "Trascina le carte per riordinare · Trascina il divisore delle colonne per ridimensionare le colonne · Trascina il bordo inferiore di una scheda per ridimensionarne l'altezza · Cestino per rimuoverlo", - "empty": "Vuoto", - "clear": "Pulisci" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copia", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Aggiungi Host", - "addGroup": "Aggiungi Gruppo", - "addLink": "Aggiungi Collegamento", - "zoomIn": "Zoom Avanti", - "zoomOut": "Zoom Indietro", - "resetView": "Reimposta Vista", - "selectHost": "Seleziona Host", - "chooseHost": "Scegli un host...", - "parentGroup": "Gruppo Genitore", - "noGroup": "Nessun Gruppo", - "groupName": "Nome Gruppo", - "color": "Colore", - "source": "Fonte", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Sposta nel gruppo", - "selectGroup": "Seleziona gruppo...", - "addConnection": "Aggiungi Connessione", - "hostDetails": "Dettagli Host", - "removeFromGroup": "Rimuovi dal gruppo", - "addHostHere": "Aggiungi Host Qui", - "editGroup": "Modifica Gruppo", - "delete": "Elimina", - "add": "Aggiungi", - "create": "Crea", - "move": "Sposta", - "connect": "Connetti", - "createGroup": "Crea Gruppo", - "selectSourcePlaceholder": "Seleziona Sorgente...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Mossa", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "File Non Valido", - "hostAlreadyExists": "L'host è già nella topologia", - "connectionExists": "Connessione già esistente", - "unknown": "Sconosciuto", - "name": "Nome", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Stato", - "failedToAddNode": "Impossibile aggiungere il nodo", - "sourceDifferentFromTarget": "Origine e destinazione devono essere diversi", - "exportJSON": "Esporta JSON", - "importJSON": "Importa JSON", - "terminal": "Terminale", - "fileManager": "Gestore File", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "terminale", + "fileManager": "Gestore file", "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Statistiche Server", - "noNodes": "Ancora nessun nodo" + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Il docker non è abilitato per questo host", - "validating": "Convalida Docker...", - "connecting": "Connessione...", - "error": "Errore", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Impossibile connettersi al docker", - "containerStarted": "Contenitore {{name}} iniziato", - "failedToStartContainer": "Avvio del contenitore {{name}} non riuscito", - "containerStopped": "Contenitore {{name}} fermato", - "failedToStopContainer": "Arresto del contenitore {{name}} non riuscito", - "containerRestarted": "Contenitore {{name}} riavviato", - "failedToRestartContainer": "Riavvio del contenitore {{name}} non riuscito", - "containerPaused": "Contenitore {{name}} in pausa", - "containerUnpaused": "Contenitore {{name}} non in pausa", - "failedToTogglePauseContainer": "Impossibile attivare/disattivare lo stato di pausa per il contenitore {{name}}", - "containerRemoved": "Contenitore {{name}} rimosso", - "failedToRemoveContainer": "Rimozione del contenitore {{name}} non riuscita", - "image": "Immagine", - "ports": "Porte", - "noPorts": "Nessuna porta", - "start": "Inizia", - "confirmRemoveContainer": "Sei sicuro di voler rimuovere il contenitore '{{name}}'? Questa azione non può essere annullata.", - "runningContainerWarning": "Attenzione: Questo contenitore è attualmente in esecuzione. Rimuovendolo si fermerà prima il contenitore.", - "loadingContainers": "Caricamento contenitori...", - "manager": "Gestore Docker", - "autoRefresh": "Aggiornamento Automatico", - "timestamps": "Timestamp", - "lines": "Linee", - "filterLogs": "Filtro registro...", - "refresh": "Aggiorna", - "download": "Scarica", - "clear": "Pulisci", - "logsDownloaded": "Log scaricato con successo", - "last50": "Ultime 50", - "last100": "Ultimi 100", - "last500": "Ultime 500", - "last1000": "Ultime 1000", - "allLogs": "Tutti I Log", - "noLogsMatching": "Nessun log corrispondente \"{{query}}\"", - "noLogsAvailable": "Nessun log disponibile", - "noContainersFound": "Nessun contenitore trovato", - "noContainersFoundHint": "Nessun contenitore Docker disponibile su questo host", - "searchPlaceholder": "Cerca contenitori...", - "allStatuses": "Tutti Gli Stati", - "stateRunning": "Esecuzione", - "statePaused": "Pausa", - "stateExited": "Uscita", - "stateRestarting": "Riavvio", - "noContainersMatchFilters": "Nessun contenitore corrisponde ai tuoi filtri", - "noContainersMatchFiltersHint": "Prova a regolare i criteri di ricerca o filtro", - "failedToFetchStats": "Recupero statistiche container non riuscito", - "containerNotRunning": "Contenitore non in esecuzione", - "startContainerToViewStats": "Avvia il contenitore per visualizzare le statistiche", - "loadingStats": "Caricamento statistiche...", - "errorLoadingStats": "Errore nel caricare le statistiche", - "noStatsAvailable": "Nessuna statistica disponibile", - "cpuUsage": "Utilizzo CPU", - "current": "Corrente", - "memoryUsage": "Utilizzo Memoria", - "networkIo": "Rete I/O", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", "output": "Output", - "blockIo": "Blocco I/O", - "read": "Leggi", - "write": "Scrivi", - "pids": "PID", - "containerInformation": "Informazioni Contenitore", - "name": "Nome", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Stato", - "containerMustBeRunning": "Il contenitore deve essere in esecuzione per accedere alla console", - "verificationCodePrompt": "Inserisci codice di verifica", - "totpVerificationFailed": "Verifica TOTP non riuscita. Riprova.", - "warpgateVerificationFailed": "Autenticazione Warpgate non riuscita. Riprova.", - "connectedTo": "Connesso a {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Disconnesso", - "consoleError": "Errore di console", - "errorMessage": "Errore: {{message}}", - "failedToConnect": "Impossibile connettersi al contenitore", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", "console": "Console", - "selectShell": "Seleziona shell", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "ceneri", - "connect": "Connetti", - "disconnect": "Disconnetti", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Non connesso", - "clickToConnect": "Fare clic su Connetti per avviare una sessione shell", - "connectingTo": "Connessione a {{containerName}}...", - "containerNotFound": "Contenitore non trovato", - "backToList": "Torna alla lista", - "logs": "Registri", - "stats": "Statistiche", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", "consoleTab": "Console", - "startContainerToAccess": "Avvia il contenitore per accedere alla console" + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Generale", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Utenti", - "sectionSessions": "Sessioni", - "sectionRoles": "Ruoli", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", "sectionDatabase": "Database", - "sectionApiKeys": "Chiavi API", - "allowRegistration": "Consenti Registrazione Utente", - "allowRegistrationDesc": "Lascia che i nuovi utenti si auto-registrino", - "allowPasswordLogin": "Consenti Password Login", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Filtri trasparenti", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Stato", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", "allowPasswordLoginDesc": "Username/password login", - "oidcAutoProvision": "Auto-Fornitura OIDC", - "oidcAutoProvisionDesc": "Creazione automatica di account per gli utenti OIDC anche quando la registrazione è disabilitata", - "allowPasswordReset": "Consenti Reset Password", - "allowPasswordResetDesc": "Ripristina il codice tramite i registri Docker", - "sessionTimeout": "Timeout Sessione", - "hours": "ore", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "Predefiniti Di Monitoraggio", - "statusCheck": "Controllo Stato", - "metrics": "Metriche", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", "sec": "sec", - "logLevel": "Livello Registro", - "enableGuacamole": "Abilita Guacamolo", - "enableGuacamoleDesc": "Desktop remoto RDP/VNC", - "guacdUrl": "URL guacd", - "oidcDescription": "Configurare OpenID Connect per SSO. I campi contrassegnati con * sono obbligatori.", - "oidcClientId": "ID Client", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", "oidcClientSecret": "Client Secret", - "oidcAuthUrl": "Url Di Autorizzazione", - "oidcIssuerUrl": "Url Dell'Emittente", - "oidcTokenUrl": "URL Token", - "oidcUserIdentifier": "Percorso Identificatore Utente", - "oidcDisplayName": "Visualizza Percorso Nome", - "oidcScopes": "Ambiti", - "oidcUserinfoUrl": "Sovrascrivi L'Url Di Userinfo", - "oidcAllowedUsers": "Utenti Consentiti", - "oidcAllowedUsersDesc": "Una email per riga. Lasciare vuoto per consentire a tutti.", - "removeOidc": "Rimuovi", - "usersCount": "{{count}} utenti", - "createUser": "Crea", - "newRole": "Nuovo Ruolo", - "roleName": "Nome", - "roleDisplayName": "Nome Visualizzato", - "roleDescription": "Descrizione", - "rolesCount": "{{count}} ruoli", - "createRole": "Crea", - "creating": "Creazione...", - "exportDatabase": "Esporta Database", - "exportDatabaseDesc": "Scarica un backup di tutti gli host, credenziali e impostazioni", - "export": "Esporta", - "exporting": "Esportazione...", - "importDatabase": "Importa Database", - "importDatabaseDesc": "Ripristina da un file di backup .sqlite", - "importDatabaseSelected": "Selezionato: {{name}}", - "selectFile": "Seleziona File", - "changeFile": "Cambia", - "import": "Importa", - "importing": "Importazione...", - "apiKeysCount": "{{count}} chiavi", - "newApiKey": "Nuova Chiave Api", - "apiKeyCreatedWarning": "Chiave creata - copiala ora, non verrà mostrata di nuovo.", - "apiKeyName": "Nome", - "apiKeyUser": "Utente", - "apiKeySelectUser": "Seleziona un utente...", - "apiKeyExpiresAt": "Scade Il", - "createKey": "Crea Chiave", - "apiKeyNoExpiry": "Nessuna scadenza", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Rimuovere", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Autenticazione Doppio", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Locale", - "adminStatusAdministrator": "Amministratore", - "adminStatusRegularUser": "Utente Regolare", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", "customBadge": "CUSTOM", - "youBadge": "VOI", - "sessionsActive": "{{count}} attivo", - "sessionActive": "Attivo: {{time}}", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "Tutti", - "revokeAllSessionsSuccess": "Tutte le sessioni per l'utente revocato", - "revokeAllSessionsFailed": "Impossibile revocare le sessioni", - "revokeSessionFailed": "Impossibile revocare la sessione", - "addRole": "Aggiungi ruolo", - "noCustomRoles": "Nessun ruolo personalizzato definito", - "removeRoleFailed": "Impossibile rimuovere il ruolo", - "assignRoleFailed": "Impossibile assegnare il ruolo", - "deleteRoleFailed": "Impossibile eliminare il ruolo", - "userAdminAccess": "Amministratore", - "userAdminAccessDesc": "Accesso completo a tutte le impostazioni admin", - "userRoles": "Ruoli", - "revokeAllUserSessions": "Revoca Tutte Le Sessioni", - "revokeAllUserSessionsDesc": "Forza il re-login su tutti i dispositivi", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "L'eliminazione di questo utente è permanente.", - "deleteUser": "Elimina {{username}}", - "deleting": "Eliminazione...", - "deleteUserFailed": "Impossibile eliminare l'utente", - "deleteUserSuccess": "Utente \"{{username}}\" eliminato", - "deleteRoleSuccess": "Ruolo \"{{name}}\" eliminato", - "revokeKeySuccess": "Chiave \"{{name}}\" revocata", - "revokeKeyFailed": "Impossibile revocare la chiave", - "copiedToClipboard": "Copiato negli appunti", - "done": "Fatto", - "createUserTitle": "Crea Utente", - "createUserDesc": "Crea un nuovo account locale.", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", "createUserUsername": "Username", "createUserPassword": "Password", - "createUserPasswordHint": "Minimo 6 caratteri.", - "createUserEnterUsername": "Inserisci nome utente", - "createUserEnterPassword": "Inserire la password", - "createUserSubmit": "Crea Utente", - "editUserTitle": "Gestisci Utente: {{username}}", - "editUserDesc": "Modifica ruoli, stato amministratore, sessioni e impostazioni account.", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", "editUserUsername": "Username", - "editUserAuthType": "Tipo Autenticazione", - "editUserAdminStatus": "Stato Amministratore", - "editUserUserId": "Id Utente", - "linkAccountTitle": "Collega OIDC all'account Password", - "linkAccountDesc": "Unisci l'account OIDC {{username}} con un account locale esistente.", - "linkAccountWarningTitle": "Ciò permetterà:", - "linkAccountEffect1": "Elimina l'account solo OIDC", - "linkAccountEffect2": "Aggiunge l'accesso OIDC all'account di destinazione", - "linkAccountEffect3": "Consenti l'accesso sia OIDC che password", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Inserisci il nome utente dell'account locale a cui collegarsi", - "linkAccounts": "Collega Account", - "linkAccountSuccess": "Account OIDC collegato a \"{{username}}\"", - "linkAccountFailed": "Impossibile collegare l'account OIDC", + "editUserAuthType": "Tipo di autorizzazione", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Collegamento...", - "saving": "Salvataggio...", - "updateRegistrationFailed": "Impossibile aggiornare l'impostazione della registrazione", - "updatePasswordLoginFailed": "Impossibile aggiornare l'impostazione del login password", - "updateOidcAutoProvisionFailed": "Impossibile aggiornare l'impostazione di auto-fornitura OIDC", - "updatePasswordResetFailed": "Impossibile aggiornare l'impostazione di reimpostazione password", - "sessionTimeoutRange2": "Il timeout della sessione deve essere compreso tra 1 e 720 ore", - "sessionTimeoutSaved": "Timeout sessione salvato", - "sessionTimeoutSaveFailed": "Impossibile salvare il timeout della sessione", - "monitoringIntervalInvalid": "Valori di intervallo non validi", - "monitoringSaved": "Impostazioni di monitoraggio salvate", - "monitoringSaveFailed": "Impossibile salvare le impostazioni di monitoraggio", - "guacamoleSaved": "Impostazioni di Guacamole salvate", - "guacamoleSaveFailed": "Salvataggio delle impostazioni di Guacamole non riuscito", - "guacamoleUpdateFailed": "Aggiornamento delle impostazioni di Guacamole non riuscito", - "logLevelUpdateFailed": "Impossibile aggiornare il livello di log", - "oidcSaved": "Configurazione OIDC salvata", - "oidcSaveFailed": "Salvataggio della configurazione OIDC non riuscito", - "oidcRemoved": "Configurazione OIDC rimossa", - "oidcRemoveFailed": "Rimozione della configurazione OIDC non riuscita", - "createUserRequired": "Nome utente e password sono richiesti", - "createUserPasswordTooShort": "La password deve contenere almeno 6 caratteri", - "createUserSuccess": "Utente \"{{username}}\" creato", - "createUserFailed": "Impossibile creare l'utente", - "updateAdminStatusFailed": "Impossibile aggiornare lo stato dell'amministratore", - "allSessionsRevoked": "Tutte le sessioni revocate", - "revokeSessionsFailed": "Impossibile revocare le sessioni", - "createRoleRequired": "Il nome e il nome visualizzato sono obbligatori", - "createRoleSuccess": "Ruolo \"{{name}}\" creato", - "createRoleFailed": "Impossibile creare il ruolo", - "apiKeyNameRequired": "Nome chiave obbligatorio", - "apiKeyUserRequired": "L'ID utente è obbligatorio", - "apiKeyCreatedSuccess": "Chiave API \"{{name}}\" creata", - "apiKeyCreateFailed": "Impossibile creare la chiave API", - "exportSuccess": "Database esportato con successo", - "exportFailed": "Esportazione database fallita", - "importSelectFile": "Per favore seleziona prima un file", - "importCompleted": "Importazione completata: {{total}} elementi importati, {{skipped}} saltato", - "importFailed": "Importazione fallita: {{error}}", - "importError": "Importazione del database fallita" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "terminale", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Host", - "hostPlaceholder": "192.168.1.1 o example.com", - "portLabel": "Porta", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", "usernameLabel": "Username", "usernamePlaceholder": "username", - "authLabel": "Autenticazione", + "authLabel": "Auth", "passwordLabel": "Password", "passwordPlaceholder": "password", - "privateKeyLabel": "Chiave Privata", - "privateKeyPlaceholder": "Incolla chiave privata...", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", "credentialLabel": "Credenziali", - "credentialPlaceholder": "Seleziona una credenziale salvata", - "connectToTerminal": "Connetti al terminale", - "connectToFiles": "Connetti ai file" + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Nessun terminale selezionato", - "noTerminalSelectedHint": "Apre una scheda terminale SSH per visualizzare la sua cronologia dei comandi", - "searchPlaceholder": "Cronologia ricerca...", - "clearAll": "Cancella Tutto", - "noHistoryEntries": "Nessuna voce della cronologia", - "trackingDisabled": "Il tracciamento della cronologia è disabilitato", - "trackingDisabledHint": "Abilitarlo nelle impostazioni del profilo per registrare i comandi." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Registrazione Della Chiave", - "recordToTerminals": "Registra sui terminali", - "selectAll": "Tutti", + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", "selectNone": "Nessuno", - "noTerminalTabsOpen": "Nessuna scheda terminale aperta", - "selectTerminalsAbove": "Seleziona i terminali sopra", - "broadcastInputPlaceholder": "Digita qui per trasmettere le sequenze...", - "stopRecording": "Interrompi Registrazione", - "startRecording": "Inizia La Registrazione", - "settingsTitle": "Impostazioni", - "enableRightClickCopyPaste": "Abilita copia/incolla clic destro" + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { "layoutTitle": "Layout", - "selectLayoutAbove": "Seleziona un layout sopra", - "selectLayoutHint": "Scegli quanti riquadri visualizzare", - "panesTitle": "Riquadri", - "openTabsTitle": "Apri Schede", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Trascina le schede nei riquadri sopra oppure usa Assegnazione rapida", - "dropHere": "Rilascia qui", - "emptyPane": "Vuoto", + "dropHere": "Drop here", + "emptyPane": "Empty", "dashboard": "Dashboard", - "clearSplitScreen": "Cancella Schermo Diviso", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Assegnazione rapida", "alreadyAssigned": "Pane {{index}}", "splitTab": "Scheda divisa", "addToSplit": "Aggiungi a Divide", "removeFromSplit": "Rimuovi da Split", - "assignToPane": "Assegna al riquadro" + "assignToPane": "Assegna al riquadro", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Crea Snippet", - "createSnippetDescription": "Crea una nuova snippet di comando per l'esecuzione rapida", - "nameLabel": "Nome", - "namePlaceholder": "es. Riavvia Nginx", - "descriptionLabel": "Descrizione", - "descriptionPlaceholder": "Descrizione facoltativa", - "optional": "Facoltativo", - "folderLabel": "Cartella", - "noFolder": "Nessuna cartella (non categorizzata)", - "commandLabel": "Comando", - "commandPlaceholder": "es. sudo systemctl riavvia nginx", - "cancel": "Annulla", - "createSnippetButton": "Crea Snippet", - "createFolderTitle": "Crea Cartella", - "createFolderDescription": "Organizza i pezzetti di codice nelle cartelle", - "folderNameLabel": "Nome Cartella", - "folderNamePlaceholder": "Ad esempio, Comandi di sistema, Script Docker", - "folderColorLabel": "Colore Cartella", - "folderIconLabel": "Icona Cartella", - "previewLabel": "Anteprima", - "folderNameFallback": "Nome Cartella", - "createFolderButton": "Crea Cartella", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancellare", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Tutti", + "selectAll": "All", "selectNone": "Nessuno", - "noTerminalTabsOpen": "Nessuna scheda terminale aperta", - "searchPlaceholder": "Cerca snippet...", - "newSnippet": "Nuovo Snippet", - "newFolder": "Nuova Cartella", - "run": "Esegui", - "noSnippetsInFolder": "Nessuna snippet in questa cartella", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Correre", + "noSnippetsInFolder": "No snippets in this folder", "uncategorized": "Uncategorized", - "editSnippetTitle": "Modifica Snippet", - "editSnippetDescription": "Aggiorna questa snippet di comando", - "saveSnippetButton": "Salva Modifiche", - "createSuccess": "Snippet creato con successo", - "createFailed": "Creazione snippet non riuscita", - "updateSuccess": "Snippet aggiornato con successo", - "updateFailed": "Aggiornamento snippet non riuscito", - "deleteFailed": "Impossibile eliminare la snippet", - "folderCreateSuccess": "Cartella creata con successo", - "folderCreateFailed": "Creazione della cartella non riuscita", - "editFolderTitle": "Modifica Cartella", - "editFolderDescription": "Rinomina o cambia l'aspetto di questa cartella", - "saveFolderButton": "Salva Modifiche", - "editFolder": "Modifica cartella", - "deleteFolder": "Elimina cartella", - "folderDeleteSuccess": "Cartella \"{{name}}\" eliminata", - "folderDeleteFailed": "Impossibile eliminare la cartella", - "folderEditSuccess": "Cartella aggiornata con successo", - "folderEditFailed": "Impossibile aggiornare la cartella", - "confirmRunMessage": "Eseguire \"{{name}}\"?", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Correre", - "runSuccess": "Ran \"{{name}}\" in {{count}} terminale(i)", - "copySuccess": "Copiato \"{{name}}\" negli appunti", - "shareTitle": "Condividi Snippet", - "shareUser": "Utente", - "shareRole": "Ruolo", - "selectUser": "Seleziona un utente...", - "selectRole": "Seleziona un ruolo...", - "shareSuccess": "Snippet condiviso con successo", - "shareFailed": "Condivisione snippet non riuscita", - "revokeSuccess": "Accesso revocato", - "revokeFailed": "Impossibile revocare l'accesso", - "currentAccess": "Accesso Corrente", - "shareLoadError": "Impossibile caricare i dati di condivisione", - "loading": "Caricamento...", - "close": "Chiudi", - "reorderFailed": "Impossibile salvare l'ordine degli snippet" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Impossibile salvare l'ordine degli snippet", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", "sectionAccount": "Account", - "sectionAppearance": "Aspetto", - "sectionSecurity": "Sicurezza", - "sectionApiKeys": "Chiavi API", - "sectionC2sTunnels": "Gallerie C2S", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", "usernameLabel": "Username", - "roleLabel": "Ruolo", - "roleAdministrator": "Amministratore", - "authMethodLabel": "Metodo Autenticazione", - "authMethodLocal": "Locale", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "Acceso", + "twoFaOn": "On", "twoFaOff": "Off", - "versionLabel": "Versione", - "deleteAccount": "Elimina Account", - "deleteAccountDescription": "Elimina definitivamente il tuo account", - "deleteButton": "Elimina", - "deleteAccountPermanent": "Questa azione è permanente e non può essere annullata.", - "deleteAccountWarning": "Tutte le sessioni, gli host, le credenziali e le impostazioni verranno eliminati definitivamente.", - "confirmPasswordDeletePlaceholder": "Inserisci la tua password per confermare", - "languageLabel": "Lingua", - "themeLabel": "Tema", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Colore Accento", - "settingsTerminal": "Terminale", - "commandAutocomplete": "Completamento Automatico Dei Comandi", - "commandAutocompleteDesc": "Mostra completamento automatico durante la digitazione", - "historyTracking": "Tracciamento Cronologia", - "historyTrackingDesc": "Comandi del terminale traccia", - "syntaxHighlighting": "Evidenziazione Sintassi", - "syntaxHighlightingDesc": "Evidenzia uscita terminale", - "commandPalette": "Tavolozza Comandi", - "commandPaletteDesc": "Abilita scorciatoia da tastiera", + "accentColorLabel": "Accent Color", + "settingsTerminal": "terminale", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Riapri le schede all'accesso", "reopenTabsOnLoginDesc": "Ripristina le schede aperte quando accedi o aggiorni la pagina, anche da un altro dispositivo.", - "confirmTabClose": "Conferma Chiusura Scheda", - "confirmTabCloseDesc": "Chiedi prima di chiudere le schede del terminale", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Mostra Tag Host", - "showHostTagsDesc": "Mostra i tag nella lista host", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Fai clic per espandere le azioni dell'host", "hostTrayOnClickDesc": "Mostra sempre i pulsanti di connessione; fai clic per espandere le opzioni di gestione anziché passare il mouse sopra", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Mantieni la barra laterale sinistra sempre espansa, anziché espanderla al passaggio del mouse.", - "settingsSnippets": "Snippet", - "foldersCollapsed": "Cartelle Compensate", - "foldersCollapsedDesc": "Comprimi le cartelle come predefinite", - "confirmExecution": "Conferma Esecuzione", - "confirmExecutionDesc": "Conferma prima di eseguire snippet", - "settingsUpdates": "Aggiornamenti", - "disableUpdateChecks": "Disabilita Controllo Aggiornamenti", - "disableUpdateChecksDesc": "Interrompi il controllo degli aggiornamenti", - "totpAuthenticator": "Autenticatore TOTP", - "totpEnabled": "2FA è abilitato", - "totpDisabled": "Aggiungi sicurezza extra per l'accesso", - "disable": "Disabilita", - "enable": "Abilita", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Scansiona il codice QR o inserisci il segreto nell'app di autenticazione, quindi inserisci il codice a 6 cifre", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verifica", - "changePassword": "Cambia Password", - "currentPasswordLabel": "Password Attuale", - "currentPasswordPlaceholder": "Password attuale", - "newPasswordLabel": "Nuova Password", - "newPasswordPlaceholder": "Nuova password", - "confirmPasswordLabel": "Conferma Nuova Password", - "confirmPasswordPlaceholder": "Conferma la nuova password", - "updatePassword": "Aggiorna Password", - "createApiKeyTitle": "Crea Chiave API", - "createApiKeyDescription": "Genera una nuova chiave API per l'accesso programmatico.", - "apiKeyNameLabel": "Nome", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "opzionale", - "cancel": "Annulla", - "createKey": "Crea Chiave", - "apiKeyCount": "{{count}} chiavi", - "newKey": "Nuova Chiave", - "noApiKeys": "Ancora nessuna chiave API.", - "apiKeyActive": "Attivo", - "apiKeyUsageHint": "Includi la tua chiave nella", - "apiKeyUsageHintHeader": "intestazione.", - "apiKeyPermissionsHint": "Le chiavi ereditano i permessi dell'utente creatore.", - "roleUser": "Utente", - "authMethodDual": "Autenticazione Doppio", + "optional": "optional", + "cancel": "Cancellare", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Avvio della configurazione TOTP non riuscito", - "totpEnter6Digits": "Inserisci un codice a 6 cifre", - "totpEnabledSuccess": "Autenticazione a due fattori abilitata", - "totpInvalidCode": "Codice non valido, riprova", - "totpDisableInputRequired": "Inserisci il codice TOTP o la password", - "totpDisabledSuccess": "Autenticazione a due fattori disabilitata", - "totpDisableFailed": "Impossibile disattivare 2FA", - "totpDisableTitle": "Disabilita 2FA", - "totpDisablePlaceholder": "Inserisci il codice TOTP o la password", - "totpDisableConfirm": "Disabilita 2FA", - "totpContinueVerify": "Continua a verificare", - "totpVerifyTitle": "Verifica Codice", - "totpBackupTitle": "Codici Backup", - "totpDownloadBackup": "Scarica Codici Di Backup", - "done": "Fatto", - "secretCopied": "Segreto copiato negli appunti", - "apiKeyNameRequired": "Nome chiave obbligatorio", - "apiKeyCreated": "Chiave API \"{{name}}\" creata", - "apiKeyCreateFailed": "Impossibile creare la chiave API", - "apiKeyUser": "Utente", - "apiKeyExpires": "Scade", - "apiKeyRevoked": "Chiave API \"{{name}}\" revocata", - "apiKeyRevokeFailed": "Impossibile revocare la chiave API", - "passwordFieldsRequired": "Le password attuali e nuove sono richieste", - "passwordMismatch": "Le password non corrispondono", - "passwordTooShort": "La password deve contenere almeno 6 caratteri", - "passwordUpdated": "Password aggiornata correttamente", - "passwordUpdateFailed": "Impossibile aggiornare la password", - "deletePasswordRequired": "La password è necessaria per eliminare il tuo account", - "deleteFailed": "Impossibile eliminare l'account", - "deleting": "Eliminazione...", - "colorPickerTooltip": "Apri selettore colore", - "themeSystem": "Sistema", - "themeLight": "Chiaro", - "themeDark": "Scuro", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarizzato", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Un Oscuro", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Etichette", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Riprova", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Rimuovere", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/ja_JP.json b/src/ui/locales/translated/ja_JP.json index b07c8013..464c9fc9 100644 --- a/src/ui/locales/translated/ja_JP.json +++ b/src/ui/locales/translated/ja_JP.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "フォルダ", - "folder": "フォルダ", + "folders": "Folders", + "folder": "Folder", "password": "パスワード", - "key": "キー", - "sshPrivateKey": "SSHプライベートキー", - "upload": "アップロード", - "keyPassword": "キーパスワード", - "sshKey": "SSH キー", - "uploadPrivateKeyFile": "プライベートキーファイルをアップロード", - "searchCredentials": "資格情報を検索...", - "addCredential": "証明書の追加", - "caCertificate": "CA 証明書 (-cert.pub)", - "caCertificateDescription": "オプション: CA 署名証明書ファイルをアップロードまたは貼り付けます (例: id_ed25519-cert.pub)。 SSHサーバーが証明書ベースの認証を使用する場合に必要です。", - "uploadCertFile": "-cert.pub ファイルをアップロード", - "clearCert": "クリア", - "certLoaded": "証明書が読み込まれました", - "certPublicKeyLabel": "CA 証明書", - "certTypeLabel": "証明書の種類", - "pasteOrUploadCert": "-cert.pub 証明書を貼り付けまたはアップロード...", - "hasCaCert": "CA 証明書", - "noCaCert": "CA証明書がありません" + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSHキー", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "デフォルトオーダー", + "sortNameAsc": "名前(A~Z)", + "sortNameDesc": "名前(Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "フィルターをクリア", + "filterTypeGroup": "Type", + "filterTypePassword": "パスワード", + "filterTypeKey": "SSHキー", + "filterTagsGroup": "タグ" }, "homepage": { - "failedToLoadAlerts": "アラートの読み込みに失敗しました", - "failedToDismissAlert": "アラートを解除できませんでした" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "サーバーの設定", - "description": "バックエンドサービスに接続するTermixサーバーのURLを設定する", - "serverUrl": "サーバー URL", - "enterServerUrl": "サーバーの URL を入力してください", - "saveFailed": "設定の保存に失敗しました", - "saveError": "設定の保存中にエラーが発生しました", - "saving": "保存中...", - "saveConfig": "設定を保存", - "helpText": "Termixサーバーが稼働しているURLを入力してください(例:http://localhost:30001、https://your-server.com)", - "changeServer": "サーバーの変更", - "mustIncludeProtocol": "サーバーのURLはhttp://またはhttps://で始まる必要があります", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "無効な証明書を許可する", "allowInvalidCertificateDesc": "自己署名証明書またはIPアドレス証明書を使用する、信頼できる自己ホスト型サーバーでのみ使用してください。", - "useEmbedded": "ローカルサーバーを使用", - "embeddedDesc": "内蔵のローカルサーバー(リモートサーバーは必要ありません)でTermixを実行", - "embeddedConnecting": "ローカルサーバーに接続中...", - "embeddedNotReady": "ローカルサーバーの準備ができていません。しばらく待ってからもう一度やり直してください。", - "localServer": "ローカルサーバー" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "取り除く" }, "versionCheck": { - "error": "バージョンチェックエラー", - "checkFailed": "更新の確認に失敗しました", - "upToDate": "アプリは最新です", - "currentVersion": "あなたはバージョン {{version}}を実行しています", - "updateAvailable": "アップデートがあります", - "newVersionAvailable": "新しいバージョンが利用可能です!あなたは {{current}}を実行していますが、 {{latest}} は利用可能です。", - "betaVersion": "ベータバージョン", - "betaVersionDesc": "あなたは最新の安定版 {{current}}より新しい {{latest}}を実行しています。", - "releasedOn": "{{date}} でリリース", - "downloadUpdate": "アップデートをダウンロード", - "checking": "アップデートを確認しています...", - "checkUpdates": "アップデートの確認", - "checkingUpdates": "アップデートを確認しています...", - "updateRequired": "更新が必要です" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "閉じる", + "close": "Close", "minimize": "Minimize", "online": "オンライン", "offline": "オフライン", - "continue": "続ける", - "maintenance": "メンテナンス", - "degraded": "劣化しました", - "error": "エラー", - "warning": "警告", - "unsavedChanges": "保存されていない変更", - "dismiss": "却下する", - "loading": "読み込み中...", - "optional": "省略可能", - "connect": "接続する", - "copied": "コピーしました", - "connecting": "接続中...", - "updateAvailable": "アップデートがあります", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "新しいタブで開く", - "noReleases": "リリースなし", - "updatesAndReleases": "更新とリリース", - "newVersionAvailable": "新しいバージョン({{version}})が利用可能です。", - "failedToFetchUpdateInfo": "更新情報の取得に失敗しました", - "preRelease": "プレリリース", - "noReleasesFound": "リリースが見つかりません。", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", "cancel": "キャンセル", - "username": "ユーザー名", - "login": "ログイン", - "register": "登録", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "パスワード", - "confirmPassword": "パスワードの確認", - "back": "戻る", - "save": "保存", - "saving": "保存中...", - "delete": "削除", - "rename": "名前の変更", - "edit": "編集", - "add": "追加", - "confirm": "確認する", - "no": "いいえ", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", "or": "OR", - "next": "次へ", - "previous": "前", - "refresh": "更新", - "language": "言語", - "checking": "確認しています...", - "checkingDatabase": "データベース接続を確認しています...", - "checkingAuthentication": "認証中char@@0", - "backendReconnected": "サーバー接続が復元されました", - "connectionDegraded": "サーバー接続が失われました。復旧中です…", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "削除", - "create": "作成", - "update": "更新", + "remove": "取り除く", + "create": "Create", + "update": "Update", "copy": "コピー", - "copyFailed": "クリップボードにコピーできませんでした", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "復元", - "of": "/" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "ホーム", + "home": "Home", "terminal": "ターミナル", - "docker": "Docker", - "tunnels": "トンネル", + "docker": "ドッカー", + "tunnels": "Tunnels", "fileManager": "ファイルマネージャー", - "serverStats": "サーバーの統計", - "admin": "管理者", - "userProfile": "ユーザープロフィール", - "splitScreen": "画面の分割", - "confirmClose": "このアクティブなセッションを閉じますか?", - "close": "閉じる", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", "cancel": "キャンセル", - "sshManager": "SSH マネージャー", - "cannotSplitTab": "このタブは分割できません", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "パスワードをコピー", - "copySudoPassword": "Sudoパスワードをコピー", - "passwordCopied": "パスワードをクリップボードにコピーしました", - "noPasswordAvailable": "パスワードがありません", - "failedToCopyPassword": "パスワードのコピーに失敗しました", - "refreshTab": "接続を更新", - "openFileManager": "ファイルマネージャを開く", - "dashboard": "ダッシュボード", - "networkGraph": "ネットワークグラフ", - "quickConnect": "クイック接続", - "sshTools": "SSH ツール", - "history": "沿革", - "hosts": "ホスト", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", "snippets": "Snippets", - "hostManager": "ホスト マネージャー", - "credentials": "資格情報", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "つながり", - "roleAdministrator": "管理者", - "roleUser": "ユーザー" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "ホスト", - "noHosts": "SSHホストがありません", - "retry": "再試行する", - "refresh": "更新", - "optional": "省略可能", - "downloadSample": "サンプルをダウンロード", - "failedToDeleteHost": "{{name}} の削除に失敗しました", - "importSkipExisting": "インポート (スキップが既存)", - "connectionDetails": "接続詳細", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "リトライ", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "リモートデスクトップ", - "port": "ポート", - "username": "ユーザー名", - "folder": "フォルダ", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "タグ", - "pin": "ピン留めする", - "addHost": "ホストを追加", - "editHost": "ホストを編集", - "cloneHost": "ホストを複製", - "enableTerminal": "ターミナルを有効にする", - "enableTunnel": "トンネルを有効化", - "enableFileManager": "ファイルマネージャーを有効にする", - "enableDocker": "Docker を有効にする", - "defaultPath": "既定のパス", - "connection": "接続", - "upload": "アップロード", - "authentication": "認証", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "パスワード", - "key": "キー", - "credential": "資格情報", + "key": "Key", + "credential": "資格証明書", "none": "なし", - "sshPrivateKey": "SSHプライベートキー", - "keyType": "キーの種類", - "uploadFile": "ファイルをアップロード", - "tabGeneral": "全般", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "ターミナル", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "トンネル", - "tabDocker": "Docker", - "tabFiles": "ファイル", - "tabStats": "統計", + "tabTunnels": "Tunnels", + "tabDocker": "ドッカー", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "共有", - "tabAuthentication": "認証", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "ターミナル", "tunnel": "トンネル", "fileManager": "ファイルマネージャー", - "serverStats": "サーバーの統計", - "status": "ステータス", - "folderRenamed": "フォルダ \"{{oldName}}\" の名前を \"{{newName}}\" に変更しました", - "failedToRenameFolder": "フォルダの名前を変更できませんでした", - "movedToFolder": "\"{{folder}} \"に移動しました", - "editHostTooltip": "ホストを編集", - "statusChecks": "状態チェック", - "metricsCollection": "メトリックコレクション", - "metricsInterval": "メトリックコレクションの間隔", - "metricsIntervalDesc": "サーバーの統計情報を収集する頻度(5秒~1時間)", - "behavior": "動作", - "themePreview": "テーマのプレビュー", - "theme": "テーマ", - "fontFamily": "フォントファミリー", + "serverStats": "Host Metrics", + "status": "状態", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "文字間隔", - "lineHeight": "行の高さ", - "cursorStyle": "カーソルスタイル", - "cursorBlink": "カーソルブリンク", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", "scrollbackBuffer": "Scrollback Buffer", - "bellStyle": "ベルスタイル", - "rightClickSelectsWord": "右クリックで単語を選択", - "fastScrollModifier": "高速スクロールの変更", - "fastScrollSensitivity": "高速スクロール感度", - "sshAgentForwarding": "SSH エージェント転送", - "backspaceMode": "バックスペースモード", - "startupSnippet": "スタートアップスニペットを開く", - "selectSnippet": "スニペットを選択", - "forceKeyboardInteractive": "キーボード対話を強制する", - "overrideCredentialUsername": "認証情報のユーザー名を上書きする", - "overrideCredentialUsernameDesc": "資格情報のユーザー名の代わりに上記のユーザー名を使用してください", - "jumpHostChain": "ジャンプホスト チェーン", - "portKnocking": "ポートノッキング(ポートノッキング)", - "addKnock": "ポートを追加", - "addProxyNode": "ノードを追加", - "proxyNode": "プロキシノード", - "proxyType": "プロキシタイプ", - "quickActions": "クイックアクション", - "sudoPasswordAutoFill": "Sudoパスワード自動入力", - "sudoPassword": "Sudoのパスワード", - "keepaliveInterval": "保持間隔 (ms)", - "moshCommand": "MOSHコマンド", - "environmentVariables": "環境変数", - "addVariable": "変数を追加", - "docker": "Docker", - "copyTerminalUrl": "端末の URL をコピー", - "copyFileManagerUrl": "ファイルマネージャーの URL をコピー", - "copyRemoteDesktopUrl": "リモートデスクトップの URL をコピー", - "failedToConnect": "コンソールに接続できませんでした", - "connect": "接続する", - "disconnect": "接続を解除", - "start": "開始", - "enableStatusCheck": "ステータスチェックを有効にする", - "enableMetrics": "メトリックを有効にする", - "bulkUpdateFailed": "一括更新に失敗しました", - "selectAll": "すべて選択", - "deselectAll": "すべての選択を解除", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "ドッカー", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "安全なシェル", - "virtualNetwork": "仮想ネットワーク", - "unencryptedShell": "非暗号化シェル", - "addressIp": "アドレス / IP", - "friendlyName": "フレンドリー名", - "folderAndAdvanced": "フォルダと詳細設定", - "privateNotes": "プライベートノート", - "privateNotesPlaceholder": "このサーバーに関する詳細...", - "pinToTop": "上部に固定", - "pinToTopDesc": "このホストをリストの一番上に常に表示", - "portKnockingSequence": "ポートノックシーケンス", - "addKnockBtn": "ノックを追加", - "noPortKnocking": "設定されたポートがありません。", - "knockPort": "ノックポート", - "protocol": "Protocol", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "プロトコル", "delayAfterMs": "Delay After (ms)", - "useSocks5Proxy": "SOCKS5 プロキシを使用する", - "useSocks5ProxyDesc": "プロキシ サーバー経由での接続をルート", - "proxyHost": "プロキシホスト", - "proxyPort": "プロキシポート", - "proxyUsername": "プロキシユーザー名", - "proxyPassword": "プロキシパスワード", - "proxySingleMode": "単一のプロキシ", - "proxyChainMode": "プロキシチェーン", - "you": "あなたです", - "jumpHostChainLabel": "ジャンプホスト チェーン", - "addJumpBtn": "ジャンプを追加", - "noJumpHosts": "ジャンプホストが設定されていません。", - "selectAServer": "サーバーを選択...", - "sshPort": "SSH ポート", - "authMethod": "認証方法", - "storedCredential": "保存された資格情報", - "selectACredential": "資格情報を選択...", - "keyTypeLabel": "キーの種類", - "keyTypeAuto": "自動検出", - "keyPasteTab": "貼り付け", - "keyUploadTab": "アップロード", - "keyFileLoaded": "キーファイルが読み込まれました", - "keyUploadClick": "クリックして .pem / .key / .ppk をアップロードします", - "clearKey": "キーをクリア", - "keySaved": "SSHキーを保存しました", - "keyReplaceNotice": "新しいキーを置き換えるには、以下に新しいキーを貼り付けます", - "keyPassphraseSaved": "パスフレーズを保存しました。変更するにはパスワードを入力してください", - "replaceKey": "キーを置き換え", - "forceKeyboardInteractiveLabel": "強制的にキーボードをインタラクティブにする", - "forceKeyboardInteractiveShortDesc": "キーが存在する場合でも手動パスワード入力を強制する", - "terminalAppearance": "端末の外観", - "colorTheme": "色のテーマ", - "fontFamilyLabel": "フォントファミリー", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "カーソルスタイル", - "letterSpacingPx": "文字間隔 (px)", - "lineHeightLabel": "行の高さ", - "bellStyleLabel": "ベルスタイル", - "backspaceModeLabel": "バックスペースモード", - "cursorBlinking": "カーソルのBlinking", - "cursorBlinkingDesc": "端末カーソルの点滅アニメーションを有効にする", - "rightClickSelectsWordLabel": "右クリックで単語を選択", - "rightClickSelectsWordShortDesc": "右クリック時にカーソルの下にある単語を選択します", - "behaviorAndAdvanced": "ビヘイビア&アドバンスト", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", "scrollbackBufferLabel": "Scrollback Buffer", - "scrollbackMaxLines": "履歴に保持される行の最大数", - "sshAgentForwardingLabel": "SSH エージェント転送", - "sshAgentForwardingShortDesc": "ローカル SSH キーをこのホストに渡します", - "enableAutoMosh": "自動モスを有効にする", - "enableAutoMoshDesc": "利用可能な場合はMosh を SSH よりも優先します", - "enableAutoTmux": "自動Tmuxを有効にする", - "enableAutoTmuxDesc": "tmux セッションに自動的に起動またはアタッチする", - "sudoPasswordAutoFillLabel": "Sudoパスワード自動入力", - "sudoPasswordAutoFillShortDesc": "プロンプトが表示されたら自動的に sudo パスワードを提供します", - "sudoPasswordLabel": "Sudoのパスワード", - "environmentVariablesLabel": "環境変数", - "addVariableBtn": "変数を追加", - "noEnvVars": "環境変数が設定されていません。", - "fastScrollModifierLabel": "高速スクロールの変更", - "fastScrollSensitivityLabel": "高速スクロール感度", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Mosh Command", - "startupSnippetLabel": "スタートアップスニペットを開く", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "キープアライブ間隔(秒)", - "maxKeepaliveMisses": "最大Keep生存ミス数", - "tunnelSettings": "トンネルの設定", - "enableTunneling": "トンネリングを有効にする", - "enableTunnelingDesc": "このホストの SSH トンネル機能を有効にする", - "serverTunnelsSection": "サーバートンネル", - "addTunnelBtn": "トンネルを追加", - "noTunnelsConfigured": "トンネルが設定されていません。", - "tunnelLabel": "トンネル {{number}}", - "tunnelType": "トンネルタイプ", - "tunnelModeLocalDesc": "ローカルポートをリモートサーバー(またはそこから到達可能なホスト)のポートに転送します。", - "tunnelModeRemoteDesc": "リモートサーバーのポートをマシンのローカルポートに転送します。", - "tunnelModeDynamicDesc": "ダイナミックポート転送用のローカルポートに SOCKS5 プロキシを作成します。", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "このホスト(ダイレクトトンネル)", - "endpointHost": "エンドポイントホスト", - "endpointPort": "エンドポイントポート", - "bindHost": "バインドホスト", - "sourcePort": "ソースポート", - "maxRetries": "最大再試行回数", - "retryIntervalS": "再試行間隔", - "autoStartLabel": "自動開始", - "autoStartDesc": "ホストがロードされたときに自動的にこのトンネルを接続する", - "tunnelConnecting": "トンネル接続中...", - "tunnelDisconnected": "トンネルが切断されました", - "failedToConnectTunnel": "接続に失敗しました", - "failedToDisconnectTunnel": "切断に失敗しました", - "dockerIntegration": "Docker 統合", - "enableDockerMonitor": "Docker を有効にする", - "enableDockerMonitorDesc": "Docker経由でこのホスト上のコンテナを監視・管理", - "enableFileManagerMonitor": "ファイルマネージャーを有効にする", - "enableFileManagerMonitorDesc": "SFTP経由でこのホスト上のファイルを参照して管理します", - "defaultPathLabel": "既定のパス", - "fileManagerPathHint": "ファイルマネージャがこのホストを起動したときに開くディレクトリ。", - "statusChecksLabel": "状態チェック", - "enableStatusChecks": "ステータスチェックを有効にする", - "enableStatusChecksDesc": "定期的にこのホストをpingして可用性を確認します", - "useGlobalInterval": "グローバルインターバルを使用", - "useGlobalIntervalDesc": "サーバ全体の状態チェック間隔で上書きする", - "checkIntervalS": "チェック間隔", - "checkIntervalDesc": "各接続Ping間の秒", - "metricsCollectionLabel": "メトリックコレクション", - "enableMetricsLabel": "メトリックを有効にする", - "enableMetricsDesc": "このホストからCPU、RAM、ディスク、およびネットワーク使用状況を収集します", - "useGlobalMetrics": "グローバルインターバルを使用", - "useGlobalMetricsDesc": "サーバー全体のメトリック間隔で上書き", - "metricsIntervalS": "メトリック間隔", - "metricsIntervalDesc2": "メトリックスナップショット間の秒", - "visibleWidgets": "表示されるウィジェット", - "cpuUsageLabel": "CPU 使用率", - "cpuUsageDesc": "CPUパーセント、負荷平均、スパークライングラフ", - "memoryLabel": "メモリ使用量", - "memoryDesc": "RAM使用量、スワップ、キャッシュ", - "storageLabel": "ディスクの使用量", - "storageDesc": "マウントポイントあたりのディスク使用率", - "networkLabel": "ネットワークインターフェース", - "networkDesc": "インターフェイスリストと帯域幅の設定", - "uptimeLabel": "稼働時間", - "uptimeDesc": "システムの稼働時間と起動時間", - "systemInfoLabel": "システム情報", - "systemInfoDesc": "OS、カーネル、ホスト名、アーキテクチャ", - "recentLoginsLabel": "最近のログイン", - "recentLoginsDesc": "ログインイベントに失敗しました", - "topProcessesLabel": "トッププロセス", - "topProcessesDesc": "PID, CPU, MEM%, コマンド", - "listeningPortsLabel": "ポートを聴いています", - "listeningPortsDesc": "プロセスと状態でポートを開く", - "firewallLabel": "ファイアウォール", - "firewallDesc": "ファイアウォール、AppArmor、SELinux の状態", - "quickActionsLabel": "クイックアクション", - "quickActionsToolbar": "クイックアクションは、ワンクリックコマンドの実行のためにサーバー統計ツールバーのボタンとして表示されます。", - "noQuickActions": "クイックアクションはまだありません。", - "buttonLabel": "ボタンのラベル", - "selectSnippetPlaceholder": "スニペットを選択...", - "addActionBtn": "アクションを追加", - "hostSharedSuccessfully": "ホストが正常に共有されました", - "failedToShareHost": "ホストの共有に失敗しました", - "accessRevoked": "アクセスが取り消されました", - "failedToRevokeAccess": "アクセスの取り消しに失敗しました", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "パスワード", + "authTypeKey": "SSHキー", + "authTypeCredential": "資格証明書", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "なし", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", "cancelBtn": "キャンセル", - "savingBtn": "保存中...", - "addHostBtn": "ホストを追加", - "hostUpdated": "ホストが更新されました", - "hostCreated": "ホストが作成されました", - "failedToSave": "ホストの保存に失敗しました", - "credentialUpdated": "認証情報が更新されました", - "credentialCreated": "認証情報が作成されました", - "failedToSaveCredential": "資格情報の保存に失敗しました", - "backToHosts": "ホストに戻る", - "backToCredentials": "資格情報に戻る", - "pinned": "ピン留めしました", - "noHostsFound": "ホストが見つかりません", - "tryDifferentTerm": "別の用語を試してください", - "addFirstHost": "最初のホストを追加して開始します", - "noCredentialsFound": "資格情報が見つかりません", - "addCredentialBtn": "証明書の追加", - "updateCredentialBtn": "証明書を更新", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "ピン留め", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "特徴", - "noFolder": "(フォルダがありません)", - "deleteSelected": "削除", - "exitSelection": "選択を終了", - "importSkip": "インポート (スキップが既存)", - "importOverwrite": "インポート (上書き)", - "collapseBtn": "折りたたむ", - "importExportBtn": "インポート / エクスポート", - "hostStatusesRefreshed": "ホストステータスが更新されました", - "failedToRefreshHosts": "ホストの更新に失敗しました", - "movedHostTo": "{{host}} を \"{{folder}}\" に移動しました", - "failedToMoveHost": "ホストの移動に失敗しました", - "folderRenamedTo": "フォルダの名前を \"{{name}}\" に変更しました", - "deletedFolder": "フォルダ「{{name}}」を削除しました", - "failedToDeleteFolder": "フォルダの削除に失敗しました", - "deleteAllInFolder": "\"{{name}}\" のすべてのホストを削除しますか?元に戻すことはできません。", - "deletedHost": "{{name}} を削除しました", - "copiedToClipboard": "クリップボードにコピーしました", - "terminalUrlCopied": "端末の URL がコピーされました", - "fileManagerUrlCopied": "ファイルマネージャーのURLをコピーしました", - "tunnelUrlCopied": "トンネルURLをコピーしました", - "dockerUrlCopied": "Docker URL がコピーされました", - "serverStatsUrlCopied": "サーバー統計の URL がコピーされました", - "rdpUrlCopied": "RDP URL がコピーされました", - "vncUrlCopied": "VNC URLをコピーしました", - "telnetUrlCopied": "Telnet URL をコピーしました", - "remoteDesktopUrlCopied": "リモートデスクトップの URL をコピーしました", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "キャンセル", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "状態", + "GroupByProtocol": "プロトコル", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "アクションを展開する", "collapseActions": "折りたたみアクション", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "{{name}}宛てにマジックパケットが送信されました。", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "マジックパケットの送信に失敗しました", - "cloneHostAction": "ホストを複製", - "copyAddress": "アドレスをコピー", - "copyLink": "リンクをコピー", - "copyTerminalUrlAction": "端末の URL をコピー", - "copyFileManagerUrlAction": "ファイルマネージャーの URL をコピー", - "copyTunnelUrlAction": "トンネルURLをコピー", - "copyDockerUrlAction": "Docker URL をコピー", - "copyServerStatsUrlAction": "サーバー統計の URL をコピー", - "copyRdpUrlAction": "RDP URL をコピー", - "copyVncUrlAction": "VNC URLをコピー", - "copyTelnetUrlAction": "Telnet URL をコピー", - "copyRemoteDesktopUrlAction": "リモートデスクトップの URL をコピー", - "deleteCredentialConfirm": "資格情報 \"{{name}}\" を削除しますか?", - "deletedCredential": "{{name}} を削除しました", - "deploySSHKeyTitle": "SSH キーをデプロイします", - "deployingBtn": "デプロイ中...", - "deployBtn": "デプロイ", - "failedToDeployKey": "キーのデプロイに失敗しました", - "deleteHostsConfirm": "{{count}} ホスト{{plural}}を削除しますか? この操作は元に戻せません。", - "movedToRoot": "ルートに移動しました", - "failedToMoveHosts": "ホストの移動に失敗しました", - "enableTerminalFeature": "ターミナルを有効にする", - "disableTerminalFeature": "端末を無効にする", - "enableFilesFeature": "ファイルを有効にする", - "disableFilesFeature": "ファイルを無効にする", - "enableTunnelsFeature": "トンネルを有効化", - "disableTunnelsFeature": "トンネルを無効化", - "enableDockerFeature": "Docker を有効にする", - "disableDockerFeature": "Dockerを無効にする", - "addTagsPlaceholder": "タグを追加...", - "authDetails": "認証の詳細", - "credType": "タイプ", - "generateKeyPairDesc": "新しい鍵ペアを生成すると、秘密鍵と公開鍵の両方が自動的に入力されます。", - "generatingKey": "生成中...", - "generateLabel": "{{label}} を生成", - "uploadFileBtn": "ファイルをアップロード", - "keyPassphraseOptional": "キーのパスフレーズ(オプション)", - "sshPublicKeyOptional": "SSH Public Key (省略可能)", - "publicKeyGenerated": "公開鍵が生成されました", - "failedToGeneratePublicKey": "公開鍵の派生に失敗しました", - "publicKeyCopied": "公開鍵をコピーしました", - "keyPairGenerated": "{{label}} キーのペアが生成されました", - "failedToGenerateKeyPair": "キーペアの生成に失敗しました", - "searchHostsPlaceholder": "ホスト、アドレス、タグを検索…", - "searchCredentialsPlaceholder": "検索資格情報…", - "refreshBtn": "更新", - "addTag": "タグを追加...", - "deleteConfirmBtn": "削除", - "tunnelRequirementsText": "SSH サーバーは GatewayPorts はい、 AllowTcpForwarding はい、 PermitRootLogin が /etc/ssh/sshd_config に設定されている必要があります。", - "deleteHostConfirm": "「{{name}}」を削除しますか?", - "enableAtLeastOneProtocol": "上記の少なくとも1つのプロトコルを有効にして認証と接続設定を構成します。", - "keyPassphrase": "キーのパスワード", - "connectBtn": "接続する", - "disconnectBtn": "接続を解除", - "basicInformation": "基本情報", - "authDetailsSection": "認証の詳細", - "credTypeLabel": "タイプ", - "hostsTab": "ホスト", - "credentialsTab": "資格情報", - "selectMultiple": "複数を選択", - "selectHosts": "ホストを選択", - "connectionLabel": "接続", - "authenticationLabel": "認証", - "generateKeyPairTitle": "キーペアを生成", - "generateKeyPairDescription": "新しい鍵ペアを生成すると、秘密鍵と公開鍵の両方が自動的に入力されます。", - "generateFromPrivateKey": "プライベートキーから生成", - "refreshBtn2": "更新", - "exitSelectionTitle": "選択を終了", - "exportAll": "すべてエクスポート", - "addHostBtn2": "ホストを追加", - "addCredentialBtn2": "証明書の追加", - "checkingHostStatuses": "ホストのステータスを確認しています...", - "pinnedSection": "ピン留めしました", - "hostsExported": "ホストのエクスポートに成功しました", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "ピン留め", + "hostsExported": "Hosts exported successfully", "exportFailed": "ホストのエクスポートに失敗しました", - "sampleDownloaded": "サンプルファイルをダウンロードしました", - "failedToDeleteCredential2": "資格情報の削除に失敗しました", - "noFolderOption": "(フォルダがありません)", - "nSelected": "{{count}} が選択されました", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "特徴", - "moveMenu": "移動", + "moveMenu": "動く", + "connectSelected": "Connect", "cancelSelection": "キャンセル", - "deployDialogDesc": "ホストの authorized_key に {{name}} をデプロイします。", - "targetHostLabel": "ターゲットホスト", - "selectHostOption": "ホストを選択...", - "keyDeployedSuccess": "キーが正常にデプロイされました", - "failedToDeployKey2": "キーのデプロイに失敗しました", - "deletedCount": "削除された {{count}} ホスト", - "failedToDeleteCount": "{{count}} ホストの削除に失敗しました", - "duplicatedHost": "重複 \"{{name}}\"", - "failedToDuplicateHost": "ホストの複製に失敗しました", - "updatedCount": "更新された {{count}} ホスト", - "friendlyNameLabel": "フレンドリー名", - "descriptionLabel": "説明", - "loadingHost": "ホストを読み込んでいます...", - "loadingHosts": "ホストを読み込み中...", - "loadingCredentials": "資格情報を読み込んでいます...", - "noHostsYet": "まだホストがありません", - "noHostsMatchSearch": "検索条件に一致するホストがありません", - "hostNotFound": "ホストが見つかりません", - "searchHosts": "ホストを検索...", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "ホストをソートする", "sortDefault": "デフォルトオーダー", "sortNameAsc": "名前(A~Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "トンネル", "filterFeatureDocker": "ドッカー", "filterTagsGroup": "タグ", - "shareHost": "ホストを共有", - "shareHostTitle": "シェア: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "このホストは共有を有効にするために資格情報を使用する必要があります。ホストを編集し、最初に資格情報を割り当ててください。" + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "接続", - "authentication": "認証", - "connectionSettings": "接続設定", - "displaySettings": "表示設定", - "audioSettings": "音声設定", - "rdpPerformance": "RDP パフォーマンス", - "deviceRedirection": "端末のリダイレクト", - "session": "セッション", - "gateway": "ゲートウェイ", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "資格証明書", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", "clipboard": "Clipboard", - "sessionRecording": "セッション録音", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC 設定", - "terminalSettings": "端末の設定", - "rdpPort": "RDPポート", - "username": "ユーザー名", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "パスワード", - "domain": "ドメイン", - "securityMode": "セキュリティモード", - "colorDepth": "色の深さ", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "高さ", + "height": "Height", "dpi": "DPI", - "resizeMethod": "リサイズ方法", - "clientName": "クライアント名", - "initialProgram": "初期プログラム", - "serverLayout": "サーバーレイアウト", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "ゲートウェイポート", - "gatewayUsername": "ゲートウェイユーザー名", - "gatewayPassword": "ゲートウェイパスワード", - "gatewayDomain": "ゲートウェイドメイン", - "remoteAppProgram": "RemoteApp プログラム", - "workingDirectory": "作業ディレクトリ", - "arguments": "引数", - "normalizeLineEndings": "行末を正規化", - "recordingPath": "録画パス", - "recordingName": "録音名", - "macAddress": "MACアドレス", - "broadcastAddress": "放送アドレス", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "待機時間", - "driveName": "ドライブ名", - "drivePath": "ドライブパス", - "ignoreCertificate": "証明書を無視", - "ignoreCertificateDesc": "自己署名証明書を持つホストへの接続を許可する", - "forceLossless": "無損失力", - "forceLosslessDesc": "強制ロスレス画像エンコーディング(高画質、高帯域幅)", - "disableAudio": "音声を無効にする", - "disableAudioDesc": "リモートセッションからすべてのオーディオをミュート", - "enableAudioInput": "オーディオ入力を有効にする (マイク)", - "enableAudioInputDesc": "ローカルマイクをリモートセッションに転送する", - "wallpaper": "壁紙", - "wallpaperDesc": "デスクトップの壁紙を表示 (パフォーマンスを向上させる)", - "theming": "テーマ", - "themingDesc": "視覚的なテーマとスタイルを有効にする", - "fontSmoothing": "フォントのスムージング", - "fontSmoothingDesc": "ClearTypeフォントレンダリングを有効にする", - "fullWindowDrag": "ウィンドウ全体のドラッグ", - "fullWindowDragDesc": "ドラッグ中にウィンドウの内容を表示する", - "desktopComposition": "デスクトップの構成", - "desktopCompositionDesc": "エアロガラス効果を有効にする", - "menuAnimations": "メニューアニメーション", - "menuAnimationsDesc": "メニューのフェードとスライドアニメーションを有効にする", - "disableBitmapCaching": "ビットマップキャッシュを無効にする", - "disableBitmapCachingDesc": "ビットマップキャッシュをオフにする (不具合が発生する可能性があります)", - "disableOffscreenCaching": "オフスクリーンキャッシュを無効にする", - "disableOffscreenCachingDesc": "画面キャッシュをオフにする", - "disableGlyphCaching": "グリフキャッシュを無効にする", - "disableGlyphCachingDesc": "グリフキャッシュをオフにする", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "RemoteFXグラフィックスパイプラインを使用", - "enablePrinting": "印刷を有効化", - "enablePrintingDesc": "ローカルプリンタをリモートセッションにリダイレクトする", - "enableDriveRedirection": "ドライブリダイレクトを有効にする", - "enableDriveRedirectionDesc": "リモートセッション内のドライブとしてローカルフォルダをマップ", - "createDrivePath": "ドライブパスの作成", - "createDrivePathDesc": "フォルダが存在しない場合は自動的に作成します", - "disableDownload": "ダウンロードを無効化", - "disableDownloadDesc": "リモートセッションからのファイルのダウンロードを防止", - "disableUpload": "アップロード無効", - "disableUploadDesc": "リモートセッションへのファイルのアップロードを防止", - "enableTouch": "タッチを有効化", - "enableTouchDesc": "タッチ入力の転送を有効にする", - "consoleSession": "コンソールセッション", - "consoleSessionDesc": "新しいセッションの代わりにコンソール(セッション0)に接続します", - "sendWolPacket": "WOLパケットを送信", - "sendWolPacketDesc": "接続する前にこのホストをスリープ解除するために魔法のパケットを送信する", - "disableCopy": "コピーを無効化", - "disableCopyDesc": "リモートセッションからのテキストのコピーを防止", - "disablePaste": "貼り付けを無効にする", - "disablePasteDesc": "リモートセッションにテキストを貼り付けないようにする", - "createPathIfMissing": "不足している場合にパスを作成", - "createPathIfMissingDesc": "録画ディレクトリを自動的に作成", - "excludeOutput": "アウトプットを除外", - "excludeOutputDesc": "画面出力を記録しない (メタデータのみ)", - "excludeMouse": "マウスを除外", - "excludeMouseDesc": "マウスの動きを記録しない", - "includeKeystrokes": "キーストロークを含める", - "includeKeystrokesDesc": "画面出力に加えて、RAWキーストロークを記録", - "vncPort": "VNC ポート", - "vncPassword": "VNC パスワード", - "vncUsernameOptional": "ユーザー名 (オプション)", - "vncLeaveBlank": "必要でない場合は空白のままにする", - "cursorMode": "カーソルモード", - "swapRedBlue": "赤/青の入れ替え", - "swapRedBlueDesc": "赤と青のカラーチャンネルを入れ替えます (色の問題を修正します)", - "readOnly": "読み取り専用", - "readOnlyDesc": "入力を送信せずにリモート画面を表示する", - "telnetPort": "Telnetポート", - "terminalType": "端末の種類", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "配色設定", - "backspaceKey": "バックスペースキー", - "saveHostFirst": "最初にホストを保存します。", - "sharingOptionsAfterSave": "ホストが保存されると、共有オプションが利用できます。", - "sharingLoadError": "共有データの読み込みに失敗しました。接続を確認して再度お試し下さい。", - "shareHostSection": "ホストを共有", - "shareWithUser": "ユーザーと共有", - "shareWithRole": "ロールで共有", - "selectUser": "ユーザーを選択", - "selectRole": "ロールを選択", - "selectUserOption": "ユーザーを選択...", - "selectRoleOption": "役割を選択...", - "permissionLevel": "権限レベル", - "expiresInHours": "有効期限 (時間)", - "noExpiryPlaceholder": "有効期限がない場合は空白のままにする", - "shareBtn": "共有", - "currentAccess": "現在のアクセス", - "typeHeader": "タイプ", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "アクセス許可", - "grantedByHeader": "許可された", - "expiresHeader": "期限切れ", - "noAccessEntries": "まだアクセスエントリがありません。", - "expiredLabel": "期限切れ", - "neverLabel": "一切なし", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", "cancelBtn": "キャンセル", - "savingBtn": "保存中...", - "updateHostBtn": "ホストを更新", - "addHostBtn": "ホストを追加" + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "ホスト、コマンド、設定を検索...", - "quickActions": "クイックアクション", - "hostManager": "ホスト マネージャー", - "hostManagerDesc": "ホストの管理、追加、編集", - "addNewHost": "新しいホストを追加", - "addNewHostDesc": "新しいホストを登録する", - "adminSettings": "管理者設定", - "adminSettingsDesc": "システム設定とユーザーの設定", - "userProfile": "ユーザープロフィール", - "userProfileDesc": "アカウントと設定の管理", - "addCredential": "証明書の追加", - "addCredentialDesc": "SSH キーまたはパスワードを保存", - "recentActivity": "最近のアクティビティ", - "serversAndHosts": "サーバーとホスト", - "noHostsFound": "{{search}} に一致するホストが見つかりませんでした", - "links": "リンク", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "選択", - "toggleWith": "表示/非表示" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "タブが割り当てられていません", + "noTabAssigned": "No tab assigned", "focusedPane": "アクティブペイン" }, "connections": { "noConnections": "接続なし", "noConnectionsDesc": "ターミナル、ファイルマネージャ、またはリモートデスクトップを開いて、ここに接続状況を確認してください。", - "connectedFor": "{{duration}} まで接続しました", + "connectedFor": "Connected for {{duration}}", "connected": "接続済み", "disconnected": "接続が切断されました", "closeTab": "タブを閉じる", @@ -801,358 +981,374 @@ "sectionBackground": "背景", "backgroundDesc": "セッションは切断後30分間維持され、再接続が可能です。", "persisted": "バックグラウンドで継続", - "expiresIn": "有効期限は {{duration}}です", + "expiresIn": "Expires in {{duration}}", "search": "接続を検索...", - "noSearchResults": "検索条件に一致する接続はありません" + "noSearchResults": "検索条件に一致する接続はありません", + "rename": "Rename session" }, "guacamole": { - "connecting": "{{type}} セッションに接続中...", - "connectionError": "接続エラー", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "接続に失敗しました", - "failedToConnect": "コネクショントークンの取得に失敗しました", - "hostNotFound": "ホストが見つかりません", - "noHostSelected": "ホストが選択されていません", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "再接続", - "retry": "再試行する", - "guacdUnavailable": "リモートデスクトップサービス (guacd) は利用できません。guacd が実行され、管理者の設定で正しく設定されていることを確認してください。", + "retry": "リトライ", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (LockScreen)", - "winKey": "Windowsキー", - "ctrl": "(Ctrl)", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", + "ctrl": "Ctrl", "alt": "Alt", "shift": "Shift", - "win": "勝利する", - "stickyActive": "{{key}} (ラッチされた - クリックしてリリース)", - "stickyInactive": "{{key}} (クリックでラッチ)", - "esc": "エスケープ", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "ホーム", - "end": "終了", + "home": "Home", + "end": "End", "pageUp": "Page Up", "pageDown": "Page Down", - "arrowUp": "上矢印キー", - "arrowDown": "下矢印キー", - "arrowLeft": "左矢印", - "arrowRight": "右矢印キー", - "fnToggle": "関数キー", - "reconnect": "セッションの再接続", - "collapse": "ツールバーを閉じる", - "expand": "ツールバーを展開", - "dragHandle": "ドラッグして位置を変更" + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "ホストに接続", - "clear": "クリア", - "paste": "貼り付け", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "再接続", - "connectionLost": "接続が切断されました", - "connected": "接続しました", - "clipboardWriteFailed": "クリップボードにコピーできませんでした。ページがHTTPSまたはlocalhostで配信されていることを確認してください。", - "clipboardReadFailed": "クリップボードからの読み取りに失敗しました。クリップボードのアクセス許可が付与されていることを確認してください。", - "clipboardHttpWarning": "貼り付けには HTTPS が必要です。Ctrl+Shift+V を使用するか、HTTPS 経由で Termix を提供します。", - "unknownError": "不明なエラーが発生しました", - "websocketError": "WebSocket 接続エラー", - "connecting": "接続中...", - "noHostSelected": "ホストが選択されていません", - "reconnecting": "再接続中... ({{attempt}}/{{max}})", - "reconnected": "再接続に成功しました", + "connectionLost": "Connection lost", + "connected": "接続済み", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", "tmuxSessionCreated": "tmux session created: {{name}}", "tmuxSessionAttached": "tmux session attached: {{name}}", - "tmuxUnavailable": "tmuxはリモートホストにインストールされておらず、標準シェルに戻ります", - "tmuxSessionPickerTitle": "tmuxセッション", - "tmuxSessionPickerDesc": "このホスト上に既存のtmuxセッションがあります。再アタッチまたは新しいセッションを作成する場合は1つ選択してください。", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", "tmuxWindows": "Windows", - "tmuxWindowCount": "{{count}} ウィンドウ", - "tmuxAttached": "添付されたクライアント", - "tmuxAttachedCount": "{{count}} が添付されました", - "tmuxLastActivity": "最後のアクティビティ", - "tmuxTimeJustNow": "ちょうど今", - "tmuxTimeMinutes": "{{count}}分前", - "tmuxTimeHours": "{{count}}時間前", - "tmuxTimeDays": "{{count}}日前", - "tmuxCreateNew": "新しいセッションを開始", - "tmuxCopyHint": "選択範囲を調整してEnterキーを押してクリップボードにコピー", - "tmuxDetach": "tmux セッションから切り離します", - "tmuxDetached": "tmux セッションから切り離しました", - "maxReconnectAttemptsReached": "最大再接続試行回数に達しました", - "closeTab": "閉じる", - "connectionTimeout": "接続タイムアウト", - "terminalTitle": "ターミナル - {{host}}", - "terminalWithPath": "ターミナル - {{host}}:{{path}}", - "runTitle": "実行中 {{command}} - {{host}}", - "totpRequired": "二段階認証が必要です", - "totpCodeLabel": "認証コード", - "totpVerify": "確認する", - "warpgateAuthRequired": "Warpgate認証が必要です", - "warpgateSecurityKey": "セキュリティキー", - "warpgateAuthUrl": "認証URL", - "warpgateOpenBrowser": "ブラウザで開く", - "warpgateContinue": "認証を完了しました", - "opksshAuthRequired": "OPKSSH 認証が必要です", - "opksshAuthDescription": "ブラウザで認証を完了してください。このセッションは24時間有効です。", - "opksshOpenBrowser": "ブラウザを開いて認証する", - "opksshWaitingForAuth": "ブラウザでの認証を待っています...", - "opksshAuthenticating": "認証を処理中...", - "opksshTimeout": "認証がタイムアウトしました。もう一度やり直してください。", - "opksshAuthFailed": "認証に失敗しました。資格情報を確認して、もう一度やり直してください。", - "opksshSignInWith": "{{provider}} でサインイン", - "sudoPasswordPopupTitle": "パスワードを入力してください。", - "websocketAbnormalClose": "予期せず接続が切断されました。リバースプロキシまたは SSL 設定に問題がある可能性があります。サーバログを確認してください。", - "connectionLogTitle": "接続ログ", - "connectionLogCopy": "ログをクリップボードにコピー", - "connectionLogEmpty": "接続ログはまだありません", - "connectionLogWaiting": "接続ログを待っています...", - "connectionLogCopied": "接続ログをクリップボードにコピーしました", - "connectionLogCopyFailed": "ログをクリップボードにコピーできませんでした", - "connectionRejected": "サーバーによって接続が拒否されました。認証とネットワーク設定を確認してください。", - "hostKeyRejected": "SSHホスト鍵の検証が拒否されました。接続がキャンセルされました。", - "sessionTakenOver": "セッションは別のタブで開かれました。再接続中..." + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "開ける", + "linkDialogCopy": "コピー", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "分割タブ", + "addToSplit": "分割に追加", + "removeFromSplit": "分割から削除" + } }, "fileManager": { - "noHostSelected": "ホストが選択されていません", - "initializingEditor": "エディターを初期化しています...", - "file": "ファイル", - "folder": "フォルダ", - "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": "名前の変更", - "uploading": "アップロード中...", - "uploadingFile": "{{name}} をアップロードしています...", - "fileName": "ファイル名", - "folderName": "フォルダ名", - "fileUploadedSuccessfully": "ファイル \"{{name}}\" は正常にアップロードされました", - "failedToUploadFile": "ファイルのアップロードに失敗しました", - "fileDownloadedSuccessfully": "ファイル \"{{name}}\" は正常にダウンロードされました", - "failedToDownloadFile": "ファイルのダウンロードに失敗しました", - "fileCreatedSuccessfully": "ファイル \"{{name}}\" が正常に作成されました", - "folderCreatedSuccessfully": "フォルダ \"{{name}}\" が正常に作成されました", - "failedToCreateItem": "アイテムの作成に失敗しました", - "operationFailed": "{{operation}} の操作に失敗しました {{name}}: {{error}}", - "failedToResolveSymlink": "シンボリックリンクの解決に失敗しました", - "itemsDeletedSuccessfully": "{{count}} アイテムが正常に削除されました", - "failedToDeleteItems": "アイテムの削除に失敗しました", - "sudoPasswordRequired": "管理者パスワードが必要です", - "enterSudoPassword": "この操作を続行するには、sudoパスワードを入力してください", - "sudoPassword": "Sudoのパスワード", - "sudoOperationFailed": "須藤操作に失敗しました", - "sudoAuthFailed": "Sudo認証に失敗しました", - "dragFilesToUpload": "アップロードするファイルをここにドロップ", - "emptyFolder": "このフォルダは空です", - "searchFiles": "ファイルを検索...", - "upload": "アップロード", - "selectHostToStart": "ファイル管理を開始するホストを選択してください", - "sshRequiredForFileManager": "ファイルマネージャーにはSSHが必要です。このホストはSSHを有効にしていません。", - "failedToConnect": "SSHに接続できませんでした", - "failedToLoadDirectory": "ディレクトリの読み込みに失敗しました", - "noSSHConnection": "SSH接続がありません", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "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}} を削除してもよろしいですか?", - "permissionDenied": "権限がありません", - "serverError": "サーバーエラー", - "fileSavedSuccessfully": "ファイルを正常に保存しました", - "failedToSaveFile": "ファイルの保存に失敗しました", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", - "confirmDeleteMultipleItems": "{{count}} アイテムを完全に削除してもよろしいですか?", - "confirmDeleteMultipleItemsWithFolders": "{{count}} アイテムを完全に削除してもよろしいですか?フォルダとその内容が含まれています。", - "confirmDeleteFolder": "フォルダ「{{name}}」とそのすべての内容を完全に削除してもよろしいですか?", - "permanentDeleteWarning": "この操作は元に戻せません。アイテムはサーバーから完全に削除されます。", - "recent": "最近のもの", - "pinned": "ピン留めしました", - "folderShortcuts": "フォルダのショートカット", - "failedToReconnectSSH": "SSHセッションの再接続に失敗しました", - "openTerminalHere": "ここでターミナルを開く", - "run": "実行", - "openTerminalInFolder": "このフォルダでターミナルを開く", - "openTerminalInFileLocation": "ファイルの場所でターミナルを開く", - "runningFile": "実行中 - {{file}}", - "onlyRunExecutableFiles": "実行可能ファイルのみを実行できます", - "directories": "ディレクトリ", - "removedFromRecentFiles": "最近のファイルから \"{{name}}\" を削除しました", - "removeFailed": "削除に失敗しました", - "unpinnedSuccessfully": "\"{{name}}\" のピン留めを解除しました", - "unpinFailed": "ピン留めを解除できませんでした", - "removedShortcut": "ショートカット「{{name}}」を削除しました", - "removeShortcutFailed": "ショートカットの削除に失敗しました", - "clearedAllRecentFiles": "すべての最近のファイルを消去しました", - "clearFailed": "消去に失敗しました", - "removeFromRecentFiles": "最近使ったファイルから削除", - "clearAllRecentFiles": "すべての最近のファイルをクリア", - "unpinFile": "ファイルのピン留めを解除", - "removeShortcut": "ショートカットを削除", - "pinFile": "ファイルをピン留めする", - "addToShortcuts": "ショートカットに追加", - "pasteFailed": "貼り付けに失敗しました", - "noUndoableActions": "取り消せないアクションはありません", - "undoCopySuccess": "元に戻したコピー操作: 削除された {{count}} ファイルがコピーされました", - "undoCopyFailedDelete": "元に戻すに失敗しました: コピーされたファイルを削除できませんでした", - "undoCopyFailedNoInfo": "元に戻すに失敗しました: コピーされたファイル情報が見つかりませんでした", - "undoMoveSuccess": "元に戻した移動操作: {{count}} ファイルを元の場所に戻す", - "undoMoveFailedMove": "元に戻せませんでした: ファイルを元に戻すことができませんでした", - "undoMoveFailedNoInfo": "元に戻すに失敗しました: 移動したファイル情報が見つかりませんでした", - "undoDeleteNotSupported": "削除操作を元に戻すことはできません: ファイルがサーバーから完全に削除されました", - "undoTypeNotSupported": "サポートされていない操作タイプのundo", - "undoOperationFailed": "操作の取り消しに失敗しました", - "unknownError": "不明なエラー", - "confirm": "確認する", - "find": "検索...", - "replace": "置換", - "downloadInstead": "代わりにダウンロード", - "keyboardShortcuts": "キーボードショートカット", - "searchAndReplace": "検索と置換", - "editing": "編集", - "search": "検索", - "findNext": "次を検索", - "findPrevious": "前を検索", - "save": "保存", - "selectAll": "すべて選択", - "undo": "元に戻す", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "ピン留め", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "走る", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", "redo": "Redo", - "moveLineUp": "行を上に移動", - "moveLineDown": "行を下に移動", - "toggleComment": "コメントの切り替え", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "画像の読み込みに失敗しました", - "startTyping": "入力を開始...", - "unknownSize": "不明なサイズ", - "fileIsEmpty": "ファイルが空です", - "largeFileWarning": "大きなファイルの警告", - "largeFileWarningDesc": "このファイルのサイズは {{size}} です。テキストとして開くとパフォーマンスの問題が発生する可能性があります。", - "fileNotFoundAndRemoved": "ファイル \"{{name}}\" が見つからず、最近/ピン留めされたファイルから削除されました", - "failedToLoadFile": "ファイルの読み込みに失敗しました: {{error}}", - "serverErrorOccurred": "サーバーエラーが発生しました。後でもう一度お試しください。", - "autoSaveFailed": "自動保存に失敗しました", - "fileAutoSaved": "ファイルを自動保存", - "moveFileFailed": "{{name}} の移動に失敗しました", - "moveOperationFailed": "移動に失敗しました", - "canOnlyCompareFiles": "2つのファイルのみ比較可能", - "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": "新規フォルダ", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "{{count}} アイテムを {{target}} に移動しました", - "move": "移動", - "searchInFile": "ファイル内で検索 (Ctrl+F)", - "showKeyboardShortcuts": "キーボードショートカットを表示", - "startWritingMarkdown": "マークダウンの内容を書き始めます...", - "loadingFileComparison": "ファイル比較を読み込み中...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "動く", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "比較", - "sideBySide": "並べて表示", - "inline": "インライン", - "fileComparison": "ファイル比較: {{file1}} vs {{file2}}", - "fileTooLarge": "ファイルが大きすぎます: {{error}}", - "sshConnectionFailed": "SSH接続に失敗しました。 {{name}} ({{ip}}:{{port}}) への接続を確認してください。", - "loadFileFailed": "ファイルの読み込みに失敗しました: {{error}}", - "connecting": "接続中...", - "connectedSuccessfully": "接続に成功しました", - "totpVerificationFailed": "TOTP 認証に失敗しました", - "warpgateVerificationFailed": "Warpgate認証に失敗しました", - "authenticationFailed": "認証に失敗しました", - "verificationCodePrompt": "認証コード:", - "changePermissions": "権限の変更", - "currentPermissions": "現在の権限", - "owner": "所有者", - "group": "グループ", - "others": "その他", - "read": "既読にする", - "write": "書き込み", - "execute": "実行", - "permissionsChangedSuccessfully": "権限が正常に変更されました", - "failedToChangePermissions": "権限の変更に失敗しました", - "name": "名前", - "sortByName": "名前", - "sortByDate": "変更日", - "sortBySize": "サイズ", - "ascending": "昇順", - "descending": "降順", - "root": "ルート", - "new": "新規作成", - "sortBy": "並び替え", - "items": "アイテム", - "selected": "選択済み", - "editor": "エディター", - "octal": "8 進法", - "storage": "ストレージ", - "disk": "ディスク", - "used": "使用中", - "of": "/", - "toggleSidebar": "サイドバーの切り替え", - "cannotLoadPdf": "PDFを読み込めません", - "pdfLoadError": "このPDFファイルの読み込み中にエラーが発生しました。", - "loadingPdf": "PDFを読み込んでいます...", - "loadingPage": "ページを読み込んでいます..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "ホストにコピー…", - "moveToHost": "ホストに移動…", - "copyItemsToHost": "{{count}} 個のアイテムをホスト…にコピーします。", - "moveItemsToHost": "{{count}} 個のアイテムをホスト…に移動します。", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "他に利用可能なファイルマネージャーホストはありません。", "noHostsConnectedHint": "ホストマネージャで、ファイルマネージャが有効になっている別のSSHホストを追加します。", "selectDestinationHost": "宛先ホストを選択してください", @@ -1164,48 +1360,48 @@ "browseDestination": "パスを参照または入力してください", "confirmCopy": "コピー", "confirmMove": "動く", - "transferring": "… を転送中", - "compressing": "… を圧縮中", - "extracting": "… を抽出中", - "transferringItems": "{{current}} 個の {{total}} アイテムを転送中…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "転送完了", "transferError": "転送に失敗しました", - "transferPartial": "転送は {{count}} 個のエラーで完了しました。", - "transferPartialHint": "転送できませんでした: {{paths}}", - "itemsSummary": "{{count}} アイテム", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "宛先は複数アイテム転送用のディレクトリである必要があります。", "selectThisFolder": "このフォルダーを選択してください", "browsePathWillBeCreated": "このフォルダはまだ存在しません。転送が開始されると作成されます。", "browsePathError": "宛先ホストでこのパスを開くことができませんでした。", "goUp": "上へ", - "copyFolderToHost": "フォルダをホストにコピーします…", - "moveFolderToHost": "フォルダをホストに移動…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "準備ができて", - "hostConnecting": "接続中…", + "hostConnecting": "Connecting…", "hostDisconnected": "接続されていません", "hostAuthRequired": "認証が必要です — まずこのホストでファイルマネージャを開いてください", "hostConnectionFailed": "接続に失敗しました", "metricsTitle": "転送時間", - "metricsPrepare": "宛先を準備します: {{duration}}", - "metricsCompress": "ソースで圧縮: {{duration}}", - "metricsHopSourceRead": "ソース → サーバー: {{throughput}}", - "metricsHopDestSftpWrite": "サーバー → 宛先 (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "サーバー → 宛先 (ローカル): {{throughput}}", - "metricsTransfer": "エンドツーエンド: {{throughput}} ({{duration}})", - "metricsExtract": "抽出先: {{duration}}", - "metricsSourceDelete": "ソースから削除: {{duration}}", - "metricsTotal": "合計: {{duration}}", - "progressCompressing": "ソースホスト上で圧縮中…", - "progressExtracting": "抽出先… で抽出中", - "progressTransferring": "データ転送中…", - "progressReconnecting": "再接続中…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "並行する乗り換えレーン", - "parallelSegmentsOption": "{{count}} 車線", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "大きなファイルは256MBずつに分割されます。複数のレーンはそれぞれ別の接続(複数の転送を開始するようなもの)を使用することで、全体の処理能力を高めています。", - "progressTotalSpeed": "{{speed}} 合計 ({{lanes}} 車線)", - "progressTransferringItems": "ファイル転送中({{current}} / {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} ファイル", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "ソースファイルは保持されます(部分転送)", "jumpHostLimitation": "両方のホストはTermixサーバーからアクセス可能である必要があります。ホスト間の直接ルーティングはサポートされていません。", "cancel": "キャンセル", @@ -1216,25 +1412,25 @@ "methodAutoHint": "ファイル数、サイズ、圧縮率に基づいて、tar形式またはファイル単位のSFTP形式を選択します。単一ファイルの場合は常にストリーミングSFTPを使用します。", "methodTarHint": "ソース側で圧縮し、1つのアーカイブを転送し、宛先側で展開します。両方のUnixホストにtarコマンドが必要です。", "methodItemSftpHint": "SFTP経由で各ファイルを個別に転送します。Windowsを含むすべてのホストで動作します。", - "methodPreviewLoading": "転送方法を計算中…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "転送方法をプレビューできませんでした。サーバーは起動時に転送方法を自動的に選択します。", "methodPreviewWillUseTar": "使用する形式: Tarアーカイブ", "methodPreviewWillUseItemSftp": "使用する方式: ファイル単位のSFTP", - "methodPreviewScanSummary": "{{fileCount}} ファイル、 {{totalSize}} 合計 (ソースホストでスキャン)。", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "各ファイルは、単一ファイルのコピーとして同じSFTPストリームを順番に使用します。進行状況はすべてのファイルで合算されるため、大きなファイルの場合はプログレスバーの動きが遅くなります。", "methodReason": { "user_item_sftp": "ファイル単位のSFTPを選択しました。", "user_tar": "あなたはtarアーカイブを選択しました。", "tar_unavailable": "片方または両方のホストでtarが利用できない場合は、代わりにファイル単位のSFTPが使用されます。", "windows_host": "Windowsホストが関係しており、tarコマンドは使用されていません。", - "auto_multi_large": "自動: 圧縮可能なデータを含む大きなファイル ({{largestSize}}を含む複数のファイル - tar バンドルを 1 つの転送にまとめます。", - "auto_single_large_in_archive": "自動: このセットには 1 つの大きなファイル ({{largestSize}}) が含まれています — ファイルごとの SFTP。", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "自動: ほとんどが非圧縮データ — ファイル単位のSFTP。", - "auto_many_files": "自動: 多数のファイル ({{fileCount}}) — tar はファイルごとのオーバーヘッドを削減します。", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "自動: このセットに対してファイルごとのSFTP接続を実行します。" }, "progressCancel": "キャンセル", - "progressCancelling": "… をキャンセルしています。", + "progressCancelling": "Cancelling…", "progressStalled": "停滞", "resumedHint": "別のウィンドウで開始されたアクティブな転送に再接続しました。", "transferCancelled": "転送がキャンセルされました", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "宛先に一部のデータが保存されました。接続が回復次第、再試行を再開します。" }, "tunnels": { - "noSshTunnels": "SSHトンネルがありません", - "createFirstTunnelMessage": "SSH トンネルはまだ作成されていません。ホストマネージャーでトンネル接続を設定して開始します。", - "connected": "接続しました", - "disconnected": "切断されました", - "connecting": "接続中...", - "error": "エラー", - "canceling": "キャンセル中...", - "connect": "接続する", - "disconnect": "接続を解除", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "接続済み", + "disconnected": "接続が切断されました", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", "cancel": "キャンセル", - "port": "ポート", - "localPort": "ローカルポート", - "remotePort": "リモートポート", - "currentHostPort": "現在のホスト ポート", - "endpointPort": "エンドポイントポート", - "bindIp": "ローカル IP", - "endpointSshConfig": "エンドポイントの SSH 設定", - "endpointSshHost": "エンドポイントの SSH ホスト", - "endpointSshHostPlaceholder": "設定されたホストを選択", - "endpointSshHostRequired": "各クライアント トンネルのエンドポイント SSH ホストを選択します。", - "attempt": "{{current}} の {{max}} 試行回数", - "nextRetryIn": "{{seconds}} 秒後に再度試行します。", - "clientTunnels": "クライアントトンネル", - "clientTunnel": "クライアントトンネル", - "addClientTunnel": "クライアントトンネルを追加", - "noClientTunnels": "このデスクトップにはクライアントトンネルが設定されていません。", - "tunnelName": "トンネル名", - "remoteHost": "リモートホスト", - "autoStart": "自動起動", - "clientAutoStartDesc": "このデスクトップ クライアントが開いて接続を維持したときに開始します。", - "clientManualStartDesc": "この行から開始と停止を使用します。Termixは自動的に開きません。", - "clientRemoteServerNote": "リモート転送では、エンドポイントの SSH サーバー上の AllowTcpForwarding と GatewayPorts が必要な場合があります。このデスクトップが切断されると、リモートポートが閉じます。", - "clientTunnelStarted": "クライアントトンネルを開始しました", - "clientTunnelStopped": "クライアントトンネルが停止しました", - "tunnelTestSucceeded": "トンネルテストが成功しました", - "tunnelTestFailed": "トンネルテストに失敗しました", - "localSaved": "クライアント・トンネルを保存しました", - "localSaveError": "ローカル クライアント トンネルの保存に失敗しました", - "invalidBindIp": "ローカルIPは有効なIPv4アドレスでなければなりません。", - "invalidLocalTargetIp": "ローカルターゲットIPは有効なIPv4アドレスでなければなりません。", - "invalidLocalPort": "ローカルポートは1から65535の間でなければなりません。", - "invalidRemotePort": "リモートポートは1から65535の間でなければなりません。", - "invalidLocalTargetPort": "ローカル ターゲット ポートは 1 から 65535 の範囲でなければなりません。", - "invalidEndpointPort": "エンドポイントポートは1から65535の間でなければなりません。", - "duplicateAutoStartBind": "{{bind}} を使用できるのは、自動起動クライアントトンネルが1つだけです。", - "manualControlError": "トンネル状態の更新に失敗しました。", - "active": "アクティブ", - "start": "開始", - "stop": "停止", - "test": "テスト", - "type": "トンネルタイプ", - "typeLocal": "ローカル (-L)", - "typeRemote": "リモート (-R)", - "typeDynamic": "ダイナミック (-D)", - "typeServerLocalDesc": "エンドポイントへの現在のホスト。", - "typeServerRemoteDesc": "現在のホストに戻るエンドポイント。", - "typeClientLocalDesc": "端末へのローカルコンピュータ。", - "typeClientRemoteDesc": "端末をローカルコンピュータに戻します。", - "typeClientDynamicDesc": "ローカルコンピュータ上でSOCKS。", - "typeDynamicDesc": "SOCKS5を転送 SSH経由でトラフィックを接続", - "forwardDescriptionServerLocal": "現在のホスト {{sourcePort}} → エンドポイント {{endpointPort}}。", - "forwardDescriptionServerRemote": "エンドポイント {{endpointPort}} → 現在のホスト {{sourcePort}}。", - "forwardDescriptionServerDynamic": "現在のホスト {{sourcePort}} のSOCKS。", - "forwardDescriptionClientLocal": "ローカル {{sourcePort}} → リモート {{endpointPort}}。", - "forwardDescriptionClientRemote": "リモート {{sourcePort}} → ローカル {{endpointPort}}。", - "forwardDescriptionClientDynamic": "ローカルポート {{sourcePort}}上のSOCKS。", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → {{endpoint}} 経由でSOCKS", - "autoNameClientLocal": "ローカル {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → ローカル {{localPort}}", - "autoNameClientDynamic": "{{localPort}} 経由のSOCKS {{endpoint}}", - "route": "ルート:", - "lastStarted": "最終開始", - "lastTested": "最終テスト", - "lastError": "最終エラー", - "maxRetries": "最大再試行回数", - "maxRetriesDescription": "再試行の最大回数", - "retryInterval": "再試行間隔 (秒)", - "retryIntervalDescription": "再試行まで待機する時間。", - "local": "ローカル", - "remote": "リモート", - "destination": "保存先", - "host": "ホスト", - "mode": "モード", - "noHostSelected": "ホストが選択されていません", - "working": "処理中..." + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "メモリ", - "disk": "ディスク", - "network": "ネットワーク", - "uptime": "稼働時間", - "processes": "プロセス", - "available": "利用可能です", - "free": "無料", - "connecting": "接続中...", - "connectionFailed": "サーバーへの接続に失敗しました", - "naCpus": "CPUなし", - "cpuCores_one": "{{count}} コア", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU 使用率", - "memoryUsage": "メモリ使用量", - "diskUsage": "ディスクの使用量", - "failedToFetchHostConfig": "ホスト設定の取得に失敗しました", - "serverOffline": "サーバーオフライン", - "cannotFetchMetrics": "オフラインサーバーからメトリックを取得できません", - "totpFailed": "TOTP 認証に失敗しました", - "noneAuthNotSupported": "サーバー統計は 'none' 認証タイプをサポートしていません。", - "load": "読み込み", - "systemInfo": "システム情報", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "オペレーティング システム", - "kernel": "カーネル", - "seconds": "秒", - "networkInterfaces": "ネットワークインターフェース", - "noInterfacesFound": "ネットワークインターフェースが見つかりません", - "noProcessesFound": "プロセスが見つかりません", - "loginStats": "SSHログインの統計", - "noRecentLoginData": "最近のログインデータがありません", - "executingQuickAction": "{{name}} を実行中...", - "quickActionSuccess": "{{name}} が正常に完了しました", - "quickActionFailed": "{{name}} に失敗しました", - "quickActionError": "{{name}} の実行に失敗しました", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "ポートを聴いています", - "protocol": "Protocol", - "port": "ポート", - "address": "住所", - "process": "プロセス", - "noData": "リスニングポートのデータがありません" + "title": "Listening Ports", + "protocol": "プロトコル", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "ファイアウォール", - "inactive": "非アクティブ", - "policy": "ポリシー", - "rules": "ルール", - "noData": "ファイアウォールデータがありません", - "action": "アクション", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "ポート", - "source": "ソース", - "anywhere": "どこでも" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "平均を読み込む", - "swap": "入れ替え", - "architecture": "建築", - "refresh": "更新", - "retry": "再試行する" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "リトライ", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "走る", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "セルフホスト型のSSHおよびリモートデスクトップ管理", - "loginTitle": "Termixにログイン", - "registerTitle": "アカウントを作成", - "forgotPassword": "パスワードをお忘れですか?", - "rememberMe": "30日間デバイスを記憶(TOTPを含む)", - "noAccount": "アカウントをお持ちでないですか?", - "hasAccount": "既にアカウントをお持ちですか?", - "twoFactorAuth": "2要素認証", - "enterCode": "認証コードを入力してください", - "backupCode": "またはバックアップコードを使用", - "verifyCode": "コードを確認", - "redirectingToApp": "アプリにリダイレクトしています...", - "sshAuthenticationRequired": "SSH 認証が必要です", - "sshNoKeyboardInteractive": "キーボード対話型認証が利用できません", - "sshAuthenticationFailed": "認証に失敗しました", - "sshAuthenticationTimeout": "認証のタイムアウト", - "sshNoKeyboardInteractiveDescription": "サーバーはキーボード対話認証をサポートしていません。パスワードまたはSSHキーを入力してください。", - "sshAuthFailedDescription": "指定された資格情報が正しくありません。有効な資格情報でもう一度お試しください。", - "sshTimeoutDescription": "認証試行がタイムアウトしました。もう一度やり直してください。", - "sshProvideCredentialsDescription": "このサーバーに接続するためにSSH認証情報を入力してください。", - "sshPasswordDescription": "SSH接続のパスワードを入力してください。", - "sshKeyPasswordDescription": "SSHキーが暗号化されている場合は、ここにパスフレーズを入力してください。", - "passphraseRequired": "パスフレーズが必要です", - "passphraseRequiredDescription": "SSHキーは暗号化されています。パスワードを入力してロックを解除してください。", - "back": "戻る", - "firstUser": "最初のユーザー", - "firstUserMessage": "あなたは初めてのユーザーであり、管理者になります。サイドバーのユーザードロップダウンから管理者の設定を確認できます。 これが間違いだと思われる場合は、docker logsを確認するか、GitHubのissueを作成してください。", - "external": "外部", - "loginWithExternal": "外部プロバイダーでログイン", - "loginWithExternalDesc": "設定された外部 ID プロバイダを使用してログイン", - "externalNotSupportedInElectron": "外部認証はまだ Electron アプリではサポートされていません。OIDC ログイン用のウェブバージョンを使用してください。", - "resetPasswordButton": "パスワードのリセット", - "sendResetCode": "リセットコードを送信", - "resetCodeDesc": "パスワードリセットコードを受け取るためにユーザー名を入力してください。コードはdockerコンテナログに記録されます。", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "コードを確認", - "enterResetCode": "ユーザーのdockerコンテナログから6桁のコードを入力してください:", - "newPassword": "新しいパスワード", - "confirmNewPassword": "パスワードの確認", - "enterNewPassword": "ユーザーの新しいパスワードを入力してください:", - "signUp": "新規登録", - "desktopApp": "デスクトップアプリ", - "loggingInToDesktopApp": "デスクトップアプリにログイン中", - "loadingServer": "サーバーを読み込み中...", - "dataLossWarning": "この方法でパスワードをリセットすると、保存した SSH ホスト、資格情報、およびその他の暗号化されたデータがすべて削除されます。 この操作は元に戻せません。パスワードを忘れてログインしていない場合にのみ使用してください。", - "authenticationDisabled": "認証が無効です", - "authenticationDisabledDesc": "すべての認証方法は現在無効です。管理者に問い合わせてください。", - "attemptsRemaining": "{{count}} 回の試行が残っています" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSHホストキーを確認", - "keyChangedWarning": "SSH ホストキーが変更されました", - "firstConnectionTitle": "初めてこのホストに接続しました", - "firstConnectionDescription": "このホストの信頼性を確立できません。指紋が期待されているものと一致することを確認してください。", - "keyChangedDescription": "このサーバーのホストキーは、最後の接続から変更されました。これはセキュリティ上の問題を示している可能性があります。", - "previousKey": "前のキー", - "newFingerprint": "新しいフィンガープリント", - "fingerprint": "フィンガープリント", - "verifyInstructions": "このホストを信頼している場合は、format@@0をクリックして続行し、今後の接続のためにこの指紋を保存します。", - "securityWarning": "セキュリティ警告", - "acceptAndContinue": "承認して続ける", - "acceptNewKey": "新しいキーを承認して続ける" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "データベースに接続できませんでした", - "unknownError": "不明なエラー", - "loginFailed": "ログインに失敗しました", - "failedPasswordReset": "パスワードのリセットに失敗しました", - "failedVerifyCode": "リセットコードの確認に失敗しました", - "failedCompleteReset": "パスワードのリセットに失敗しました", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "OIDCログインの開始に失敗しました", - "silentSigninOidcUnavailable": "サイレントサインインが要求されましたが、OIDCのログインはできません。", - "failedUserInfo": "ログイン後のユーザー情報の取得に失敗しました", - "oidcAuthFailed": "OIDC認証に失敗しました", - "invalidAuthUrl": "バックエンドから受信した認証URLが無効です", - "requiredField": "このフィールドは必須項目です", - "minLength": "最小の長さは {{min}}です", - "passwordMismatch": "パスワードが一致しません", - "passwordLoginDisabled": "ユーザー名/パスワードのログインは現在無効です", - "sessionExpired": "セッションの有効期限が切れました。もう一度ログインしてください", - "totpRateLimited": "レート制限: TOTP 認証の試行回数が多すぎます。後でもう一度お試しください。", - "totpRateLimitedWithTime": "レート制限: TOTP 認証の試行回数が多すぎます。もう一度試す前に {{time}} 秒お待ちください。", - "resetCodeRateLimited": "レート制限: 確認の試行回数が多すぎます。後でもう一度お試しください。", - "resetCodeRateLimitedWithTime": "レート制限: 確認の試行回数が多すぎます。 {{time}} 秒後に再試行してください。", - "authTokenSaveFailed": "認証トークンの保存に失敗しました", - "failedToLoadServer": "サーバーの読み込みに失敗しました" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "新しいアカウントの登録は現在管理者によって無効になっています。ログインするか、管理者に連絡してください。", - "userNotAllowed": "あなたのアカウントは登録する権限がありません。管理者に連絡してください。", - "databaseConnectionFailed": "データベースサーバーへの接続に失敗しました", - "resetCodeSent": "Dockerログに送信されたコードをリセット", - "codeVerified": "コードが正常に検証されました", - "passwordResetSuccess": "パスワードのリセットに成功しました", - "loginSuccess": "ログイン成功", - "registrationSuccess": "登録が完了しました" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "設定されたSSHホストを対象としたローカルデスクトップトンネル。", - "c2sTunnelPresets": "クライアントのトンネルプリセット", - "c2sTunnelPresetsDesc": "このデスクトップ クライアントのローカル トンネル リストを名前付きサーバー プリセットとして保存するか、このクライアントにプリセットをロードします。", - "c2sTunnelPresetsUnavailable": "クライアントトンネルプリセットはデスクトップクライアントでのみ使用できます。", - "c2sPresetName": "プリセット名", - "c2sPresetNamePlaceholder": "クライアントプリセット名", - "c2sPresetToLoad": "プリセットをロードする", - "c2sNoPresetSelected": "プリセットが選択されていません", - "c2sNoPresets": "プリセットは保存されていません", - "c2sLoadPreset": "読み込み", - "c2sCurrentLocalConfig": "{{count}} ローカルクライアントトンネルがこのデスクトップに設定されています。", - "c2sPresetSyncNote": "プリセットは明示的なスナップショットです。読み込むと、このデスクトップクライアントのローカルクライアントトンネルリストが置き換えられます。", - "c2sPresetSaved": "クライアントトンネルプリセットが保存されました", - "c2sPresetLoaded": "クライアントトンネルプリセットがローカルに読み込まれました", - "c2sPresetRenamed": "クライアントトンネルプリセットの名前を変更しました", - "c2sPresetDeleted": "クライアントトンネルプリセットが削除されました", - "c2sPresetLoadError": "クライアントトンネルプリセットの読み込みに失敗しました" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "言語", - "keyPassword": "キーパスワード", - "pastePrivateKey": "秘密鍵をここに貼り付けてください", - "localListenerHost": "127.0.0.1 (ローカルで聴く)", - "localTargetHost": "127.0.0.1 (このコンピュータのターゲット)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "パスワードを入力してください", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "ダッシュボード", - "loading": "ダッシュボードの読み込み中...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "サポート", + "support": "Support", "discord": "Discord", - "serverOverview": "サーバーの概要", - "version": "バージョン", - "upToDate": "日付まで", - "updateAvailable": "アップデートがあります", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "稼働時間", - "database": "データベース", - "healthy": "健康的", - "error": "エラー", - "totalHosts": "ホストの合計", - "totalTunnels": "合計トンネル", - "totalCredentials": "合計資格情報", - "recentActivity": "最近のアクティビティ", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "最近のアクティビティを読み込んでいます...", - "noRecentActivity": "最近のアクティビティはありません", - "quickActions": "クイックアクション", - "addHost": "ホストを追加", - "addCredential": "証明書の追加", - "adminSettings": "管理者設定", - "userProfile": "ユーザープロフィール", - "serverStats": "サーバーの統計", - "loadingServerStats": "サーバーの統計を読み込んでいます...", - "noServerData": "利用可能なサーバーデータがありません", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "ダッシュボードをカスタマイズ", - "dashboardSettings": "ダッシュボードの設定", - "enableDisableCards": "カードを有効/無効にする", - "resetLayout": "デフォルトにリセット", - "serverOverviewCard": "サーバーの概要", - "recentActivityCard": "最近のアクティビティ", - "networkGraphCard": "ネットワークグラフ", - "networkGraph": "ネットワークグラフ", - "quickActionsCard": "クイックアクション", - "serverStatsCard": "サーバーの統計", - "panelMain": "メイン", - "panelSide": "サイド", - "justNow": "ちょうど今" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "安定版", - "hostsOnline": "ホストオンライン", - "activeTunnels": "有効なトンネル", - "registerNewServer": "新しいサーバーを登録する", - "storeSshKeysOrPasswords": "SSH キーまたはパスワードを保存", - "manageUsersAndRoles": "ユーザーとロールの管理", - "manageYourAccount": "アカウントを管理する", - "hostStatus": "ホストステータス", - "noHostsConfigured": "ホストが設定されていません", - "online": "オンライン", - "offline": "オフライン", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", "onlineLower": "オンライン", "nodes": "{{count}} nodes", - "add": "追加:", - "commandPalette": "コマンドパレット", - "done": "完了", - "editModeInstructions": "並び替えるためにカードをドラッグ・カラム仕切りをドラッグして列のサイズを変更・高さを変更するためにカードの下端をドラッグ・削除するためにゴミ箱を削除する", - "empty": "なし", - "clear": "クリア" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "コピー", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "ホストを追加", - "addGroup": "グループを追加", - "addLink": "リンクを追加", - "zoomIn": "拡大", - "zoomOut": "ズームアウト", - "resetView": "表示をリセット", - "selectHost": "ホストを選択", - "chooseHost": "ホストを選択してください...", - "parentGroup": "親グループ", - "noGroup": "グループなし", - "groupName": "グループ名", - "color": "色", - "source": "ソース", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "グループに移動", - "selectGroup": "グループを選択...", - "addConnection": "コネクションを追加", - "hostDetails": "ホストの詳細", - "removeFromGroup": "グループから削除", - "addHostHere": "ここにホストを追加", - "editGroup": "グループを編集", - "delete": "削除", - "add": "追加", - "create": "作成", - "move": "移動", - "connect": "接続する", - "createGroup": "グループを作成", - "selectSourcePlaceholder": "ソースを選択...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "動く", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "無効なファイル", - "hostAlreadyExists": "ホストはすでにトポロジ内にあります", - "connectionExists": "接続は既に存在します", - "unknown": "不明", - "name": "名前", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "ステータス", - "failedToAddNode": "ノードの追加に失敗しました", - "sourceDifferentFromTarget": "ソースとターゲットが異なる必要があります", - "exportJSON": "JSONをエクスポート", - "importJSON": "JSON をインポート", + "status": "状態", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "ターミナル", "fileManager": "ファイルマネージャー", "tunnel": "トンネル", - "docker": "Docker", - "serverStats": "サーバーの統計", - "noNodes": "ノードはまだありません" + "docker": "ドッカー", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Dockerはこのホストで有効になっていません", - "validating": "Dockerを検証中...", - "connecting": "接続中...", - "error": "エラー", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Dockerへの接続に失敗しました", - "containerStarted": "コンテナ {{name}} 開始", - "failedToStartContainer": "コンテナ {{name}}の開始に失敗しました", - "containerStopped": "コンテナ {{name}} が停止しました", - "failedToStopContainer": "コンテナ {{name}}の停止に失敗しました", - "containerRestarted": "コンテナ {{name}} が再起動しました", - "failedToRestartContainer": "コンテナ {{name}} の再起動に失敗しました", - "containerPaused": "コンテナ {{name}} は一時停止しました", - "containerUnpaused": "コンテナ {{name}} の一時停止が解除されました", - "failedToTogglePauseContainer": "コンテナ {{name}}の一時停止状態の切り替えに失敗しました", - "containerRemoved": "コンテナ {{name}} が削除されました", - "failedToRemoveContainer": "コンテナ {{name}}の削除に失敗しました", - "image": "画像", - "ports": "ポート", - "noPorts": "ポートがありません", - "start": "開始", - "confirmRemoveContainer": "コンテナ '{{name}}'を削除してもよろしいですか? この操作は元に戻せません。", - "runningContainerWarning": "警告: このコンテナは現在実行中です。削除するとコンテナが最初に停止します。", - "loadingContainers": "コンテナを読み込み中...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker Manager", - "autoRefresh": "自動更新", - "timestamps": "タイムスタンプ", - "lines": "行", - "filterLogs": "ログのフィルタリング...", - "refresh": "更新", - "download": "ダウンロード", - "clear": "クリア", - "logsDownloaded": "ログのダウンロードに成功しました", - "last50": "過去 50", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", "last100": "Last 100", - "last500": "直近500", - "last1000": "過去 1000 個", - "allLogs": "すべてのログ", - "noLogsMatching": "\"{{query}}\" に一致するログはありません", - "noLogsAvailable": "利用可能なログがありません", - "noContainersFound": "コンテナが見つかりません", - "noContainersFoundHint": "このホストではDockerコンテナは利用できません", - "searchPlaceholder": "コンテナを検索...", - "allStatuses": "すべてのステータス", - "stateRunning": "実行中", - "statePaused": "一時停止", - "stateExited": "終了", - "stateRestarting": "再起動中", - "noContainersMatchFilters": "フィルターに一致するコンテナはありません", - "noContainersMatchFiltersHint": "検索条件またはフィルター条件を調整してみてください", - "failedToFetchStats": "コンテナの統計情報の取得に失敗しました", - "containerNotRunning": "コンテナが実行されていません", - "startContainerToViewStats": "統計情報を表示するためにコンテナを起動します", - "loadingStats": "統計情報を読み込み中...", - "errorLoadingStats": "統計情報の読み込みに失敗しました", - "noStatsAvailable": "利用可能な統計情報がありません", - "cpuUsage": "CPU 使用率", - "current": "現在", - "memoryUsage": "メモリ使用量", - "networkIo": "ネットワーク I/O", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "出力", - "blockIo": "ブロックI/O", - "read": "既読にする", - "write": "書き込み", - "pids": "PID", - "containerInformation": "コンテナ情報", - "name": "名前", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "都道府県:", - "containerMustBeRunning": "コンソールにアクセスするにはコンテナが実行されている必要があります", - "verificationCodePrompt": "認証コードを入力してください", - "totpVerificationFailed": "TOTP 認証に失敗しました。もう一度やり直してください。", - "warpgateVerificationFailed": "Warpgate認証に失敗しました。もう一度やり直してください。", - "connectedTo": "{{containerName}} に接続しました", - "disconnected": "切断されました", - "consoleError": "コンソールエラー", - "errorMessage": "エラー: {{message}}", - "failedToConnect": "コンテナに接続できませんでした", - "console": "コンソール", - "selectShell": "シェルを選択", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "接続が切断されました", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", "ash": "ash", - "connect": "接続する", - "disconnect": "接続を解除", - "notConnected": "接続していません", - "clickToConnect": "シェルセッションを開始するには接続をクリックしてください", - "connectingTo": "{{containerName}} に接続中...", - "containerNotFound": "コンテナが見つかりません", - "backToList": "リストに戻る", - "logs": "ログ", - "stats": "統計", - "consoleTab": "コンソール", - "startContainerToAccess": "コンソールにアクセスするためにコンテナを起動します" + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "接続されていません", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "全般", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "ユーザー", - "sectionSessions": "セッション", - "sectionRoles": "ロール", - "sectionDatabase": "データベース", - "sectionApiKeys": "API キー", - "allowRegistration": "ユーザー登録を許可する", - "allowRegistrationDesc": "新規ユーザーに自己登録を許可する", - "allowPasswordLogin": "パスワードログインを許可する", - "allowPasswordLoginDesc": "ユーザー名/パスワードログイン", - "oidcAutoProvision": "OIDC 自動提供", - "oidcAutoProvisionDesc": "登録が無効な場合でも、OIDCユーザーのアカウントを自動作成する", - "allowPasswordReset": "パスワードのリセットを許可", - "allowPasswordResetDesc": "Docker ログ経由でコードをリセット", - "sessionTimeout": "セッションタイムアウト", - "hours": "時間", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "フィルターをクリア", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "状態", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "モニタリングのデフォルト", - "statusCheck": "状態チェック", - "metrics": "メトリック", - "sec": "秒", - "logLevel": "ログレベル", - "enableGuacamole": "Guacamoleを有効にする", - "enableGuacamoleDesc": "RDP/VNC リモートデスクトップ", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "SSO 用の OpenID 接続を構成します。* とマークされたフィールドは必須です。", - "oidcClientId": "クライアント ID", - "oidcClientSecret": "クライアントシークレット", - "oidcAuthUrl": "認証URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", "oidcIssuerUrl": "Issuer URL", - "oidcTokenUrl": "トークンURL", - "oidcUserIdentifier": "ユーザー識別子パス", - "oidcDisplayName": "表示名パス", - "oidcScopes": "スコープ", - "oidcUserinfoUrl": "ユーザー情報 URL を上書きする", - "oidcAllowedUsers": "許可されたユーザー", - "oidcAllowedUsersDesc": "1行あたり1つのメールアドレスです。すべて許可するには空のままにしてください。", - "removeOidc": "削除", - "usersCount": "{{count}} ユーザー", - "createUser": "作成", - "newRole": "新しいロール", - "roleName": "名前", - "roleDisplayName": "表示名", - "roleDescription": "説明", - "rolesCount": "{{count}} ロール", - "createRole": "作成", - "creating": "作成中...", - "exportDatabase": "データベースをエクスポート", - "exportDatabaseDesc": "すべてのホスト、資格情報、設定のバックアップをダウンロードする", - "export": "エクスポート", - "exporting": "エクスポート中...", - "importDatabase": "データベースをインポート", - "importDatabaseDesc": ".sqliteバックアップファイルから復元", - "importDatabaseSelected": "選択済: {{name}}", - "selectFile": "ファイルを選択", - "changeFile": "変更", - "import": "インポート", - "importing": "インポート中...", - "apiKeysCount": "{{count}} キー", - "newApiKey": "新しいAPIキー", - "apiKeyCreatedWarning": "キーが作成されました - 今すぐコピーしてください。再び表示されません。", - "apiKeyName": "名前", - "apiKeyUser": "ユーザー", - "apiKeySelectUser": "ユーザーを選択...", - "apiKeyExpiresAt": "有効期限", - "createKey": "キーを作成", - "apiKeyNoExpiry": "有効期限なし", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "取り除く", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "デュアル認証", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "ローカル", - "adminStatusAdministrator": "管理者", - "adminStatusRegularUser": "レギュラーユーザー", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", - "systemBadge": "SYSの", - "customBadge": "カスタム", - "youBadge": "あなた", - "sessionsActive": "{{count}} 有効", - "sessionActive": "アクティブ: {{time}}", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "すべて", - "revokeAllSessionsSuccess": "ユーザーのすべてのセッションが取り消されました", - "revokeAllSessionsFailed": "セッションの取り消しに失敗しました", - "revokeSessionFailed": "セッションの取り消しに失敗しました", - "addRole": "役割を追加", - "noCustomRoles": "カスタムロールが定義されていません", - "removeRoleFailed": "ロールの削除に失敗しました", - "assignRoleFailed": "ロールの割り当てに失敗しました", - "deleteRoleFailed": "ロールの削除に失敗しました", - "userAdminAccess": "管理者", - "userAdminAccessDesc": "すべての管理者設定へのフルアクセス", - "userRoles": "ロール", - "revokeAllUserSessions": "すべてのセッションを取り消す", - "revokeAllUserSessionsDesc": "すべてのデバイスで強制的に再ログインする", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "この利用者を削除することは永久です。", - "deleteUser": "{{username}} を削除", - "deleting": "削除中...", - "deleteUserFailed": "ユーザーの削除に失敗しました", - "deleteUserSuccess": "ユーザー \"{{username}}\" が削除されました", - "deleteRoleSuccess": "ロール \"{{name}}\" が削除されました", - "revokeKeySuccess": "キー \"{{name}}\" が取り消されました", - "revokeKeyFailed": "キーの取り消しに失敗しました", - "copiedToClipboard": "クリップボードにコピーしました", - "done": "完了", - "createUserTitle": "ユーザーを作成", - "createUserDesc": "新しいローカルアカウントを作成します。", - "createUserUsername": "ユーザー名", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "パスワード", - "createUserPasswordHint": "最低6文字です。", - "createUserEnterUsername": "ユーザー名を入力してください", - "createUserEnterPassword": "パスワードを入力", - "createUserSubmit": "ユーザーを作成", - "editUserTitle": "ユーザーを管理: {{username}}", - "editUserDesc": "ロール、管理者ステータス、セッション、アカウント設定を編集します。", - "editUserUsername": "ユーザー名", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", "editUserAuthType": "認証タイプ", - "editUserAdminStatus": "管理者ステータス", - "editUserUserId": "ユーザー ID", - "linkAccountTitle": "OIDCをパスワードアカウントにリンクする", - "linkAccountDesc": "OIDC アカウント {{username}} と既存のローカル アカウントをマージします。", - "linkAccountWarningTitle": "次の操作を行います:", - "linkAccountEffect1": "OIDC専用アカウントを削除する", - "linkAccountEffect2": "ターゲットアカウントにOIDCログインを追加", - "linkAccountEffect3": "OIDCとパスワードの両方のログインを許可する", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "リンクするローカルアカウントのユーザー名を入力してください", - "linkAccounts": "アカウントをリンク", - "linkAccountSuccess": "「{{username}}」にリンクされたOIDCアカウント", - "linkAccountFailed": "OIDCアカウントのリンクに失敗しました", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "リンク中...", - "saving": "保存中...", - "updateRegistrationFailed": "登録設定の更新に失敗しました", - "updatePasswordLoginFailed": "パスワードのログイン設定を更新できませんでした", - "updateOidcAutoProvisionFailed": "OIDC 自動プロビジョニング設定を更新できませんでした。", - "updatePasswordResetFailed": "パスワードリセット設定の更新に失敗しました", - "sessionTimeoutRange2": "セッションのタイムアウトは1〜720時間の間でなければなりません", - "sessionTimeoutSaved": "セッションタイムアウトを保存しました", - "sessionTimeoutSaveFailed": "セッションのタイムアウトを保存できませんでした", - "monitoringIntervalInvalid": "間隔の値が無効です", - "monitoringSaved": "モニタリング設定が保存されました", - "monitoringSaveFailed": "監視設定の保存に失敗しました", - "guacamoleSaved": "Guacamoleの設定を保存しました", - "guacamoleSaveFailed": "Guacamole設定の保存に失敗しました", - "guacamoleUpdateFailed": "Guacamoleの設定を更新できませんでした", - "logLevelUpdateFailed": "ログレベルの更新に失敗しました", - "oidcSaved": "OIDC設定を保存しました", - "oidcSaveFailed": "OIDC設定の保存に失敗しました", - "oidcRemoved": "OIDC設定が削除されました", - "oidcRemoveFailed": "OIDC設定の削除に失敗しました", - "createUserRequired": "ユーザー名とパスワードが必要です", - "createUserPasswordTooShort": "パスワードは6文字以上でなければなりません", - "createUserSuccess": "ユーザー \"{{username}}\" が作成されました", - "createUserFailed": "ユーザーの作成に失敗しました", - "updateAdminStatusFailed": "管理者ステータスの更新に失敗しました", - "allSessionsRevoked": "すべてのセッションが取り消されました", - "revokeSessionsFailed": "セッションの取り消しに失敗しました", - "createRoleRequired": "名前と表示名が必要です", - "createRoleSuccess": "ロール \"{{name}}\" が作成されました", - "createRoleFailed": "ロールの作成に失敗しました", - "apiKeyNameRequired": "キー名が必要です", - "apiKeyUserRequired": "ユーザー ID が必要です", - "apiKeyCreatedSuccess": "API キー \"{{name}}\" が作成されました", - "apiKeyCreateFailed": "API キーの作成に失敗しました", - "exportSuccess": "データベースのエクスポートに成功しました", - "exportFailed": "データベースのエクスポートに失敗しました", - "importSelectFile": "最初にファイルを選択してください", - "importCompleted": "インポートが完了しました: {{total}} アイテムがインポートされ、 {{skipped}} がスキップされました", - "importFailed": "インポートに失敗しました: {{error}}", - "importError": "データベースのインポートに失敗しました" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "ターミナル", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "ホスト", - "hostPlaceholder": "192.168.1.1またはexample.com", - "portLabel": "ポート", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "ユーザー名", - "usernamePlaceholder": "ユーザー名", - "authLabel": "認証", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "パスワード", - "passwordPlaceholder": "パスワード", - "privateKeyLabel": "プライベートキー", - "privateKeyPlaceholder": "秘密キーを貼り付け...", - "credentialLabel": "資格情報", - "credentialPlaceholder": "保存された資格情報を選択", - "connectToTerminal": "ターミナルに接続", - "connectToFiles": "ファイルに接続" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "資格証明書", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "端末が選択されていません", - "noTerminalSelectedHint": "SSH ターミナルタブを開いてコマンド履歴を表示します", - "searchPlaceholder": "履歴を検索...", - "clearAll": "すべてクリア", - "noHistoryEntries": "履歴エントリがありません", - "trackingDisabled": "履歴の追跡は無効です", - "trackingDisabledHint": "コマンドを記録するには、プロファイル設定で有効にしてください。" + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "キー録音", - "recordToTerminals": "端末に記録", - "selectAll": "すべて", + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", "selectNone": "なし", - "noTerminalTabsOpen": "ターミナルタブが開いていません", - "selectTerminalsAbove": "上の端末を選択", - "broadcastInputPlaceholder": "キーストロークをブロードキャストするにはここに入力してください...", - "stopRecording": "録画を停止", - "startRecording": "録画開始", - "settingsTitle": "設定", - "enableRightClickCopyPaste": "右クリックでコピー/貼り付け" + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "レイアウト", - "selectLayoutAbove": "上のレイアウトを選択してください", - "selectLayoutHint": "表示するペインの数を選択", - "panesTitle": "ペイン", - "openTabsTitle": "タブを開く", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "タブを上のペインにドラッグするか、クイック割り当てを使用してください。", - "dropHere": "ここにドロップ", - "emptyPane": "なし", - "dashboard": "ダッシュボード", - "clearSplitScreen": "分割画面をクリア", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "クイック割り当て", - "alreadyAssigned": "ペイン {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "分割タブ", "addToSplit": "分割に追加", "removeFromSplit": "分割から削除", - "assignToPane": "ペインに割り当てる" + "assignToPane": "ペインに割り当てる", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "スニペットを作成", - "createSnippetDescription": "クイック実行のための新しいコマンドスニペットを作成します", - "nameLabel": "名前", - "namePlaceholder": "例えば、Nginx を再起動", - "descriptionLabel": "説明", - "descriptionPlaceholder": "オプションの説明", - "optional": "省略可能", - "folderLabel": "フォルダ", - "noFolder": "フォルダがありません(未分類)", - "commandLabel": "(Command)", - "commandPlaceholder": "例えば、sudo systemctl restart nginx", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", "cancel": "キャンセル", - "createSnippetButton": "スニペットを作成", - "createFolderTitle": "フォルダを作成", - "createFolderDescription": "スニペットをフォルダーに整理する", - "folderNameLabel": "フォルダ名", - "folderNamePlaceholder": "例:システムコマンド、Docker スクリプト", - "folderColorLabel": "フォルダの色", - "folderIconLabel": "フォルダアイコン", - "previewLabel": "プレビュー", - "folderNameFallback": "フォルダ名", - "createFolderButton": "フォルダを作成", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "すべて", + "selectAll": "All", "selectNone": "なし", - "noTerminalTabsOpen": "ターミナルタブが開いていません", - "searchPlaceholder": "スニペットを検索...", - "newSnippet": "スニペットを新規作成", - "newFolder": "新規フォルダ", - "run": "実行", - "noSnippetsInFolder": "このフォルダにスニペットがありません", - "uncategorized": "未分類", - "editSnippetTitle": "スニペットを編集", - "editSnippetDescription": "このコマンドスニペットを更新", - "saveSnippetButton": "変更を保存", - "createSuccess": "スニペットの作成に成功しました", - "createFailed": "スニペットの作成に失敗しました", - "updateSuccess": "スニペットが正常に更新されました", - "updateFailed": "スニペットの更新に失敗しました", - "deleteFailed": "スニペットの削除に失敗しました", - "folderCreateSuccess": "フォルダが正常に作成されました", - "folderCreateFailed": "フォルダの作成に失敗しました", - "editFolderTitle": "フォルダを編集", - "editFolderDescription": "このフォルダの外観を変更または名前を変更します", - "saveFolderButton": "変更を保存", - "editFolder": "フォルダを編集", - "deleteFolder": "フォルダを削除", - "folderDeleteSuccess": "フォルダ \"{{name}}\" が削除されました", - "folderDeleteFailed": "フォルダの削除に失敗しました", - "folderEditSuccess": "フォルダが正常に更新されました", - "folderEditFailed": "フォルダの更新に失敗しました", - "confirmRunMessage": "「{{name}}」を実行しますか?", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "走る", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "走る", - "runSuccess": "{{name}}ターミナルで \" {{count}} \" を実行しました", - "copySuccess": "\"{{name}}\"をクリップボードにコピーしました", - "shareTitle": "スニペットを共有", - "shareUser": "ユーザー", - "shareRole": "ロール", - "selectUser": "ユーザーを選択...", - "selectRole": "役割を選択...", - "shareSuccess": "スニペットの共有に成功しました", - "shareFailed": "スニペットを共有できませんでした", - "revokeSuccess": "アクセスが取り消されました", - "revokeFailed": "アクセスの取り消しに失敗しました", - "currentAccess": "現在のアクセス", - "shareLoadError": "共有データの読み込みに失敗しました", - "loading": "読み込み中...", - "close": "閉じる", - "reorderFailed": "スニペットの順序を保存できませんでした" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "スニペットの順序を保存できませんでした", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "アカウント", - "sectionAppearance": "外観", - "sectionSecurity": "セキュリティ", - "sectionApiKeys": "API キー", - "sectionC2sTunnels": "C2S トンネル", - "usernameLabel": "ユーザー名", - "roleLabel": "ロール", - "roleAdministrator": "管理者", - "authMethodLabel": "認証方法", - "authMethodLocal": "ローカル", - "twoFaLabel": "二段階認証(2FA)", - "twoFaOn": "オン", - "twoFaOff": "オフ", - "versionLabel": "バージョン", - "deleteAccount": "アカウントを削除", - "deleteAccountDescription": "アカウントを完全に削除する", - "deleteButton": "削除", - "deleteAccountPermanent": "この操作は永久的で、元に戻すことはできません。", - "deleteAccountWarning": "すべてのセッション、ホスト、資格情報、および設定は完全に削除されます。", - "confirmPasswordDeletePlaceholder": "パスワードを入力して確認してください", - "languageLabel": "言語", - "themeLabel": "テーマ", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "アクセントカラー", + "accentColorLabel": "Accent Color", "settingsTerminal": "ターミナル", - "commandAutocomplete": "コマンドオートコンプリート", - "commandAutocompleteDesc": "入力中にオートコンプリートを表示", - "historyTracking": "履歴の追跡", - "historyTrackingDesc": "端末のコマンドを追跡する", - "syntaxHighlighting": "構文のハイライト", - "syntaxHighlightingDesc": "端末の出力を強調表示する", - "commandPalette": "コマンドパレット", - "commandPaletteDesc": "キーボードショートカットを有効にする", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "ログイン時にタブを再度開く", "reopenTabsOnLoginDesc": "別のデバイスからログインしたりページを更新したりしても、開いているタブを復元します。", - "confirmTabClose": "タブを閉じる", - "confirmTabCloseDesc": "ターミナルタブを閉じる前に確認する", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "ホストタグの表示", - "showHostTagsDesc": "ホストリストにタグを表示する", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "ホストアクションを展開するにはクリックしてください", "hostTrayOnClickDesc": "接続ボタンを常に表示する。管理オプションを展開するには、マウスオーバーではなくクリックする。", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "左サイドバーのアプリレールを、マウスオーバー時ではなく常に展開した状態にする。", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", "settingsSnippets": "Snippets", - "foldersCollapsed": "折りたたまれたフォルダ", - "foldersCollapsedDesc": "デフォルトでフォルダを閉じる", - "confirmExecution": "実行を確認", - "confirmExecutionDesc": "スニペットを実行する前に確認", - "settingsUpdates": "更新", - "disableUpdateChecks": "更新チェックを無効にする", - "disableUpdateChecksDesc": "更新の確認を停止する", - "totpAuthenticator": "TOTP 認証システム", - "totpEnabled": "二段階認証は有効です", - "totpDisabled": "追加のログインセキュリティを追加", - "disable": "無効", - "enable": "有効にする", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "QRコードをスキャンするか、認証アプリにシークレットを入力し、6桁のコードを入力してください", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "確認する", - "changePassword": "パスワードの変更", - "currentPasswordLabel": "現在のパスワード", - "currentPasswordPlaceholder": "現在のパスワード", - "newPasswordLabel": "新しいパスワード", - "newPasswordPlaceholder": "新しいパスワード", - "confirmPasswordLabel": "新しいパスワードの確認", - "confirmPasswordPlaceholder": "新しいパスワードを確認", - "updatePassword": "パスワードの更新", - "createApiKeyTitle": "API キーを作成", - "createApiKeyDescription": "プログラムアクセス用の新しい API キーを生成します。", - "apiKeyNameLabel": "名前", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "省略可能", + "optional": "optional", "cancel": "キャンセル", - "createKey": "キーを作成", - "apiKeyCount": "{{count}} キー", - "newKey": "新しいキー", - "noApiKeys": "API キーはまだありません。", - "apiKeyActive": "アクティブ", - "apiKeyUsageHint": "にキーを含める", - "apiKeyUsageHintHeader": "ヘッダ。", - "apiKeyPermissionsHint": "キーは作成ユーザーの権限を継承します。", - "roleUser": "ユーザー", - "authMethodDual": "デュアル認証", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "TOTP セットアップの開始に失敗しました", - "totpEnter6Digits": "6桁のコードを入力してください", - "totpEnabledSuccess": "二段階認証を有効にしました", - "totpInvalidCode": "無効なコードです。もう一度やり直してください。", - "totpDisableInputRequired": "TOTPコードまたはパスワードを入力してください", - "totpDisabledSuccess": "二段階認証は無効です", - "totpDisableFailed": "2FAの無効化に失敗しました", - "totpDisableTitle": "2段階認証を無効にする", - "totpDisablePlaceholder": "TOTP コードまたはパスワードを入力", - "totpDisableConfirm": "2段階認証を無効にする", - "totpContinueVerify": "確認を続ける", - "totpVerifyTitle": "コードを確認", - "totpBackupTitle": "バックアップコード", - "totpDownloadBackup": "バックアップコードをダウンロード", - "done": "完了", - "secretCopied": "シークレットをクリップボードにコピーしました", - "apiKeyNameRequired": "キー名が必要です", - "apiKeyCreated": "API キー \"{{name}}\" が作成されました", - "apiKeyCreateFailed": "API キーの作成に失敗しました", - "apiKeyUser": "ユーザー", - "apiKeyExpires": "期限切れ", - "apiKeyRevoked": "API キー \"{{name}}\" が取り消されました", - "apiKeyRevokeFailed": "APIキーの取り消しに失敗しました", - "passwordFieldsRequired": "現在のパスワードと新しいパスワードが必要です", - "passwordMismatch": "パスワードが一致しません", - "passwordTooShort": "パスワードは6文字以上でなければなりません", - "passwordUpdated": "パスワードが正常に更新されました", - "passwordUpdateFailed": "パスワードの更新に失敗しました", - "deletePasswordRequired": "アカウントを削除するにはパスワードが必要です", - "deleteFailed": "アカウントの削除に失敗しました", - "deleting": "削除中...", - "colorPickerTooltip": "カラーピッカーを開く", - "themeSystem": "システム", - "themeLight": "ライト", - "themeDark": "ダーク", - "themeDracula": "ドラキュラ", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "1つのダーク", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "タグ", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "リトライ", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "取り除く", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/ko_KR.json b/src/ui/locales/translated/ko_KR.json index ef28f958..fe4a38f5 100644 --- a/src/ui/locales/translated/ko_KR.json +++ b/src/ui/locales/translated/ko_KR.json @@ -1,16 +1,16 @@ { "credentials": { "folders": "폴더", - "folder": "폴더", - "password": "비밀번호", - "key": "키", - "sshPrivateKey": "SSH 개인 키", - "upload": "업로드", - "keyPassword": "키 비밀번호", - "sshKey": "SSH 키", - "uploadPrivateKeyFile": "개인 키 파일 업로드", - "searchCredentials": "자격 증명 검색...", - "addCredential": "자격 증명 추가", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "CA 인증서(-cert.pub)", "caCertificateDescription": "선택 사항: CA에서 서명한 인증서 파일(예: id_ed25519-cert.pub)을 업로드하거나 붙여넣으세요. SSH 서버에서 인증서 기반 인증을 사용하는 경우 필수입니다.", "uploadCertFile": "-cert.pub 파일 업로드", @@ -20,251 +20,282 @@ "certTypeLabel": "인증서 유형", "pasteOrUploadCert": "-cert.pub 인증서를 붙여넣거나 업로드하세요...", "hasCaCert": "CA 자격증 보유", - "noCaCert": "공인회계사 자격증 없음" + "noCaCert": "공인회계사 자격증 없음", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "기본 주문", + "sortNameAsc": "이름 (A → Z)", + "sortNameDesc": "이름 (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "필터 지우기", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "알림을 불러오는 데 실패했습니다.", - "failedToDismissAlert": "알림을 닫는 데 실패했습니다." + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "서버 설정", - "description": "백엔드 서비스에 연결할 Termix 서버 URL을 설정하세요.", - "serverUrl": "서버 URL", - "enterServerUrl": "서버 URL을 입력해 주세요", - "saveFailed": "설정을 저장하는 데 실패했습니다.", - "saveError": "설정 저장 오류", - "saving": "저장 중...", - "saveConfig": "설정 저장", - "helpText": "Termix 서버가 실행 중인 URL을 입력하세요(예: http://localhost:30001 또는 https://your-server.com).", - "changeServer": "서버 변경", - "mustIncludeProtocol": "서버 URL은 http:// 또는 https://로 시작해야 합니다.", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "유효하지 않은 인증서를 허용합니다", "allowInvalidCertificateDesc": "자체 서명 인증서 또는 IP 주소 인증서를 사용하는 신뢰할 수 있는 자체 호스팅 서버에서만 사용하십시오.", - "useEmbedded": "로컬 서버 사용", - "embeddedDesc": "Termix를 내장된 로컬 서버로 실행하세요(원격 서버는 필요하지 않습니다).", - "embeddedConnecting": "로컬 서버에 연결 중...", - "embeddedNotReady": "로컬 서버가 아직 준비되지 않았습니다. 잠시 기다렸다가 다시 시도해 주세요.", - "localServer": "로컬 서버" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "로컬 서버", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "버전 확인 오류", - "checkFailed": "업데이트 확인에 실패했습니다", - "upToDate": "앱이 최신 버전입니다", - "currentVersion": "현재 {{version}} 버전을 실행 중입니다.", - "updateAvailable": "업데이트 가능", - "newVersionAvailable": "새 버전이 있습니다! 현재 {{current}} 버전을 사용 중이며, {{latest}} 버전을 사용할 수 있습니다.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "베타 버전", - "betaVersionDesc": "현재 실행 중인 버전은 {{current}}이며, 이는 최신 안정 버전인 {{latest}}보다 최신 버전입니다.", - "releasedOn": "{{date}}에 출시됨", - "downloadUpdate": "업데이트 다운로드", - "checking": "업데이트를 확인하는 중...", - "checkUpdates": "업데이트 확인", - "checkingUpdates": "업데이트를 확인하는 중...", - "updateRequired": "업데이트 필요" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "업데이트를 확인하세요", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "닫기", - "minimize": "최소화", - "online": "온라인", - "offline": "오프라인", - "continue": "계속", - "maintenance": "유지보수", - "degraded": "성능 저하", - "error": "오류", - "warning": "경고", - "unsavedChanges": "저장되지 않은 변경 사항", - "dismiss": "해고하다", - "loading": "불러오는 중...", - "optional": "선택 사항", - "connect": "연결", - "copied": "복사됨", - "connecting": "연결 중...", - "updateAvailable": "업데이트 가능", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "선택 과목", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "새 탭에서 열기", - "noReleases": "릴리스 없음", - "updatesAndReleases": "업데이트 및 릴리스", - "newVersionAvailable": "새 버전({{version}})이 있습니다.", - "failedToFetchUpdateInfo": "업데이트 정보를 가져오는 데 실패했습니다.", - "preRelease": "사전 릴리스", - "noReleasesFound": "릴리스를 찾을 수 없습니다.", - "cancel": "취소", - "username": "사용자 이름", - "login": "로그인", - "register": "등록", - "password": "비밀번호", - "confirmPassword": "비밀번호 확인", - "back": "뒤로", - "save": "저장", - "saving": "저장 중...", - "delete": "삭제", - "rename": "이름 변경", - "edit": "편집", - "add": "추가", - "confirm": "확인", - "no": "아니요", - "or": "또는", - "next": "다음", - "previous": "이전", - "refresh": "새로고침", - "language": "언어", - "checking": "확인 중...", - "checkingDatabase": "데이터베이스 연결을 확인하는 중...", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", "checkingAuthentication": "인증 상태를 확인하는 중...", - "backendReconnected": "서버 연결이 복구되었습니다.", - "connectionDegraded": "서버 연결이 끊어졌습니다. 복구 중…", - "reload": "새로고침", - "remove": "제거", - "create": "생성", - "update": "업데이트", - "copy": "복사", - "copyFailed": "클립보드에 복사하는 데 실패했습니다.", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "최대화", "restore": "복원하다", - "of": "~의" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "홈", - "terminal": "터미널", - "docker": "도커", - "tunnels": "터널", - "fileManager": "파일 관리자", - "serverStats": "서버 통계", - "admin": "관리자", - "userProfile": "사용자 프로필", - "splitScreen": "분할 화면", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "이 세션을 종료하시겠습니까?", - "close": "닫다", - "cancel": "취소", - "sshManager": "SSH 관리자", - "cannotSplitTab": "이 탭을 분할할 수 없습니다.", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "비밀번호 복사", - "copySudoPassword": "Sudo 비밀번호 복사", - "passwordCopied": "비밀번호가 클립보드에 복사되었습니다.", - "noPasswordAvailable": "비밀번호를 사용할 수 없습니다.", - "failedToCopyPassword": "비밀번호 복사에 실패했습니다.", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", "refreshTab": "연결 새로 고침", - "openFileManager": "파일 관리자 열기", - "dashboard": "계기반", - "networkGraph": "네트워크 그래프", - "quickConnect": "빠른 연결", - "sshTools": "SSH 도구", - "history": "역사", - "hosts": "호스트", - "snippets": "스니펫", - "hostManager": "호스트 관리자", - "credentials": "자격 증명", - "connections": "사이", - "roleAdministrator": "관리자", - "roleUser": "사용자" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "호스트", - "noHosts": "SSH 호스트 없음", - "retry": "다시 시도", - "refresh": "새로고침", - "optional": "선택 사항", - "downloadSample": "샘플 다운로드", - "failedToDeleteHost": "{{name}} 삭제에 실패했습니다.", - "importSkipExisting": "가져오기 (기존 항목 건너뛰기)", - "connectionDetails": "연결 정보", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "선택 과목", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "텔넷", - "remoteDesktop": "원격 데스크톱", - "port": "포트", - "username": "사용자 이름", - "folder": "폴더", - "tags": "태그", - "pin": "핀", - "addHost": "호스트 추가", - "editHost": "호스트 편집", - "cloneHost": "호스트 복제", - "enableTerminal": "터미널 활성화", - "enableTunnel": "터널 활성화", - "enableFileManager": "파일 관리자 활성화", - "enableDocker": "Docker 활성화", - "defaultPath": "기본 경로", - "connection": "연결", - "upload": "업로드", - "authentication": "인증", - "password": "비밀번호", - "key": "키", - "credential": "자격 증명", - "none": "없음", - "sshPrivateKey": "SSH 개인 키", - "keyType": "키 유형", - "uploadFile": "파일 업로드", - "tabGeneral": "일반적인", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "터널", - "tabDocker": "도커", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "파일", - "tabStats": "통계", - "tabTelnet": "텔넷", - "tabSharing": "공유하기", - "tabAuthentication": "입증", - "terminal": "터미널", - "tunnel": "터널", - "fileManager": "파일 관리자", - "serverStats": "서버 통계", - "status": "상태", - "folderRenamed": "폴더 \"{{oldName}}\"의 이름이 \"{{newName}}\"로 변경되었습니다.", - "failedToRenameFolder": "폴더 이름 변경에 실패했습니다", - "movedToFolder": "\"{{folder}} \"로 이동했습니다.", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", "editHostTooltip": "호스트 편집", - "statusChecks": "상태 확인", - "metricsCollection": "메트릭 수집", - "metricsInterval": "메트릭 수집 간격", - "metricsIntervalDesc": "서버 통계 수집 빈도 (5초 ~ 1시간)", - "behavior": "동작", - "themePreview": "테마 미리보기", - "theme": "테마", - "fontFamily": "글꼴 패밀리", - "fontSize": "글꼴 크기", - "letterSpacing": "글자 간격", - "lineHeight": "줄 높이", - "cursorStyle": "커서 스타일", - "cursorBlink": "커서 깜빡임", - "scrollbackBuffer": "스크롤백 버퍼", - "bellStyle": "벨 스타일", - "rightClickSelectsWord": "오른쪽 클릭 시 단어 선택", - "fastScrollModifier": "빠른 스크롤 수정자", - "fastScrollSensitivity": "빠른 스크롤 감도", - "sshAgentForwarding": "SSH 에이전트 포워딩", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", "backspaceMode": "백스페이스 모드", - "startupSnippet": "스타트업 스니펫", - "selectSnippet": "스니펫을 선택하세요", - "forceKeyboardInteractive": "키보드 상호작용 강제 적용", - "overrideCredentialUsername": "자격 증명 사용자 이름 재정의", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "자격 증명의 사용자 이름 대신 위에 지정된 사용자 이름을 사용하십시오.", - "jumpHostChain": "점프 호스트 체인", - "portKnocking": "포트 노킹", - "addKnock": "포트 추가", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", "addProxyNode": "노드 추가", - "proxyNode": "프록시 노드", - "proxyType": "프록시 유형", - "quickActions": "빠른 조치", - "sudoPasswordAutoFill": "Sudo 비밀번호 자동 완성", - "sudoPassword": "Sudo 비밀번호", - "keepaliveInterval": "유지 간격(밀리초)", - "moshCommand": "MOSH 명령", - "environmentVariables": "환경 변수", - "addVariable": "변수 추가", - "docker": "도커", - "copyTerminalUrl": "터미널 URL 복사", - "copyFileManagerUrl": "파일 관리자 URL 복사", - "copyRemoteDesktopUrl": "원격 데스크톱 URL 복사", - "failedToConnect": "콘솔에 연결하지 못했습니다.", - "connect": "연결", - "disconnect": "연결 끊기", - "start": "시작", - "enableStatusCheck": "상태 확인 활성화", - "enableMetrics": "메트릭 활성화", - "bulkUpdateFailed": "일괄 업데이트 실패", - "selectAll": "모두 선택", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "모두 선택 해제", "protocols": "프로토콜", "secureShell": "보안 셸", @@ -272,6 +303,9 @@ "unencryptedShell": "암호화되지 않은 셸", "addressIp": "주소/IP", "friendlyName": "친근한 이름", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "폴더 및 고급", "privateNotes": "개인 메모", "privateNotesPlaceholder": "이 서버에 대한 자세한 정보...", @@ -281,18 +315,18 @@ "addKnockBtn": "노크를 추가하세요", "noPortKnocking": "포트 노킹이 구성되지 않았습니다.", "knockPort": "노크 포트", - "protocol": "규약", + "protocol": "Protocol", "delayAfterMs": "지연 시간(밀리초)", "useSocks5Proxy": "SOCKS5 프록시를 사용하세요", "useSocks5ProxyDesc": "프록시 서버를 통한 연결 라우팅", - "proxyHost": "프록시 호스트", - "proxyPort": "프록시 포트", - "proxyUsername": "프록시 사용자 이름", - "proxyPassword": "프록시 비밀번호", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "싱글 프록시", - "proxyChainMode": "프록시 체인", + "proxyChainMode": "Proxy Chain", "you": "너", - "jumpHostChainLabel": "점프 호스트 체인", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "점프 추가", "noJumpHosts": "구성된 점프 호스트가 없습니다.", "selectAServer": "서버를 선택하세요...", @@ -300,10 +334,10 @@ "authMethod": "인증 방식", "storedCredential": "저장된 자격 증명", "selectACredential": "자격증명을 선택하세요...", - "keyTypeLabel": "키 유형", - "keyTypeAuto": "자동 감지", - "keyPasteTab": "반죽", - "keyUploadTab": "업로드", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "키 파일이 로드되었습니다.", "keyUploadClick": ".pem / .key / .ppk 파일을 업로드하려면 클릭하세요.", "clearKey": "지우기 키", @@ -311,59 +345,105 @@ "keyReplaceNotice": "아래에 새 키를 붙여넣어 기존 키를 대체하세요.", "keyPassphraseSaved": "암호가 저장되었습니다. 변경하려면 입력하세요.", "replaceKey": "키를 교체하세요", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "키보드 대화형 강제 적용", "forceKeyboardInteractiveShortDesc": "열쇠가 있더라도 수동으로 암호를 입력하도록 강제합니다.", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "터미널 외관", "colorTheme": "색상 테마", - "fontFamilyLabel": "글꼴 패밀리", - "fontSizeLabel": "글꼴 크기", - "cursorStyleLabel": "커서 스타일", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "자간(픽셀)", - "lineHeightLabel": "선 높이", - "bellStyleLabel": "벨 스타일", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", "backspaceModeLabel": "백스페이스 모드", "cursorBlinking": "커서 깜빡임", "cursorBlinkingDesc": "터미널 커서의 깜빡임 애니메이션을 활성화합니다.", "rightClickSelectsWordLabel": "마우스 오른쪽 버튼을 클릭하고 단어를 선택합니다.", "rightClickSelectsWordShortDesc": "마우스 오른쪽 버튼을 클릭하여 커서 아래 단어를 선택하세요.", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "구문 강조 표시", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "타임스탬프", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "행동 및 고급", - "scrollbackBufferLabel": "스크롤백 버퍼", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "기록에 저장되는 최대 행 수", - "sshAgentForwardingLabel": "SSH 에이전트 포워딩", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "로컬 SSH 키를 이 호스트로 전달하세요.", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "자동 모싱 활성화", "enableAutoMoshDesc": "가능하다면 SSH보다 Mosh를 선호합니다.", "enableAutoTmux": "자동 Tmux 활성화", "enableAutoTmuxDesc": "tmux 세션을 자동으로 시작하거나 연결합니다.", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Sudo 비밀번호 자동 완성", "sudoPasswordAutoFillShortDesc": "sudo 암호를 입력하라는 메시지가 나타나면 자동으로 암호를 제공합니다.", - "sudoPasswordLabel": "Sudo 비밀번호", - "environmentVariablesLabel": "환경 변수", - "addVariableBtn": "변수 추가", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "환경 변수가 설정되지 않았습니다.", - "fastScrollModifierLabel": "빠른 스크롤 수정자", - "fastScrollSensitivityLabel": "빠른 스크롤 감도", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "모쉬 커맨드", - "startupSnippetLabel": "스타트업 스니펫", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "유지 간격(초)", "maxKeepaliveMisses": "맥스 킵얼라이브 미스", "tunnelSettings": "터널 설정", "enableTunneling": "터널링 활성화", "enableTunnelingDesc": "이 호스트에 대해 SSH 터널 기능을 활성화합니다.", "serverTunnelsSection": "서버 터널", - "addTunnelBtn": "터널 추가", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "구성된 터널이 없습니다.", - "tunnelLabel": "터널 {{number}}", - "tunnelType": "터널 유형", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "로컬 포트를 원격 서버(또는 해당 서버에서 접근 가능한 호스트)의 포트로 포워딩합니다.", "tunnelModeRemoteDesc": "원격 서버의 포트를 사용자 컴퓨터의 로컬 포트로 포워딩하십시오.", "tunnelModeDynamicDesc": "동적 포트 포워딩을 위해 로컬 포트에 SOCKS5 프록시를 생성합니다.", "sameHost": "이 호스트(직접 터널)", "endpointHost": "엔드포인트 호스트", - "endpointPort": "엔드포인트 포트", + "endpointPort": "Endpoint Port", "bindHost": "호스트 바인딩", - "sourcePort": "소스 포트", - "maxRetries": "최대 재시도 횟수", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "재시도 간격(초)", "autoStartLabel": "자동 시작", "autoStartDesc": "호스트가 로드될 때 이 터널을 자동으로 연결합니다.", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "연결에 실패했습니다", "failedToDisconnectTunnel": "연결 해제에 실패했습니다", "dockerIntegration": "Docker 통합", - "enableDockerMonitor": "Docker 활성화", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Docker를 통해 이 호스트의 컨테이너를 모니터링하고 관리하세요.", - "enableFileManagerMonitor": "파일 관리자 활성화", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "SFTP를 통해 이 호스트의 파일을 탐색하고 관리하세요.", - "defaultPathLabel": "기본 경로", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "이 호스트에서 파일 관리자가 실행될 때 열릴 디렉터리입니다.", - "statusChecksLabel": "상태 확인", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "상태 확인 활성화", "enableStatusChecksDesc": "주기적으로 이 호스트에 ping을 보내 가용성을 확인하십시오.", "useGlobalInterval": "글로벌 간격을 사용하세요", "useGlobalIntervalDesc": "서버 전체 상태 확인 간격으로 재정의합니다.", "checkIntervalS": "점검 간격(초)", "checkIntervalDesc": "각 연결 핑 사이의 간격(초)", - "metricsCollectionLabel": "측정항목 수집", - "enableMetricsLabel": "메트릭 활성화", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "이 호스트의 CPU, RAM, 디스크 및 네트워크 사용량을 수집합니다.", "useGlobalMetrics": "글로벌 간격을 사용하세요", "useGlobalMetricsDesc": "서버 전체 메트릭 간격으로 재정의합니다.", "metricsIntervalS": "측정 간격(초)", "metricsIntervalDesc2": "측정값 스냅샷 간 간격(초)", "visibleWidgets": "표시되는 위젯", - "cpuUsageLabel": "CPU 사용량", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "CPU 사용률, 평균 부하, 스파크라인 그래프", - "memoryLabel": "메모리 사용량", + "memoryLabel": "Memory Usage", "memoryDesc": "RAM 사용량, 스왑, 캐시", - "storageLabel": "디스크 사용량", + "storageLabel": "Disk Usage", "storageDesc": "마운트 지점별 디스크 사용량", - "networkLabel": "네트워크 인터페이스", + "networkLabel": "Network Interfaces", "networkDesc": "인터페이스 목록 및 대역폭", - "uptimeLabel": "가동 시간", + "uptimeLabel": "Uptime", "uptimeDesc": "시스템 가동 시간 및 부팅 시간", "systemInfoLabel": "시스템 정보", "systemInfoDesc": "OS, 커널, 호스트 이름, 아키텍처", @@ -409,61 +532,100 @@ "recentLoginsDesc": "로그인 성공 및 실패 이벤트", "topProcessesLabel": "주요 프로세스", "topProcessesDesc": "PID, CPU%, 메모리%, 명령", - "listeningPortsLabel": "수신 포트", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "프로세스 및 상태를 사용하여 포트를 엽니다.", - "firewallLabel": "방화벽", + "firewallLabel": "Firewall", "firewallDesc": "방화벽, AppArmor, SELinux 상태", - "quickActionsLabel": "빠른 조치", - "quickActionsToolbar": "빠른 실행 기능은 서버 통계 도구 모음에 버튼으로 표시되어 한 번의 클릭으로 명령을 실행할 수 있습니다.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "아직 빠른 조치는 없습니다.", "buttonLabel": "버튼 라벨", "selectSnippetPlaceholder": "코드 조각을 선택하세요...", "addActionBtn": "작업 추가", "hostSharedSuccessfully": "호스트가 성공적으로 공유했습니다.", - "failedToShareHost": "호스트 공유에 실패했습니다", + "failedToShareHost": "Failed to share host", "accessRevoked": "접근 권한이 취소되었습니다", - "failedToRevokeAccess": "접근 권한 취소에 실패했습니다.", - "cancelBtn": "취소", - "savingBtn": "절약...", - "addHostBtn": "호스트 추가", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "호스트가 업데이트되었습니다.", "hostCreated": "호스트가 생성했습니다", "failedToSave": "호스트 저장에 실패했습니다", "credentialUpdated": "자격 증명이 업데이트되었습니다.", "credentialCreated": "자격 증명이 생성되었습니다", - "failedToSaveCredential": "자격 증명을 저장하는 데 실패했습니다.", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "호스트 목록으로 돌아가기", "backToCredentials": "자격 증명 페이지로 돌아가기", - "pinned": "고정됨", - "noHostsFound": "호스트를 찾을 수 없습니다.", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "다른 용어를 사용해 보세요.", "addFirstHost": "시작하려면 첫 번째 호스트를 추가하세요.", "noCredentialsFound": "자격 증명을 찾을 수 없습니다.", - "addCredentialBtn": "자격 증명 추가", - "updateCredentialBtn": "자격 증명 업데이트", - "features": "특징", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(폴더 없음)", - "deleteSelected": "삭제", + "deleteSelected": "Delete", "exitSelection": "선택 종료", - "importSkip": "가져오기 (기존 항목 건너뛰기)", + "importSkip": "Import (skip existing)", "importOverwrite": "가져오기(덮어쓰기)", "collapseBtn": "무너지다", "importExportBtn": "수입/수출", "hostStatusesRefreshed": "호스트 상태가 새로 고쳐졌습니다.", "failedToRefreshHosts": "호스트 새로 고침에 실패했습니다.", - "movedHostTo": "{{host}} 를 \"{{folder}} \"로 이동했습니다.", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "호스트 이동에 실패했습니다", - "folderRenamedTo": "폴더 이름이 \"{{name}} \"로 변경되었습니다.", - "deletedFolder": "삭제된 폴더 \"{{name}}\"", - "failedToDeleteFolder": "폴더 삭제에 실패했습니다", - "deleteAllInFolder": "\"{{name}}\"에 있는 모든 호스트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", - "deletedHost": "삭제됨 {{name}}", - "copiedToClipboard": "클립보드에 복사됨", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "편집 폴더", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "편집 폴더", + "deleteFolder": "폴더 삭제", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "호스트 이동에 실패했습니다", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "터미널 URL이 복사되었습니다.", "fileManagerUrlCopied": "파일 관리자 URL이 복사되었습니다.", "tunnelUrlCopied": "터널 URL이 복사되었습니다", "dockerUrlCopied": "Docker URL이 복사되었습니다.", - "serverStatsUrlCopied": "서버 통계 URL이 복사되었습니다", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP URL이 복사되었습니다.", "vncUrlCopied": "VNC URL이 복사되었습니다.", "telnetUrlCopied": "텔넷 URL이 복사되었습니다.", @@ -471,109 +633,112 @@ "expandActions": "확장 작업", "collapseActions": "붕괴 조치", "wakeOnLanAction": "LAN에서 웨이크업", - "wakeOnLanSuccess": "매직 패킷이 {{name}}로 전송되었습니다.", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "매직 패킷 전송에 실패했습니다.", - "cloneHostAction": "클론 호스트", + "cloneHostAction": "Clone Host", "copyAddress": "주소 복사", "copyLink": "링크 복사", - "copyTerminalUrlAction": "터미널 URL 복사", - "copyFileManagerUrlAction": "파일 관리자 URL 복사", - "copyTunnelUrlAction": "터널 URL 복사", - "copyDockerUrlAction": "Docker URL 복사", - "copyServerStatsUrlAction": "서버 통계 URL 복사", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "RDP URL 복사", "copyVncUrlAction": "VNC URL 복사", "copyTelnetUrlAction": "텔넷 URL 복사", - "copyRemoteDesktopUrlAction": "원격 데스크톱 URL 복사", - "deleteCredentialConfirm": "자격 증명 \"{{name}} \"을 삭제하시겠습니까?", - "deletedCredential": "삭제됨 {{name}}", - "deploySSHKeyTitle": "SSH 키 배포", - "deployingBtn": "배포 중...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "배포", "failedToDeployKey": "키 배포에 실패했습니다", - "deleteHostsConfirm": "{{count}} 호스트{{plural}}를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "루트로 이동됨", - "failedToMoveHosts": "호스트 이동에 실패했습니다", - "enableTerminalFeature": "터미널 활성화", - "disableTerminalFeature": "터미널 비활성화", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "파일 활성화", "disableFilesFeature": "파일 비활성화", "enableTunnelsFeature": "터널 활성화", "disableTunnelsFeature": "터널 비활성화", - "enableDockerFeature": "Docker 활성화", - "disableDockerFeature": "Docker 비활성화", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "태그 추가...", "authDetails": "인증 정보", - "credType": "유형", + "credType": "Type", "generateKeyPairDesc": "새로운 키 쌍을 생성하면 개인 키와 공개 키가 자동으로 채워집니다.", "generatingKey": "생성 중...", - "generateLabel": "{{label}} 생성", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "파일 업로드", "keyPassphraseOptional": "키 암호문 (선택 사항)", "sshPublicKeyOptional": "SSH 공개 키 (선택 사항)", "publicKeyGenerated": "공개 키가 생성되었습니다", "failedToGeneratePublicKey": "공개 키를 생성하는 데 실패했습니다.", "publicKeyCopied": "공개 키가 복사되었습니다.", - "keyPairGenerated": "{{label}} 키 쌍이 생성되었습니다", - "failedToGenerateKeyPair": "키 쌍 생성에 실패했습니다.", - "searchHostsPlaceholder": "호스트, 주소, 태그를 검색하세요…", - "searchCredentialsPlaceholder": "자격 증명 검색…", - "refreshBtn": "새로 고치다", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "태그 추가...", - "deleteConfirmBtn": "삭제", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH 서버는 /etc/ssh/sshd_config 파일에 GatewayPorts yes, AllowTcpForwarding yes, PermitRootLogin yes 설정이 되어 있어야 합니다.", - "deleteHostConfirm": "\"{{name}} \"을 삭제하시겠습니까?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "인증 및 연결 설정을 구성하려면 위의 프로토콜 중 하나 이상을 활성화하십시오.", - "keyPassphrase": "키 암호문", - "connectBtn": "연결하다", - "disconnectBtn": "연결을 끊으세요", - "basicInformation": "기본 정보", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "인증 정보", - "credTypeLabel": "유형", - "hostsTab": "호스트", - "credentialsTab": "신임장", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "여러 개를 선택하세요", "selectHosts": "호스트를 선택하세요", - "connectionLabel": "연결", - "authenticationLabel": "입증", - "generateKeyPairTitle": "키 페어 생성", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "새로운 키 쌍을 생성하면 개인 키와 공개 키가 자동으로 채워집니다.", - "generateFromPrivateKey": "개인 키에서 생성", - "refreshBtn2": "새로 고치다", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "선택 종료", "exportAll": "모두 내보내기", - "addHostBtn2": "호스트 추가", - "addCredentialBtn2": "자격 증명 추가", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "호스트 상태를 확인하는 중...", - "pinnedSection": "고정됨", + "pinnedSection": "Pinned", "hostsExported": "호스트 내보내기가 성공적으로 완료되었습니다.", "exportFailed": "호스트 내보내기에 실패했습니다", "sampleDownloaded": "샘플 파일 다운로드됨", - "failedToDeleteCredential2": "자격 증명 삭제에 실패했습니다.", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(폴더 없음)", - "nSelected": "{{count}} 선택됨", - "featuresMenu": "특징", - "moveMenu": "이동하다", - "cancelSelection": "취소", - "deployDialogDesc": "{{name}} 를 호스트의 authorized_keys에 배포합니다.", - "targetHostLabel": "대상 호스트", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "호스트를 선택하세요...", "keyDeployedSuccess": "키가 성공적으로 배포되었습니다.", "failedToDeployKey2": "키 배포에 실패했습니다", - "deletedCount": "삭제된 {{count}} 호스트", - "failedToDeleteCount": "{{count}} 호스트를 삭제하는 데 실패했습니다.", - "duplicatedHost": "\"{{name}} \"가 복제됨", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "호스트 복제에 실패했습니다.", - "updatedCount": "{{count}} 호스트가 업데이트되었습니다.", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "친근한 이름", - "descriptionLabel": "설명", + "descriptionLabel": "Description", "loadingHost": "호스트를 불러오는 중...", - "loadingHosts": "호스트를 불러오는 중...", - "loadingCredentials": "자격 증명을 불러오는 중...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "아직 호스트가 없습니다", - "noHostsMatchSearch": "검색 조건에 맞는 호스트가 없습니다.", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "호스트를 찾을 수 없습니다", - "searchHosts": "호스트를 검색하세요...", + "searchHosts": "Search hosts...", "sortHosts": "호스트 정렬", "sortDefault": "기본 주문", "sortNameAsc": "이름 (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "첫 번째 고정됨", "filterHosts": "필터 호스트", "filterClearAll": "필터 지우기", - "filterStatusGroup": "상태", - "filterOnline": "온라인", - "filterOffline": "오프라인", - "filterPinned": "고정됨", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "인증 유형", - "filterAuthPassword": "비밀번호", - "filterAuthKey": "SSH 키", - "filterAuthCredential": "신임장", - "filterAuthNone": "없음", - "filterAuthOpkssh": "오프크시", - "filterProtocolGroup": "규약", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", + "filterAuthOpkssh": "OPKSSH", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", - "filterProtocolTelnet": "텔넷", - "filterFeaturesGroup": "특징", - "filterFeatureTerminal": "단말기", - "filterFeatureFileManager": "파일 관리자", - "filterFeatureTunnel": "터널", - "filterFeatureDocker": "도커", - "filterTagsGroup": "태그", - "shareHost": "호스트 공유", - "shareHostTitle": "공유: {{name}}", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "이 호스트에서 공유를 활성화하려면 자격 증명이 필요합니다. 먼저 호스트를 편집하고 자격 증명을 할당하십시오." }, "guac": { - "connection": "연결", - "authentication": "입증", - "connectionSettings": "연결 설정", - "displaySettings": "디스플레이 설정", - "audioSettings": "오디오 설정", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "저장된 자격 증명", + "noCredential": "No credential (direct credentials below)", + "authMethod": "인증 방식", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "자격증명을 선택하세요...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "RDP 성능", - "deviceRedirection": "기기 리디렉션", - "session": "세션", - "gateway": "게이트웨이", - "remoteApp": "원격 앱", - "clipboard": "클립보드", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "세션 녹화", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC 설정", - "terminalSettings": "터미널 설정", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "RDP 포트", - "username": "사용자 이름", - "password": "비밀번호", - "domain": "도메인", - "securityMode": "보안 모드", - "colorDepth": "색심도", - "width": "너비", - "height": "키", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "크기 조정 방법", - "clientName": "고객 이름", - "initialProgram": "초기 프로그램", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "서버 레이아웃", - "timezone": "시간대", - "gatewayHostname": "게이트웨이 호스트 이름", - "gatewayPort": "게이트웨이 포트", - "gatewayUsername": "게이트웨이 사용자 이름", - "gatewayPassword": "게이트웨이 비밀번호", - "gatewayDomain": "게이트웨이 도메인", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "RemoteApp 프로그램", "workingDirectory": "업무 디렉토리", "arguments": "논거", "normalizeLineEndings": "줄 끝 문자 정규화", - "recordingPath": "기록 경로", - "recordingName": "녹음 이름", - "macAddress": "MAC 주소", - "broadcastAddress": "방송 주소", - "udpPort": "UDP 포트", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "대기 시간(초)", - "driveName": "드라이브 이름", - "drivePath": "차량 통행로", - "ignoreCertificate": "인증서 무시", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "자체 서명 인증서를 사용하는 호스트에 대한 연결을 허용합니다.", - "forceLossless": "힘 손실 없음", + "forceLossless": "Force Lossless", "forceLosslessDesc": "무손실 이미지 인코딩 강제 적용(더 높은 화질, 더 많은 대역폭)", - "disableAudio": "오디오 비활성화", + "disableAudio": "Disable Audio", "disableAudioDesc": "원격 세션의 모든 오디오를 음소거합니다.", "enableAudioInput": "오디오 입력(마이크)을 활성화하세요.", "enableAudioInputDesc": "로컬 마이크를 원격 세션으로 전달합니다.", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Aero 유리 효과 활성화", "menuAnimations": "메뉴 애니메이션", "menuAnimationsDesc": "메뉴 페이드 및 슬라이드 애니메이션을 활성화합니다.", - "disableBitmapCaching": "비트맵 캐싱 비활성화", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "비트맵 캐시를 끄세요(오류 해결에 도움이 될 수 있습니다).", - "disableOffscreenCaching": "오프스크린 캐싱 비활성화", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "오프스크린 캐시를 끄세요", - "disableGlyphCaching": "글리프 캐싱 비활성화", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "글리프 캐시를 끄세요", - "enableGfx": "GFX 활성화", + "enableGfx": "Enable GFX", "enableGfxDesc": "RemoteFX 그래픽 파이프라인을 사용하세요.", - "enablePrinting": "인쇄 활성화", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "로컬 프린터를 원격 세션으로 리디렉션합니다.", - "enableDriveRedirection": "드라이브 리디렉션 활성화", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "원격 세션에서 로컬 폴더를 드라이브로 매핑합니다.", - "createDrivePath": "드라이브 경로 생성", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "폴더가 존재하지 않으면 자동으로 생성합니다.", - "disableDownload": "다운로드 비활성화", + "disableDownload": "Disable Download", "disableDownloadDesc": "원격 세션에서 파일 다운로드를 방지합니다.", - "disableUpload": "업로드 비활성화", + "disableUpload": "Disable Upload", "disableUploadDesc": "원격 세션에 파일 업로드를 방지합니다.", - "enableTouch": "터치 활성화", + "enableTouch": "Enable Touch", "enableTouchDesc": "터치 입력 전달 활성화", - "consoleSession": "콘솔 세션", + "consoleSession": "Console Session", "consoleSessionDesc": "새 세션을 생성하는 대신 콘솔(세션 0)에 연결하세요.", "sendWolPacket": "WOL 패킷 전송", "sendWolPacketDesc": "연결하기 전에 매직 패킷을 보내서 이 호스트를 깨우세요.", - "disableCopy": "복사 비활성화", + "disableCopy": "Disable Copy", "disableCopyDesc": "원격 세션에서 텍스트 복사를 방지합니다.", - "disablePaste": "붙여넣기 비활성화", + "disablePaste": "Disable Paste", "disablePasteDesc": "원격 세션에 텍스트 붙여넣기를 방지합니다.", "createPathIfMissing": "경로가 없으면 생성하세요", "createPathIfMissingDesc": "녹음 디렉토리를 자동으로 생성합니다", - "excludeOutput": "출력 제외", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "화면 출력은 기록하지 마십시오 (메타데이터만 기록).", - "excludeMouse": "마우스 제외", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "마우스 움직임을 기록하지 마세요.", "includeKeystrokes": "키 입력을 포함하세요", "includeKeystrokesDesc": "화면 출력 외에도 키 입력 내용을 그대로 기록합니다.", @@ -718,117 +896,120 @@ "vncPassword": "VNC 비밀번호", "vncUsernameOptional": "사용자 이름 (선택 사항)", "vncLeaveBlank": "필요하지 않은 경우 비워 두십시오.", - "cursorMode": "커서 모드", - "swapRedBlue": "빨간색/파란색 바꾸기", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "빨간색과 파란색 채널을 서로 바꿉니다(일부 색상 문제를 해결합니다).", "readOnly": "읽기 전용", "readOnlyDesc": "아무런 입력도 보내지 않고 원격 화면을 봅니다.", "telnetPort": "텔넷 포트", - "terminalType": "터미널 유형", - "fontName": "글꼴 이름", - "fontSize": "글꼴 크기", - "colorScheme": "색 구성표", - "backspaceKey": "백스페이스 키", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "먼저 호스트를 저장하세요.", "sharingOptionsAfterSave": "호스트를 저장한 후에는 공유 옵션을 사용할 수 있습니다.", "sharingLoadError": "공유 데이터를 불러오는 데 실패했습니다. 연결 상태를 확인하고 다시 시도하세요.", - "shareHostSection": "호스트 공유", - "shareWithUser": "사용자와 공유", - "shareWithRole": "역할과 공유하기", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "사용자 선택", - "selectRole": "역할 선택", + "selectRole": "Select Role", "selectUserOption": "사용자를 선택하세요...", "selectRoleOption": "역할을 선택하세요...", - "permissionLevel": "권한 수준", + "permissionLevel": "Permission Level", "expiresInHours": "(시간) 후에 만료됩니다.", "noExpiryPlaceholder": "유통기한이 없으려면 빈칸으로 두십시오.", - "shareBtn": "공유하다", - "currentAccess": "현재 액세스", - "typeHeader": "유형", - "targetHeader": "목표", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "허가", - "grantedByHeader": "승인자:", - "expiresHeader": "만료됨", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "아직 접근 기록이 없습니다.", - "expiredLabel": "만료됨", - "neverLabel": "절대", - "revokeBtn": "취소", - "cancelBtn": "취소", - "savingBtn": "절약...", - "updateHostBtn": "호스트 업데이트", - "addHostBtn": "호스트 추가" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "호스트, 명령어 또는 설정을 검색하세요...", - "quickActions": "빠른 조치", - "hostManager": "호스트 관리자", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "호스트를 관리, 추가 또는 편집합니다.", "addNewHost": "새 호스트 추가", "addNewHostDesc": "새 호스트 등록", - "adminSettings": "관리자 설정", + "adminSettings": "Admin Settings", "adminSettingsDesc": "시스템 환경설정 및 사용자 구성", - "userProfile": "사용자 프로필", + "userProfile": "User Profile", "userProfileDesc": "계정 및 환경설정 관리", - "addCredential": "자격 증명 추가", + "addCredential": "Add Credential", "addCredentialDesc": "SSH 키 또는 암호를 저장하세요", - "recentActivity": "최근 활동", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "서버 및 호스트", - "noHostsFound": "\"{{search}} \" 와 일치하는 호스트를 찾을 수 없습니다.", - "links": "링크", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "탐색하기", - "select": "선택하다", + "select": "Select", "toggleWith": "토글" }, "splitScreen": { - "paneEmpty": "패널 {{index}} - 비어 있음", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "탭이 지정되지 않았습니다.", "focusedPane": "활성 창" }, "connections": { "noConnections": "연결 없음", "noConnectionsDesc": "터미널, 파일 관리자 또는 원격 데스크톱을 열어 연결 상태를 확인하세요.", - "connectedFor": "{{duration}}에 연결되었습니다.", - "connected": "연결됨", - "disconnected": "연결이 끊어졌습니다", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "닫기 탭", "closeConnection": "닫기", "forgetTab": "잊다", - "removeBackground": "제거하다", - "reconnect": "다시 연결", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "다시 열다", "sectionOpen": "열려 있는", "sectionBackground": "배경", "backgroundDesc": "연결이 끊어진 후에도 세션은 30분 동안 유지되며 다시 연결할 수 있습니다.", "persisted": "백그라운드에서 지속됨", - "expiresIn": "{{duration}} 후에 만료됩니다.", + "expiresIn": "Expires in {{duration}}", "search": "검색 연결...", - "noSearchResults": "검색 조건과 일치하는 결과가 없습니다." + "noSearchResults": "검색 조건과 일치하는 결과가 없습니다.", + "rename": "Rename session" }, "guacamole": { - "connecting": "{{type}} 세션에 연결 중...", - "connectionError": "연결 오류", - "connectionFailed": "연결 실패", - "failedToConnect": "연결 토큰을 가져오는 데 실패했습니다.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "호스트를 찾을 수 없습니다", - "noHostSelected": "호스트가 선택되지 않았습니다.", - "reconnect": "다시 연결", - "retry": "다시 해 보다", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "원격 데스크톱 서비스(guacd)를 사용할 수 없습니다. guacd가 실행 중이고 관리자 설정에서 올바르게 구성되어 있는지 확인하십시오.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", "winL": "Win+L (화면 잠금)", "winKey": "윈도우 키", - "ctrl": "Ctrl 키", + "ctrl": "Ctrl", "alt": "Alt", - "shift": "옮기다", + "shift": "Shift", "win": "이기다", - "stickyActive": "{{key}} (잠금 - 클릭하여 해제)", - "stickyInactive": "{{key}} (클릭하여 잠그세요)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "탈출하다", "tab": "꼬리표", - "home": "집", + "home": "Home", "end": "끝", "pageUp": "페이지 위로", "pageDown": "페이지 다운", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "호스트에 연결", - "clear": "지우기", - "paste": "붙여넣기", - "reconnect": "다시 연결", - "connectionLost": "연결이 끊어졌습니다.", - "connected": "연결됨", - "clipboardWriteFailed": "클립보드에 복사하는 데 실패했습니다. 페이지가 HTTPS 또는 localhost를 통해 제공되는지 확인하세요.", - "clipboardReadFailed": "클립보드에서 읽는 데 실패했습니다. 클립보드 권한이 부여되었는지 확인하세요.", - "clipboardHttpWarning": "붙여넣기에는 HTTPS가 필요합니다. Ctrl+Shift+V를 사용하거나 Termix를 HTTPS로 제공하세요.", - "unknownError": "알 수 없는 오류가 발생했습니다.", - "websocketError": "웹소켓 연결 오류", - "connecting": "연결 중...", - "noHostSelected": "호스트가 선택되지 않았습니다.", - "reconnecting": "다시 연결 중... ({{attempt}}/{{max}})", - "reconnected": "다시 연결되었습니다.", - "tmuxSessionCreated": "tmux 세션 생성됨: {{name}}", - "tmuxSessionAttached": "tmux 세션 연결됨: {{name}}", - "tmuxUnavailable": "원격 호스트에 tmux가 설치되어 있지 않아 일반 셸로 대체합니다.", - "tmuxSessionPickerTitle": "tmux 세션", - "tmuxSessionPickerDesc": "이 호스트에서 기존 tmux 세션을 찾았습니다. 다시 연결할 세션을 선택하거나 새 세션을 생성하세요.", - "tmuxWindows": "창", - "tmuxWindowCount": "{{count}}개 창", - "tmuxAttached": "연결된 클라이언트", - "tmuxAttachedCount": "{{count}}개 연결됨", - "tmuxLastActivity": "마지막 활동", - "tmuxTimeJustNow": "방금 전", - "tmuxTimeMinutes": "{{count}}분 전", - "tmuxTimeHours": "{{count}}시간 전", - "tmuxTimeDays": "{{count}}일 전", - "tmuxCreateNew": "새 세션 시작", - "tmuxCopyHint": "선택 영역을 조정한 후 Enter를 눌러 클립보드에 복사하세요.", + "connect": "Connect to Host", + "clear": "분명한", + "paste": "Paste", + "reconnect": "Reconnect", + "connectionLost": "Connection lost", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "방금", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", "tmuxDetach": "tmux 세션에서 분리", "tmuxDetached": "tmux 세션에서 분리됨", - "maxReconnectAttemptsReached": "최대 재연결 시도 횟수에 도달했습니다.", - "closeTab": "닫기", - "connectionTimeout": "연결 시간 초과", - "terminalTitle": "터미널 - {{host}}", - "terminalWithPath": "터미널 - {{host}}:{{path}}", - "runTitle": "{{command}} - {{host}} 실행 중", - "totpRequired": "2단계 인증이 필요합니다", - "totpCodeLabel": "인증 코드", - "totpVerify": "확인", - "warpgateAuthRequired": "워프게이트 인증 필요", - "warpgateSecurityKey": "보안 키", - "warpgateAuthUrl": "인증 URL", - "warpgateOpenBrowser": "브라우저에서 열기", - "warpgateContinue": "인증 완료", - "opksshAuthRequired": "OPKSSH 인증이 필요합니다", - "opksshAuthDescription": "계속하려면 브라우저에서 인증을 완료하세요. 이 세션은 24시간 동안 유효합니다.", - "opksshOpenBrowser": "인증하려면 브라우저를 여세요", - "opksshWaitingForAuth": "브라우저에서 인증을 기다리는 중...", - "opksshAuthenticating": "인증 처리 중...", - "opksshTimeout": "인증 시간이 초과되었습니다. 다시 시도해 주세요.", - "opksshAuthFailed": "인증에 실패했습니다. 자격 증명을 확인하고 다시 시도해 주세요.", - "opksshSignInWith": "{{provider}}로 로그인", - "sudoPasswordPopupTitle": "비밀번호를 입력할까요?", - "websocketAbnormalClose": "연결이 예기치 않게 종료되었습니다. 리버스 프록시 또는 SSL 구성 문제 때문일 수 있습니다. 서버 로그를 확인하세요.", - "connectionLogTitle": "연결 로그", - "connectionLogCopy": "로그를 클립보드에 복사", - "connectionLogEmpty": "아직 연결 로그가 없습니다.", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "열려 있는", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "연결 로그를 기다리는 중...", - "connectionLogCopied": "연결 로그가 클립보드에 복사되었습니다.", - "connectionLogCopyFailed": "로그를 클립보드에 복사하는 데 실패했습니다.", - "connectionRejected": "서버에서 연결이 거부되었습니다. 인증 및 네트워크 구성을 확인하세요.", - "hostKeyRejected": "SSH 호스트 키 인증이 거부되었습니다. 연결이 취소되었습니다.", - "sessionTakenOver": "세션이 다른 탭에서 열려 있습니다. 다시 연결 중..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "분할 탭", + "addToSplit": "분할에 추가", + "removeFromSplit": "분할에서 제거" + } }, "fileManager": { - "noHostSelected": "호스트가 선택되지 않았습니다.", + "noHostSelected": "No host selected", "initializingEditor": "편집기 초기화 중...", - "file": "파일", - "folder": "폴더", - "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": "이름 변경", - "uploading": "업로드 중...", - "uploadingFile": "{{name}} 업로드 중...", - "fileName": "파일 이름", - "folderName": "폴더 이름", - "fileUploadedSuccessfully": "파일 \"{{name}}\"이 업로드되었습니다.", - "failedToUploadFile": "파일 업로드에 실패했습니다", - "fileDownloadedSuccessfully": "파일 \"{{name}}\"이 다운로드되었습니다.", - "failedToDownloadFile": "파일 다운로드에 실패했습니다", - "fileCreatedSuccessfully": "파일 \"{{name}}\"이 생성되었습니다.", - "folderCreatedSuccessfully": "폴더 \"{{name}}\"이 생성되었습니다.", - "failedToCreateItem": "아이템 생성에 실패했습니다", - "operationFailed": "{{name}}의 {{operation}} 작업에 실패했습니다: {{error}}", - "failedToResolveSymlink": "심볼릭 링크를 해결할 수 없습니다.", - "itemsDeletedSuccessfully": "항목 {{count}}개가 삭제되었습니다.", - "failedToDeleteItems": "항목 삭제에 실패했습니다", - "sudoPasswordRequired": "관리자 비밀번호가 필요합니다", - "enterSudoPassword": "이 작업을 계속하려면 sudo 비밀번호를 입력하세요.", - "sudoPassword": "Sudo 비밀번호", - "sudoOperationFailed": "sudo 작업이 실패했습니다.", - "sudoAuthFailed": "Sudo 인증에 실패했습니다.", - "dragFilesToUpload": "파일을 여기에 드롭하여 업로드하세요", - "emptyFolder": "이 폴더는 비어 있습니다", - "searchFiles": "파일을 검색하세요...", - "upload": "업로드", - "selectHostToStart": "파일 관리를 시작할 호스트를 선택하세요.", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "파일 관리자는 SSH를 필요로 합니다. 이 호스트는 SSH가 활성화되어 있지 않습니다.", - "failedToConnect": "SSH 연결에 실패했습니다.", - "failedToLoadDirectory": "디렉터리를 불러오는 데 실패했습니다.", - "noSSHConnection": "SSH 연결을 사용할 수 없습니다.", - "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}}을(를) 정말로 삭제하시겠습니까?", - "permissionDenied": "권한이 거부되었습니다", - "serverError": "서버 오류", - "fileSavedSuccessfully": "파일이 저장되었습니다.", - "failedToSaveFile": "파일 저장에 실패했습니다", - "confirmDeleteSingleItem": "\"{{name}}\"을 영구적으로 삭제하시겠습니까?", - "confirmDeleteMultipleItems": "{{count}}개 항목을 영구적으로 삭제하시겠습니까?", - "confirmDeleteMultipleItemsWithFolders": "{{count}}개 항목을 영구적으로 삭제하시겠습니까? 폴더와 그 내용이 모두 포함됩니다.", - "confirmDeleteFolder": "폴더 \"{{name}}\"와 그 안의 모든 내용을 영구적으로 삭제하시겠습니까?", - "permanentDeleteWarning": "이 작업은 되돌릴 수 없습니다. 해당 항목은 서버에서 영구적으로 삭제됩니다.", - "recent": "최근의", - "pinned": "고정됨", - "folderShortcuts": "폴더 바로가기", - "failedToReconnectSSH": "SSH 세션 재연결에 실패했습니다.", - "openTerminalHere": "여기에서 터미널 열기", - "run": "실행", - "openTerminalInFolder": "이 폴더에서 터미널을 엽니다.", - "openTerminalInFileLocation": "해당 파일 위치에서 터미널을 엽니다.", - "runningFile": "실행 중 - {{file}}", - "onlyRunExecutableFiles": "실행 파일만 실행할 수 있습니다.", - "directories": "디렉터리", - "removedFromRecentFiles": "최근 파일에서 \"{{name}}\"을(를) 제거했습니다.", - "removeFailed": "제거 실패", - "unpinnedSuccessfully": "\"{{name}}\" 고정이 해제되었습니다.", - "unpinFailed": "핀 해제 실패", - "removedShortcut": "바로가기 \"{{name}}\"을(를) 제거했습니다.", - "removeShortcutFailed": "바로가기 제거 실패", - "clearedAllRecentFiles": "최근 파일을 모두 삭제했습니다.", - "clearFailed": "지우기 실패", - "removeFromRecentFiles": "최근 파일에서 삭제", - "clearAllRecentFiles": "최근 파일을 모두 삭제합니다.", - "unpinFile": "파일 고정 해제", - "removeShortcut": "바로가기 제거", - "pinFile": "파일 고정", - "addToShortcuts": "바로가기에 추가", - "pasteFailed": "붙여넣기 실패", - "noUndoableActions": "되돌릴 수 없는 작업", - "undoCopySuccess": "복사 작업 실행 취소 완료: 복사된 파일 {{count}}개를 삭제했습니다.", - "undoCopyFailedDelete": "실행 취소 실패: 복사된 파일을 삭제할 수 없습니다.", - "undoCopyFailedNoInfo": "실행 취소 실패: 복사된 파일 정보를 찾을 수 없습니다.", - "undoMoveSuccess": "이동 작업 실행 취소 완료: 파일 {{count}}개를 원래 위치로 되돌렸습니다.", - "undoMoveFailedMove": "실행 취소 실패: 파일을 되돌릴 수 없습니다.", - "undoMoveFailedNoInfo": "실행 취소 실패: 이동된 파일 정보를 찾을 수 없습니다.", - "undoDeleteNotSupported": "삭제 작업은 되돌릴 수 없습니다. 파일이 서버에서 영구적으로 삭제되었습니다.", - "undoTypeNotSupported": "지원되지 않는 실행 취소 작업 유형", - "undoOperationFailed": "실행 취소 작업이 실패했습니다.", - "unknownError": "알 수 없는 오류", - "confirm": "확인", - "find": "찾기...", - "replace": "바꾸기", - "downloadInstead": "대신 다운로드", - "keyboardShortcuts": "키보드 단축키", - "searchAndReplace": "검색 및 바꾸기", - "editing": "편집", - "search": "검색", - "findNext": "다음 찾기", - "findPrevious": "이전 찾기", - "save": "저장", - "selectAll": "모두 선택", - "undo": "실행 취소", - "redo": "다시 실행", - "moveLineUp": "줄을 위로 이동", - "moveLineDown": "줄을 아래로 이동", - "toggleComment": "주석 토글", - "autoComplete": "자동 완성", - "imageLoadError": "이미지를 불러오는 데 실패했습니다.", - "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": "새 폴더", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "항목 {{count}}개를 {{target}}(으)로 이동했습니다.", - "move": "이동", - "searchInFile": "파일에서 검색(Ctrl+F)", - "showKeyboardShortcuts": "키보드 단축키 표시", - "startWritingMarkdown": "마크다운 콘텐츠 작성을 시작하세요...", - "loadingFileComparison": "파일 비교 불러오는 중...", - "reload": "다시 불러오기", - "compare": "비교", - "sideBySide": "나란히", - "inline": "인라인", - "fileComparison": "파일 비교: {{file1}} vs {{file2}}", - "fileTooLarge": "파일 크기가 너무 큽니다: {{error}}", - "sshConnectionFailed": "SSH 연결에 실패했습니다. {{name}}({{ip}}:{{port}}) 연결을 확인하세요.", - "loadFileFailed": "파일을 불러오지 못했습니다: {{error}}", - "connecting": "연결 중...", - "connectedSuccessfully": "연결되었습니다", - "totpVerificationFailed": "TOTP 인증 실패", - "warpgateVerificationFailed": "Warpgate 인증 실패", - "authenticationFailed": "인증 실패", - "verificationCodePrompt": "인증 코드:", - "changePermissions": "권한 변경", - "currentPermissions": "현재 권한", - "owner": "소유자", - "group": "그룹", - "others": "기타", - "read": "읽기", - "write": "쓰기", - "execute": "실행", - "permissionsChangedSuccessfully": "권한이 변경되었습니다.", - "failedToChangePermissions": "권한 변경에 실패했습니다", - "name": "이름", - "sortByName": "이름", - "sortByDate": "수정일", - "sortBySize": "크기", - "ascending": "오름차순", - "descending": "내림차순", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "뿌리", "new": "새로운", "sortBy": "정렬 기준", @@ -1139,20 +1335,20 @@ "editor": "편집자", "octal": "8진수", "storage": "저장", - "disk": "디스크", - "used": "사용된", - "of": "~의", - "toggleSidebar": "사이드바 토글", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "PDF 파일을 불러올 수 없습니다.", "pdfLoadError": "PDF 파일을 불러오는 중 오류가 발생했습니다.", "loadingPdf": "PDF 파일을 불러오는 중...", "loadingPage": "페이지를 불러오는 중..." }, "transfer": { - "copyToHost": "호스트에 복사…", - "moveToHost": "호스트…로 이동", - "copyItemsToHost": "{{count}} 항목을… 호스트로 복사합니다.", - "moveItemsToHost": "{{count}} 항목을 호스트…로 이동합니다.", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "다른 파일 관리자 호스트를 사용할 수 없습니다.", "noHostsConnectedHint": "호스트 관리자에서 파일 관리자가 활성화된 SSH 호스트를 하나 더 추가하세요.", "selectDestinationHost": "대상 호스트를 선택하세요", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "최근 방문지 펼치기", "browseFolders": "대상 폴더를 찾아보세요", "browseDestination": "경로를 찾아보거나 입력하세요.", - "confirmCopy": "복사", - "confirmMove": "이동하다", - "transferring": "… 전송 중", - "compressing": "… 압축 중", - "extracting": "… 추출 중", - "transferringItems": "{{current}} 개의 {{total}} 개 항목을…로 전송 중", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "이체 완료", "transferError": "전송 실패", - "transferPartial": "전송이 완료되었지만 {{count}} 개의 오류가 발생했습니다.", - "transferPartialHint": "전송할 수 없습니다: {{paths}}", - "itemsSummary": "{{count}} 항목", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "대상은 여러 항목을 전송하기 위한 디렉토리여야 합니다.", "selectThisFolder": "이 폴더를 선택하세요", "browsePathWillBeCreated": "이 폴더는 아직 존재하지 않습니다. 전송이 시작되면 생성됩니다.", "browsePathError": "대상 호스트에서 이 경로를 열 수 없습니다.", "goUp": "위로 올라가세요", - "copyFolderToHost": "폴더를 호스트로 복사하세요…", - "moveFolderToHost": "폴더를 호스트로 이동…", - "hostReady": "준비가 된", - "hostConnecting": "… 연결 중", - "hostDisconnected": "연결되지 않음", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "인증이 필요합니다. 먼저 이 호스트에서 파일 관리자를 여세요.", - "hostConnectionFailed": "연결 실패", + "hostConnectionFailed": "Connection failed", "metricsTitle": "이체 시간", - "metricsPrepare": "목적지 준비: {{duration}}", - "metricsCompress": "원본에서 압축: {{duration}}", - "metricsHopSourceRead": "출처 → 서버: {{throughput}}", - "metricsHopDestSftpWrite": "서버 → 대상(SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "서버 → 대상(로컬): {{throughput}}", - "metricsTransfer": "종단 간: {{throughput}} ({{duration}})", - "metricsExtract": "목적지에서 추출: {{duration}}", - "metricsSourceDelete": "원본에서 제거: {{duration}}", - "metricsTotal": "총계: {{duration}}", - "progressCompressing": "소스 호스트…에서 압축 중", - "progressExtracting": "대상…에서 추출 중", - "progressTransferring": "데이터 전송 중…", - "progressReconnecting": "… 다시 연결 중", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "평행 환승 차선", - "parallelSegmentsOption": "{{count}} 차선", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "대용량 파일은 256MB 단위로 분할됩니다. 여러 레인을 사용하는 경우 (여러 전송을 동시에 시작하는 것처럼) 별도의 연결을 사용하여 전체 처리량을 높입니다.", - "progressTotalSpeed": "{{speed}} 총 ({{lanes}} 차선)", - "progressTransferringItems": "파일 전송 중 ({{current}} of {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} 파일", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "원본 파일은 보존되었습니다 (부분 전송).", "jumpHostLimitation": "두 호스트 모두 Termix 서버에서 접근 가능해야 합니다. 호스트 간 직접 라우팅은 지원되지 않습니다.", - "cancel": "취소", + "cancel": "Cancel", "methodLabel": "전송 방법", "methodAuto": "자동", "methodTar": "타르 아카이브", @@ -1216,25 +1412,25 @@ "methodAutoHint": "파일 개수, 크기 및 압축률에 따라 tar 또는 파일별 SFTP 전송 방식을 선택합니다. 단일 파일의 경우 항상 스트리밍 SFTP를 사용합니다.", "methodTarHint": "원본에서 압축하고, 하나의 아카이브로 전송한 후, 대상에서 압축을 해제합니다. 양쪽 Unix 호스트 모두에 tar 명령어가 필요합니다.", "methodItemSftpHint": "SFTP를 통해 각 파일을 개별적으로 전송합니다. Windows를 포함한 모든 호스트에서 작동합니다.", - "methodPreviewLoading": "전송 방법 계산 중…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "전송 방법을 미리 볼 수 없습니다. 서버에서 전송을 시작하면 자동으로 방법을 선택합니다.", "methodPreviewWillUseTar": "사용 대상: Tar 아카이브", "methodPreviewWillUseItemSftp": "사용 방식: 파일별 SFTP", - "methodPreviewScanSummary": "{{fileCount}} 개 파일, {{totalSize}} 개 총계(소스 호스트에서 스캔됨).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "각 파일은 동일한 SFTP 스트림을 사용하여 단일 파일 복사 방식으로 순차적으로 처리됩니다. 모든 파일의 진행 상황이 합산되므로 파일 크기가 클수록 진행률 표시줄이 느리게 움직입니다.", "methodReason": { "user_item_sftp": "파일별 SFTP를 선택하셨습니다.", "user_tar": "tar 압축 파일을 선택하셨습니다.", "tar_unavailable": "두 호스트 중 하나 또는 둘 모두에서 Tar를 사용할 수 없습니다. 대신 파일별 SFTP가 사용됩니다.", "windows_host": "Windows 호스트가 관련되어 있으며, tar는 사용되지 않습니다.", - "auto_multi_large": "자동: 압축 가능한 데이터가 포함된 대용량 파일({{largestSize}})을 비롯한 여러 파일 - tar 번들을 하나의 전송으로 묶습니다.", - "auto_single_large_in_archive": "자동: 이 세트에 하나의 큰 파일({{largestSize}})이 있습니다. 파일별 SFTP입니다.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "자동: 대부분 압축 불가능한 데이터 — 파일별 SFTP.", - "auto_many_files": "자동: 많은 파일({{fileCount}}) — tar는 파일당 오버헤드를 줄입니다.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "자동: 이 세트에 대해 파일별 SFTP를 설정합니다." }, - "progressCancel": "취소", - "progressCancelling": "… 취소 중", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "정체됨", "resumedHint": "다른 창에서 시작된 활성 전송에 다시 연결되었습니다.", "transferCancelled": "이적 취소됨", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "일부 불완전한 파일이 삭제되지 않았습니다.", "cleanupDestFilesNothing": "목적지에는 청소할 것이 아무것도 없습니다.", "cleanupDestFilesError": "정리 실패", - "retryTransfer": "다시 해 보다", + "retryTransfer": "Retry", "retryTransferError": "재시도 실패", "transferFailedRetryHint": "대상에 일부 데이터가 남아 있습니다. 연결이 복구되면 재시도가 재개됩니다." }, "tunnels": { - "noSshTunnels": "SSH 터널 없음", - "createFirstTunnelMessage": "아직 SSH 터널을 생성하지 않았습니다. 시작하려면 호스트 관리자에서 터널 연결을 구성하세요.", - "connected": "연결됨", - "disconnected": "연결이 끊어졌습니다", - "connecting": "연결 중...", - "error": "오류", - "canceling": "취소 중...", - "connect": "연결", - "disconnect": "연결을 끊으세요", - "cancel": "취소", - "port": "포트", - "localPort": "로컬 포트", - "remotePort": "원격 포트", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "현재 호스트 포트", - "endpointPort": "엔드포인트 포트", + "endpointPort": "Endpoint Port", "bindIp": "로컬 IP", - "endpointSshConfig": "엔드포인트 SSH 구성", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "엔드포인트 SSH 호스트", "endpointSshHostPlaceholder": "구성된 호스트를 선택하세요", "endpointSshHostRequired": "각 클라이언트 터널에 대해 엔드포인트 SSH 호스트를 선택하십시오.", - "attempt": "{{max}}회 중 {{current}}번째 시도", - "nextRetryIn": "{{seconds}}초 후 다시 시도", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "클라이언트 터널", "clientTunnel": "클라이언트 터널", "addClientTunnel": "클라이언트 터널 추가", "noClientTunnels": "이 데스크톱에는 클라이언트 터널이 구성되어 있지 않습니다.", - "tunnelName": "터널 이름", - "remoteHost": "원격 호스트", - "autoStart": "자동 시작", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "이 데스크톱 클라이언트가 실행될 때 시작되어 연결 상태를 유지합니다.", "clientManualStartDesc": "이 행의 시작 및 정지 버튼을 사용하십시오. Termix는 자동으로 열지 않습니다.", "clientRemoteServerNote": "원격 포트 포워딩을 사용하려면 엔드포인트 SSH 서버에서 AllowTcpForwarding 및 GatewayPorts 설정이 필요할 수 있습니다. 이 데스크톱 연결이 끊어지면 원격 포트가 닫힙니다.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "원격 포트는 1에서 65535 사이여야 합니다.", "invalidLocalTargetPort": "로컬 대상 포트는 1에서 65535 사이여야 합니다.", "invalidEndpointPort": "엔드포인트 포트는 1에서 65535 사이여야 합니다.", - "duplicateAutoStartBind": "{{bind}}를 사용할 수 있는 자동 시작 클라이언트 터널은 하나뿐입니다.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "터널 상태 업데이트에 실패했습니다.", - "active": "활성", - "start": "시작", - "stop": "중지", - "test": "시험", - "type": "터널형", - "typeLocal": "로컬(-L)", - "typeRemote": "원격(-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "동적(-D)", "typeServerLocalDesc": "현재 호스트에서 엔드포인트까지.", "typeServerRemoteDesc": "엔드포인트에서 현재 호스트로 돌아갑니다.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "엔드포인트에서 로컬 컴퓨터로의 복귀.", "typeClientDynamicDesc": "로컬 컴퓨터에 있는 양말.", "typeDynamicDesc": "SOCKS5 CONNECT 트래픽을 SSH를 통해 전달합니다.", - "forwardDescriptionServerLocal": "현재 호스트 {{sourcePort}} → 엔드포인트 {{endpointPort}}.", - "forwardDescriptionServerRemote": "엔드포인트 {{endpointPort}} → 현재 호스트 {{sourcePort}}.", - "forwardDescriptionServerDynamic": "현재 호스트 {{sourcePort}}의 SOCKS.", - "forwardDescriptionClientLocal": "로컬 {{sourcePort}} → 원격 {{endpointPort}}.", - "forwardDescriptionClientRemote": "원격 {{sourcePort}} → 로컬 {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS는 로컬 포트 {{sourcePort}}에 있습니다.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → 양말 (SOCKS) via {{endpoint}}", - "autoNameClientLocal": "로컬 {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → 로컬 {{localPort}}", - "autoNameClientDynamic": "양말 {{localPort}} 을 통해 {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "노선:", "lastStarted": "마지막으로 시작함", "lastTested": "최근 테스트 완료", "lastError": "마지막 오류", - "maxRetries": "최대 재시도 횟수", + "maxRetries": "Max Retries", "maxRetriesDescription": "최대 재시도 횟수.", - "retryInterval": "재시도 간격(초)", - "retryIntervalDescription": "재시도 시도 간 대기 시간.", - "local": "로컬", - "remote": "원격", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "목적지", "host": "주인", "mode": "방법", - "noHostSelected": "호스트가 선택되지 않았습니다.", + "noHostSelected": "No host selected", "working": "일하고 있는..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "메모리", - "disk": "디스크", - "network": "네트워크", - "uptime": "가동 시간", - "processes": "프로세스", - "available": "사용 가능", - "free": "여유", - "connecting": "연결 중...", - "connectionFailed": "서버 연결에 실패했습니다.", - "naCpus": "CPU 해당 없음", - "cpuCores_one": "{{count}} 코어", - "cpuCores_other": "{{count}} 코어", - "cpuUsage": "CPU 사용량", - "memoryUsage": "메모리 사용량", - "diskUsage": "디스크 사용량", - "failedToFetchHostConfig": "호스트 구성을 가져오는 데 실패했습니다.", - "serverOffline": "서버 오프라인", - "cannotFetchMetrics": "오프라인 서버에서 메트릭을 가져올 수 없습니다.", - "totpFailed": "TOTP 인증 실패", - "noneAuthNotSupported": "서버 통계는 '없음' 인증 유형을 지원하지 않습니다.", - "load": "부하", - "systemInfo": "시스템 정보", - "hostname": "호스트 이름", - "operatingSystem": "운영 체제", - "kernel": "커널", - "seconds": "초", - "networkInterfaces": "네트워크 인터페이스", - "noInterfacesFound": "네트워크 인터페이스를 찾을 수 없습니다.", - "noProcessesFound": "프로세스를 찾을 수 없습니다.", - "loginStats": "SSH 로그인 통계", - "noRecentLoginData": "최근 로그인 데이터가 없습니다.", - "executingQuickAction": "{{name}} 실행 중...", - "quickActionSuccess": "{{name}}이(가) 완료되었습니다.", - "quickActionFailed": "{{name}} 실패", - "quickActionError": "{{name}} 실행에 실패했습니다.", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "수신 포트", - "protocol": "프로토콜", - "port": "포트", - "address": "주소", - "process": "프로세스", - "noData": "수신 포트 데이터 없음" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "모두", + "noData": "No listening ports data" }, "firewall": { - "title": "방화벽", - "inactive": "비활성화됨", - "policy": "정책", - "rules": "규칙", - "noData": "방화벽 데이터가 없습니다.", - "action": "동작", - "protocol": "프로토콜", - "port": "포트", - "source": "소스", - "anywhere": "모든 위치" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "평균 부하", "swap": "교환", "architecture": "건축학", - "refresh": "새로 고치다", - "retry": "다시 해 보다" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "일하고 있는...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "자체 호스팅 SSH 및 원격 데스크톱 관리", - "loginTitle": "Termix에 로그인하세요", - "registerTitle": "계정 생성", - "forgotPassword": "비밀번호를 잊으셨나요?", - "rememberMe": "30일 동안 기기 정보를 기억해 두세요 (TOTP 포함).", - "noAccount": "계정이 없으신가요?", - "hasAccount": "이미 계정이 있으신가요?", - "twoFactorAuth": "2단계 인증", - "enterCode": "인증 코드를 입력하세요", - "backupCode": "또는 백업 코드를 사용하세요.", - "verifyCode": "코드 확인", - "redirectingToApp": "앱으로 리디렉션 중...", - "sshAuthenticationRequired": "SSH 인증이 필요합니다", - "sshNoKeyboardInteractive": "키보드 기반 인증을 사용할 수 없습니다.", - "sshAuthenticationFailed": "인증 실패", - "sshAuthenticationTimeout": "인증 시간 초과", - "sshNoKeyboardInteractiveDescription": "서버는 키보드 입력 방식의 인증을 지원하지 않습니다. 비밀번호 또는 SSH 키를 입력해 주세요.", - "sshAuthFailedDescription": "입력하신 정보가 올바르지 않습니다. 유효한 정보를 입력하여 다시 시도해 주세요.", - "sshTimeoutDescription": "인증 시도 시간이 초과되었습니다. 다시 시도해 주세요.", - "sshProvideCredentialsDescription": "이 서버에 연결하려면 SSH 자격 증명을 입력하세요.", - "sshPasswordDescription": "이 SSH 연결에 사용할 비밀번호를 입력하세요.", - "sshKeyPasswordDescription": "SSH 키가 암호화되어 있으면 여기에 암호를 입력하세요.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "암호문이 필요합니다", "passphraseRequiredDescription": "SSH 키가 암호화되어 있습니다. 키를 해제하려면 암호를 입력하십시오.", - "back": "뒤로", - "firstUser": "첫 번째 사용자", - "firstUserMessage": "첫 번째 사용자이므로 관리자 권한이 부여됩니다. 관리자 설정은 사이드바의 사용자 드롭다운 메뉴에서 확인할 수 있습니다. 오류라고 생각되면 Docker 로그를 확인하거나 GitHub 이슈를 생성해 주세요.", - "external": "외부", - "loginWithExternal": "외부 제공업체로 로그인", - "loginWithExternalDesc": "구성된 외부 ID 공급자를 사용하여 로그인하세요.", - "externalNotSupportedInElectron": "Electron 앱에서는 아직 외부 인증이 지원되지 않습니다. OIDC 로그인을 위해서는 웹 버전을 이용해 주세요.", - "resetPasswordButton": "비밀번호 재설정", - "sendResetCode": "재설정 코드 전송", - "resetCodeDesc": "사용자 이름을 입력하여 비밀번호 재설정 코드를 받으세요. 코드는 Docker 컨테이너 로그에 기록됩니다.", - "resetCode": "재설정 코드", - "verifyCodeButton": "코드 확인", - "enterResetCode": "사용자의 Docker 컨테이너 로그에 있는 6자리 코드를 입력하세요:", - "newPassword": "새 비밀번호", - "confirmNewPassword": "비밀번호 확인", - "enterNewPassword": "사용자 계정의 새 비밀번호를 입력하세요:", - "signUp": "회원가입", - "desktopApp": "데스크톱 앱", - "loggingInToDesktopApp": "데스크톱 앱에 로그인하기", - "loadingServer": "서버 불러오는 중...", - "dataLossWarning": "이 방식으로 비밀번호를 재설정하면 저장된 모든 SSH 호스트, 자격 증명 및 기타 암호화된 데이터가 삭제됩니다. 이 작업은 되돌릴 수 없습니다. 비밀번호를 잊어버렸고 로그인되어 있지 않은 경우에만 사용하세요.", - "authenticationDisabled": "인증 비활성화됨", - "authenticationDisabledDesc": "현재 모든 인증 방식이 비활성화되어 있습니다. 관리자에게 문의하세요.", - "attemptsRemaining": "남은 시도 횟수 {{count}} 회" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSH 호스트 키 확인", - "keyChangedWarning": "SSH 호스트 키가 변경되었습니다.", - "firstConnectionTitle": "이 호스트에 처음 연결합니다.", - "firstConnectionDescription": "이 호스트의 신뢰성을 확인할 수 없습니다. 지문이 예상한 값과 일치하는지 확인하세요.", - "keyChangedDescription": "이 서버의 호스트 키가 마지막 접속 이후 변경되었습니다. 이는 보안 문제를 나타낼 수 있습니다.", - "previousKey": "이전 키", - "newFingerprint": "새 지문", - "fingerprint": "지문", - "verifyInstructions": "이 호스트를 신뢰한다면 '수락'을 클릭하여 계속 진행하고 향후 연결을 위해 이 지문을 저장하세요.", - "securityWarning": "보안 경고", - "acceptAndContinue": "수락 및 계속", - "acceptNewKey": "새 키를 수락하고 계속 진행하세요" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "데이터베이스에 연결할 수 없습니다.", - "unknownError": "알 수 없는 오류", - "loginFailed": "로그인 실패", - "failedPasswordReset": "비밀번호 재설정을 시작하는 데 실패했습니다.", - "failedVerifyCode": "재설정 코드 확인에 실패했습니다.", - "failedCompleteReset": "비밀번호 재설정을 완료하지 못했습니다.", - "invalidTotpCode": "잘못된 TOTP 코드", - "failedOidcLogin": "OIDC 로그인 시작에 실패했습니다.", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "자동 로그인 요청이 있었지만 OIDC 로그인이 불가능합니다.", "failedUserInfo": "로그인 후 사용자 정보를 가져오는 데 실패했습니다.", - "oidcAuthFailed": "OIDC 인증에 실패했습니다.", - "invalidAuthUrl": "백엔드에서 잘못된 인증 URL을 수신했습니다.", - "requiredField": "이 항목은 필수 입력 사항입니다.", - "minLength": "최소 길이는 {{min}}입니다.", - "passwordMismatch": "비밀번호가 일치하지 않습니다", - "passwordLoginDisabled": "현재 사용자 이름/비밀번호 로그인 기능이 비활성화되어 있습니다.", - "sessionExpired": "세션이 만료되었습니다. 다시 로그인해 주세요.", - "totpRateLimited": "시도 횟수 제한: TOTP 인증 시도 횟수가 너무 많습니다. 나중에 다시 시도해 주세요.", - "totpRateLimitedWithTime": "시도 횟수 제한: TOTP 인증 시도 횟수가 너무 많습니다. 다시 시도하기 전에 {{time}} 초 동안 기다려 주세요.", - "resetCodeRateLimited": "시도 횟수 제한: 인증 시도 횟수가 너무 많습니다. 나중에 다시 시도해 주세요.", - "resetCodeRateLimitedWithTime": "시도 횟수 제한: 인증 시도 횟수가 너무 많습니다. 다시 시도하기 전에 {{time}} 초 동안 기다려 주세요.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "인증 토큰 저장에 실패했습니다.", "failedToLoadServer": "서버 로드 실패" }, "messages": { - "registrationDisabled": "관리자에 의해 신규 계정 등록이 현재 비활성화되었습니다. 로그인하시거나 관리자에게 문의해 주세요.", - "userNotAllowed": "이 계정은 등록 권한이 없습니다. 관리자에게 문의하세요.", - "databaseConnectionFailed": "데이터베이스 서버에 연결하지 못했습니다.", - "resetCodeSent": "Docker 로그에 전송된 재설정 코드", - "codeVerified": "코드 검증이 완료되었습니다.", - "passwordResetSuccess": "비밀번호 재설정 성공", - "loginSuccess": "로그인 성공", - "registrationSuccess": "등록 완료" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "구성된 SSH 호스트를 대상으로 하는 로컬 데스크톱 터널.", "c2sTunnelPresets": "클라이언트 터널 사전 설정", "c2sTunnelPresetsDesc": "이 데스크톱 클라이언트의 로컬 터널 목록을 명명된 서버 사전 설정으로 저장하거나, 사전 설정을 이 클라이언트로 다시 불러옵니다.", "c2sTunnelPresetsUnavailable": "클라이언트 터널 사전 설정은 데스크톱 클라이언트에서만 사용할 수 있습니다.", - "c2sPresetName": "사전 설정 이름", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "클라이언트 사전 설정 이름", "c2sPresetToLoad": "미리 설정하여 로드", "c2sNoPresetSelected": "선택된 사전 설정이 없습니다.", "c2sNoPresets": "저장된 프리셋이 없습니다.", - "c2sLoadPreset": "짐", - "c2sCurrentLocalConfig": "이 데스크톱에 {{count}} 로컬 클라이언트 터널이 구성되었습니다.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "사전 설정은 명시적인 스냅샷입니다. 사전 설정을 로드하면 이 데스크톱 클라이언트의 로컬 클라이언트 터널 목록이 대체됩니다.", "c2sPresetSaved": "클라이언트 터널 사전 설정이 저장되었습니다.", "c2sPresetLoaded": "클라이언트 터널 사전 설정이 로컬에 로드됨", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "언어", - "keyPassword": "키 비밀번호", - "pastePrivateKey": "여기에 개인 키를 붙여넣으세요...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (현지에서 청취)", "localTargetHost": "127.0.0.1 (이 컴퓨터의 대상 주소)", "socksListenerHost": "127.0.0.1 (SOCKS 리스너)", - "enterPassword": "비밀번호를 입력하세요", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "대시보드", - "loading": "대시보드를 불러오는 중...", - "github": "깃허브", - "support": "문의하기", - "discord": "디스코드", - "serverOverview": "서버 개요", - "version": "버전", - "upToDate": "최신 상태", - "updateAvailable": "업데이트 가능", + "title": "Dashboard", + "loading": "Loading dashboard...", + "github": "GitHub", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "베타", - "uptime": "가동 시간", - "database": "데이터베이스", - "healthy": "정상", - "error": "오류", - "totalHosts": "전체 호스트", - "totalTunnels": "전체 터널", - "totalCredentials": "총 자격 증명", - "recentActivity": "최근 활동", - "reset": "초기화", - "loadingRecentActivity": "최근 활동 불러오는 중...", - "noRecentActivity": "최근 활동 없음", - "quickActions": "빠른 실행", - "addHost": "호스트 추가", - "addCredential": "자격 증명 추가", - "adminSettings": "관리자 설정", - "userProfile": "사용자 프로필", - "serverStats": "서버 통계", - "loadingServerStats": "서버 통계 불러오는 중...", - "noServerData": "서버 데이터가 없습니다.", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "대시보드 맞춤 설정", - "dashboardSettings": "대시보드 설정", - "enableDisableCards": "카드 활성화/비활성화", - "resetLayout": "기본값으로 재설정", - "serverOverviewCard": "서버 개요", - "recentActivityCard": "최근 활동", - "networkGraphCard": "네트워크 그래프", - "networkGraph": "네트워크 그래프", - "quickActionsCard": "빠른 조치", - "serverStatsCard": "서버 통계", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "기본", "panelSide": "옆", - "justNow": "방금" + "justNow": "방금", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "안정적인", @@ -1590,95 +1890,122 @@ "noHostsConfigured": "구성된 호스트가 없습니다.", "online": "온라인", "offline": "오프라인", - "onlineLower": "온라인", - "nodes": "{{count}} 노드", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "추가하다:", "commandPalette": "커맨드 팔레트", "done": "완료", "editModeInstructions": "카드를 드래그하여 순서를 변경하세요. 열 구분선을 드래그하여 열 크기를 조정하세요. 카드의 아래쪽 가장자리를 드래그하여 높이를 조정하세요. 휴지통을 클릭하여 삭제하세요.", "empty": "비어 있는", - "clear": "분명한" + "clear": "분명한", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "호스트 추가", - "addGroup": "그룹 추가", - "addLink": "링크 추가", - "zoomIn": "확대", - "zoomOut": "축소", - "resetView": "보기 재설정", - "selectHost": "호스트를 선택하세요", - "chooseHost": "호스트를 선택하세요...", - "parentGroup": "상위 그룹", - "noGroup": "그룹 없음", - "groupName": "그룹 이름", - "color": "색상", - "source": "소스", - "target": "대상", - "moveToGroup": "그룹으로 이동", - "selectGroup": "그룹을 선택하세요...", - "addConnection": "연결 추가", - "hostDetails": "호스트 정보", - "removeFromGroup": "그룹에서 제거", - "addHostHere": "여기에 호스트를 추가하세요", - "editGroup": "그룹 편집", - "delete": "삭제", - "add": "추가", - "create": "생성", - "move": "이동", - "connect": "연결", - "createGroup": "그룹 생성", - "selectSourcePlaceholder": "소스 선택...", - "selectTargetPlaceholder": "대상을 선택하세요...", - "invalidFile": "잘못된 파일입니다", - "hostAlreadyExists": "호스트가 이미 토폴로지에 있습니다.", - "connectionExists": "이미 연결이 존재합니다", - "unknown": "알 수 없음", - "name": "이름", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "상태", - "failedToAddNode": "노드를 추가하는 데 실패했습니다.", - "sourceDifferentFromTarget": "소스와 대상은 서로 달라야 합니다.", - "exportJSON": "JSON 내보내기", - "importJSON": "JSON 가져오기", - "terminal": "터미널", - "fileManager": "파일 관리자", - "tunnel": "터널", - "docker": "도커", - "serverStats": "서버 통계", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "아직 노드가 없습니다." }, "docker": { - "notEnabled": "이 호스트에서는 Docker가 활성화되어 있지 않습니다.", - "validating": "Docker 유효성 검사 중...", - "connecting": "연결 중...", - "error": "오류", - "version": "도커 {{version}}", - "connectionFailed": "Docker에 연결하지 못했습니다.", - "containerStarted": "컨테이너 {{name}}이(가) 시작되었습니다.", - "failedToStartContainer": "컨테이너 {{name}} 시작에 실패했습니다.", - "containerStopped": "{{name}} 컨테이너가 중지되었습니다.", - "failedToStopContainer": "컨테이너 {{name}}을(를) 중지하는 데 실패했습니다.", - "containerRestarted": "{{name}} 컨테이너가 재시작되었습니다.", - "failedToRestartContainer": "컨테이너 {{name}} 재시작에 실패했습니다.", - "containerPaused": "{{name}} 컨테이너가 일시 중지되었습니다.", - "containerUnpaused": "{{name}} 컨테이너의 일시 중지가 해제되었습니다.", - "failedToTogglePauseContainer": "컨테이너 {{name}}의 일시 정지 상태를 전환하는 데 실패했습니다.", - "containerRemoved": "{{name}} 컨테이너가 제거되었습니다.", - "failedToRemoveContainer": "컨테이너 {{name}}을(를) 제거하는 데 실패했습니다.", - "image": "이미지", - "ports": "포트", - "noPorts": "포트 없음", - "start": "시작", - "confirmRemoveContainer": "컨테이너 \"{{name}}\"을(를) 정말로 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다.", - "runningContainerWarning": "경고: 이 컨테이너는 현재 실행 중입니다. 제거하려면 먼저 컨테이너가 중지되어야 합니다.", - "loadingContainers": "컨테이너 불러오는 중...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "도커 관리자", - "autoRefresh": "자동 새로 고침", + "autoRefresh": "Auto Refresh", "timestamps": "타임스탬프", "lines": "윤곽", - "filterLogs": "로그 필터링...", - "refresh": "새로 고치다", - "download": "다운로드", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", "clear": "분명한", "logsDownloaded": "로그 파일이 성공적으로 다운로드되었습니다.", "last50": "마지막 50개", @@ -1686,254 +2013,384 @@ "last500": "마지막 500개", "last1000": "마지막 1000개", "allLogs": "모든 로그", - "noLogsMatching": "\"{{query}} \" 와 일치하는 로그가 없습니다.", - "noLogsAvailable": "로그 파일이 없습니다.", - "noContainersFound": "컨테이너를 찾을 수 없습니다.", - "noContainersFoundHint": "이 호스트에는 사용 가능한 Docker 컨테이너가 없습니다.", - "searchPlaceholder": "컨테이너 검색...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "모든 상태", - "stateRunning": "달리기", + "stateRunning": "Running", "statePaused": "일시 중지됨", "stateExited": "나갔습니다", "stateRestarting": "재시작 중", - "noContainersMatchFilters": "필터 조건에 맞는 컨테이너가 없습니다.", - "noContainersMatchFiltersHint": "검색어 또는 필터 조건을 조정해 보세요.", - "failedToFetchStats": "컨테이너 통계를 가져오는 데 실패했습니다.", - "containerNotRunning": "컨테이너가 실행 중이 아닙니다", - "startContainerToViewStats": "컨테이너를 시작하여 통계를 확인하세요.", - "loadingStats": "통계 불러오는 중...", - "errorLoadingStats": "통계 불러오기 오류", - "noStatsAvailable": "이용 가능한 통계가 없습니다.", - "cpuUsage": "CPU 사용량", - "current": "현재", - "memoryUsage": "메모리 사용량", - "networkIo": "네트워크 I/O", - "input": "입력", - "output": "출력", - "blockIo": "블록 I/O", - "read": "읽기", - "write": "쓰기", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "컨테이너 정보", - "name": "이름", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "상태", - "containerMustBeRunning": "콘솔에 접속하려면 컨테이너가 실행 중이어야 합니다.", - "verificationCodePrompt": "인증 코드를 입력하세요", - "totpVerificationFailed": "TOTP 인증에 실패했습니다. 다시 시도해 주세요.", - "warpgateVerificationFailed": "워프게이트 인증에 실패했습니다. 다시 시도해 주세요.", - "connectedTo": "{{containerName}}에 연결됨", - "disconnected": "연결이 끊어졌습니다", - "consoleError": "콘솔 오류", - "errorMessage": "오류: {{message}}", - "failedToConnect": "컨테이너에 연결하지 못했습니다.", - "console": "콘솔", - "selectShell": "셸 선택", - "bash": "세게 때리다", - "sh": "쉿", - "ash": "금연 건강 증진 협회", - "connect": "연결", - "disconnect": "연결 끊기", - "notConnected": "연결되지 않음", - "clickToConnect": "연결을 클릭하여 셸 세션을 시작하세요.", - "connectingTo": "{{containerName}}에 연결 중...", - "containerNotFound": "컨테이너를 찾을 수 없습니다", - "backToList": "목록으로 돌아가기", - "logs": "로그", - "stats": "통계", - "consoleTab": "콘솔", - "startContainerToAccess": "콘솔에 접속하려면 컨테이너를 시작하세요." + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "일반적인", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "사용자", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "세션", - "sectionRoles": "역할", - "sectionDatabase": "데이터 베이스", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API 키", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "필터 지우기", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "모두", "allowRegistration": "사용자 등록 허용", - "allowRegistrationDesc": "신규 사용자가 직접 등록할 수 있도록 하세요", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "비밀번호 로그인 허용", "allowPasswordLoginDesc": "사용자 이름/비밀번호로 로그인", "oidcAutoProvision": "OIDC 자동 프로비저닝", - "oidcAutoProvisionDesc": "회원가입이 비활성화된 경우에도 OIDC 사용자를 위한 계정을 자동으로 생성합니다.", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "비밀번호 재설정 허용", "allowPasswordResetDesc": "Docker 로그를 통해 재설정 코드를 확인하세요.", - "sessionTimeout": "세션 시간 제한", - "hours": "시간", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "최소 1시간 · 최대 720시간", - "monitoringDefaults": "모니터링 기본 설정", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "상태 확인", - "metrics": "측정 기준", + "metrics": "Metrics", "sec": "비서", - "logLevel": "로그 수준", + "logLevel": "Log Level", "enableGuacamole": "과카몰리 활성화", "enableGuacamoleDesc": "RDP/VNC 원격 데스크톱", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "SSO를 위해 OpenID Connect를 구성하십시오. * 표시된 필드는 필수 입력 사항입니다.", - "oidcClientId": "클라이언트 ID", - "oidcClientSecret": "고객 비밀", - "oidcAuthUrl": "인증 URL", - "oidcIssuerUrl": "발급자 URL", - "oidcTokenUrl": "토큰 URL", - "oidcUserIdentifier": "사용자 식별자 경로", - "oidcDisplayName": "표시 이름 경로", - "oidcScopes": "스코프", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "사용자 정보 URL 재정의", - "oidcAllowedUsers": "허용된 사용자", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "한 줄에 이메일 하나씩 보내주세요. 모든 이메일을 수신하려면 비워 두세요.", - "removeOidc": "제거하다", - "usersCount": "{{count}} 사용자", - "createUser": "만들다", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "새로운 역할", - "roleName": "이름", - "roleDisplayName": "표시 이름", - "roleDescription": "설명", - "rolesCount": "{{count}} 역할", - "createRole": "만들다", - "creating": "생성 중...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "내보내기 데이터베이스", "exportDatabaseDesc": "모든 호스트, 자격 증명 및 설정의 백업을 다운로드하세요.", - "export": "내보내기", - "exporting": "내보내는 중...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "데이터베이스 가져오기", "importDatabaseDesc": ".sqlite 백업 파일에서 복원", - "importDatabaseSelected": "선택됨: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "파일을 선택하세요", - "changeFile": "변화", - "import": "가져오기", - "importing": "가져오는 중...", - "apiKeysCount": "{{count}} 키", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "새 API 키", "apiKeyCreatedWarning": "키가 생성되었습니다. 지금 복사하세요. 다시 표시되지 않습니다.", - "apiKeyName": "이름", - "apiKeyUser": "사용자", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "사용자를 선택하세요...", - "apiKeyExpiresAt": "만료일", + "apiKeyExpiresAt": "Expires At", "createKey": "키를 생성합니다", "apiKeyNoExpiry": "유효기간 없음", "revokedBadge": "취소됨", - "authTypeDual": "이중 인증", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "현지의", - "adminStatusAdministrator": "관리자", - "adminStatusRegularUser": "일반 사용자", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "관리자", "systemBadge": "시스템", "customBadge": "관습", "youBadge": "너", - "sessionsActive": "{{count}} 활성", - "sessionActive": "활성: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "모두", "revokeAllSessionsSuccess": "해당 사용자의 모든 세션이 취소되었습니다.", - "revokeAllSessionsFailed": "세션 취소에 실패했습니다", - "revokeSessionFailed": "세션 취소에 실패했습니다.", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "역할 추가", "noCustomRoles": "사용자 지정 역할이 정의되지 않았습니다.", - "removeRoleFailed": "역할 제거에 실패했습니다", - "assignRoleFailed": "역할 할당에 실패했습니다", - "deleteRoleFailed": "역할 삭제에 실패했습니다", - "userAdminAccess": "관리자", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "모든 관리자 설정에 대한 전체 액세스 권한", - "userRoles": "역할", - "revokeAllUserSessions": "모든 세션 취소", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "모든 기기에서 강제로 다시 로그인합니다", - "revoke": "취소", + "revoke": "Revoke", "deleteUserWarning": "이 사용자를 삭제하면 영구적으로 삭제됩니다.", - "deleteUser": "삭제 {{username}}", - "deleting": "삭제 중...", - "deleteUserFailed": "사용자 삭제에 실패했습니다", - "deleteUserSuccess": "사용자 \"{{username}}\" 삭제됨", - "deleteRoleSuccess": "역할 \"{{name}}\"이 삭제되었습니다", - "revokeKeySuccess": "키 \"{{name}}\" 취소됨", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "키 취소에 실패했습니다.", - "copiedToClipboard": "클립보드에 복사됨", + "copiedToClipboard": "Copied to clipboard", "done": "완료", - "createUserTitle": "사용자 생성", + "createUserTitle": "Create User", "createUserDesc": "새로운 로컬 계정을 만드세요.", - "createUserUsername": "사용자 이름", - "createUserPassword": "비밀번호", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "최소 6자 이상.", - "createUserEnterUsername": "사용자 이름을 입력하세요", - "createUserEnterPassword": "비밀번호를 입력하세요", - "createUserSubmit": "사용자 생성", - "editUserTitle": "사용자 관리: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "역할, 관리자 상태, 세션 및 계정 설정을 편집합니다.", - "editUserUsername": "사용자 이름", + "editUserUsername": "Username", "editUserAuthType": "인증 유형", - "editUserAdminStatus": "관리자 상태", - "editUserUserId": "사용자 ID", - "linkAccountTitle": "OIDC를 비밀번호 계정에 연결", - "linkAccountDesc": "OIDC 계정 {{username}} 을 기존 로컬 계정과 병합합니다.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "이것은 다음과 같을 것입니다:", "linkAccountEffect1": "OIDC 전용 계정을 삭제하세요", "linkAccountEffect2": "대상 계정에 OIDC 로그인을 추가합니다.", "linkAccountEffect3": "OIDC 로그인과 비밀번호 로그인 모두 허용", - "linkAccountTargetUsername": "대상 사용자 이름", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "연결할 로컬 계정 사용자 이름을 입력하세요.", - "linkAccounts": "계정 연동", - "linkAccountSuccess": "\"{{username}} \"에 연결된 OIDC 계정", - "linkAccountFailed": "OIDC 계정 연결에 실패했습니다.", - "linkAccountInProgress": "연결 중...", - "saving": "저장 중...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "등록 설정 업데이트에 실패했습니다.", "updatePasswordLoginFailed": "비밀번호 로그인 설정 업데이트에 실패했습니다.", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "OIDC 자동 프로비저닝 설정 업데이트에 실패했습니다.", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "비밀번호 재설정 설정 업데이트에 실패했습니다.", "sessionTimeoutRange2": "세션 시간 초과는 1시간에서 720시간 사이여야 합니다.", - "sessionTimeoutSaved": "세션 시간 제한이 저장되었습니다.", + "sessionTimeoutSaved": "Session timeout saved", "sessionTimeoutSaveFailed": "세션 시간 초과 저장 실패", "monitoringIntervalInvalid": "잘못된 간격 값", "monitoringSaved": "모니터링 설정이 저장되었습니다.", "monitoringSaveFailed": "모니터링 설정을 저장하는 데 실패했습니다.", - "guacamoleSaved": "과카몰리 설정이 저장되었습니다.", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "과카몰리 설정 저장에 실패했습니다.", "guacamoleUpdateFailed": "과카몰리 설정 업데이트에 실패했습니다.", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "로그 레벨 업데이트에 실패했습니다.", "oidcSaved": "OIDC 구성이 저장되었습니다.", "oidcSaveFailed": "OIDC 설정을 저장하는 데 실패했습니다.", "oidcRemoved": "OIDC 구성이 제거되었습니다.", "oidcRemoveFailed": "OIDC 설정을 제거하는 데 실패했습니다.", "createUserRequired": "사용자 이름과 비밀번호가 필요합니다.", - "createUserPasswordTooShort": "비밀번호는 최소 6자 이상이어야 합니다.", - "createUserSuccess": "사용자 \"{{username}}\"이 생성했습니다", - "createUserFailed": "사용자 생성에 실패했습니다", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "관리자 상태 업데이트에 실패했습니다.", "allSessionsRevoked": "모든 세션이 취소되었습니다", - "revokeSessionsFailed": "세션 취소에 실패했습니다", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "이름과 표시 이름은 필수 입력 사항입니다.", - "createRoleSuccess": "역할 \"{{name}}\"이 생성되었습니다", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "역할 생성에 실패했습니다", "apiKeyNameRequired": "키 이름은 필수 입력 사항입니다.", "apiKeyUserRequired": "사용자 ID가 필요합니다.", - "apiKeyCreatedSuccess": "API 키 \"{{name}}\"가 생성되었습니다", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "API 키 생성에 실패했습니다.", "exportSuccess": "데이터베이스 내보내기가 성공적으로 완료되었습니다.", "exportFailed": "데이터베이스 내보내기 실패", "importSelectFile": "먼저 파일을 선택하세요.", - "importCompleted": "가져오기 완료: {{total}} 개 항목 가져오기 완료, {{skipped}} 개 항목 건너뛰기", - "importFailed": "가져오기 실패: {{error}}", - "importError": "데이터베이스 가져오기 실패" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "데이터베이스 가져오기 실패", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "주인", - "hostPlaceholder": "192.168.1.1 또는 example.com", - "portLabel": "포트", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "사용자 이름", - "usernamePlaceholder": "사용자 이름", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "권한", - "passwordLabel": "비밀번호", - "passwordPlaceholder": "비밀번호", - "privateKeyLabel": "개인 키", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "개인 키를 붙여넣으세요...", - "credentialLabel": "신임장", + "credentialLabel": "Credential", "credentialPlaceholder": "저장된 자격 증명을 선택하세요", - "connectToTerminal": "터미널에 연결", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "파일에 연결" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "모두 지우기", "noHistoryEntries": "기록 없음", "trackingDisabled": "이용 내역 추적 기능이 비활성화되었습니다.", - "trackingDisabledHint": "명령어를 기록하려면 프로필 설정에서 해당 기능을 활성화하세요." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "주요 녹음", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "터미널에 녹음", "selectAll": "모두", - "selectNone": "없음", + "selectNone": "None", "noTerminalTabsOpen": "터미널 탭이 열려 있지 않습니다.", "selectTerminalsAbove": "위의 터미널을 선택하세요", "broadcastInputPlaceholder": "여기에 입력하여 키 입력을 전송하세요...", "stopRecording": "녹화 중지", "startRecording": "녹화 시작", - "settingsTitle": "설정", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "마우스 오른쪽 버튼을 클릭하여 복사/붙여넣기를 활성화합니다." }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "탭을 위쪽 창으로 드래그하거나 빠른 할당 기능을 사용하세요.", "dropHere": "여기에 내려놓으세요", "emptyPane": "비어 있는", - "dashboard": "계기반", + "dashboard": "Dashboard", "clearSplitScreen": "선명한 분할 화면", "quickAssign": "빠른 배정", - "alreadyAssigned": "패널 {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "분할 탭", "addToSplit": "분할에 추가", "removeFromSplit": "분할에서 제거", - "assignToPane": "창에 할당" + "assignToPane": "창에 할당", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "코드 조각 생성", - "createSnippetDescription": "빠른 실행을 위해 새로운 명령 스니펫을 만드세요.", - "nameLabel": "이름", - "namePlaceholder": "예: Nginx 재시작", - "descriptionLabel": "설명", - "descriptionPlaceholder": "선택적 설명", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", "optional": "선택 과목", - "folderLabel": "접는 사람", - "noFolder": "폴더 없음 (미분류)", - "commandLabel": "명령", - "commandPlaceholder": "예: sudo systemctl restart nginx", - "cancel": "취소", - "createSnippetButton": "코드 조각 생성", - "createFolderTitle": "폴더 생성", - "createFolderDescription": "메모들을 폴더별로 정리하세요", - "folderNameLabel": "폴더 이름", - "folderNamePlaceholder": "예: 시스템 명령, Docker 스크립트", - "folderColorLabel": "폴더 색상", - "folderIconLabel": "폴더 아이콘", - "previewLabel": "시사", - "folderNameFallback": "폴더 이름", - "createFolderButton": "폴더 생성", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "대상 터미널", "selectAll": "모두", - "selectNone": "없음", + "selectNone": "None", "noTerminalTabsOpen": "터미널 탭이 열려 있지 않습니다.", - "searchPlaceholder": "검색 스니펫...", - "newSnippet": "새로운 스니펫", - "newFolder": "새 폴더", - "run": "달리다", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "이 폴더에는 스니펫이 없습니다.", - "uncategorized": "분류되지 않음", - "editSnippetTitle": "코드 조각 편집", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "이 명령 조각을 업데이트하세요", "saveSnippetButton": "변경 사항 저장", - "createSuccess": "코드 조각이 성공적으로 생성되었습니다.", - "createFailed": "코드 조각을 생성하는 데 실패했습니다.", - "updateSuccess": "코드 조각이 성공적으로 업데이트되었습니다.", - "updateFailed": "코드 조각 업데이트에 실패했습니다.", - "deleteFailed": "코드 조각을 삭제하는 데 실패했습니다.", - "folderCreateSuccess": "폴더가 성공적으로 생성되었습니다.", - "folderCreateFailed": "폴더 생성에 실패했습니다", - "editFolderTitle": "폴더 편집", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "이 폴더의 이름을 바꾸거나 모양을 변경하세요.", "saveFolderButton": "변경 사항 저장", "editFolder": "편집 폴더", "deleteFolder": "폴더 삭제", - "folderDeleteSuccess": "폴더 \"{{name}}\"이 삭제되었습니다", - "folderDeleteFailed": "폴더 삭제에 실패했습니다", - "folderEditSuccess": "폴더가 성공적으로 업데이트되었습니다.", - "folderEditFailed": "폴더 업데이트에 실패했습니다", - "confirmRunMessage": "\"{{name}} \"를 실행하시겠습니까?", - "confirmRunButton": "달리다", - "runSuccess": "{{name}}\"을 {{count}} 터미널에서 실행했습니다.", - "copySuccess": "\"{{name}}\"를 클립보드에 복사했습니다.", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "스니펫 공유", - "shareUser": "사용자", - "shareRole": "역할", + "shareUser": "User", + "shareRole": "Role", "selectUser": "사용자를 선택하세요...", "selectRole": "역할을 선택하세요...", "shareSuccess": "스니펫이 성공적으로 공유되었습니다.", "shareFailed": "코드 조각 공유에 실패했습니다.", "revokeSuccess": "접근 권한이 취소되었습니다", - "revokeFailed": "접근 권한 취소에 실패했습니다.", - "currentAccess": "현재 액세스", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "공유 데이터 불러오기에 실패했습니다", - "loading": "로딩 중...", - "close": "닫다", - "reorderFailed": "스니펫 순서를 저장하는 데 실패했습니다." + "loading": "Loading...", + "close": "Close", + "reorderFailed": "스니펫 순서를 저장하는 데 실패했습니다.", + "importExport": "수입/수출", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "구성된 호스트가 없습니다.", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "계정", - "sectionAppearance": "모습", - "sectionSecurity": "보안", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API 키", "sectionC2sTunnels": "C2S 터널", - "usernameLabel": "사용자 이름", - "roleLabel": "역할", - "roleAdministrator": "관리자", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "인증 방식", - "authMethodLocal": "현지의", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "~에", "twoFaOff": "끄다", - "versionLabel": "버전", - "deleteAccount": "계정 삭제", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "계정을 영구적으로 삭제하세요", - "deleteButton": "삭제", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "이 조치는 영구적이며 되돌릴 수 없습니다.", "deleteAccountWarning": "모든 세션, 호스트, 자격 증명 및 설정이 영구적으로 삭제됩니다.", - "confirmPasswordDeletePlaceholder": "비밀번호를 입력하여 확인하세요.", - "languageLabel": "언어", - "themeLabel": "주제", - "fontSizeLabel": "글꼴 크기", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "포인트 색상", - "settingsTerminal": "단말기", - "commandAutocomplete": "명령어 자동 완성", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "입력하는 동안 자동 완성 기능을 표시합니다.", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "이력 추적", "historyTrackingDesc": "추적 터미널 명령", - "syntaxHighlighting": "구문 강조 표시", - "syntaxHighlightingDesc": "터미널 출력 강조 표시", "commandPalette": "커맨드 팔레트", "commandPaletteDesc": "키보드 단축키 활성화", "reopenTabsOnLogin": "로그인 시 탭 다시 열기", "reopenTabsOnLoginDesc": "로그인하거나 페이지를 새로 고칠 때, 다른 기기에서 접속하더라도 열려 있던 탭을 복원할 수 있습니다.", "confirmTabClose": "확인 탭 닫기", "confirmTabCloseDesc": "터미널 탭을 닫기 전에 먼저 확인하세요.", - "settingsSidebar": "사이드바", - "showHostTags": "호스트 태그 표시", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "호스트 목록에 태그를 표시합니다.", "hostTrayOnClick": "호스트 작업 확장하려면 클릭하세요", "hostTrayOnClickDesc": "연결 버튼을 항상 표시하고, 마우스 오버 대신 클릭하여 관리 옵션을 확장합니다.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "핀 앱 레일", "pinAppRailDesc": "왼쪽 사이드바 앱 레일을 마우스 오버 시 확장되는 대신 항상 확장된 상태로 유지합니다.", - "settingsSnippets": "짧은 발췌", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "폴더 접힘", "foldersCollapsedDesc": "기본적으로 폴더를 접습니다.", "confirmExecution": "실행 확인", "confirmExecutionDesc": "코드 조각을 실행하기 전에 확인하십시오.", - "settingsUpdates": "업데이트", + "settingsUpdates": "Updates", "disableUpdateChecks": "업데이트 확인 비활성화", "disableUpdateChecksDesc": "업데이트 확인을 중지하세요", "totpAuthenticator": "TOTP 인증기", @@ -2109,68 +2612,68 @@ "qrCode": "QR 코드", "totpInstructions": "QR 코드를 스캔하거나 인증 앱에 비밀번호를 입력한 후 6자리 코드를 입력하세요.", "totpCodePlaceholder": "000000", - "verify": "확인하다", - "changePassword": "비밀번호 변경", - "currentPasswordLabel": "현재 비밀번호", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "현재 비밀번호", - "newPasswordLabel": "새 비밀번호", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "새 비밀번호", "confirmPasswordLabel": "새 비밀번호를 확인하세요", "confirmPasswordPlaceholder": "새 비밀번호를 확인하세요", "updatePassword": "비밀번호 업데이트", "createApiKeyTitle": "API 키 생성", "createApiKeyDescription": "프로그래밍 방식으로 접근하기 위한 새 API 키를 생성합니다.", - "apiKeyNameLabel": "이름", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "예: CI 파이프라인", "expiryDateLabel": "만료일", "optional": "선택 과목", - "cancel": "취소", + "cancel": "Cancel", "createKey": "키를 생성합니다", - "apiKeyCount": "{{count}} 키", + "apiKeyCount": "{{count}} keys", "newKey": "새 키", "noApiKeys": "아직 API 키가 없습니다.", - "apiKeyActive": "활동적인", + "apiKeyActive": "Active", "apiKeyUsageHint": "키를 함께 넣어주세요", "apiKeyUsageHintHeader": "헤더.", "apiKeyPermissionsHint": "키는 생성 사용자의 권한을 상속합니다.", - "roleUser": "사용자", - "authMethodDual": "이중 인증", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "TOTP 설정 시작에 실패했습니다.", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "6자리 코드를 입력하세요", "totpEnabledSuccess": "2단계 인증이 활성화되었습니다.", "totpInvalidCode": "잘못된 코드입니다. 다시 시도해 주세요.", "totpDisableInputRequired": "TOTP 코드 또는 비밀번호를 입력하세요.", - "totpDisabledSuccess": "2단계 인증이 비활성화되었습니다.", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "2단계 인증 비활성화에 실패했습니다.", - "totpDisableTitle": "2단계 인증 비활성화", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "TOTP 코드 또는 비밀번호를 입력하세요", - "totpDisableConfirm": "2단계 인증 비활성화", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "계속 확인", - "totpVerifyTitle": "확인 코드", - "totpBackupTitle": "백업 코드", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "다운로드 백업 코드", "done": "완료", "secretCopied": "비밀 정보가 클립보드에 복사되었습니다.", "apiKeyNameRequired": "키 이름은 필수 입력 사항입니다.", - "apiKeyCreated": "API 키 \"{{name}}\"가 생성되었습니다", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "API 키 생성에 실패했습니다.", - "apiKeyUser": "사용자", - "apiKeyExpires": "만료됨", - "apiKeyRevoked": "API 키 \"{{name}}\"가 취소되었습니다.", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "API 키 해지에 실패했습니다.", "passwordFieldsRequired": "현재 비밀번호와 새 비밀번호가 필요합니다.", - "passwordMismatch": "비밀번호가 일치하지 않습니다", - "passwordTooShort": "비밀번호는 최소 6자 이상이어야 합니다.", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "비밀번호가 성공적으로 업데이트되었습니다.", "passwordUpdateFailed": "비밀번호 업데이트에 실패했습니다", "deletePasswordRequired": "계정을 삭제하려면 비밀번호가 필요합니다.", - "deleteFailed": "계정 삭제에 실패했습니다", - "deleting": "삭제 중...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "색상 선택기 열기", - "themeSystem": "체계", - "themeLight": "빛", - "themeDark": "어두운", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "드라큘라", "themeCatppuccin": "캣푸친", "themeNord": "노르드", @@ -2180,5 +2683,105 @@ "themeGruvbox": "그루브박스" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "방금", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "꼬리표", + "backTab": "⇥", + "arrowUp": "위쪽 화살표", + "arrowDown": "아래쪽 화살표", + "arrowLeft": "왼쪽 화살표", + "arrowRight": "오른쪽 화살표", + "home": "Home", + "end": "끝", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "완료" } } diff --git a/src/ui/locales/translated/nl_NL.json b/src/ui/locales/translated/nl_NL.json index f434ce56..27369165 100644 --- a/src/ui/locales/translated/nl_NL.json +++ b/src/ui/locales/translated/nl_NL.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Mappen", - "folder": "Map", + "folders": "Folders", + "folder": "Folder", "password": "Wachtwoord", - "key": "Sleutel", - "sshPrivateKey": "SSH persoonlijke sleutel", - "upload": "Uploaden", - "keyPassword": "Sleutel wachtwoord", - "sshKey": "SSH sleutel", - "uploadPrivateKeyFile": "Upload een privésleutel bestand", - "searchCredentials": "Zoek inloggegevens...", - "addCredential": "Toegangsgegevens toevoegen", - "caCertificate": "CA Certificaat (-cert.pub)", - "caCertificateDescription": "Optioneel: Upload of plak het CA-ondertekende certificaatbestand (bijv. id_ed25519-cert.pub). Vereist wanneer uw SSH server gebruik maakt van autorisatie op certificaat.", - "uploadCertFile": "Upload -cert.pub bestand", - "clearCert": "Verwijderen", - "certLoaded": "Certificaat geladen", - "certPublicKeyLabel": "CA-certificaat", - "certTypeLabel": "Type certificaat", - "pasteOrUploadCert": "Plak of upload een -cert.pub certificaat...", - "hasCaCert": "Heeft CA-certificaat", - "noCaCert": "Geen CA-certificaat" + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH-sleutel", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Standaardbestelling", + "sortNameAsc": "Naam (A → Z)", + "sortNameDesc": "Naam (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Filters wissen", + "filterTypeGroup": "Type", + "filterTypePassword": "Wachtwoord", + "filterTypeKey": "SSH-sleutel", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Laden van waarschuwingen mislukt", - "failedToDismissAlert": "Waarschuwing sluiten mislukt" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Server Configuratie", - "description": "Configureer de Termix-server-URL om verbinding te maken met uw backend-services", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", "serverUrl": "Server URL", - "enterServerUrl": "Voer een server-URL in", - "saveFailed": "Configuratie opslaan mislukt", - "saveError": "Fout bij opslaan configuratie", - "saving": "Opslaan...", - "saveConfig": "Configuratie opslaan", - "helpText": "Voer de URL in waar uw Termix server draait (bijv. http://localhost:30001 of https://your-server.com)", - "changeServer": "Server wijzigen", - "mustIncludeProtocol": "De server-URL moet beginnen met http:// of https://", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Ongeldig certificaat toestaan", "allowInvalidCertificateDesc": "Uitsluitend te gebruiken voor vertrouwde, zelfgehoste servers met zelfondertekende certificaten of IP-adrescertificaten.", - "useEmbedded": "Lokale server gebruiken", - "embeddedDesc": "Voer Termix uit met de ingebouwde lokale server (geen externe server nodig)", - "embeddedConnecting": "Verbinden met lokale server...", - "embeddedNotReady": "Lokale server is nog niet klaar. Wacht even en probeer het opnieuw.", - "localServer": "Lokale Server" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Verwijderen" }, "versionCheck": { - "error": "Versie controle fout", - "checkFailed": "Controleren op updates mislukt", - "upToDate": "App is up to date", - "currentVersion": "Je gebruikt versie {{version}}", - "updateAvailable": "Update beschikbaar", - "newVersionAvailable": "Er is een nieuwe versie beschikbaar! U voert {{current}}uit, maar {{latest}} is beschikbaar.", - "betaVersion": "Beta versie", - "betaVersionDesc": "Je gebruikt {{current}}, die nieuwer is dan de laatste stabiele versie {{latest}}.", - "releasedOn": "Uitgebracht op {{date}}", - "downloadUpdate": "Update downloaden", - "checking": "Controleren op updates...", - "checkUpdates": "Controleren op updates", - "checkingUpdates": "Controleren op updates...", - "updateRequired": "Update vereist" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Afsluiten", + "close": "Close", "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Doorgaan", - "maintenance": "Onderhoud", - "degraded": "Verminderde", - "error": "Foutmelding", - "warning": "Waarschuwing", - "unsavedChanges": "Niet-opgeslagen wijzigingen", - "dismiss": "Uitschakelen", - "loading": "Laden...", - "optional": "Optioneel", - "connect": "Verbinden", - "copied": "Gekoppeld", - "connecting": "Verbinden...", - "updateAvailable": "Update beschikbaar", - "appName": "Termixen", - "openInNewTab": "Openen in nieuw tabblad", - "noReleases": "Geen releases", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", "updatesAndReleases": "Updates & Releases", - "newVersionAvailable": "Er is een nieuwe versie ({{version}}) beschikbaar.", - "failedToFetchUpdateInfo": "Bijgewerkte informatie ophalen mislukt", - "preRelease": "Voor-versie", - "noReleasesFound": "Geen releases gevonden.", - "cancel": "annuleren", - "username": "Gebruikersnaam", - "login": "Aanmelden", - "register": "Registreren", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Annuleren", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Wachtwoord", - "confirmPassword": "Bevestig wachtwoord", - "back": "Achterzijde", - "save": "Opslaan", - "saving": "Opslaan...", - "delete": "Verwijderen", - "rename": "Hernoem", - "edit": "Bewerken", - "add": "Toevoegen", - "confirm": "Bevestigen", - "no": "Neen", - "or": "of", - "next": "Volgende", - "previous": "named@@0", - "refresh": "Vernieuwen", - "language": "Taal", - "checking": "Controleren...", - "checkingDatabase": "Database-verbinding controleren...", - "checkingAuthentication": "Authenticatie controleren...", - "backendReconnected": "Serververbinding hersteld", - "connectionDegraded": "Serververbinding verbroken, herstel bezig…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", "remove": "Verwijderen", - "create": "Aanmaken", - "update": "Vernieuwen", + "create": "Create", + "update": "Update", "copy": "Kopiëren", - "copyFailed": "Kon niet naar klembord kopiëren", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Herstellen", - "of": "van" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Startpagina", + "home": "Home", "terminal": "Terminal", "docker": "Docker", "tunnels": "Tunnels", - "fileManager": "Bestands Beheer", - "serverStats": "Server Statistieken", - "admin": "Beheerder", - "userProfile": "Gebruikers Profiel", - "splitScreen": "Scherm splitsen", - "confirmClose": "Deze actieve sessie sluiten?", - "close": "Afsluiten", - "cancel": "annuleren", - "sshManager": "SSH manager", - "cannotSplitTab": "Kan dit tabblad niet splitsen", + "fileManager": "Bestandsbeheerder", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Annuleren", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Wachtwoord kopiëren", - "copySudoPassword": "Sudo wachtwoord kopiëren", - "passwordCopied": "Wachtwoord gekopieerd naar klembord", - "noPasswordAvailable": "Geen wachtwoord beschikbaar", - "failedToCopyPassword": "Wachtwoord kopiëren mislukt", - "refreshTab": "Connectie vernieuwen", - "openFileManager": "Bestandsbeheer openen", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", "dashboard": "Dashboard", - "networkGraph": "Netwerk Grafiek", - "quickConnect": "Snel verbinden", - "sshTools": "SSH gereedschap", - "history": "Geschiedenis", - "hosts": "Verantwoordelijken", - "snippets": "Tekstbouwstenen", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", "hostManager": "Host Manager", - "credentials": "Aanmeldgegevens", + "credentials": "Credentials", "connections": "Verbindingen", - "roleAdministrator": "Beheerder", - "roleUser": "Gebruiker" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Verantwoordelijken", - "noHosts": "Geen SSH hosts", - "retry": "Opnieuw", - "refresh": "Vernieuwen", - "optional": "Optioneel", - "downloadSample": "Download voorbeeld", - "failedToDeleteHost": "Verwijderen {{name}} mislukt", - "importSkipExisting": "Import (bestaande overslaan)", - "connectionDetails": "Connectie Details", - "ssh": "ZZ", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Opnieuw proberen", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", + "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Extern bureaublad", - "port": "Poort", - "username": "Gebruikersnaam", - "folder": "Map", - "tags": "Labels", - "pin": "Vastzetten", - "addHost": "Host toevoegen", - "editHost": "Host bewerken", - "cloneHost": "Host klonen", - "enableTerminal": "Terminal inschakelen", - "enableTunnel": "Tunnel inschakelen", - "enableFileManager": "Bestandsbeheer inschakelen", - "enableDocker": "Docker inschakelen", - "defaultPath": "Standaard pad", - "connection": "Verbindingsinstellingen", - "upload": "Uploaden", - "authentication": "Authenticatie", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Wachtwoord", - "key": "Sleutel", - "credential": "Toegangsgegevens", - "none": "geen", - "sshPrivateKey": "SSH persoonlijke sleutel", - "keyType": "Type sleutel", - "uploadFile": "Bestand uploaden", - "tabGeneral": "Algemeen", - "tabSsh": "ZZ", + "key": "Key", + "credential": "Referentie", + "none": "Geen", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", + "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", "tabTunnels": "Tunnels", "tabDocker": "Docker", - "tabFiles": "Bestanden", - "tabStats": "Statistieken", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Delen", - "tabAuthentication": "Authenticatie", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunnel", - "fileManager": "Bestands Beheer", - "serverStats": "Server Statistieken", - "status": "status", - "folderRenamed": "Map \"{{oldName}}\" hernoemd naar \"{{newName}}\" succesvol", - "failedToRenameFolder": "Kan map niet hernoemen", - "movedToFolder": "Verplaatst naar \"{{folder}}\"", - "editHostTooltip": "Host bewerken", - "statusChecks": "Status controles", - "metricsCollection": "Collectie Statistieken", - "metricsInterval": "Metrics Collectie Interval", - "metricsIntervalDesc": "Hoe vaak serverstatistieken worden verzameld (5s - 1h)", - "behavior": "Gedrag", - "themePreview": "Thema voorbeeld", - "theme": "Thema", - "fontFamily": "Lettertype Familie", + "fileManager": "Bestandsbeheerder", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Letter afstand", - "lineHeight": "Lijn hoogte", - "cursorStyle": "Cursor Stijl", - "cursorBlink": "Cursor Knipperen", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", "scrollbackBuffer": "Scrollback Buffer", - "bellStyle": "Bell stijl", - "rightClickSelectsWord": "Klik met de rechtermuisknop selecteren", - "fastScrollModifier": "Snel Scrollen Aanpasser", - "fastScrollSensitivity": "Snelle Boekgevoeligheid", - "sshAgentForwarding": "SSH Agent doorsturen", - "backspaceMode": "Modus voor backspace", - "startupSnippet": "Opstarten snippet", - "selectSnippet": "Tekstfragment selecteren", - "forceKeyboardInteractive": "Forceer toetsenbord-interactief", - "overrideCredentialUsername": "Aanmeldgebruikersnaam overschrijven", - "overrideCredentialUsernameDesc": "Gebruik de hierboven opgegeven gebruikersnaam in plaats van de inlognaam", - "jumpHostChain": "Sprong Host ketting", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Port Knocking", - "addKnock": "Poort toevoegen", - "addProxyNode": "Voeg node toe", - "proxyNode": "Proxy Knoop", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", "proxyType": "Proxy Type", - "quickActions": "Snelle acties", - "sudoPasswordAutoFill": "Sudo Wachtwoord automatisch invullen", - "sudoPassword": "Sudo Wachtwoord", - "keepaliveInterval": "Keepalive interval (ms)", - "moshCommand": "MEER commando", - "environmentVariables": "Omgeving variabelen", - "addVariable": "Variabele toevoegen", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Terminal URL kopiëren", - "copyFileManagerUrl": "Kopieer URL Bestand Manager", - "copyRemoteDesktopUrl": "Kopieer URL van extern bureaublad", - "failedToConnect": "Kan geen verbinding maken met console", - "connect": "Verbinden", - "disconnect": "Verbreek", - "start": "Beginnen", - "enableStatusCheck": "Status controle inschakelen", - "enableMetrics": "Metriek inschakelen", - "bulkUpdateFailed": "Bulk update mislukt", - "selectAll": "Alles selecteren", - "deselectAll": "Deselecteer alles", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Veilige Granaat", - "virtualNetwork": "Virtueel netwerk", - "unencryptedShell": "Onversleutelde shell", - "addressIp": "Adres / IP", - "friendlyName": "Vriendelijke naam", - "folderAndAdvanced": "Map & Geavanceerd", - "privateNotes": "Privé notities", - "privateNotesPlaceholder": "Details over deze server...", - "pinToTop": "Bovenaan vastzetten", - "pinToTopDesc": "Toon altijd deze host bovenaan de lijst", - "portKnockingSequence": "Poort Knocking Volgorde", - "addKnockBtn": "Knock toevoegen", - "noPortKnocking": "Er is geen port knocking geconfigureerd.", - "knockPort": "Knock Poort", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", "protocol": "Protocol", - "delayAfterMs": "Vertraging na (ms)", - "useSocks5Proxy": "Gebruik SOCKS5 Proxy", - "useSocks5ProxyDesc": "Route verbinding via een proxyserver", - "proxyHost": "Proxy host", - "proxyPort": "Proxy Poort", - "proxyUsername": "Proxy Gebruikersnaam", - "proxyPassword": "Proxy wachtwoord", - "proxySingleMode": "Enkele Proxy", - "proxyChainMode": "Proxyketen keten", - "you": "Jij", - "jumpHostChainLabel": "Sprong Host ketting", - "addJumpBtn": "Voeg sprong toe", - "noJumpHosts": "Geen springhosts geconfigureerd.", - "selectAServer": "Selecteer een server...", - "sshPort": "SSH poort", - "authMethod": "Auth Methode", - "storedCredential": "Opgeslagen referenties", - "selectACredential": "Selecteer een aanmeldingsgegevens...", - "keyTypeLabel": "Type sleutel", - "keyTypeAuto": "Automatisch detecteren", - "keyPasteTab": "Plakken", - "keyUploadTab": "Uploaden", - "keyFileLoaded": "Sleutelbestand geladen", - "keyUploadClick": "Klik om .pem / .key / .ppk te uploaden", - "clearKey": "Sleutel wissen", - "keySaved": "SSH sleutel opgeslagen", - "keyReplaceNotice": "plak hieronder een nieuwe sleutel om deze te vervangen", - "keyPassphraseSaved": "Wachtwoordzin opgeslagen, type om te wijzigen", - "replaceKey": "Vervang sleutel", - "forceKeyboardInteractiveLabel": "Forceer toetsenbord Interactief", - "forceKeyboardInteractiveShortDesc": "Handmatig invoeren van wachtwoord afdwingen ook als er sleutels aanwezig zijn", - "terminalAppearance": "Terminal uiterlijk", - "colorTheme": "Thema kleur", - "fontFamilyLabel": "Lettertype Familie", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Cursor Stijl", - "letterSpacingPx": "Letter afstand (px)", - "lineHeightLabel": "Lijn hoogte", - "bellStyleLabel": "Bell stijl", - "backspaceModeLabel": "Modus voor backspace", - "cursorBlinking": "Cursor knipperen", - "cursorBlinkingDesc": "Schakel knipperende animatie in voor de terminale cursor", - "rightClickSelectsWordLabel": "Rechtsklik Selectie Woord", - "rightClickSelectsWordShortDesc": "Selecteer het woord onder de cursor bij rechtermuisklik", - "behaviorAndAdvanced": "Gedrag en geavanceerd", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", "scrollbackBufferLabel": "Scrollback Buffer", - "scrollbackMaxLines": "Maximum aantal lijnen bewaard in geschiedenis", - "sshAgentForwardingLabel": "SSH Agent doorsturen", - "sshAgentForwardingShortDesc": "Geef uw lokale SSH sleutels door aan deze host", - "enableAutoMosh": "Auto-moh inschakelen", - "enableAutoMoshDesc": "Liever Mosh over SSH indien beschikbaar", - "enableAutoTmux": "Auto-Tmux inschakelen", - "enableAutoTmuxDesc": "Start automatisch of voeg toe aan tmux sessie", - "sudoPasswordAutoFillLabel": "Sudo Wachtwoord automatisch invullen", - "sudoPasswordAutoFillShortDesc": "Automatisch sudo wachtwoord opgeven wanneer hierom gevraagd wordt", - "sudoPasswordLabel": "Sudo Wachtwoord", - "environmentVariablesLabel": "Omgeving variabelen", - "addVariableBtn": "Variabele toevoegen", - "noEnvVars": "Geen omgevingsvariabelen geconfigureerd.", - "fastScrollModifierLabel": "Snel Scrollen Aanpasser", - "fastScrollSensitivityLabel": "Snelle Boekgevoeligheid", - "moshCommandLabel": "Mosh commando", - "startupSnippetLabel": "Opstarten snippet", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Keepalive-interval (seconden)", - "maxKeepaliveMisses": "Max Keepalive Gemist", - "tunnelSettings": "Tunnel instellingen", - "enableTunneling": "Tunneling inschakelen", - "enableTunnelingDesc": "SSH tunnel inschakelen voor deze host", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", "serverTunnelsSection": "Server Tunnels", - "addTunnelBtn": "Tunnel toevoegen", - "noTunnelsConfigured": "Geen tunnels geconfigureerd.", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", - "tunnelType": "Tunnel type", - "tunnelModeLocalDesc": "Stuur een lokale poort door naar een poort op de externe server (of een host bereikbaar).", - "tunnelModeRemoteDesc": "Stuur een poort terug naar een lokale poort op je machine.", - "tunnelModeDynamicDesc": "Creëer een SOCKS5 proxy op een lokale poort voor dynamische poort forwarding.", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Deze host (directe tunnel)", "endpointHost": "Endpoint Host", - "endpointPort": "Eindpunt Poort", - "bindHost": "Binden host", - "sourcePort": "Bron poort", - "maxRetries": "Maximaal aantal pogingen", - "retryIntervalS": "Interval (s) opnieuw proberen", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", "autoStartLabel": "Auto-start", - "autoStartDesc": "Sluit deze tunnel automatisch aan wanneer de host wordt geladen", - "tunnelConnecting": "Tunnel verbinden...", - "tunnelDisconnected": "Tunnel verbroken", - "failedToConnectTunnel": "Kan geen verbinding maken", - "failedToDisconnectTunnel": "Verbinding verbreken mislukt", - "dockerIntegration": "Docker integratie", - "enableDockerMonitor": "Docker inschakelen", - "enableDockerMonitorDesc": "Controleer en beheer containers van deze host via Docker", - "enableFileManagerMonitor": "Bestandsbeheer inschakelen", - "enableFileManagerMonitorDesc": "Blader en beheer bestanden op deze host via SFTP", - "defaultPathLabel": "Standaard pad", - "fileManagerPathHint": "De map die wordt geopend wanneer de bestandsbeheerder start voor deze host.", - "statusChecksLabel": "Status controles", - "enableStatusChecks": "Status controles inschakelen", - "enableStatusChecksDesc": "Periodiek ping van deze host om beschikbaarheid te controleren", - "useGlobalInterval": "Algemene Interval Gebruiken", - "useGlobalIntervalDesc": "Overschrijven met de server-brede statuscontrole interval", - "checkIntervalS": "Interval (s) controleren", - "checkIntervalDesc": "Seconden tussen elke verbinding ping", - "metricsCollectionLabel": "Collectie Statistieken", - "enableMetricsLabel": "Metriek inschakelen", - "enableMetricsDesc": "Verzamel CPU, RAM, schijf en netwerkgebruik van deze host", - "useGlobalMetrics": "Algemene Interval Gebruiken", - "useGlobalMetricsDesc": "Overschrijven met het server-brede metrieke interval", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Wachtwoord", + "authTypeKey": "SSH-sleutel", + "authTypeCredential": "Referentie", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Geen", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", "metricsIntervalS": "Metrics Interval (s)", - "metricsIntervalDesc2": "Tussen metrische momentopnamen", - "visibleWidgets": "Zichtbare Widgets", - "cpuUsageLabel": "CPU gebruik", - "cpuUsageDesc": "CPU percentage, laad gemiddelden, sparkline grafiek", - "memoryLabel": "Geheugen gebruik", - "memoryDesc": "RAM gebruik, swap, gecached", - "storageLabel": "Schijf gebruik", - "storageDesc": "Schijfgebruik per mount point", - "networkLabel": "Netwerk Interfaces", - "networkDesc": "Interfacelijst en bandbreedte", - "uptimeLabel": "Actief", - "uptimeDesc": "Systeem uptime en opstarttijd", - "systemInfoLabel": "Systeem info", - "systemInfoDesc": "OS, kernel, hostnaam, architectuur", - "recentLoginsLabel": "Recente aanmeldingen", - "recentLoginsDesc": "Succesvolle en mislukte login gebeurtenissen", - "topProcessesLabel": "Top processen", - "topProcessesDesc": "PID, CPU%, MEM%, opdracht", - "listeningPortsLabel": "Luisterende Poorten", - "listeningPortsDesc": "Open poorten met proces en staat", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", "firewallDesc": "Firewall, AppArmor, SELinux status", - "quickActionsLabel": "Snelle acties", - "quickActionsToolbar": "Snelle acties worden weergegeven als knoppen in de Server Stats werkbalk voor het uitvoeren van één klik opdracht.", - "noQuickActions": "Nog geen snelle acties.", - "buttonLabel": "Knop label", - "selectSnippetPlaceholder": "Tekstfragment selecteren...", - "addActionBtn": "Actie toevoegen", - "hostSharedSuccessfully": "Host met succes gedeeld", - "failedToShareHost": "Kan host niet delen", - "accessRevoked": "Toegang ingetrokken", - "failedToRevokeAccess": "Toegang intrekken mislukt", - "cancelBtn": "annuleren", - "savingBtn": "Opslaan...", - "addHostBtn": "Host toevoegen", - "hostUpdated": "Host bijgewerkt", - "hostCreated": "Host aangemaakt", - "failedToSave": "Host opslaan mislukt", - "credentialUpdated": "Toegangsgegevens bijgewerkt", - "credentialCreated": "Toegangssleutel aangemaakt", - "failedToSaveCredential": "Kan referenties niet opslaan", - "backToHosts": "Terug naar Hosts", - "backToCredentials": "Terug naar inloggegevens", - "pinned": "Vastgezet", - "noHostsFound": "Geen hosts gevonden", - "tryDifferentTerm": "Probeer een andere term", - "addFirstHost": "Voeg je eerste host toe om te beginnen", - "noCredentialsFound": "Geen inloggegevens gevonden", - "addCredentialBtn": "Toegangsgegevens toevoegen", - "updateCredentialBtn": "Certificaatgegevens bijwerken", - "features": "Eigenschappen", - "noFolder": "(Geen map)", - "deleteSelected": "Verwijderen", - "exitSelection": "Sluit selectie af", - "importSkip": "Import (bestaande overslaan)", - "importOverwrite": "Import (overschrijven)", - "collapseBtn": "Samenvouwen", - "importExportBtn": "Importeren / exporteren", - "hostStatusesRefreshed": "Hoststatus vernieuwd", - "failedToRefreshHosts": "Vernieuwen van hosts mislukt", - "movedHostTo": "{{host}} verplaatst naar \"{{folder}}\"", - "failedToMoveHost": "Verplaatsen host mislukt", - "folderRenamedTo": "Map hernoemd naar \"{{name}}\"", - "deletedFolder": "Map \"{{name}} \" verwijderd", - "failedToDeleteFolder": "Map verwijderen mislukt", - "deleteAllInFolder": "Verwijder alle hosts in \"{{name}}\"? Dit kan niet ongedaan worden gemaakt.", - "deletedHost": "Verwijderd {{name}}", - "copiedToClipboard": "Gekopieerd naar klembord", - "terminalUrlCopied": "Terminal URL gekopieerd", - "fileManagerUrlCopied": "URL Bestandsbeheer gekopieerd", - "tunnelUrlCopied": "Tunnel URL gekopieerd", - "dockerUrlCopied": "Docker URL gekopieerd", - "serverStatsUrlCopied": "Server Stats URL gekopieerd", - "rdpUrlCopied": "RDP URL gekopieerd", - "vncUrlCopied": "VNC URL gekopieerd", - "telnetUrlCopied": "Telnet URL gekopieerd", - "remoteDesktopUrlCopied": "URL op extern bureaublad gekopieerd", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Annuleren", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Vastgepind", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Functies", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Annuleren", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Acties uitbreiden", "collapseActions": "Inklapacties", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Magisch pakket verzonden naar {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Het verzenden van het magic packet is mislukt.", - "cloneHostAction": "Host klonen", - "copyAddress": "Adres kopiëren", - "copyLink": "Koppeling kopiëren", - "copyTerminalUrlAction": "Terminal URL kopiëren", - "copyFileManagerUrlAction": "Kopieer URL Bestand Manager", - "copyTunnelUrlAction": "Kopieer Tunnel URL", - "copyDockerUrlAction": "Docker URL kopiëren", - "copyServerStatsUrlAction": "Kopieer server statistieken URL", - "copyRdpUrlAction": "Kopieer RDP URL", - "copyVncUrlAction": "VNC URL kopiëren", - "copyTelnetUrlAction": "Telnet URL kopiëren", - "copyRemoteDesktopUrlAction": "Kopieer URL van extern bureaublad", - "deleteCredentialConfirm": "Toegangsgegevens verwijderen \"{{name}}\"?", - "deletedCredential": "Verwijderd {{name}}", - "deploySSHKeyTitle": "SSH sleutel toepassen", - "deployingBtn": "Implementeren...", - "deployBtn": "Implementeren", - "failedToDeployKey": "Kan implementatiesleutel niet implementeren", - "deleteHostsConfirm": "{{count}} host{{plural}}verwijderen? Dit kan niet ongedaan worden gemaakt.", - "movedToRoot": "Verplaatst naar root", - "failedToMoveHosts": "Hosts verplaatsen mislukt", - "enableTerminalFeature": "Terminal inschakelen", - "disableTerminalFeature": "Terminal uitschakelen", - "enableFilesFeature": "Bestanden inschakelen", - "disableFilesFeature": "Bestanden uitschakelen", - "enableTunnelsFeature": "Tunnels inschakelen", - "disableTunnelsFeature": "Tunnels uitschakelen", - "enableDockerFeature": "Docker inschakelen", - "disableDockerFeature": "Docker uitschakelen", - "addTagsPlaceholder": "Labels toevoegen...", - "authDetails": "Authenticatie details", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", "credType": "Type", - "generateKeyPairDesc": "Genereer een nieuw sleutelpaar en beide private en publieke sleutels worden automatisch gevuld.", - "generatingKey": "Genereren...", - "generateLabel": "Genereer {{label}}", - "uploadFileBtn": "Bestand uploaden", - "keyPassphraseOptional": "Sleutel wachtwoord (optioneel)", - "sshPublicKeyOptional": "SSH Publieke Sleutel (optioneel)", - "publicKeyGenerated": "Publieke sleutel gegenereerd", - "failedToGeneratePublicKey": "Openbare sleutel kon niet worden afgeleid", - "publicKeyCopied": "Publieke sleutel gekopieerd", - "keyPairGenerated": "{{label}} sleutel paar gegenereerd", - "failedToGenerateKeyPair": "Genereren van sleutelpaar mislukt", - "searchHostsPlaceholder": "Zoek hosts, adressen, tags…", - "searchCredentialsPlaceholder": "Zoek inloggegevens…", - "refreshBtn": "Vernieuwen", - "addTag": "Labels toevoegen...", - "deleteConfirmBtn": "Verwijderen", - "tunnelRequirementsText": "De SSH server moet GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", - "deleteHostConfirm": "Verwijder \"{{name}}\"?", - "enableAtLeastOneProtocol": "Schakel ten minste één protocol hierboven in om authenticatie en verbindingsinstellingen te configureren.", - "keyPassphrase": "Sleutel wachtwoord", - "connectBtn": "Verbinden", - "disconnectBtn": "Verbreek", - "basicInformation": "Basis Informatie", - "authDetailsSection": "Authenticatie details", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", "credTypeLabel": "Type", - "hostsTab": "Verantwoordelijken", - "credentialsTab": "Aanmeldgegevens", - "selectMultiple": "Selecteer meerdere", - "selectHosts": "Selecteer hosts", - "connectionLabel": "Verbindingsinstellingen", - "authenticationLabel": "Authenticatie", - "generateKeyPairTitle": "Sleutelkoppeling genereren", - "generateKeyPairDescription": "Genereer een nieuw sleutelpaar en beide private en publieke sleutels worden automatisch gevuld.", - "generateFromPrivateKey": "Genereer van Private Key", - "refreshBtn2": "Vernieuwen", - "exitSelectionTitle": "Sluit selectie af", - "exportAll": "Alles exporteren", - "addHostBtn2": "Host toevoegen", - "addCredentialBtn2": "Toegangsgegevens toevoegen", - "checkingHostStatuses": "Hoststatussen controleren...", - "pinnedSection": "Vastgezet", - "hostsExported": "Hosts succesvol geëxporteerd", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Vastgepind", + "hostsExported": "Hosts exported successfully", "exportFailed": "Exporteren van hosts is mislukt", - "sampleDownloaded": "Voorbeeld bestand gedownload", - "failedToDeleteCredential2": "Kan aanmeldgegevens niet verwijderen", - "noFolderOption": "(Geen map)", - "nSelected": "{{count}} geselecteerd", - "featuresMenu": "Eigenschappen", - "moveMenu": "Verplaatsen", - "cancelSelection": "annuleren", - "deployDialogDesc": "Gebruik {{name}} voor een host's authorized_keys.", - "targetHostLabel": "Doel host", - "selectHostOption": "Selecteer een host...", - "keyDeployedSuccess": "Sleutel succesvol geïmplementeerd", - "failedToDeployKey2": "Kan implementatiesleutel niet implementeren", - "deletedCount": "Verwijderde {{count}} hosts", - "failedToDeleteCount": "Verwijderen van {{count}} hosts mislukt", - "duplicatedHost": "Gedupliceerd \"{{name}}\"", - "failedToDuplicateHost": "Mislukt om host te dupliceren", - "updatedCount": "Bijgewerkt {{count}} hosts", - "friendlyNameLabel": "Vriendelijke naam", - "descriptionLabel": "Beschrijving", - "loadingHost": "Host laden...", - "loadingHosts": "Hosts worden geladen...", - "loadingCredentials": "Inloggegevens worden geladen...", - "noHostsYet": "Nog geen hosts", - "noHostsMatchSearch": "Er zijn geen hosts die voldoen aan jouw zoekopdracht", - "hostNotFound": "Host niet gevonden", - "searchHosts": "Zoek hosts...", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Functies", + "moveMenu": "Beweging", + "connectSelected": "Connect", + "cancelSelection": "Annuleren", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Sorteer hosts", "sortDefault": "Standaardbestelling", "sortNameAsc": "Naam (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "Tags", - "shareHost": "Deel host", - "shareHostTitle": "Delen: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Deze host moet een certificaat gebruiken om het delen in te schakelen. Bewerk de host en wijs eerst een certificaat toe." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Verbindingsinstellingen", - "authentication": "Authenticatie", - "connectionSettings": "Verbindingsinstellingen", - "displaySettings": "Weergave instellingen", - "audioSettings": "Audio instellingen", - "rdpPerformance": "RDP prestaties", - "deviceRedirection": "Apparaat omleiding", - "session": "Sessie", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Referentie", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Klembord", - "sessionRecording": "Sessie opname", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC instellingen", - "terminalSettings": "Terminal Instellingen", - "rdpPort": "RDP poort", - "username": "Gebruikersnaam", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Wachtwoord", - "domain": "Domein", - "securityMode": "Beveiliging modus", - "colorDepth": "Kleur diepte", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Højde", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Methode aanpassen", - "clientName": "Naam klant", - "initialProgram": "Eerste programma", - "serverLayout": "Server lay-out", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Gateway poort", - "gatewayUsername": "Gateway Gebruikersnaam", - "gatewayPassword": "Gateway Wachtwoord", - "gatewayDomain": "Gateway Domein", - "remoteAppProgram": "RemoteApp Programma", - "workingDirectory": "Werken Map", - "arguments": "Argumenten", - "normalizeLineEndings": "Normaliseer Eindingen van lijn", - "recordingPath": "Opname pad", - "recordingName": "Naam van opname", - "macAddress": "MAC Adres", - "broadcastAddress": "Adres uitzenden", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Wacht op tijd (s)", - "driveName": "Drive Naam", - "drivePath": "Drive pad", - "ignoreCertificate": "Certificaat negeren", - "ignoreCertificateDesc": "Verbindingen met hosts toestaan met zelfondertekende certificaten", - "forceLossless": "Verlies afdwingen", - "forceLosslessDesc": "Forceer lossless afbeeldingscodering (hogere kwaliteit, meer bandbreedte)", - "disableAudio": "Audio uitschakelen", - "disableAudioDesc": "Alle audio van de externe sessie dempen", - "enableAudioInput": "Audio-invoer (microfoon) inschakelen", - "enableAudioInputDesc": "Lokale microfoon doorsturen naar de externe sessie", - "wallpaper": "Achtergrond", - "wallpaperDesc": "Bureaublad achtergrond tonen (prestaties uitschakelen)", - "theming": "Thematisering", - "themingDesc": "Visuele thema's en stijlen inschakelen", - "fontSmoothing": "Lettertype vloeiend maken", - "fontSmoothingDesc": "Activeer ClearType lettertype weergave", - "fullWindowDrag": "Slepen volledig venster", - "fullWindowDragDesc": "Laat inhoud van het venster zien tijdens slepen", - "desktopComposition": "Compositie bureaublad", - "desktopCompositionDesc": "Inschakelen van Aero glazen effecten", - "menuAnimations": "Menu animaties", - "menuAnimationsDesc": "Menu vervagen en dia animaties inschakelen", - "disableBitmapCaching": "Bitmap caching uitschakelen", - "disableBitmapCachingDesc": "Bitmap cache uitschakelen (kan helpen met glitches)", - "disableOffscreenCaching": "Offscreen caching uitschakelen", - "disableOffscreenCachingDesc": "Schakel de scherm cache uit", - "disableGlyphCaching": "Glief caching uitschakelen", - "disableGlyphCachingDesc": "Zet glyph cache uit", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Gebruik de RemoteFX grafische pipeline", - "enablePrinting": "Afdrukken inschakelen", - "enablePrintingDesc": "Lokale printers omleiden naar de externe sessie", - "enableDriveRedirection": "Schijf omleiding inschakelen", - "enableDriveRedirectionDesc": "Kaart van een lokale map als schijf in de externe sessie", - "createDrivePath": "Maak Drive Pad", - "createDrivePathDesc": "Maak de map automatisch aan als deze niet bestaat", - "disableDownload": "Download uitschakelen", - "disableDownloadDesc": "Voorkom het downloaden van bestanden van de externe sessie", - "disableUpload": "Uploaden uitschakelen", - "disableUploadDesc": "Voorkom het uploaden van bestanden naar de externe sessie", - "enableTouch": "Aanraking inschakelen", - "enableTouchDesc": "Inschakelen doorsturen van aanrakingen", - "consoleSession": "Console sessie", - "consoleSessionDesc": "Maak verbinding met de console (sessie 0) in plaats van een nieuwe sessie", - "sendWolPacket": "Verstuur WOL-pakket", - "sendWolPacketDesc": "Stuur een magische pakket om deze host te ontwaken voordat u verbinding maakt", - "disableCopy": "Kopiëren uitschakelen", - "disableCopyDesc": "Voorkom kopiëren van tekst van de externe sessie", - "disablePaste": "Plakken uitschakelen", - "disablePasteDesc": "Voorkom tekst plakken in de externe sessie", - "createPathIfMissing": "Pad aanmaken als het ontbreekt", - "createPathIfMissingDesc": "Automatisch de opnamemap aanmaken", - "excludeOutput": "Uitvoer uitsluiten", - "excludeOutputDesc": "Schermuitvoer niet opnemen (alleen metadata )", - "excludeMouse": "Uitsluiten Muis", - "excludeMouseDesc": "Muisbewegingen niet opnemen", - "includeKeystrokes": "Toetsaanslagen opnemen", - "includeKeystrokesDesc": "Neem ruwe toetsaanslagen op naast schermuitvoer", - "vncPort": "VNC Poort", - "vncPassword": "VNC wachtwoord", - "vncUsernameOptional": "Gebruikersnaam (optioneel)", - "vncLeaveBlank": "Laat leeg indien niet vereist", - "cursorMode": "Cursor Modus", - "swapRedBlue": "Rood/Blauw omwisselen", - "swapRedBlueDesc": "Wissel de rode en blauwe kleurkanalen (lost enkele kleurproblemen op)", - "readOnly": "Alleen-lezen", - "readOnlyDesc": "Bekijk het externe scherm zonder invoer te verzenden", - "telnetPort": "Telnet poort", - "terminalType": "Terminal type", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Kleurenschema", - "backspaceKey": "Backspace Sleutel", - "saveHostFirst": "Sla host eerst op.", - "sharingOptionsAfterSave": "Opties voor delen zijn beschikbaar nadat de host is opgeslagen.", - "sharingLoadError": "Laden van gedeelde gegevens mislukt. Controleer je verbinding en probeer het opnieuw.", - "shareHostSection": "Deel host", - "shareWithUser": "Delen met gebruiker", - "shareWithRole": "Delen met rol", - "selectUser": "Selecteer gebruiker", - "selectRole": "Selecteer lidmaatschap", - "selectUserOption": "Selecteer een gebruiker...", - "selectRoleOption": "Selecteer een rol...", - "permissionLevel": "Permissie niveau", - "expiresInHours": "Verloopt in (uren)", - "noExpiryPlaceholder": "Laat leeg voor geen vervaldatum", - "shareBtn": "Delen", - "currentAccess": "Huidige Toegang", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Bevoegdheden", - "grantedByHeader": "Toegekend door", - "expiresHeader": "Verloopt", - "noAccessEntries": "Nog geen toegangsinsignes.", - "expiredLabel": "Verlopen", - "neverLabel": "Nooit", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "annuleren", - "savingBtn": "Opslaan...", - "updateHostBtn": "Host bijwerken", - "addHostBtn": "Host toevoegen" + "cancelBtn": "Annuleren", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Zoek hosts, commando's of instellingen...", - "quickActions": "Snelle acties", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", "hostManager": "Host Manager", - "hostManagerDesc": "Hosts beheren of bewerken", - "addNewHost": "Nieuwe host toevoegen", - "addNewHostDesc": "Registreer een nieuwe host", - "adminSettings": "Beheerder Instellingen", - "adminSettingsDesc": "Systeemvoorkeuren en gebruikers configureren", - "userProfile": "Gebruikers Profiel", - "userProfileDesc": "Beheer uw account en voorkeuren", - "addCredential": "Toegangsgegevens toevoegen", - "addCredentialDesc": "SSH sleutels of wachtwoorden opslaan", - "recentActivity": "Recente Activiteiten", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Servers & Hosts", - "noHostsFound": "Geen hosts gevonden die overeenkomen met \"{{search}}\"", - "links": "Koppelingen", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Selecteren", - "toggleWith": "Schakelen met" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Geen tabblad toegewezen", + "noTabAssigned": "No tab assigned", "focusedPane": "Actief venster" }, "connections": { "noConnections": "Geen verbindingen", "noConnectionsDesc": "Open een terminal, bestandsbeheerder of extern bureaublad om de verbindingen hier te bekijken.", - "connectedFor": "Verbonden voor {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Aangesloten", "disconnected": "Verbinding verbroken", "closeTab": "Tab sluiten", @@ -801,358 +981,374 @@ "sectionBackground": "Achtergrond", "backgroundDesc": "Sessies blijven 30 minuten na de onderbreking actief en kunnen daarna opnieuw worden verbonden.", "persisted": "Bleef op de achtergrond aanwezig", - "expiresIn": "Verloopt over {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Zoek naar verbanden...", - "noSearchResults": "Er zijn geen resultaten gevonden die overeenkomen met uw zoekopdracht." + "noSearchResults": "Er zijn geen resultaten gevonden die overeenkomen met uw zoekopdracht.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Verbinden met {{type}} sessie...", - "connectionError": "Verbindingsfout", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Verbinding mislukt", - "failedToConnect": "Verbinding token ophalen mislukt", - "hostNotFound": "Host niet gevonden", - "noHostSelected": "Geen host geselecteerd", - "reconnect": "Opnieuw verbinden", - "retry": "Opnieuw", - "guacdUnavailable": "Desktop service (guacd) is niet beschikbaar. Zorg ervoor dat guacd wordt uitgevoerd en toegankelijk en goed geconfigureerd in de admin-instellingen.", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Opnieuw verbinding maken", + "retry": "Opnieuw proberen", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Vergrendelscherm)", - "winKey": "Windows Sleutel", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Verschuiving", - "win": "Gewonnen", - "stickyActive": "{{key}} (vergrendelde - klik om te lozen)", - "stickyInactive": "{{key}} (klik om te vergrendelen)", - "esc": "Ontsnap", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Startpagina", - "end": "Beëindigen", - "pageUp": "Pagina omhoog", - "pageDown": "Pagina omlaag", - "arrowUp": "Pijl omhoog", - "arrowDown": "Pijl omlaag", - "arrowLeft": "Pijl links", - "arrowRight": "Pijl rechts", - "fnToggle": "Functie toetsen", - "reconnect": "Sessie opnieuw verbinden", - "collapse": "Werkbalk samenvouwen", - "expand": "Werkbalk uitvouwen", - "dragHandle": "Sleep om opnieuw te plaatsen" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Verbinding maken met host", - "clear": "Verwijderen", - "paste": "Plakken", - "reconnect": "Opnieuw verbinden", - "connectionLost": "Verbinding verbroken", - "connected": "Verbonden", - "clipboardWriteFailed": "Kopiëren naar klembord mislukt. Zorg ervoor dat de pagina via HTTPS of localhost wordt geserveerd.", - "clipboardReadFailed": "Lezen van klembord mislukt. Zorg ervoor dat machtigingen voor klembord zijn verleend.", - "clipboardHttpWarning": "Plakken vereist HTTPS. Gebruik Ctrl+Shift+V of gebruik Termix over HTTPS.", - "unknownError": "Onbekende fout opgetreden", - "websocketError": "WebSocket verbindingsfout", - "connecting": "Verbinden...", - "noHostSelected": "Geen host geselecteerd", - "reconnecting": "Opnieuw verbinden... ({{attempt}}/{{max}})", - "reconnected": "Succesvol opnieuw verbonden", - "tmuxSessionCreated": "tmux sessie gemaakt: {{name}}", - "tmuxSessionAttached": "tmux sessie gekoppeld: {{name}}", - "tmuxUnavailable": "tmux is niet geïnstalleerd op de externe host, terug vallen op standaard shell", - "tmuxSessionPickerTitle": "tmux sessies", - "tmuxSessionPickerDesc": "Bestaande tmux-sessies gevonden in deze host. Selecteer er een om opnieuw toe te voegen of maak een nieuwe sessie aan.", - "tmuxWindows": "Vensters", - "tmuxWindowCount": "{{count}} venster", - "tmuxAttached": "Bijgevoegde klanten", - "tmuxAttachedCount": "{{count}} bijgevoegd", - "tmuxLastActivity": "Laatste activiteit", - "tmuxTimeJustNow": "op dit moment", - "tmuxTimeMinutes": "{{count}}m geleden", - "tmuxTimeHours": "{{count}}uur geleden", - "tmuxTimeDays": "{{count}}dagen geleden", - "tmuxCreateNew": "Nieuwe sessie starten", - "tmuxCopyHint": "Pas de selectie aan en druk op Enter om naar het klembord te kopiëren", - "tmuxDetach": "Loskoppelen van tmux sessie", - "tmuxDetached": "Losgekoppeld van tmux sessie", - "maxReconnectAttemptsReached": "Maximum aantal herverbindingpogingen bereikt", - "closeTab": "Afsluiten", - "connectionTimeout": "Connectie time-out", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Opnieuw verbinding maken", + "connectionLost": "Connection lost", + "connected": "Aangesloten", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Lopende {{command}} - {{host}}", - "totpRequired": "Tweestapsverificatie vereist", - "totpCodeLabel": "Verificatie Code", - "totpVerify": "Verifiëren", - "warpgateAuthRequired": "Warpgate verificatie vereist", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", "warpgateSecurityKey": "Security Key", - "warpgateAuthUrl": "URL authenticatie", - "warpgateOpenBrowser": "Open in browser", - "warpgateContinue": "Ik heb authenticatie voltooid", - "opksshAuthRequired": "OPKSSH authenticatie vereist", - "opksshAuthDescription": "Voltooi de authenticatie in je browser om door te gaan. Deze sessie blijft 24 uur geldig.", - "opksshOpenBrowser": "Browser openen om te verifiëren", - "opksshWaitingForAuth": "Wachten op authenticatie in browser...", - "opksshAuthenticating": "Authenticatie verwerken...", - "opksshTimeout": "Authenticatie is verlopen. Probeer het opnieuw.", - "opksshAuthFailed": "Authenticatie mislukt. Controleer uw inloggegevens en probeer het opnieuw.", - "opksshSignInWith": "Log in met {{provider}}", - "sudoPasswordPopupTitle": "Wachtwoord invoeren?", - "websocketAbnormalClose": "De verbinding is onverwacht afgesloten. Dit kan veroorzaakt zijn door een reverse proxy of SSL configuratie probleem. Controleer de server logs.", - "connectionLogTitle": "Connectie Log", - "connectionLogCopy": "Logboeken naar klembord kopiëren", - "connectionLogEmpty": "Nog geen verbindingslogs", - "connectionLogWaiting": "Wachten op verbindingslogboeken...", - "connectionLogCopied": "Verbindingslogboeken gekopieerd naar het klembord", - "connectionLogCopyFailed": "Kan de logs niet kopiëren naar het klembord", - "connectionRejected": "Verbinding geweigerd door de server. Controleer uw authenticatie en netwerkconfiguratie.", - "hostKeyRejected": "SSH host sleutel verificatie afgewezen. Verbinding geannuleerd.", - "sessionTakenOver": "Sessie is geopend in een ander tabblad. Opnieuw verbinden..." + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Open", + "linkDialogCopy": "Kopiëren", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Gesplitst tabblad", + "addToSplit": "Toevoegen aan splitsen", + "removeFromSplit": "Verwijderen uit Split" + } }, "fileManager": { - "noHostSelected": "Geen host geselecteerd", - "initializingEditor": "Editor initialiseren...", - "file": "Bestand", - "folder": "Map", - "uploadFile": "Bestand uploaden", - "downloadFile": "downloaden", - "extractArchive": "Archief uitpakken", - "extractingArchive": "Uitpakken {{name}}...", - "archiveExtractedSuccessfully": "{{name}} succesvol uitgepakt", - "extractFailed": "Uitpakken mislukt", - "compressFile": "Comprimeren bestand", - "compressFiles": "Comprimeren van bestanden", - "compressFilesDesc": "Comprimeer {{count}} items in een archief", - "archiveName": "Archief Naam", - "enterArchiveName": "Archiefnaam invoeren char@@0", - "compressionFormat": "Compressie formaat", - "selectedFiles": "Geselecteerde bestanden", - "andMoreFiles": "en {{count}} meer...", - "compress": "Comprimeren", - "compressingFiles": "{{count}} items comprimeren naar {{name}}...", - "filesCompressedSuccessfully": "{{name}} succesvol aangemaakt", - "compressFailed": "Compressie mislukt", - "edit": "Bewerken", - "preview": "Voorvertoning", - "previous": "named@@0", - "next": "Volgende", - "pageXOfY": "Pagina {{current}} van {{total}}", - "zoomOut": "Zoom uit", - "zoomIn": "Zoom in", - "newFile": "Nieuw bestand", - "newFolder": "Folder toevoegen", - "rename": "Hernoem", - "uploading": "Uploaden...", - "uploadingFile": "Uploaden {{name}}...", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", "fileName": "File Name", - "folderName": "Map Naam", - "fileUploadedSuccessfully": "Bestand \"{{name}}\" succesvol geüpload", - "failedToUploadFile": "Kan bestand niet uploaden", - "fileDownloadedSuccessfully": "{{name}}\" Bestand succesvol gedownload", - "failedToDownloadFile": "Downloaden van bestand mislukt", - "fileCreatedSuccessfully": "Bestand \"{{name}}\" succesvol aangemaakt", - "folderCreatedSuccessfully": "Map \"{{name}}\" succesvol aangemaakt", - "failedToCreateItem": "Item maken mislukt", - "operationFailed": "{{operation}} bewerking mislukt voor {{name}}: {{error}}", - "failedToResolveSymlink": "Symlink vinden mislukt", - "itemsDeletedSuccessfully": "{{count}} items succesvol verwijderd", - "failedToDeleteItems": "Kan items niet verwijderen", - "sudoPasswordRequired": "Beheerder wachtwoord vereist", - "enterSudoPassword": "Voer sudo wachtwoord in om door te gaan met deze bewerking", - "sudoPassword": "Sudo wachtwoord", - "sudoOperationFailed": "Sudo bewerking mislukt", - "sudoAuthFailed": "Sudo authenticatie mislukt", - "dragFilesToUpload": "Sleep bestanden hier om te uploaden", - "emptyFolder": "Deze map is leeg", - "searchFiles": "Bestanden zoeken...", - "upload": "Uploaden", - "selectHostToStart": "Selecteer een host om bestandsbeheer te starten", - "sshRequiredForFileManager": "Bestandsbeheer vereist SSH. Deze host heeft geen SSH ingeschakeld.", - "failedToConnect": "Kan geen verbinding maken met SSH", - "failedToLoadDirectory": "Map laden mislukt", - "noSSHConnection": "Geen SSH verbinding beschikbaar", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "copy": "Kopiëren", - "cut": "Knippen", - "paste": "Plakken", - "copyPath": "Pad kopiëren", - "copyPaths": "Paden kopiëren", - "delete": "Verwijderen", - "properties": "Eigenschappen", - "refresh": "Vernieuwen", - "downloadFiles": "Download {{count}} bestanden naar Browser", - "copyFiles": "{{count}} items kopiëren", - "cutFiles": "Knip {{count}} items", - "deleteFiles": "{{count}} items verwijderen", - "filesCopiedToClipboard": "{{count}} items gekopieerd naar klembord", - "filesCutToClipboard": "{{count}} items geknipt naar het klembord", - "pathCopiedToClipboard": "Pad gekopieerd naar klembord", - "pathsCopiedToClipboard": "{{count}} paden gekopieerd naar klembord", - "failedToCopyPath": "Kopiëren van pad naar klembord is mislukt", - "movedItems": "{{count}} items verplaatst", - "failedToDeleteItem": "Kan item niet verwijderen", - "itemRenamedSuccessfully": "{{type}} succesvol hernoemd", - "failedToRenameItem": "Kan item niet hernoemen", - "download": "downloaden", - "permissions": "Machtigingen", - "size": "Grootte", - "modified": "Gewijzigd", - "path": "Pad", - "confirmDelete": "Weet u zeker dat u {{name}} wilt verwijderen?", - "permissionDenied": "Toestemming geweigerd", - "serverError": "Server fout", - "fileSavedSuccessfully": "Bestand succesvol opgeslagen", - "failedToSaveFile": "Bestand opslaan mislukt", - "confirmDeleteSingleItem": "Weet u zeker dat u wilt verwijderen \"{{name}}\"?", - "confirmDeleteMultipleItems": "Weet u zeker dat u {{count}} items permanent wilt verwijderen?", - "confirmDeleteMultipleItemsWithFolders": "Weet u zeker dat u {{count}} items permanent wilt verwijderen? Dit omvat mappen en hun inhoud.", - "confirmDeleteFolder": "Weet u zeker dat u de map \"{{name}}\" en alle bijbehorende inhoud permanent wilt verwijderen?", - "permanentDeleteWarning": "Deze actie kan niet ongedaan worden gemaakt. De item(s) zullen permanent worden verwijderd van de server.", - "recent": "Recentelijk", - "pinned": "Vastgezet", - "folderShortcuts": "Map snelkoppelingen", - "failedToReconnectSSH": "Kon SSH sessie niet opnieuw verbinden", - "openTerminalHere": "Open terminal hier", - "run": "Uitvoeren", - "openTerminalInFolder": "Open terminal in deze map", - "openTerminalInFileLocation": "Open terminal op bestandslocatie", - "runningFile": "Lopend - {{file}}", - "onlyRunExecutableFiles": "Uitvoerbare bestanden kunnen alleen worden uitgevoerd", - "directories": "Mappen", - "removedFromRecentFiles": "\"{{name}}\" verwijderd van recente bestanden", - "removeFailed": "Verwijderen mislukt", - "unpinnedSuccessfully": "Losgemaakt \"{{name}}\" met succes", - "unpinFailed": "Ontpinnen mislukt", - "removedShortcut": "Snelkoppeling \"{{name}} \" verwijderd", - "removeShortcutFailed": "Snelkoppeling verwijderen mislukt", - "clearedAllRecentFiles": "Alle recente bestanden gewist", - "clearFailed": "Opschonen mislukt", - "removeFromRecentFiles": "Verwijderen uit recente bestanden", - "clearAllRecentFiles": "Alle recente bestanden wissen", - "unpinFile": "Bestand losmaken", - "removeShortcut": "Snelkoppeling verwijderen", - "pinFile": "Pin bestand", - "addToShortcuts": "Toevoegen aan snelkoppelingen", - "pasteFailed": "Plakken mislukt", - "noUndoableActions": "Geen onuitvoerbare acties", - "undoCopySuccess": "Ongedaan kopiëren bewerking: verwijderde {{count}} gekopieerde bestanden", - "undoCopyFailedDelete": "Herstel mislukt: gekopieerde bestanden verwijderen is mislukt", - "undoCopyFailedNoInfo": "Herstel mislukt: gekopieerde bestandsinformatie kon niet gevonden worden", - "undoMoveSuccess": "Ongedaan verplaatsen bewerking: {{count}} bestanden teruggebracht naar de oorspronkelijke locatie", - "undoMoveFailedMove": "Ongedaan maken mislukt: Kon geen bestanden terugplaatsen", - "undoMoveFailedNoInfo": "Ongedaan maken mislukt: Kon verplaatste bestandsinformatie niet vinden", - "undoDeleteNotSupported": "Verwijderen actie kan niet ongedaan worden gemaakt: bestanden zijn permanent verwijderd van de server", - "undoTypeNotSupported": "Niet-ondersteunde actie type ongedaan maken", - "undoOperationFailed": "Annuleren actie mislukt", - "unknownError": "Onbekende fout.", - "confirm": "Bevestigen", - "find": "Zoeken...", - "replace": "Vervangen", - "downloadInstead": "Download in plaats daarvan", - "keyboardShortcuts": "Toetsenbord snelkoppelingen", - "searchAndReplace": "Zoeken & vervangen", - "editing": "Bewerken", - "search": "Zoeken", - "findNext": "Volgende zoeken", - "findPrevious": "Vorige zoeken", - "save": "Opslaan", - "selectAll": "Alles selecteren", - "undo": "Herstel", - "redo": "Opnieuw", - "moveLineUp": "Lijn omhoog verplaatsen", - "moveLineDown": "Lijn omlaag verplaatsen", - "toggleComment": "Opmerking in-/uitschakelen", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Vastgepind", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Loop", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Fout bij laden van afbeelding", - "startTyping": "Begin met typen...", - "unknownSize": "Onbekende grootte", - "fileIsEmpty": "Bestand is leeg", - "largeFileWarning": "Waarschuwing groot bestand", - "largeFileWarningDesc": "Dit bestand is {{size}} in grootte, dit kan prestatieproblemen veroorzaken bij het openen van de tekst.", - "fileNotFoundAndRemoved": "Bestand \"{{name}}\" niet gevonden en is verwijderd van recente / vastgezette bestanden", - "failedToLoadFile": "Bestand laden mislukt: {{error}}", - "serverErrorOccurred": "Serverfout opgetreden. Probeer het later opnieuw.", - "autoSaveFailed": "Automatisch opslaan mislukt", - "fileAutoSaved": "Bestand automatisch opgeslagen", - "moveFileFailed": "{{name}} kon niet verplaatst worden", - "moveOperationFailed": "Verplaatsen mislukt", - "canOnlyCompareFiles": "Kan slechts twee bestanden vergelijken", - "comparingFiles": "Bestanden vergelijken: {{file1}} en {{file2}}", - "dragFailed": "Sleep bewerking mislukt", - "filePinnedSuccessfully": "Bestand \"{{name}}\" met succes vastgezet", - "pinFileFailed": "Kan bestand niet vastmaken", - "fileUnpinnedSuccessfully": "Bestand \"{{name}}\" is succesvol losgemaakt", - "unpinFileFailed": "Kan bestand niet losmaken", - "shortcutAddedSuccessfully": "Snelkoppeling \"{{name}}\" succesvol toegevoegd", - "addShortcutFailed": "Snelkoppeling toevoegen mislukt", - "operationCompletedSuccessfully": "{{operation}} {{count}} items succesvol", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", "operationCompleted": "{{operation}} {{count}} items", - "downloadFileSuccess": "{{name}} bestand succesvol gedownload", - "downloadFileFailed": "Downloaden mislukt", - "moveTo": "Verplaatsen naar {{name}}", - "diffCompareWith": "Verschil met {{name}}", - "dragOutsideToDownload": "Sleep buiten het venster om te downloaden ({{count}} bestanden)", - "newFolderDefault": "Nieuwe map", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Succesvol {{count}} items verplaatst naar {{target}}", - "move": "Verplaatsen", - "searchInFile": "In bestand zoeken (Ctrl+F)", - "showKeyboardShortcuts": "Toon sneltoetsen", - "startWritingMarkdown": "Begin met het schrijven van de markdown inhoud...", - "loadingFileComparison": "Bestandsvergelijking laden...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Beweging", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Vergelijk", - "sideBySide": "Zijde door Zijde", + "compare": "Compare", + "sideBySide": "Side by Side", "inline": "Inline", - "fileComparison": "Bestand Vergelijking: {{file1}} vs {{file2}}", - "fileTooLarge": "Bestand te groot: {{error}}", - "sshConnectionFailed": "SSH verbinding mislukt. Controleer uw verbinding met {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Bestand laden mislukt: {{error}}", - "connecting": "Verbinden...", - "connectedSuccessfully": "Succesvol verbonden", - "totpVerificationFailed": "TOTP-verificatie mislukt", - "warpgateVerificationFailed": "Warpgate authenticatie mislukt", - "authenticationFailed": "Authenticatie mislukt", - "verificationCodePrompt": "Verificatiecode:", - "changePermissions": "Rechten wijzigen", - "currentPermissions": "Huidige permissies", - "owner": "Eigenaar", - "group": "Groeperen", - "others": "Anderen", - "read": "Lezen", - "write": "Schrijven", - "execute": "Uitvoeren", - "permissionsChangedSuccessfully": "Machtigingen met succes gewijzigd", - "failedToChangePermissions": "Permissies wijzigen mislukt", - "name": "naam", - "sortByName": "naam", - "sortByDate": "Datum gewijzigd", - "sortBySize": "Grootte", - "ascending": "Oplopend", - "descending": "Aflopend", - "root": "Hoofd", - "new": "Nieuw", - "sortBy": "Sorteren op", - "items": "Artikelen", - "selected": "Geselecteerd", - "editor": "Tekstverwerker", - "octal": "Octaal", - "storage": "Opslagruimte", - "disk": "Schijf", - "used": "Gebruikt", - "of": "van", - "toggleSidebar": "Zijbalk in-/uitschakelen", - "cannotLoadPdf": "Kan PDF niet laden", - "pdfLoadError": "Er is een fout opgetreden bij het laden van dit PDF-bestand.", - "loadingPdf": "PDF laden...", - "loadingPage": "Pagina laden..." + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopiëren naar host…", - "moveToHost": "Verplaats naar host…", - "copyItemsToHost": "Kopieer {{count}} items naar host…", - "moveItemsToHost": "Verplaats {{count}} items naar host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Er zijn geen andere bestandsbeheerhosts beschikbaar.", "noHostsConnectedHint": "Voeg een andere SSH-host toe met Bestandsbeheer ingeschakeld in Hostbeheer.", "selectDestinationHost": "Selecteer de bestemmingshost", @@ -1164,48 +1360,48 @@ "browseDestination": "Bladeren of pad invoeren", "confirmCopy": "Kopiëren", "confirmMove": "Beweging", - "transferring": "Overdracht…", - "compressing": "Comprimeren…", - "extracting": "Extractie van…", - "transferringItems": "Overdracht van {{current}} van {{total}} items…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Overdracht voltooid", "transferError": "Overdracht mislukt", - "transferPartial": "Overdracht voltooid met {{count}} fouten", - "transferPartialHint": "Overdracht mislukt: {{paths}}", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", "itemsSummary": "{{count}} items", "destMustBeDirectory": "De bestemming moet een adresboek zijn voor overdrachten van meerdere items.", "selectThisFolder": "Selecteer deze map", "browsePathWillBeCreated": "Deze map bestaat nog niet. Hij wordt aangemaakt zodra de overdracht start.", "browsePathError": "Dit pad kon niet worden geopend op de doelhost.", "goUp": "Ga omhoog", - "copyFolderToHost": "Kopieer de map naar de host…", - "moveFolderToHost": "Map verplaatsen naar host…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Klaar", - "hostConnecting": "Verbinding maken…", + "hostConnecting": "Connecting…", "hostDisconnected": "Niet verbonden", "hostAuthRequired": "Authenticatie vereist — open eerst Bestandsbeheer op deze host.", "hostConnectionFailed": "Verbinding mislukt", "metricsTitle": "Transfertijden", - "metricsPrepare": "Bestemming voorbereiden: {{duration}}", - "metricsCompress": "Comprimeren op bron: {{duration}}", - "metricsHopSourceRead": "Bron → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → bestemming (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → bestemming (lokaal): {{throughput}}", - "metricsTransfer": "Einde tot einde: {{throughput}} ({{duration}})", - "metricsExtract": "Uitpakken op bestemming: {{duration}}", - "metricsSourceDelete": "Verwijderen uit de bron: {{duration}}", - "metricsTotal": "Totaal: {{duration}}", - "progressCompressing": "Comprimeren op de bronhost…", - "progressExtracting": "Uitpakken op bestemming…", - "progressTransferring": "Gegevens overdragen…", - "progressReconnecting": "Opnieuw verbinding maken…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Parallelle transferstroken", - "parallelSegmentsOption": "{{count}} rijstroken", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Grote bestanden worden opgesplitst in blokken van 256 MB. Meerdere lanes gebruiken aparte verbindingen (alsof er meerdere overdrachten worden gestart) voor een hogere totale doorvoer.", - "progressTotalSpeed": "{{speed}} totaal ({{lanes}} rijstroken)", - "progressTransferringItems": "Bestanden overdragen ({{current}} van {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} bestanden", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Bronbestanden behouden (gedeeltelijke overdracht)", "jumpHostLimitation": "Beide hosts moeten bereikbaar zijn vanaf de Termix-server. Directe routering tussen hosts wordt niet ondersteund.", "cancel": "Annuleren", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Selecteert tar of SFTP per bestand op basis van het aantal bestanden, de grootte en de comprimeerbaarheid. Voor afzonderlijke bestanden wordt altijd streaming SFTP gebruikt.", "methodTarHint": "Comprimeer op de bron, verstuur één archiefbestand en pak het uit op de bestemming. Vereist tar op beide Unix-hosts.", "methodItemSftpHint": "Verstuur elk bestand afzonderlijk via SFTP. Werkt op alle besturingssystemen, inclusief Windows.", - "methodPreviewLoading": "Berekeningsmethode voor overdracht…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "De overdrachtsmethode kon niet worden bekeken. De server kiest nog steeds een methode wanneer u start.", "methodPreviewWillUseTar": "Zal gebruiken: Tar-archief", "methodPreviewWillUseItemSftp": "Zal gebruikmaken van: SFTP per bestand", - "methodPreviewScanSummary": "{{fileCount}} bestanden, {{totalSize}} totaal (gescand op de bronhost).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Elk bestand gebruikt dezelfde SFTP-stream als een kopie van een enkel bestand, de een na de ander. De voortgang wordt gecombineerd voor alle bestanden, waardoor de voortgangsbalk langzaam beweegt bij grote bestanden.", "methodReason": { "user_item_sftp": "Je hebt gekozen voor SFTP per bestand.", "user_tar": "Je hebt gekozen voor een tar-archief.", "tar_unavailable": "Tar is niet beschikbaar op een of beide hosts; in plaats daarvan wordt SFTP per bestand gebruikt.", "windows_host": "Er wordt gebruikgemaakt van een Windows-host; tar wordt niet gebruikt.", - "auto_multi_large": "Automatisch: meerdere bestanden, waaronder een groot bestand ({{largestSize}}) met comprimeerbare gegevens — tar bundelt deze tot één overdracht.", - "auto_single_large_in_archive": "Auto: één groot bestand ({{largestSize}}) in deze set — SFTP per bestand.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automatisch: voornamelijk niet-comprimeerbare gegevens — SFTP per bestand.", - "auto_many_files": "Auto: veel bestanden ({{fileCount}}) — tar vermindert de overhead per bestand.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automatisch: SFTP per bestand voor deze set." }, "progressCancel": "Annuleren", - "progressCancelling": "Annuleren…", + "progressCancelling": "Cancelling…", "progressStalled": "Vastgelopen", "resumedHint": "De verbinding met een actieve overdracht die in een ander venster is gestart, is hersteld.", "transferCancelled": "Overdracht geannuleerd", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Er zijn gedeeltelijke gegevens op de bestemming bewaard gebleven. De herhaalpoging wordt hervat zodra de verbinding hersteld is." }, "tunnels": { - "noSshTunnels": "Geen SSH tunnels", - "createFirstTunnelMessage": "U heeft nog geen SSH tunnels aangemaakt. Configureer tunnelverbindingen in de Host Manager om te beginnen.", - "connected": "Verbonden", - "disconnected": "Losgekoppeld", - "connecting": "Verbinden...", - "error": "Foutmelding", - "canceling": "Annuleren...", - "connect": "Verbinden", - "disconnect": "Verbreek", - "cancel": "annuleren", - "port": "Poort", - "localPort": "Lokale poort", - "remotePort": "Externe poort", - "currentHostPort": "Huidige host poort", - "endpointPort": "Eindpunt Poort", - "bindIp": "Lokaal IP-adres", - "endpointSshConfig": "Endpoint SSH configuratie", - "endpointSshHost": "Eindpunt SSH host", - "endpointSshHostPlaceholder": "Selecteer een geconfigureerde host", - "endpointSshHostRequired": "Selecteer een SSH-host voor elke clienttunnel.", - "attempt": "Poging {{current}} van {{max}}", - "nextRetryIn": "Volgende herpoging in {{seconds}} seconden", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Aangesloten", + "disconnected": "Verbinding verbroken", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Annuleren", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Client Tunnels", "clientTunnel": "Client Tunnel", - "addClientTunnel": "Client-tunnel toevoegen", - "noClientTunnels": "Geen clienttunnels op dit bureaublad geconfigureerd.", - "tunnelName": "Tunnel naam", - "remoteHost": "Externe host", - "autoStart": "Automatisch starten", - "clientAutoStartDesc": "Start wanneer deze desktopclient opent en verbonden blijft.", - "clientManualStartDesc": "Start en Stop vanaf deze rij. Termix zal het niet automatisch openen.", - "clientRemoteServerNote": "Op afstand doorschakelen kan AllowTcpForwarding en GatewayPorts vereisen op de SSH-server van het eindpunt. De externe poort sluit wanneer deze desktop verbinding verbreekt.", - "clientTunnelStarted": "Client tunnel gestart", - "clientTunnelStopped": "Clienttunnel gestopt", - "tunnelTestSucceeded": "Tunnel test geslaagd", - "tunnelTestFailed": "Tunnel test mislukt", - "localSaved": "Client tunnels opgeslagen", - "localSaveError": "Opslaan van lokale clienttunnels mislukt", - "invalidBindIp": "Lokaal IP adres moet een geldig IPv4-adres zijn.", - "invalidLocalTargetIp": "Lokaal doel IP moet een geldig IPv4-adres zijn.", - "invalidLocalPort": "De lokale poort moet tussen 1 en 65535 liggen.", - "invalidRemotePort": "De externe poort moet tussen 1 en 65535 liggen.", - "invalidLocalTargetPort": "Lokale doelpoort moet tussen 1 en 65535 liggen.", - "invalidEndpointPort": "Eindpunt poort moet tussen 1 en 65535 liggen.", - "duplicateAutoStartBind": "Slechts één auto-start tunnel kan {{bind}} gebruiken.", - "manualControlError": "Bijwerken van tunnel status mislukt.", - "active": "actief", - "start": "Beginnen", - "stop": "Stoppen", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", "test": "Test", - "type": "Tunnel type", - "typeLocal": "Lokaal (-L)", - "typeRemote": "Afstandsbediening (-R)", - "typeDynamic": "Dynamisch (-D)", - "typeServerLocalDesc": "Huidige host tot het eindpunt.", - "typeServerRemoteDesc": "Eindig terug naar de huidige host.", - "typeClientLocalDesc": "Lokale computer tot het eindpunt.", - "typeClientRemoteDesc": "Eindpoint terug naar de lokale computer.", - "typeClientDynamicDesc": "SOCKS op lokale computer.", - "typeDynamicDesc": "SOCKS5 CONNECT-verkeer via SSH doorsturen", - "forwardDescriptionServerLocal": "Huidige host {{sourcePort}} → eindpunt {{endpointPort}}.", - "forwardDescriptionServerRemote": "Eindpunt {{endpointPort}} → huidige host {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS van huidige host {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokale {{sourcePort}} → remote {{endpointPort}}.", - "forwardDescriptionClientRemote": "Externe {{sourcePort}} → lokale {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS op lokale poort {{sourcePort}}.", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "Lokale {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokale {{localPort}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Route:", - "lastStarted": "Laatst gestart", - "lastTested": "Laatst getest", - "lastError": "Laatste fout", - "maxRetries": "Maximaal aantal pogingen", - "maxRetriesDescription": "Maximale hoeveelheid opnieuw proberen te proberen.", - "retryInterval": "Interval opnieuw proberen (seconden)", - "retryIntervalDescription": "Tijd om te wachten tussen opnieuw proberen pogingen.", - "local": "lokaal", - "remote": "Afstandsbediening", - "destination": "Doelstelling", - "host": "Hostnaam", - "mode": "Modus", - "noHostSelected": "Geen host geselecteerd", - "working": "Bezig..." + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Geheugen", - "disk": "Schijf", - "network": "Netwerk", - "uptime": "Actief", - "processes": "Proces", - "available": "Beschikbaar", - "free": "Vrij", - "connecting": "Verbinden...", - "connectionFailed": "Kan geen verbinding maken met de server", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "{{count}} kern", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU gebruik", - "memoryUsage": "Geheugen gebruik", - "diskUsage": "Schijf gebruik", - "failedToFetchHostConfig": "Hostconfiguratie ophalen mislukt", - "serverOffline": "Server offline", - "cannotFetchMetrics": "Kan statistieken niet ophalen van offline server", - "totpFailed": "TOTP-verificatie mislukt", - "noneAuthNotSupported": "Server Stats ondersteunt geen 'none' authenticatietype.", - "load": "Belasting", - "systemInfo": "Systeem informatie", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Operating systeem", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "seconden", - "networkInterfaces": "Netwerk Interfaces", - "noInterfacesFound": "Geen netwerkinterfaces gevonden", - "noProcessesFound": "Geen processen gevonden", - "loginStats": "SSH loginstatistieken", - "noRecentLoginData": "Geen recente inloggegevens", - "executingQuickAction": "Uitvoeren {{name}}...", - "quickActionSuccess": "{{name}} succesvol voltooid", - "quickActionFailed": "{{name}} is mislukt", - "quickActionError": "Kan {{name}} niet uitvoeren", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Luisterende Poorten", + "title": "Listening Ports", "protocol": "Protocol", - "port": "Poort", - "address": "Adres:", - "process": "Verwerk", - "noData": "Geen afluisterhavengegevens" + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inactief", - "policy": "Beleid", - "rules": "regels", - "noData": "Geen firewall gegevens beschikbaar", - "action": "actie", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Poort", - "source": "Bron", - "anywhere": "Overal" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Lading Gem.", - "swap": "Wisselen", - "architecture": "Architectuur", - "refresh": "Vernieuwen", - "retry": "Opnieuw" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Opnieuw proberen", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Loop", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Zelf gehoste SSH- en beheerservices voor externe bureaubladen", - "loginTitle": "Inloggen op Termix", - "registerTitle": "Account Aanmaken", - "forgotPassword": "Wachtwoord Vergeten?", - "rememberMe": "Onthoud apparaat voor 30 dagen (inclusief TOTP)", - "noAccount": "Nog geen account?", - "hasAccount": "Heeft u al een account?", - "twoFactorAuth": "Tweestapsverificatie verificatie", - "enterCode": "Voer verificatiecode in", - "backupCode": "Of gebruik back-up code", - "verifyCode": "Verifieer code", - "redirectingToApp": "Omleiden naar app...", - "sshAuthenticationRequired": "SSH-verificatie vereist", - "sshNoKeyboardInteractive": "Keyboard-Interactive Authenticatie niet beschikbaar", - "sshAuthenticationFailed": "Authenticatie mislukt", - "sshAuthenticationTimeout": "Authenticatie Time-out", - "sshNoKeyboardInteractiveDescription": "De server ondersteunt geen keyboard-interactieve authenticatie. Geef uw wachtwoord of SSH sleutel op.", - "sshAuthFailedDescription": "De ingevoerde referenties zijn onjuist. Probeer het opnieuw met geldige inloggegevens.", - "sshTimeoutDescription": "De verificatiepoging is verlopen. Probeer het opnieuw.", - "sshProvideCredentialsDescription": "Geef uw SSH inloggegevens op om verbinding te maken met deze server.", - "sshPasswordDescription": "Voer het wachtwoord in voor deze SSH verbinding.", - "sshKeyPasswordDescription": "Als uw SSH sleutel is versleuteld, voer hier het wachtwoord in.", - "passphraseRequired": "Wachtwoordzin vereist", - "passphraseRequiredDescription": "De SSH sleutel is versleuteld. Voer het wachtwoord in om te ontgrendelen.", - "back": "Achterzijde", - "firstUser": "Eerste gebruiker", - "firstUserMessage": "U bent de eerste gebruiker en zal een beheerder worden. U kunt de beheerdersinstellingen bekijken in de dropdown van de sidebar gebruikers. Als u denkt dat dit een vergissing is, bekijk dan de logboeken van de docker of maak een GitHub probleem.", - "external": "Extern", - "loginWithExternal": "Inloggen met externe provider", - "loginWithExternalDesc": "Login met behulp van uw geconfigureerde externe identiteitsprovider", - "externalNotSupportedInElectron": "Externe authenticatie wordt nog niet ondersteund in de Electron app. Gebruik de web versie voor OIDC login.", - "resetPasswordButton": "Wachtwoord opnieuw instellen", - "sendResetCode": "Reset-code verzenden", - "resetCodeDesc": "Voer uw gebruikersnaam in om een wachtwoord reset code te ontvangen. De code zal worden ingelogd in de container logs van de koppeler.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verifieer code", - "enterResetCode": "Voer de 6-cijferige code van de docker container logs in voor gebruiker:", - "newPassword": "Nieuw wachtwoord", - "confirmNewPassword": "Bevestig wachtwoord", - "enterNewPassword": "Voer uw nieuwe wachtwoord in voor gebruiker:", - "signUp": "Meld je aan", - "desktopApp": "Bureaublad App", - "loggingInToDesktopApp": "Inloggen op de desktopapp", - "loadingServer": "Server laden...", - "dataLossWarning": "Het resetten van uw wachtwoord op deze manier zal al uw opgeslagen SSH hosts, referenties en andere versleutelde data verwijderen. Deze actie kan niet ongedaan worden gemaakt. Gebruik deze actie alleen als u uw wachtwoord bent vergeten en u niet bent ingelogd.", - "authenticationDisabled": "Authenticatie uitgeschakeld", - "authenticationDisabledDesc": "Alle verificatiemethoden zijn momenteel uitgeschakeld. Neem contact op met uw beheerder.", - "attemptsRemaining": "{{count}} resterende pogingen" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifieer SSH host-sleutel", - "keyChangedWarning": "SSH host-sleutel gewijzigd", - "firstConnectionTitle": "Eerste keer verbinden met deze host", - "firstConnectionDescription": "De authenticiteit van deze host kan niet worden vastgesteld. Controleer of de vingerafdruk overeenkomt met uw verwachting.", - "keyChangedDescription": "De hostsleutel voor deze server is veranderd sinds je laatste verbinding. Dit kan duiden op een beveiligingsprobleem.", - "previousKey": "Vorige sleutel", - "newFingerprint": "Nieuwe vingerafdruk", - "fingerprint": "Vingerafdruk", - "verifyInstructions": "Als je deze host vertrouwt, klik je op Accepteren om door te gaan en sla deze vingerafdruk op voor toekomstige verbindingen.", - "securityWarning": "Waarschuwing beveiliging", - "acceptAndContinue": "Accepteren & doorgaan", - "acceptNewKey": "Accepteer Nieuwe Sleutel & Doorgaan" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Kan niet verbinden met de database", - "unknownError": "Onbekende fout.", - "loginFailed": "Inloggen mislukt", - "failedPasswordReset": "Wachtwoord resetten starten mislukt", - "failedVerifyCode": "Verifiëren reset code mislukt", - "failedCompleteReset": "Wachtwoord resetten voltooien mislukt", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "OIDC login starten mislukt", - "silentSigninOidcUnavailable": "Stille aanmelding is aangevraagd, maar OIDC-login is niet beschikbaar.", - "failedUserInfo": "Fout bij het ophalen van gebruikersinformatie na het inloggen", - "oidcAuthFailed": "OIDC authenticatie mislukt", - "invalidAuthUrl": "Ongeldige autorisatie URL ontvangen van de backend", - "requiredField": "Dit veld is verplicht", - "minLength": "Minimale lengte is {{min}}", - "passwordMismatch": "Wachtwoorden komen niet overeen", - "passwordLoginDisabled": "Gebruikersnaam/wachtwoord login is momenteel uitgeschakeld", - "sessionExpired": "Sessie verlopen - Log opnieuw in", - "totpRateLimited": "Tarief beperkt: Te veel TOTP-verificatiepogingen. Probeer het later opnieuw.", - "totpRateLimitedWithTime": "Tarief beperkt: te veel TOTP verificatiepogingen. Wacht {{time}} seconden voordat u het opnieuw probeert.", - "resetCodeRateLimited": "Snelheid beperkt: Te veel verificatiepogingen. Probeer het later opnieuw.", - "resetCodeRateLimitedWithTime": "Tarief beperkt: Te veel verificatiepogingen. Wacht {{time}} seconden voordat u het opnieuw probeert.", - "authTokenSaveFailed": "Authenticatietoken opslaan mislukt", - "failedToLoadServer": "Kon server niet laden" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Nieuwe accountregistratie is momenteel uitgeschakeld door een beheerder. Log in of neem contact op met een beheerder.", - "userNotAllowed": "Uw account is niet gemachtigd om te registreren. Neem contact op met een beheerder.", - "databaseConnectionFailed": "Kan geen verbinding maken met de databaseserver", - "resetCodeSent": "Reset de code verzonden naar de Docker logs", - "codeVerified": "Code succesvol geverifieerd", - "passwordResetSuccess": "Wachtwoord succesvol opnieuw instellen", - "loginSuccess": "Inloggen succesvol", - "registrationSuccess": "Registratie succesvol" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Lokale desktoptunnels gericht op geconfigureerde SSH hosts.", - "c2sTunnelPresets": "Voorinstellingen voor klanttunnel", - "c2sTunnelPresetsDesc": "Sla de lokale tunnellijst van deze desktop cliënt op als een voorkeursinstelling met naam server of laad een voorinstelling terug naar deze client.", - "c2sTunnelPresetsUnavailable": "Client tunnelvoorinstellingen zijn alleen beschikbaar in de desktop client.", - "c2sPresetName": "Naam voorinstelling", - "c2sPresetNamePlaceholder": "Naam van voorinstelling klant", - "c2sPresetToLoad": "Voorinstelling om te laden", - "c2sNoPresetSelected": "Geen voorinstelling geselecteerd", - "c2sNoPresets": "Geen voorinstellingen opgeslagen", - "c2sLoadPreset": "Belasting", - "c2sCurrentLocalConfig": "{{count}} lokale clienttunnel(s) geconfigureerd op dit bureaublad.", - "c2sPresetSyncNote": "Voorkeursinstellingen zijn expliciete momentopnamen, het laden van deze desktop cliënt tunnellijst vervangt.", - "c2sPresetSaved": "Client tunnel voorinstelling opgeslagen", - "c2sPresetLoaded": "Client tunnel voorinstelling lokaal geladen", - "c2sPresetRenamed": "Klant tunnel voorinstelling hernoemd", - "c2sPresetDeleted": "Client tunnel voorinstelling verwijderd", - "c2sPresetLoadError": "Fout bij het laden van de clienttunnel voorinstellingen" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Taal", - "keyPassword": "sleutel wachtwoord", - "pastePrivateKey": "Plak uw persoonlijke sleutel hier...", - "localListenerHost": "127.0.1 (lokaal beluisteren)", - "localTargetHost": "127.0.1 (doel op deze computer)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Voer je wachtwoord in", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { "title": "Dashboard", - "loading": "Dashboard wordt geladen...", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Ondersteuning", - "discord": "Onenigheid", - "serverOverview": "Server overzicht", - "version": "Versie", - "upToDate": "Tot op heden", - "updateAvailable": "Update beschikbaar", - "beta": "Bèta", - "uptime": "Actief", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", "database": "Database", - "healthy": "Gezond", - "error": "Foutmelding", - "totalHosts": "Totaal aantal hosts", - "totalTunnels": "Totaal aantal tunnels", - "totalCredentials": "Totaal Aanmeldgegevens", - "recentActivity": "Recente Activiteiten", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Recente activiteit laden...", - "noRecentActivity": "Geen recente activiteit", - "quickActions": "Snelle acties", - "addHost": "Host toevoegen", - "addCredential": "Toegangsgegevens toevoegen", - "adminSettings": "Beheerder Instellingen", - "userProfile": "Gebruikers Profiel", - "serverStats": "Server Statistieken", - "loadingServerStats": "Server statistieken laden...", - "noServerData": "Geen servergegevens beschikbaar", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Dashboard aanpassen", - "dashboardSettings": "Dashboard instellingen", - "enableDisableCards": "Kaarten in-/uitschakelen", - "resetLayout": "Standaardinstellingen herstellen", - "serverOverviewCard": "Server overzicht", - "recentActivityCard": "Recente Activiteiten", - "networkGraphCard": "Netwerk Grafiek", - "networkGraph": "Netwerk Grafiek", - "quickActionsCard": "Snelle acties", - "serverStatsCard": "Server Statistieken", - "panelMain": "Algemeen", - "panelSide": "Zijde", - "justNow": "op dit moment" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABLE", "hostsOnline": "Hosts Online", - "activeTunnels": "Actieve tunnels", - "registerNewServer": "Registreer een nieuwe server", - "storeSshKeysOrPasswords": "SSH sleutels of wachtwoorden opslaan", - "manageUsersAndRoles": "Gebruikers en rollen beheren", - "manageYourAccount": "Beheer je account", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", "hostStatus": "Host Status", - "noHostsConfigured": "Geen hosts geconfigureerd", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", - "offline": "AANBIEDING", + "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Toevoegen:", - "commandPalette": "Command palet", - "done": "Voltooid", - "editModeInstructions": "Sleep kaarten om te rangschikken · Sleep de kolom verdeler om kolommen aan te passen · Sleep de onderrand van een kaart om de hoogte aan te passen · Prullenbak om te verwijderen", - "empty": "Leeg", - "clear": "Verwijderen" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopiëren", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Host toevoegen", - "addGroup": "Groep toevoegen", - "addLink": "Link toevoegen", - "zoomIn": "Zoom in", - "zoomOut": "Zoom uit", - "resetView": "Weergave resetten", - "selectHost": "Selecteer Host", - "chooseHost": "Kies een host...", - "parentGroup": "Bovenliggende groep", - "noGroup": "Geen groep", - "groupName": "Groep Naam", - "color": "Kleur", - "source": "Bron", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Verplaats naar groep", - "selectGroup": "Selecteer groep...", - "addConnection": "Voeg contact toe", - "hostDetails": "Details host", - "removeFromGroup": "Verwijder uit groep", - "addHostHere": "Host hier toevoegen", - "editGroup": "Groep bewerken", - "delete": "Verwijderen", - "add": "Toevoegen", - "create": "Aanmaken", - "move": "Verplaatsen", - "connect": "Verbinden", - "createGroup": "Groep aanmaken", - "selectSourcePlaceholder": "Selecteer bron...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Beweging", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Ongeldig bestand", - "hostAlreadyExists": "Host is al in de topologie", - "connectionExists": "Verbinding bestaat al", - "unknown": "onbekend", - "name": "naam", - "ip": "IP-adres", - "status": "status", - "failedToAddNode": "Toevoegen van node mislukt", - "sourceDifferentFromTarget": "Bron en doel moeten verschillend zijn", - "exportJSON": "JSON exporteren", - "importJSON": "JSON importeren", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Bestands Beheer", + "fileManager": "Bestandsbeheerder", "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Server Statistieken", - "noNodes": "Nog geen knooppunten" + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker is niet ingeschakeld voor deze host", - "validating": "Docker valideren...", - "connecting": "Verbinden...", - "error": "Foutmelding", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Kan geen verbinding maken met Docker", - "containerStarted": "Container {{name}} gestart", - "failedToStartContainer": "Kan container {{name}} niet starten", - "containerStopped": "Container {{name}} gestopt", - "failedToStopContainer": "Stoppen van container {{name}} mislukt", - "containerRestarted": "Container {{name}} herstart", - "failedToRestartContainer": "Herstarten van container {{name}} is mislukt", - "containerPaused": "Container {{name}} onderbroken", - "containerUnpaused": "Container {{name}} ononderbroken", - "failedToTogglePauseContainer": "Pauzestatus voor container {{name}} in- en uitschakelen mislukt", - "containerRemoved": "Container {{name}} verwijderd", - "failedToRemoveContainer": "Verwijderen van container {{name}} mislukt", - "image": "Afbeelding", - "ports": "Poorten", - "noPorts": "Geen poorten", - "start": "Beginnen", - "confirmRemoveContainer": "Weet u zeker dat u de container '{{name}}' wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", - "runningContainerWarning": "Waarschuwing: Deze container is momenteel actief. Verwijderen zal de container eerst stoppen.", - "loadingContainers": "containers laden...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker Manager", - "autoRefresh": "Automatisch verversen", - "timestamps": "Tijdstempels", - "lines": "Regels", - "filterLogs": "Logboeken filteren...", - "refresh": "Vernieuwen", - "download": "downloaden", - "clear": "Verwijderen", - "logsDownloaded": "Logboeken succesvol gedownload", - "last50": "Laatste 50", - "last100": "Laatste 100", - "last500": "Laatste 500", - "last1000": "Laatste 1000", - "allLogs": "Alle logs", - "noLogsMatching": "Geen logs die overeenkomen met \"{{query}}\"", - "noLogsAvailable": "Geen logs beschikbaar", - "noContainersFound": "Geen containers gevonden", - "noContainersFoundHint": "Er zijn geen Docker containers beschikbaar op deze host", - "searchPlaceholder": "Zoek containers...", - "allStatuses": "Alle statussen", - "stateRunning": "Lopend", - "statePaused": "Gepauzeerd", - "stateExited": "Verlaat", - "stateRestarting": "Herstarten", - "noContainersMatchFilters": "Geen containers die overeenkomen met uw filters", - "noContainersMatchFiltersHint": "Probeer uw zoekopdracht of filtercriteria aan te passen", - "failedToFetchStats": "Kan containerstatistieken niet ophalen", - "containerNotRunning": "Container niet actief", - "startContainerToViewStats": "Begin de container om statistieken te bekijken", - "loadingStats": "Statistieken laden...", - "errorLoadingStats": "Fout bij laden statistieken", - "noStatsAvailable": "Geen statistieken beschikbaar", - "cpuUsage": "CPU gebruik", - "current": "Stroom", - "memoryUsage": "Geheugen gebruik", - "networkIo": "Netwerk I/O", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Uitvoer", - "blockIo": "Blokkeer I/O", - "read": "Lezen", - "write": "Schrijven", - "pids": "PID's", - "containerInformation": "Container informatie", - "name": "naam", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Provincie", - "containerMustBeRunning": "Container moet worden uitgevoerd voor toegangsconsole", - "verificationCodePrompt": "Voer verificatiecode in", - "totpVerificationFailed": "TOTP-verificatie mislukt. Probeer het opnieuw.", - "warpgateVerificationFailed": "Warpgate authenticatie is mislukt. Probeer het opnieuw.", - "connectedTo": "Verbonden met {{containerName}}", - "disconnected": "Losgekoppeld", - "consoleError": "Console fout", - "errorMessage": "Fout: {{message}}", - "failedToConnect": "Kan geen verbinding maken met container", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Verbinding verbroken", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", "console": "Console", - "selectShell": "Selecteer shell", - "bash": "Basis", - "sh": "sha", - "ash": "as", - "connect": "Verbinden", - "disconnect": "Verbreek", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Niet verbonden", - "clickToConnect": "Klik op verbinden om een shell sessie te starten", - "connectingTo": "Verbinden met {{containerName}}...", - "containerNotFound": "Container niet gevonden", - "backToList": "Terug naar lijst", - "logs": "Logboeken", - "stats": "Statistieken", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", "consoleTab": "Console", - "startContainerToAccess": "Start de container voor toegang tot de console" + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Algemeen", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Gebruikers", - "sectionSessions": "Sessies", - "sectionRoles": "Rollen", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", "sectionDatabase": "Database", - "sectionApiKeys": "API sleutels", - "allowRegistration": "Gebruikersregistratie toestaan", - "allowRegistrationDesc": "Laat nieuwe gebruikers zichzelf registreren", - "allowPasswordLogin": "Wachtwoord-login toestaan", - "allowPasswordLoginDesc": "Gebruikersnaam/wachtwoord login", - "oidcAutoProvision": "OIDC Auto-Provisie", - "oidcAutoProvisionDesc": "Automatisch accounts aanmaken voor OIDC-gebruikers, zelfs wanneer registratie is uitgeschakeld", - "allowPasswordReset": "Wachtwoord opnieuw instellen toestaan", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Filters wissen", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", "allowPasswordResetDesc": "Reset code via Docker logs", - "sessionTimeout": "Sessie time-out", - "hours": "Uren", - "sessionTimeoutRange": "Min 1u · Max 720u", - "monitoringDefaults": "Standaardwaarden controleren", - "statusCheck": "Status Controle", - "metrics": "Statistieken", - "sec": "sec.", - "logLevel": "Log niveau", - "enableGuacamole": "Guacamole inschakelen", - "enableGuacamoleDesc": "RDP/VNC afstandsbediening", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "Configureer OpenID Connect voor SSO. Velden gemarkeerd * zijn vereist.", - "oidcClientId": "Klant ID", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", "oidcClientSecret": "Client Secret", - "oidcAuthUrl": "URL autorisatie", - "oidcIssuerUrl": "URL uitgever", - "oidcTokenUrl": "URL token", - "oidcUserIdentifier": "Pad voor gebruikersID's", - "oidcDisplayName": "Toon naam pad", - "oidcScopes": "Toepassingsgebieden", - "oidcUserinfoUrl": "Gebruikersinfo URL overschrijven", - "oidcAllowedUsers": "Toegestane gebruikers", - "oidcAllowedUsersDesc": "Eén e-mail per regel. Laat leeg om alles toe te staan.", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", "removeOidc": "Verwijderen", - "usersCount": "{{count}} gebruikers", - "createUser": "Aanmaken", - "newRole": "Nieuwe rol", - "roleName": "naam", - "roleDisplayName": "Toon naam", - "roleDescription": "Beschrijving", - "rolesCount": "{{count}} rollen", - "createRole": "Aanmaken", - "creating": "Maken...", - "exportDatabase": "Exporteer database", - "exportDatabaseDesc": "Download een back-up van alle hosts, referenties en instellingen", - "export": "Exporteren", - "exporting": "Exporteren...", - "importDatabase": "Importeer database", - "importDatabaseDesc": "Herstel vanaf een .sqlite reservekopiebestand", - "importDatabaseSelected": "Geselecteerd: {{name}}", - "selectFile": "Bestand selecteren", - "changeFile": "Veranderen", - "import": "Importeren", - "importing": "Importeren...", - "apiKeysCount": "{{count}} sleutels", - "newApiKey": "Nieuwe API-sleutel", - "apiKeyCreatedWarning": "Sleutel gemaakt - kopieer het nu, het zal niet meer worden weergegeven.", - "apiKeyName": "naam", - "apiKeyUser": "Gebruiker", - "apiKeySelectUser": "Selecteer een gebruiker...", - "apiKeyExpiresAt": "Verloopt op", - "createKey": "Sleutel aanmaken", - "apiKeyNoExpiry": "Geen vervaldatum", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Dubbele authenticatie", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "lokaal", - "adminStatusAdministrator": "Beheerder", - "adminStatusRegularUser": "Normale gebruiker", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "AANGEPASTE", - "youBadge": "JIJ", - "sessionsActive": "{{count}} actief", - "sessionActive": "Actief: {{time}}", - "sessionExpires": "Uitbreiden: {{time}}", - "revokeAll": "Allemaal", - "revokeAllSessionsSuccess": "Alle sessies van de gebruiker ingetrokken", - "revokeAllSessionsFailed": "Intrekken van sessies mislukt", - "revokeSessionFailed": "Intrekken van de sessie is mislukt", - "addRole": "Rol toevoegen", - "noCustomRoles": "Geen aangepaste rollen gedefinieerd", - "removeRoleFailed": "Rol verwijderen mislukt", - "assignRoleFailed": "Toewijzen van rol mislukt", - "deleteRoleFailed": "Rol verwijderen mislukt", - "userAdminAccess": "Beheerder", - "userAdminAccessDesc": "Volledige toegang tot alle admin instellingen", - "userRoles": "Rollen", - "revokeAllUserSessions": "Alle sessies intrekken", - "revokeAllUserSessionsDesc": "Forceer opnieuw inloggen op alle apparaten", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Het verwijderen van deze gebruiker is definitief.", - "deleteUser": "{{username}} verwijderen", - "deleting": "Verwijderenchar@@0", - "deleteUserFailed": "Kan gebruiker niet verwijderen", - "deleteUserSuccess": "Gebruiker \"{{username}}\" verwijderd", - "deleteRoleSuccess": "Rol \"{{name}}\" verwijderd", - "revokeKeySuccess": "Sleutel \"{{name}}\" ingetrokken", - "revokeKeyFailed": "Kan sleutel niet intrekken", - "copiedToClipboard": "Gekopieerd naar klembord", - "done": "Voltooid", - "createUserTitle": "Gebruiker aanmaken", - "createUserDesc": "Maak een nieuw lokaal account aan.", - "createUserUsername": "Gebruikersnaam", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Wachtwoord", - "createUserPasswordHint": "Minimaal 6 tekens.", - "createUserEnterUsername": "Gebruikersnaam invoeren", - "createUserEnterPassword": "Wachtwoord invoeren", - "createUserSubmit": "Gebruiker aanmaken", - "editUserTitle": "Gebruiker beheren: {{username}}", - "editUserDesc": "Bewerk rollen, admin status, sessies en account instellingen.", - "editUserUsername": "Gebruikersnaam", - "editUserAuthType": "Authenticatie Type", - "editUserAdminStatus": "Beheerder status", - "editUserUserId": "Gebruiker ID", - "linkAccountTitle": "OIDC koppelen aan wachtwoord account", - "linkAccountDesc": "Voeg de OIDC account {{username}} samen met een bestaand lokaal account.", - "linkAccountWarningTitle": "Dit zal:", - "linkAccountEffect1": "Verwijder de OIDC-only account", - "linkAccountEffect2": "OIDC login toevoegen aan het doelaccount", - "linkAccountEffect3": "OIDC en wachtwoord toestaan", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Voer de lokale gebruikersnaam in om naar te linken", - "linkAccounts": "Accounts koppelen", - "linkAccountSuccess": "OIDC-account gekoppeld aan \"{{username}}\"", - "linkAccountFailed": "Het koppelen van het OIDC-account is mislukt.", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Auth-type", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Koppelen...", - "saving": "Opslaan...", - "updateRegistrationFailed": "Fout bij het bijwerken van de registratie instelling", - "updatePasswordLoginFailed": "Bijwerken van wachtwoordaanmeldingsinstelling mislukt", - "updateOidcAutoProvisionFailed": "Update OIDC auto-voorziening instelling mislukt", - "updatePasswordResetFailed": "Bijwerken van wachtwoord-reset instelling mislukt", - "sessionTimeoutRange2": "Sessie time-out moet tussen 1 en 720 uur zijn", - "sessionTimeoutSaved": "Sessie timeout opgeslagen", - "sessionTimeoutSaveFailed": "Opslaan van sessie timeout mislukt", - "monitoringIntervalInvalid": "Ongeldige intervalwaarden", - "monitoringSaved": "Toezicht instellingen opgeslagen", - "monitoringSaveFailed": "Opslaan van monitoring instellingen mislukt", - "guacamoleSaved": "Guacamole instellingen opgeslagen", - "guacamoleSaveFailed": "Guacamole instellingen opslaan mislukt", - "guacamoleUpdateFailed": "Guacamole instelling bijwerken mislukt", - "logLevelUpdateFailed": "Bijwerken van logniveau is mislukt", - "oidcSaved": "OIDC configuratie opgeslagen", - "oidcSaveFailed": "OIDC configuratie opslaan mislukt", - "oidcRemoved": "OIDC configuratie verwijderd", - "oidcRemoveFailed": "OIDC configuratie verwijderen mislukt", - "createUserRequired": "Gebruikersnaam en wachtwoord zijn verplicht", - "createUserPasswordTooShort": "Wachtwoord moet ten minste 6 tekens bevatten", - "createUserSuccess": "Gebruiker \"{{username}}\" aangemaakt", - "createUserFailed": "Gebruiker aanmaken mislukt", - "updateAdminStatusFailed": "Bijwerken van admin status mislukt", - "allSessionsRevoked": "Alle sessies ingetrokken", - "revokeSessionsFailed": "Intrekken van sessies mislukt", - "createRoleRequired": "Naam en weergavenaam zijn verplicht", - "createRoleSuccess": "Rol \"{{name}}\" gemaakt", - "createRoleFailed": "Rol aanmaken mislukt", - "apiKeyNameRequired": "Sleutelnaam is vereist", - "apiKeyUserRequired": "Gebruikers-ID is vereist", - "apiKeyCreatedSuccess": "API sleutel \"{{name}}\" gemaakt", - "apiKeyCreateFailed": "API-sleutel aanmaken mislukt", - "exportSuccess": "Database succesvol geëxporteerd", - "exportFailed": "Database export mislukt", - "importSelectFile": "Selecteer eerst een bestand", - "importCompleted": "Importeren voltooid: {{total}} items geïmporteerd, {{skipped}} is overgeslagen", - "importFailed": "Importeren mislukt: {{error}}", - "importError": "Database import mislukt" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Hostnaam", - "hostPlaceholder": "192.168.1.1 of voorbeeld.com", - "portLabel": "Poort", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Gebruikersnaam", - "usernamePlaceholder": "gebruikersnaam", - "authLabel": "Authenticatie", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Wachtwoord", - "passwordPlaceholder": "Wachtwoord", - "privateKeyLabel": "Persoonlijke sleutel", - "privateKeyPlaceholder": "Private key plakken...", - "credentialLabel": "Toegangsgegevens", - "credentialPlaceholder": "Selecteer een opgeslagen aanmeldgegevens", - "connectToTerminal": "Verbinden met terminal", - "connectToFiles": "Verbinden met bestanden" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Referentie", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Geen terminal geselecteerd", - "noTerminalSelectedHint": "Open een SSH terminal tabblad om de opdrachtgeschiedenis te bekijken", - "searchPlaceholder": "Geschiedenis zoeken...", - "clearAll": "Alles wissen", - "noHistoryEntries": "Geen geschiedenis items", - "trackingDisabled": "Geschiedenis volgen is uitgeschakeld", - "trackingDisabledHint": "Schakel het in bij je profielinstellingen om opdrachten op te nemen." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Sleutel Opname", - "recordToTerminals": "Opnemen naar aansluitingen", - "selectAll": "Allemaal", - "selectNone": "geen", - "noTerminalTabsOpen": "Geen terminal tabbladen geopend", - "selectTerminalsAbove": "Selecteer bovenstaande terminals", - "broadcastInputPlaceholder": "Typ hier om keystrokes...", - "stopRecording": "Opname stoppen", - "startRecording": "Opname starten", - "settingsTitle": "Instellingen", - "enableRightClickCopyPaste": "Rechtsklik kopiëren en plakken inschakelen" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Geen", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Indeling", - "selectLayoutAbove": "Selecteer een lay-out hierboven", - "selectLayoutHint": "Kies hoeveel panelen getoond moeten worden", - "panesTitle": "Vensters", - "openTabsTitle": "Tabbladen openen", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Sleep tabbladen naar de vensters hierboven, of gebruik Snel toewijzen", - "dropHere": "Hier neerzetten", - "emptyPane": "Leeg", + "dropHere": "Drop here", + "emptyPane": "Empty", "dashboard": "Dashboard", - "clearSplitScreen": "Wis Split Scherm", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Snel toewijzen", - "alreadyAssigned": "Paneel {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Gesplitst tabblad", "addToSplit": "Toevoegen aan splitsen", "removeFromSplit": "Verwijderen uit Split", - "assignToPane": "Toewijzen aan paneel" + "assignToPane": "Toewijzen aan paneel", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Snippet aanmaken", - "createSnippetDescription": "Maak een nieuwe opdrachtsnippet voor snelle uitvoering", - "nameLabel": "naam", - "namePlaceholder": "b.v. Nginx herstarten", - "descriptionLabel": "Beschrijving", - "descriptionPlaceholder": "Optionele beschrijving", - "optional": "Optioneel", - "folderLabel": "Map", - "noFolder": "Geen map (niet gecategoriseerd)", - "commandLabel": "Opdracht", - "commandPlaceholder": "bijv. nginx herstarten", - "cancel": "annuleren", - "createSnippetButton": "Snippet aanmaken", - "createFolderTitle": "Map aanmaken", - "createFolderDescription": "Organiseer uw snippets in mappen", - "folderNameLabel": "Map Naam", - "folderNamePlaceholder": "b.v. Systeem Commando's, Docker Scripts", - "folderColorLabel": "Map kleur", - "folderIconLabel": "Map pictogram", - "previewLabel": "Voorvertoning", - "folderNameFallback": "Map Naam", - "createFolderButton": "Map aanmaken", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Annuleren", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Allemaal", - "selectNone": "geen", - "noTerminalTabsOpen": "Geen terminal tabbladen geopend", - "searchPlaceholder": "Tekstfragmenten zoeken...", - "newSnippet": "Nieuwe snippet", - "newFolder": "Folder toevoegen", - "run": "Uitvoeren", - "noSnippetsInFolder": "Geen tekstbouwstenen in deze map", - "uncategorized": "Ongecategoriseerd", - "editSnippetTitle": "Tekstfragment bewerken", - "editSnippetDescription": "Deze opdrachtsnippet bijwerken", - "saveSnippetButton": "Wijzigingen opslaan", - "createSuccess": "Snippet succesvol aangemaakt", - "createFailed": "Tekstfragment aanmaken mislukt", - "updateSuccess": "Tekstfragment met succes bijgewerkt", - "updateFailed": "Update snippet mislukt", - "deleteFailed": "Verwijderen van snippet mislukt", - "folderCreateSuccess": "Map succesvol aangemaakt", - "folderCreateFailed": "Map maken mislukt", - "editFolderTitle": "Map bewerken", - "editFolderDescription": "Het uiterlijk van deze map wijzigen of hernoemen", - "saveFolderButton": "Wijzigingen opslaan", - "editFolder": "Bewerk map", - "deleteFolder": "Map verwijderen", - "folderDeleteSuccess": "Map \"{{name}}\" verwijderd", - "folderDeleteFailed": "Map verwijderen mislukt", - "folderEditSuccess": "Map succesvol bijgewerkt", - "folderEditFailed": "Bijwerken map mislukt", + "selectAll": "All", + "selectNone": "Geen", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Loop", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Loop", "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", - "copySuccess": "Gekopieerd \"{{name}}\" naar klembord", - "shareTitle": "Deel snippet", - "shareUser": "Gebruiker", - "shareRole": "Functie", - "selectUser": "Selecteer een gebruiker...", - "selectRole": "Selecteer een rol...", - "shareSuccess": "Snippet succesvol gedeeld", - "shareFailed": "Delen van snippet mislukt", - "revokeSuccess": "Toegang ingetrokken", - "revokeFailed": "Toegang intrekken mislukt", - "currentAccess": "Huidige Toegang", - "shareLoadError": "Kan deelgegevens niet laden", - "loading": "Laden...", - "close": "Afsluiten", - "reorderFailed": "Het opslaan van de volgorde van de codefragmenten is mislukt." + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Het opslaan van de volgorde van de codefragmenten is mislukt.", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Rekening", - "sectionAppearance": "Uiterlijk", - "sectionSecurity": "Beveiliging", - "sectionApiKeys": "API sleutels", - "sectionC2sTunnels": "C2S tunnels", - "usernameLabel": "Gebruikersnaam", - "roleLabel": "Functie", - "roleAdministrator": "Beheerder", - "authMethodLabel": "Auth Methode", - "authMethodLocal": "lokaal", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "op", - "twoFaOff": "UIT", - "versionLabel": "Versie", - "deleteAccount": "Verwijder account", - "deleteAccountDescription": "Account permanent verwijderen", - "deleteButton": "Verwijderen", - "deleteAccountPermanent": "Deze actie is permanent en kan niet ongedaan worden gemaakt.", - "deleteAccountWarning": "Alle sessies, hosts, referenties en instellingen zullen permanent worden verwijderd.", - "confirmPasswordDeletePlaceholder": "Voer uw wachtwoord in ter bevestiging", - "languageLabel": "Taal", - "themeLabel": "Thema", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Accent kleur", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Commando automatisch aanvullen", - "commandAutocompleteDesc": "Automatisch aanvullen weergeven tijdens typen", - "historyTracking": "Geschiedenis bijhouden", - "historyTrackingDesc": "Terminal opdrachten bijhouden", - "syntaxHighlighting": "Syntaxis markering", - "syntaxHighlightingDesc": "Terminal uitvoer markeren", - "commandPalette": "Command palet", - "commandPaletteDesc": "Sneltoets inschakelen", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Tabbladen opnieuw openen bij inloggen", "reopenTabsOnLoginDesc": "Herstel je geopende tabbladen wanneer je inlogt of de pagina vernieuwt, zelfs vanaf een ander apparaat.", - "confirmTabClose": "Tabblad sluiten bevestigen", - "confirmTabCloseDesc": "Vragen voordat terminal tabbladen worden gesloten", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Toon Host Tags", - "showHostTagsDesc": "Toon tags in hostlijst", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Klik om de hostacties uit te breiden", "hostTrayOnClickDesc": "Toon altijd de verbindingsknoppen; klik om de beheermogelijkheden uit te vouwen in plaats van eroverheen te zweven.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Houd de app-rail aan de linkerkant altijd uitgevouwen in plaats van deze uit te vouwen wanneer je er met de muis overheen beweegt.", - "settingsSnippets": "Tekstbouwstenen", - "foldersCollapsed": "Mappen samengevouwen", - "foldersCollapsedDesc": "Mappen standaard samenvouwen", - "confirmExecution": "Uitvoering bevestigen", - "confirmExecutionDesc": "Bevestig voor uitvoeren snippets", - "settingsUpdates": "Bijwerken", - "disableUpdateChecks": "Schakel updatecontroles uit", - "disableUpdateChecksDesc": "Niet meer controleren op updates", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", "totpAuthenticator": "TOTP Authenticator", - "totpEnabled": "2FA is ingeschakeld", - "totpDisabled": "Extra inlogbeveiliging toevoegen", - "disable": "Uitschakelen", - "enable": "Inschakelen", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Scan QR-code of voer het geheim in in uw authenticator-app, voer dan de 6-cijferige code in", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verifiëren", - "changePassword": "Wachtwoord wijzigen", - "currentPasswordLabel": "Huidig wachtwoord", - "currentPasswordPlaceholder": "Huidig wachtwoord", - "newPasswordLabel": "Nieuw wachtwoord", - "newPasswordPlaceholder": "Nieuw wachtwoord", - "confirmPasswordLabel": "Bevestig nieuw wachtwoord", - "confirmPasswordPlaceholder": "Bevestig nieuw wachtwoord", - "updatePassword": "Wachtwoord bijwerken", - "createApiKeyTitle": "API-sleutel aanmaken", - "createApiKeyDescription": "Genereer een nieuwe API-sleutel voor programmatische toegang.", - "apiKeyNameLabel": "naam", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "optioneel", - "cancel": "annuleren", - "createKey": "Sleutel aanmaken", - "apiKeyCount": "{{count}} sleutels", - "newKey": "Nieuwe sleutel", - "noApiKeys": "Nog geen API-sleutels.", - "apiKeyActive": "actief", - "apiKeyUsageHint": "Voeg je sleutel toe aan de", - "apiKeyUsageHintHeader": "kop.", - "apiKeyPermissionsHint": "Sleutels erven de permissies van de aanmaak gebruiker.", - "roleUser": "Gebruiker", - "authMethodDual": "Dubbele authenticatie", + "optional": "optional", + "cancel": "Annuleren", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Kan TOTP installatie niet starten", - "totpEnter6Digits": "Voer een 6-cijferige code in", - "totpEnabledSuccess": "Tweestapsverificatie ingeschakeld", - "totpInvalidCode": "Ongeldige code, probeer het opnieuw", - "totpDisableInputRequired": "Voer uw TOTP-code of wachtwoord in", - "totpDisabledSuccess": "Tweestapsverificatie uitgeschakeld", - "totpDisableFailed": "2FA uitschakelen mislukt", - "totpDisableTitle": "2FA uitschakelen", - "totpDisablePlaceholder": "Voer TOTP-code of wachtwoord in", - "totpDisableConfirm": "2FA uitschakelen", - "totpContinueVerify": "Doorgaan met verifiëren", - "totpVerifyTitle": "Verifieer code", - "totpBackupTitle": "Back-up Codes", - "totpDownloadBackup": "Reservekopiecodes downloaden", - "done": "Voltooid", - "secretCopied": "Geheim naar klembord gekopieerd", - "apiKeyNameRequired": "Sleutelnaam is vereist", - "apiKeyCreated": "API sleutel \"{{name}}\" gemaakt", - "apiKeyCreateFailed": "API-sleutel aanmaken mislukt", - "apiKeyUser": "Gebruiker", - "apiKeyExpires": "Verloopt", - "apiKeyRevoked": "API key \"{{name}}\" ingetrokken", - "apiKeyRevokeFailed": "API-sleutel intrekken is mislukt", - "passwordFieldsRequired": "Huidige en nieuwe wachtwoorden zijn vereist", - "passwordMismatch": "Wachtwoorden komen niet overeen", - "passwordTooShort": "Wachtwoord moet ten minste 6 tekens bevatten", - "passwordUpdated": "Wachtwoord succesvol bijgewerkt", - "passwordUpdateFailed": "Bijwerken van wachtwoord mislukt", - "deletePasswordRequired": "Wachtwoord is vereist om je account te verwijderen", - "deleteFailed": "Kan account niet verwijderen", - "deleting": "Verwijderenchar@@0", - "colorPickerTooltip": "Kleurenkiezer openen", - "themeSystem": "Systeem", - "themeLight": "Licht", - "themeDark": "Donker", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Geïntegreerd", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Één Donker", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Opnieuw proberen", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Verwijderen", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/no_NO.json b/src/ui/locales/translated/no_NO.json index c9fdb358..ea10c4e6 100644 --- a/src/ui/locales/translated/no_NO.json +++ b/src/ui/locales/translated/no_NO.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Mapper", - "folder": "Mappe", + "folders": "Folders", + "folder": "Folder", "password": "Passord", - "key": "Nøkkel", - "sshPrivateKey": "SSH privatnøkkel", - "upload": "Last opp", - "keyPassword": "Nøkkelpassord", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "SSH-nøkkel", - "uploadPrivateKeyFile": "Last opp privat nøkkelfil", - "searchCredentials": "Søk i legitimasjon...", - "addCredential": "Legg til legitimasjon", - "caCertificate": "CA-sertifikat (-cert.pub)", - "caCertificateDescription": "Valgfritt: Last opp eller lim inn CA-signert sertifikatfil (f.eks id_ed25519-cert.pub). Kreves når SSH-serveren bruker sertifikatbasert autorisasjon.", - "uploadCertFile": "Last opp -cert.pub fil", - "clearCert": "Tøm", - "certLoaded": "Sertifikat lastet", - "certPublicKeyLabel": "CA sertifikat", - "certTypeLabel": "Sertifikat type", - "pasteOrUploadCert": "Lim inn eller last opp et -cert.pub sertifikat...", - "hasCaCert": "Har CA-sertifikat", - "noCaCert": "Ingen CA-sertifikat" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Standardordre", + "sortNameAsc": "Navn (A → Å)", + "sortNameDesc": "Navn (Å → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Fjern filtre", + "filterTypeGroup": "Type", + "filterTypePassword": "Passord", + "filterTypeKey": "SSH-nøkkel", + "filterTagsGroup": "Tagger" }, "homepage": { - "failedToLoadAlerts": "Kunne ikke laste varsler", - "failedToDismissAlert": "Kunne ikke avvise varsel" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Serverkonfigurasjon", - "description": "Konfigurer Termix-serverens URL for å koble til backend-tjenestene dine", - "serverUrl": "Server-URL", - "enterServerUrl": "Angi en server-URL", - "saveFailed": "Kunne ikke lagre konfigurasjonen", - "saveError": "Feil ved lagring av konfigurasjon", - "saving": "Lagrer...", - "saveConfig": "Lagre konfigurasjon", - "helpText": "Angi URL-en der Termix-serveren din kjører (f.eks. http://localhost:30001 eller https://din-server.com)", - "changeServer": "Bytt server", - "mustIncludeProtocol": "Server-URL må starte med http:// eller https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Tillat ugyldig sertifikat", "allowInvalidCertificateDesc": "Bruk kun for klarerte, selvhostede servere med selvsignerte sertifikater eller IP-adressesertifikater.", - "useEmbedded": "Bruk lokal server", - "embeddedDesc": "Kjør Termix med den innebygde lokale serveren (ingen ekstern server nødvendig)", - "embeddedConnecting": "Kobler til lokal server...", - "embeddedNotReady": "Lokal server er ikke klar ennå. Vennligst vent et øyeblikk og prøv igjen.", - "localServer": "Lokal Server" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Fjerne" }, "versionCheck": { - "error": "Feil ved versjonssjekk", - "checkFailed": "Kunne ikke se etter oppdateringer", - "upToDate": "Appen er oppdatert", - "currentVersion": "Du kjører versjon {{version}}", - "updateAvailable": "Oppdatering tilgjengelig", - "newVersionAvailable": "En ny versjon er tilgjengelig! Du kjører {{current}}, men {{latest}} er tilgjengelig.", - "betaVersion": "Beta versjon", - "betaVersionDesc": "Du kjører {{current}}, som er nyere enn den nyeste stabile utgivelsen {{latest}}.", - "releasedOn": "Utgitt {{date}}", - "downloadUpdate": "Last ned oppdatering", - "checking": "Ser etter oppdateringer...", - "checkUpdates": "Se etter oppdateringer", - "checkingUpdates": "Ser etter oppdateringer...", - "updateRequired": "Oppdatering påkrevd" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Lukk", - "minimize": "Minimer", - "online": "Tilkoblet", + "close": "Close", + "minimize": "Minimize", + "online": "På nett", "offline": "Frakoblet", - "continue": "Fortsett", - "maintenance": "Vedlikehold", - "degraded": "Redusert", - "error": "Feil", - "warning": "Advarsel", - "unsavedChanges": "Ulagrede endringer", - "dismiss": "Avvis", - "loading": "Laster...", - "optional": "Valgfritt", - "connect": "Koble til", - "copied": "Kopiert", - "connecting": "Kobler til...", - "updateAvailable": "Oppdatering tilgjengelig", - "appName": "Termiks", - "openInNewTab": "Åpne i ny fane", - "noReleases": "Ingen utgivelser", - "updatesAndReleases": "Oppdateringer og utgivelser", - "newVersionAvailable": "En ny versjon ({{version}}) er tilgjengelig.", - "failedToFetchUpdateInfo": "Kunne ikke hente oppdateringsinformasjon", - "preRelease": "Forhåndsutgivelse", - "noReleasesFound": "Ingen utgivelser funnet.", - "cancel": "Avbryt", - "username": "Brukernavn", - "login": "Logg inn", - "register": "Registrer", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Kansellere", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Passord", - "confirmPassword": "Bekreft passord", - "back": "Tilbake", - "save": "Lagre", - "saving": "Lagrer...", - "delete": "Slett", - "rename": "Omdøp", - "edit": "Rediger", - "add": "Legg til", - "confirm": "Bekreft", - "no": "Nei", - "or": "ELLER", - "next": "Neste", - "previous": "Forrige", - "refresh": "Oppdater", - "language": "Språk", - "checking": "Kontrollerer...", - "checkingDatabase": "Kontrollerer databaseforbindelse...", - "checkingAuthentication": "Kontrollerer autentisering...", - "backendReconnected": "Servertilkobling gjenopprettet", - "connectionDegraded": "Servertilkoblingen ble avbrutt, gjenopprettes…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Fjern", - "create": "Opprett", - "update": "Oppdater", - "copy": "Kopier", - "copyFailed": "Kan ikke kopiere til utklippstavlen", + "remove": "Fjerne", + "create": "Create", + "update": "Update", + "copy": "Kopiere", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Gjenopprett", - "of": "av" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Hjem", + "home": "Home", "terminal": "Terminal", - "docker": "Docker", - "tunnels": "Tunneler", + "docker": "Dokker", + "tunnels": "Tunnels", "fileManager": "Filbehandler", - "serverStats": "Serverstatistikk", - "admin": "Administrator", - "userProfile": "Brukerprofil", - "splitScreen": "Delt skjerm", - "confirmClose": "Lukk denne aktive økten?", - "close": "Lukk", - "cancel": "Avbryt", - "sshManager": "SSH-administrator", - "cannotSplitTab": "Kan ikke dele denne fanen", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Kansellere", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Kopier passordet", - "copySudoPassword": "Kopier Sudo passord", - "passwordCopied": "Passordet er kopiert til utklippstavlen", - "noPasswordAvailable": "Ingen passord tilgjengelig", - "failedToCopyPassword": "Kopiering av passord feilet", - "refreshTab": "Oppdater forbindelse", - "openFileManager": "Åpne filbehandler", - "dashboard": "Kontrollpanel", - "networkGraph": "Nettverksgraf", - "quickConnect": "Kjapp tilkobling", - "sshTools": "SSH verktøy", - "history": "Historikk", - "hosts": "Verter", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", "snippets": "Snippets", - "hostManager": "Vertadministrator", - "credentials": "Legitimasjon", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Tilkoblinger", - "roleAdministrator": "Administratorsiden", - "roleUser": "Bruker" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Verter", - "noHosts": "Ingen SSH-verter", - "retry": "Prøv igjen", - "refresh": "Oppdater", - "optional": "Valgfritt", - "downloadSample": "Last ned eksempel", - "failedToDeleteHost": "{{name}} kunne ikke slettes", - "importSkipExisting": "Importer (hopp over eksisterende)", - "connectionDetails": "Tilkoblingsdetaljer", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Prøv på nytt", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Eksternt skrivebord", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Brukernavn", - "folder": "Mappe", + "username": "Username", + "folder": "Folder", "tags": "Tagger", - "pin": "Fest", - "addHost": "Legg til vert", - "editHost": "Rediger vert", - "cloneHost": "Klon vert", - "enableTerminal": "Aktiver terminal", - "enableTunnel": "Aktiver tunnel", - "enableFileManager": "Aktiver filbehandler", - "enableDocker": "Aktiver Docker", - "defaultPath": "Standardsti", - "connection": "Tilkobling", - "upload": "Last opp", - "authentication": "Autentisering", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Passord", - "key": "Nøkkel", + "key": "Key", "credential": "Legitimasjon", "none": "Ingen", - "sshPrivateKey": "SSH-privatnøkkel", - "keyType": "Nøkkeltype", - "uploadFile": "Last opp fil", - "tabGeneral": "Generelt", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Tunneler", - "tabDocker": "Docker", - "tabFiles": "Filer", - "tabStats": "Statistikk", + "tabTunnels": "Tunnels", + "tabDocker": "Dokker", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Deling", - "tabAuthentication": "Autentisering", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", - "tunnel": "Tunnelen", + "tunnel": "Tunnel", "fileManager": "Filbehandler", - "serverStats": "Serverstatistikk", - "status": "Status:", - "folderRenamed": "Mappen \"{{oldName}}\" ble endret til \"{{newName}}\"", - "failedToRenameFolder": "Kunne ikke gi mappen nytt navn", - "movedToFolder": "Flyttet til \"{{folder}}\"", - "editHostTooltip": "Redigere vert", - "statusChecks": "Statussjekk", - "metricsCollection": "Beregninger samling", - "metricsInterval": "Intervall for statistikkinnsamling", - "metricsIntervalDesc": "Hvor ofte serverstatistikk skal innhentes (5s - 1t)", - "behavior": "Oppførsel", - "themePreview": "Temavisning", - "theme": "Tema", - "fontFamily": "Skrifttype", - "fontSize": "Skriftstørrelse", - "letterSpacing": "Bokstavavstand", - "lineHeight": "Linjehøyde", - "cursorStyle": "Markørstil", - "cursorBlink": "Blinkende markør", - "scrollbackBuffer": "Tilbakerullebuffer", - "bellStyle": "Varselstil", - "rightClickSelectsWord": "Høyreklikk velger ord", - "fastScrollModifier": "Modifikator for rask rulling", - "fastScrollSensitivity": "Følsomhet for rask rulling", - "sshAgentForwarding": "SSH-agentvideresending", - "backspaceMode": "Backspace-modus", - "startupSnippet": "Oppstarts-snippet", - "selectSnippet": "Velg snippet", - "forceKeyboardInteractive": "Tving tastaturinteraktiv", - "overrideCredentialUsername": "Overstyr brukernavn fra legitimasjon", - "overrideCredentialUsernameDesc": "Bruk brukernavnet som er angitt ovenfor i stedet for legitimasjonsbevisets brukernavn", - "jumpHostChain": "Hoppvertkjede", - "portKnocking": "Port knocking", - "addKnock": "Legge til port", - "addProxyNode": "Legg til Node", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", "proxyNode": "Proxy Node", - "proxyType": "Proxy type", - "quickActions": "Hurtighandlinger", - "sudoPasswordAutoFill": "Sudo passord autoutfyll", - "sudoPassword": "Sudo passord", - "keepaliveInterval": "Keepalive intervall (ms)", - "moshCommand": "MOSH kommando", - "environmentVariables": "Miljøvariabler", - "addVariable": "Legg til variabel", - "docker": "Docker", - "copyTerminalUrl": "Kopier URL til terminal", - "copyFileManagerUrl": "Kopier Filbehandling URL", - "copyRemoteDesktopUrl": "Kopier URL til eksternt skrivebord", - "failedToConnect": "Kan ikke koble til konsollen", - "connect": "Nettverk", - "disconnect": "Frakoblet", - "start": "Begynn", - "enableStatusCheck": "Aktiver statussjekk", - "enableMetrics": "Aktiver måltall", - "bulkUpdateFailed": "Masseoppdatering mislyktes", - "selectAll": "Velg alle", - "deselectAll": "Opphev merking", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Dokker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Sikker Shell", - "virtualNetwork": "Virtuelt nettverk", - "unencryptedShell": "Ukryptert skall", - "addressIp": "Adresse / IP", - "friendlyName": "Vennlig navn", - "folderAndAdvanced": "Mappe og avansert", - "privateNotes": "Private Notater", - "privateNotesPlaceholder": "Detaljer om denne serveren...", - "pinToTop": "Fest øverst", - "pinToTopDesc": "Vis alltid denne verten øverst i listen", - "portKnockingSequence": "Port Knocking sekvens", - "addKnockBtn": "Legg til knip", - "noPortKnocking": "Ingen port knocking konfigurert.", - "knockPort": "Enkelt port", - "protocol": "Protocol", - "delayAfterMs": "Forsinkelse etter (ms)", - "useSocks5Proxy": "Bruk SOCKS5 mellomtjener", - "useSocks5ProxyDesc": "Vei-tilkobling gjennom en mellomtjener", - "proxyHost": "Vert for mellomtjener", - "proxyPort": "Port for mellomtjener", - "proxyUsername": "Brukernavn for mellomtjener", - "proxyPassword": "Passord for mellomtjener", - "proxySingleMode": "Enkel proxy", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protokoll", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", "proxyChainMode": "Proxy Chain", - "you": "Du", - "jumpHostChainLabel": "Hopp over vert kjede", - "addJumpBtn": "Legg til Hopp", - "noJumpHosts": "Ingen hopp-verter konfigurert.", - "selectAServer": "Velg en server...", - "sshPort": "SSH port", - "authMethod": "Auth metode", - "storedCredential": "Lagret legitimasjon", - "selectACredential": "Velg en legitimasjon...", - "keyTypeLabel": "Type nøkkel", - "keyTypeAuto": "Automatisk gjenkjenning", - "keyPasteTab": "Lim", - "keyUploadTab": "Last opp", - "keyFileLoaded": "Nøkkelfil lastet", - "keyUploadClick": "Klikk for å laste opp .pem / .key / .ppk", - "clearKey": "Fjern nøkkel", - "keySaved": "SSH-nøkkelen er lagret", - "keyReplaceNotice": "lim inn en ny nøkkel nedenfor for å erstatte den", - "keyPassphraseSaved": "Passfrase lagret, type for å endre", - "replaceKey": "Erstatt nøkkel", - "forceKeyboardInteractiveLabel": "Tving tastatur interaktiv", - "forceKeyboardInteractiveShortDesc": "Tving manuell passord-oppføring selv om nøkler er tilstede", - "terminalAppearance": "Terminal utseende", - "colorTheme": "Farge Tema", - "fontFamilyLabel": "Skriftfamilie", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Markør stil", - "letterSpacingPx": "Avstand mellom brev (px)", - "lineHeightLabel": "Linje høyde", - "bellStyleLabel": "Bell stil", - "backspaceModeLabel": "Bakovertast modus", - "cursorBlinking": "Markør blink", - "cursorBlinkingDesc": "Aktiver blinking av animasjon for terminalmarkøren", - "rightClickSelectsWordLabel": "Høyreklikk Velger ord", - "rightClickSelectsWordShortDesc": "Velg ordet under markøren til høyreklikk", - "behaviorAndAdvanced": "Oppførsel & Avansert", - "scrollbackBufferLabel": "Rullback-buffer", - "scrollbackMaxLines": "Maksimalt antall linjer i historikk", - "sshAgentForwardingLabel": "SSH Agent videresending", - "sshAgentForwardingShortDesc": "Send dine lokale SSH-nøkler til denne verten", - "enableAutoMosh": "Aktiver automatisk Mosh", - "enableAutoMoshDesc": "Foretrekk Mosh over SSH hvis tilgjengelig", - "enableAutoTmux": "Aktiver Auto-Tmux", - "enableAutoTmuxDesc": "Automatisk start eller legg ved tmux-sesjon", - "sudoPasswordAutoFillLabel": "Sudo passord auto-utfylling", - "sudoPasswordAutoFillShortDesc": "Oppgi automatisk superpassord når du blir spurt", - "sudoPasswordLabel": "Sudo passord", - "environmentVariablesLabel": "Miljøvariabler", - "addVariableBtn": "Legg til variabel", - "noEnvVars": "Ingen miljøvariabler konfigurert.", - "fastScrollModifierLabel": "Rask rulleendring", - "fastScrollSensitivityLabel": "Rask rullefølsomhet", - "moshCommandLabel": "Mosh kommando", - "startupSnippetLabel": "Oppstart tekstutdrag", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Keepalive-intervall (sekunder)", - "maxKeepaliveMisses": "Maksimum antall tap av Keepi", - "tunnelSettings": "Innstillinger for tunnel", - "enableTunneling": "Aktiver tunellering", - "enableTunnelingDesc": "Aktiver SSH tunnel funksjonalitet for denne verten", - "serverTunnelsSection": "Server Tunneler", - "addTunnelBtn": "Legg til tunnel", - "noTunnelsConfigured": "Ingen tunneler konfigurert.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", - "tunnelType": "Type tunnel", - "tunnelModeLocalDesc": "Videresend en lokal port til en port på den eksterne serveren (eller en vert som kan nås fra den).", - "tunnelModeRemoteDesc": "Videresend en port på den eksterne serveren tilbake til en lokal port på maskinen.", - "tunnelModeDynamicDesc": "Opprett en SOCKS5-proxy på en lokal havn for dynamisk portvideresending.", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Denne verten (direkte tunnel)", - "endpointHost": "Endepunkt vert", - "endpointPort": "Endepunktport", - "bindHost": "Bind vert", - "sourcePort": "Kildeport", - "maxRetries": "Maks forsøk", - "retryIntervalS": "Prøv igjen intervall(er)", - "autoStartLabel": "Autostart", - "autoStartDesc": "Koble automatisk denne tunnelen når verten er lastet inn", - "tunnelConnecting": "Tunnelen tilkobler...", - "tunnelDisconnected": "Tunnelen er frakoblet", - "failedToConnectTunnel": "Kan ikke koble til", - "failedToDisconnectTunnel": "Kan ikke koble fra", - "dockerIntegration": "Docker integrasjon", - "enableDockerMonitor": "Aktiver Docker", - "enableDockerMonitorDesc": "Overvåk og administrer beholdere på denne verten via Docker", - "enableFileManagerMonitor": "Aktiver filbehandler", - "enableFileManagerMonitorDesc": "Bla gjennom og behandle filer på denne verten over SFTP", - "defaultPathLabel": "Standard sti", - "fileManagerPathHint": "Mappen som skal åpnes når filbehandleren starter for denne verten.", - "statusChecksLabel": "Statussjekk", - "enableStatusChecks": "Aktiver statuskontroll", - "enableStatusChecksDesc": "Periodisk ping av denne verten for å bekrefte tilgjengelighet", - "useGlobalInterval": "Bruk globalt intervall", - "useGlobalIntervalDesc": "Overstyr med statuskontrollintervallet for hele serveren", - "checkIntervalS": "Sjekk intervall (s)", - "checkIntervalDesc": "Sekunder mellom hver tilkobling ping", - "metricsCollectionLabel": "Beregninger samling", - "enableMetricsLabel": "Aktiver måltall", - "enableMetricsDesc": "Samle CPU, RAM, disk og nettverksbruk fra verten", - "useGlobalMetrics": "Bruk globalt intervall", - "useGlobalMetricsDesc": "Overstyr med intervallet for hele serveren", - "metricsIntervalS": "Metrics Intervall (s)", - "metricsIntervalDesc2": "Sekunder mellom måltallsbilder", - "visibleWidgets": "Synlige widgets", - "cpuUsageLabel": "Prosessorbruk", - "cpuUsageDesc": "CPU-prosent, belastet gjennomsnitt, sjakkdiagram", - "memoryLabel": "Minne brukt", - "memoryDesc": "RAM-bruk, swap, bufret", - "storageLabel": "Bruk av diskplass", - "storageDesc": "Disk bruk pr. monteringspunkt", - "networkLabel": "Nettverksgrensesnitt", - "networkDesc": "Liste over grensesnitt og båndbredde", - "uptimeLabel": "Oppetid", - "uptimeDesc": "System oppetid og oppstartstid", - "systemInfoLabel": "System informasjon", - "systemInfoDesc": "OS, kernel, vertsnavn, arkitektur", - "recentLoginsLabel": "Nylige innlogginger", - "recentLoginsDesc": "Vellykket og mislykkede innloggingshendelser", - "topProcessesLabel": "Flest prosesser", - "topProcessesDesc": "PID, CPU%, MEM%, kommando", - "listeningPortsLabel": "Lytter havner", - "listeningPortsDesc": "Åpne porter med prosess og tilstand", - "firewallLabel": "Brannmur", - "firewallDesc": "Flammevei, AppArmor, SELinux-status", - "quickActionsLabel": "Hurtig valg", - "quickActionsToolbar": "Hurtighandlinger vises som knapper i Serverstatistikkverktøylinjen for kjøring av kommando med ett klikk.", - "noQuickActions": "Ingen raske handlinger ennå.", - "buttonLabel": "Etikett for knapp", - "selectSnippetPlaceholder": "Velg snippet...", - "addActionBtn": "Legg til handling", - "hostSharedSuccessfully": "Vert delt vellykket", - "failedToShareHost": "Kunne ikke dele verten", - "accessRevoked": "Tilgang tilbakekalt", - "failedToRevokeAccess": "Kunne ikke oppheve tilgangen", - "cancelBtn": "Avbryt", - "savingBtn": "Lagrer...", - "addHostBtn": "Legg til vert", - "hostUpdated": "Vert oppdatert", - "hostCreated": "Vert opprettet", - "failedToSave": "Klarte ikke å lagre verten", - "credentialUpdated": "Påloggingsrettigheter oppdatert", - "credentialCreated": "Påloggingsrettigheter opprettet", - "failedToSaveCredential": "Kan ikke lagre legitimasjon", - "backToHosts": "Tilbake til verter", - "backToCredentials": "Tilbake til brukeropplysninger", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Passord", + "authTypeKey": "SSH-nøkkel", + "authTypeCredential": "Legitimasjon", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Ingen", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Kansellere", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Festet", - "noHostsFound": "Ingen verter funnet", - "tryDifferentTerm": "Prøv et annet begrep", - "addFirstHost": "Legge til din første vert for å komme i gang", - "noCredentialsFound": "Ingen legitimasjon funnet", - "addCredentialBtn": "Legg til legitimasjon", - "updateCredentialBtn": "Oppdater legitimasjon", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Funksjoner", - "noFolder": "(Ingen mappe)", - "deleteSelected": "Slett", - "exitSelection": "Avslutt valg", - "importSkip": "Importer (hopp over eksisterende)", - "importOverwrite": "Importer (overskrive)", - "collapseBtn": "Skjul", - "importExportBtn": "Import / Eksport", - "hostStatusesRefreshed": "Vertsstatuser oppdatert", - "failedToRefreshHosts": "Mislyktes i å oppdatere verter", - "movedHostTo": "Flyttet {{host}} til \"{{folder}}\"", - "failedToMoveHost": "Kunne ikke flytte verten", - "folderRenamedTo": "Mappen har endret navn til \"{{name}}\"", - "deletedFolder": "Slettet mappen \"{{name}}\"", - "failedToDeleteFolder": "Kunne ikke slette mappe", - "deleteAllInFolder": "Slett alle verter i \"{{name}}\"? Kan ikke angres.", - "deletedHost": "Slettet {{name}}", - "copiedToClipboard": "Kopiert til utklippstavle", - "terminalUrlCopied": "Terminal URL kopiert", - "fileManagerUrlCopied": "Filbehandling URL kopiert", - "tunnelUrlCopied": "Tunnel URL kopiert", - "dockerUrlCopied": "Docker URL kopiert", - "serverStatsUrlCopied": "Server statistiske URL kopiert", - "rdpUrlCopied": "RDP URL kopiert", - "vncUrlCopied": "VNC URL kopiert", - "telnetUrlCopied": "Telnet URL kopiert", - "remoteDesktopUrlCopied": "URL for eksternt skrivebord", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Kansellere", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protokoll", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Utvid handlinger", "collapseActions": "Skjul handlinger", "wakeOnLanAction": "Vekk på LAN", - "wakeOnLanSuccess": "Magisk pakke sendt til {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Kunne ikke sende magisk pakke", - "cloneHostAction": "Klon vert", - "copyAddress": "Kopier adresse", - "copyLink": "Kopier link", - "copyTerminalUrlAction": "Kopier URL til terminal", - "copyFileManagerUrlAction": "Kopier Filbehandling URL", - "copyTunnelUrlAction": "Kopier tunnel URL", - "copyDockerUrlAction": "Kopier Docker URL", - "copyServerStatsUrlAction": "Kopier Server Statistikk URL", - "copyRdpUrlAction": "Kopier RDP-URL", - "copyVncUrlAction": "Kopier VNC-URL", - "copyTelnetUrlAction": "Kopier Telnet URL", - "copyRemoteDesktopUrlAction": "Kopier URL til eksternt skrivebord", - "deleteCredentialConfirm": "Slett legitimasjon \"{{name}}\"?", - "deletedCredential": "Slettet {{name}}", - "deploySSHKeyTitle": "Installer SSH-nøkkel", - "deployingBtn": "Distribuerer...", - "deployBtn": "Installer", - "failedToDeployKey": "Kunne ikke distribuere nøkkel", - "deleteHostsConfirm": "Slette {{count}} vert{{plural}}? Dette kan ikke angres.", - "movedToRoot": "Flyttet til rot", - "failedToMoveHosts": "Kunne ikke flytte verter", - "enableTerminalFeature": "Aktiver terminal", - "disableTerminalFeature": "Deaktiver terminal", - "enableFilesFeature": "Aktiver filer", - "disableFilesFeature": "Deaktiver filer", - "enableTunnelsFeature": "Aktiver Tunneler", - "disableTunnelsFeature": "Deaktivere Tunneler", - "enableDockerFeature": "Aktiver Docker", - "disableDockerFeature": "Deaktiver Docker", - "addTagsPlaceholder": "Legg til tagger...", - "authDetails": "Autentisering detaljer", - "credType": "Type:", - "generateKeyPairDesc": "Generer et nytt nøkkelpar vil både private og offentlige nøkler bli fylt automatisk.", - "generatingKey": "Genererer...", - "generateLabel": "Generer {{label}}", - "uploadFileBtn": "Last opp fil", - "keyPassphraseOptional": "Passord frase (valgfritt)", - "sshPublicKeyOptional": "SSH offentlig nøkkel (Valgfritt)", - "publicKeyGenerated": "Offentlig nøkkel generert", - "failedToGeneratePublicKey": "Kunne ikke utlede offentlig nøkkel", - "publicKeyCopied": "Offentlig nøkkel kopiert", - "keyPairGenerated": "{{label}} nøkkelpar generert", - "failedToGenerateKeyPair": "Kunne ikke generere nøkkelpar", - "searchHostsPlaceholder": "Søk verter, adresser, tagger…", - "searchCredentialsPlaceholder": "Søk etter legitimasjon…", - "refreshBtn": "Oppdater", - "addTag": "Legg til tagger...", - "deleteConfirmBtn": "Slett", - "tunnelRequirementsText": "SSH-serveren må ha GatewayPorts ja, AllowTcpForwarding ja, and PermitRootLogin yes set in /etc/ssh/sshd_config.", - "deleteHostConfirm": "Slett \"{{name}}\"?", - "enableAtLeastOneProtocol": "Aktiver minst én protokoll over for å konfigurere autentisering og tilkoblingsinnstillinger.", - "keyPassphrase": "Passord", - "connectBtn": "Nettverk", - "disconnectBtn": "Frakoblet", - "basicInformation": "Grunnleggende informasjon", - "authDetailsSection": "Autentisering detaljer", - "credTypeLabel": "Type:", - "hostsTab": "Verter", - "credentialsTab": "Legitimasjon", - "selectMultiple": "Velg flere", - "selectHosts": "Velg verter", - "connectionLabel": "Tilkobling", - "authenticationLabel": "Autentisering", - "generateKeyPairTitle": "Generer nøkkelpar", - "generateKeyPairDescription": "Generer et nytt nøkkelpar vil både private og offentlige nøkler bli fylt automatisk.", - "generateFromPrivateKey": "Generer fra privat nøkkel", - "refreshBtn2": "Oppdater", - "exitSelectionTitle": "Avslutt valg", - "exportAll": "Eksporter alle", - "addHostBtn2": "Legg til vert", - "addCredentialBtn2": "Legg til legitimasjon", - "checkingHostStatuses": "Kontrollerer vertstatuser...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Festet", - "hostsExported": "Vellykket eksport av verter", + "hostsExported": "Hosts exported successfully", "exportFailed": "Kunne ikke eksportere verter", - "sampleDownloaded": "Eksemplefil lastet ned", - "failedToDeleteCredential2": "Kunne ikke slette legitimasjon", - "noFolderOption": "(Ingen mappe)", - "nSelected": "{{count}} valgt", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Funksjoner", - "moveMenu": "Flytt", - "cancelSelection": "Avbryt", - "deployDialogDesc": "Distribuere {{name}} til en verts autorisert_keys.", - "targetHostLabel": "Mål vert", - "selectHostOption": "Velg en vert...", - "keyDeployedSuccess": "Nøkkelen ble distribuert vellykket", - "failedToDeployKey2": "Kunne ikke distribuere nøkkel", - "deletedCount": "Slettet {{count}} verter", - "failedToDeleteCount": "Kan ikke slette {{count}} verter", - "duplicatedHost": "Duplisert \"{{name}}\"", - "failedToDuplicateHost": "Kunne ikke duplisere verten", - "updatedCount": "Oppdaterte {{count}} verter", - "friendlyNameLabel": "Vennlig navn", - "descriptionLabel": "Beskrivelse", - "loadingHost": "Laster vert...", - "loadingHosts": "Laster verter...", - "loadingCredentials": "Laster inn legitimasjonsbeskrivelser...", - "noHostsYet": "Ingen verter ennå", - "noHostsMatchSearch": "Ingen verter samsvarer med søket ditt", - "hostNotFound": "Verten ikke funnet", - "searchHosts": "Søk verter...", + "moveMenu": "Flytte", + "connectSelected": "Connect", + "cancelSelection": "Kansellere", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Sorter verter", "sortDefault": "Standardordre", "sortNameAsc": "Navn (A → Å)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Dokker", "filterTagsGroup": "Tagger", - "shareHost": "Del verten", - "shareHostTitle": "Del: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Denne verten må bruke en legitimasjon for å kunne dele. Rediger verten og tildel en legitimasjon først." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Tilkobling", - "authentication": "Autentisering", - "connectionSettings": "Tilkobling innstillinger", - "displaySettings": "Vis innstillinger", - "audioSettings": "Lydinnstillinger for lyd", - "rdpPerformance": "RDP Ytelse", - "deviceRedirection": "Omadressering av enhet", - "session": "Økt", - "gateway": "Inngang", - "remoteApp": "Fjernapp", - "clipboard": "Utklippstavle", - "sessionRecording": "Økt opptak", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Legitimasjon", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC Innstillinger", - "terminalSettings": "Terminale innstillinger", - "rdpPort": "RDP-port", - "username": "Brukernavn", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Passord", - "domain": "Domene", - "securityMode": "Sikkerhet Modus", - "colorDepth": "Farge Dybde", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Høyde", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Endre størrelsen", - "clientName": "Klientens navn", - "initialProgram": "Første program", - "serverLayout": "Server layout", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Port for gateway", - "gatewayUsername": "Gateway brukernavn", - "gatewayPassword": "Gateway passord", - "gatewayDomain": "gateway Domene", - "remoteAppProgram": "RemoteApp program", - "workingDirectory": "Arbeidskatalog (arbeid)", - "arguments": "Argumenter", - "normalizeLineEndings": "Normaliser linjeavslutninger", - "recordingPath": "Opptaks sti", - "recordingName": "Navn på opptak", - "macAddress": "MAC Adresse", - "broadcastAddress": "Kringkastings Adresse", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Ventetid (s)", - "driveName": "Stasjon navn", - "drivePath": "Sti disk", - "ignoreCertificate": "Ignorer Sertifikat", - "ignoreCertificateDesc": "Tillat oppkobling mot verter med selvsignerte sertifikater", - "forceLossless": "Tving tapsløs", - "forceLosslessDesc": "Tving tap av bildekoding (høyere kvalitet, mer båndbredde)", - "disableAudio": "Deaktivere lyd", - "disableAudioDesc": "Demp all lyd fra fjernøkten", - "enableAudioInput": "Aktiver lydinndata (mikrotelefon)", - "enableAudioInputDesc": "Videresend lokal mikrofon til fjernøkten", - "wallpaper": "Bakgrunnsbilde", - "wallpaperDesc": "Vis skrivebordsbakgrunnsbilde (deaktiverer bedre ytelse)", - "theming": "Utseende", - "themingDesc": "Aktiver visuelle temaer og stiler", - "fontSmoothing": "Skrift Utjevning", - "fontSmoothingDesc": "Aktiver RenType skrifttype", - "fullWindowDrag": "Dra hele vinduet", - "fullWindowDragDesc": "Vis vindu innholdet ved flytting", - "desktopComposition": "Skrivebord komposisjon", - "desktopCompositionDesc": "Aktiver Aero glass effekter", - "menuAnimations": "Meny Animasjoner", - "menuAnimationsDesc": "Aktiver meny fade og slide animations", - "disableBitmapCaching": "Deaktivere Bitmapcaching", - "disableBitmapCachingDesc": "Slå av bitmapcache (kan hjelpe med glitcher)", - "disableOffscreenCaching": "Deaktiver mellomlager i avslått skjerm", - "disableOffscreenCachingDesc": "Slå av offscreen cache", - "disableGlyphCaching": "Deaktiver Glyph Caching", - "disableGlyphCachingDesc": "Slå av symbol-cache", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Bruke RemoteFX grafikkrørledning", - "enablePrinting": "Aktiver utskrift", - "enablePrintingDesc": "Omdirigere lokale skrivere til fjernsesjonen", - "enableDriveRedirection": "Aktiver omdirigering av stasjon", - "enableDriveRedirectionDesc": "Tilordne en lokal mappe som en stasjon i fjernøkten", - "createDrivePath": "Opprett stasjon sti", - "createDrivePathDesc": "Opprett mappen automatisk hvis den ikke finnes", - "disableDownload": "Deaktiver nedlasting", - "disableDownloadDesc": "Hindre nedlasting av filer fra den eksterne økten", - "disableUpload": "Deaktiver opplasting", - "disableUploadDesc": "Hindre opplasting av filer til den eksterne økten", - "enableTouch": "Aktiver Touch", - "enableTouchDesc": "Aktiver videresending av berøringsdata", - "consoleSession": "Konsoll Økten", - "consoleSessionDesc": "Koble til konsollen (økt 0) i stedet for en ny sesjon", - "sendWolPacket": "Send WOL-pakke", - "sendWolPacketDesc": "Send en magisk pakke for å vekke denne verten før du kobler til", - "disableCopy": "Deaktiver kopi", - "disableCopyDesc": "Hindre kopiering av tekst fra den eksterne økten", - "disablePaste": "Deaktiver lim", - "disablePasteDesc": "Forhindre lim inn tekst i den eksterne økten", - "createPathIfMissing": "Opprett sti hvis mangler", - "createPathIfMissingDesc": "Opprett filmappe automatisk", - "excludeOutput": "Ekskluder utdata", - "excludeOutputDesc": "Ikke ta opp skjermdata (bare metadata)", - "excludeMouse": "Ekskluder musen", - "excludeMouseDesc": "Ikke ta opp musebevegelser", - "includeKeystrokes": "Inkluder tastetrykk", - "includeKeystrokesDesc": "Spill inn rå-tastetrykk i tillegg til skjermutgangen", - "vncPort": "VNC port", - "vncPassword": "VNC passord", - "vncUsernameOptional": "Brukernavn (valgfritt)", - "vncLeaveBlank": "La være blank hvis ikke nødvendig", - "cursorMode": "Markør modus", - "swapRedBlue": "Bytte Rød/blå", - "swapRedBlueDesc": "Bytt mellom røde og blå fargekanaler (fikser noen fargeremidler)", - "readOnly": "Skrivebeskyttet", - "readOnlyDesc": "Vis den eksterne skjermen uten å sende inndata", - "telnetPort": "Telnet port", - "terminalType": "Type terminal", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Farge Tema", - "backspaceKey": "Bakovertast", - "saveHostFirst": "Lagre verten først.", - "sharingOptionsAfterSave": "Delingsalternativer er tilgjengelige etter at verten har blitt lagret.", - "sharingLoadError": "Kan ikke laste delingsdata. Kontroller tilkoblingen og prøv igjen.", - "shareHostSection": "Del verten", - "shareWithUser": "Del med bruker", - "shareWithRole": "Del med rolle", - "selectUser": "Velg bruker", - "selectRole": "Velg rolle", - "selectUserOption": "Velg en bruker...", - "selectRoleOption": "Velg en rolle...", - "permissionLevel": "Tillatelse nivå", - "expiresInHours": "Utløper om (timer)", - "noExpiryPlaceholder": "La være tomt for utløpsdato", - "shareBtn": "Del", - "currentAccess": "Gjeldende tilgang", - "typeHeader": "Type:", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Tillatelse", - "grantedByHeader": "Tildelt av", - "expiresHeader": "Utløper", - "noAccessEntries": "Ingen tilgangsoppføringer enda.", - "expiredLabel": "Utløpt", - "neverLabel": "Aldri", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Avbryt", - "savingBtn": "Lagrer...", - "updateHostBtn": "Oppdater vert", - "addHostBtn": "Legg til vert" + "cancelBtn": "Kansellere", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Søk verter, kommandoer eller innstillinger...", - "quickActions": "Hurtig valg", - "hostManager": "Vertshåndtering", - "hostManagerDesc": "Håndtere, legge til eller redigere verter", - "addNewHost": "Legg til ny vert", - "addNewHostDesc": "Registrer en ny vert", - "adminSettings": "Admininnstillinger", - "adminSettingsDesc": "Konfigurer system innstillinger og brukere", - "userProfile": "Brukerprofil", - "userProfileDesc": "Administrer din konto og innstillinger", - "addCredential": "Legg til legitimasjon", - "addCredentialDesc": "Lagre SSH-nøkler eller passord", - "recentActivity": "Nylig aktivitet", - "serversAndHosts": "Servere og verter", - "noHostsFound": "Ingen verter funnet som samsvarer med \"{{search}}\"", - "links": "Lenker", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Velg", - "toggleWith": "Veksle med" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Ingen fane tildelt", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktiv rute" }, "connections": { "noConnections": "Ingen tilkoblinger", "noConnectionsDesc": "Åpne en terminal, filbehandler eller eksternt skrivebord for å se tilkoblinger her", - "connectedFor": "Tilkoblet for {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Tilkoblet", "disconnected": "Frakoblet", "closeTab": "Lukk fanen", @@ -801,358 +981,374 @@ "sectionBackground": "Bakgrunn", "backgroundDesc": "Øktene varer i 30 minutter etter frakobling og kan kobles til på nytt.", "persisted": "Fortsatt i bakgrunnen", - "expiresIn": "Utløper om {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Søk etter tilkoblinger...", - "noSearchResults": "Ingen forbindelser samsvarer med søket ditt" + "noSearchResults": "Ingen forbindelser samsvarer med søket ditt", + "rename": "Rename session" }, "guacamole": { - "connecting": "Kobler til {{type}} økt...", - "connectionError": "Feil ved tilkobling", - "connectionFailed": "Tilkobling mislyktes", - "failedToConnect": "Kan ikke hente tilkoblingstoken", - "hostNotFound": "Verten ikke funnet", - "noHostSelected": "Ingen vert valgt", - "reconnect": "Gjenoppkoble", - "retry": "Prøv igjen", - "guacdUnavailable": "Ekstern stasjonstjeneste (guacd) er ikke tilgjengelig. Kontroller at guacd kjører og er tilgjengelig og konfigurert riktig i administratorinnstillinger.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Tilkoblingen mislyktes", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Koble til igjen", + "retry": "Prøv på nytt", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Lås skjerm)", - "winKey": "Windows nøkkel", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Skift", - "win": "Vinn", - "stickyActive": "{{key}} (Avsluttet - Klikk for å slippe)", - "stickyInactive": "{{key}} (Klikk for å lade )", - "esc": "Rømme", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Hjem", - "end": "Slutt", - "pageUp": "Side opp", - "pageDown": "Side ned", - "arrowUp": "Pil opp", - "arrowDown": "Pil ned", - "arrowLeft": "Pil venstre", - "arrowRight": "Pil høyre", - "fnToggle": "Funksjonsnøkler", - "reconnect": "Koble fra økt", - "collapse": "Skjul verktøylinje", - "expand": "Utvid verktøylinje", - "dragHandle": "Dra for å flytte" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Koble til vert", - "clear": "Tøm", - "paste": "Lim inn", - "reconnect": "Koble til på nytt", - "connectionLost": "Tilkobling mistet", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Koble til igjen", + "connectionLost": "Connection lost", "connected": "Tilkoblet", - "clipboardWriteFailed": "Kopiering til utklippstavlen. Sjekk at siden har tilgang til HTTPS eller localhost.", - "clipboardReadFailed": "Kan ikke lese fra utklippstavlen. Påse at utklippstavle tillatelser er gitt.", - "clipboardHttpWarning": "Lim inn krever HTTPS. Bruk Ctrl+Shift+V eller tjener termiks over HTTPS.", - "unknownError": "Ukjent feil oppstod", - "websocketError": "WebSocket-tilkoblingsfeil", - "connecting": "Kobler til...", - "noHostSelected": "Ingen vert valgt", - "reconnecting": "Kobler til på nytt... ({{attempt}}/{{max}})", - "reconnected": "Tilkoblet på nytt", - "tmuxSessionCreated": "opprettede tmux-økt: {{name}}", - "tmuxSessionAttached": "Tmux økt vedlagt: {{name}}", - "tmuxUnavailable": "tmux er ikke installert på den eksterne verten og faller tilbake til standard skall", - "tmuxSessionPickerTitle": "tmux økter", - "tmuxSessionPickerDesc": "Eksisterende tmux-økter funnet på denne verten. Velg en for å sende på nytt eller opprett en ny sesjon.", - "tmuxWindows": "Vinduer", - "tmuxWindowCount": "{{count}} vindu", - "tmuxAttached": "Vedlagte klienter", - "tmuxAttachedCount": "{{count}} vedlagt", - "tmuxLastActivity": "Siste aktivitet", - "tmuxTimeJustNow": "akkurat nå", - "tmuxTimeMinutes": "{{count}}m siden", - "tmuxTimeHours": "{{count}}t siden", - "tmuxTimeDays": "for {{count}}dager siden", - "tmuxCreateNew": "Start ny økt", - "tmuxCopyHint": "Juster utvelgelse og trykk på Enter for å kopiere fra utklippstavlen", - "tmuxDetach": "Frakoble fra en tmux-økt", - "tmuxDetached": "Frakoblet fra tmux-økten", - "maxReconnectAttemptsReached": "Maks antall tilkoblingsforsøk nådd", - "closeTab": "Lukk", - "connectionTimeout": "Tilkoblingstidsavbrudd", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", - "terminalWithPath": "Terminal – {{host}}:{{path}}", - "runTitle": "Kjører {{command}} - {{host}}", - "totpRequired": "Tofaktorautentisering kreves", - "totpCodeLabel": "Verifiseringskode", - "totpVerify": "Verifiser", - "warpgateAuthRequired": "Warpgate godkjenning kreves", - "warpgateSecurityKey": "Sikkerhetsnøkkel", - "warpgateAuthUrl": "Autentisering URL", - "warpgateOpenBrowser": "Åpne i nettleser", - "warpgateContinue": "Jeg har fullført godkjenning", - "opksshAuthRequired": "OPKSSH godkjenning kreves", - "opksshAuthDescription": "Fullstendig autentisering i nettleseren din for å fortsette. Denne økten er gyldig i 24 timer.", - "opksshOpenBrowser": "Åpne nettleseren for å godkjenne", - "opksshWaitingForAuth": "Venter på godkjenning i nettleseren...", - "opksshAuthenticating": "Behandler autentisering...", - "opksshTimeout": "Autentisering ble tidsavbrutt. Vennligst prøv igjen.", - "opksshAuthFailed": "Godkjenning mislyktes. Kontroller påloggingsinformasjonen, og prøv på nytt.", - "opksshSignInWith": "Logg inn med {{provider}}", - "sudoPasswordPopupTitle": "Sette inn passord?", - "websocketAbnormalClose": "Tilkobling lukket uventet. Dette kan skyldes en revers proxy eller SSL-konfigurasjonsfeil. Kontroller serverloggene.", - "connectionLogTitle": "Tilkobling logg", - "connectionLogCopy": "Kopier logger til utklippstavlen", - "connectionLogEmpty": "Ingen tilkoblingslogger ennå", - "connectionLogWaiting": "Venter på tilkoblingslogger...", - "connectionLogCopied": "Tilkoblingslogger kopiert til utklippstavlen", - "connectionLogCopyFailed": "Kopiering av loggene til utklippstavlen feilet", - "connectionRejected": "Tilkobling avvist av serveren. Kontroller godkjennings- og nettverkskonfigurasjonen.", - "hostKeyRejected": "SSH vertsnøkkelverifisering ble avvist. Tilkoblingen avbrutt.", - "sessionTakenOver": "Økten ble åpnet i en annen fane. Koble til..." + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Åpne", + "linkDialogCopy": "Kopiere", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Del fane", + "addToSplit": "Legg til i deling", + "removeFromSplit": "Fjern fra Split" + } }, "fileManager": { - "noHostSelected": "Ingen vert valgt", - "initializingEditor": "Initialiserer redigeringsprogram...", - "file": "Fil", - "folder": "Mappe", - "uploadFile": "Last opp fil", - "downloadFile": "Last ned", - "extractArchive": "Pakk ut arkiv", - "extractingArchive": "Pakker ut {{name}}...", - "archiveExtractedSuccessfully": "{{name}} ble pakket ut", - "extractFailed": "Utpakking mislyktes", - "compressFile": "Komprimer fil", - "compressFiles": "Komprimer filer", - "compressFilesDesc": "Komprimer {{count}} elementer til ett arkiv", - "archiveName": "Arkivnavn", - "enterArchiveName": "Skriv inn arkivnavn...", - "compressionFormat": "Komprimeringsformat", - "selectedFiles": "Valgte filer", - "andMoreFiles": "og {{count}} til...", - "compress": "Komprimer", - "compressingFiles": "Komprimerer {{count}} elementer til {{name}}...", - "filesCompressedSuccessfully": "{{name}} ble opprettet", - "compressFailed": "Komprimering mislyktes", - "edit": "Rediger", - "preview": "Forhåndsvis", - "previous": "Forrige", - "next": "Neste", - "pageXOfY": "Side {{current}} av {{total}}", - "zoomOut": "Zoom ut", - "zoomIn": "Zoom inn", - "newFile": "Ny fil", - "newFolder": "Ny mappe", - "rename": "Gi nytt navn", - "uploading": "Laster opp...", - "uploadingFile": "Laster opp {{name}}...", - "fileName": "Filnavn", - "folderName": "Mappenavn", - "fileUploadedSuccessfully": "Fil \"{{name}}\" ble lastet opp", - "failedToUploadFile": "Kunne ikke laste opp fil", - "fileDownloadedSuccessfully": "Filen ble lastet ned", - "failedToDownloadFile": "Kunne ikke laste ned fil", - "fileCreatedSuccessfully": "Fil \"{{name}}\" ble opprettet", - "folderCreatedSuccessfully": "Mappe \"{{name}}\" ble opprettet", - "failedToCreateItem": "Kunne ikke opprette element", - "operationFailed": "{{operation}} mislyktes for {{name}}: {{error}}", - "failedToResolveSymlink": "Kunne ikke løse symbolske lenker", - "itemsDeletedSuccessfully": "{{count}} elementer ble slettet", - "failedToDeleteItems": "Kunne ikke slette elementer", - "sudoPasswordRequired": "Administrator passord kreves", - "enterSudoPassword": "Angi superpassord for å fortsette denne operasjonen", - "sudoPassword": "Sudo passord", - "sudoOperationFailed": "Sudo operasjonen mislyktes", - "sudoAuthFailed": "Sudo autentisering mislyktes", - "dragFilesToUpload": "Slipp filer her for å laste opp", - "emptyFolder": "Denne mappen er tom", - "searchFiles": "Søk i filer...", - "upload": "Last opp", - "selectHostToStart": "Velg en vert for å starte filhåndtering", - "sshRequiredForFileManager": "Filbehandler krever SSH. Denne tjeneren har ikke SSH aktivert.", - "failedToConnect": "Kunne ikke koble til SSH", - "failedToLoadDirectory": "Kunne ikke laste katalog", - "noSSHConnection": "Ingen SSH-tilkobling tilgjengelig", - "copy": "Kopier", - "cut": "Klipp ut", - "paste": "Lim inn", - "copyPath": "Kopier sti", - "copyPaths": "Kopier stier", - "delete": "Slett", - "properties": "Egenskaper", - "refresh": "Oppdater", - "downloadFiles": "Last ned {{count}} filer til nettleseren", - "copyFiles": "Kopier {{count}} elementer", - "cutFiles": "Klipp ut {{count}} elementer", - "deleteFiles": "Slett {{count}} elementer", - "filesCopiedToClipboard": "{{count}} elementer kopiert til utklippstavlen", - "filesCutToClipboard": "{{count}} elementer klippet til utklippstavlen", - "pathCopiedToClipboard": "Sti kopiert til utklippstavlen", - "pathsCopiedToClipboard": "{{count}} stier kopiert til utklippstavlen", - "failedToCopyPath": "Kunne ikke kopiere sti", - "movedItems": "Flyttet {{count}} elementer", - "failedToDeleteItem": "Kunne ikke slette element", - "itemRenamedSuccessfully": "{{type}} fikk nytt navn", - "failedToRenameItem": "Kunne ikke gi element nytt navn", - "download": "Last ned", - "permissions": "Tillatelser", - "size": "Størrelse", - "modified": "Endret", - "path": "Sti", - "confirmDelete": "Er du sikker på at du vil slette {{name}}?", - "permissionDenied": "Tillatelse nektet", - "serverError": "Serverfeil", - "fileSavedSuccessfully": "Filen ble lagret", - "failedToSaveFile": "Kunne ikke lagre fil", - "confirmDeleteSingleItem": "Er du sikker på at du vil slette \"{{name}}\" permanent?", - "confirmDeleteMultipleItems": "Er du sikker på at du vil slette {{count}} elementer permanent?", - "confirmDeleteMultipleItemsWithFolders": "Er du sikker på at du vil slette {{count}} elementer permanent? Dette inkluderer mapper og innholdet deres.", - "confirmDeleteFolder": "Er du sikker på at du vil slette mappen \"{{name}}\" og alt innholdet permanent?", - "permanentDeleteWarning": "Denne handlingen kan ikke angres. Elementene blir slettet permanent fra serveren.", - "recent": "Nylige", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Kopiere", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Festet", - "folderShortcuts": "Mappesnarveier", - "failedToReconnectSSH": "Kunne ikke koble til SSH-økt på nytt", - "openTerminalHere": "Åpne terminal her", - "run": "Kjør", - "openTerminalInFolder": "Åpne terminal i denne mappen", - "openTerminalInFileLocation": "Åpne terminal ved filplassering", - "runningFile": "Kjører - {{file}}", - "onlyRunExecutableFiles": "Kan bare kjøre kjørbare filer", - "directories": "Kataloger", - "removedFromRecentFiles": "Fjernet \"{{name}}\" fra nylige filer", - "removeFailed": "Fjerning mislyktes", - "unpinnedSuccessfully": "Fjernet festing av \"{{name}}\"", - "unpinFailed": "Fjerning av festing mislyktes", - "removedShortcut": "Fjernet snarvei \"{{name}}\"", - "removeShortcutFailed": "Kunne ikke fjerne snarvei", - "clearedAllRecentFiles": "Tømte alle nylige filer", - "clearFailed": "Tømming mislyktes", - "removeFromRecentFiles": "Fjern fra nylige filer", - "clearAllRecentFiles": "Tøm alle nylige filer", - "unpinFile": "Løsne fil", - "removeShortcut": "Fjern snarvei", - "pinFile": "Fest fil", - "addToShortcuts": "Legg til snarveier", - "pasteFailed": "Innliming mislyktes", - "noUndoableActions": "Ingen handlinger kan angres", - "undoCopySuccess": "Angret kopiering: Slettet {{count}} kopierte filer", - "undoCopyFailedDelete": "Angre mislyktes: Kunne ikke slette kopierte filer", - "undoCopyFailedNoInfo": "Angre mislyktes: Fant ingen info om kopierte filer", - "undoMoveSuccess": "Angret flytting: Flyttet {{count}} filer tilbake", - "undoMoveFailedMove": "Angre mislyktes: Kunne ikke flytte filer tilbake", - "undoMoveFailedNoInfo": "Angre mislyktes: Fant ingen info om flyttede filer", - "undoDeleteNotSupported": "Sletteoperasjon kan ikke angres: Filer er slettet permanent fra server", - "undoTypeNotSupported": "Ikke støttet angretype", - "undoOperationFailed": "Angreoperasjon mislyktes", - "unknownError": "Ukjent feil", - "confirm": "Bekreft", - "find": "Finn...", - "replace": "Erstatt", - "downloadInstead": "Last ned i stedet", - "keyboardShortcuts": "Tastatursnarveier", - "searchAndReplace": "Søk og erstatt", - "editing": "Redigering", - "search": "Søk", - "findNext": "Finn neste", - "findPrevious": "Finn forrige", - "save": "Lagre", - "selectAll": "Marker alt", - "undo": "Angre", - "redo": "Gjør om", - "moveLineUp": "Flytt linje opp", - "moveLineDown": "Flytt linje ned", - "toggleComment": "Veksle kommentar", - "autoComplete": "Autofullfør", - "imageLoadError": "Kunne ikke laste bilde", - "startTyping": "Begynn å skrive...", - "unknownSize": "Ukjent størrelse", - "fileIsEmpty": "Filen er tom", - "largeFileWarning": "Advarsel om stor fil", - "largeFileWarningDesc": "Denne filen er {{size}} stor, noe som kan gi ytelsesproblemer når den åpnes som tekst.", - "fileNotFoundAndRemoved": "Filen «{{name}}» ble ikke funnet og er fjernet fra nylige/festede filer", - "failedToLoadFile": "Kunne ikke laste fil: {{error}}", - "serverErrorOccurred": "Serverfeil oppstod. Prøv igjen senere.", - "autoSaveFailed": "Autolagring mislyktes", - "fileAutoSaved": "Filen ble autolagret", - "moveFileFailed": "Kunne ikke flytte {{name}}", - "moveOperationFailed": "Flytteoperasjon mislyktes", - "canOnlyCompareFiles": "Kan kun sammenligne to filer", - "comparingFiles": "Sammenligner filer: {{file1}} og {{file2}}", - "dragFailed": "Draoperasjon mislyktes", - "filePinnedSuccessfully": "Filen «{{name}}» ble festet", - "pinFileFailed": "Kunne ikke feste fil", - "fileUnpinnedSuccessfully": "Filen «{{name}}» ble løsnet", - "unpinFileFailed": "Kunne ikke løsne fil", - "shortcutAddedSuccessfully": "Mappesnarvei «{{name}}» ble lagt til", - "addShortcutFailed": "Kunne ikke legge til snarvei", - "operationCompletedSuccessfully": "{{operation}} {{count}} elementer", - "operationCompleted": "{{operation}} {{count}} elementer", - "downloadFileSuccess": "Fil {{name}} ble lastet ned", - "downloadFileFailed": "Nedlasting mislyktes", - "moveTo": "Flytt til {{name}}", - "diffCompareWith": "Sammenlign forskjeller med {{name}}", - "dragOutsideToDownload": "Dra utenfor vinduet for å laste ned ({{count}} filer)", - "newFolderDefault": "NyMappe", - "newFileDefault": "NyFil.txt", - "successfullyMovedItems": "Flyttet {{count}} elementer til {{target}}", - "move": "Flytt", - "searchInFile": "Søk i fil (Ctrl+F)", - "showKeyboardShortcuts": "Vis tastatursnarveier", - "startWritingMarkdown": "Begynn å skrive markdown-innhold...", - "loadingFileComparison": "Laster filsammenligning...", - "reload": "Last inn på nytt", - "compare": "Sammenlign", - "sideBySide": "Side om side", - "inline": "Innebygd", - "fileComparison": "Filsammenligning: {{file1}} vs {{file2}}", - "fileTooLarge": "Fil for stor: {{error}}", - "sshConnectionFailed": "SSH-tilkobling mislyktes. Kontroller tilkoblingen til {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Kunne ikke laste fil: {{error}}", - "connecting": "Tilkobler...", - "connectedSuccessfully": "Tilkoblet", - "totpVerificationFailed": "TOTP-verifisering mislyktes", - "warpgateVerificationFailed": "Warpgate autentisering feilet", - "authenticationFailed": "Godkjenning mislyktes", - "verificationCodePrompt": "Bekreftelseskode:", - "changePermissions": "Endre tillatelser", - "currentPermissions": "Gjeldende tillatelser", - "owner": "Eier", - "group": "Gruppe", - "others": "Andre", - "read": "Les", - "write": "Skriv", - "execute": "Kjør", - "permissionsChangedSuccessfully": "Tillatelser endret", - "failedToChangePermissions": "Kunne ikke endre tillatelser", - "name": "Navn", - "sortByName": "Navn", - "sortByDate": "Dato Endret", - "sortBySize": "Størrelse", - "ascending": "Stigende", - "descending": "Synkende", - "root": "Rot", - "new": "Ny", - "sortBy": "Sorter etter", - "items": "Elementer", - "selected": "Valgt", - "editor": "Redaktør", - "octal": "Oktal", - "storage": "Lagring", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Løp", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Flytte", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", "disk": "Disk", - "used": "Brukt", - "of": "av", - "toggleSidebar": "Bytt sidestolpe", - "cannotLoadPdf": "Kan ikke laste inn PDF", - "pdfLoadError": "Det oppstod en feil under lasting av denne PDF-filen.", - "loadingPdf": "Laster PDF...", - "loadingPage": "Laster side..." + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopier til vert…", - "moveToHost": "Flytt til vert…", - "copyItemsToHost": "Kopier {{count}} elementer til vert for…", - "moveItemsToHost": "Flytt {{count}} elementer til vert for…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Ingen andre filbehandlerverter tilgjengelig.", "noHostsConnectedHint": "Legg til en annen SSH-vert med Filbehandling aktivert i Vertsbehandling.", "selectDestinationHost": "Velg destinasjonsvert", @@ -1164,48 +1360,48 @@ "browseDestination": "Bla gjennom eller skriv inn bane", "confirmCopy": "Kopiere", "confirmMove": "Flytte", - "transferring": "Overfører…", - "compressing": "Komprimering…", - "extracting": "Uttrekker…", - "transferringItems": "Overføring av {{current}} av {{total}} elementer…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Overføringen er fullført", "transferError": "Overføringen mislyktes", - "transferPartial": "Overføringen er fullført med {{count}} feil", - "transferPartialHint": "Kunne ikke overføre: {{paths}}", - "itemsSummary": "{{count}} elementer", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Destinasjonen må være en katalog for overføringer av flere elementer", "selectThisFolder": "Velg denne mappen", "browsePathWillBeCreated": "Denne mappen finnes ikke ennå. Den vil bli opprettet når overføringen starter.", "browsePathError": "Kunne ikke åpne denne banen på målverten.", "goUp": "Gå opp", - "copyFolderToHost": "Kopier mappe til vert…", - "moveFolderToHost": "Flytt mappen til verten…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Ferdig", - "hostConnecting": "Kobler til…", + "hostConnecting": "Connecting…", "hostDisconnected": "Ikke tilkoblet", "hostAuthRequired": "Autentisering kreves – åpne Filbehandler på denne verten først", "hostConnectionFailed": "Tilkoblingen mislyktes", "metricsTitle": "Overføringstider", - "metricsPrepare": "Forbered destinasjon: {{duration}}", - "metricsCompress": "Komprimer på kilde: {{duration}}", - "metricsHopSourceRead": "Kilde → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → destinasjon (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → dest (lokal): {{throughput}}", - "metricsTransfer": "Ende-til-ende: {{throughput}} ({{duration}})", - "metricsExtract": "Uttrekk på destinasjon: {{duration}}", - "metricsSourceDelete": "Fjern fra kilden: {{duration}}", - "metricsTotal": "Totalt: {{duration}}", - "progressCompressing": "Komprimering på kildevert…", - "progressExtracting": "Uttrekker på destinasjon…", - "progressTransferring": "Overføring av data…", - "progressReconnecting": "Kobler til igjen…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Parallelle overføringsfelt", - "parallelSegmentsOption": "{{count}} baner", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Store filer deles inn i deler på 256 MB. Flere baner bruker separate tilkoblinger (som å starte flere overføringer) for høyere total gjennomstrømning.", - "progressTotalSpeed": "{{speed}} totalt ({{lanes}} baner)", - "progressTransferringItems": "Overføring av filer ({{current}} av {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} filer", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Kildefiler beholdt (delvis overføring)", "jumpHostLimitation": "Begge vertene må være tilgjengelige fra Termix-serveren. Direkte vert-til-vert-ruting støttes ikke.", "cancel": "Kansellere", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Velger tar eller SFTP per fil basert på antall filer, størrelse og komprimerbarhet. Enkeltfiler bruker alltid strømme-SFTP.", "methodTarHint": "Komprimer på kildekode, overfør ett arkiv, pakk ut på destinasjon. Krever tar på begge Unix-vertene.", "methodItemSftpHint": "Overfør hver fil individuelt via SFTP. Fungerer på alle verter, inkludert Windows.", - "methodPreviewLoading": "Beregning av overføringsmetode…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Kunne ikke forhåndsvise overføringsmetoden. Serveren vil fortsatt velge en metode når du starter.", "methodPreviewWillUseTar": "Vil bruke: Tar-arkiv", "methodPreviewWillUseItemSftp": "Vil bruke: SFTP per fil", - "methodPreviewScanSummary": "{{fileCount}} filer, {{totalSize}} totalt (skannet på kildeverten).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Hver fil bruker den samme SFTP-strømmen som en enkeltfilskopi, én etter én. Fremdriften kombineres på tvers av alle filene, så linjen beveger seg sakte under store filer.", "methodReason": { "user_item_sftp": "Du valgte SFTP per fil.", "user_tar": "Du valgte tar-arkiv.", "tar_unavailable": "Tar er ikke tilgjengelig på én eller begge vertene – SFTP per fil vil bli brukt i stedet.", "windows_host": "En Windows-vert er involvert – tar brukes ikke.", - "auto_multi_large": "Auto: flere filer, inkludert en stor fil ({{largestSize}}) med komprimerbare data — tar-pakker i én overføring.", - "auto_single_large_in_archive": "Auto: én stor fil ({{largestSize}}) i dette settet — SFTP per fil.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto: stort sett inkomprimerbare data — SFTP per fil.", - "auto_many_files": "Auto: mange filer ({{fileCount}}) — tar reduserer overhead per fil.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Auto: SFTP per fil for dette settet." }, "progressCancel": "Kansellere", - "progressCancelling": "Avbryter…", + "progressCancelling": "Cancelling…", "progressStalled": "Fastlåst", "resumedHint": "Koblet til igjen en aktiv overføring som startet i et annet vindu.", "transferCancelled": "Overføringen er avbrutt", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Delvise data ble lagret på destinasjonen. Forsøket gjenopptas når forbindelsen er tilbake." }, "tunnels": { - "noSshTunnels": "Ingen SSH-tunneler", - "createFirstTunnelMessage": "Du har ikke opprettet noen SSH-tunneler ennå. Konfigurer tunneltilkoblinger i Vertadministrator for å komme i gang.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Tilkoblet", "disconnected": "Frakoblet", - "connecting": "Kobler til...", - "error": "Feil", - "canceling": "Avbryter...", - "connect": "Koble til", - "disconnect": "Koble fra", - "cancel": "Avbryt", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Kansellere", "port": "Port", - "localPort": "Lokal port", - "remotePort": "Fjernport", - "currentHostPort": "Gjeldende Vert Port", - "endpointPort": "Endepunkt port", - "bindIp": "Lokal IP", - "endpointSshConfig": "Endepunkt SSH konfigurasjon", - "endpointSshHost": "Endepunkt SSH vert", - "endpointSshHostPlaceholder": "Velg en konfigurert vert", - "endpointSshHostRequired": "Velg en endepunkt SSH-vert for hver klienttunnel.", - "attempt": "Forsøk {{current}} av {{max}}", - "nextRetryIn": "Neste forsøk om {{seconds}} sekunder", - "clientTunnels": "Klient tunneler", - "clientTunnel": "Klient tunnel", - "addClientTunnel": "Legg til klienttunnel", - "noClientTunnels": "Ingen klienttunneler konfigurert på denne datamaskinen.", - "tunnelName": "Tunnelnavn", - "remoteHost": "Fjernvert", - "autoStart": "Autostart", - "clientAutoStartDesc": "Starter når denne skrivebordsklienten åpner og forblir tilkoblet.", - "clientManualStartDesc": "Bruk start og stopp fra denne raden. Termix vil ikke åpne den automatisk.", - "clientRemoteServerNote": "Ekstern videresending kan kreve Tillatt TcpForwarding og GatewayPorts når endepunktet SSH-tjener avsluttes. Den eksterne porten lukkes når denne skrivebordet kobles fra.", - "clientTunnelStarted": "Klienttunnel startet", - "clientTunnelStopped": "Klienttunnel stoppet", - "tunnelTestSucceeded": "Tunnelsetest lyktes", - "tunnelTestFailed": "Tunneltesten mislyktes", - "localSaved": "Klienttunneler lagret", - "localSaveError": "Klarte ikke å lagre lokale klienttunneler", - "invalidBindIp": "Lokal IP må være en gyldig IPv4-adresse.", - "invalidLocalTargetIp": "Lokal mål-IP må være en gyldig IPv4-adresse.", - "invalidLocalPort": "Lokal port må være mellom 1 og 65535.", - "invalidRemotePort": "Ekstern port må være mellom 1 og 65535.", - "invalidLocalTargetPort": "Lokal målport må være mellom 1 og 65535.", - "invalidEndpointPort": "Endepunktsporten må være mellom 1 og 65535.", - "duplicateAutoStartBind": "Bare én automatisk start klienttunnel kan bruke {{bind}}.", - "manualControlError": "Kunne ikke oppdatere tunneltilstand.", - "active": "Aktiv", - "start": "Begynn", - "stop": "Stopp", - "test": "Prøve", - "type": "Type tunnel", - "typeLocal": "Lokal (-L)", - "typeRemote": "Ekstern (-R)", - "typeDynamic": "Dynamisk (-D)", - "typeServerLocalDesc": "Nåværende vert til slutt.", - "typeServerRemoteDesc": "Endepunkt tilbake til gjeldende vert.", - "typeClientLocalDesc": "Lokal datamaskin til endepunkt.", - "typeClientRemoteDesc": "Sluttpunkt tilbake til lokal datamaskin.", - "typeClientDynamicDesc": "SOCKS på lokal datamaskin.", - "typeDynamicDesc": "Videresend SOCKS5 CONNECT trafikk gjennom SSH", - "forwardDescriptionServerLocal": "Nåværende vert {{sourcePort}} → endepunkt {{endpointPort}}.", - "forwardDescriptionServerRemote": "Endepunkt {{endpointPort}} → gjeldende vert {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS på gjeldende vert {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokal {{sourcePort}} → ekstern {{endpointPort}}.", - "forwardDescriptionClientRemote": "Ekstern {{sourcePort}} → lokal {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS på lokal port {{sourcePort}}.", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "Lokalt {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokale {{localPort}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", - "route": "Rute:", - "lastStarted": "Sist startet", - "lastTested": "Sist testet", - "lastError": "Siste feil", - "maxRetries": "Maks antall forsøk", - "maxRetriesDescription": "Maksimum antall forsøk på nytt.", - "retryInterval": "Gjenværende intervall (sekunder)", - "retryIntervalDescription": "Tid å vente mellom forsøk på nytt.", - "local": "Lokal", - "remote": "Fjern", - "destination": "Mål", - "host": "Vert", - "mode": "Modus", - "noHostSelected": "Ingen vert valgt", - "working": "Arbeider..." + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "Prosessor", - "memory": "Minne", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", "disk": "Disk", - "network": "Nettverk", - "uptime": "Oppetid", - "processes": "Prosesser", - "available": "Tilgjengelig", - "free": "Ledig", - "connecting": "Tilkobler...", - "connectionFailed": "Kan ikke koble til serveren", - "naCpus": "N/A CPU(er)", - "cpuCores_one": "{{count}} kjerne", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU-bruk", - "memoryUsage": "Minnebruk", - "diskUsage": "Diskbruk", - "failedToFetchHostConfig": "Kunne ikke hente vertskonfigurasjon", - "serverOffline": "Server frakoblet", - "cannotFetchMetrics": "Kan ikke hente målinger fra frakoblet server", - "totpFailed": "TOTP-verifisering mislyktes", - "noneAuthNotSupported": "Serverstatistikk støtter ikke 'ikke' autentiseringstype.", - "load": "Last", - "systemInfo": "Systeminformasjon", - "hostname": "Vertsnavn", - "operatingSystem": "Operativsystem", - "kernel": "Kjerne", - "seconds": "sekunder", - "networkInterfaces": "Nettverksgrensesnitt", - "noInterfacesFound": "Fant ingen nettverksgrensesnitt", - "noProcessesFound": "Fant ingen prosesser", - "loginStats": "SSH-påloggingsstatistikk", - "noRecentLoginData": "Ingen nylige påloggingsdata", - "executingQuickAction": "Utfører {{name}}...", - "quickActionSuccess": "{{name}} fullført", - "quickActionFailed": "{{name}} mislyktes", - "quickActionError": "Kunne ikke utføre {{name}}", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Lytter havner", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protokoll", "port": "Port", - "address": "Adresse", - "process": "Prosess", - "noData": "Ingen lytter til ports-data" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Brannmur", - "inactive": "Inaktiv", - "policy": "Vilkår", - "rules": "regler", - "noData": "Ingen brannmurdata tilgjengelig", - "action": "Handling", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Kilde", - "anywhere": "Uansett" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Last snitt", - "swap": "Bytte", - "architecture": "arkitektur", - "refresh": "Oppdater", - "retry": "Prøv igjen" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Prøv på nytt", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Løp", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Selvhostet SSH og ekstern skrivebordsadministrasjon", - "loginTitle": "Logg inn i Termix", - "registerTitle": "Opprett konto", - "forgotPassword": "Glemt passord?", - "rememberMe": "Husk enhet for 30 dager (inkluderer TOTP)", - "noAccount": "Har du ikke konto?", - "hasAccount": "Har du allerede konto?", - "twoFactorAuth": "Tofaktorautentisering", - "enterCode": "Angi verifikasjonskode", - "backupCode": "Eller bruk reservekode", - "verifyCode": "Bekreft kode", - "redirectingToApp": "Videresender til app...", - "sshAuthenticationRequired": "SSH-autentisering kreves", - "sshNoKeyboardInteractive": "Tastaturinteraktiv autentisering er ikke tilgjengelig", - "sshAuthenticationFailed": "Autentisering mislyktes", - "sshAuthenticationTimeout": "Autentisering tidsavbrutt", - "sshNoKeyboardInteractiveDescription": "Serveren støtter ikke tastaturinteraktiv autentisering. Oppgi passord eller SSH-nøkkel.", - "sshAuthFailedDescription": "Oppgitte legitimasjoner var feil. Prøv igjen med gyldige opplysninger.", - "sshTimeoutDescription": "Autentiseringsforsøket fikk tidsavbrudd. Prøv igjen.", - "sshProvideCredentialsDescription": "Oppgi SSH-legitimasjonen din for å koble til denne serveren.", - "sshPasswordDescription": "Skriv inn passordet for denne SSH-tilkoblingen.", - "sshKeyPasswordDescription": "Hvis SSH-nøkkelen er kryptert, skriv inn passordfrasen her.", - "passphraseRequired": "Passfrase kreves", - "passphraseRequiredDescription": "SSH-nøkkelen er kryptert. Skriv inn adgangskoden for å låse opp den.", - "back": "Tilbake", - "firstUser": "Første bruker", - "firstUserMessage": "Du er den første brukeren og blir gjort til administrator. Du finner admininnstillinger i brukerlisten i sidepanelet. Hvis dette er en feil, sjekk Docker-loggene eller opprett en GitHub-sak.", - "external": "Ekstern", - "loginWithExternal": "Logg inn med ekstern leverandør", - "loginWithExternalDesc": "Logg inn med den konfigurerte eksterne identitetsleverandøren", - "externalNotSupportedInElectron": "Ekstern autentisering støttes ikke i Electron-appen ennå. Bruk webversjonen for OIDC-innlogging.", - "resetPasswordButton": "Tilbakestill passord", - "sendResetCode": "Send tilbakestillingskode", - "resetCodeDesc": "Skriv inn brukernavnet ditt for å få en tilbakestillingskode. Koden logges i Docker-containerens logger.", - "resetCode": "Tilbakestillingskode", - "verifyCodeButton": "Bekreft kode", - "enterResetCode": "Skriv inn 6-sifret kode fra Docker-loggene for bruker:", - "newPassword": "Nytt passord", - "confirmNewPassword": "Bekreft passord", - "enterNewPassword": "Skriv inn nytt passord for bruker:", - "signUp": "Registrer deg", - "desktopApp": "Desktop-app", - "loggingInToDesktopApp": "Logger inn i desktop-appen", - "loadingServer": "Laster server...", - "dataLossWarning": "Å tilbakestille passordet ditt på denne måten vil slette alle lagrede SSH-verter, legitimasjoner og annen kryptert data. Dette kan ikke angres. Bruk bare dette hvis du har glemt passordet og ikke er innlogget.", - "authenticationDisabled": "Autentisering deaktivert", - "authenticationDisabledDesc": "Alle autentiseringsmetoder er for øyeblikket deaktivert. Kontakt administratoren din.", - "attemptsRemaining": "{{count}} forsøk gjenstår" + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifiser SSH vertsnøkkel", - "keyChangedWarning": "SSH vertsnøkkel endret", - "firstConnectionTitle": "Første gang du kobler til denne verten", - "firstConnectionDescription": "Vertens autensitet kan ikke etableres. Kontroller fingeravtrykket samsvarer med det du forventer.", - "keyChangedDescription": "Vertsnøkkelen for denne serveren er endret siden forrige tilkobling. Dette kan angi et sikkerhetsproblem.", - "previousKey": "Forrige nøkkel", - "newFingerprint": "Nytt fingeravtrykk", - "fingerprint": "Fingeravtrykk", - "verifyInstructions": "Hvis du stoler på denne verten, klikk Godta for å fortsette og lagre dette fingeravtrykket for fremtidige tilkoblinger.", - "securityWarning": "Sikkerhetsadvarsel", - "acceptAndContinue": "Godta og fortsett", - "acceptNewKey": "Aksepter ny nøkkel og fortsett" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Kunne ikke koble til databasen", - "unknownError": "Ukjent feil", - "loginFailed": "Innlogging mislyktes", - "failedPasswordReset": "Kunne ikke starte passordtilbakestilling", - "failedVerifyCode": "Kunne ikke verifisere tilbakestillingskode", - "failedCompleteReset": "Kunne ikke fullføre passordtilbakestilling", - "invalidTotpCode": "Ugyldig TOTP-kode", - "failedOidcLogin": "Kunne ikke starte OIDC-innlogging", - "silentSigninOidcUnavailable": "Stille pålogging ble forespurt, men OIDC innlogging er ikke tilgjengelig.", - "failedUserInfo": "Klarte ikke å hente brukerinformasjon etter innlogging", - "oidcAuthFailed": "OIDC-autentisering mislyktes", - "invalidAuthUrl": "Ugyldig autorisasjons-URL mottatt fra backend", - "requiredField": "Dette feltet er obligatorisk", - "minLength": "Minste lengde er {{min}}", - "passwordMismatch": "Passordene er ikke like", - "passwordLoginDisabled": "Brukernavn/passord-innlogging er deaktivert", - "sessionExpired": "Økten er utløpt – logg inn på nytt", - "totpRateLimited": "Frekvens begrenset: For mange TOTP-verifiseringsforsøk. Prøv igjen senere.", - "totpRateLimitedWithTime": "Frekvens begrenset: For mange TOTP-verifiseringsforsøk. Vennligst vent {{time}} sekunder før du prøver igjen.", - "resetCodeRateLimited": "Frekvens begrenset: For mange forsøk på verifisering. Prøv igjen senere.", - "resetCodeRateLimitedWithTime": "Frekvens begrenset: For mange forsøk på verifisering. Vennligst vent {{time}} sekunder før du prøver igjen.", - "authTokenSaveFailed": "Kunne ikke lagre godkjenningstoken", - "failedToLoadServer": "Kan ikke laste server" + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Registrering av nye kontoer er deaktivert av en administrator. Logg inn eller kontakt administrator.", - "userNotAllowed": "Kontoen din er ikke autorisert for registrering. Vennligst kontakt en administrator.", - "databaseConnectionFailed": "Kunne ikke koble til databaseserveren", - "resetCodeSent": "Tilbakestillingskode sendt til Docker-loggene", - "codeVerified": "Kode verifisert", - "passwordResetSuccess": "Passord tilbakestilt", - "loginSuccess": "Innlogging vellykket", - "registrationSuccess": "Registrering vellykket" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Lokalt skrivebordtunneler som har målrettinger mot SSH-verter.", - "c2sTunnelPresets": "Forhåndsinnstillinger for klienttunnel", - "c2sTunnelPresetsDesc": "Lagre denne stasjonære klientens lokale tunnelliste som en navngitt server forhåndsinnstilling, eller last en forhåndsinnstilling tilbake i denne klienten.", - "c2sTunnelPresetsUnavailable": "Forhåndsinnstillinger for klienter er bare tilgjengelig på skrivebordsklienten.", - "c2sPresetName": "Forhåndsinnstilt navn", - "c2sPresetNamePlaceholder": "Klientens forhåndsinnstillingsnavn", - "c2sPresetToLoad": "Forhåndsinnstilling til lasting", - "c2sNoPresetSelected": "Ingen forhåndsinnstilling valgt", - "c2sNoPresets": "Ingen forhåndsinnstillinger er lagret", - "c2sLoadPreset": "Last", - "c2sCurrentLocalConfig": "{{count}} lokale klient tunnel(er) konfigurert på denne skrivebordet.", - "c2sPresetSyncNote": "Forhåndsinstillinger er eksplisitte øyeblikksbilder; lasting én erstatter denne stasjonære klientens lokale klient tunnel liste.", - "c2sPresetSaved": "Klienttunnel forhåndsinnstilling lagret", - "c2sPresetLoaded": "Forhåndsinnstilling for klient lastet lokalt", - "c2sPresetRenamed": "Klienttunnel forhåndsinnstilling endret navn", - "c2sPresetDeleted": "Klienttunnel forhåndsinnstilling slettet", - "c2sPresetLoadError": "Kunne ikke laste klienttunnelen forhåndsinnstillinger" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Språk", - "keyPassword": "nøkkelpassord", - "pastePrivateKey": "Lim inn privatnøkkelen her...", - "localListenerHost": "127.0.0.1 (lytt lokalt)", - "localTargetHost": "127.0.0.1 (mål på denne maskinen)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Skriv inn passordet ditt", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Dashbord", - "loading": "Laster oversikten ...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Hjelp", - "discord": "Splid", - "serverOverview": "Serveroversikt", - "version": "Versjon", - "upToDate": "Oppdatert", - "updateAvailable": "Oppdatering tilgjengelig", - "beta": "beta", - "uptime": "Oppetid", - "database": "Databasen", - "healthy": "Frisk", - "error": "Feil", - "totalHosts": "Totalt antall verter", - "totalTunnels": "Totalt antall tunneler", - "totalCredentials": "Totalt antall legitimasjoner", - "recentActivity": "Nylig aktivitet", - "reset": "Tilbakestill", - "loadingRecentActivity": "Laster nylig aktivitet...", - "noRecentActivity": "Ingen nylig aktivitet", - "quickActions": "Hurtighandlinger", - "addHost": "Legg til vert", - "addCredential": "Legg til legitimasjon", - "adminSettings": "Admininnstillinger", - "userProfile": "Brukerprofil", - "serverStats": "Serverstatistikk", - "loadingServerStats": "Laster serverstatistikk...", - "noServerData": "Ingen serverdata tilgjengelig", - "cpu": "Prosessor", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Tilpass dashbord", - "dashboardSettings": "Dashboard innstillinger", - "enableDisableCards": "Aktiver/deaktiver kort", - "resetLayout": "Tilbakestill til standard", - "serverOverviewCard": "Server oversikt", - "recentActivityCard": "Nylig aktivitet", - "networkGraphCard": "Nettverksgraf", - "networkGraph": "Nettverksgraf", - "quickActionsCard": "Hurtig valg", - "serverStatsCard": "Server Statistikk", - "panelMain": "Hoved", - "panelSide": "Farge", - "justNow": "akkurat nå" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "TILBAKESTILL", - "hostsOnline": "Verter online", - "activeTunnels": "Aktive tunneler", - "registerNewServer": "Registrer en ny server", - "storeSshKeysOrPasswords": "Lagre SSH-nøkler eller passord", - "manageUsersAndRoles": "Behandle brukere og roller", - "manageYourAccount": "Administrer kontoen din", - "hostStatus": "Vert status", - "noHostsConfigured": "Ingen verter konfigurert", - "online": "AKTIV", - "offline": "FRAKOBLET", - "onlineLower": "Pålogget", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", + "onlineLower": "På nett", "nodes": "{{count}} nodes", - "add": "Legg til:", - "commandPalette": "Kommandobalett palett", - "done": "Ferdig", - "editModeInstructions": "Dra oppgavelapper for å endre rekkefølgen · Dra kolonneskiller for å endre størrelse på kolonnene · Dra bunnen av et kort for å endre størrelsen på høyden · Papirkurv for å fjerne", - "empty": "Tom", - "clear": "Tøm" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopiere", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Legg til vert", - "addGroup": "Legg til gruppe", - "addLink": "Legg til kobling", - "zoomIn": "Zoom inn", - "zoomOut": "Zoom ut", - "resetView": "Tilbakestill visning", - "selectHost": "Velg vert", - "chooseHost": "Velg en vert...", - "parentGroup": "Overordnet gruppe", - "noGroup": "Ingen gruppe", - "groupName": "Gruppens navn", - "color": "Farge", - "source": "Kilde", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Flytt til gruppe", - "selectGroup": "Velg gruppe...", - "addConnection": "Legg til tilkobling", - "hostDetails": "Vert detaljer", - "removeFromGroup": "Fjern fra gruppe", - "addHostHere": "Legg til vert her", - "editGroup": "Rediger gruppe", - "delete": "Slett", - "add": "Legg til", - "create": "Opprett", - "move": "Flytt", - "connect": "Nettverk", - "createGroup": "Opprett gruppe", - "selectSourcePlaceholder": "Velg kilde...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Flytte", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Ugyldig fil", - "hostAlreadyExists": "Vert er allerede i topologien", - "connectionExists": "Forbindelsen eksisterer allerede", - "unknown": "Ukjent", - "name": "Navn", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "Status:", - "failedToAddNode": "Kan ikke legge til node", - "sourceDifferentFromTarget": "Kilde og mål må være forskjellig", - "exportJSON": "Eksporter JSON", - "importJSON": "Importer JSON", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Fil Behandler", - "tunnel": "Tunnelen", - "docker": "Docker", - "serverStats": "Server Statistikk", - "noNodes": "Ingen noder ennå" + "fileManager": "Filbehandler", + "tunnel": "Tunnel", + "docker": "Dokker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker er ikke aktivert for denne verten", - "validating": "Validerer Docker...", - "connecting": "Tilkobler...", - "error": "Feil", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Kunne ikke koble til Docker", - "containerStarted": "Beholder {{name}} startet", - "failedToStartContainer": "Kan ikke starte container {{name}}", - "containerStopped": "Beholder {{name}} stoppet", - "failedToStopContainer": "Kan ikke stoppe container {{name}}", - "containerRestarted": "Beholder {{name}} startet på nytt", - "failedToRestartContainer": "Kan ikke starte {{name}} på nytt", - "containerPaused": "Beholder {{name}} pauset", - "containerUnpaused": "Beholder {{name}} ikke aktivert", - "failedToTogglePauseContainer": "Kan ikke veksle pausestatus for beholderen {{name}}", - "containerRemoved": "Beholder {{name}} fjernet", - "failedToRemoveContainer": "Kan ikke fjerne container {{name}}", - "image": "Bilde", - "ports": "Porter", - "noPorts": "Ingen porter", - "start": "Begynn", - "confirmRemoveContainer": "Er du sikker på at du vil fjerne containeren '{{name}}'? Denne handlingen kan ikke angres.", - "runningContainerWarning": "Advarsel: Denne beholderen kjører. Fjerning av den vil stoppe beholderen først.", - "loadingContainers": "Laster containere ...", - "manager": "Docker behandler", - "autoRefresh": "Automatisk oppdatering", - "timestamps": "Tidsstempler", - "lines": "Linjer", - "filterLogs": "Filtrer logger...", - "refresh": "Oppdater", - "download": "Nedlasting", - "clear": "Tøm", - "logsDownloaded": "Nedlasting av logger var vellykket", - "last50": "Siste 50", - "last100": "Siste 100", - "last500": "Siste 500", - "last1000": "Siste 1000", - "allLogs": "Alle logger", - "noLogsMatching": "Ingen logger matcher \"{{query}}\"", - "noLogsAvailable": "Ingen logger tilgjengelig", - "noContainersFound": "Ingen beholdere funnet", - "noContainersFoundHint": "Ingen Docker beholdere er tilgjengelig på denne verten", - "searchPlaceholder": "Søk etter beholdere...", - "allStatuses": "Alle statuser", - "stateRunning": "Kjører", - "statePaused": "Pauset", - "stateExited": "Avsluttet", - "stateRestarting": "Omstart", - "noContainersMatchFilters": "Ingen beholdere samsvarer med filtrene", - "noContainersMatchFiltersHint": "Prøv å endre søke- eller filterkriteriene dine", - "failedToFetchStats": "Kan ikke hente containerstatistikk", - "containerNotRunning": "Beholder ikke kjører", - "startContainerToViewStats": "Start beholderen for å se statistikk", - "loadingStats": "Laster inn statistikk...", - "errorLoadingStats": "Feil ved lasting av statistikk", - "noStatsAvailable": "Ingen statistikk tilgjengelig", - "cpuUsage": "Prosessorbruk", - "current": "Nåværende", - "memoryUsage": "Minne brukt", - "networkIo": "Nettverk I/O", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Utgang", - "blockIo": "Blokker I/O", - "read": "Les", - "write": "Skriv", - "pids": "PID-er", - "containerInformation": "Container informasjon", - "name": "Navn", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Tilstand", - "containerMustBeRunning": "Container må kjøre for å få tilgang til konsollen", - "verificationCodePrompt": "Angi bekreftelseskode", - "totpVerificationFailed": "TOTP-verifisering mislyktes. Vennligst prøv igjen.", - "warpgateVerificationFailed": "Warpgate godkjenning mislyktes. Prøv på nytt.", - "connectedTo": "Koblet til {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Frakoblet", - "consoleError": "Konsoll feil", - "errorMessage": "Feil: {{message}}", - "failedToConnect": "Kan ikke koble til beholderen", - "console": "Konsoll", - "selectShell": "Velg skall", - "bash": "Baskisk", - "sh": "i.i.", - "ash": "aske", - "connect": "Nettverk", - "disconnect": "Frakoblet", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Ikke tilkoblet", - "clickToConnect": "Klikk på koble for å starte en skalløkt", - "connectingTo": "Kobler til {{containerName}}...", - "containerNotFound": "Beholder ikke funnet", - "backToList": "Tilbake til listen", - "logs": "Logger", - "stats": "Statistikk", - "consoleTab": "Konsoll", - "startContainerToAccess": "Start beholderen for å få tilgang til konsollen" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Generelt", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Brukere", - "sectionSessions": "Økter", - "sectionRoles": "Roller", - "sectionDatabase": "Databasen", - "sectionApiKeys": "API nøkler", - "allowRegistration": "Tillat brukerregistrering", - "allowRegistrationDesc": "La nye brukere selvregistrere seg", - "allowPasswordLogin": "Tillat passordpålogging", - "allowPasswordLoginDesc": "Brukernavn/passord innlogging", - "oidcAutoProvision": "OIDC auto-levering", - "oidcAutoProvisionDesc": "Opprett kontoer automatisk for OIDC-brukere selv når registrering er deaktivert", - "allowPasswordReset": "Tillat tilbakestilling av passord", - "allowPasswordResetDesc": "Tilbakestill koden via Docker-loggene", - "sessionTimeout": "Tidsavbrudd for økt", - "hours": "timer", - "sessionTimeoutRange": "Min. 1h · Maks 720h", - "monitoringDefaults": "Standarder for overvåking", - "statusCheck": "Statussjekk", - "metrics": "Måltall", - "sec": "sek", - "logLevel": "Loggnivå (Automatic Translation)", - "enableGuacamole": "Aktiver Guacamol", - "enableGuacamoleDesc": "RDP/VNC eksternt skrivebord", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Fjern filtre", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "Konfigurer OpenID tilkobling for SSO. Felter merket * er påkrevd.", - "oidcClientId": "Klient ID", - "oidcClientSecret": "Klient hemmelighet", - "oidcAuthUrl": "Autorisasjons URL", - "oidcIssuerUrl": "Utsteders URL", - "oidcTokenUrl": "Sjetongens URL", - "oidcUserIdentifier": "Bruker identifikasjons sti", - "oidcDisplayName": "Vis navnesti", - "oidcScopes": "Omfang", - "oidcUserinfoUrl": "Overstyr brukerinfo URL", - "oidcAllowedUsers": "Tillatte brukere", - "oidcAllowedUsersDesc": "En e-post per linje. La stå tom for å tillate alle.", - "removeOidc": "Fjern", - "usersCount": "{{count}} brukere", - "createUser": "Opprett", - "newRole": "Ny rolle", - "roleName": "Navn", - "roleDisplayName": "Vis navn", - "roleDescription": "Beskrivelse", - "rolesCount": "{{count}} roller", - "createRole": "Opprett", - "creating": "Oppretter...", - "exportDatabase": "Eksporter database", - "exportDatabaseDesc": "Last ned en sikkerhetskopi av alle verter, brukeropplysninger og innstillinger", - "export": "Eksporter", - "exporting": "Eksporterer...", - "importDatabase": "Importer Database", - "importDatabaseDesc": "Gjenopprett fra en .sqlite sikkerhetskopifil", - "importDatabaseSelected": "Valgt: {{name}}", - "selectFile": "Velg fil", - "changeFile": "Endre", - "import": "Importer", - "importing": "Importerer...", - "apiKeysCount": "{{count}} nøkler", - "newApiKey": "Ny API-nøkkel", - "apiKeyCreatedWarning": "Nøkkel lagd. Kopier den, den vil ikke bli vist igjen.", - "apiKeyName": "Navn", - "apiKeyUser": "Bruker", - "apiKeySelectUser": "Velg en bruker...", - "apiKeyExpiresAt": "Utløper ved", - "createKey": "Lag nøkkel", - "apiKeyNoExpiry": "Ingen utløpsdato", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Fjerne", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Dobbel Auth", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Lokal", - "adminStatusAdministrator": "Administratorsiden", - "adminStatusRegularUser": "Vanlig bruker", - "adminBadge": "ADMINE", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", + "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "TILPASSET", - "youBadge": "DU", - "sessionsActive": "{{count}} aktiv", - "sessionActive": "Aktiv: {{time}}", - "sessionExpires": "Uttrykk: {{time}}", - "revokeAll": "Alle", - "revokeAllSessionsSuccess": "Alle økter for brukeren tilbakekalt", - "revokeAllSessionsFailed": "Kan ikke tilbakekalle økter", - "revokeSessionFailed": "Kan ikke tilbakekalle sesjonen", - "addRole": "Legg til rolle", - "noCustomRoles": "Ingen egendefinerte roller definert", - "removeRoleFailed": "Kan ikke fjerne rolle", - "assignRoleFailed": "Kunne ikke tildele rolle", - "deleteRoleFailed": "Kunne ikke slette rolle", - "userAdminAccess": "Administratorsiden", - "userAdminAccessDesc": "Full tilgang til alle administrative innstillinger", - "userRoles": "Roller", - "revokeAllUserSessions": "Opphev alle økter", - "revokeAllUserSessionsDesc": "Tving innlogging på nytt på alle enheter", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Sletting av denne brukeren er permanent.", - "deleteUser": "Slett {{username}}", - "deleting": "Sletter...", - "deleteUserFailed": "Kunne ikke slette bruker", - "deleteUserSuccess": "Bruker \"{{username}}\" slettet", - "deleteRoleSuccess": "Rollen \"{{name}}\" slettet", - "revokeKeySuccess": "Nøkkel \"{{name}}\" tilbakekalt", - "revokeKeyFailed": "Kan ikke tilbakekalle nøkkel", - "copiedToClipboard": "Kopiert til utklippstavle", - "done": "Ferdig", - "createUserTitle": "Opprett bruker", - "createUserDesc": "Opprett en ny lokal konto.", - "createUserUsername": "Brukernavn", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Passord", - "createUserPasswordHint": "Minimum 6 tegn.", - "createUserEnterUsername": "Skriv inn brukernavn", - "createUserEnterPassword": "Skriv inn passord", - "createUserSubmit": "Opprett bruker", - "editUserTitle": "Administrere bruker: {{username}}", - "editUserDesc": "Rediger roller, admin status, økter og kontoinnstillinger.", - "editUserUsername": "Brukernavn", - "editUserAuthType": "Autentisering Type", - "editUserAdminStatus": "Admins status", - "editUserUserId": "Bruker ID", - "linkAccountTitle": "Koble OIDC til passordkonto", - "linkAccountDesc": "Slå sammen OIDC-kontoen {{username}} med en eksisterende lokal konto.", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Autorisasjonstype", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "This will:", - "linkAccountEffect1": "Slett bare OIDC-kontoen", - "linkAccountEffect2": "Legg til OIDC innlogging til målkontoen", - "linkAccountEffect3": "Tillate både OIDC og passord innlogging", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Skriv inn lokalt brukernavn for lenk til", - "linkAccounts": "Koble til kontoer", - "linkAccountSuccess": "OIDC-konto koblet til «{{username}}»", - "linkAccountFailed": "Kunne ikke koble til OIDC-kontoen", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Kobler...", - "saving": "Lagrer...", - "updateRegistrationFailed": "Kan ikke oppdatere registreringsinnstillingene", - "updatePasswordLoginFailed": "Kunne ikke oppdatere innloggingsinnstillingene for passord", - "updateOidcAutoProvisionFailed": "Kan ikke oppdatere OIDC auto-levering innstillinger", - "updatePasswordResetFailed": "Kan ikke oppdatere innstillingene for tilbakestilling av passord", - "sessionTimeoutRange2": "Sesjonens timeout må være mellom 1 og 720 timer", - "sessionTimeoutSaved": "Sesjonens tidsavbrudd lagret", - "sessionTimeoutSaveFailed": "Kunne ikke lagre økttidsavbrudd", - "monitoringIntervalInvalid": "Ugyldige intervallverdier", - "monitoringSaved": "Innstillingene er lagret", - "monitoringSaveFailed": "Klarte ikke å lagre overvåkingsinnstillingene", - "guacamoleSaved": "Innstillinger for Guacamol lagret", - "guacamoleSaveFailed": "Lagring av Guacamol-innstillingene mislyktes", - "guacamoleUpdateFailed": "Kan ikke oppdatere innstillinger for Guacamole", - "logLevelUpdateFailed": "Kunne ikke oppdatere loggnivå", - "oidcSaved": "OIDC-konfigurasjon lagret", - "oidcSaveFailed": "Kunne ikke lagre OIDC config", - "oidcRemoved": "OIDC konfigurasjon fjernet", - "oidcRemoveFailed": "Kunne ikke fjerne OIDC config", - "createUserRequired": "Brukernavn og passord er påkrevd", - "createUserPasswordTooShort": "Passord må bestå av minst 6 tegn", - "createUserSuccess": "Bruker \"{{username}}\" opprettet", - "createUserFailed": "Kunne ikke opprette bruker", - "updateAdminStatusFailed": "Kunne ikke oppdatere admin status", - "allSessionsRevoked": "Alle økter opphevet", - "revokeSessionsFailed": "Kan ikke tilbakekalle økter", - "createRoleRequired": "Navn og visningsnavn er påkrevd", - "createRoleSuccess": "Rollen \"{{name}}\" opprettet", - "createRoleFailed": "Kunne ikke opprette rolle", - "apiKeyNameRequired": "Nøkkelnavn er påkrevd", - "apiKeyUserRequired": "Bruker ID kreves", - "apiKeyCreatedSuccess": "API-nøkkel \"{{name}}\" opprettet", - "apiKeyCreateFailed": "Kunne ikke opprette API-nøkkel", - "exportSuccess": "Databasen ble eksportert", - "exportFailed": "Databaseeksporten mislyktes", - "importSelectFile": "Vennligst velg en fil først", - "importCompleted": "Import fullført: {{total}} varer importert, {{skipped}} er hoppet over", - "importFailed": "Import mislyktes: {{error}}", - "importError": "Databaseimport mislyktes" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Vert", - "hostPlaceholder": "192.168.1.1 eller eksempel.no", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Brukernavn", - "usernamePlaceholder": "brukernavn", - "authLabel": "Godkjenning", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Passord", - "passwordPlaceholder": "passord", - "privateKeyLabel": "Privat nøkkel", - "privateKeyPlaceholder": "Lim inn privat nøkkel...", - "credentialLabel": "Påloggingsrettigheter", - "credentialPlaceholder": "Velg en lagret legitimasjon", - "connectToTerminal": "Koble til terminal", - "connectToFiles": "Koble til filer" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Legitimasjon", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Ingen terminal valgt", - "noTerminalSelectedHint": "Åpne en SSH terminal fane for å vise sin kommandologell", - "searchPlaceholder": "Søk etter historikk...", - "clearAll": "Fjern alle", - "noHistoryEntries": "Ingen oppføringer i historien", - "trackingDisabled": "Historie-sporing er deaktivert", - "trackingDisabledHint": "Aktiver den i profilinnstillingene dine for å ta opp kommandoer." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Nøkkel opptak", - "recordToTerminals": "Registrer terminaler", - "selectAll": "Alle", + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", "selectNone": "Ingen", - "noTerminalTabsOpen": "Ingen terminalfaner åpne", - "selectTerminalsAbove": "Velg terminaler over", - "broadcastInputPlaceholder": "Skriv her for å kringkaste tastetrykk...", - "stopRecording": "Stopp lagring", - "startRecording": "Start opptak", - "settingsTitle": "Innstillinger", - "enableRightClickCopyPaste": "Aktiver høyreklikk kopier/lim" + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Oppsett", - "selectLayoutAbove": "Velg et oppsett over", - "selectLayoutHint": "Velg hvor mange paneler som skal vises", - "panesTitle": "Paneler", - "openTabsTitle": "Åpne faner", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Dra faner inn i rutene ovenfor, eller bruk Hurtigtildeling", - "dropHere": "Slipp her", - "emptyPane": "Tom", - "dashboard": "Kontrollpanel", - "clearSplitScreen": "Tøm delt skjerm", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Hurtigtildeling", - "alreadyAssigned": "Rute {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Del fane", "addToSplit": "Legg til i deling", "removeFromSplit": "Fjern fra Split", - "assignToPane": "Tilordne til rute" + "assignToPane": "Tilordne til rute", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Opprett tekstutdrag", - "createSnippetDescription": "Opprett en ny kommando utdrag for rask kjøring", - "nameLabel": "Navn", - "namePlaceholder": "f.eks omstart Nginx", - "descriptionLabel": "Beskrivelse", - "descriptionPlaceholder": "Valgfri beskrivelse", - "optional": "Valgfritt", - "folderLabel": "Mappe", - "noFolder": "Ingen mappe (Ikke kategorisert)", - "commandLabel": "Kommando", - "commandPlaceholder": "F.eks. sudo-systemctl omstart av nginx", - "cancel": "Avbryt", - "createSnippetButton": "Opprett tekstutdrag", - "createFolderTitle": "Opprett mappe", - "createFolderDescription": "Organiser snippeten dine i mapper", - "folderNameLabel": "Mappe navn", - "folderNamePlaceholder": "F.eks. systemkommandoer, Docker skripter", - "folderColorLabel": "Farge på mappe", - "folderIconLabel": "Mappe ikon", - "previewLabel": "Forhåndsvisning", - "folderNameFallback": "Mappe navn", - "createFolderButton": "Opprett mappe", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Kansellere", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Alle", + "selectAll": "All", "selectNone": "Ingen", - "noTerminalTabsOpen": "Ingen terminalfaner åpne", - "searchPlaceholder": "Søk snippet...", - "newSnippet": "Ny tekstutdrag", - "newFolder": "Ny mappe", - "run": "Kjør", - "noSnippetsInFolder": "Ingen snippets i denne mappen", - "uncategorized": "Ukategorisert", - "editSnippetTitle": "Rediger tekstutdrag", - "editSnippetDescription": "Oppdater denne kommandoen utdrag", - "saveSnippetButton": "Lagre endringer", - "createSuccess": "Snutt er opprettet", - "createFailed": "Kunne ikke opprette utdraget", - "updateSuccess": "Sniktippen er oppdatert", - "updateFailed": "Kunne ikke oppdatere utdraget", - "deleteFailed": "Kunne ikke slette utdragsutdrag", - "folderCreateSuccess": "Mappen ble opprettet", - "folderCreateFailed": "Kunne ikke opprette mappen", - "editFolderTitle": "Rediger mappe", - "editFolderDescription": "Endre navn på eller endre utseendet til denne mappen", - "saveFolderButton": "Lagre endringer", - "editFolder": "Rediger mappe", - "deleteFolder": "Slett mappe", - "folderDeleteSuccess": "Mappe \"{{name}}slettet", - "folderDeleteFailed": "Kunne ikke slette mappe", - "folderEditSuccess": "Mappen ble oppdatert", - "folderEditFailed": "Kunne ikke oppdatere mappen", - "confirmRunMessage": "Kjør \"{{name}}\"?", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Løp", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Løp", - "runSuccess": "Ran \"{{name}}\" i terminaler for {{count}}", - "copySuccess": "Kopiert \"{{name}}\" til utklippstavle", - "shareTitle": "Del tekstutdrag", - "shareUser": "Bruker", - "shareRole": "Rolle", - "selectUser": "Velg en bruker...", - "selectRole": "Velg en rolle...", - "shareSuccess": "Slutt ble delt", - "shareFailed": "Kunne ikke dele rulling", - "revokeSuccess": "Tilgang tilbakekalt", - "revokeFailed": "Kunne ikke oppheve tilgangen", - "currentAccess": "Gjeldende tilgang", - "shareLoadError": "Kunne ikke laste delingsdata", - "loading": "Laster...", - "close": "Lukk", - "reorderFailed": "Kunne ikke lagre rekkefølgen på kodeutdraget" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Kunne ikke lagre rekkefølgen på kodeutdraget", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Konto", - "sectionAppearance": "Utseende", - "sectionSecurity": "Sikkerhet", - "sectionApiKeys": "API nøkler", - "sectionC2sTunnels": "C2S tunneler", - "usernameLabel": "Brukernavn", - "roleLabel": "Rolle", - "roleAdministrator": "Administratorsiden", - "authMethodLabel": "Auth metode", - "authMethodLocal": "Lokal", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "På", - "twoFaOff": "Av", - "versionLabel": "Versjon", - "deleteAccount": "Slett konto", - "deleteAccountDescription": "Slett kontoen din permanent", - "deleteButton": "Slett", - "deleteAccountPermanent": "Denne handlingen er permanent og kan ikke angres.", - "deleteAccountWarning": "Alle økter, verter, brukeropplysninger og innstillinger vil bli slettet permanent.", - "confirmPasswordDeletePlaceholder": "Skriv inn passord for å bekrefte", - "languageLabel": "Språk", - "themeLabel": "Tema", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Inngående farge", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Kommando Autofullfør", - "commandAutocompleteDesc": "Vis autofullfør mens du skriver", - "historyTracking": "Historikk sporing", - "historyTrackingDesc": "Spor terminalkommandoer", - "syntaxHighlighting": "Syntaksutheving", - "syntaxHighlightingDesc": "Fremhev terminal utgang", - "commandPalette": "Kommandobalett palett", - "commandPaletteDesc": "Aktiver hurtigtast", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Åpne faner igjen ved pålogging", "reopenTabsOnLoginDesc": "Gjenopprett åpne faner når du logger inn eller oppdaterer siden, selv fra en annen enhet", - "confirmTabClose": "Bekreft lukking av fane", - "confirmTabCloseDesc": "Spør før lukking av terminalfaner", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Vis vertsmerker", - "showHostTagsDesc": "Vis emneord i vertslisten", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Klikk for å utvide vertshandlinger", "hostTrayOnClickDesc": "Vis alltid tilkoblingsknapper; klikk for å utvide administrasjonsalternativer i stedet for å holde musepekeren over", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Hold appskinnen i venstre sidefelt alltid utvidet i stedet for å utvides når du holder musepekeren over den", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", "settingsSnippets": "Snippets", - "foldersCollapsed": "Mapper samlet", - "foldersCollapsedDesc": "Skjul mapper som standard", - "confirmExecution": "Bekreft kjøring", - "confirmExecutionDesc": "Bekreft før kjøring av snippets", - "settingsUpdates": "Oppdateringer", - "disableUpdateChecks": "Deaktiver oppdateringskontroller", - "disableUpdateChecksDesc": "Slutt å sjekke etter oppdateringer", - "totpAuthenticator": "TOTP autentisering", - "totpEnabled": "2FA er aktivert", - "totpDisabled": "Legg til ekstra pålogging", - "disable": "Deaktiver", - "enable": "Aktiver", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Skann QR-kode eller skriv inn hemmelig i autentiseringsappen din, skriv så inn den 6-sifrede koden", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verifiser", - "changePassword": "Endre passord", - "currentPasswordLabel": "Nåværende passord", - "currentPasswordPlaceholder": "Nåværende passord", - "newPasswordLabel": "Nytt passord", - "newPasswordPlaceholder": "Nytt passord", - "confirmPasswordLabel": "Bekreft nytt passord", - "confirmPasswordPlaceholder": "Bekreft nytt passord", - "updatePassword": "Oppdater passord", - "createApiKeyTitle": "Opprett API-nøkkel", - "createApiKeyDescription": "Generer en ny API-nøkkel for programmatisk tilgang.", - "apiKeyNameLabel": "Navn", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "valgfritt", - "cancel": "Avbryt", - "createKey": "Lag nøkkel", - "apiKeyCount": "{{count}} nøkler", - "newKey": "Ny nøkkel", - "noApiKeys": "Ingen API nøkler ennå.", - "apiKeyActive": "Aktiv", - "apiKeyUsageHint": "Inkluder nøkkelen din i", - "apiKeyUsageHintHeader": "topptekst.", - "apiKeyPermissionsHint": "Nøkler arver tillatelser for opprettelse av bruker.", - "roleUser": "Bruker", - "authMethodDual": "Dobbel Auth", + "optional": "optional", + "cancel": "Kansellere", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Kunne ikke starte TOTP-oppsettet", - "totpEnter6Digits": "Angi en 6-sifret kode", - "totpEnabledSuccess": "To-faktor autentisering aktivert", - "totpInvalidCode": "Ugyldig kode, prøv igjen", - "totpDisableInputRequired": "Skriv inn TOTP-koden eller passordet", - "totpDisabledSuccess": "To-faktor autentisering deaktivert", - "totpDisableFailed": "Kunne ikke deaktivere 2FA", - "totpDisableTitle": "Deaktiver 2FA", - "totpDisablePlaceholder": "Skriv inn TOTP-kode eller passord", - "totpDisableConfirm": "Deaktiver 2FA", - "totpContinueVerify": "Fortsett til godkjenning", - "totpVerifyTitle": "Verifiser koden", - "totpBackupTitle": "Sikkerhetskopierings koder", - "totpDownloadBackup": "Last ned backup-koder", - "done": "Ferdig", - "secretCopied": "Hemmelig kopiert til utklippstavlen", - "apiKeyNameRequired": "Nøkkelnavn er påkrevd", - "apiKeyCreated": "API-nøkkel \"{{name}}\" opprettet", - "apiKeyCreateFailed": "Kunne ikke opprette API-nøkkel", - "apiKeyUser": "Bruker", - "apiKeyExpires": "Utløper", - "apiKeyRevoked": "API-nøkkel \"{{name}}\" opphevet", - "apiKeyRevokeFailed": "Kan ikke tilbakekalle API-nøkkel", - "passwordFieldsRequired": "Nåværende og nye passord er påkrevd", - "passwordMismatch": "Passordene samsvarer ikke", - "passwordTooShort": "Passord må bestå av minst 6 tegn", - "passwordUpdated": "Passordet er oppdatert", - "passwordUpdateFailed": "Kunne ikke oppdatere passord", - "deletePasswordRequired": "Passord er nødvendig for å slette kontoen din", - "deleteFailed": "Kunne ikke slette konto", - "deleting": "Sletter...", - "colorPickerTooltip": "Åpne fargevelger", - "themeSystem": "Systemadministrasjon", - "themeLight": "Lys", - "themeDark": "Mørk", - "themeDracula": "Drakula", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarisert", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "En mørk", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tagger", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Prøv på nytt", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Fjerne", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/pl_PL.json b/src/ui/locales/translated/pl_PL.json index ef25026a..2b839ac1 100644 --- a/src/ui/locales/translated/pl_PL.json +++ b/src/ui/locales/translated/pl_PL.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Foldery", + "folders": "Folders", "folder": "Folder", "password": "Hasło", - "key": "Klucz", - "sshPrivateKey": "Klucz prywatny SSH", - "upload": "Prześlij", - "keyPassword": "Hasło klucza", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "Klucz SSH", - "uploadPrivateKeyFile": "Prześlij plik klucza prywatnego", - "searchCredentials": "Szukaj danych logowania...", - "addCredential": "Dodaj poświadczenia", - "caCertificate": "Certyfikat CA (-cert.pub)", - "caCertificateDescription": "Opcjonalnie: Prześlij lub wklej plik certyfikatu CA-signed (np. id_ed25519-cert.pub). Wymagane, gdy serwer SSH używa autoryzacji opartej na certyfikacie.", - "uploadCertFile": "Prześlij plik -cert.pub", - "clearCert": "Wyczyść", - "certLoaded": "Certyfikat załadowany", - "certPublicKeyLabel": "Certyfikat CA", - "certTypeLabel": "Typ certyfikatu", - "pasteOrUploadCert": "Wklej lub wgraj certyfikat -cert.pub...", - "hasCaCert": "Posiada certyfikat CA", - "noCaCert": "Brak certyfikatu CA" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Domyślna kolejność", + "sortNameAsc": "Imię (A → Z)", + "sortNameDesc": "Imię (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Wyczyść filtry", + "filterTypeGroup": "Type", + "filterTypePassword": "Hasło", + "filterTypeKey": "Klucz SSH", + "filterTagsGroup": "Tagi" }, "homepage": { - "failedToLoadAlerts": "Nie udało się załadować alertów", - "failedToDismissAlert": "Nie udało się odrzucić alertu" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Konfiguracja serwera", - "description": "Skonfiguruj adres URL serwera Termix, aby połączyć się z usługami backend", - "serverUrl": "Adres URL serwera", - "enterServerUrl": "Wprowadź adres URL serwera", - "saveFailed": "Nie udało się zapisać konfiguracji", - "saveError": "Błąd podczas zapisywania konfiguracji", - "saving": "Zapisywanie...", - "saveConfig": "Zapisz konfigurację", - "helpText": "Wprowadź adres URL, w którym działa Twój serwer Termix (np. http://localhost:30001 lub https://your-server.com)", - "changeServer": "Zmień serwer", - "mustIncludeProtocol": "Adres URL serwera musi zaczynać się od http:// lub https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Zezwól na nieprawidłowy certyfikat", "allowInvalidCertificateDesc": "Używaj tylko w przypadku zaufanych serwerów hostowanych samodzielnie, z certyfikatami podpisanymi samodzielnie lub opartymi na adresie IP.", - "useEmbedded": "Użyj serwera lokalnego", - "embeddedDesc": "Uruchom Termix z wbudowanym serwerem lokalnym (nie jest wymagany zdalny serwer)", - "embeddedConnecting": "Łączenie z serwerem lokalnym...", - "embeddedNotReady": "Serwer lokalny nie jest jeszcze gotowy. Poczekaj chwilę i spróbuj ponownie.", - "localServer": "Serwer lokalny" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Usunąć" }, "versionCheck": { - "error": "Błąd sprawdzania wersji", - "checkFailed": "Nie udało się sprawdzić aktualizacji", - "upToDate": "Aplikacja jest aktualna", - "currentVersion": "Używasz wersji {{version}}", - "updateAvailable": "Dostępna aktualizacja", - "newVersionAvailable": "Dostępna jest nowa wersja! Używasz {{current}}, ale {{latest}} jest dostępny.", - "betaVersion": "Wersja beta", - "betaVersionDesc": "Używasz {{current}}, który jest nowszy niż najnowsze stabilne wydanie {{latest}}.", - "releasedOn": "Wydano dnia {{date}}", - "downloadUpdate": "Pobierz aktualizację", - "checking": "Sprawdzanie aktualizacji...", - "checkUpdates": "Sprawdź aktualizacje", - "checkingUpdates": "Sprawdzanie aktualizacji...", - "updateRequired": "Wymagana aktualizacja" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Zamknij", + "close": "Close", "minimize": "Minimize", - "online": "Dostępny", - "offline": "Offline", - "continue": "Kontynuuj", - "maintenance": "Konserwacja", - "degraded": "Degradacja", - "error": "Błąd", - "warning": "Ostrzeżenie", - "unsavedChanges": "Niezapisane zmiany", - "dismiss": "Odrzuć", - "loading": "Ładowanie...", - "optional": "Opcjonalnie", - "connect": "Połącz", - "copied": "Skopiowano", - "connecting": "Łączenie...", - "updateAvailable": "Dostępna aktualizacja", - "appName": "Termiks", - "openInNewTab": "Otwórz w nowej karcie", - "noReleases": "Brak wydań", - "updatesAndReleases": "Aktualizacje i wydania", - "newVersionAvailable": "Dostępna jest nowa wersja ({{version}}).", - "failedToFetchUpdateInfo": "Nie udało się pobrać informacji o aktualizacji", - "preRelease": "Wydanie wstępne", - "noReleasesFound": "Nie znaleziono wydań.", - "cancel": "Anuluj", - "username": "Nazwa użytkownika", - "login": "Logowanie", - "register": "Rejestracja", + "online": "W sieci", + "offline": "Niedostępny", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Anulować", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Hasło", - "confirmPassword": "Potwierdź hasło", - "back": "Powrót", - "save": "Zapisz", - "saving": "Zapisywanie...", - "delete": "Usuń", - "rename": "Zmień nazwę", - "edit": "Edytuj", - "add": "Dodaj", - "confirm": "Potwierdź", - "no": "Nie", - "or": "LUB", - "next": "Następny", - "previous": "Poprzedni", - "refresh": "Odśwież", - "language": "Język", - "checking": "Sprawdzanie...", - "checkingDatabase": "Sprawdzanie połączenia z bazą danych...", - "checkingAuthentication": "Sprawdzanie uwierzytelniania...", - "backendReconnected": "Połączenie z serwerem przywrócone", - "connectionDegraded": "Połączenie z serwerem zostało utracone, odzyskiwanie…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Usuń", - "create": "Utwórz", - "update": "Aktualizuj", - "copy": "Kopiuj", - "copyFailed": "Nie udało się skopiować do schowka", + "remove": "Usunąć", + "create": "Create", + "update": "Update", + "copy": "Kopia", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Przywróć", - "of": "z" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Strona główna", + "home": "Home", "terminal": "Terminal", - "docker": "Dokujący", - "tunnels": "Tunele", + "docker": "Doker", + "tunnels": "Tunnels", "fileManager": "Menedżer plików", - "serverStats": "Statystyki serwera", - "admin": "Administrator", - "userProfile": "Profil użytkownika", - "splitScreen": "Podziel ekran", - "confirmClose": "Zamknąć tę aktywną sesję?", - "close": "Zamknij", - "cancel": "Anuluj", - "sshManager": "Menedżer SSH", - "cannotSplitTab": "Nie można podzielić tej karty", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Anulować", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Skopiuj hasło", - "copySudoPassword": "Skopiuj hasło Sudo", - "passwordCopied": "Hasło skopiowane do schowka", - "noPasswordAvailable": "Hasło nie jest dostępne", - "failedToCopyPassword": "Nie udało się skopiować hasła", - "refreshTab": "Odśwież połączenie", - "openFileManager": "Otwórz menedżera plików", - "dashboard": "Pulpit", - "networkGraph": "Wykres sieci", - "quickConnect": "Szybkie połączenie", - "sshTools": "Narzędzia SSH", - "history": "Historia", - "hosts": "Hosty", - "snippets": "Fragmenty", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", "hostManager": "Host Manager", - "credentials": "Dane logowania", + "credentials": "Credentials", "connections": "Znajomości", "roleAdministrator": "Administrator", - "roleUser": "Użytkownik" + "roleUser": "User" }, "hosts": { - "hosts": "Hosty", - "noHosts": "Brak hostów SSH", - "retry": "Ponów próbę", - "refresh": "Odśwież", - "optional": "Opcjonalnie", - "downloadSample": "Pobierz próbkę", - "failedToDeleteHost": "Nie udało się usunąć {{name}}", - "importSkipExisting": "Import (pomiń istniejące)", - "connectionDetails": "Szczegóły połączenia", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Spróbować ponownie", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Zdalny pulpit", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Nazwa użytkownika", + "username": "Username", "folder": "Folder", "tags": "Tagi", - "pin": "Przypnij", - "addHost": "Dodaj hosta", - "editHost": "Edytuj hosta", - "cloneHost": "Klonuj hosta", - "enableTerminal": "Włącz terminal", - "enableTunnel": "Włącz tunel", - "enableFileManager": "Włącz menedżera plików", - "enableDocker": "Włącz Docker", - "defaultPath": "Domyślna ścieżka", - "connection": "Połączenie", - "upload": "Prześlij", - "authentication": "Uwierzytelnianie", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Hasło", - "key": "Klucz", - "credential": "Dane logowania", - "none": "Brak", - "sshPrivateKey": "Klucz prywatny SSH", - "keyType": "Typ klucza", - "uploadFile": "Prześlij plik", - "tabGeneral": "Ogólny", + "key": "Key", + "credential": "Mandat", + "none": "Nic", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Tunele", - "tabDocker": "Dokujący", - "tabFiles": "Pliki", - "tabStats": "Statystyki", + "tabTunnels": "Tunnels", + "tabDocker": "Doker", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Udostępnianie", - "tabAuthentication": "Uwierzytelnianie", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunel", "fileManager": "Menedżer plików", - "serverStats": "Statystyki serwera", + "serverStats": "Host Metrics", "status": "Status", - "folderRenamed": "Katalog \"{{oldName}}\" zmieniono na \"{{newName}}\" pomyślnie", - "failedToRenameFolder": "Nie udało się zmienić nazwy folderu", - "movedToFolder": "Przeniesiono do \"{{folder}}\"", - "editHostTooltip": "Edytuj hosta", - "statusChecks": "Sprawdzanie statusu", - "metricsCollection": "Kolekcja metryk", - "metricsInterval": "Interwał kolekcji liczników", - "metricsIntervalDesc": "Jak często zbierać statystyki serwera (5s - 1h)", - "behavior": "Zachowanie", - "themePreview": "Podgląd motywu", - "theme": "Motyw", - "fontFamily": "Rodzina czcionek", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Odstępy między literami", - "lineHeight": "Wysokość linii", - "cursorStyle": "Styl kursora", - "cursorBlink": "Miganie kursora", - "scrollbackBuffer": "Bufor przewijania", - "bellStyle": "Styl bella", - "rightClickSelectsWord": "Kliknij prawym przyciskiem myszy na wybranie słowa", - "fastScrollModifier": "Modyfikator szybkiego przewijania", - "fastScrollSensitivity": "Czułość szybkiego przewijania", - "sshAgentForwarding": "Przekazywanie SSH Agent", - "backspaceMode": "Tryb Backspace", - "startupSnippet": "Snippet startowy", - "selectSnippet": "Wybierz fragment", - "forceKeyboardInteractive": "Wymuś Interaktywną Klawiaturę", - "overrideCredentialUsername": "Zastąp nazwę użytkownika", - "overrideCredentialUsernameDesc": "Użyj nazwy użytkownika podanej powyżej zamiast nazwy użytkownika poświadczenia", - "jumpHostChain": "Skok hosta skoku", - "portKnocking": "Odrzucenie portu", - "addKnock": "Dodaj port", - "addProxyNode": "Dodaj węzeł", - "proxyNode": "Węzeł proxy", - "proxyType": "Typ serwera proxy", - "quickActions": "Szybkie akcje", - "sudoPasswordAutoFill": "Automatyczne wypełnienie hasła Sudo", - "sudoPassword": "Hasło Sudo", - "keepaliveInterval": "Interwał Keepalive (ms)", - "moshCommand": "Polecenie MOSH", - "environmentVariables": "Zmienne środowiskowe", - "addVariable": "Dodaj zmienną", - "docker": "Dokujący", - "copyTerminalUrl": "Skopiuj adres URL terminalu", - "copyFileManagerUrl": "Skopiuj URL menedżera plików", - "copyRemoteDesktopUrl": "Skopiuj adres URL zdalnego pulpitu", - "failedToConnect": "Nie udało się połączyć z konsolą", - "connect": "Połącz", - "disconnect": "Rozłącz", - "start": "Rozpocznij", - "enableStatusCheck": "Włącz sprawdzanie statusu", - "enableMetrics": "Włącz metryki", - "bulkUpdateFailed": "Aktualizacja zbiorcza nie powiodła się", - "selectAll": "Zaznacz wszystko", - "deselectAll": "Odznacz wszystkie", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Doker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Bezpieczna powłoka", - "virtualNetwork": "Sieć wirtualna", - "unencryptedShell": "Niezaszyfrowana powłoka", - "addressIp": "Adres / IP", - "friendlyName": "Nazwa przyjacielska", - "folderAndAdvanced": "Folder & Zaawansowane", - "privateNotes": "Prywatne notatki", - "privateNotesPlaceholder": "Szczegóły dotyczące tego serwera...", - "pinToTop": "Przypnij do góry", - "pinToTopDesc": "Zawsze pokazuj ten host na górze listy", - "portKnockingSequence": "Sekwencja odrzucania portów", - "addKnockBtn": "Dodaj Knock", - "noPortKnocking": "Nie skonfigurowano odrzucania portów.", - "knockPort": "Port Knock", - "protocol": "Protocol", - "delayAfterMs": "Opóźnienie po (ms)", - "useSocks5Proxy": "Użyj serwera proxy SOCKS5", - "useSocks5ProxyDesc": "Trasa połączenia przez serwer proxy", - "proxyHost": "Serwer proxy", - "proxyPort": "Port serwera proxy", - "proxyUsername": "Nazwa użytkownika proxy", - "proxyPassword": "Hasło serwera proxy", - "proxySingleMode": "Pojedyncze proxy", - "proxyChainMode": "Łańcuch proxy", - "you": "Ty", - "jumpHostChainLabel": "Skok hosta skoku", - "addJumpBtn": "Dodaj skok", - "noJumpHosts": "Brak skonfigurowanych hostów skoku.", - "selectAServer": "Wybierz serwer...", - "sshPort": "Port SSH", - "authMethod": "Metoda uwierzytelniania", - "storedCredential": "Przechowywane poświadczenia", - "selectACredential": "Wybierz poświadczenie...", - "keyTypeLabel": "Typ klucza", - "keyTypeAuto": "Automatyczne wykrywanie", - "keyPasteTab": "Wklej", - "keyUploadTab": "Prześlij", - "keyFileLoaded": "Plik klucza załadowany", - "keyUploadClick": "Kliknij, aby wgrać .pem / .key / .ppk", - "clearKey": "Wyczyść klucz", - "keySaved": "Klucz SSH zapisany", - "keyReplaceNotice": "wklej nowy klucz poniżej, aby zastąpić go", - "keyPassphraseSaved": "Hasło zapisane, wpisz, aby zmienić", - "replaceKey": "Zamień klucz", - "forceKeyboardInteractiveLabel": "Wymuś Interaktywną Klawiaturę", - "forceKeyboardInteractiveShortDesc": "Wymuś ręczne wprowadzanie hasła, nawet jeśli istnieją klucze", - "terminalAppearance": "Wygląd terminalu", - "colorTheme": "Kolor motywu", - "fontFamilyLabel": "Rodzina czcionek", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protokół", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Styl kursora", - "letterSpacingPx": "Odstępy między literami (px)", - "lineHeightLabel": "Wysokość linii", - "bellStyleLabel": "Styl bella", - "backspaceModeLabel": "Tryb Backspace", - "cursorBlinking": "Miganie kursora", - "cursorBlinkingDesc": "Włącz animację migania dla kursora terminala", - "rightClickSelectsWordLabel": "Kliknij prawym przyciskiem myszy na wybranie słowa", - "rightClickSelectsWordShortDesc": "Wybierz słowo pod kursorem po prawym kliknięciu", - "behaviorAndAdvanced": "Zachowanie i zaawansowane", - "scrollbackBufferLabel": "Bufor przewijania", - "scrollbackMaxLines": "Maksymalna liczba linii utrzymywanych w historii", - "sshAgentForwardingLabel": "Przekazywanie SSH Agent", - "sshAgentForwardingShortDesc": "Przekaż swoje lokalne klucze SSH do tego hosta", - "enableAutoMosh": "Włącz Auto-Mosh", - "enableAutoMoshDesc": "Preferuj Moosh nad SSH, jeśli jest dostępny", - "enableAutoTmux": "Włącz Auto-Tmux", - "enableAutoTmuxDesc": "Automatycznie uruchom lub dołącz do sesji tmux", - "sudoPasswordAutoFillLabel": "Autouzupełnianie hasła Sudo", - "sudoPasswordAutoFillShortDesc": "Automatycznie podaj hasło sudo gdy zostaniesz o to poproszony", - "sudoPasswordLabel": "Hasło Sudo", - "environmentVariablesLabel": "Zmienne środowiskowe", - "addVariableBtn": "Dodaj zmienną", - "noEnvVars": "Brak skonfigurowanych zmiennych środowiskowych.", - "fastScrollModifierLabel": "Modyfikator szybkiego przewijania", - "fastScrollSensitivityLabel": "Czułość szybkiego przewijania", - "moshCommandLabel": "Dowództwo Mosh", - "startupSnippetLabel": "Snippet startowy", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Interwał utrzymywania połączenia (sekundy)", - "maxKeepaliveMisses": "Maks. ilość pominięć Keepalive", - "tunnelSettings": "Ustawienia tunelu", - "enableTunneling": "Włącz Tunelowanie", - "enableTunnelingDesc": "Włącz funkcję tunelu SSH dla tego hosta", - "serverTunnelsSection": "Tunele serwera", - "addTunnelBtn": "Dodaj Tunel", - "noTunnelsConfigured": "Brak skonfigurowanych tuneli.", - "tunnelLabel": "Tunel {{number}}", - "tunnelType": "Typ tunelu", - "tunnelModeLocalDesc": "Przekieruj port lokalny do portu na zdalnym serwerze (lub hosta osiągalnego z niego).", - "tunnelModeRemoteDesc": "Przekieruj port na zdalnym serwerze z powrotem do lokalnego portu na komputerze.", - "tunnelModeDynamicDesc": "Utwórz proxy SOCKS5 na lokalnym porcie dla dynamicznego przekazywania portu.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Ten host (tunel bezpośredni)", - "endpointHost": "Host punktu końcowego", - "endpointPort": "Port punktu końcowego", - "bindHost": "Powiąż hosta", - "sourcePort": "Port źródłowy", - "maxRetries": "Maksymalna liczba prób", - "retryIntervalS": "Ponów interwał (s)", - "autoStartLabel": "Automatyczne uruchamianie", - "autoStartDesc": "Automatycznie podłącz ten tunel po załadowaniu hosta", - "tunnelConnecting": "Łączenie tunelu...", - "tunnelDisconnected": "Tunel odłączony", - "failedToConnectTunnel": "Nie udało się połączyć", - "failedToDisconnectTunnel": "Nie udało się odłączyć", - "dockerIntegration": "Integracja z Dockerem", - "enableDockerMonitor": "Włącz Docker", - "enableDockerMonitorDesc": "Monitoruj kontenery na tym serwerze za pośrednictwem Dockera i zarządzaj nimi", - "enableFileManagerMonitor": "Włącz menedżera plików", - "enableFileManagerMonitorDesc": "Przeglądaj i zarządzaj plikami tego hosta przez SFTP", - "defaultPathLabel": "Domyślna ścieżka", - "fileManagerPathHint": "Katalog do otwarcia po uruchomieniu menedżera plików dla tego hosta.", - "statusChecksLabel": "Sprawdzanie statusu", - "enableStatusChecks": "Włącz sprawdzanie statusu", - "enableStatusChecksDesc": "Okresowo ping tego hosta aby zweryfikować dostępność", - "useGlobalInterval": "Użyj Globalnego Interwału", - "useGlobalIntervalDesc": "Zastąp całym serwerem okresem sprawdzania stanu", - "checkIntervalS": "Sprawdź interwał (s)", - "checkIntervalDesc": "Sekundy między każdym pingiem łączności", - "metricsCollectionLabel": "Kolekcja metryk", - "enableMetricsLabel": "Włącz metryki", - "enableMetricsDesc": "Zbieraj CPU, RAM, dysk i korzystanie z sieci z tego hosta", - "useGlobalMetrics": "Użyj Globalnego Interwału", - "useGlobalMetricsDesc": "Zastąp interwałem metrycznym dla całego serwera", - "metricsIntervalS": "Interwał (interwalenty) metryki", - "metricsIntervalDesc2": "Sekund między migawkami metrycznymi", - "visibleWidgets": "Widoczne widżety", - "cpuUsageLabel": "Użycie procesora", - "cpuUsageDesc": "Procent procesora, średnie obciążenia, wykres linii sparkline", - "memoryLabel": "Użycie pamięci", - "memoryDesc": "Zużycie pamięci RAM, zamiana, pamięć podręczna", - "storageLabel": "Użycie dysku", - "storageDesc": "Użycie dysku na punkt montowania", - "networkLabel": "Interfejsy sieciowe", - "networkDesc": "Lista interfejsów i szerokość pasma", - "uptimeLabel": "Czas pracy", - "uptimeDesc": "Systemowy czas pracy i czas rozruchu", - "systemInfoLabel": "Informacje o systemie", - "systemInfoDesc": "System operacyjny, jąder, nazwa hosta, architektura", - "recentLoginsLabel": "Ostatnie logowania", - "recentLoginsDesc": "Pomyślne i nieudane logowanie", - "topProcessesLabel": "Najlepsze procesy", - "topProcessesDesc": "PID, CPU%, MEM%, komenda", - "listeningPortsLabel": "Porty słuchające", - "listeningPortsDesc": "Otwieraj porty z procesem i stanem", - "firewallLabel": "Zapora", - "firewallDesc": "Firewall, AppArmor, status SELinux", - "quickActionsLabel": "Szybkie akcje", - "quickActionsToolbar": "Szybkie akcje pojawiają się jako przyciski na pasku statystyk serwera do wykonania poleceń jednego kliknięcia.", - "noQuickActions": "Brak szybkich akcji.", - "buttonLabel": "Etykieta przycisku", - "selectSnippetPlaceholder": "Wybierz snippet...", - "addActionBtn": "Dodaj akcję", - "hostSharedSuccessfully": "Host udostępniony pomyślnie", - "failedToShareHost": "Nie udało się udostępnić hosta", - "accessRevoked": "Dostęp odwołany", - "failedToRevokeAccess": "Nie udało się odwołać dostępu", - "cancelBtn": "Anuluj", - "savingBtn": "Zapisywanie...", - "addHostBtn": "Dodaj hosta", - "hostUpdated": "Host zaktualizowany", - "hostCreated": "Host utworzony", - "failedToSave": "Nie udało się zapisać hosta", - "credentialUpdated": "Zaktualizowano poświadczenia", - "credentialCreated": "Utworzono poświadczenia", - "failedToSaveCredential": "Nie można zapisać danych logowania", - "backToHosts": "Powrót do hostów", - "backToCredentials": "Wróć do danych logowania", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Hasło", + "authTypeKey": "Klucz SSH", + "authTypeCredential": "Mandat", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Nic", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Anulować", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Przypięte", - "noHostsFound": "Nie znaleziono hostów", - "tryDifferentTerm": "Wypróbuj inne wyrażenie", - "addFirstHost": "Dodaj swojego pierwszego hosta, aby rozpocząć", - "noCredentialsFound": "Nie znaleziono danych logowania", - "addCredentialBtn": "Dodaj poświadczenia", - "updateCredentialBtn": "Aktualizuj dane logowania", - "features": "Funkcje", - "noFolder": "(Brak folderu)", - "deleteSelected": "Usuń", - "exitSelection": "Wyjdź z zaznaczenia", - "importSkip": "Import (pomiń istniejące)", - "importOverwrite": "Import (nadpisanie)", - "collapseBtn": "Zwiń", - "importExportBtn": "Import / Eksport", - "hostStatusesRefreshed": "Statusy hosta odświeżone", - "failedToRefreshHosts": "Nie udało się odświeżyć hostów", - "movedHostTo": "Przeniesiono {{host}} do \"{{folder}}\"", - "failedToMoveHost": "Nie udało się przenieść hosta", - "folderRenamedTo": "Zmieniono nazwę folderu na \"{{name}}\"", - "deletedFolder": "Usunięto folder \"{{name}}\"", - "failedToDeleteFolder": "Nie udało się usunąć folderu", - "deleteAllInFolder": "Usunąć wszystkie hosty w \"{{name}}\"? Tej operacji nie można cofnąć.", - "deletedHost": "Usunięto {{name}}", - "copiedToClipboard": "Skopiowano do schowka", - "terminalUrlCopied": "Adres URL terminalu skopiowany", - "fileManagerUrlCopied": "Adres URL menedżera plików skopiowany", - "tunnelUrlCopied": "Adres URL tunelu skopiowany", - "dockerUrlCopied": "Skopiowano URL dokera", - "serverStatsUrlCopied": "Skopiowano URL statystyk serwera", - "rdpUrlCopied": "URL RDP skopiowany", - "vncUrlCopied": "Adres URL VNC skopiowany", - "telnetUrlCopied": "Skopiowano adres URL Telnet", - "remoteDesktopUrlCopied": "Adres URL zdalnego pulpitu skopiowany", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Cechy", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Anulować", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protokół", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Rozwiń działania", "collapseActions": "Zwiń akcje", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Pakiet magiczny wysłany do {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Nie udało się wysłać pakietu magicznego", - "cloneHostAction": "Klonuj hosta", - "copyAddress": "Kopiuj adres", - "copyLink": "Kopiuj link", - "copyTerminalUrlAction": "Skopiuj adres URL terminalu", - "copyFileManagerUrlAction": "Skopiuj URL menedżera plików", - "copyTunnelUrlAction": "Skopiuj adres URL tunelu", - "copyDockerUrlAction": "Skopiuj URL dokera", - "copyServerStatsUrlAction": "Skopiuj adres URL statystyk serwera", - "copyRdpUrlAction": "Kopiuj adres URL RDP", - "copyVncUrlAction": "Kopiuj URL VNC", - "copyTelnetUrlAction": "Kopiuj adres Telnet", - "copyRemoteDesktopUrlAction": "Skopiuj adres URL zdalnego pulpitu", - "deleteCredentialConfirm": "Usunąć dane logowania \"{{name}}\"?", - "deletedCredential": "Usunięto {{name}}", - "deploySSHKeyTitle": "Wdrożenie klucza SSH", - "deployingBtn": "Wdrażanie...", - "deployBtn": "Wdrożenie", - "failedToDeployKey": "Nie udało się wdrożyć klucza", - "deleteHostsConfirm": "Usunąć hosta {{count}}{{plural}}? Tej operacji nie można cofnąć.", - "movedToRoot": "Przeniesiono do roota", - "failedToMoveHosts": "Nie udało się przenieść hostów", - "enableTerminalFeature": "Włącz terminal", - "disableTerminalFeature": "Wyłącz Terminal", - "enableFilesFeature": "Włącz pliki", - "disableFilesFeature": "Wyłącz pliki", - "enableTunnelsFeature": "Włącz tunele", - "disableTunnelsFeature": "Wyłącz tunele", - "enableDockerFeature": "Włącz Docker", - "disableDockerFeature": "Wyłącz Docker", - "addTagsPlaceholder": "Dodaj tagi...", - "authDetails": "Szczegóły uwierzytelniania", - "credType": "Typ", - "generateKeyPairDesc": "Wygeneruj nową parę kluczy, klucze prywatne i publiczne będą wypełniane automatycznie.", - "generatingKey": "Generowanie...", - "generateLabel": "Generuj {{label}}", - "uploadFileBtn": "Prześlij plik", - "keyPassphraseOptional": "Hasło klucza (opcjonalne)", - "sshPublicKeyOptional": "Klucz publiczny SSH (opcjonalnie)", - "publicKeyGenerated": "Klucz publiczny wygenerowany", - "failedToGeneratePublicKey": "Nie udało się uzyskać klucza publicznego", - "publicKeyCopied": "Klucz publiczny skopiowany", - "keyPairGenerated": "Wygenerowano parę kluczy {{label}}", - "failedToGenerateKeyPair": "Nie udało się wygenerować pary kluczy", - "searchHostsPlaceholder": "Szukaj hostów, adresów, tagów…", - "searchCredentialsPlaceholder": "Szukaj poświadczeń…", - "refreshBtn": "Odśwież", - "addTag": "Dodaj tagi...", - "deleteConfirmBtn": "Usuń", - "tunnelRequirementsText": "Serwer SSH musi mieć GatewayPorts Tak, AllowTcpForwarding Tak i PermitRootLogin ustawione w /etc/ssh/sshd_config.", - "deleteHostConfirm": "Usunąć \"{{name}}\"?", - "enableAtLeastOneProtocol": "Włącz co najmniej jeden protokół powyżej, aby skonfigurować ustawienia uwierzytelniania i połączenia.", - "keyPassphrase": "Hasło klawisza", - "connectBtn": "Połącz", - "disconnectBtn": "Rozłącz", - "basicInformation": "Podstawowe informacje", - "authDetailsSection": "Szczegóły uwierzytelniania", - "credTypeLabel": "Typ", - "hostsTab": "Hosty", - "credentialsTab": "Dane logowania", - "selectMultiple": "Wybierz wiele", - "selectHosts": "Wybierz hosty", - "connectionLabel": "Połączenie", - "authenticationLabel": "Uwierzytelnianie", - "generateKeyPairTitle": "Wygeneruj parę kluczy", - "generateKeyPairDescription": "Wygeneruj nową parę kluczy, klucze prywatne i publiczne będą wypełniane automatycznie.", - "generateFromPrivateKey": "Wygeneruj z klucza prywatnego", - "refreshBtn2": "Odśwież", - "exitSelectionTitle": "Wyjdź z zaznaczenia", - "exportAll": "Eksportuj wszystko", - "addHostBtn2": "Dodaj hosta", - "addCredentialBtn2": "Dodaj poświadczenia", - "checkingHostStatuses": "Sprawdzanie statusów hosta...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Przypięte", - "hostsExported": "Hosty wyeksportowano pomyślnie", + "hostsExported": "Hosts exported successfully", "exportFailed": "Nie udało się wyeksportować hostów", - "sampleDownloaded": "Pobrano przykładowy plik", - "failedToDeleteCredential2": "Nie udało się usunąć danych logowania", - "noFolderOption": "(Brak folderu)", - "nSelected": "Wybrano {{count}}", - "featuresMenu": "Funkcje", - "moveMenu": "Przenieś", - "cancelSelection": "Anuluj", - "deployDialogDesc": "Wdroż {{name}} do autoryzowanych kluczy hosta.", - "targetHostLabel": "Host docelowy", - "selectHostOption": "Wybierz host...", - "keyDeployedSuccess": "Klucz został pomyślnie wdrożony", - "failedToDeployKey2": "Nie udało się wdrożyć klucza", - "deletedCount": "Usunięto hosty {{count}}", - "failedToDeleteCount": "Nie udało się usunąć hostów {{count}}", - "duplicatedHost": "Duplikowane \"{{name}}\"", - "failedToDuplicateHost": "Nie można zduplikować hosta", - "updatedCount": "Zaktualizowano hosty {{count}}", - "friendlyNameLabel": "Nazwa przyjacielska", - "descriptionLabel": "Opis", - "loadingHost": "Ładowanie hosta...", - "loadingHosts": "Ładowanie hostów...", - "loadingCredentials": "Ładowanie poświadczeń...", - "noHostsYet": "Brak hostów", - "noHostsMatchSearch": "Brak hostów pasujących do Twojego wyszukiwania", - "hostNotFound": "Nie znaleziono hosta", - "searchHosts": "Szukaj hostów...", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Cechy", + "moveMenu": "Przenosić", + "connectSelected": "Connect", + "cancelSelection": "Anulować", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Sortuj hosty", "sortDefault": "Domyślna kolejność", "sortNameAsc": "Imię (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunel", "filterFeatureDocker": "Doker", "filterTagsGroup": "Tagi", - "shareHost": "Udostępnij hosta", - "shareHostTitle": "Udostępnianie: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Ten host musi użyć danych logowania, aby włączyć udostępnianie. Edytuj host i najpierw przypisz dane logowania." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Połączenie", - "authentication": "Uwierzytelnianie", - "connectionSettings": "Ustawienia połączenia", - "displaySettings": "Ustawienia wyświetlania", - "audioSettings": "Ustawienia audio", - "rdpPerformance": "Wydajność RDP", - "deviceRedirection": "Przekierowanie urządzenia", - "session": "Sesja", - "gateway": "Brama", - "remoteApp": "Zdalna aplikacja", - "clipboard": "Schowek", - "sessionRecording": "Nagrywanie sesji", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Mandat", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Ustawienia VNC", - "terminalSettings": "Ustawienia terminalu", - "rdpPort": "Port RDP", - "username": "Nazwa użytkownika", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Hasło", - "domain": "Domena", - "securityMode": "Tryb bezpieczeństwa", - "colorDepth": "Głębokość koloru", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Wysokość", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Metoda zmiany rozmiaru", - "clientName": "Nazwa klienta", - "initialProgram": "Program początkowy", - "serverLayout": "Układ serwera", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Port bramy", - "gatewayUsername": "Nazwa użytkownika bramy", - "gatewayPassword": "Hasło bramki", - "gatewayDomain": "Domena bramy", - "remoteAppProgram": "Program zdalnej aplikacji", - "workingDirectory": "Katalog roboczy", - "arguments": "Argumenty", - "normalizeLineEndings": "Normalizuj zakończenie linii", - "recordingPath": "Ścieżka nagrywania", - "recordingName": "Nazwa nagrania", - "macAddress": "Adres MAC", - "broadcastAddress": "Adres nadawania", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Czas oczekiwania (s)", - "driveName": "Nazwa napędu", - "drivePath": "Ścieżka jazdy", - "ignoreCertificate": "Ignoruj certyfikat", - "ignoreCertificateDesc": "Zezwalaj na połączenia z hostami z własnoręcznymi certyfikatami", - "forceLossless": "Wymuś bezstratne", - "forceLosslessDesc": "Wymuś kodowanie obrazów bez strat (wyższa jakość, większa przepustowość)", - "disableAudio": "Wyłącz dźwięk", - "disableAudioDesc": "Wycisz wszystkie dźwięki z sesji zdalnej", - "enableAudioInput": "Włącz wejście audio (mikrofon)", - "enableAudioInputDesc": "Przekieruj lokalny mikrofon do sesji zdalnej", - "wallpaper": "Tapeta", - "wallpaperDesc": "Pokaż tapetę pulpitu (wyłączenie poprawia wydajność)", - "theming": "Motyw", - "themingDesc": "Włącz wizualne motywy i style", - "fontSmoothing": "Wygładzanie czcionki", - "fontSmoothingDesc": "Włącz renderowanie czcionki ClearType", - "fullWindowDrag": "Przeciąganie pełnego okna", - "fullWindowDragDesc": "Pokaż zawartość okna podczas przeciągania", - "desktopComposition": "Kompozycja pulpitu", - "desktopCompositionDesc": "Włącz efekty ze szkła Aero", - "menuAnimations": "Animacje menu", - "menuAnimationsDesc": "Włącz animacje zanikania i slajdu menu", - "disableBitmapCaching": "Wyłącz buforowanie bitmap", - "disableBitmapCachingDesc": "Wyłącz pamięć podręczną mapy (może pomóc z glitchami)", - "disableOffscreenCaching": "Wyłącz buforowanie", - "disableOffscreenCachingDesc": "Wyłącz pamięć podręczną", - "disableGlyphCaching": "Wyłącz buforowanie glifów", - "disableGlyphCachingDesc": "Wyłącz cache glifów", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Użyj potoku Zdalne Grafiki", - "enablePrinting": "Włącz drukowanie", - "enablePrintingDesc": "Przekierowanie lokalnych drukarek na sesję zdalną", - "enableDriveRedirection": "Włącz przekierowanie na dysku", - "enableDriveRedirectionDesc": "Mapuj lokalny folder jako dysk w sesji zdalnej", - "createDrivePath": "Utwórz ścieżkę napędu", - "createDrivePathDesc": "Automatycznie utwórz folder jeśli nie istnieje", - "disableDownload": "Wyłącz pobieranie", - "disableDownloadDesc": "Zapobiegaj pobieraniu plików z sesji zdalnej", - "disableUpload": "Wyłącz wysyłanie", - "disableUploadDesc": "Zapobiegaj przesyłaniu plików na sesję zdalną", - "enableTouch": "Włącz dotyk", - "enableTouchDesc": "Włącz przekazywanie danych dotykowych", - "consoleSession": "Sesja konsoli", - "consoleSessionDesc": "Połącz z konsolą (sesja 0) zamiast z nową sesją", - "sendWolPacket": "Wyślij pakiet WOL", - "sendWolPacketDesc": "Wyślij magiczny pakiet do obudzenia tego hosta przed połączeniem", - "disableCopy": "Wyłącz kopiowanie", - "disableCopyDesc": "Zapobiegaj kopiowaniu tekstu z sesji zdalnej", - "disablePaste": "Wyłącz wklej", - "disablePasteDesc": "Zapobiegaj wklejaniu tekstu do sesji zdalnej", - "createPathIfMissing": "Utwórz ścieżkę jeśli nie ma", - "createPathIfMissingDesc": "Automatycznie utwórz katalog nagrywania", - "excludeOutput": "Wyklucz dane wyjściowe", - "excludeOutputDesc": "Nie nagrywaj wyjścia ekranu (tylko metadane)", - "excludeMouse": "Wyklucz mysz", - "excludeMouseDesc": "Nie rejestruj ruchów myszy", - "includeKeystrokes": "Dołącz przyciski", - "includeKeystrokesDesc": "Nagrywaj przyciski klawiszowe poza wyjściem ekranu", - "vncPort": "Port VNC", - "vncPassword": "Hasło VNC", - "vncUsernameOptional": "Nazwa użytkownika (opcjonalnie)", - "vncLeaveBlank": "Pozostaw puste, jeśli nie jest wymagane", - "cursorMode": "Tryb kursora", - "swapRedBlue": "Zamień Czerwony/Niebieski", - "swapRedBlueDesc": "Zamień kanały czerwonego i niebieskiego koloru (naprawia niektóre problemy z kolorami)", - "readOnly": "Tylko do odczytu", - "readOnlyDesc": "Zobacz zdalny ekran bez wysyłania żadnych danych wejściowych", - "telnetPort": "Port Telnet", - "terminalType": "Typ terminalu", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Schemat kolorów", - "backspaceKey": "Klucz Backspace", - "saveHostFirst": "Najpierw zapisz hosta.", - "sharingOptionsAfterSave": "Opcje udostępniania są dostępne po zapisaniu hosta.", - "sharingLoadError": "Nie udało się załadować danych udostępniania. Sprawdź swoje połączenie i spróbuj ponownie.", - "shareHostSection": "Udostępnij hosta", - "shareWithUser": "Udostępnij użytkownikowi", - "shareWithRole": "Udostępnij z rolą", - "selectUser": "Wybierz użytkownika", - "selectRole": "Wybierz rolę", - "selectUserOption": "Wybierz użytkownika...", - "selectRoleOption": "Wybierz rolę...", - "permissionLevel": "Poziom uprawnień", - "expiresInHours": "Wygasa za (godziny)", - "noExpiryPlaceholder": "Pozostaw puste bez wygaśnięcia", - "shareBtn": "Udostępnij", - "currentAccess": "Bieżący dostęp", - "typeHeader": "Typ", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Uprawnienie", - "grantedByHeader": "Przyznane przez", - "expiresHeader": "Wygasa", - "noAccessEntries": "Brak wpisów dostępu.", - "expiredLabel": "Wygasły", - "neverLabel": "Nigdy", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Anuluj", - "savingBtn": "Zapisywanie...", - "updateHostBtn": "Aktualizacja hosta", - "addHostBtn": "Dodaj hosta" + "cancelBtn": "Anulować", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Szukaj hostów, poleceń lub ustawień...", - "quickActions": "Szybkie akcje", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", "hostManager": "Host Manager", - "hostManagerDesc": "Zarządzaj, dodaj lub edytuj hosty", - "addNewHost": "Dodaj nowego hosta", - "addNewHostDesc": "Zarejestruj nowy host", - "adminSettings": "Ustawienia administratora", - "adminSettingsDesc": "Skonfiguruj ustawienia systemowe i użytkowników", - "userProfile": "Profil użytkownika", - "userProfileDesc": "Zarządzaj kontem i preferencjami", - "addCredential": "Dodaj poświadczenia", - "addCredentialDesc": "Przechowuj klucze SSH lub hasła", - "recentActivity": "Ostatnia aktywność", - "serversAndHosts": "Serwery i hosty", - "noHostsFound": "Nie znaleziono hostów pasujących do \"{{search}}\"", - "links": "Linki", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Wybierz", - "toggleWith": "Przełącz z" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Brak przypisanych kart", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktywny panel" }, "connections": { "noConnections": "Brak połączeń", "noConnectionsDesc": "Otwórz terminal, menedżera plików lub pulpit zdalny, aby zobaczyć połączenia tutaj", - "connectedFor": "Połączono dla {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Połączony", "disconnected": "Bezładny", "closeTab": "Zamknij kartę", @@ -801,358 +981,374 @@ "sectionBackground": "Tło", "backgroundDesc": "Sesje trwają przez 30 minut od momentu rozłączenia, po czym można je ponownie nawiązać.", "persisted": "Trwały w tle", - "expiresIn": "Wygasa za {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Wyszukaj połączenia...", - "noSearchResults": "Brak połączeń odpowiadających Twojemu wyszukiwaniu" + "noSearchResults": "Brak połączeń odpowiadających Twojemu wyszukiwaniu", + "rename": "Rename session" }, "guacamole": { - "connecting": "Łączenie z sesją {{type}}...", - "connectionError": "Błąd połączenia", - "connectionFailed": "Połączenie nie powiodło się", - "failedToConnect": "Nie udało się uzyskać tokenu połączenia", - "hostNotFound": "Nie znaleziono hosta", - "noHostSelected": "Nie wybrano hosta", - "reconnect": "Połącz ponownie", - "retry": "Ponów próbę", - "guacdUnavailable": "Usługa zdalnego pulpitu (guacd) nie jest dostępna. Upewnij się, że guacd jest uruchomiony i dostępny oraz skonfigurowany poprawnie w ustawieniach administratora.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Połączenie nieudane", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Na nowo połączyć", + "retry": "Spróbować ponownie", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Zwycięstwo+L (ekran stopniowy)", - "winKey": "Klucz Windows", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Zmiana", - "win": "Wygraj", - "stickyActive": "{{key}} (zamknięty - kliknij aby wydać)", - "stickyInactive": "{{key}} (kliknij, aby zamknąć)", - "esc": "Ucieczka", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Strona główna", - "end": "Koniec", - "pageUp": "Strona w górę", - "pageDown": "Strona w dół", - "arrowUp": "Strzałka w górę", - "arrowDown": "Strzałka w dół", - "arrowLeft": "Strzałka w lewo", - "arrowRight": "Strzałka w prawo", - "fnToggle": "Klucze funkcji", - "reconnect": "Połącz ponownie sesję", - "collapse": "Zwiń pasek narzędzi", - "expand": "Rozwiń pasek narzędzi", - "dragHandle": "Przeciągnij, aby zmienić położenie" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Połącz z hostem", - "clear": "Wyczyść", - "paste": "Wklej", - "reconnect": "Połącz ponownie", - "connectionLost": "Utracono połączenie", - "connected": "Połączono", - "clipboardWriteFailed": "Nie udało się skopiować do schowka. Upewnij się, że strona jest obsługiwana przez HTTPS lub localhost.", - "clipboardReadFailed": "Nie udało się odczytać ze schowka. Upewnij się, że uprawnienia do schowka są przyznane.", - "clipboardHttpWarning": "Wklej wymaga HTTPS. Użyj Ctrl+Shift+V lub podaj Termix przez HTTPS.", - "unknownError": "Wystąpił nieznany błąd", - "websocketError": "Błąd połączenia WebSocket", - "connecting": "Łączenie...", - "noHostSelected": "Nie wybrano hosta", - "reconnecting": "Ponowne łączenie... ({{attempt}}/{{max}})", - "reconnected": "Ponowne połączenie zakończone pomyślnie", - "tmuxSessionCreated": "Sesja tmux utworzona: {{name}}", - "tmuxSessionAttached": "Dołączono sesję tmuxa: {{name}}", - "tmuxUnavailable": "tmux nie jest zainstalowany na zdalnym serwerze, powrót do standardowej powłoki", - "tmuxSessionPickerTitle": "Sesje tmux", - "tmuxSessionPickerDesc": "Znaleziono istniejące sesje tmux na tym serwerze. Wybierz jedną, aby ponowić lub utworzyć nową sesję.", - "tmuxWindows": "Okna", - "tmuxWindowCount": "Okno {{count}}", - "tmuxAttached": "Dołączone klienci", - "tmuxAttachedCount": "{{count}} dołączony", - "tmuxLastActivity": "Ostatnia aktywność", - "tmuxTimeJustNow": "właśnie teraz", - "tmuxTimeMinutes": "{{count}}m temu", - "tmuxTimeHours": "{{count}}h temu", - "tmuxTimeDays": "{{count}}dni temu", - "tmuxCreateNew": "Rozpocznij nową sesję", - "tmuxCopyHint": "Dostosuj zaznaczenie i naciśnij Enter, aby skopiować do schowka", - "tmuxDetach": "Odłącz od sesji tmux", - "tmuxDetached": "Odłączone od sesji tmux", - "maxReconnectAttemptsReached": "Osiągnięto maksymalną liczbę prób ponownego połączenia", - "closeTab": "Zamknij", - "connectionTimeout": "Limit czasu połączenia", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Na nowo połączyć", + "connectionLost": "Connection lost", + "connected": "Połączony", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Uruchamianie {{command}} - {{host}}", - "totpRequired": "Wymagane uwierzytelnianie dwuetapowe", - "totpCodeLabel": "Kod weryfikacyjny", - "totpVerify": "Weryfikacja", - "warpgateAuthRequired": "Wymagane uwierzytelnienie Warpgate", - "warpgateSecurityKey": "Klucz bezpieczeństwa", - "warpgateAuthUrl": "Adres URL uwierzytelniania", - "warpgateOpenBrowser": "Otwórz w przeglądarce", - "warpgateContinue": "Zakończyłem uwierzytelnianie", - "opksshAuthRequired": "Wymagane uwierzytelnienie OPKSSH", - "opksshAuthDescription": "Zakończ uwierzytelnianie w przeglądarce, aby kontynuować. Ta sesja pozostanie ważna przez 24 godziny.", - "opksshOpenBrowser": "Otwórz przeglądarkę do uwierzytelniania", - "opksshWaitingForAuth": "Oczekiwanie na uwierzytelnianie w przeglądarce...", - "opksshAuthenticating": "Przetwarzanie uwierzytelniania...", - "opksshTimeout": "Upłynął limit czasu uwierzytelniania. Spróbuj ponownie.", - "opksshAuthFailed": "Uwierzytelnianie nie powiodło się. Sprawdź swoje poświadczenia i spróbuj ponownie.", - "opksshSignInWith": "Zaloguj się za pomocą {{provider}}", - "sudoPasswordPopupTitle": "Wprowadzić hasło?", - "websocketAbnormalClose": "Połączenie nieoczekiwanie zamknięte. Może to być spowodowane problemem odwrotnego serwera proxy lub konfiguracji SSL. Sprawdź logi serwera.", - "connectionLogTitle": "Dziennik połączeń", - "connectionLogCopy": "Kopiuj logi do schowka", - "connectionLogEmpty": "Brak dzienników połączeń", - "connectionLogWaiting": "Oczekiwanie na logi połączeń...", - "connectionLogCopied": "Dzienniki połączeń skopiowane do schowka", - "connectionLogCopyFailed": "Nie udało się skopiować logów do schowka", - "connectionRejected": "Połączenie odrzucone przez serwer. Sprawdź swoje uwierzytelnianie i konfigurację sieci.", - "hostKeyRejected": "Weryfikacja klucza hosta SSH odrzucona. Połączenie anulowane.", - "sessionTakenOver": "Sesja została otwarta w innej karcie. Ponowne łączenie..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Otwarte", + "linkDialogCopy": "Kopia", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Podziel kartę", + "addToSplit": "Dodaj do podziału", + "removeFromSplit": "Usuń z podziału" + } }, "fileManager": { - "noHostSelected": "Nie wybrano hosta", - "initializingEditor": "Inicjowanie edytora...", - "file": "Plik", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", "folder": "Folder", - "uploadFile": "Prześlij plik", - "downloadFile": "Pobierz", - "extractArchive": "Wyodrębnij archiwum", - "extractingArchive": "Rozpakowywanie {{name}}...", - "archiveExtractedSuccessfully": "{{name}} wypakowano pomyślnie", - "extractFailed": "Wypakowywanie nie powiodło się", - "compressFile": "Kompresuj plik", - "compressFiles": "Kompresuj pliki", - "compressFilesDesc": "Kompresuj elementy {{count}} do archiwum", - "archiveName": "Nazwa archiwum", - "enterArchiveName": "Wprowadź nazwę archiwum...", - "compressionFormat": "Format kompresji", - "selectedFiles": "Wybrane pliki", - "andMoreFiles": "i {{count}} więcej...", - "compress": "Kompresuj", - "compressingFiles": "Kompresja {{count}} przedmiotów do {{name}}...", - "filesCompressedSuccessfully": "{{name}} został pomyślnie utworzony", - "compressFailed": "Kompresja nie powiodła się", - "edit": "Edytuj", - "preview": "Podgląd", - "previous": "Poprzedni", - "next": "Następny", - "pageXOfY": "Strona {{current}} z {{total}}", - "zoomOut": "Pomniejsz", - "zoomIn": "Powiększ", - "newFile": "Nowy plik", - "newFolder": "Nowy folder", - "rename": "Zmień nazwę", - "uploading": "Wgrywanie...", - "uploadingFile": "Przesyłanie {{name}}...", - "fileName": "Nazwa pliku", - "folderName": "Nazwa folderu", - "fileUploadedSuccessfully": "Plik \"{{name}}\" został pomyślnie przesłany", - "failedToUploadFile": "Nie udało się przesłać pliku", - "fileDownloadedSuccessfully": "Plik \"{{name}}\" pobrano pomyślnie", - "failedToDownloadFile": "Nie udało się pobrać pliku", - "fileCreatedSuccessfully": "Plik \"{{name}}\" został utworzony pomyślnie", - "folderCreatedSuccessfully": "Folder \"{{name}}\" utworzony pomyślnie", - "failedToCreateItem": "Nie udało się utworzyć elementu", - "operationFailed": "Operacja {{operation}} nie powiodła się dla {{name}}: {{error}}", - "failedToResolveSymlink": "Nie udało się rozwiązać dowiązania symbolicznego", - "itemsDeletedSuccessfully": "{{count}} elementów pomyślnie usunięto", - "failedToDeleteItems": "Nie udało się usunąć elementów", - "sudoPasswordRequired": "Wymagane hasło administratora", - "enterSudoPassword": "Wprowadź hasło sudo aby kontynuować tę operację", - "sudoPassword": "Hasło Sudo", - "sudoOperationFailed": "Operacja Sudo nie powiodła się", - "sudoAuthFailed": "Uwierzytelnianie Sudo nie powiodło się", - "dragFilesToUpload": "Upuść pliki tutaj, aby przesłać", - "emptyFolder": "Ten folder jest pusty", - "searchFiles": "Szukaj plików...", - "upload": "Prześlij", - "selectHostToStart": "Wybierz hosta do rozpoczęcia zarządzania plikami", - "sshRequiredForFileManager": "Menedżer plików wymaga SSH. Ten host nie ma włączonego SSH.", - "failedToConnect": "Nie udało się połączyć z SSH", - "failedToLoadDirectory": "Nie udało się załadować katalogu", - "noSSHConnection": "Brak dostępnego połączenia SSH", - "copy": "Kopiuj", - "cut": "Wytnij", - "paste": "Wklej", - "copyPath": "Kopiuj ścieżkę", - "copyPaths": "Kopiuj ścieżki", - "delete": "Usuń", - "properties": "Właściwości", - "refresh": "Odśwież", - "downloadFiles": "Pobierz pliki {{count}} do przeglądarki", - "copyFiles": "Kopiuj elementy {{count}}", - "cutFiles": "Wytnij elementy {{count}}", - "deleteFiles": "Usuń elementy {{count}}", - "filesCopiedToClipboard": "{{count}} elementy skopiowane do schowka", - "filesCutToClipboard": "{{count}} elementy przycięte do schowka", - "pathCopiedToClipboard": "Ścieżka skopiowana do schowka", - "pathsCopiedToClipboard": "Ścieżki {{count}} skopiowane do schowka", - "failedToCopyPath": "Nie udało się skopiować ścieżki do schowka", - "movedItems": "Przeniesiono {{count}} przedmiotów", - "failedToDeleteItem": "Nie udało się usunąć elementu", - "itemRenamedSuccessfully": "Zmieniono nazwę {{type}}", - "failedToRenameItem": "Nie udało się zmienić nazwy elementu", - "download": "Pobierz", - "permissions": "Uprawnienia", - "size": "Rozmiar", - "modified": "Zmodyfikowane", - "path": "Ścieżka", - "confirmDelete": "Czy na pewno chcesz usunąć {{name}}?", - "permissionDenied": "Odmowa dostępu", - "serverError": "Błąd serwera", - "fileSavedSuccessfully": "Plik zapisany pomyślnie", - "failedToSaveFile": "Nie udało się zapisać pliku", - "confirmDeleteSingleItem": "Czy na pewno chcesz trwale usunąć \"{{name}}\"?", - "confirmDeleteMultipleItems": "Czy na pewno chcesz trwale usunąć {{count}} elementów?", - "confirmDeleteMultipleItemsWithFolders": "Czy na pewno chcesz trwale usunąć elementy {{count}} ? Obejmuje to foldery i ich zawartość.", - "confirmDeleteFolder": "Czy na pewno chcesz trwale usunąć folder \"{{name}}\" i całą jego zawartość?", - "permanentDeleteWarning": "Tej akcji nie można cofnąć. Element(y) zostaną trwale usunięte z serwera.", - "recent": "Najnowsze", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Kopia", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Przypięte", - "folderShortcuts": "Skróty folderu", - "failedToReconnectSSH": "Nie udało się ponownie połączyć sesji SSH", - "openTerminalHere": "Otwórz terminal tutaj", - "run": "Uruchom", - "openTerminalInFolder": "Otwórz Terminal w tym folderze", - "openTerminalInFileLocation": "Otwórz terminal w lokalizacji pliku", - "runningFile": "Uruchamianie - {{file}}", - "onlyRunExecutableFiles": "Można uruchamiać tylko pliki wykonywalne", - "directories": "Katalogi", - "removedFromRecentFiles": "Usunięto \"{{name}}\" z ostatnich plików", - "removeFailed": "Usunięcie nie powiodło się", - "unpinnedSuccessfully": "Odpięto \"{{name}}\" zakończone powodzeniem", - "unpinFailed": "Nie udało się odpiąć", - "removedShortcut": "Usunięto skrót \"{{name}}\"", - "removeShortcutFailed": "Usunięcie skrótu nie powiodło się", - "clearedAllRecentFiles": "Wyczyszczono wszystkie ostatnie pliki", - "clearFailed": "Wyczyszczenie nie powiodło się", - "removeFromRecentFiles": "Usuń z ostatnich plików", - "clearAllRecentFiles": "Wyczyść wszystkie ostatnie pliki", - "unpinFile": "Odepnij plik", - "removeShortcut": "Usuń skrót", - "pinFile": "Przypnij plik", - "addToShortcuts": "Dodaj do skrótów", - "pasteFailed": "Wklej nie powiodło się", - "noUndoableActions": "Brak niedopuszczalnych działań", - "undoCopySuccess": "Operacja niewykonana: Skopiowano pliki {{count}}", - "undoCopyFailedDelete": "Cofnięcie nie powiodło się: Nie można usunąć żadnych skopiowanych plików", - "undoCopyFailedNoInfo": "Cofnięcie nie powiodło się: Nie można odnaleźć skopiowanych informacji o pliku", - "undoMoveSuccess": "Cofnij przeniesienie operacji: Przeniesiono pliki {{count}} z powrotem do oryginalnej lokalizacji", - "undoMoveFailedMove": "Cofnięcie nie powiodło się: Nie można przenieść żadnych plików z powrotem", - "undoMoveFailedNoInfo": "Cofnięcie nie powiodło się: Nie można odnaleźć przeniesionego pliku", - "undoDeleteNotSupported": "Nie można cofnąć operacji: Pliki zostały trwale usunięte z serwera", - "undoTypeNotSupported": "Nieobsługiwany typ operacji cofania", - "undoOperationFailed": "Cofnięcie operacji nie powiodło się", - "unknownError": "Nieznany błąd", - "confirm": "Potwierdź", - "find": "Znajdź...", - "replace": "Zamień", - "downloadInstead": "Pobierz zamiast", - "keyboardShortcuts": "Skróty klawiaturowe", - "searchAndReplace": "Wyszukaj i zamień", - "editing": "Edycja", - "search": "Szukaj", - "findNext": "Znajdź następny", - "findPrevious": "Znajdź Poprzedni", - "save": "Zapisz", - "selectAll": "Zaznacz wszystko", - "undo": "Cofnij", - "redo": "Ponów", - "moveLineUp": "Przesuń linię w górę", - "moveLineDown": "Przesuń linię w dół", - "toggleComment": "Przełącz komentarz", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Uruchomić", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Nie udało się załadować obrazu", - "startTyping": "Zacznij pisać...", - "unknownSize": "Nieznany rozmiar", - "fileIsEmpty": "Plik jest pusty", - "largeFileWarning": "Ostrzeżenie o dużym pliku", - "largeFileWarningDesc": "Ten plik ma rozmiar {{size}} , co może powodować problemy z wydajnością po otwarciu jako tekst.", - "fileNotFoundAndRemoved": "Plik \"{{name}}\" nie został znaleziony i został usunięty z ostatnich / przypiętych plików", - "failedToLoadFile": "Nie udało się załadować pliku: {{error}}", - "serverErrorOccurred": "Wystąpił błąd serwera. Spróbuj ponownie później.", - "autoSaveFailed": "Automatyczne zapisywanie nie powiodło się", - "fileAutoSaved": "Automatycznie zapisano plik", - "moveFileFailed": "Nie udało się przenieść {{name}}", - "moveOperationFailed": "Przenoszenie nie powiodło się", - "canOnlyCompareFiles": "Można porównać tylko dwa pliki", - "comparingFiles": "Porównywanie plików: {{file1}} i {{file2}}", - "dragFailed": "Przeciągnięcie nie powiodło się", - "filePinnedSuccessfully": "Plik \"{{name}}\" przypięty pomyślnie", - "pinFileFailed": "Nie udało się przypiąć pliku", - "fileUnpinnedSuccessfully": "Plik \"{{name}}\" odpięty pomyślnie", - "unpinFileFailed": "Nie udało się odpiąć pliku", - "shortcutAddedSuccessfully": "Skrót folderu \"{{name}}\" został pomyślnie dodany", - "addShortcutFailed": "Nie udało się dodać skrótu", - "operationCompletedSuccessfully": "Pomyślnie {{operation}} {{count}}", - "operationCompleted": "{{operation}} {{count}} przedmiotów", - "downloadFileSuccess": "Plik {{name}} pomyślnie pobrany", - "downloadFileFailed": "Pobieranie nie powiodło się", - "moveTo": "Przenieś do {{name}}", - "diffCompareWith": "Różnica z {{name}}", - "dragOutsideToDownload": "Przeciągnij na zewnątrz okna, aby pobrać (pliki{{count}})", - "newFolderDefault": "Nowy Folder", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Pomyślnie przeniesiono elementy {{count}} do {{target}}", - "move": "Przenieś", - "searchInFile": "Szukaj w pliku (Ctrl+F)", - "showKeyboardShortcuts": "Pokaż skróty klawiaturowe", - "startWritingMarkdown": "Zacznij pisać swoją zawartość markdown...", - "loadingFileComparison": "Ładowanie porównania plików...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Przenosić", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Porównaj", - "sideBySide": "Obok strony", - "inline": "Wbudowany", - "fileComparison": "Porównanie plików: {{file1}} vs {{file2}}", - "fileTooLarge": "Plik za duży: {{error}}", - "sshConnectionFailed": "Połączenie SSH nie powiodło się. Sprawdź swoje połączenie z {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Nie udało się załadować pliku: {{error}}", - "connecting": "Łączenie...", - "connectedSuccessfully": "Połączono pomyślnie", - "totpVerificationFailed": "Weryfikacja TOTP nie powiodła się", - "warpgateVerificationFailed": "Autoryzacja Warpgate nie powiodła się", - "authenticationFailed": "Uwierzytelnianie nie powiodło się", - "verificationCodePrompt": "Kod weryfikacyjny:", - "changePermissions": "Zmień uprawnienia", - "currentPermissions": "Bieżące uprawnienia", - "owner": "Właściciel", - "group": "Grupa", - "others": "Pozostałe", - "read": "Czytaj", - "write": "Napisz", - "execute": "Wykonaj", - "permissionsChangedSuccessfully": "Uprawnienia zmienione pomyślnie", - "failedToChangePermissions": "Nie udało się zmienić uprawnień", - "name": "Nazwisko", - "sortByName": "Nazwisko", - "sortByDate": "Data modyfikacji", - "sortBySize": "Rozmiar", - "ascending": "Rosnąco", - "descending": "Malejąco", - "root": "Główny", - "new": "Nowy", - "sortBy": "Sortuj wg", - "items": "Przedmioty", - "selected": "Wybrane", - "editor": "Edytor", - "octal": "Otoczka", - "storage": "Pamięć", - "disk": "Dysk", - "used": "Używane", - "of": "z", - "toggleSidebar": "Przełącz pasek boczny", - "cannotLoadPdf": "Nie można załadować PDF", - "pdfLoadError": "Wystąpił błąd podczas ładowania tego pliku PDF.", - "loadingPdf": "Ładowanie PDF...", - "loadingPage": "Ładowanie strony..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopiuj do hosta…", - "moveToHost": "Przenieś do hosta…", - "copyItemsToHost": "Skopiuj {{count}} elementów do hosta…", - "moveItemsToHost": "Przenieś {{count}} elementów do hosta…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Brak innych dostępnych hostów menedżerów plików.", "noHostsConnectedHint": "Dodaj kolejny host SSH z włączonym Menedżerem plików w Menedżerze hosta.", "selectDestinationHost": "Wybierz hosta docelowego", @@ -1164,48 +1360,48 @@ "browseDestination": "Przeglądaj lub wprowadź ścieżkę", "confirmCopy": "Kopia", "confirmMove": "Przenosić", - "transferring": "Przenoszenie…", - "compressing": "Kompresja…", - "extracting": "Wyodrębnianie…", - "transferringItems": "Przenoszenie {{current}} z {{total}} elementów…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transfer zakończony", "transferError": "Transfer nie powiódł się", - "transferPartial": "Transfer zakończony z błędami {{count}}", - "transferPartialHint": "Nie można przesłać: {{paths}}", - "itemsSummary": "{{count}} elementów", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Miejsce docelowe musi być katalogiem w przypadku transferów obejmujących wiele pozycji", "selectThisFolder": "Wybierz ten folder", "browsePathWillBeCreated": "Ten folder jeszcze nie istnieje. Zostanie utworzony po rozpoczęciu transferu.", "browsePathError": "Nie można otworzyć tej ścieżki na hoście docelowym.", "goUp": "Wchodzić", - "copyFolderToHost": "Kopiuj folder do hosta…", - "moveFolderToHost": "Przenieś folder do hosta…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Gotowy", - "hostConnecting": "Łączenie…", + "hostConnecting": "Connecting…", "hostDisconnected": "Nie połączony", "hostAuthRequired": "Wymagane uwierzytelnienie — najpierw otwórz Menedżera plików na tym hoście", "hostConnectionFailed": "Połączenie nieudane", "metricsTitle": "Czasy transferu", - "metricsPrepare": "Przygotuj miejsce docelowe: {{duration}}", - "metricsCompress": "Kompresja w źródle: {{duration}}", - "metricsHopSourceRead": "Źródło → serwer: {{throughput}}", - "metricsHopDestSftpWrite": "Serwer → cel (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Serwer → dest (lokalny): {{throughput}}", - "metricsTransfer": "Od końca do końca: {{throughput}} ({{duration}})", - "metricsExtract": "Wyciąg w miejscu docelowym: {{duration}}", - "metricsSourceDelete": "Usuń ze źródła: {{duration}}", - "metricsTotal": "Razem: {{duration}}", - "progressCompressing": "Kompresja na hoście źródłowym…", - "progressExtracting": "Wyodrębnianie w miejscu docelowym…", - "progressTransferring": "Przesyłanie danych…", - "progressReconnecting": "Ponowne łączenie…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Równoległe pasy transferowe", - "parallelSegmentsOption": "{{count}} pasów", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Duże pliki są dzielone na fragmenty o rozmiarze 256 MB. Wiele pasm korzysta z oddzielnych połączeń (np. uruchamiając kilka transferów), co zapewnia większą całkowitą przepustowość.", - "progressTotalSpeed": "{{speed}} łącznie ({{lanes}} pasów)", - "progressTransferringItems": "Przesyłanie plików ({{current}} z {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "Pliki {{current}} / {{total}}", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Zachowano pliki źródłowe (częściowy transfer)", "jumpHostLimitation": "Oba hosty muszą być dostępne z serwera Termix. Bezpośrednie routing między hostami nie jest obsługiwany.", "cancel": "Anulować", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Wybiera protokół tar lub protokół SFTP dla poszczególnych plików na podstawie liczby plików, ich rozmiaru i możliwości kompresji. Pojedyncze pliki zawsze korzystają ze strumieniowego protokołu SFTP.", "methodTarHint": "Kompresja w źródle, transfer jednego archiwum, rozpakowanie w miejscu docelowym. Wymagany jest tar na obu hostach Unix.", "methodItemSftpHint": "Przesyłaj każdy plik osobno przez SFTP. Działa na wszystkich hostach, w tym Windows.", - "methodPreviewLoading": "Obliczanie metody transferu…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Nie można wyświetlić podglądu metody transferu. Serwer i tak wybierze metodę po uruchomieniu.", "methodPreviewWillUseTar": "Użyje: archiwum Tar", "methodPreviewWillUseItemSftp": "Będzie używać: SFTP dla każdego pliku", - "methodPreviewScanSummary": "{{fileCount}} plików, łącznie {{totalSize}} (przeskanowano na hoście źródłowym).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Każdy plik korzysta z tego samego strumienia SFTP jako pojedyncza kopia pliku, jeden po drugim. Postęp jest łączony we wszystkich plikach, więc pasek przesuwa się powoli w przypadku dużych plików.", "methodReason": { "user_item_sftp": "Wybrano SFTP dla poszczególnych plików.", "user_tar": "Wybrano archiwum tar.", "tar_unavailable": "Tar nie jest dostępny na jednym lub obu hostach — zamiast tego używany będzie protokół SFTP dla każdego pliku.", "windows_host": "Wymagany jest host Windows — nie używa się pliku tar.", - "auto_multi_large": "Auto: wiele plików, w tym duży plik ({{largestSize}}) z kompresowalnymi danymi — pakiety tar w jednym transferze.", - "auto_single_large_in_archive": "Auto: jeden duży plik ({{largestSize}}) w tym zestawie — SFTP dla każdego pliku.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto: dane w większości niekompresowalne — SFTP dla każdego pliku.", - "auto_many_files": "Auto: wiele plików ({{fileCount}}) — tar zmniejsza obciążenie pojedynczego pliku.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Auto: SFTP dla każdego pliku dla tego zestawu." }, "progressCancel": "Anulować", - "progressCancelling": "Anulowanie…", + "progressCancelling": "Cancelling…", "progressStalled": "Zatrzymany", "resumedHint": "Połączono ponownie z aktywnym transferem rozpoczętym w innym oknie.", "transferCancelled": "Transfer anulowany", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "W miejscu docelowym zachowano częściowe dane. Ponowna próba zostanie wznowiona po przywróceniu połączenia." }, "tunnels": { - "noSshTunnels": "Brak tuneli SSH", - "createFirstTunnelMessage": "Nie utworzyłeś jeszcze żadnych tuneli SSH. Skonfiguruj połączenia tuneli w Host Manager, aby rozpocząć.", - "connected": "Połączono", - "disconnected": "Rozłączony", - "connecting": "Łączenie...", - "error": "Błąd", - "canceling": "Anulowanie...", - "connect": "Połącz", - "disconnect": "Rozłącz", - "cancel": "Anuluj", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Połączony", + "disconnected": "Bezładny", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Anulować", "port": "Port", - "localPort": "Port lokalny", - "remotePort": "Port zdalny", - "currentHostPort": "Bieżący port hosta", - "endpointPort": "Port punktu końcowego", - "bindIp": "Lokalny adres IP", - "endpointSshConfig": "Konfiguracja SSH punktu końcowego", - "endpointSshHost": "Host SSH punktu końcowego", - "endpointSshHostPlaceholder": "Wybierz skonfigurowany host", - "endpointSshHostRequired": "Wybierz host SSH punktu końcowego dla każdego tunelu klienta.", - "attempt": "Próba {{current}} dla {{max}}", - "nextRetryIn": "Następna próba za {{seconds}} sekund", - "clientTunnels": "Tunele klienta", - "clientTunnel": "Tunel klienta", - "addClientTunnel": "Dodaj Tunel Klienta", - "noClientTunnels": "Nie skonfigurowano tuneli klienckich na tym komputerze.", - "tunnelName": "Nazwa tunelu", - "remoteHost": "Zdalny host", - "autoStart": "Automatyczne uruchamianie", - "clientAutoStartDesc": "Rozpoczyna się, gdy ten klient na pulpicie otworzy się i zostanie połączony.", - "clientManualStartDesc": "Użyj startu i zatrzymania z tego wiersza. Termiks nie otworzy się automatycznie.", - "clientRemoteServerNote": "Przekazywanie zdalne może wymagać AllowTcpForwarding i GatewayPorts na serwerze SSH punktu końcowego. Zdalny port zamyka się po rozłączeniu tego pulpitu.", - "clientTunnelStarted": "Tunel klienta rozpoczęty", - "clientTunnelStopped": "Tunel klienta zatrzymany", - "tunnelTestSucceeded": "Test tunelu zakończony sukcesem", - "tunnelTestFailed": "Test tunelu nie powiódł się", - "localSaved": "Tunele klienta zapisane", - "localSaveError": "Nie udało się zapisać lokalnych tuneli klienta", - "invalidBindIp": "Lokalny adres IP musi być prawidłowym adresem IPv4.", - "invalidLocalTargetIp": "Lokalny docelowy adres IP musi być prawidłowym adresem IPv4.", - "invalidLocalPort": "Port lokalny musi mieć od 1 do 65535.", - "invalidRemotePort": "Zdalny port musi być pomiędzy 1 a 65535.", - "invalidLocalTargetPort": "Lokalny port docelowy musi znajdować się w przedziale od 1 do 65535.", - "invalidEndpointPort": "Port punktu końcowego musi być pomiędzy 1 a 65535.", - "duplicateAutoStartBind": "Tylko jeden tunel klienta automatycznego startu może użyć {{bind}}.", - "manualControlError": "Nie udało się zaktualizować stanu tunelu.", - "active": "Aktywne", - "start": "Rozpocznij", - "stop": "Zatrzymaj", - "test": "Badanie", - "type": "Typ tunelu", - "typeLocal": "Lokalna (-L)", - "typeRemote": "Zdalny (-R)", - "typeDynamic": "Dynamiczne (-D)", - "typeServerLocalDesc": "Bieżący host do punktu końcowego.", - "typeServerRemoteDesc": "Końcowy punkt wstecz do bieżącego hosta.", - "typeClientLocalDesc": "Lokalny komputer do punktu końcowego.", - "typeClientRemoteDesc": "Punkt końcowy z powrotem do komputera lokalnego.", - "typeClientDynamicDesc": "SOCKS na komputerze lokalnym.", - "typeDynamicDesc": "Przekaż ruch SOCKS5 CONNECT przez SSH", - "forwardDescriptionServerLocal": "Bieżący host {{sourcePort}} → punkt końcowy {{endpointPort}}.", - "forwardDescriptionServerRemote": "Punkt końcowy {{endpointPort}} → bieżący host {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS dla bieżącego hosta {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokalny {{sourcePort}} → zdalny {{endpointPort}}.", - "forwardDescriptionClientRemote": "Zdalny {{sourcePort}} → lokalny {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS na lokalnym porcie {{sourcePort}}.", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS przez {{endpoint}}", - "autoNameClientLocal": "Lokalny {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokalny {{localPort}}", - "autoNameClientDynamic": "SOCKS {{localPort}} przez {{endpoint}}", - "route": "Droga:", - "lastStarted": "Ostatnio uruchomione", - "lastTested": "Ostatnio testowane", - "lastError": "Ostatni błąd", - "maxRetries": "Maksymalna liczba prób", - "maxRetriesDescription": "Maksymalna ilość powtórzeń próby.", - "retryInterval": "Powtórz interwał (w sekundach)", - "retryIntervalDescription": "Czas oczekiwania pomiędzy ponownymi próbami.", - "local": "Lokalny", - "remote": "Zdalny", - "destination": "Miejsce przeznaczenia", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", "host": "Host", - "mode": "Tryb", - "noHostSelected": "Nie wybrano hosta", - "working": "Pracuję..." + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "Procesor", - "memory": "Pamięć", - "disk": "Dysk", - "network": "Sieć", - "uptime": "Czas pracy", - "processes": "Procesy", - "available": "Dostępny", - "free": "Darmowe", - "connecting": "Łączenie...", - "connectionFailed": "Nie udało się połączyć z serwerem", - "naCpus": "Brak CPU(ów)", - "cpuCores_one": "Rdzeń {{count}}", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Użycie procesora", - "memoryUsage": "Użycie pamięci", - "diskUsage": "Użycie dysku", - "failedToFetchHostConfig": "Nie udało się pobrać konfiguracji hosta", - "serverOffline": "Serwer offline", - "cannotFetchMetrics": "Nie można pobrać metryki z serwera offline", - "totpFailed": "Weryfikacja TOTP nie powiodła się", - "noneAuthNotSupported": "Statystyki serwera nie obsługują typu \"brak\" uwierzytelniania.", - "load": "Załaduj", - "systemInfo": "Informacje o systemie", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "System operacyjny", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "sekundy", - "networkInterfaces": "Interfejsy sieciowe", - "noInterfacesFound": "Nie znaleziono interfejsów sieciowych", - "noProcessesFound": "Nie znaleziono procesów", - "loginStats": "Statystyki logowania SSH", - "noRecentLoginData": "Brak danych logowania", - "executingQuickAction": "Wykonywanie {{name}}...", - "quickActionSuccess": "Ukończono {{name}}", - "quickActionFailed": "{{name}} nie powiódł się", - "quickActionError": "Nie udało się wykonać {{name}}", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Porty słuchające", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protokół", "port": "Port", - "address": "Adres", - "process": "Proces", - "noData": "Brak danych o portach" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Zapora", - "inactive": "Nieaktywny", - "policy": "Polityka", - "rules": "zasady", - "noData": "Brak dostępnych danych zapory", - "action": "Akcja", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Źródło", - "anywhere": "Gdziekolwiek" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Załaduj średnią", - "swap": "Zamień", - "architecture": "Architektura", - "refresh": "Odśwież", - "retry": "Ponów próbę" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Spróbować ponownie", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Uruchomić", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Samodzielnie hostowany SSH i zdalne zarządzanie pulpitem", - "loginTitle": "Zaloguj się do Termix", - "registerTitle": "Utwórz konto", - "forgotPassword": "Zapomniałeś hasła?", - "rememberMe": "Zapamiętaj urządzenie przez 30 dni (w tym TOTP)", - "noAccount": "Nie masz konta?", - "hasAccount": "Masz już konto?", - "twoFactorAuth": "Uwierzytelnianie dwuetapowe", - "enterCode": "Wprowadź kod weryfikacyjny", - "backupCode": "Lub użyj kodu zapasowego", - "verifyCode": "Potwierdź kod", - "redirectingToApp": "Przekierowanie do aplikacji...", - "sshAuthenticationRequired": "Wymagane uwierzytelnienie SSH", - "sshNoKeyboardInteractive": "Interaktywne uwierzytelnianie klawiatury niedostępne", - "sshAuthenticationFailed": "Uwierzytelnianie nie powiodło się", - "sshAuthenticationTimeout": "Limit czasu uwierzytelniania", - "sshNoKeyboardInteractiveDescription": "Serwer nie obsługuje interaktywnego uwierzytelniania klawiatury. Proszę podać swoje hasło lub klucz SSH.", - "sshAuthFailedDescription": "Podane dane logowania są nieprawidłowe. Spróbuj ponownie z prawidłowymi danymi logowania.", - "sshTimeoutDescription": "Próba uwierzytelniania przekroczyła limit czasu. Spróbuj ponownie.", - "sshProvideCredentialsDescription": "Podaj swoje poświadczenia SSH aby połączyć się z tym serwerem.", - "sshPasswordDescription": "Wprowadź hasło dla tego połączenia SSH.", - "sshKeyPasswordDescription": "Jeśli twój klucz SSH jest zaszyfrowany, wprowadź hasło tutaj.", - "passphraseRequired": "Wymagane hasło", - "passphraseRequiredDescription": "Klucz SSH jest zaszyfrowany. Wprowadź hasło, aby go odblokować.", - "back": "Powrót", - "firstUser": "Pierwszy użytkownik", - "firstUserMessage": "Jesteś pierwszym użytkownikiem i zostaniesz administratorem. Możesz przeglądać ustawienia administratora na liście rozwijanej przez użytkownika paska bocznego. Jeśli uważasz, że to błąd, sprawdź logi dockera lub utwórz problem z GitHub.", - "external": "Zewnętrzne", - "loginWithExternal": "Zaloguj się z zewnętrznym dostawcą", - "loginWithExternalDesc": "Zaloguj się przy użyciu skonfigurowanego dostawcy zewnętrznej tożsamości", - "externalNotSupportedInElectron": "Uwierzytelnianie zewnętrzne nie jest jeszcze obsługiwane w aplikacji Electron. Użyj wersji internetowej dla logowania OIDC.", - "resetPasswordButton": "Resetuj hasło", - "sendResetCode": "Wyślij kod resetowania", - "resetCodeDesc": "Wprowadź swoją nazwę użytkownika, aby otrzymać kod resetowania hasła. Kod zostanie zalogowany w dziennikach kontenera.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Potwierdź kod", - "enterResetCode": "Wprowadź 6-cyfrowy kod z dziennika kontenera docker dla użytkownika:", - "newPassword": "Nowe hasło", - "confirmNewPassword": "Potwierdź hasło", - "enterNewPassword": "Wprowadź nowe hasło dla użytkownika:", - "signUp": "Zarejestruj", - "desktopApp": "Aplikacja pulpitowa", - "loggingInToDesktopApp": "Logowanie do aplikacji desktopowej", - "loadingServer": "Ładowanie serwera...", - "dataLossWarning": "Resetowanie hasła w ten sposób usunie wszystkie zapisane przez Ciebie hosty, dane logowania i inne zaszyfrowane dane. Tej akcji nie można cofnąć. Użyj tego tylko wtedy, gdy zapomniałeś hasła i nie jesteś zalogowany.", - "authenticationDisabled": "Uwierzytelnianie wyłączone", - "authenticationDisabledDesc": "Wszystkie metody uwierzytelniania są obecnie wyłączone. Skontaktuj się z administratorem.", - "attemptsRemaining": "Pozostało {{count}} prób" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Zweryfikuj klucz hosta SSH", - "keyChangedWarning": "Klucz hosta SSH został zmieniony", - "firstConnectionTitle": "Pierwsze połączenie z tym hostem", - "firstConnectionDescription": "Nie można ustalić autentyczności tego hosta. Sprawdź, czy odcisk palca odpowiada oczekiwaniom.", - "keyChangedDescription": "Klucz hosta dla tego serwera zmienił się od ostatniego połączenia. Może to wskazywać na problem bezpieczeństwa.", - "previousKey": "Poprzedni klucz", - "newFingerprint": "Nowy odcisk palca", - "fingerprint": "Odcisk palca", - "verifyInstructions": "Jeśli ufasz temu hostowi, kliknij przycisk Akceptuj, aby kontynuować i zapisać ten odcisk palca dla przyszłych połączeń.", - "securityWarning": "Ostrzeżenie bezpieczeństwa", - "acceptAndContinue": "Zaakceptuj i kontynuuj", - "acceptNewKey": "Akceptuj nowy klucz i kontynuuj" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Nie można połączyć się z bazą danych", - "unknownError": "Nieznany błąd", - "loginFailed": "Logowanie nie powiodło się", - "failedPasswordReset": "Nie udało się zainicjować resetowania hasła", - "failedVerifyCode": "Nie udało się zweryfikować kodu resetowania", - "failedCompleteReset": "Nie udało się zakończyć resetowania hasła", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Nie udało się uruchomić logowania OIDC", - "silentSigninOidcUnavailable": "Poproszono o cichy logowanie, ale login OIDC nie jest dostępny.", - "failedUserInfo": "Nie udało się uzyskać informacji o użytkowniku po zalogowaniu", - "oidcAuthFailed": "Uwierzytelnianie OIDC nie powiodło się", - "invalidAuthUrl": "Nieprawidłowy adres URL autoryzacji otrzymany z backendu", - "requiredField": "To pole jest wymagane", - "minLength": "Minimalna długość to {{min}}", - "passwordMismatch": "Hasła nie pasują", - "passwordLoginDisabled": "Logowanie użytkownika/hasła jest obecnie wyłączone", - "sessionExpired": "Sesja wygasła - zaloguj się ponownie", - "totpRateLimited": "Oceń limitowane: Zbyt wiele prób weryfikacji TOTP. Spróbuj ponownie później.", - "totpRateLimitedWithTime": "Ograniczenie szybkości: Zbyt wiele prób weryfikacji TOTP. Odczekaj {{time}} sekund przed ponowną próbą.", - "resetCodeRateLimited": "Oceń limit: Zbyt wiele prób weryfikacji. Spróbuj ponownie później.", - "resetCodeRateLimitedWithTime": "Ograniczenie szybkości: Zbyt wiele prób weryfikacji. Odczekaj {{time}} sekund przed ponowną próbą.", - "authTokenSaveFailed": "Nie udało się zapisać tokenu uwierzytelniania", - "failedToLoadServer": "Nie udało się załadować serwera" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Rejestracja nowego konta jest obecnie wyłączona przez administratora. Zaloguj się lub skontaktuj się z administratorem.", - "userNotAllowed": "Twoje konto nie jest autoryzowane do rejestracji. Skontaktuj się z administratorem.", - "databaseConnectionFailed": "Nie udało się połączyć z serwerem bazy danych", - "resetCodeSent": "Kod resetujący został wysłany do dzienników Docker", - "codeVerified": "Kod zweryfikowany pomyślnie", - "passwordResetSuccess": "Hasło zostało zresetowane", - "loginSuccess": "Logowanie zakończone powodzeniem", - "registrationSuccess": "Rejestracja powiodła się" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Lokalne tunele pulpitu ukierunkowane na skonfigurowane hosty SSH.", - "c2sTunnelPresets": "Ustawienia tunelu klienta", - "c2sTunnelPresetsDesc": "Zapisz lokalną listę tuneli tego klienta jako ustawienie serwera lub załaduj ustawienie z powrotem do tego klienta.", - "c2sTunnelPresetsUnavailable": "Ustawienia tunelu klienta są dostępne tylko w kliencie pulpitu.", - "c2sPresetName": "Nazwa ustawień wstępnych", - "c2sPresetNamePlaceholder": "Nazwa predefiniowana klienta", - "c2sPresetToLoad": "Ustawienie do załadowania", - "c2sNoPresetSelected": "Nie wybrano ustawień wstępnych", - "c2sNoPresets": "Nie zapisano ustawień wstępnych", - "c2sLoadPreset": "Załaduj", - "c2sCurrentLocalConfig": "{{count}} lokalne tunele klienta skonfigurowane na tym komputerze.", - "c2sPresetSyncNote": "Presety są wyraźnymi zrzutami migawek; ładowanie jednego zastępuje lokalną listę tuneli klienta tego komputera.", - "c2sPresetSaved": "Ustawienia tunelu klienta zapisane", - "c2sPresetLoaded": "Ustawienia tunelu klienta załadowane lokalnie", - "c2sPresetRenamed": "Zmieniono nazwę tunelu klienta", - "c2sPresetDeleted": "Usunięto ustawienie tunelu klienta", - "c2sPresetLoadError": "Nie udało się załadować ustawień tunelu klienta" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Język", - "keyPassword": "hasło klucza", - "pastePrivateKey": "Wklej klucz prywatny tutaj...", - "localListenerHost": "127.0.0.1 (słuchaj lokalnie)", - "localTargetHost": "127.0.0.1 (cel na tym komputerze)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Wprowadź hasło", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Pulpit", - "loading": "Ładowanie pulpitu nawigacyjnego...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Wsparcie", + "support": "Support", "discord": "Discord", - "serverOverview": "Przegląd serwera", - "version": "Wersja", - "upToDate": "Dotychczas", - "updateAvailable": "Dostępna aktualizacja", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Czas pracy", - "database": "Baza danych", - "healthy": "Zdrowe", - "error": "Błąd", - "totalHosts": "Całkowita liczba hostów", - "totalTunnels": "Całkowita liczba tuneli", - "totalCredentials": "Łącznie dane logowania", - "recentActivity": "Ostatnia aktywność", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Ładowanie ostatniej aktywności...", - "noRecentActivity": "Brak ostatniej aktywności", - "quickActions": "Szybkie akcje", - "addHost": "Dodaj hosta", - "addCredential": "Dodaj poświadczenia", - "adminSettings": "Ustawienia administratora", - "userProfile": "Profil użytkownika", - "serverStats": "Statystyki serwera", - "loadingServerStats": "Ładowanie statystyk serwera...", - "noServerData": "Brak dostępnych danych serwera", - "cpu": "Procesor", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Dostosuj panel", - "dashboardSettings": "Ustawienia panelu ustawień", - "enableDisableCards": "Włącz/Wyłącz karty", - "resetLayout": "Przywróć domyślne", - "serverOverviewCard": "Przegląd serwera", - "recentActivityCard": "Ostatnia aktywność", - "networkGraphCard": "Wykres sieci", - "networkGraph": "Wykres sieci", - "quickActionsCard": "Szybkie akcje", - "serverStatsCard": "Statystyki serwera", - "panelMain": "Główny", - "panelSide": "Bok", - "justNow": "właśnie teraz" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "STABILNY", - "hostsOnline": "Hosty Online", - "activeTunnels": "Aktywne tunele", - "registerNewServer": "Rejestracja nowego serwera", - "storeSshKeysOrPasswords": "Przechowuj klucze SSH lub hasła", - "manageUsersAndRoles": "Zarządzaj użytkownikami i rolami", - "manageYourAccount": "Zarządzaj kontem", - "hostStatus": "Status hosta", - "noHostsConfigured": "Brak skonfigurowanych hostów", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", - "onlineLower": "Dostępny", + "onlineLower": "W sieci", "nodes": "{{count}} nodes", - "add": "Dodać:", - "commandPalette": "Paleta Poleceń", - "done": "Gotowe", - "editModeInstructions": "Przeciągnij karty aby zmienić kolejność · Przeciągnij rozdzielacz kolumn, aby zmienić rozmiar kolumn · Przeciągnij dolną krawędź karty, aby zmienić jej wysokość · Kosz aby usunąć", - "empty": "Pusty", - "clear": "Wyczyść" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopia", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Dodaj hosta", - "addGroup": "Dodaj grupę", - "addLink": "Dodaj link", - "zoomIn": "Powiększ", - "zoomOut": "Pomniejsz", - "resetView": "Resetuj widok", - "selectHost": "Wybierz hosta", - "chooseHost": "Wybierz host...", - "parentGroup": "Grupa nadrzędna", - "noGroup": "Brak grupy", - "groupName": "Nazwa grupy", - "color": "Kolor", - "source": "Źródło", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Przenieś do grupy", - "selectGroup": "Wybierz grupę...", - "addConnection": "Dodaj połączenie", - "hostDetails": "Szczegóły hosta", - "removeFromGroup": "Usuń z grupy", - "addHostHere": "Dodaj tutaj hosta", - "editGroup": "Edytuj grupę", - "delete": "Usuń", - "add": "Dodaj", - "create": "Utwórz", - "move": "Przenieś", - "connect": "Połącz", - "createGroup": "Utwórz grupę", - "selectSourcePlaceholder": "Wybierz źródło...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Przenosić", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Nieprawidłowy plik", - "hostAlreadyExists": "Host jest już w topologii", - "connectionExists": "Połączenie już istnieje", - "unknown": "Nieznane", - "name": "Nazwisko", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Status", - "failedToAddNode": "Nie udało się dodać węzła", - "sourceDifferentFromTarget": "Źródło i cel muszą być różne", - "exportJSON": "Eksportuj JSON", - "importJSON": "Importuj JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", "fileManager": "Menedżer plików", "tunnel": "Tunel", - "docker": "Dokujący", - "serverStats": "Statystyki serwera", - "noNodes": "Brak węzłów" + "docker": "Doker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker nie jest włączony dla tego hosta", - "validating": "Sprawdzanie poprawności Docker...", - "connecting": "Łączenie...", - "error": "Błąd", - "version": "Dokator {{version}}", - "connectionFailed": "Nie udało się połączyć z Dockerem", - "containerStarted": "Pojemnik {{name}} został uruchomiony", - "failedToStartContainer": "Nie udało się uruchomić kontenera {{name}}", - "containerStopped": "Pojemnik {{name}} zatrzymany", - "failedToStopContainer": "Nie udało się zatrzymać kontenera {{name}}", - "containerRestarted": "Pojemnik {{name}} został uruchomiony ponownie", - "failedToRestartContainer": "Nie udało się ponownie uruchomić kontenera {{name}}", - "containerPaused": "Kontener {{name}} wstrzymał", - "containerUnpaused": "Kontener {{name}} niewstrzymał", - "failedToTogglePauseContainer": "Nie udało się przełączyć stanu pauzy dla kontenera {{name}}", - "containerRemoved": "Usunięto pojemnik {{name}}", - "failedToRemoveContainer": "Nie udało się usunąć kontenera {{name}}", - "image": "Obraz", - "ports": "Porty", - "noPorts": "Brak portów", - "start": "Rozpocznij", - "confirmRemoveContainer": "Czy na pewno chcesz usunąć kontenera '{{name}}'? Tej akcji nie można cofnąć.", - "runningContainerWarning": "Ostrzeżenie: Ten kontener jest obecnie uruchomiony. Usunięcie go zatrzyma najpierw kontener", - "loadingContainers": "Ładowanie kontenerów...", - "manager": "Menedżer stacji dokującej", - "autoRefresh": "Automatyczne odświeżanie", - "timestamps": "Znaczniki czasu", - "lines": "Linie", - "filterLogs": "Filtruj logi...", - "refresh": "Odśwież", - "download": "Pobierz", - "clear": "Wyczyść", - "logsDownloaded": "Dzienniki pobrane pomyślnie", - "last50": "Ostatnie 50", - "last100": "Ostatnie 100", - "last500": "Ostatnie 500", - "last1000": "Ostatnie 1000", - "allLogs": "Wszystkie dzienniki", - "noLogsMatching": "Brak logów pasujących do \"{{query}}\"", - "noLogsAvailable": "Brak dostępnych logów", - "noContainersFound": "Nie znaleziono kontenerów", - "noContainersFoundHint": "Pojemniki dokujące nie są dostępne dla tego hosta", - "searchPlaceholder": "Szukaj kontenerów...", - "allStatuses": "Wszystkie statusy", - "stateRunning": "Uruchamianie", - "statePaused": "Zatrzymano", - "stateExited": "Zakończone", - "stateRestarting": "Ponowne uruchamianie", - "noContainersMatchFilters": "Żadne kontenery nie pasują do Twoich filtrów", - "noContainersMatchFiltersHint": "Spróbuj dostosować kryteria wyszukiwania lub filtrowania", - "failedToFetchStats": "Nie udało się pobrać statystyk kontenera", - "containerNotRunning": "Kontener nie działa", - "startContainerToViewStats": "Rozpocznij kontener aby wyświetlić statystyki", - "loadingStats": "Ładowanie statystyk...", - "errorLoadingStats": "Błąd ładowania statystyk", - "noStatsAvailable": "Brak dostępnych statystyk", - "cpuUsage": "Użycie procesora", - "current": "Bieżący", - "memoryUsage": "Użycie pamięci", - "networkIo": "Sieć I/O", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Wyjście", - "blockIo": "Blokuj I/O", - "read": "Czytaj", - "write": "Napisz", - "pids": "PID", - "containerInformation": "Informacje o kontenerze", - "name": "Nazwisko", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Stan", - "containerMustBeRunning": "Kontener musi być uruchomiony, aby uzyskać dostęp do konsoli", - "verificationCodePrompt": "Wprowadź kod weryfikacyjny", - "totpVerificationFailed": "Weryfikacja TOTP nie powiodła się. Spróbuj ponownie.", - "warpgateVerificationFailed": "Uwierzytelnianie Warpgate nie powiodło się. Spróbuj ponownie.", - "connectedTo": "Połączono z {{containerName}}", - "disconnected": "Rozłączony", - "consoleError": "Błąd konsoli", - "errorMessage": "Błąd: {{message}}", - "failedToConnect": "Nie udało się połączyć z kontenerem", - "console": "Konsola", - "selectShell": "Wybierz powłokę", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Bezładny", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", - "sh": "pl", - "ash": "popiół", - "connect": "Połącz", - "disconnect": "Rozłącz", - "notConnected": "Nie połączono", - "clickToConnect": "Kliknij Połącz się, aby rozpocząć sesję powłoki", - "connectingTo": "Łączenie z {{containerName}}...", - "containerNotFound": "Nie znaleziono kontenera", - "backToList": "Powrót do listy", - "logs": "Logi", - "stats": "Statystyki", - "consoleTab": "Konsola", - "startContainerToAccess": "Uruchom kontener aby uzyskać dostęp do konsoli" + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Nie połączony", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Ogólny", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Użytkownicy", - "sectionSessions": "Sesje", - "sectionRoles": "Role", - "sectionDatabase": "Baza danych", - "sectionApiKeys": "Klucze API", - "allowRegistration": "Zezwalaj na rejestrację użytkownika", - "allowRegistrationDesc": "Pozwól nowym użytkownikom na samodzielną rejestrację", - "allowPasswordLogin": "Zezwalaj na logowanie do hasła", - "allowPasswordLoginDesc": "Login użytkownika/hasło", - "oidcAutoProvision": "Automatyczna dostawa OIDC", - "oidcAutoProvisionDesc": "Automatyczne tworzenie kont dla użytkowników OIDC nawet gdy rejestracja jest wyłączona", - "allowPasswordReset": "Zezwalaj na resetowanie hasła", - "allowPasswordResetDesc": "Zresetuj kod za pomocą dzienników Docker", - "sessionTimeout": "Limit czasu sesji", - "hours": "godziny", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Wyczyść filtry", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "Monitorowanie ustawień domyślnych", - "statusCheck": "Sprawdzanie statusu", - "metrics": "Metryki", - "sec": "sek.", - "logLevel": "Poziom logowania", - "enableGuacamole": "Włącz Guacamol", - "enableGuacamoleDesc": "Pulpit zdalny RDP/VNC", - "guacdUrl": "adres URL guacd", - "oidcDescription": "Konfiguracja OpenID Connect dla SSO. Pola oznaczone * są wymagane.", - "oidcClientId": "Identyfikator klienta", - "oidcClientSecret": "Klucz tajny klienta", - "oidcAuthUrl": "URL autoryzacji", - "oidcIssuerUrl": "Adres URL wystawcy", - "oidcTokenUrl": "Adres URL tokenu", - "oidcUserIdentifier": "Ścieżka identyfikatora użytkownika", - "oidcDisplayName": "Wyświetl ścieżkę nazwy", - "oidcScopes": "Zakresy", - "oidcUserinfoUrl": "Nadpisz adres URL Userinfo", - "oidcAllowedUsers": "Dozwoleni użytkownicy", - "oidcAllowedUsersDesc": "Jeden e-mail na wiersz. Pozostaw puste, aby zezwolić na wszystkie.", - "removeOidc": "Usuń", - "usersCount": "{{count}} użytkowników", - "createUser": "Utwórz", - "newRole": "Nowa rola", - "roleName": "Nazwisko", - "roleDisplayName": "Wyświetlana nazwa", - "roleDescription": "Opis", - "rolesCount": "Role {{count}}", - "createRole": "Utwórz", - "creating": "Tworzenie...", - "exportDatabase": "Eksportuj bazę danych", - "exportDatabaseDesc": "Pobierz kopię zapasową wszystkich hostów, danych logowania i ustawień", - "export": "Eksportuj", - "exporting": "Eksportowanie...", - "importDatabase": "Importuj bazę danych", - "importDatabaseDesc": "Przywróć z pliku backupu .sqlite", - "importDatabaseSelected": "Wybrane: {{name}}", - "selectFile": "Wybierz plik", - "changeFile": "Zmiana", - "import": "Importuj", - "importing": "Importowanie...", - "apiKeysCount": "{{count}} klucze", - "newApiKey": "Nowy klucz API", - "apiKeyCreatedWarning": "Klucz utworzony - skopiuj go teraz, nie będzie ponownie wyświetlany.", - "apiKeyName": "Nazwisko", - "apiKeyUser": "Użytkownik", - "apiKeySelectUser": "Wybierz użytkownika...", - "apiKeyExpiresAt": "Wygasa", - "createKey": "Utwórz klucz", - "apiKeyNoExpiry": "Brak terminu ważności", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Usunąć", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Lokalny", + "authTypeLocal": "Local", "adminStatusAdministrator": "Administrator", - "adminStatusRegularUser": "Zwykły użytkownik", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "USTALENIE", - "youBadge": "Ty", - "sessionsActive": "{{count}} aktywny", - "sessionActive": "Aktywne: {{time}}", - "sessionExpires": "Termin ważności: {{time}}", - "revokeAll": "Wszystkie", - "revokeAllSessionsSuccess": "Wszystkie sesje dla użytkownika odwołane", - "revokeAllSessionsFailed": "Nie udało się odwołać sesji", - "revokeSessionFailed": "Nie udało się odwołać sesji", - "addRole": "Dodaj rolę", - "noCustomRoles": "Nie zdefiniowano roli niestandardowych", - "removeRoleFailed": "Nie udało się usunąć roli", - "assignRoleFailed": "Nie udało się przypisać roli", - "deleteRoleFailed": "Nie udało się usunąć roli", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", "userAdminAccess": "Administrator", - "userAdminAccessDesc": "Pełny dostęp do wszystkich ustawień administratora", - "userRoles": "Role", - "revokeAllUserSessions": "Unieważnij wszystkie sesje", - "revokeAllUserSessionsDesc": "Wymuś ponowne logowanie na wszystkich urządzeniach", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Usunięcie tego użytkownika jest trwałe.", - "deleteUser": "Usuń {{username}}", - "deleting": "Usuwanie...", - "deleteUserFailed": "Nie udało się usunąć użytkownika", - "deleteUserSuccess": "Użytkownik \"{{username}}\" został usunięty", - "deleteRoleSuccess": "Rola \"{{name}}\" usunięto", - "revokeKeySuccess": "Klucz \"{{name}}\" odwołany", - "revokeKeyFailed": "Nie udało się odwołać klucza", - "copiedToClipboard": "Skopiowano do schowka", - "done": "Gotowe", - "createUserTitle": "Utwórz użytkownika", - "createUserDesc": "Utwórz nowe konto lokalne.", - "createUserUsername": "Nazwa użytkownika", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Hasło", - "createUserPasswordHint": "Co najmniej 6 znaków.", - "createUserEnterUsername": "Wprowadź nazwę użytkownika", - "createUserEnterPassword": "Wprowadź hasło", - "createUserSubmit": "Utwórz użytkownika", - "editUserTitle": "Zarządzaj użytkownikami: {{username}}", - "editUserDesc": "Edytuj role, status administratora, sesje i ustawienia konta.", - "editUserUsername": "Nazwa użytkownika", - "editUserAuthType": "Typ uwierzytelniania", - "editUserAdminStatus": "Status administratora", - "editUserUserId": "ID użytkownika", - "linkAccountTitle": "Połącz OIDC z kontem hasłem", - "linkAccountDesc": "Scal konto OIDC {{username}} z istniejącym kontem lokalnym.", - "linkAccountWarningTitle": "Będzie to obejmować:", - "linkAccountEffect1": "Usuń konto tylko OIDC", - "linkAccountEffect2": "Dodaj login OIDC do konta docelowego", - "linkAccountEffect3": "Zezwalaj na logowanie do OIDC i hasła", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Wprowadź nazwę użytkownika konta lokalnego, do której chcesz się połączyć", - "linkAccounts": "Połącz konta", - "linkAccountSuccess": "Konto OIDC powiązane z „{{username}}”", - "linkAccountFailed": "Nie udało się połączyć konta OIDC", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Typ autoryzacji", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Łączenie...", - "saving": "Zapisywanie...", - "updateRegistrationFailed": "Nie udało się zaktualizować ustawień rejestracji", - "updatePasswordLoginFailed": "Nie udało się zaktualizować ustawienia logowania hasła", - "updateOidcAutoProvisionFailed": "Nie udało się zaktualizować ustawień automatycznego dostarczania OIDC", - "updatePasswordResetFailed": "Nie udało się zaktualizować ustawienia resetowania hasła", - "sessionTimeoutRange2": "Limit czasu sesji musi wynosić od 1 do 720 godzin", - "sessionTimeoutSaved": "Limit czasu sesji został zapisany", - "sessionTimeoutSaveFailed": "Nie udało się zapisać limitu czasu sesji", - "monitoringIntervalInvalid": "Nieprawidłowe wartości interwału", - "monitoringSaved": "Ustawienia monitorowania zapisane", - "monitoringSaveFailed": "Nie udało się zapisać ustawień monitorowania", - "guacamoleSaved": "Ustawienia Guacamole zapisane", - "guacamoleSaveFailed": "Nie udało się zapisać ustawień Guacamole", - "guacamoleUpdateFailed": "Nie udało się zaktualizować ustawienia Guacamole", - "logLevelUpdateFailed": "Nie udało się zaktualizować poziomu dziennika", - "oidcSaved": "Zapisano konfigurację OIDC", - "oidcSaveFailed": "Nie udało się zapisać konfiguracji OIDC", - "oidcRemoved": "Konfiguracja OIDC usunięta", - "oidcRemoveFailed": "Nie udało się usunąć konfiguracji OIDC", - "createUserRequired": "Nazwa użytkownika i hasło są wymagane", - "createUserPasswordTooShort": "Hasło musi mieć co najmniej 6 znaków", - "createUserSuccess": "Użytkownik \"{{username}}\" został utworzony", - "createUserFailed": "Nie udało się utworzyć użytkownika", - "updateAdminStatusFailed": "Nie udało się zaktualizować statusu administratora", - "allSessionsRevoked": "Wszystkie sesje zostały odwołane", - "revokeSessionsFailed": "Nie udało się odwołać sesji", - "createRoleRequired": "Nazwa i nazwa wyświetlana są wymagane", - "createRoleSuccess": "Rola \"{{name}}\" została utworzona", - "createRoleFailed": "Nie udało się utworzyć roli", - "apiKeyNameRequired": "Nazwa klucza jest wymagana", - "apiKeyUserRequired": "Identyfikator użytkownika jest wymagany", - "apiKeyCreatedSuccess": "Klucz API \"{{name}}\" został utworzony", - "apiKeyCreateFailed": "Nie udało się utworzyć klucza API", - "exportSuccess": "Baza danych wyeksportowana pomyślnie", - "exportFailed": "Eksport bazy danych nie powiódł się", - "importSelectFile": "Proszę najpierw wybrać plik", - "importCompleted": "Import zakończony: importowane elementy {{total}} , pominięto {{skipped}}", - "importFailed": "Importowanie nie powiodło się: {{error}}", - "importError": "Importowanie bazy danych nie powiodło się" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Host", - "hostPlaceholder": "192.168.1.1 lub przykład.com", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Nazwa użytkownika", - "usernamePlaceholder": "nazwa użytkownika", - "authLabel": "Autoryzacja", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Hasło", - "passwordPlaceholder": "hasło", - "privateKeyLabel": "Klucz prywatny", - "privateKeyPlaceholder": "Wklej klucz prywatny...", - "credentialLabel": "Dane logowania", - "credentialPlaceholder": "Wybierz zapisane dane logowania", - "connectToTerminal": "Połącz z terminalem", - "connectToFiles": "Połącz z plikami" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Mandat", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Nie wybrano terminala", - "noTerminalSelectedHint": "Otwórz kartę terminala SSH aby wyświetlić historię poleceń", - "searchPlaceholder": "Szukaj historii...", - "clearAll": "Wyczyść wszystko", - "noHistoryEntries": "Brak wpisów historii", - "trackingDisabled": "Śledzenie historii jest wyłączone", - "trackingDisabledHint": "Włącz to w ustawieniach profilu, aby nagrywać komendy." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Nagrywanie kluczy", - "recordToTerminals": "Nagrywanie w terminalach", - "selectAll": "Wszystkie", - "selectNone": "Brak", - "noTerminalTabsOpen": "Brak otwartych kart terminali", - "selectTerminalsAbove": "Wybierz terminale powyżej", - "broadcastInputPlaceholder": "Wpisz tutaj, aby nadawać przyciski klawiszowe...", - "stopRecording": "Zatrzymaj nagrywanie", - "startRecording": "Rozpocznij nagrywanie", - "settingsTitle": "Ustawienia", - "enableRightClickCopyPaste": "Włącz kopiowanie/wklejanie prawym przyciskiem myszy" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Nic", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Układ", - "selectLayoutAbove": "Wybierz układ powyżej", - "selectLayoutHint": "Wybierz ile paneli chcesz wyświetlić", - "panesTitle": "Panele", - "openTabsTitle": "Otwórz karty", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Przeciągnij karty do paneli powyżej lub użyj funkcji Szybkie przypisywanie", - "dropHere": "Upuść tutaj", - "emptyPane": "Pusty", - "dashboard": "Pulpit", - "clearSplitScreen": "Wyczyść dzielony ekran", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Szybkie przypisanie", - "alreadyAssigned": "Panel {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Podziel kartę", "addToSplit": "Dodaj do podziału", "removeFromSplit": "Usuń z podziału", - "assignToPane": "Przypisz do panelu" + "assignToPane": "Przypisz do panelu", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Utwórz Snippet", - "createSnippetDescription": "Utwórz nowy fragment komendy do szybkiego wykonania", - "nameLabel": "Nazwisko", - "namePlaceholder": "np. Uruchom ponownie Nginx", - "descriptionLabel": "Opis", - "descriptionPlaceholder": "Opcjonalny opis", - "optional": "Opcjonalnie", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", "folderLabel": "Folder", - "noFolder": "Brak folderu (brak kategorii)", - "commandLabel": "Polecenie", - "commandPlaceholder": "np. sudo systemowy restart nginx", - "cancel": "Anuluj", - "createSnippetButton": "Utwórz Snippet", - "createFolderTitle": "Utwórz folder", - "createFolderDescription": "Organizuj swoje fragmenty w folderach", - "folderNameLabel": "Nazwa folderu", - "folderNamePlaceholder": "np. Komendy systemowe, skrypty Docker", - "folderColorLabel": "Kolor folderu", - "folderIconLabel": "Ikona folderu", - "previewLabel": "Podgląd", - "folderNameFallback": "Nazwa folderu", - "createFolderButton": "Utwórz folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Anulować", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Wszystkie", - "selectNone": "Brak", - "noTerminalTabsOpen": "Brak otwartych kart terminali", - "searchPlaceholder": "Szukaj fragmentów...", - "newSnippet": "Nowy Snippet", - "newFolder": "Nowy folder", - "run": "Uruchom", - "noSnippetsInFolder": "Brak fragmentów w tym folderze", - "uncategorized": "Nieskategoryzowane", - "editSnippetTitle": "Edytuj Snippet", - "editSnippetDescription": "Aktualizuj ten fragment polecenia", - "saveSnippetButton": "Zapisz zmiany", - "createSuccess": "Snippet utworzony pomyślnie", - "createFailed": "Nie udało się utworzyć fragmentu", - "updateSuccess": "Snippet został pomyślnie zaktualizowany", - "updateFailed": "Nie udało się zaktualizować snippet", - "deleteFailed": "Nie udało się usunąć snippet", - "folderCreateSuccess": "Folder utworzony pomyślnie", - "folderCreateFailed": "Nie udało się utworzyć folderu", - "editFolderTitle": "Edytuj folder", - "editFolderDescription": "Zmień nazwę lub zmień wygląd tego folderu", - "saveFolderButton": "Zapisz zmiany", - "editFolder": "Edytuj folder", - "deleteFolder": "Usuń folder", - "folderDeleteSuccess": "Folder \"{{name}}\" usunięto", - "folderDeleteFailed": "Nie udało się usunąć folderu", - "folderEditSuccess": "Folder zaktualizowany pomyślnie", - "folderEditFailed": "Nie udało się zaktualizować folderu", - "confirmRunMessage": "Uruchomić \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Nic", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Uruchomić", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Uruchomić", - "runSuccess": "Ran \"{{name}}\" w terminalach {{count}}", - "copySuccess": "Skopiowano \"{{name}}\" do schowka", - "shareTitle": "Udostępnij Snippet", - "shareUser": "Użytkownik", - "shareRole": "Rola", - "selectUser": "Wybierz użytkownika...", - "selectRole": "Wybierz rolę...", - "shareSuccess": "Snippet udostępniony pomyślnie", - "shareFailed": "Nie udało się udostępnić snippet", - "revokeSuccess": "Dostęp odwołany", - "revokeFailed": "Nie udało się odwołać dostępu", - "currentAccess": "Bieżący dostęp", - "shareLoadError": "Nie udało się załadować udostępnionych danych", - "loading": "Ładowanie...", - "close": "Zamknij", - "reorderFailed": "Nie udało się zapisać kolejności fragmentów" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Nie udało się zapisać kolejności fragmentów", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Konto", - "sectionAppearance": "Wygląd", - "sectionSecurity": "Bezpieczeństwo", - "sectionApiKeys": "Klucze API", - "sectionC2sTunnels": "Tunele C2S", - "usernameLabel": "Nazwa użytkownika", - "roleLabel": "Rola", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", "roleAdministrator": "Administrator", - "authMethodLabel": "Metoda uwierzytelniania", - "authMethodLocal": "Lokalny", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "Włączone", - "twoFaOff": "Wyłączony", - "versionLabel": "Wersja", - "deleteAccount": "Usuń konto", - "deleteAccountDescription": "Trwale usuń swoje konto", - "deleteButton": "Usuń", - "deleteAccountPermanent": "Ta akcja jest trwała i nie może zostać cofnięta.", - "deleteAccountWarning": "Wszystkie sesje, hosty, dane logowania i ustawienia zostaną trwale usunięte.", - "confirmPasswordDeletePlaceholder": "Wprowadź hasło, aby potwierdzić", - "languageLabel": "Język", - "themeLabel": "Motyw", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Kolor akcentu", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Autouzupełnianie polecenia", - "commandAutocompleteDesc": "Pokaż autouzupełnianie podczas pisania", - "historyTracking": "Śledzenie historii", - "historyTrackingDesc": "Śledź polecenia terminala", - "syntaxHighlighting": "Podświetlanie składni", - "syntaxHighlightingDesc": "Podświetl terminal wyjściowy", - "commandPalette": "Paleta Poleceń", - "commandPaletteDesc": "Włącz skrót klawiaturowy", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Ponowne otwieranie kart podczas logowania", "reopenTabsOnLoginDesc": "Przywracaj otwarte karty po zalogowaniu się lub odświeżeniu strony, nawet z innego urządzenia", - "confirmTabClose": "Potwierdź zamknięcie karty", - "confirmTabCloseDesc": "Zapytaj przed zamknięciem kart terminali", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Pokaż tagi hosta", - "showHostTagsDesc": "Wyświetl tagi na liście hostów", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Kliknij, aby rozwinąć działania hosta", "hostTrayOnClickDesc": "Zawsze pokazuj przyciski połączeń; kliknij, aby rozwinąć opcje zarządzania, zamiast najeżdżać kursorem", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Aplikacja Pin Rail", "pinAppRailDesc": "Utrzymuj zawsze rozwinięty lewy pasek boczny aplikacji zamiast rozwijać go po najechaniu kursorem", - "settingsSnippets": "Fragmenty", - "foldersCollapsed": "Foldery upadły", - "foldersCollapsedDesc": "Domyślnie zwiń foldery", - "confirmExecution": "Potwierdź wykonanie", - "confirmExecutionDesc": "Potwierdź przed uruchomieniem snippetów", - "settingsUpdates": "Aktualizacje", - "disableUpdateChecks": "Wyłącz sprawdzanie aktualizacji", - "disableUpdateChecksDesc": "Zatrzymaj sprawdzanie aktualizacji", - "totpAuthenticator": "Autoryzacja TOTP", - "totpEnabled": "2FA jest włączona", - "totpDisabled": "Dodaj dodatkowe bezpieczeństwo logowania", - "disable": "Wyłącz", - "enable": "Włącz", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Zeskanuj kod QR lub wprowadź sekret w swojej aplikacji uwierzytelniającej, a następnie wprowadź 6-cyfrowy kod", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Weryfikacja", - "changePassword": "Zmień hasło", - "currentPasswordLabel": "Bieżące hasło", - "currentPasswordPlaceholder": "Aktualne hasło", - "newPasswordLabel": "Nowe hasło", - "newPasswordPlaceholder": "Nowe hasło", - "confirmPasswordLabel": "Potwierdź nowe hasło", - "confirmPasswordPlaceholder": "Potwierdź nowe hasło", - "updatePassword": "Aktualizuj hasło", - "createApiKeyTitle": "Utwórz klucz API", - "createApiKeyDescription": "Wygeneruj nowy klucz API dla dostępu programowego.", - "apiKeyNameLabel": "Nazwisko", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "fakultatywne", - "cancel": "Anuluj", - "createKey": "Utwórz klucz", - "apiKeyCount": "{{count}} klucze", - "newKey": "Nowy klucz", - "noApiKeys": "Brak kluczy API.", - "apiKeyActive": "Aktywne", - "apiKeyUsageHint": "Dołącz swój klucz do", - "apiKeyUsageHintHeader": "nagłówek.", - "apiKeyPermissionsHint": "Klucze odziedziczą uprawnienia tworzącego użytkownika.", - "roleUser": "Użytkownik", + "optional": "optional", + "cancel": "Anulować", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Nie udało się uruchomić konfiguracji TOTP", - "totpEnter6Digits": "Wprowadź 6-cyfrowy kod", - "totpEnabledSuccess": "Uwierzytelnianie dwuskładnikowe włączone", - "totpInvalidCode": "Nieprawidłowy kod, spróbuj ponownie", - "totpDisableInputRequired": "Wprowadź kod TOTP lub hasło", - "totpDisabledSuccess": "Uwierzytelnianie dwuskładnikowe wyłączone", - "totpDisableFailed": "Nie udało się wyłączyć 2FA", - "totpDisableTitle": "Wyłącz 2FA", - "totpDisablePlaceholder": "Wprowadź kod TOTP lub hasło", - "totpDisableConfirm": "Wyłącz 2FA", - "totpContinueVerify": "Kontynuuj weryfikację", - "totpVerifyTitle": "Potwierdź kod", - "totpBackupTitle": "Kody kopii zapasowych", - "totpDownloadBackup": "Pobierz kody kopii zapasowych", - "done": "Gotowe", - "secretCopied": "Sekretne skopiowane do schowka", - "apiKeyNameRequired": "Nazwa klucza jest wymagana", - "apiKeyCreated": "Klucz API \"{{name}}\" został utworzony", - "apiKeyCreateFailed": "Nie udało się utworzyć klucza API", - "apiKeyUser": "Użytkownik", - "apiKeyExpires": "Wygasa", - "apiKeyRevoked": "Klucz API \"{{name}}\" odwołany", - "apiKeyRevokeFailed": "Nie udało się odwołać klucza API", - "passwordFieldsRequired": "Wymagane są aktualne i nowe hasła", - "passwordMismatch": "Hasła nie pasują", - "passwordTooShort": "Hasło musi mieć co najmniej 6 znaków", - "passwordUpdated": "Hasło zaktualizowane pomyślnie", - "passwordUpdateFailed": "Nie udało się zaktualizować hasła", - "deletePasswordRequired": "Aby usunąć Twoje konto wymagane jest hasło.", - "deleteFailed": "Nie udało się usunąć konta", - "deleting": "Usuwanie...", - "colorPickerTooltip": "Otwórz selektor kolorów", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", "themeSystem": "System", - "themeLight": "Światło", - "themeDark": "Ciemny", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solaryzowane", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Jedno ciemne", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tagi", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Spróbować ponownie", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Usunąć", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/pt_BR.json b/src/ui/locales/translated/pt_BR.json index 53afe286..24ac025c 100644 --- a/src/ui/locales/translated/pt_BR.json +++ b/src/ui/locales/translated/pt_BR.json @@ -1,14 +1,14 @@ { "credentials": { "folders": "Pastas", - "folder": "pasta", - "password": "Palavra-passe", + "folder": "Pasta", + "password": "Senha", "key": "Chave", - "sshPrivateKey": "Chave privada SSH", - "upload": "Transferir", - "keyPassword": "Senha da Chave", + "sshPrivateKey": "Chave Privada SSH", + "upload": "Enviar", + "keyPassword": "Senha da chave", "sshKey": "Chave SSH", - "uploadPrivateKeyFile": "Carregar arquivo de chave privada", + "uploadPrivateKeyFile": "Carregar Arquivo de Chave Privada", "searchCredentials": "Pesquisar credenciais...", "addCredential": "Adicionar Credencial", "caCertificate": "Certificado CA (-cert.pub)", @@ -17,563 +17,728 @@ "clearCert": "Limpar", "certLoaded": "Certificado carregado", "certPublicKeyLabel": "Certificado CA", - "certTypeLabel": "Tipo de certificado", + "certTypeLabel": "Tipo de Certificado", "pasteOrUploadCert": "Colar ou fazer upload de um certificado -cert.pub...", - "hasCaCert": "Possui certificado CA", - "noCaCert": "Nenhum certificado CA" + "hasCaCert": "Possui Certificado CA", + "noCaCert": "Sem Certificado CA", + "noPublicKeyAvailable": "Nenhuma chave pública disponível. Abra o editor de credenciais primeiro.", + "deployCommandCopied": "Comando deploy copiado", + "sortCredentials": "Ordenar Credenciais", + "sortDefault": "Ordem Padrão", + "sortNameAsc": "Nome (A → Z)", + "sortNameDesc": "Nome (Z → A)", + "sortUsernameAsc": "Nome de usuário (A → Z)", + "sortUsernameDesc": "Nome de usuário (Z → A)", + "filterCredentials": "Filtrar Credenciais", + "filterClearAll": "Limpar Filtros", + "filterTypeGroup": "Tipo", + "filterTypePassword": "Senha", + "filterTypeKey": "Chave SSH", + "filterTagsGroup": "Etiquetas" }, "homepage": { "failedToLoadAlerts": "Falha ao carregar alertas", "failedToDismissAlert": "Falha ao descartar alerta" }, "serverConfig": { - "title": "Configuração Servidor", + "title": "Configuração do Servidor", "description": "Configure o URL do servidor do Termix para conectar aos seus serviços de backend", - "serverUrl": "URL do servidor", - "enterServerUrl": "Por favor, insira uma URL de servidor", - "saveFailed": "Falha ao salvar a configuração", + "serverUrl": "URL do Servidor", + "enterServerUrl": "Por favor, insira a URL do servidor", + "saveFailed": "Falha ao salvar configuração", "saveError": "Erro ao salvar configuração", "saving": "Salvando...", - "saveConfig": "Salvar configuração", + "saveConfig": "Salvar Configuração", "helpText": "Digite a URL onde o servidor do seu Termix está executando (por exemplo, http://localhost:30001 ou https://seu-servidor.com)", "changeServer": "Alterar Servidor", - "mustIncludeProtocol": "O URL do servidor deve começar com http:// ou https://", + "mustIncludeProtocol": "A URL do servidor deve começar com http:// ou https://", "allowInvalidCertificate": "Permitir certificado inválido", - "allowInvalidCertificateDesc": "Utilize somente em servidores autohospedados confiáveis com certificados autoassinados ou de endereço IP.", + "allowInvalidCertificateDesc": "Usar apenas para servidores hospedados confiáveis com certificados ou endereço IP auto-assinados.", "useEmbedded": "Usar servidor local", "embeddedDesc": "Executar Termix com o servidor local embutido (não é necessário um servidor remoto)", "embeddedConnecting": "Conectando ao servidor local...", "embeddedNotReady": "O servidor local ainda não está pronto. Por favor, aguarde um momento e tente novamente.", - "localServer": "Servidor local" + "localServer": "Servidor Local", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remover" }, "versionCheck": { - "error": "Erro de verificação de versão", - "checkFailed": "Não foi possível verificar se há atualizações", + "error": "Erro de verificação da versão", + "checkFailed": "Falha ao verificar atualizaçoes", "upToDate": "O aplicativo está atualizado", "currentVersion": "Você está executando a versão {{version}}", - "updateAvailable": "Atualização disponível", + "updateAvailable": "Atualização Disponível", "newVersionAvailable": "Uma nova versão está disponível! Você está executando {{current}}, mas {{latest}} está disponível.", "betaVersion": "Versão Beta", "betaVersionDesc": "Você está executando {{current}}, que é mais recente que a última versão estável {{latest}}.", "releasedOn": "Lançado em {{date}}", - "downloadUpdate": "Baixar atualização", + "downloadUpdate": "Baixar Atualização", "checking": "Verificando atualizações...", - "checkUpdates": "Procurar por atualizações", + "checkUpdates": "Verificar Atualizações", "checkingUpdates": "Verificando atualizações...", "updateRequired": "Atualização Necessária" }, "common": { - "close": "FECHAR", - "minimize": "Minimize", - "online": "Disponível", - "offline": "Desconectado", + "close": "Fechar", + "minimize": "Minimizar", + "online": "Online", + "offline": "Offline", "continue": "Continuar", "maintenance": "Manutenção", "degraded": "Degradado", - "error": "ERRO", - "warning": "ATENÇÃO", + "error": "Erro", + "warning": "Atenção", "unsavedChanges": "Alterações não salvas", - "dismiss": "Descartar", - "loading": "Carregandochar@@0", + "dismiss": "Dispensar", + "loading": "Carregando...", "optional": "Opcional", - "connect": "Conectar", + "connect": "Connectar", "copied": "Copiado", - "connecting": "Conectandochar@@0", - "updateAvailable": "Atualização disponível", + "connecting": "Conectando...", + "updateAvailable": "Atualização Disponível", "appName": "Termix", - "openInNewTab": "Abrir em nova aba", + "openInNewTab": "Abrir em Nova Aba", "noReleases": "Sem lançamentos", "updatesAndReleases": "Atualizações e Versões", "newVersionAvailable": "Uma nova versão ({{version}}) está disponível.", "failedToFetchUpdateInfo": "Falha ao buscar informações de atualização", "preRelease": "Pré-lançamento", - "noReleasesFound": "Nenhuma versão encontrada.", - "cancel": "cancelar", - "username": "Usuário:", - "login": "Conectar-se", - "register": "Cadastrar", - "password": "Palavra-passe", - "confirmPassword": "Confirmar senha", - "back": "Anterior", - "save": "Guardar", + "noReleasesFound": "Nenhum lançamento encontrado.", + "cancel": "Cancelar", + "username": "Nome de usuário", + "login": "Login", + "logout": "Logout", + "register": "Registrar", + "password": "Senha", + "confirmPassword": "Confirmar Senha", + "back": "Voltar", + "save": "Salvar", "saving": "Salvando...", - "delete": "excluir", + "delete": "Apagar", "rename": "Renomear", - "edit": "Alterar", + "edit": "Editar", "add": "Adicionar", "confirm": "Confirmar", "no": "Não", - "or": "ou", + "or": "OU", "next": "Próximo", - "previous": "Anterior", - "refresh": "atualizar", - "language": "IDIOMA", - "checking": "Verificandochar@@0", + "previous": "Voltar", + "refresh": "Atualizar", + "language": "Idioma", + "checking": "Verificando...", "checkingDatabase": "Verificando conexão com o banco de dados...", "checkingAuthentication": "Verificando autenticação...", - "backendReconnected": "Conexão do servidor restaurada", - "connectionDegraded": "Conexão do servidor perdida, recuperando…", - "reload": "Reload", - "remove": "Excluir", - "create": "Crio", - "update": "Atualização", - "copy": "copiar", + "backendReconnected": "Conexão com o servidor restaurada", + "connectionDegraded": "Conexão com o servidor perdida, recuperando…", + "reload": "Recarregar", + "remove": "Remover", + "create": "Criar", + "update": "Atualizar", + "copy": "Copiar", "copyFailed": "Falha ao copiar para área de transferência", - "maximize": "Maximize", - "restore": "RESTAURAR", - "of": "de" + "maximize": "Maximizar", + "restore": "Restaurar", + "of": "de", + "saved": "Salvo", + "deleted": "Apagado", + "deleteFailed": "Falha ao apagar", + "saveFailed": "Falha ao salvar", + "required": "Obrigatório" }, "nav": { "home": "Inicio", "terminal": "Terminal", - "docker": "Atracador", + "docker": "Docker", "tunnels": "Túneis", "fileManager": "Gerenciador de Arquivos", - "serverStats": "Estatísticas do servidor", + "serverStats": "Métricas do Host", + "hostMetrics": "Métricas do Host", "admin": "Administrador", - "userProfile": "Informações do Perfil", - "splitScreen": "Dividir a tela", - "confirmClose": "Fechar esta sessão ativa?", - "close": "FECHAR", - "cancel": "cancelar", + "userProfile": "Perfil do usuário", + "splitScreen": "Dividir a Tela", + "confirmClose": "Fechar essa sessão ativa?", + "close": "Fechar", + "cancel": "Cancelar", "sshManager": "Gerenciador SSH", - "cannotSplitTab": "Não é possível dividir esta aba", + "cannotSplitTab": "Não é possível dividir esta guia", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", "copyPassword": "Copiar Senha", - "copySudoPassword": "Copiar Senha do Sudo", - "passwordCopied": "Senha copiada para área de transferência", - "noPasswordAvailable": "Nenhuma senha disponível", - "failedToCopyPassword": "Falha ao copiar a senha", - "refreshTab": "Atualizar conexão", - "openFileManager": "Abrir Gerenciador de Arquivos", - "dashboard": "Painel", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Abrir o Gerenciador de Arquivos", + "dashboard": "Dashboard", "networkGraph": "Gráfico da Rede", - "quickConnect": "Conexão rápida", - "sshTools": "Ferramentas SSH", - "history": "Histórico", - "hosts": "Anfitriões", - "snippets": "Trechos", - "hostManager": "Gerenciador de Host", - "credentials": "Credenciais", + "tmuxMonitor": "Monitor Tmux", + "quickConnect": "Conexão Rápida", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Conexões", - "roleAdministrator": "Administrador", - "roleUser": "Usuário" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Anfitriões", - "noHosts": "Nenhum host SSH", - "retry": "Repetir", - "refresh": "atualizar", - "optional": "Opcional", - "downloadSample": "Baixar Exemplo", - "failedToDeleteHost": "Falha ao excluir {{name}}", - "importSkipExisting": "Importar (ignorar existente)", - "connectionDetails": "Detalhes da conexão", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Tentar novamente", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Computador Remoto", - "port": "Porta", - "username": "Usuário:", - "folder": "pasta", - "tags": "Etiquetas", - "pin": "PIN", - "addHost": "Adicionar Host", - "editHost": "Editar Host", - "cloneHost": "Clonar Host", - "enableTerminal": "Ativar Terminal", - "enableTunnel": "Ativar Túnel", - "enableFileManager": "Ativar Gerenciador de Arquivos", - "enableDocker": "Ativar Docker", - "defaultPath": "Caminho Padrão", - "connection": "Ligação", - "upload": "Transferir", - "authentication": "Autenticação", - "password": "Palavra-passe", - "key": "Chave", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Senha", + "key": "Key", "credential": "Credencial", - "none": "Nenhuma", - "sshPrivateKey": "Chave privada SSH", - "keyType": "Tipo de chave", - "uploadFile": "Enviar Arquivo", - "tabGeneral": "Gerais", + "none": "Nenhum", + "sshPrivateKey": "Chave Privada SSH", + "keyType": "Tipo de Chave", + "uploadFile": "Enviar arquivo", + "tabGeneral": "Geral", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", "tabTunnels": "Túneis", - "tabDocker": "Atracador", - "tabFiles": "arquivos", - "tabStats": "Estatísticas", + "tabDocker": "Docker", + "tabFiles": "Arquivos", + "tabStats": "Métricas do Host", + "tabHostMetrics": "Métricas do Host", "tabTelnet": "Telnet", "tabSharing": "Compartilhando", "tabAuthentication": "Autenticação", "terminal": "Terminal", "tunnel": "Túnel", "fileManager": "Gerenciador de Arquivos", - "serverStats": "Estatísticas do servidor", - "status": "SItuação", + "serverStats": "Métricas do Host", + "status": "Status", "folderRenamed": "Pasta \"{{oldName}}\" renomeada para \"{{newName}}\" com sucesso", "failedToRenameFolder": "Falha ao renomear pasta", - "movedToFolder": "Movido para \"{{folder}}\"", + "movedToFolder": "{{count}} Hosts movido(s) para \"{{folder}}\"", "editHostTooltip": "Editar host", "statusChecks": "Verificações de Status", "metricsCollection": "Coleção de Métricas", - "metricsInterval": "Intervalo de Coleção de Métricas", + "metricsInterval": "Intervalo de coleta de métricas", "metricsIntervalDesc": "Com que frequência coletar estatísticas do servidor (5s - 1h)", "behavior": "Comportamento", - "themePreview": "Pré-visualização do tema", + "themePreview": "Preview do Tema", "theme": "Tema", - "fontFamily": "Família de fonte", - "fontSize": "Font Size", - "letterSpacing": "Espaçamento das letras", - "lineHeight": "Altura da linha", - "cursorStyle": "Estilo do cursor", - "cursorBlink": "Pisca do Cursor", - "scrollbackBuffer": "Buffer de rolagem", - "bellStyle": "Estilo do sino", - "rightClickSelectsWord": "Clique com botão direito seleciona Palavra", + "fontFamily": "Família de Fontes", + "fontSize": "Tamanho da Fonte", + "letterSpacing": "Espaçamento entre Letras", + "lineHeight": "Altura da Linha", + "cursorStyle": "Estilo do Cursor", + "cursorBlink": "Piscar cursor", + "scrollbackBuffer": "Buffer de Rolagem", + "bellStyle": "Estilo do Sino", + "rightClickSelectsWord": "Clique com botão direito seleciona a palavra", "fastScrollModifier": "Modificador de rolagem rápido", "fastScrollSensitivity": "Sensibilidade de rolagem rápida", - "sshAgentForwarding": "Encaminhamento de agente SSH", + "sshAgentForwarding": "Encaminhamento de Agente SSH", "backspaceMode": "Modo Backspace", - "startupSnippet": "Trecho de Inicialização", + "startupSnippet": "Snippet Inicial", "selectSnippet": "Selecionar snippet", - "forceKeyboardInteractive": "Forçar teclado interativo", - "overrideCredentialUsername": "Substituir o nome de usuário credencial", - "overrideCredentialUsernameDesc": "Use o nome de usuário especificado acima ao invés do nome de usuário da credencial", - "jumpHostChain": "Corrente de Host Salto", - "portKnocking": "Knocking de Porta", + "forceKeyboardInteractive": "Forçar Teclado Interativo", + "overrideCredentialUsername": "Substituir nome de usuário da credencial", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", "addKnock": "Adicionar Porta", - "addProxyNode": "Adicionar node", - "proxyNode": "Nó Proxy", - "proxyType": "Tipo de proxy", - "quickActions": "Ações rápidas", + "addProxyNode": "Adicionar Nó", + "proxyNode": "Nó de Proxy", + "proxyType": "Tipo de Proxy", + "quickActions": "Ações Rápidas", "sudoPasswordAutoFill": "Auto-preenchimento de Senha Sudo", "sudoPassword": "Senha Sudo", - "keepaliveInterval": "Intervalo de Mantícora (ms)", + "keepaliveInterval": "Keepalive Interval (ms)", "moshCommand": "Comando MOSH", "environmentVariables": "Variáveis de Ambiente", "addVariable": "Adicionar Variável", - "docker": "Atracador", + "docker": "Docker", "copyTerminalUrl": "Copiar URL do Terminal", "copyFileManagerUrl": "Copiar URL do Gerenciador de Arquivos", "copyRemoteDesktopUrl": "Copiar URL do Desktop Remoto", - "failedToConnect": "Falha ao conectar ao console", + "failedToConnect": "Falha ao conectar com o console", "connect": "Conectar", "disconnect": "Desconectar", "start": "Iniciar", - "enableStatusCheck": "Ativar verificação de status", - "enableMetrics": "Habilitar métricas", - "bulkUpdateFailed": "Atualização em massa falhou", - "selectAll": "Selecionar Todos", + "enableStatusCheck": "Ativar Verificador de Status", + "enableMetrics": "Habilitar Métricas", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Selecionar Tudo", "deselectAll": "Desmarcar Todos", - "protocols": "Protocols", - "secureShell": "Projétil Seguro", + "protocols": "Protocolos", + "secureShell": "Shell Seguro", "virtualNetwork": "Rede Virtual", - "unencryptedShell": "shell não criptografado", + "unencryptedShell": "Shell não criptografado", "addressIp": "Endereço / IP", "friendlyName": "Nome Amigável", - "folderAndAdvanced": "Pasta & Avançada", - "privateNotes": "Notas do trabalho", + "macAddress": "Endereço MAC", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Pasta & Avançado", + "privateNotes": "Notas Privadas", "privateNotesPlaceholder": "Detalhes sobre este servidor...", - "pinToTop": "Fixar no topo", - "pinToTopDesc": "Sempre mostrar este host no topo da lista", - "portKnockingSequence": "Sequência de Portas Knocking", - "addKnockBtn": "Adicionar toco", - "noPortKnocking": "Nenhuma porta ativa configurada.", - "knockPort": "Porta do Knock", - "protocol": "Protocol", - "delayAfterMs": "Atraso após (ms)", - "useSocks5Proxy": "Usar Proxy SOCKS5", - "useSocks5ProxyDesc": "Conexão de rota através de um servidor proxy", - "proxyHost": "Servidor de Proxy", - "proxyPort": "Porta do Proxy", - "proxyUsername": "Usuário do Proxy", + "pinToTop": "Fixar no Topo", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protocolo", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Nome de Usuário do Proxy", "proxyPassword": "Senha do Proxy", "proxySingleMode": "Proxy Único", "proxyChainMode": "Corrente de Proxy", - "you": "Tu", - "jumpHostChainLabel": "Corrente de Host Salto", + "you": "Você", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Adicionar Salto", "noJumpHosts": "Nenhum host de salto configurado.", "selectAServer": "Selecione um servidor...", "sshPort": "Porta SSH", "authMethod": "Método de Autenticação", - "storedCredential": "Credenciais armazenadas", + "storedCredential": "Credencial Armazenado", "selectACredential": "Selecione uma credencial...", - "keyTypeLabel": "Tipo de chave", - "keyTypeAuto": "Detecção automática", + "keyTypeLabel": "Tipo de Chave", + "keyTypeAuto": "Detecção Automática", "keyPasteTab": "Colar", - "keyUploadTab": "Transferir", + "keyUploadTab": "Fazer upload", "keyFileLoaded": "Arquivo de chave carregado", "keyUploadClick": "Clique para enviar .pem / .key / .ppk", "clearKey": "Limpar Chave", "keySaved": "Chave SSH salva", - "keyReplaceNotice": "colar uma nova chave abaixo para substituí-la", - "keyPassphraseSaved": "Senha salva, digite a mudar", + "keyReplaceNotice": "cole uma nova chave abaixo para substituí-la", + "keyPassphraseSaved": "Passphrase salva, digite para mudar", "replaceKey": "Substituir chave", - "forceKeyboardInteractiveLabel": "Forçar teclado interativo", + "docsLink": "Documentação", + "opksshLabel": "OPKSSH", + "opksshDesc": "Acesse este host usando seu provedor de identidade em vez de uma senha ou chave. Requer que o OPKSSH esteja configurado no servidor.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Selecionar dispositivo Tailscale", + "tailscaleDeviceSelectPlaceholder": "Selecione um dispositivo...", + "tailscaleNoApiKey": "Nenhuma chave de API Tailscale configurada. Adicione uma nas configurações do Admin para habilitar a descoberta do dispositivo.", + "tailscaleDocsLink": "Documentação", + "tailscaleLoadingDevices": "Carregando dispositivos...", + "tailscaleNoDevices": "Nenhum dispositivo encontrado na sua rede tail.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Forçar Teclado Interativo", "forceKeyboardInteractiveShortDesc": "Forçar entrada de senha manual, mesmo se chaves estiverem presentes", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Aparência do Terminal", - "colorTheme": "Tema de Cor", - "fontFamilyLabel": "Família de fonte", - "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Estilo do cursor", + "colorTheme": "Tema de cores", + "fontFamilyLabel": "Família da Fonte", + "fontSizeLabel": "Tamanho da Fonte", + "cursorStyleLabel": "Estilo do Cursor", "letterSpacingPx": "Espaçamento das letras (px)", - "lineHeightLabel": "Altura da linha", - "bellStyleLabel": "Estilo do sino", + "lineHeightLabel": "Altura da Linha", + "bellStyleLabel": "Estilo do Sino", "backspaceModeLabel": "Modo Backspace", - "cursorBlinking": "Piscar cursor", + "cursorBlinking": "Cursor Piscando", "cursorBlinkingDesc": "Ativar animação piscante para o cursor do terminal", - "rightClickSelectsWordLabel": "Clique com botão direito seleciona Palavra", + "rightClickSelectsWordLabel": "Clique com botão direito seleciona a palavra", "rightClickSelectsWordShortDesc": "Selecione a palavra no botão direito do mouse", - "behaviorAndAdvanced": "Comportamento & Avançado", - "scrollbackBufferLabel": "Buffer de rolagem", - "scrollbackMaxLines": "Número máximo de linhas mantidas no histórico", - "sshAgentForwardingLabel": "Encaminhamento de agente SSH", - "sshAgentForwardingShortDesc": "Passe suas chaves SSH locais para este host", - "enableAutoMosh": "Habilitar Mosh Automático", - "enableAutoMoshDesc": "Prefere Mosh por SSH se disponível", - "enableAutoTmux": "Ativar Tmux Automático", - "enableAutoTmuxDesc": "Iniciar ou anexar automaticamente à sessão tmux", - "sudoPasswordAutoFillLabel": "Auto-preenchimento de Senha Sudo", - "sudoPasswordAutoFillShortDesc": "Automaticamente fornecer senha sudo quando solicitado", - "sudoPasswordLabel": "Senha Sudo", - "environmentVariablesLabel": "Variáveis de Ambiente", - "addVariableBtn": "Adicionar Variável", - "noEnvVars": "Nenhuma variável de ambiente configurada.", - "fastScrollModifierLabel": "Modificador de rolagem rápido", - "fastScrollSensitivityLabel": "Sensibilidade de rolagem rápida", - "moshCommandLabel": "Comando Mosh", - "startupSnippetLabel": "Trecho de Inicialização", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Destaque de sintaxe", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Intervalo de Keepalive (segundos)", - "maxKeepaliveMisses": "Máximo de Perdas Keepalive", - "tunnelSettings": "Configurações de túnel", - "enableTunneling": "Ativar Túnel", - "enableTunnelingDesc": "Ativar a funcionalidade de túnel SSH para esse host", - "serverTunnelsSection": "Túneis do servidor", - "addTunnelBtn": "Adicionar túnel", - "noTunnelsConfigured": "Nenhum túnel configurado.", - "tunnelLabel": "Túnel {{number}}", - "tunnelType": "Tipo de túnel", - "tunnelModeLocalDesc": "Encaminhar uma porta local para uma porta no servidor remoto (ou um host acessível a partir da).", - "tunnelModeRemoteDesc": "Encaminha uma porta no servidor remoto de volta para uma porta local na sua máquina.", - "tunnelModeDynamicDesc": "Crie um proxy SOCKS5 em uma porta local para encaminhamento de porta dinâmica.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Este host (túnel direto)", - "endpointHost": "Host de Endpoint", - "endpointPort": "Porta de Endpoint", - "bindHost": "Vincular Host", - "sourcePort": "Porta de origem", - "maxRetries": "Máximo de buscas", - "retryIntervalS": "Intervalo de Repetir", - "autoStartLabel": "Auto-iniciar", - "autoStartDesc": "Conectar automaticamente este túnel quando o host é carregado", - "tunnelConnecting": "Túnel conectando...", - "tunnelDisconnected": "Túnel desconectado", - "failedToConnectTunnel": "Falha ao conectar", - "failedToDisconnectTunnel": "Falha ao desconectar", - "dockerIntegration": "Integração Docker", - "enableDockerMonitor": "Ativar Docker", - "enableDockerMonitorDesc": "Monitorar e gerenciar contêineres neste host via Docker", - "enableFileManagerMonitor": "Ativar Gerenciador de Arquivos", - "enableFileManagerMonitorDesc": "Navegue e gerencie arquivos neste host através do SFTP", - "defaultPathLabel": "Caminho Padrão", - "fileManagerPathHint": "O diretório a abrir quando o gerenciador de arquivos é aberto para este host.", - "statusChecksLabel": "Verificações de Status", - "enableStatusChecks": "Habilitar Verificação de Status", - "enableStatusChecksDesc": "Periodicamente ping este host para verificar a disponibilidade", - "useGlobalInterval": "Usar Intervalo Global", - "useGlobalIntervalDesc": "Substituir com o intervalo de verificação de status de todo o servidor", - "checkIntervalS": "Intervalo de verificação", - "checkIntervalDesc": "Segundos entre cada ping de conectividade", - "metricsCollectionLabel": "Coleção de Métricas", - "enableMetricsLabel": "Habilitar métricas", - "enableMetricsDesc": "Coletar CPU, RAM, disco e uso de rede deste host", - "useGlobalMetrics": "Usar Intervalo Global", - "useGlobalMetricsDesc": "Sobrescrever com o intervalo de métricas para o servidor", - "metricsIntervalS": "Intervalo de Métricas", - "metricsIntervalDesc2": "Segundos entre snapshots métricos", - "visibleWidgets": "Widgets visíveis", - "cpuUsageLabel": "Uso da CPU", - "cpuUsageDesc": "CPU por cento, carregar médias de carga, gráfico de linha", - "memoryLabel": "Memória Utilizada", - "memoryDesc": "Uso de RAM, troque, em cache", - "storageLabel": "Uso do disco", - "storageDesc": "Uso do disco por ponto de montagem", - "networkLabel": "Interfaces de Rede", - "networkDesc": "Lista de interface e banda", - "uptimeLabel": "Tempo em atividade", - "uptimeDesc": "Tempo de atividade e inicialização do sistema", - "systemInfoLabel": "Informações do Sistema", - "systemInfoDesc": "OS, kernel, hostname, arquitetura", - "recentLoginsLabel": "Logins recentes", - "recentLoginsDesc": "Eventos bem-sucedidos e falhados de login", - "topProcessesLabel": "Processos mais Populares", - "topProcessesDesc": "PID, CPU%, MEM%, comando", - "listeningPortsLabel": "Porta de Escuta", - "listeningPortsDesc": "Abrir portas com processo e estado", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Senha", + "authTypeKey": "Chave SSH", + "authTypeCredential": "Credencial", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Nenhum", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, status do SELinux", - "quickActionsLabel": "Ações rápidas", - "quickActionsToolbar": "Ações rápidas aparecem como botões na barra de estatísticas do servidor para execução de comando com um clique.", - "noQuickActions": "Nenhuma ação rápida ainda.", - "buttonLabel": "Rótulo do botão", - "selectSnippetPlaceholder": "Selecionar snippet...", - "addActionBtn": "Adicionar ação", - "hostSharedSuccessfully": "Hospedeiro compartilhado com sucesso", - "failedToShareHost": "Falha ao compartilhar host", - "accessRevoked": "Acesso revogado", - "failedToRevokeAccess": "Falha ao revogar acesso", - "cancelBtn": "cancelar", - "savingBtn": "Salvando...", - "addHostBtn": "Adicionar Host", - "hostUpdated": "Servidor atualizado", - "hostCreated": "Host criado", - "failedToSave": "Falha ao salvar o host", - "credentialUpdated": "Credencial atualizada", - "credentialCreated": "Credencial criada", - "failedToSaveCredential": "Falha ao salvar credencial", - "backToHosts": "Voltar aos hosts", - "backToCredentials": "Voltar às Credenciais", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancelar", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Fixado", - "noHostsFound": "Nenhum host encontrado", - "tryDifferentTerm": "Tente um termo diferente", - "addFirstHost": "Adicione o seu primeiro host para começar", - "noCredentialsFound": "Nenhuma credencial encontrada", - "addCredentialBtn": "Adicionar Credencial", - "updateCredentialBtn": "Atualizar Credencial", - "features": "Funcionalidades", - "noFolder": "(Sem pasta)", - "deleteSelected": "excluir", - "exitSelection": "Sair da seleção", - "importSkip": "Importar (ignorar existente)", - "importOverwrite": "Importação (sobrescrever)", - "collapseBtn": "Recolher", - "importExportBtn": "Importar / Exportar", - "hostStatusesRefreshed": "Status do host atualizados", - "failedToRefreshHosts": "Falha ao atualizar hosts", - "movedHostTo": "Mudou {{host}} para \"{{folder}}\"", - "failedToMoveHost": "Falha ao mover host", - "folderRenamedTo": "Pasta renomeada para \"{{name}}\"", - "deletedFolder": "Pasta apagada \"{{name}}\"", - "failedToDeleteFolder": "Falha ao excluir pasta", - "deleteAllInFolder": "Excluir todos os hosts em \"{{name}}\"? Isso não pode ser desfeito.", - "deletedHost": "{{name}} Excluído", - "copiedToClipboard": "Copiado para o clipboard", - "terminalUrlCopied": "URL do terminal copiado", - "fileManagerUrlCopied": "URL do Gerenciador de Arquivos copiado", - "tunnelUrlCopied": "URL do túnel copiado", - "dockerUrlCopied": "URL Docker copiado", - "serverStatsUrlCopied": "URL das estatísticas do servidor copiado", - "rdpUrlCopied": "URL RDP copiada", - "vncUrlCopied": "URL VNC copiada", - "telnetUrlCopied": "URL da rede copiada", - "remoteDesktopUrlCopied": "URL da área de trabalho remoto copiada", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Características", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancelar", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocolo", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Expandir ações", "collapseActions": "Ações de recolhimento", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Pacote mágico enviado para {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Falha ao enviar o pacote mágico", - "cloneHostAction": "Clonar Host", - "copyAddress": "Copiar Endereço", - "copyLink": "Copiar link", - "copyTerminalUrlAction": "Copiar URL do Terminal", - "copyFileManagerUrlAction": "Copiar URL do Gerenciador de Arquivos", - "copyTunnelUrlAction": "Copiar URL do túnel", - "copyDockerUrlAction": "Copiar URL do Docker", - "copyServerStatsUrlAction": "Copiar URL das Estatísticas do Servidor", - "copyRdpUrlAction": "Copiar URL do RDP", - "copyVncUrlAction": "Copiar URL do VNC", - "copyTelnetUrlAction": "Copiar URL da Telnet", - "copyRemoteDesktopUrlAction": "Copiar URL do Desktop Remoto", - "deleteCredentialConfirm": "Excluir credencial \"{{name}}\"?", - "deletedCredential": "{{name}} Excluído", - "deploySSHKeyTitle": "Chave SSH de deploy", - "deployingBtn": "Implementando...", - "deployBtn": "Implantar", - "failedToDeployKey": "Falha ao publicar chave", - "deleteHostsConfirm": "Excluir o host {{count}}{{plural}}? Isso não pode ser desfeito.", - "movedToRoot": "Movido para a raiz", - "failedToMoveHosts": "Falha ao mover hosts", - "enableTerminalFeature": "Ativar Terminal", - "disableTerminalFeature": "Desativar Terminal", - "enableFilesFeature": "Habilitar arquivos", - "disableFilesFeature": "Desabilitar Arquivos", - "enableTunnelsFeature": "Ativar túneis", - "disableTunnelsFeature": "Desativar Túneis", - "enableDockerFeature": "Ativar Docker", - "disableDockerFeature": "Desativar Docker", - "addTagsPlaceholder": "Adicionar tags...", - "authDetails": "Detalhes de autenticação", - "credType": "tipo", - "generateKeyPairDesc": "Gerar um novo par de chaves, chaves privadas e públicas serão preenchidas automaticamente.", - "generatingKey": "Gerando...", - "generateLabel": "Gerar {{label}}", - "uploadFileBtn": "Upload de arquivo", - "keyPassphraseOptional": "Senha Chave (Opcional)", - "sshPublicKeyOptional": "Chave Pública SSH (Opcional)", - "publicKeyGenerated": "Chave pública gerada", - "failedToGeneratePublicKey": "Falha ao derivar chave pública", - "publicKeyCopied": "Chave pública copiada", - "keyPairGenerated": "Um par de chaves {{label}} gerado", - "failedToGenerateKeyPair": "Falha ao gerar o par de chaves", - "searchHostsPlaceholder": "Pesquisar hospedeiros, endereços, etiquetas…", - "searchCredentialsPlaceholder": "Pesquisar credenciais…", - "refreshBtn": "atualizar", - "addTag": "Adicionar tags...", - "deleteConfirmBtn": "excluir", - "tunnelRequirementsText": "O servidor SSH deve ter GatewayPorts sim, AllowTcpForwarding yes, e permitRootLogin yes definido em /etc/ssh/sshd_config.", - "deleteHostConfirm": "Excluir \"{{name}}\"?", - "enableAtLeastOneProtocol": "Ative pelo menos um protocolo acima para configurar as configurações de autenticação e conexão.", - "keyPassphrase": "Senha Chave", - "connectBtn": "Conectar", - "disconnectBtn": "Desconectar", - "basicInformation": "Informações Básicas", - "authDetailsSection": "Detalhes de autenticação", - "credTypeLabel": "tipo", - "hostsTab": "Anfitriões", - "credentialsTab": "Credenciais", - "selectMultiple": "Selecionar múltiplos", - "selectHosts": "Selecionar hosts", - "connectionLabel": "Ligação", - "authenticationLabel": "Autenticação", - "generateKeyPairTitle": "Gerar par de chaves", - "generateKeyPairDescription": "Gerar um novo par de chaves, chaves privadas e públicas serão preenchidas automaticamente.", - "generateFromPrivateKey": "Gerar a partir da Chave Privada", - "refreshBtn2": "atualizar", - "exitSelectionTitle": "Sair da seleção", - "exportAll": "Exportar tudo", - "addHostBtn2": "Adicionar Host", - "addCredentialBtn2": "Adicionar Credencial", - "checkingHostStatuses": "Verificando status do host...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Fixado", - "hostsExported": "Hosts exportados com sucesso", + "hostsExported": "Hosts exported successfully", "exportFailed": "Falha ao exportar hosts", - "sampleDownloaded": "Exemplo de arquivo baixado", - "failedToDeleteCredential2": "Falha ao excluir credencial", - "noFolderOption": "(Sem pasta)", - "nSelected": "{{count}} selecionado", - "featuresMenu": "Funcionalidades", - "moveMenu": "Mover-se", - "cancelSelection": "cancelar", - "deployDialogDesc": "Implantar {{name}} em um host authorized_keys.", - "targetHostLabel": "Host de destino", - "selectHostOption": "Selecione um host...", - "keyDeployedSuccess": "Chave implantada com sucesso", - "failedToDeployKey2": "Falha ao publicar chave", - "deletedCount": "Hosts {{count}} excluídos", - "failedToDeleteCount": "Falha ao excluir hosts {{count}}", - "duplicatedHost": "Duplicado \"{{name}}\"", - "failedToDuplicateHost": "Falha ao duplicar host", - "updatedCount": "Hosts {{count}} atualizados", - "friendlyNameLabel": "Nome Amigável", - "descriptionLabel": "Descrição:", - "loadingHost": "Carregando host...", - "loadingHosts": "Carregando hosts...", - "loadingCredentials": "Carregando credenciais...", - "noHostsYet": "Nenhum host ainda", - "noHostsMatchSearch": "Nenhum host corresponde à sua pesquisa", - "hostNotFound": "Host não encontrado", - "searchHosts": "Procurar hosts...", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Características", + "moveMenu": "Mover", + "connectSelected": "Connect", + "cancelSelection": "Cancelar", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Classificar hosts", "sortDefault": "Ordem padrão", "sortNameAsc": "Nome (A → Z)", @@ -605,192 +770,207 @@ "filterFeatureFileManager": "Gerenciador de arquivos", "filterFeatureTunnel": "Túnel", "filterFeatureDocker": "Docker", - "filterTagsGroup": "Etiquetas", - "shareHost": "Host de compartilhamento", - "shareHostTitle": "Compartilhar: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Este host deve usar uma credencial para permitir o compartilhamento. Edite o host e atribua uma credencial primeiro." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Ligação", - "authentication": "Autenticação", - "connectionSettings": "Configurações de conexão", - "displaySettings": "Configurações de exibição", - "audioSettings": "Configurações de Áudio", - "rdpPerformance": "Desempenho RDP", - "deviceRedirection": "Redirecionamento do dispositivo", - "session": "Sessão", - "gateway": "Desvio", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credencial", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Área", - "sessionRecording": "Gravação de Sessão", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Configurações do VNC", - "terminalSettings": "Configurações do Terminal", - "rdpPort": "Porta RDP", - "username": "Usuário:", - "password": "Palavra-passe", - "domain": "Domínio", - "securityMode": "Modo de Segurança", - "colorDepth": "Profundidade da Cor", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", + "password": "Senha", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Altura", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Método de Redimensionar", - "clientName": "Nome do Cliente", - "initialProgram": "Programa inicial", - "serverLayout": "Layout do Servidor", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Porta do Gateway", - "gatewayUsername": "Usuário do Gateway", - "gatewayPassword": "Senha do Gateway", - "gatewayDomain": "Domínio de Gateway", - "remoteAppProgram": "Programa RemoteApp", - "workingDirectory": "Diretório de trabalho", - "arguments": "Parâmetros", - "normalizeLineEndings": "Normalizar Extensões de Linha", - "recordingPath": "Caminho de gravação", - "recordingName": "Nome da gravação", - "macAddress": "Endereço MAC", - "broadcastAddress": "Endereço de Transmissão", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Tempo de Espera", - "driveName": "Nome da unidade", - "drivePath": "Caminho do Drive", - "ignoreCertificate": "Ignorar Certificado", - "ignoreCertificateDesc": "Permitir conexões para hosts com certificados auto-assinados", - "forceLossless": "Forçar perda", - "forceLosslessDesc": "Forçar codificação de imagens sem perdas (maior qualidade, mais largura de banda)", - "disableAudio": "Desativar Áudio", - "disableAudioDesc": "Silenciar todo o áudio da sessão remota", - "enableAudioInput": "Habilitar Entrada de Áudio (Microfone)", - "enableAudioInputDesc": "Encaminhar o microfone local para a sessão remota", - "wallpaper": "Plano de fundo", - "wallpaperDesc": "Mostrar plano de fundo da área de trabalho (desabilitar melhora o desempenho)", - "theming": "Temas", - "themingDesc": "Ativar temas e estilos visuais", - "fontSmoothing": "Suavização da Fonte", - "fontSmoothingDesc": "Habilitar renderização de fonte ClearType", - "fullWindowDrag": "Arrastar a janela completa", - "fullWindowDragDesc": "Mostrar conteúdo da janela ao arrastar", - "desktopComposition": "Composição da mesa", - "desktopCompositionDesc": "Habilitar efeitos de vidro Aero", - "menuAnimations": "Animações do menu", - "menuAnimationsDesc": "Ativar animações de deslize e deslize do menu", - "disableBitmapCaching": "Desabilitar Cache Bitmap", - "disableBitmapCachingDesc": "Desativar o cache do bitmap (pode ajudar com glitches)", - "disableOffscreenCaching": "Desativar Cache Offscreen", - "disableOffscreenCachingDesc": "Desativar cache de tela desligada", - "disableGlyphCaching": "Desativar Cache Glyph", - "disableGlyphCachingDesc": "Desligar cache glifo", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Usar RemoteFX pipeline graphics", - "enablePrinting": "Ativar impressão", - "enablePrintingDesc": "Redirecionar impressoras locais para a sessão remota", - "enableDriveRedirection": "Habilitar redirecionamento de unidade", - "enableDriveRedirectionDesc": "Mapear uma pasta local como um drive na sessão remota", - "createDrivePath": "Criar caminho de unidade", - "createDrivePathDesc": "Criar automaticamente a pasta se ela não existir", - "disableDownload": "Desativar download", - "disableDownloadDesc": "Impedir o download de arquivos da sessão remota", - "disableUpload": "Desabilitar Upload", - "disableUploadDesc": "Evitar o envio de arquivos para a sessão remota", - "enableTouch": "Ativar Touch", - "enableTouchDesc": "Ativar encaminhamento de entrada de toque", - "consoleSession": "Sessão de Console", - "consoleSessionDesc": "Conectar ao console (sessão 0) em vez de uma nova sessão", - "sendWolPacket": "Enviar Pacote WOL", - "sendWolPacketDesc": "Envie um pacote mágico para acordar este host antes de conectar", - "disableCopy": "Desativar Cópia", - "disableCopyDesc": "Impedir a cópia de texto da sessão remota", - "disablePaste": "Desativar Colar", - "disablePasteDesc": "Impedir colar texto na sessão remota", - "createPathIfMissing": "Criar caminho se estiver faltando", - "createPathIfMissingDesc": "Criar automaticamente o diretório de gravação", - "excludeOutput": "Excluir saída", - "excludeOutputDesc": "Não gravar a saída da tela (apenas metadados)", - "excludeMouse": "Excluir mouse", - "excludeMouseDesc": "Não grave os movimentos do mouse", - "includeKeystrokes": "Incluir Teclas Pressionadas", - "includeKeystrokesDesc": "Gravar teclas rasteiras brutas além da saída da tela", - "vncPort": "Porta VNC", - "vncPassword": "Senha VNC", - "vncUsernameOptional": "Nome de usuário (opcional)", - "vncLeaveBlank": "Deixe em branco se não necessário", - "cursorMode": "Modo Cursor", - "swapRedBlue": "Trocar Vermelho/Azul", - "swapRedBlueDesc": "Troque os canais de cor vermelho e azul (corrige alguns problemas de cor)", - "readOnly": "Somente leitura", - "readOnlyDesc": "Ver a tela remota sem enviar qualquer entrada", - "telnetPort": "Porta de Telnet", - "terminalType": "Tipo de Terminal", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Esquema de Cor", - "backspaceKey": "Chave de Backspace", - "saveHostFirst": "Salve o host primeiro.", - "sharingOptionsAfterSave": "Opções de compartilhamento estão disponíveis após o host ser salvo.", - "sharingLoadError": "Não foi possível carregar os dados de compartilhamento. Verifique sua conexão e tente novamente.", - "shareHostSection": "Host de compartilhamento", - "shareWithUser": "Compartilhar com Usuário", - "shareWithRole": "Compartilhar com Função", - "selectUser": "Selecionar usuário", - "selectRole": "Selecione a função", - "selectUserOption": "Selecione um usuário...", - "selectRoleOption": "Selecione uma função...", - "permissionLevel": "Nível de permissão", - "expiresInHours": "Expira em (horas)", - "noExpiryPlaceholder": "Deixe em branco para não expirar", - "shareBtn": "Compartilhar", - "currentAccess": "Acesso atual", - "typeHeader": "tipo", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Permisschar@@0o", - "grantedByHeader": "Concedido por", - "expiresHeader": "Expira", - "noAccessEntries": "Ainda não há entradas de acesso.", - "expiredLabel": "Expirado", - "neverLabel": "nunca", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "cancelar", - "savingBtn": "Salvando...", - "updateHostBtn": "Atualizar Host", - "addHostBtn": "Adicionar Host" + "cancelBtn": "Cancelar", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Procurar por hosts, comandos ou configurações...", - "quickActions": "Ações rápidas", - "hostManager": "Gerenciador de Host", - "hostManagerDesc": "Gerenciar, adicionar ou editar hosts", - "addNewHost": "Adicionar Novo Host", - "addNewHostDesc": "Registrar um novo host", - "adminSettings": "Configurações de administrador", - "adminSettingsDesc": "Configurar preferências do sistema e usuários", - "userProfile": "Informações do Perfil", - "userProfileDesc": "Gerenciar sua conta e preferências", - "addCredential": "Adicionar Credencial", - "addCredentialDesc": "Armazenar chaves SSH ou senhas", - "recentActivity": "Atividade recente", - "serversAndHosts": "Servidores e Hosts", - "noHostsFound": "Nenhum host encontrado \"{{search}}\"", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", "links": "Links", "navigate": "Navigate", - "select": "Selecionar", - "toggleWith": "Alternar com" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Nenhuma aba atribuída", + "noTabAssigned": "No tab assigned", "focusedPane": "Painel ativo" }, "connections": { "noConnections": "Sem conexões", "noConnectionsDesc": "Abra um terminal, um gerenciador de arquivos ou uma área de trabalho remota para ver as conexões aqui.", - "connectedFor": "Conectado por {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Conectado", - "disconnected": "Desconectado", + "disconnected": "Disconnected", "closeTab": "Fechar aba", "closeConnection": "Conexão próxima", "forgetTab": "Esquecer", @@ -801,358 +981,374 @@ "sectionBackground": "Fundo", "backgroundDesc": "As sessões permanecem ativas por 30 minutos após a desconexão e podem ser reconectadas.", "persisted": "Persistiu em segundo plano", - "expiresIn": "Expira em {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Buscar conexões...", - "noSearchResults": "Nenhuma conexão corresponde à sua pesquisa." + "noSearchResults": "Nenhuma conexão corresponde à sua pesquisa.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Conectando à sessão {{type}}", - "connectionError": "Erro de conexão", - "connectionFailed": "Conexão falhou", - "failedToConnect": "Falha ao obter token de conexão", - "hostNotFound": "Host não encontrado", - "noHostSelected": "Nenhum host selecionado", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Falha na conexão", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "Reconectar", - "retry": "Repetir", - "guacdUnavailable": "Serviço de desktop remoto (guacd) não disponível. Por favor certifique-se que o guacd está sendo executado e acessível e configurado corretamente nas configurações de administração.", + "retry": "Tentar novamente", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Tela de bloqueio)", - "winKey": "Chave do Windows", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Turno", - "win": "Vitória", - "stickyActive": "{{key}} (retido - clique para liberar)", - "stickyInactive": "{{key}} (clique para travar)", - "esc": "Prosseguir", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Residencial", - "end": "Término", - "pageUp": "Página Acima", - "pageDown": "Página abaixo", - "arrowUp": "Seta para cima", - "arrowDown": "Seta para baixo", - "arrowLeft": "Seta para esquerda", - "arrowRight": "Seta para direita", - "fnToggle": "Chaves de função", - "reconnect": "Reconectar Sessão", - "collapse": "Recolher barra de ferramentas", - "expand": "Expandir barra de ferramentas", - "dragHandle": "Arraste para reposicionar" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Conectar ao Host", - "clear": "Limpar", - "paste": "Colar", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "Reconectar", - "connectionLost": "Conexão perdida", + "connectionLost": "Connection lost", "connected": "Conectado", - "clipboardWriteFailed": "Falha ao copiar para a área de transferência. Certifique-se de que a página seja servida por HTTPS ou localhost.", - "clipboardReadFailed": "Falha ao ler da área de transferência. Certifique-se de que as permissões da área de transferência foram concedidas.", - "clipboardHttpWarning": "Colar requer HTTPS. Use Ctrl+Shift+V ou sirva Termix em HTTPS.", - "unknownError": "Ocorreu um erro desconhecido", - "websocketError": "Erro de conexão WebSocket", - "connecting": "Conectandochar@@0", - "noHostSelected": "Nenhum host selecionado", - "reconnecting": "Reconectando... ({{attempt}}/{{max}})", - "reconnected": "Reconectado com sucesso", - "tmuxSessionCreated": "sessão tmux criada: {{name}}", - "tmuxSessionAttached": "sessão tmux anexada: {{name}}", - "tmuxUnavailable": "tmux não está instalado no host remoto, voltando ao shell padrão", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", "tmuxSessionPickerTitle": "tmux Sessions", - "tmuxSessionPickerDesc": "Sessões tmux existentes encontradas neste host. Selecione uma para reanexar ou criar uma nova sessão.", - "tmuxWindows": "Janelas", - "tmuxWindowCount": "{{count}} janela", - "tmuxAttached": "Clientes anexados", - "tmuxAttachedCount": "{{count}} anexou", - "tmuxLastActivity": "Última atividade", - "tmuxTimeJustNow": "neste momento", - "tmuxTimeMinutes": "{{count}}m atrás", - "tmuxTimeHours": "{{count}}h atrás", - "tmuxTimeDays": "{{count}}há alguns dias", - "tmuxCreateNew": "Iniciar nova sessão", - "tmuxCopyHint": "Ajustar seleção e pressione Enter para copiar para área de transferência", - "tmuxDetach": "Desanexar da sessão do tmux", - "tmuxDetached": "Desanexado da sessão do tmux", - "maxReconnectAttemptsReached": "Máximo de tentativas de reconexão alcançadas", - "closeTab": "FECHAR", - "connectionTimeout": "Conexão expirada", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Executando {{command}} - {{host}}", - "totpRequired": "Autenticação dupla requerida", - "totpCodeLabel": "Código de verificação", - "totpVerify": "Verificar", - "warpgateAuthRequired": "Autenticação Warpgate Necessária", - "warpgateSecurityKey": "Chave de Segurança", - "warpgateAuthUrl": "URL de autenticação", - "warpgateOpenBrowser": "Abrir no Navegador", - "warpgateContinue": "Eu concluí a autenticação", - "opksshAuthRequired": "Autenticação OPKSSH necessária", - "opksshAuthDescription": "Conclua a autenticação no seu navegador para continuar. Essa sessão permanecerá válida por 24 horas.", - "opksshOpenBrowser": "Abra o navegador para autenticar", - "opksshWaitingForAuth": "Aguardando autenticação no navegador...", - "opksshAuthenticating": "Processando autenticação...", - "opksshTimeout": "Tempo de autenticação esgotado. Por favor, tente novamente.", - "opksshAuthFailed": "Falha na autenticação. Por favor, verifique suas credenciais e tente novamente.", - "opksshSignInWith": "Entrar com {{provider}}", - "sudoPasswordPopupTitle": "Inserir senha?", - "websocketAbnormalClose": "A conexão foi fechada inesperadamente. Isso pode ser devido a um problema de configuração do proxy reverso ou SSL. Por favor, verifique os logs do servidor.", - "connectionLogTitle": "Registro de conexão", - "connectionLogCopy": "Copiar logs para área de transferência", - "connectionLogEmpty": "Ainda não há registros de conexão", - "connectionLogWaiting": "Aguardando registros de conexão...", - "connectionLogCopied": "Logs de conexão copiados para área de transferência", - "connectionLogCopyFailed": "Falha ao copiar os logs para a área de transferência", - "connectionRejected": "Conexão rejeitada pelo servidor. Verifique sua autenticação e configuração de rede.", - "hostKeyRejected": "Verificação de chave do host SSH rejeitada. Conexão cancelada.", - "sessionTakenOver": "A sessão foi aberta em outra aba. Reconectando..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Abrir", + "linkDialogCopy": "Cópia", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Aba dividida", + "addToSplit": "Adicionar à divisão", + "removeFromSplit": "Remover da divisão" + } }, "fileManager": { - "noHostSelected": "Nenhum host selecionado", - "initializingEditor": "Inicializando o editor...", - "file": "Arquivo", - "folder": "pasta", - "uploadFile": "Enviar Arquivo", - "downloadFile": "BAIXAR", - "extractArchive": "Extrair arquivo", - "extractingArchive": "Extraindo {{name}}...", - "archiveExtractedSuccessfully": "{{name}} extraído com sucesso", - "extractFailed": "Falha ao extrair", - "compressFile": "Compactar arquivo", - "compressFiles": "Compactar arquivos", - "compressFilesDesc": "Comprimir itens {{count}} em um arquivo", - "archiveName": "Nome do Arquivo", - "enterArchiveName": "Informe o nome do arquivo...", - "compressionFormat": "Formato de compressão", - "selectedFiles": "Arquivos selecionados", - "andMoreFiles": "e mais {{count}}...", - "compress": "Compactar", - "compressingFiles": "Comprimindo {{count}} itens em {{name}}...", - "filesCompressedSuccessfully": "{{name}} criado com sucesso", - "compressFailed": "Compressão falhou", - "edit": "Alterar", - "preview": "Pré-visualizar", - "previous": "Anterior", - "next": "Próximo", - "pageXOfY": "Página {{current}} de {{total}}", - "zoomOut": "Diminuir o zoom", - "zoomIn": "Aumentar zoom", - "newFile": "Novo arquivo", - "newFolder": "Adicionar uma pasta", - "rename": "Renomear", - "uploading": "Enviando...", - "uploadingFile": "Enviando {{name}}...", - "fileName": "Nome do arquivo", - "folderName": "Nome da pasta", - "fileUploadedSuccessfully": "Arquivo \"{{name}}\" carregado com sucesso", - "failedToUploadFile": "Falha ao carregar arquivo", - "fileDownloadedSuccessfully": "Arquivo \"{{name}}\" baixado com sucesso", - "failedToDownloadFile": "Não foi possível baixar o arquivo", - "fileCreatedSuccessfully": "Arquivo \"{{name}}\" criado com sucesso", - "folderCreatedSuccessfully": "Pasta \"{{name}}\" criada com sucesso", - "failedToCreateItem": "Falha ao criar item", - "operationFailed": "A operação {{operation}} falhou para {{name}}: {{error}}", - "failedToResolveSymlink": "Falha ao resolver link simbólico", - "itemsDeletedSuccessfully": "Itens {{count}} excluídos com sucesso", - "failedToDeleteItems": "Falha ao excluir itens", - "sudoPasswordRequired": "Senha do Administrador Necessária", - "enterSudoPassword": "Digite a senha sudo para continuar esta operação", - "sudoPassword": "Senha sudo", - "sudoOperationFailed": "Operação sudo falhou", - "sudoAuthFailed": "Falha na autenticação Sudo", - "dragFilesToUpload": "Solte os arquivos aqui para enviar", - "emptyFolder": "Esta pasta está vazia", - "searchFiles": "Pesquisar arquivos...", - "upload": "Transferir", - "selectHostToStart": "Selecione um host para iniciar o gerenciamento de arquivos", - "sshRequiredForFileManager": "O gerenciador de arquivos requer SSH. Este host não tem o SSH habilitado.", - "failedToConnect": "Falha ao conectar com SSH", - "failedToLoadDirectory": "Falha ao carregar diretório", - "noSSHConnection": "Nenhuma conexão SSH disponível", - "copy": "copiar", - "cut": "Recortar", - "paste": "Colar", - "copyPath": "Copiar Caminho", - "copyPaths": "Copiar caminhos", - "delete": "excluir", - "properties": "propriedades", - "refresh": "atualizar", - "downloadFiles": "Baixar arquivos {{count}} para o Navegador", - "copyFiles": "Copiar itens {{count}}", - "cutFiles": "Cortar {{count}} itens", - "deleteFiles": "Excluir {{count}} itens", - "filesCopiedToClipboard": "{{count}} itens copiados para a área de transferência", - "filesCutToClipboard": "{{count}} itens cortados na área de transferência", - "pathCopiedToClipboard": "Caminho copiado para área de transferência", - "pathsCopiedToClipboard": "{{count}} caminhos copiados para a área de transferência", - "failedToCopyPath": "Falha ao copiar caminho para área de transferência", - "movedItems": "Itens de {{count}} movidos", - "failedToDeleteItem": "Falha ao excluir item", - "itemRenamedSuccessfully": "{{type}} renomeado com sucesso", - "failedToRenameItem": "Falha ao renomear item", - "download": "BAIXAR", - "permissions": "Permissões", - "size": "Tamanho", - "modified": "Modificado", - "path": "Caminho", - "confirmDelete": "Tem certeza que deseja excluir {{name}}?", - "permissionDenied": "Permissão negada", - "serverError": "Erro no Servidor", - "fileSavedSuccessfully": "Arquivo salvo com sucesso", - "failedToSaveFile": "Falha ao salvar arquivo", - "confirmDeleteSingleItem": "Tem certeza de que quer apagar permanentemente \"{{name}}\"?", - "confirmDeleteMultipleItems": "Tem certeza de que deseja excluir permanentemente itens {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Tem certeza de que deseja excluir permanentemente itens {{count}} ? Isso inclui pastas e seu conteúdo.", - "confirmDeleteFolder": "Tem certeza de que deseja excluir permanentemente a pasta \"{{name}}\" e todo o seu conteúdo?", - "permanentDeleteWarning": "Esta ação não pode ser desfeita. O(s) item(ns) serão excluídos permanentemente do servidor.", - "recent": "Recente", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Cópia", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Fixado", - "folderShortcuts": "Atalhos da pasta", - "failedToReconnectSSH": "Falha ao reconectar a sessão SSH", - "openTerminalHere": "Abrir Terminal Aqui", - "run": "Executar", - "openTerminalInFolder": "Abrir Terminal nesta Pasta", - "openTerminalInFileLocation": "Abrir Terminal no Local do Arquivo", - "runningFile": "Executando - {{file}}", - "onlyRunExecutableFiles": "Só é possível executar arquivos executáveis", - "directories": "Diretórios", - "removedFromRecentFiles": "Removido \"{{name}}\" dos arquivos recentes", - "removeFailed": "Falha ao remover", - "unpinnedSuccessfully": "\"{{name}}desafixado\" com sucesso", - "unpinFailed": "Desafixar falhou", - "removedShortcut": "Atalho \"{{name}} removido \"", - "removeShortcutFailed": "Falha ao remover atalho", - "clearedAllRecentFiles": "Todos os arquivos recentes foram removidos", - "clearFailed": "Falha ao apagar", - "removeFromRecentFiles": "Remover dos arquivos recentes", - "clearAllRecentFiles": "Limpar todos os arquivos recentes", - "unpinFile": "Desafixar arquivo", - "removeShortcut": "Remover atalho", - "pinFile": "Fixar arquivo", - "addToShortcuts": "Adicionar a atalhos", - "pasteFailed": "A colagem falhou", - "noUndoableActions": "Nenhuma ação irreversível", - "undoCopySuccess": "Operação de cópia desfeita: {{count}} excluídos arquivos copiados", - "undoCopyFailedDelete": "Desfazer falhou: Não foi possível excluir nenhum arquivo copiado", - "undoCopyFailedNoInfo": "Desfazer falhou: Não foi possível encontrar informações do arquivo copiado", - "undoMoveSuccess": "Operação movida desfeita: arquivos {{count}} movidos de volta para o local original", - "undoMoveFailedMove": "Desfazer falhou: Não foi possível mover nenhum arquivo de volta", - "undoMoveFailedNoInfo": "Desfazer falhou: Não foi possível encontrar informação de arquivo movido", - "undoDeleteNotSupported": "Operação de exclusão não pode ser desfeita: Os arquivos foram excluídos permanentemente do servidor", - "undoTypeNotSupported": "Tipo de operação desfazer não suportado", - "undoOperationFailed": "Falha na operação", - "unknownError": "Erro desconhecido", - "confirm": "Confirmar", - "find": "Localizar...", - "replace": "Substituir", - "downloadInstead": "Em vez disso, baixar", - "keyboardShortcuts": "Atalhos do teclado", - "searchAndReplace": "Pesquisar e substituir", - "editing": "Editando", - "search": "Pesquisa", - "findNext": "Localizar Próximo", - "findPrevious": "Localizar Anterior", - "save": "Guardar", - "selectAll": "Selecionar Todos", - "undo": "Desfazer", - "redo": "Refazer", - "moveLineUp": "Mover Linha para Cima", - "moveLineDown": "Mover Linha para Baixo", - "toggleComment": "Alternar comentário", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Correr", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Não foi possível carregar a imagem", - "startTyping": "Comece a digitar...", - "unknownSize": "Tamanho desconhecido", - "fileIsEmpty": "O arquivo está vazio", - "largeFileWarning": "Aviso de arquivo grande", - "largeFileWarningDesc": "Este arquivo tem o tamanho {{size}} , o que pode causar problemas de desempenho quando aberto como texto.", - "fileNotFoundAndRemoved": "O arquivo \"{{name}}\" não foi encontrado e foi removido dos arquivos recentes/fixados", - "failedToLoadFile": "Falha ao carregar arquivo: {{error}}", - "serverErrorOccurred": "Ocorreu um erro no servidor. Tente novamente mais tarde.", - "autoSaveFailed": "Auto-salvamento falhou", - "fileAutoSaved": "Arquivo salvo automaticamente", - "moveFileFailed": "Falha ao mover {{name}}", - "moveOperationFailed": "Falha ao mover", - "canOnlyCompareFiles": "Só é possível comparar dois arquivos", - "comparingFiles": "Comparando arquivos: {{file1}} e {{file2}}", - "dragFailed": "Falha ao arrastar", - "filePinnedSuccessfully": "Arquivo \"{{name}}\" fixado com sucesso", - "pinFileFailed": "Falha ao fixar arquivo", - "fileUnpinnedSuccessfully": "Arquivo \"{{name}}\" desafixado com sucesso", - "unpinFileFailed": "Falha ao desafixar arquivo", - "shortcutAddedSuccessfully": "Atalho para a pasta \"{{name}}\" adicionado com sucesso", - "addShortcutFailed": "Falha ao adicionar atalho", - "operationCompletedSuccessfully": "{{operation}} Itens {{count}} com sucesso", - "operationCompleted": "{{operation}} Itens em {{count}}", - "downloadFileSuccess": "Arquivo {{name}} baixado com sucesso", - "downloadFileFailed": "Download falhou", - "moveTo": "Mover para {{name}}", - "diffCompareWith": "Comparar diferenças com {{name}}", - "dragOutsideToDownload": "Arraste fora do janela para baixar (arquivos{{count}})", - "newFolderDefault": "Pasta", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Itens de {{count}} movidos com sucesso para {{target}}", - "move": "Mover-se", - "searchInFile": "Procurar no arquivo (Ctrl+F)", - "showKeyboardShortcuts": "Exibir atalhos de teclado", - "startWritingMarkdown": "Comece a escrever o seu conteúdo markdown...", - "loadingFileComparison": "Carregando comparação de arquivo...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Mover", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Comparar", - "sideBySide": "Lado a lado", - "inline": "Embutido", - "fileComparison": "Comparação de arquivos: {{file1}} vs {{file2}}", - "fileTooLarge": "Arquivo muito grande: {{error}}", - "sshConnectionFailed": "Falha na conexão SSH. Por favor, verifique sua conexão com {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Falha ao carregar arquivo: {{error}}", - "connecting": "Conectandochar@@0", - "connectedSuccessfully": "Conectado com sucesso", - "totpVerificationFailed": "Falha na verificação TOTP", - "warpgateVerificationFailed": "Falha na autenticação do Warpgate", - "authenticationFailed": "Falha na autenticação", - "verificationCodePrompt": "Código de verificação:", - "changePermissions": "Alterar permissões", - "currentPermissions": "Permissões Atuais", - "owner": "Proprietário", - "group": "grupo", - "others": "Outros", - "read": "Lido", - "write": "Salvar", - "execute": "Executar", - "permissionsChangedSuccessfully": "Permissões alteradas com sucesso", - "failedToChangePermissions": "Falha ao alterar permissões", - "name": "Nome:", - "sortByName": "Nome:", - "sortByDate": "Data de Modificação", - "sortBySize": "Tamanho", - "ascending": "Ascendente", - "descending": "Descendente", - "root": "raiz", - "new": "Novidades", - "sortBy": "Classificar por", - "items": "itens", - "selected": "Selecionado", - "editor": "Editores", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", "octal": "Octal", - "storage": "Armazenamento", - "disk": "Disco", - "used": "Utilizado", - "of": "de", - "toggleSidebar": "Alternar barra lateral", - "cannotLoadPdf": "Não é possível carregar PDF", - "pdfLoadError": "Houve um erro ao carregar este arquivo PDF.", - "loadingPdf": "Carregando PDF...", - "loadingPage": "Carregando página..." + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Copiar para o host…", - "moveToHost": "Mover para o host…", - "copyItemsToHost": "Copiar {{count}} itens para o host…", - "moveItemsToHost": "Mova {{count}} itens para o host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Não há outros servidores de gerenciamento de arquivos disponíveis.", "noHostsConnectedHint": "Adicione outro host SSH com o Gerenciador de Arquivos habilitado no Gerenciador de Hosts.", "selectDestinationHost": "Selecione o host de destino", @@ -1164,48 +1360,48 @@ "browseDestination": "Navegue ou insira o caminho", "confirmCopy": "Cópia", "confirmMove": "Mover", - "transferring": "Transferindo…", - "compressing": "Comprimindo…", - "extracting": "Extraindo…", - "transferringItems": "Transferindo {{current}} de {{total}} itens…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transferência concluída", "transferError": "A transferência falhou", - "transferPartial": "Transferência concluída com {{count}} erros", - "transferPartialHint": "Não foi possível transferir: {{paths}}", - "itemsSummary": "{{count}} itens", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "O destino deve ser um diretório para transferências de múltiplos itens.", "selectThisFolder": "Selecione esta pasta", "browsePathWillBeCreated": "Esta pasta ainda não existe. Ela será criada quando a transferência começar.", "browsePathError": "Não foi possível abrir este caminho no host de destino.", "goUp": "Subir", - "copyFolderToHost": "Copiar pasta para o host…", - "moveFolderToHost": "Mover pasta para o host…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Preparar", - "hostConnecting": "Conectando…", + "hostConnecting": "Connecting…", "hostDisconnected": "Não conectado", "hostAuthRequired": "Autenticação necessária — abra o Gerenciador de Arquivos neste host primeiro.", "hostConnectionFailed": "Falha na conexão", "metricsTitle": "Horários de transferência", - "metricsPrepare": "Preparar destino: {{duration}}", - "metricsCompress": "Comprimir na origem: {{duration}}", - "metricsHopSourceRead": "Origem → servidor: {{throughput}}", - "metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}", - "metricsTransfer": "De ponta a ponta: {{throughput}} ({{duration}})", - "metricsExtract": "Extrair no destino: {{duration}}", - "metricsSourceDelete": "Remover da fonte: {{duration}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", "metricsTotal": "Total: {{duration}}", - "progressCompressing": "Comprimindo no host de origem…", - "progressExtracting": "Extraindo no destino…", - "progressTransferring": "Transferindo dados…", - "progressReconnecting": "Reconectando…", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Faixas de transferência paralelas", - "parallelSegmentsOption": "{{count}} faixas", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Arquivos grandes são divididos em partes de 256 MB. Várias vias utilizam conexões separadas (como iniciar várias transferências) para obter uma taxa de transferência total maior.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} faixas)", - "progressTransferringItems": "Transferindo arquivos ({{current}} de {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} arquivos", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Arquivos de origem mantidos (transferência parcial)", "jumpHostLimitation": "Ambos os hosts devem ser acessíveis a partir do servidor Termix. O roteamento direto de host para host não é suportado.", "cancel": "Cancelar", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Seleciona o método de compactação (tar) ou SFTP por arquivo com base na quantidade de arquivos, tamanho e compressibilidade. Arquivos individuais sempre utilizam SFTP de streaming.", "methodTarHint": "Comprima na origem, transfira um único arquivo compactado e extraia no destino. Requer o uso do tar em ambos os hosts Unix.", "methodItemSftpHint": "Transfira cada arquivo individualmente via SFTP. Funciona em todos os hosts, incluindo Windows.", - "methodPreviewLoading": "Calculando o método de transferência…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Não foi possível visualizar o método de transferência. O servidor ainda escolherá um método quando você iniciar o servidor.", "methodPreviewWillUseTar": "Será utilizado: Arquivo tar", "methodPreviewWillUseItemSftp": "Será utilizado: SFTP por arquivo", - "methodPreviewScanSummary": "{{fileCount}} arquivos, {{totalSize}} total (verificado no host de origem).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Cada arquivo utiliza o mesmo fluxo SFTP como uma cópia de arquivo único, um após o outro. O progresso é combinado em todos os arquivos, portanto a barra se move lentamente durante a transferência de arquivos grandes.", "methodReason": { "user_item_sftp": "Você escolheu SFTP por arquivo.", "user_tar": "Você escolheu o arquivo tar.", "tar_unavailable": "O arquivo tar não está disponível em um ou ambos os hosts — em vez disso, será usado o SFTP por arquivo.", "windows_host": "O sistema operacional host é Windows — o arquivo tar não é utilizado.", - "auto_multi_large": "Automático: vários arquivos, incluindo um arquivo grande ({{largestSize}}) com dados compressíveis — pacotes tar em uma única transferência.", - "auto_single_large_in_archive": "Automático: um arquivo grande ({{largestSize}}) neste conjunto — SFTP por arquivo.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automático: dados em sua maioria não compressíveis — SFTP por arquivo.", - "auto_many_files": "Automático: muitos arquivos ({{fileCount}}) — tar reduz a sobrecarga por arquivo.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automático: SFTP por arquivo para este conjunto." }, "progressCancel": "Cancelar", - "progressCancelling": "Cancelando…", + "progressCancelling": "Cancelling…", "progressStalled": "Paralisado", "resumedHint": "Reconectado a uma transferência ativa iniciada em outra janela.", "transferCancelled": "Transferência cancelada", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Dados parciais foram mantidos no destino. A tentativa será retomada quando a conexão for restabelecida." }, "tunnels": { - "noSshTunnels": "Sem Túneis SSH", - "createFirstTunnelMessage": "Você ainda não criou nenhum túnel SSH. Configure as conexões de túnel no Gerenciador de Host para começar.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Conectado", - "disconnected": "Desconectado", - "connecting": "Conectandochar@@0", - "error": "ERRO", - "canceling": "Cancelando...", - "connect": "Conectar", - "disconnect": "Desconectar", - "cancel": "cancelar", - "port": "Porta", - "localPort": "Porta local", - "remotePort": "Porta remota", - "currentHostPort": "Porta atual do Host", - "endpointPort": "Porta de Endpoint", - "bindIp": "IP local", - "endpointSshConfig": "Configuração do Endpoint SSH", - "endpointSshHost": "Host do Endpoint SSH", - "endpointSshHostPlaceholder": "Selecione um host configurado", - "endpointSshHostRequired": "Selecione um host SSH para cada túnel do cliente.", - "attempt": "Tentativa {{current}} de {{max}}", - "nextRetryIn": "Próxima repetição em {{seconds}} segundos", - "clientTunnels": "Túneis do cliente", - "clientTunnel": "Túnel Cliente", - "addClientTunnel": "Adicionar túnel de cliente", - "noClientTunnels": "Nenhum túnel do cliente configurado nesta área de trabalho.", - "tunnelName": "Nome do túnel", - "remoteHost": "Host Remoto", - "autoStart": "Início automático", - "clientAutoStartDesc": "Inicia quando este cliente desktop abre e permanece conectado.", - "clientManualStartDesc": "Use Iniciar e Parar dessa linha. O Termix não abrirá automaticamente.", - "clientRemoteServerNote": "O encaminhamento remoto pode exigir AllowTcpForwarding e GatewayPorts no servidor SSH do endpoint. A porta remota é fechada quando este desktop desconecta.", - "clientTunnelStarted": "Túnel de cliente iniciado", - "clientTunnelStopped": "Túnel de cliente parado", - "tunnelTestSucceeded": "Teste de túnel bem-sucedido", - "tunnelTestFailed": "Teste do túnel falhou", - "localSaved": "Túneis do cliente salvos", - "localSaveError": "Falha ao salvar túneis locais do cliente", - "invalidBindIp": "O IP local deve ter um endereço IPv4 válido.", - "invalidLocalTargetIp": "IP de destino local deve ser um endereço IPv4 válido.", - "invalidLocalPort": "A porta local deve estar entre 1 e 65535.", - "invalidRemotePort": "Porta remota deve estar entre 1 e 65535.", - "invalidLocalTargetPort": "Porta local de destino deve estar entre 1 e 65535.", - "invalidEndpointPort": "Porta de Endpoint deve estar entre 1 e 65535.", - "duplicateAutoStartBind": "Apenas um túnel de cliente iniciar automaticamente pode usar o {{bind}}.", - "manualControlError": "Falha ao atualizar o estado do túnel.", - "active": "ativo", - "start": "Iniciar", - "stop": "Interromper", - "test": "teste", - "type": "Tipo de túnel", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancelar", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", "typeLocal": "Local (-L)", - "typeRemote": "Remoto (-R)", - "typeDynamic": "Dinâmico (-D)", - "typeServerLocalDesc": "Host atual para endpoint.", - "typeServerRemoteDesc": "Endpoint de volta ao host atual.", - "typeClientLocalDesc": "Computador local para endpoint.", - "typeClientRemoteDesc": "Endpoint de volta ao computador local.", - "typeClientDynamicDesc": "SOCKS no computador local.", - "typeDynamicDesc": "Encaminhar tráfego SOCKS5 CONNECT através de SSH", - "forwardDescriptionServerLocal": "Host atual {{sourcePort}} → endpoint {{endpointPort}}.", - "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → host atual {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS no host atual {{sourcePort}}.", - "forwardDescriptionClientLocal": "{{sourcePort}} local → remoto {{endpointPort}}.", - "forwardDescriptionClientRemote": "{{sourcePort}} remoto → {{endpointPort}} local.", - "forwardDescriptionClientDynamic": "SOCKS na porta local {{sourcePort}}.", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "{{localPort}} local → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → {{localPort}} local", - "autoNameClientDynamic": "format@@0 SOCKS {{localPort}} via {{endpoint}}", - "route": "Itinerário:", - "lastStarted": "Último início", - "lastTested": "Último teste", - "lastError": "Último erro", - "maxRetries": "Máximo de buscas", - "maxRetriesDescription": "Quantidade máxima de tentativas de repetição.", - "retryInterval": "Intervalo de Repetir (segundos)", - "retryIntervalDescription": "Tempo de espera entre tentativas novamente.", - "local": "Localização", - "remote": "Remoto", - "destination": "Destino", - "host": "Servidor", - "mode": "Modo", - "noHostSelected": "Nenhum host selecionado", - "working": "Trabalhando..." + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "cpu", - "memory": "Memória", - "disk": "Disco", - "network": "Rede", - "uptime": "Tempo em atividade", - "processes": "processos", - "available": "Disponível", - "free": "Gratuito", - "connecting": "Conectandochar@@0", - "connectionFailed": "Falha ao conectar ao servidor", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "Núcleo {{count}}", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Uso da CPU", - "memoryUsage": "Memória Utilizada", - "diskUsage": "Uso do disco", - "failedToFetchHostConfig": "Falha ao buscar a configuração do host", - "serverOffline": "Servidor Offline", - "cannotFetchMetrics": "Não é possível buscar métricas do servidor offline", - "totpFailed": "Falha na verificação TOTP", - "noneAuthNotSupported": "As estatísticas do servidor não suportam tipo de autenticação 'nenhum'.", - "load": "Carregar", - "systemInfo": "Informação do Sistema", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Sistema operacional", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "segundos", - "networkInterfaces": "Interfaces de Rede", - "noInterfacesFound": "Nenhuma interface de rede encontrada", - "noProcessesFound": "Nenhum processo encontrado", - "loginStats": "Estatísticas de Login SSH", - "noRecentLoginData": "Nenhum dado de login recente", - "executingQuickAction": "Executando {{name}}...", - "quickActionSuccess": "{{name}} completado com sucesso", - "quickActionFailed": "{{name}} falhou", - "quickActionError": "Falha ao executar {{name}}", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Porta de Escuta", - "protocol": "Protocol", - "port": "Porta", - "address": "Endereço", - "process": "processo", - "noData": "Sem dados de portas de escuta" + "title": "Listening Ports", + "protocol": "Protocolo", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inativo", - "policy": "Política", - "rules": "regras", - "noData": "Nenhum firewall disponível", - "action": "Acão", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Porta", - "source": "fonte", - "anywhere": "Em qualquer lugar" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Carga Média", - "swap": "Trocar", - "architecture": "Arquitetura", - "refresh": "atualizar", - "retry": "Repetir" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Tentar novamente", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Correr", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "SSH autohospedado e gerenciamento de desktop remoto", - "loginTitle": "Faça login para Termix", - "registerTitle": "Criar conta", - "forgotPassword": "Esqueceu a senha?", - "rememberMe": "Lembrar dispositivo por 30 dias (inclui TOTP)", - "noAccount": "Não possui uma conta?", - "hasAccount": "Já possui uma conta?", - "twoFactorAuth": "Autenticação dupla", - "enterCode": "Inserir código de verificação", - "backupCode": "Ou usar código de backup", - "verifyCode": "Verificar Código", - "redirectingToApp": "Redirecionando para o aplicativo...", - "sshAuthenticationRequired": "Autenticação SSH necessária", - "sshNoKeyboardInteractive": "Autenticação Interativa do Keyboard-Indisponível", - "sshAuthenticationFailed": "Falha na autenticação", - "sshAuthenticationTimeout": "Timeout de autenticação", - "sshNoKeyboardInteractiveDescription": "O servidor não suporta autenticação interativa de teclado. Por favor, forneça sua senha ou chave SSH.", - "sshAuthFailedDescription": "As credenciais fornecidas estavam incorretas. Por favor, tente novamente com credenciais válidas.", - "sshTimeoutDescription": "A tentativa de autenticação expirou. Tente novamente.", - "sshProvideCredentialsDescription": "Por favor, forneça suas credenciais SSH para conectar a este servidor.", - "sshPasswordDescription": "Digite a senha para esta conexão SSH.", - "sshKeyPasswordDescription": "Se a sua chave SSH estiver criptografada, digite a senha aqui.", - "passphraseRequired": "Senha Obrigatória", - "passphraseRequiredDescription": "A chave SSH está criptografada. Digite a senha para desbloqueá-la.", - "back": "Anterior", - "firstUser": "Primeiro usuário", - "firstUserMessage": "Você é o primeiro usuário e será feito um administrador. Você pode ver as configurações de administrador na lista de usuários da barra lateral. Se você acha que isso é um erro, verifique os logs do docker ou crie uma questão no GitHub.", - "external": "externo", - "loginWithExternal": "Entrar com o provedor externo", - "loginWithExternalDesc": "Fazer login usando seu provedor de identidade externo configurado", - "externalNotSupportedInElectron": "A autenticação externa ainda não é suportada no aplicativo Electron. Por favor, use a versão web para logar OIDC.", - "resetPasswordButton": "Redefinir a senha", - "sendResetCode": "Enviar Código de Redefinição", - "resetCodeDesc": "Digite seu nome de usuário para receber um código de redefinição de senha. O código será logado nos logs do contêiner docker.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verificar Código", - "enterResetCode": "Insira o código de 6 dígitos do contêiner docker para o usuário:", - "newPassword": "Nova Palavra-Passe", - "confirmNewPassword": "Confirmar senha", - "enterNewPassword": "Digite sua nova senha para o usuário:", - "signUp": "Criar conta", - "desktopApp": "Aplicativo para computador", - "loggingInToDesktopApp": "Fazendo login no aplicativo para computador", - "loadingServer": "Carregando servidor...", - "dataLossWarning": "Redefinir sua senha desta forma irá apagar todos os seus hosts, credenciais e outros dados criptografados salvos por SSH. Essa ação não pode ser desfeita. Apenas use isso se você esqueceu sua senha e não está logado.", - "authenticationDisabled": "Autenticação desabilitada", - "authenticationDisabledDesc": "Todos os métodos de autenticação estão desativados no momento. Entre em contato com o administrador.", - "attemptsRemaining": "Tentativas {{count}} restantes" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verificar chave do host SSH", - "keyChangedWarning": "Chave do host SSH alterada", - "firstConnectionTitle": "Primeira vez conectando-se a este host", - "firstConnectionDescription": "A autenticidade deste host não pode ser estabelecida. Verifique a impressão digital que você espera.", - "keyChangedDescription": "A chave do host para este servidor mudou desde a sua última conexão. Isso pode indicar um problema de segurança.", - "previousKey": "Chave anterior", - "newFingerprint": "Nova impressão digital", - "fingerprint": "Impressão digital", - "verifyInstructions": "Caso você confie neste host, clique em Aceitar para continuar e salvar esta impressão digital para conexões futuras.", - "securityWarning": "Aviso de segurança", - "acceptAndContinue": "Aceitar e Continuar", - "acceptNewKey": "Aceitar nova chave e continuar" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Não foi possível conectar ao banco de dados", - "unknownError": "Erro desconhecido", - "loginFailed": "Falha no login", - "failedPasswordReset": "Falha ao iniciar a redefinição de senha", - "failedVerifyCode": "Falha ao verificar código de redefinição", - "failedCompleteReset": "Falha ao concluir a redefinição de senha", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Falha ao iniciar o login OIDC", - "silentSigninOidcUnavailable": "O login silencioso foi solicitado, mas o login do OIDC não está disponível.", - "failedUserInfo": "Falha ao obter informações do usuário após o login", - "oidcAuthFailed": "Falha na autenticação OIDC", - "invalidAuthUrl": "URL de autorização inválida recebida do backend", - "requiredField": "Este campo é obrigatório", - "minLength": "Tamanho mínimo de {{min}}", - "passwordMismatch": "As senhas não coincidem", - "passwordLoginDisabled": "Nome de usuário/senha está desativado no momento", - "sessionExpired": "Sessão expirou - por favor faça o login novamente", - "totpRateLimited": "Taxa limitada: Muitas tentativas de verificação TOTP. Tente novamente mais tarde.", - "totpRateLimitedWithTime": "Taxa limitada: Muitas tentativas de verificação TOTP. Aguarde {{time}} segundos antes de tentar novamente.", - "resetCodeRateLimited": "Taxa limitada: Muitas tentativas de verificação. Por favor, tente novamente mais tarde.", - "resetCodeRateLimitedWithTime": "Taxa limitada: Muitas tentativas de verificação. Por favor, aguarde {{time}} segundos antes de tentar novamente.", - "authTokenSaveFailed": "Falha ao salvar token de autenticação", - "failedToLoadServer": "Falha ao carregar servidor" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "O registro da nova conta está desativado por um administrador. Por favor, entre em contato com um administrador.", - "userNotAllowed": "Sua conta não está autorizada a se registrar. Por favor, contate um administrador.", - "databaseConnectionFailed": "Falha ao conectar ao servidor do banco de dados", - "resetCodeSent": "Redefinir código enviado para os logs Docker", - "codeVerified": "Código verificado com sucesso", - "passwordResetSuccess": "Senha redefinida com sucesso", - "loginSuccess": "Login bem-sucedido", - "registrationSuccess": "Registrado com sucesso" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Túneis locais de desktop, direcionando hosts SSH configurados.", - "c2sTunnelPresets": "Predefinições do Túnel Cliente", - "c2sTunnelPresetsDesc": "Salvar a lista de túneis locais do cliente local como uma predefinição de servidor nomeada ou carregar uma predefinição de volta para este cliente.", - "c2sTunnelPresetsUnavailable": "Predefinições de túnel cliente só estão disponíveis no cliente desktop.", - "c2sPresetName": "Nome da predefinição", - "c2sPresetNamePlaceholder": "Nome da predefinição cliente", - "c2sPresetToLoad": "Predefinição para carregar", - "c2sNoPresetSelected": "Nenhuma predefinição selecionada", - "c2sNoPresets": "Nenhuma predefinição salva", - "c2sLoadPreset": "Carregar", - "c2sCurrentLocalConfig": "{{count}} túneis locais do cliente configurados nesta área de trabalho.", - "c2sPresetSyncNote": "As predefinições são imagens explícitas; carregar uma substitui a lista de túneis de cliente local desse cliente.", - "c2sPresetSaved": "Túnel de cliente predefinido salvo", - "c2sPresetLoaded": "Túnel cliente predefinido carregado localmente", - "c2sPresetRenamed": "Pré-ajuste do túnel cliente renomeado", - "c2sPresetDeleted": "Prédefinição de túnel de cliente excluído", - "c2sPresetLoadError": "Falha ao carregar as predefinições do túnel do cliente" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "IDIOMA", - "keyPassword": "Senha da chave", - "pastePrivateKey": "Cole sua chave privada aqui...", - "localListenerHost": "127.0.0.1 (ouvir localmente)", - "localTargetHost": "127.0.0.1 (alvo neste computador)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Digite sua senha", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Painel", - "loading": "Carregando painel...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "SUPORTE", + "support": "Support", "discord": "Discord", - "serverOverview": "Visão Geral do Servidor", - "version": "Versão", - "upToDate": "Até a data", - "updateAvailable": "Atualização disponível", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Tempo em atividade", - "database": "Banco", - "healthy": "Saudável", - "error": "ERRO", - "totalHosts": "Hosts totais", - "totalTunnels": "Total de túneis", - "totalCredentials": "Credenciais totais", - "recentActivity": "Atividade recente", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Carregando atividade recente...", - "noRecentActivity": "Nenhuma atividade recente", - "quickActions": "Ações rápidas", - "addHost": "Adicionar Host", - "addCredential": "Adicionar Credencial", - "adminSettings": "Configurações de administrador", - "userProfile": "Informações do Perfil", - "serverStats": "Estatísticas do servidor", - "loadingServerStats": "Carregando estatísticas do servidor...", - "noServerData": "Nenhum dado de servidor disponível", - "cpu": "cpu", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personalizar Painel", - "dashboardSettings": "Configurações do painel", - "enableDisableCards": "Ativar/Desativar cartões", - "resetLayout": "Restaurar ao Padrão", - "serverOverviewCard": "Visão Geral do Servidor", - "recentActivityCard": "Atividade recente", - "networkGraphCard": "Gráfico da Rede", - "networkGraph": "Gráfico da Rede", - "quickActionsCard": "Ações rápidas", - "serverStatsCard": "Estatísticas do servidor", - "panelMain": "Principal", - "panelSide": "Lado", - "justNow": "neste momento" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "ESTÁVEL", - "hostsOnline": "Hosts online", - "activeTunnels": "Túneis ativos", - "registerNewServer": "Registrar um novo servidor", - "storeSshKeysOrPasswords": "Armazenar chaves SSH ou senhas", - "manageUsersAndRoles": "Gerenciar usuários e funções", - "manageYourAccount": "Gerencie sua conta", - "hostStatus": "Status do Host", - "noHostsConfigured": "Nenhum host configurado", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", - "offline": "DESLIGAR", - "onlineLower": "Disponível", + "offline": "OFFLINE", + "onlineLower": "On-line", "nodes": "{{count}} nodes", - "add": "Adicionar:", - "commandPalette": "Paleta de comando", - "done": "Concluído", - "editModeInstructions": "Arraste cartões para reordenar · Arraste o divisor de coluna para redimensionar colunas · Arraste a borda inferior de um cartão para redimensionar sua altura · Lixeira para remover", - "empty": "Vazio", - "clear": "Limpar" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Cópia", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Adicionar Host", - "addGroup": "Adicionar Grupo", - "addLink": "Adicionar Link", - "zoomIn": "Aumentar zoom", - "zoomOut": "Diminuir o zoom", - "resetView": "Redefinir visualização", - "selectHost": "Selecione o Host", - "chooseHost": "Escolha um host...", - "parentGroup": "Grupo Pai", - "noGroup": "Nenhum grupo", - "groupName": "Nome do Grupo", - "color": "Cor", - "source": "fonte", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Mover para o grupo", - "selectGroup": "Selecionar grupo...", - "addConnection": "Adicionar conexão", - "hostDetails": "Detalhes do Host", - "removeFromGroup": "Remover do grupo", - "addHostHere": "Adicionar Host Aqui", - "editGroup": "Editar Grupo", - "delete": "excluir", - "add": "Adicionar", - "create": "Crio", - "move": "Mover-se", - "connect": "Conectar", - "createGroup": "Criar grupo", - "selectSourcePlaceholder": "Selecione a Fonte...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Mover", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Arquivo inválido", - "hostAlreadyExists": "O host já está na topologia", - "connectionExists": "Conexão já existe", - "unknown": "Desconhecido", - "name": "Nome:", - "ip": "PI", - "status": "SItuação", - "failedToAddNode": "Falha ao adicionar nó", - "sourceDifferentFromTarget": "Origem e alvo devem ser diferentes", - "exportJSON": "Exportar JSON", - "importJSON": "Importar JSON", - "terminal": "Terminal", - "fileManager": "Gerenciador de Arquivos", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "terminal", + "fileManager": "Gerenciador de arquivos", "tunnel": "Túnel", - "docker": "Atracador", - "serverStats": "Estatísticas do servidor", - "noNodes": "Nenhum nó ainda" + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "O Docker não está habilitado para este host", - "validating": "Validando o Docker...", - "connecting": "Conectandochar@@0", - "error": "ERRO", - "version": "{{version}} Docker", - "connectionFailed": "Falha ao conectar ao Docker", - "containerStarted": "Contêiner {{name}} iniciado", - "failedToStartContainer": "Falha ao iniciar o contêiner {{name}}", - "containerStopped": "O contêiner {{name}} parou", - "failedToStopContainer": "Falha ao parar o contêiner {{name}}", - "containerRestarted": "Contêiner {{name}} reiniciado", - "failedToRestartContainer": "Falha ao reiniciar o contêiner {{name}}", - "containerPaused": "Recipiente {{name}} pausado", - "containerUnpaused": "Recipiente {{name}} despausado", - "failedToTogglePauseContainer": "Falha ao alternar estado de pausa para o contêiner {{name}}", - "containerRemoved": "{{name}} do contêiner removido", - "failedToRemoveContainer": "Falha ao remover contêiner {{name}}", - "image": "Imagem:", - "ports": "Portas", - "noPorts": "Nenhuma porta", - "start": "Iniciar", - "confirmRemoveContainer": "Você tem certeza que deseja remover o contêiner '{{name}}'? Esta ação não pode ser desfeita.", - "runningContainerWarning": "Aviso: Este contêiner está em execução no momento. Removê-lo irá parar o contêiner primeiro.", - "loadingContainers": "Carregando contêineres...", - "manager": "Gerenciador de Docker", - "autoRefresh": "Atualização Automática", - "timestamps": "Data", - "lines": "linhas", - "filterLogs": "Filtrar registros...", - "refresh": "atualizar", - "download": "BAIXAR", - "clear": "Limpar", - "logsDownloaded": "Registros baixados com sucesso", - "last50": "Últimos 50", - "last100": "Últimas 100", - "last500": "Últimas 500", - "last1000": "Últimas 1000", - "allLogs": "Todos os registros", - "noLogsMatching": "Nenhum registro correspondente \"{{query}}\"", - "noLogsAvailable": "Não há registros disponíveis", - "noContainersFound": "Nenhum contêiner encontrado", - "noContainersFoundHint": "Nenhum contêiner Docker está disponível neste host", - "searchPlaceholder": "Procurar contêineres...", - "allStatuses": "Todos os Status", - "stateRunning": "Executando", - "statePaused": "Pausado", - "stateExited": "Saída", - "stateRestarting": "Reiniciando", - "noContainersMatchFilters": "Nenhum contêiner corresponde aos seus filtros", - "noContainersMatchFiltersHint": "Tente ajustar sua pesquisa ou critério de filtro", - "failedToFetchStats": "Falha ao obter estatísticas do contêiner", - "containerNotRunning": "Contêiner não executando", - "startContainerToViewStats": "Inicie o contêiner para ver estatísticas", - "loadingStats": "Carregando estatísticas...", - "errorLoadingStats": "Erro ao carregar estatísticas", - "noStatsAvailable": "Não há estatísticas disponíveis", - "cpuUsage": "Uso da CPU", - "current": "Atual", - "memoryUsage": "Memória Utilizada", - "networkIo": "Entrada e Saída de rede", - "input": "Entrada", - "output": "Saída", - "blockIo": "Bloco de E/S", - "read": "Lido", - "write": "Salvar", - "pids": "Identificadores de Processos", - "containerInformation": "Informação do contêiner", - "name": "Nome:", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Estado:", - "containerMustBeRunning": "O contêiner precisa estar em execução para acessar o console", - "verificationCodePrompt": "Inserir código de verificação", - "totpVerificationFailed": "Falha na verificação TOTP. Tente novamente.", - "warpgateVerificationFailed": "A autenticação do Warpgate falhou. Por favor, tente novamente.", - "connectedTo": "Conectado a {{containerName}}", - "disconnected": "Desconectado", - "consoleError": "Erro de console", - "errorMessage": "Erro: {{message}}", - "failedToConnect": "Falha ao conectar ao contêiner", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", "console": "Console", - "selectShell": "Selecionar shell", - "bash": "Pancada", - "sh": "estrito", - "ash": "cinzas", - "connect": "Conectar", - "disconnect": "Desconectar", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Não conectado", - "clickToConnect": "Clique em conectar para iniciar uma sessão shell", - "connectingTo": "Conectando a {{containerName}}...", - "containerNotFound": "Contêiner não encontrado", - "backToList": "Voltar para a Lista", - "logs": "Registros", - "stats": "Estatísticas", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", "consoleTab": "Console", - "startContainerToAccess": "Iniciar o contêiner para acessar o console" + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Gerais", - "sectionOidc": "OCIDADE", - "sectionUsers": "Utilizadores", - "sectionSessions": "Sessões", - "sectionRoles": "Papéis", - "sectionDatabase": "Banco", - "sectionApiKeys": "Chaves API", - "allowRegistration": "Permitir Registro de Usuário", - "allowRegistrationDesc": "Deixe novos usuários se registrarem", - "allowPasswordLogin": "Permitir acesso à senha", - "allowPasswordLoginDesc": "Usuário/senha para login", - "oidcAutoProvision": "Auto-Provisão OIDC", - "oidcAutoProvisionDesc": "Criar contas automaticamente para usuários OIDC, mesmo que o registro esteja desativado", - "allowPasswordReset": "Permitir redefinição de senha", - "allowPasswordResetDesc": "Redefinir código via logs do Docker", - "sessionTimeout": "Sessão expirada", - "hours": "horas", - "sessionTimeoutRange": "Mínimo de 1h · Máximo de 720h", - "monitoringDefaults": "Padrões de monitoramento", - "statusCheck": "Verificação de status", - "metrics": "Métricas", - "sec": "seg.", - "logLevel": "Nível do Registro", - "enableGuacamole": "Ativar Guacamole", - "enableGuacamoleDesc": "desktop remoto RDP/VNC", - "guacdUrl": "URL guacd", - "oidcDescription": "Configure o OpenID Connect para SSO. Campos marcados * são necessários.", - "oidcClientId": "ID do Cliente", - "oidcClientSecret": "Segredo do Cliente", - "oidcAuthUrl": "URL de autorização", - "oidcIssuerUrl": "URL do Emissor", - "oidcTokenUrl": "URL do token", - "oidcUserIdentifier": "Caminho do usuário", - "oidcDisplayName": "Exibir Caminho do Nome", - "oidcScopes": "Âmbitos", - "oidcUserinfoUrl": "Substituir URL do Userinfo", - "oidcAllowedUsers": "Usuários permitidos", - "oidcAllowedUsersDesc": "Um e-mail por linha. Deixe em branco para permitir que todos.", - "removeOidc": "Excluir", - "usersCount": "Usuários {{count}}", - "createUser": "Crio", - "newRole": "Nova Permissão", - "roleName": "Nome:", - "roleDisplayName": "Nome para exibição", - "roleDescription": "Descrição:", - "rolesCount": "Funções {{count}}", - "createRole": "Crio", - "creating": "Criando...", - "exportDatabase": "Exportar banco de dados", - "exportDatabaseDesc": "Baixar um backup de todos os hosts, credenciais e configurações", - "export": "Exportação", - "exporting": "Exportando...", - "importDatabase": "Importar base de dados", - "importDatabaseDesc": "Restaurar a partir de um arquivo de backup .sqlite", - "importDatabaseSelected": "Selecionado: {{name}}", - "selectFile": "Selecione o arquivo", - "changeFile": "Troca", - "import": "Importação", - "importing": "Importando...", - "apiKeysCount": "Chaves {{count}}", - "newApiKey": "Nova chave de API", - "apiKeyCreatedWarning": "Chave criada - copiá-la agora, ela não será exibida novamente.", - "apiKeyName": "Nome:", - "apiKeyUser": "Usuário", - "apiKeySelectUser": "Selecione um usuário...", - "apiKeyExpiresAt": "Expira em", - "createKey": "Criar chave", - "apiKeyNoExpiry": "Sem expiração", + "sectionGeneral": "General", + "sectionOidc": "OIDC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Limpar filtros", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remover", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Dupla Autenticação", - "authTypeOidc": "OCIDADE", - "authTypeLocal": "Localização", - "adminStatusAdministrator": "Administrador", - "adminStatusRegularUser": "Usuário Normal", + "authTypeDual": "Dual Auth", + "authTypeOidc": "OIDC", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", - "systemBadge": "SIM", - "customBadge": "PERSÃO", - "youBadge": "VOCÊ", - "sessionsActive": "{{count}} ativo", - "sessionActive": "Ativo: {{time}}", - "sessionExpires": "Exx: {{time}}", - "revokeAll": "TODOS", - "revokeAllSessionsSuccess": "Todas as sessões do usuário revogadas", - "revokeAllSessionsFailed": "Falha ao revogar sessões", - "revokeSessionFailed": "Falha ao revogar sessão", - "addRole": "Adicionar função", - "noCustomRoles": "Nenhum cargo personalizado definido", - "removeRoleFailed": "Falha ao remover papel", - "assignRoleFailed": "Falha ao atribuir papel", - "deleteRoleFailed": "Falha ao excluir papel", - "userAdminAccess": "Administrador", - "userAdminAccessDesc": "Acesso completo a todas as configurações de administrador", - "userRoles": "Papéis", - "revokeAllUserSessions": "Revogar todas as sessões", - "revokeAllUserSessionsDesc": "Forçar o re-login em todos os dispositivos", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "A exclusão deste usuário é permanente.", - "deleteUser": "Excluir {{username}}", - "deleting": "Excluindo...", - "deleteUserFailed": "Falha ao excluir usuário", - "deleteUserSuccess": "Usuário \"{{username}}\" excluído", - "deleteRoleSuccess": "Função \"{{name}}\" excluído", - "revokeKeySuccess": "Chave \"{{name}}\" revogada", - "revokeKeyFailed": "Falha ao revogar a chave", - "copiedToClipboard": "Copiado para o clipboard", - "done": "Concluído", - "createUserTitle": "Criar Usuário", - "createUserDesc": "Crie uma nova conta local.", - "createUserUsername": "Usuário:", - "createUserPassword": "Palavra-passe", - "createUserPasswordHint": "Mínimo 6 caracteres.", - "createUserEnterUsername": "Digite o usuário", - "createUserEnterPassword": "Insira a senha", - "createUserSubmit": "Criar Usuário", - "editUserTitle": "Gerenciar Usuário: {{username}}", - "editUserDesc": "Editar funções, status de administrador, sessões e configurações da conta.", - "editUserUsername": "Usuário:", - "editUserAuthType": "Tipo de Autenticação", - "editUserAdminStatus": "Status do administrador", - "editUserUserId": "ID de usuário", - "linkAccountTitle": "Vincular OIDC à conta da senha", - "linkAccountDesc": "Mesclar a conta OIDC {{username}} com uma conta local existente.", - "linkAccountWarningTitle": "Isto irá:", - "linkAccountEffect1": "Excluir conta somente OIDC", - "linkAccountEffect2": "Adicione login OIDC à conta de destino", - "linkAccountEffect3": "Permitir tanto acesso OIDC quanto acesso à senha", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Digite o nome de usuário da conta local para vincular", - "linkAccounts": "Vincular Contas", - "linkAccountSuccess": "Conta OIDC vinculada a \"{{username}}\"", - "linkAccountFailed": "Falha ao vincular a conta OIDC", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", + "createUserPassword": "Senha", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Tipo de autenticação", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Conectando...", - "saving": "Salvando...", - "updateRegistrationFailed": "Falha ao atualizar configuração de registro", - "updatePasswordLoginFailed": "Falha ao atualizar configuração de login de senha", - "updateOidcAutoProvisionFailed": "Falha ao atualizar a auto disposição OIDC", - "updatePasswordResetFailed": "Falha ao atualizar a configuração de redefinição de senha", - "sessionTimeoutRange2": "Tempo limite da sessão deve ser entre 1 e 720 horas", - "sessionTimeoutSaved": "Timeout da sessão salvo", - "sessionTimeoutSaveFailed": "Falha ao salvar tempo limite de sessão", - "monitoringIntervalInvalid": "Valores de intervalo inválidos", - "monitoringSaved": "Configurações de monitoramento salvas", - "monitoringSaveFailed": "Falha ao salvar configurações de monitoramento", - "guacamoleSaved": "Configurações de Guacamole salvas", - "guacamoleSaveFailed": "Falha ao salvar configurações de Guacamole", - "guacamoleUpdateFailed": "Falha ao atualizar a configuração de Guacamole", - "logLevelUpdateFailed": "Falha ao atualizar o nível de log", - "oidcSaved": "Configuração OIDC salva", - "oidcSaveFailed": "Falha ao salvar configuração OIDC", - "oidcRemoved": "Configuração OIDC removida", - "oidcRemoveFailed": "Falha ao remover a configuração OIDC", - "createUserRequired": "Nome de usuário e senha são obrigatórios", - "createUserPasswordTooShort": "A senha deve ter pelo menos 6 caracteres", - "createUserSuccess": "Usuário \"{{username}}\" criado", - "createUserFailed": "Falha ao criar usuário", - "updateAdminStatusFailed": "Falha ao atualizar status do administrador", - "allSessionsRevoked": "Todas as sessões revogadas", - "revokeSessionsFailed": "Falha ao revogar sessões", - "createRoleRequired": "Nome e nome de exibição são necessários", - "createRoleSuccess": "Papel \"{{name}}\" criado", - "createRoleFailed": "Falha ao criar papel", - "apiKeyNameRequired": "O nome da chave é obrigatório", - "apiKeyUserRequired": "O ID do usuário é necessário", - "apiKeyCreatedSuccess": "Chave da API \"{{name}}\" criado", - "apiKeyCreateFailed": "Falha ao criar chave de API", - "exportSuccess": "Banco de dados exportado com sucesso", - "exportFailed": "Exportação do banco de dados falhou", - "importSelectFile": "Por favor, selecione um arquivo primeiro", - "importCompleted": "Importação concluída: {{total}} itens importados, {{skipped}} ignorados", - "importFailed": "Importação falhou: {{error}}", - "importError": "Falha ao importar banco" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Servidor", - "hostPlaceholder": "192.168.1.1 ou exemplo.com", - "portLabel": "Porta", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Usuário:", - "usernamePlaceholder": "usuário", - "authLabel": "Autenticação", - "passwordLabel": "Palavra-passe", - "passwordPlaceholder": "Senha", - "privateKeyLabel": "Chave Privada", - "privateKeyPlaceholder": "Colar chave privada...", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", + "passwordLabel": "Senha", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", "credentialLabel": "Credencial", - "credentialPlaceholder": "Selecione uma credencial salva", - "connectToTerminal": "Conectar ao Terminal", - "connectToFiles": "Conectar aos arquivos" + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Nenhum terminal selecionado", - "noTerminalSelectedHint": "Abra uma aba de terminal SSH para ver seu histórico de comandos", - "searchPlaceholder": "Pesquisar histórico...", - "clearAll": "Limpar Tudo", - "noHistoryEntries": "Não há entradas no histórico", - "trackingDisabled": "Rastreamento do histórico está desativado", - "trackingDisabledHint": "Ative-o nas configurações do seu perfil para gravar comandos." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Gravação de Teclas", - "recordToTerminals": "Registro em terminais", - "selectAll": "TODOS", - "selectNone": "Nenhuma", - "noTerminalTabsOpen": "Nenhuma aba de terminal aberta", - "selectTerminalsAbove": "Selecione os terminais acima", - "broadcastInputPlaceholder": "Digite aqui para transmitir keystroks...", - "stopRecording": "Parar Gravação", - "startRecording": "Iniciar Gravação", - "settingsTitle": "Confirgurações", - "enableRightClickCopyPaste": "Habilitar copiar/colar com botão direito" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Nenhum", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Disposição", - "selectLayoutAbove": "Selecione um layout acima", - "selectLayoutHint": "Escolha quantos painéis mostrar", - "panesTitle": "Painéis", - "openTabsTitle": "Abas abertas", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Arraste as guias para os painéis acima ou use a Atribuição Rápida.", - "dropHere": "Solte aqui", - "emptyPane": "Vazio", - "dashboard": "Painel", - "clearSplitScreen": "Limpar Tela dividida", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Atribuição rápida", - "alreadyAssigned": "Painel {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Aba dividida", "addToSplit": "Adicionar à divisão", "removeFromSplit": "Remover da divisão", - "assignToPane": "Atribuir ao painel" + "assignToPane": "Atribuir ao painel", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Criar Snippet", - "createSnippetDescription": "Criar um novo snippet de comando para a execução rápida", - "nameLabel": "Nome:", - "namePlaceholder": "ex.: Reiniciar o Nginx", - "descriptionLabel": "Descrição:", - "descriptionPlaceholder": "Descrição opcional", - "optional": "Opcional", - "folderLabel": "pasta", - "noFolder": "Nenhuma pasta (Descategorizada)", - "commandLabel": "Comando", - "commandPlaceholder": "ex.: sudo systemctl reinicializa o nginx", - "cancel": "cancelar", - "createSnippetButton": "Criar Snippet", - "createFolderTitle": "Criar pasta", - "createFolderDescription": "Organize seus snippets em pastas", - "folderNameLabel": "Nome da pasta", - "folderNamePlaceholder": "ex.: Comandos do Sistema, Scripts Docker", - "folderColorLabel": "Cor da pasta", - "folderIconLabel": "Ícone da pasta", - "previewLabel": "Pré-visualizar", - "folderNameFallback": "Nome da pasta", - "createFolderButton": "Criar pasta", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancelar", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "TODOS", - "selectNone": "Nenhuma", - "noTerminalTabsOpen": "Nenhuma aba de terminal aberta", - "searchPlaceholder": "Buscar snippets...", - "newSnippet": "Novo Trecho", - "newFolder": "Adicionar uma pasta", - "run": "Executar", - "noSnippetsInFolder": "Não há snippets nesta pasta", - "uncategorized": "Descategorizado", - "editSnippetTitle": "Editar Trecho", - "editSnippetDescription": "Atualizar este comando snippet", - "saveSnippetButton": "Salvar as alterações", - "createSuccess": "Snippet criado com sucesso", - "createFailed": "Falha ao criar snippet", - "updateSuccess": "Trecho atualizado com sucesso", - "updateFailed": "Falha ao atualizar snippet", - "deleteFailed": "Falha ao excluir snippet", - "folderCreateSuccess": "Pasta criada com sucesso", - "folderCreateFailed": "Falha ao criar pasta", - "editFolderTitle": "Editar Pasta", - "editFolderDescription": "Renomear ou alterar a aparência desta pasta", - "saveFolderButton": "Salvar as alterações", - "editFolder": "Editar Pasta", - "deleteFolder": "Excluir pasta", - "folderDeleteSuccess": "Pasta \"{{name}}excluída", - "folderDeleteFailed": "Falha ao excluir pasta", - "folderEditSuccess": "Pasta atualizada com sucesso", - "folderEditFailed": "Falha ao atualizar a pasta", - "confirmRunMessage": "Executar \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Nenhum", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Correr", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Correr", - "runSuccess": "Executado \"{{name}}\" em {{count}} terminal(is)", - "copySuccess": "Copiado \"{{name}}\" para área de transferência", - "shareTitle": "Compartilhar Snippet", - "shareUser": "Usuário", - "shareRole": "Funções", - "selectUser": "Selecione um usuário...", - "selectRole": "Selecione uma função...", - "shareSuccess": "Snippet compartilhado com sucesso", - "shareFailed": "Falha ao compartilhar snippet", - "revokeSuccess": "Acesso revogado", - "revokeFailed": "Falha ao revogar acesso", - "currentAccess": "Acesso atual", - "shareLoadError": "Não foi possível carregar os dados de compartilhamento", - "loading": "Carregandochar@@0", - "close": "FECHAR", - "reorderFailed": "Falha ao salvar a ordem do trecho de código" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Falha ao salvar a ordem do trecho de código", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "conta", - "sectionAppearance": "Aparência", - "sectionSecurity": "Segurança", - "sectionApiKeys": "Chaves API", - "sectionC2sTunnels": "Túneis C2S", - "usernameLabel": "Usuário:", - "roleLabel": "Funções", - "roleAdministrator": "Administrador", - "authMethodLabel": "Método de Autenticação", - "authMethodLocal": "Localização", - "twoFaLabel": "A2F", - "twoFaOn": "Ligado", - "twoFaOff": "Desligado", - "versionLabel": "Versão", - "deleteAccount": "Excluir Conta", - "deleteAccountDescription": "Excluir permanentemente sua conta", - "deleteButton": "excluir", - "deleteAccountPermanent": "Esta ação é permanente e não pode ser desfeita.", - "deleteAccountWarning": "Todas as sessões, hosts, credenciais e configurações serão excluídas permanentemente.", - "confirmPasswordDeletePlaceholder": "Digite sua senha para confirmar", - "languageLabel": "IDIOMA", - "themeLabel": "Tema", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Cor do acento", - "settingsTerminal": "Terminal", - "commandAutocomplete": "Auto-completar comando", - "commandAutocompleteDesc": "Mostrar autocomplete durante a digitação", - "historyTracking": "Rastreamento do Histórico", - "historyTrackingDesc": "Rastrear comandos do terminal", - "syntaxHighlighting": "Realce de sintaxe", - "syntaxHighlightingDesc": "Destacar saída do terminal", - "commandPalette": "Paleta de comando", - "commandPaletteDesc": "Ativar atalho de teclado", + "accentColorLabel": "Accent Color", + "settingsTerminal": "terminal", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Reabrir abas ao fazer login", "reopenTabsOnLoginDesc": "Restaure suas abas abertas ao fazer login ou atualizar a página, mesmo em outro dispositivo.", - "confirmTabClose": "Confirmar Fechar Aba", - "confirmTabCloseDesc": "Perguntar antes de fechar os guias dos terminais", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Exibir Tags do Host", - "showHostTagsDesc": "Exibir tags na lista de endereços", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Clique para expandir as ações do anfitrião", "hostTrayOnClickDesc": "Sempre mostrar os botões de conexão; clicar para expandir as opções de gerenciamento em vez de passar o cursor sobre elas.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Aplicativo Pin Rail", "pinAppRailDesc": "Mantenha a barra lateral esquerda do aplicativo sempre expandida, em vez de expandir ao passar o cursor sobre ela.", - "settingsSnippets": "Trechos", - "foldersCollapsed": "Pastas colapsadas", - "foldersCollapsedDesc": "Recolher pastas por padrão", - "confirmExecution": "Confirmar execução", - "confirmExecutionDesc": "Confirme antes de executar trechos", - "settingsUpdates": "Atualizações", - "disableUpdateChecks": "Desativar Verificações de Atualizações", - "disableUpdateChecksDesc": "Interromper a verificação de atualizações", - "totpAuthenticator": "Autenticador TOTP", - "totpEnabled": "2FA está habilitado", - "totpDisabled": "Adicionar segurança extra ao login", - "disable": "Desligado", - "enable": "Habilitado", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Escaneie o código QR ou insira o segredo no seu aplicativo de autenticação, e digite o código de 6 dígitos", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verificar", - "changePassword": "Mudar a senha", - "currentPasswordLabel": "Palavra-passe Atual", - "currentPasswordPlaceholder": "Senha atual", - "newPasswordLabel": "Nova Palavra-Passe", - "newPasswordPlaceholder": "Nova senha", - "confirmPasswordLabel": "Confirme a Nova Senha", - "confirmPasswordPlaceholder": "Confirme a nova senha", - "updatePassword": "Atualizar Senha", - "createApiKeyTitle": "Criar chave de API", - "createApiKeyDescription": "Gere uma nova chave de API para acesso programático.", - "apiKeyNameLabel": "Nome:", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "opcional", - "cancel": "cancelar", - "createKey": "Criar chave", - "apiKeyCount": "Chaves {{count}}", - "newKey": "Nova Chave", - "noApiKeys": "Ainda não há chaves de API.", - "apiKeyActive": "ativo", - "apiKeyUsageHint": "Inclua sua chave no", - "apiKeyUsageHintHeader": "cabeçalho.", - "apiKeyPermissionsHint": "Chaves herdam as permissões do usuário criador.", - "roleUser": "Usuário", - "authMethodDual": "Dupla Autenticação", - "authMethodOidc": "OCIDADE", - "totpSetupFailed": "Falha ao iniciar a configuração TOTP", - "totpEnter6Digits": "Insira um código de 6 dígitos", - "totpEnabledSuccess": "Autenticação de dois fatores ativada", - "totpInvalidCode": "Código inválido, por favor tente novamente", - "totpDisableInputRequired": "Digite seu código TOTP ou senha", - "totpDisabledSuccess": "Autenticação de dois fatores desativada", - "totpDisableFailed": "Falha ao desativar 2FA", - "totpDisableTitle": "Desativar 2FA", - "totpDisablePlaceholder": "Insira o código ou senha TOTP", - "totpDisableConfirm": "Desativar 2FA", - "totpContinueVerify": "Continuar a verificar", - "totpVerifyTitle": "Verificar Código", - "totpBackupTitle": "Códigos de recuperação", - "totpDownloadBackup": "Baixar códigos de recuperação", - "done": "Concluído", - "secretCopied": "Segredo copiado para área de transferência", - "apiKeyNameRequired": "O nome da chave é obrigatório", - "apiKeyCreated": "Chave da API \"{{name}}\" criado", - "apiKeyCreateFailed": "Falha ao criar chave de API", - "apiKeyUser": "Usuário", - "apiKeyExpires": "Expira", - "apiKeyRevoked": "Chave de API \"{{name}}\" revogada", - "apiKeyRevokeFailed": "Falha ao revogar chave de API", - "passwordFieldsRequired": "Senhas atuais e novas são necessárias", - "passwordMismatch": "As senhas não coincidem", - "passwordTooShort": "A senha deve ter pelo menos 6 caracteres", - "passwordUpdated": "Senha atualizada com sucesso", - "passwordUpdateFailed": "Falha ao atualizar a senha", - "deletePasswordRequired": "É necessário uma senha para excluir sua conta", - "deleteFailed": "Falha ao excluir conta", - "deleting": "Excluindo...", - "colorPickerTooltip": "Abrir seletor de cores", - "themeSystem": "SISTEMA", - "themeLight": "Fino", - "themeDark": "Escuro", - "themeDracula": "Drácula", + "optional": "optional", + "cancel": "Cancelar", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", + "authMethodOidc": "OIDC", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Ensolarado", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Um Escuro", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Tentar novamente", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remover", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/pt_PT.json b/src/ui/locales/translated/pt_PT.json index 61baf774..f399f004 100644 --- a/src/ui/locales/translated/pt_PT.json +++ b/src/ui/locales/translated/pt_PT.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Pastas", - "folder": "pasta", + "folders": "Folders", + "folder": "Folder", "password": "Palavra-passe", - "key": "Chave", - "sshPrivateKey": "Chave privada SSH", - "upload": "Transferir", - "keyPassword": "Senha da Chave", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "Chave SSH", - "uploadPrivateKeyFile": "Carregar arquivo de chave privada", - "searchCredentials": "Pesquisar credenciais...", - "addCredential": "Adicionar Credencial", - "caCertificate": "Certificado CA (-cert.pub)", - "caCertificateDescription": "Opcional: Carregar ou colar o arquivo de certificado assinado por CA (por exemplo, id_ed25519-cert.pub). Necessário quando o servidor SSH utiliza autorização baseada em certificados.", - "uploadCertFile": "Enviar arquivo -cert.pub", - "clearCert": "Limpar", - "certLoaded": "Certificado carregado", - "certPublicKeyLabel": "Certificado CA", - "certTypeLabel": "Tipo de certificado", - "pasteOrUploadCert": "Colar ou fazer upload de um certificado -cert.pub...", - "hasCaCert": "Possui certificado CA", - "noCaCert": "Nenhum certificado CA" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Ordem padrão", + "sortNameAsc": "Nome (A → Z)", + "sortNameDesc": "Nome (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Limpar filtros", + "filterTypeGroup": "Type", + "filterTypePassword": "Palavra-passe", + "filterTypeKey": "Chave SSH", + "filterTagsGroup": "Etiquetas" }, "homepage": { - "failedToLoadAlerts": "Falha ao carregar alertas", - "failedToDismissAlert": "Falha ao descartar alerta" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Configuração Servidor", - "description": "Configure o URL do servidor do Termix para conectar aos seus serviços de backend", - "serverUrl": "URL do servidor", - "enterServerUrl": "Por favor, insira uma URL de servidor", - "saveFailed": "Falha ao salvar a configuração", - "saveError": "Erro ao salvar configuração", - "saving": "Salvando...", - "saveConfig": "Salvar configuração", - "helpText": "Digite a URL onde o servidor do seu Termix está executando (por exemplo, http://localhost:30001 ou https://seu-servidor.com)", - "changeServer": "Alterar Servidor", - "mustIncludeProtocol": "O URL do servidor deve começar com http:// ou https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Permitir certificado inválido", "allowInvalidCertificateDesc": "Utilize apenas em servidores auto-hospedados fidedignos com certificados autoassinados ou de endereço IP.", - "useEmbedded": "Usar servidor local", - "embeddedDesc": "Executar Termix com o servidor local embutido (não é necessário um servidor remoto)", - "embeddedConnecting": "Conectando ao servidor local...", - "embeddedNotReady": "O servidor local ainda não está pronto. Por favor, aguarde um momento e tente novamente.", - "localServer": "Servidor local" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remover" }, "versionCheck": { - "error": "Erro de verificação de versão", - "checkFailed": "Não foi possível verificar se há atualizações", - "upToDate": "O aplicativo está atualizado", - "currentVersion": "Você está executando a versão {{version}}", - "updateAvailable": "Atualização disponível", - "newVersionAvailable": "Uma nova versão está disponível! Você está executando {{current}}, mas {{latest}} está disponível.", - "betaVersion": "Versão Beta", - "betaVersionDesc": "Você está executando {{current}}, que é mais recente que a última versão estável {{latest}}.", - "releasedOn": "Lançado em {{date}}", - "downloadUpdate": "Baixar atualização", - "checking": "Verificando atualizações...", - "checkUpdates": "Procurar por atualizações", - "checkingUpdates": "Verificando atualizações...", - "updateRequired": "Atualização Necessária" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "FECHAR", + "close": "Close", "minimize": "Minimize", - "online": "Disponível", - "offline": "Desconectado", - "continue": "Continuar", - "maintenance": "Manutenção", - "degraded": "Degradado", - "error": "ERRO", - "warning": "ATENÇÃO", - "unsavedChanges": "Alterações não salvas", - "dismiss": "Descartar", - "loading": "Carregandochar@@0", - "optional": "Opcional", - "connect": "Conectar", - "copied": "Copiado", - "connecting": "Conectandochar@@0", - "updateAvailable": "Atualização disponível", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Abrir em nova aba", - "noReleases": "Sem lançamentos", - "updatesAndReleases": "Atualizações e Versões", - "newVersionAvailable": "Uma nova versão ({{version}}) está disponível.", - "failedToFetchUpdateInfo": "Falha ao buscar informações de atualização", - "preRelease": "Pré-lançamento", - "noReleasesFound": "Nenhuma versão encontrada.", - "cancel": "cancelar", - "username": "Usuário:", - "login": "Conectar-se", - "register": "Cadastrar", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancelar", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Palavra-passe", - "confirmPassword": "Confirmar senha", - "back": "Anterior", - "save": "Guardar", - "saving": "Salvando...", - "delete": "excluir", - "rename": "Renomear", - "edit": "Alterar", - "add": "Adicionar", - "confirm": "Confirmar", - "no": "Não", - "or": "ou", - "next": "Próximo", - "previous": "Anterior", - "refresh": "atualizar", - "language": "IDIOMA", - "checking": "Verificandochar@@0", - "checkingDatabase": "Verificando conexão com o banco de dados...", - "checkingAuthentication": "Verificando autenticação...", - "backendReconnected": "Conexão do servidor restaurada", - "connectionDegraded": "Conexão do servidor perdida, recuperando…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Excluir", - "create": "Crio", - "update": "Atualização", - "copy": "copiar", - "copyFailed": "Falha ao copiar para área de transferência", + "remove": "Remover", + "create": "Create", + "update": "Update", + "copy": "Cópia", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "RESTAURAR", - "of": "de" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Residencial", - "terminal": "Terminal", - "docker": "Atracador", - "tunnels": "Túneis", - "fileManager": "Gerenciador de Arquivos", - "serverStats": "Estatísticas do servidor", - "admin": "Administrador", - "userProfile": "Informações do Perfil", - "splitScreen": "Dividir a tela", - "confirmClose": "Fechar esta sessão ativa?", - "close": "FECHAR", - "cancel": "cancelar", - "sshManager": "Gerenciador SSH", - "cannotSplitTab": "Não é possível dividir esta aba", + "home": "Home", + "terminal": "terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "Gestor de arquivos", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Cancelar", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Copiar Senha", - "copySudoPassword": "Copiar Senha do Sudo", - "passwordCopied": "Senha copiada para área de transferência", - "noPasswordAvailable": "Nenhuma senha disponível", - "failedToCopyPassword": "Falha ao copiar a senha", - "refreshTab": "Atualizar conexão", - "openFileManager": "Abrir Gerenciador de Arquivos", - "dashboard": "Painel", - "networkGraph": "Gráfico da Rede", - "quickConnect": "Conexão rápida", - "sshTools": "Ferramentas SSH", - "history": "Histórico", - "hosts": "Anfitriões", - "snippets": "Trechos", - "hostManager": "Gerenciador de Host", - "credentials": "Credenciais", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Conexões", - "roleAdministrator": "Administrador", - "roleUser": "Usuário" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Anfitriões", - "noHosts": "Nenhum host SSH", - "retry": "Repetir", - "refresh": "atualizar", - "optional": "Opcional", - "downloadSample": "Baixar Exemplo", - "failedToDeleteHost": "Falha ao excluir {{name}}", - "importSkipExisting": "Importar (ignorar existente)", - "connectionDetails": "Detalhes da conexão", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Tentar novamente", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Computador Remoto", - "port": "Porta", - "username": "Usuário:", - "folder": "pasta", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "Etiquetas", - "pin": "PIN", - "addHost": "Adicionar Host", - "editHost": "Editar Host", - "cloneHost": "Clonar Host", - "enableTerminal": "Ativar Terminal", - "enableTunnel": "Ativar Túnel", - "enableFileManager": "Ativar Gerenciador de Arquivos", - "enableDocker": "Ativar Docker", - "defaultPath": "Caminho Padrão", - "connection": "Ligação", - "upload": "Transferir", - "authentication": "Autenticação", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Palavra-passe", - "key": "Chave", + "key": "Key", "credential": "Credencial", - "none": "Nenhuma", - "sshPrivateKey": "Chave privada SSH", - "keyType": "Tipo de chave", - "uploadFile": "Enviar Arquivo", - "tabGeneral": "Gerais", + "none": "Nenhum", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Túneis", - "tabDocker": "Atracador", - "tabFiles": "arquivos", - "tabStats": "Estatísticas", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Compartilhando", - "tabAuthentication": "Autenticação", - "terminal": "Terminal", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "terminal", "tunnel": "Túnel", - "fileManager": "Gerenciador de Arquivos", - "serverStats": "Estatísticas do servidor", - "status": "SItuação", - "folderRenamed": "Pasta \"{{oldName}}\" renomeada para \"{{newName}}\" com sucesso", - "failedToRenameFolder": "Falha ao renomear pasta", - "movedToFolder": "Movido para \"{{folder}}\"", - "editHostTooltip": "Editar host", - "statusChecks": "Verificações de Status", - "metricsCollection": "Coleção de Métricas", - "metricsInterval": "Intervalo de Coleção de Métricas", - "metricsIntervalDesc": "Com que frequência coletar estatísticas do servidor (5s - 1h)", - "behavior": "Comportamento", - "themePreview": "Pré-visualização do tema", - "theme": "Tema", - "fontFamily": "Família de fonte", + "fileManager": "Gestor de arquivos", + "serverStats": "Host Metrics", + "status": "Estatuto", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Espaçamento das letras", - "lineHeight": "Altura da linha", - "cursorStyle": "Estilo do cursor", - "cursorBlink": "Pisca do Cursor", - "scrollbackBuffer": "Buffer de rolagem", - "bellStyle": "Estilo do sino", - "rightClickSelectsWord": "Clique com botão direito seleciona Palavra", - "fastScrollModifier": "Modificador de rolagem rápido", - "fastScrollSensitivity": "Sensibilidade de rolagem rápida", - "sshAgentForwarding": "Encaminhamento de agente SSH", - "backspaceMode": "Modo Backspace", - "startupSnippet": "Trecho de Inicialização", - "selectSnippet": "Selecionar snippet", - "forceKeyboardInteractive": "Forçar teclado interativo", - "overrideCredentialUsername": "Substituir o nome de usuário credencial", - "overrideCredentialUsernameDesc": "Use o nome de usuário especificado acima ao invés do nome de usuário da credencial", - "jumpHostChain": "Corrente de Host Salto", - "portKnocking": "Knocking de Porta", - "addKnock": "Adicionar Porta", - "addProxyNode": "Adicionar node", - "proxyNode": "Nó Proxy", - "proxyType": "Tipo de proxy", - "quickActions": "Ações rápidas", - "sudoPasswordAutoFill": "Auto-preenchimento de Senha Sudo", - "sudoPassword": "Senha Sudo", - "keepaliveInterval": "Intervalo de Mantícora (ms)", - "moshCommand": "Comando MOSH", - "environmentVariables": "Variáveis de Ambiente", - "addVariable": "Adicionar Variável", - "docker": "Atracador", - "copyTerminalUrl": "Copiar URL do Terminal", - "copyFileManagerUrl": "Copiar URL do Gerenciador de Arquivos", - "copyRemoteDesktopUrl": "Copiar URL do Desktop Remoto", - "failedToConnect": "Falha ao conectar ao console", - "connect": "Conectar", - "disconnect": "Desconectar", - "start": "Iniciar", - "enableStatusCheck": "Ativar verificação de status", - "enableMetrics": "Habilitar métricas", - "bulkUpdateFailed": "Atualização em massa falhou", - "selectAll": "Selecionar Todos", - "deselectAll": "Desmarcar Todos", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Projétil Seguro", - "virtualNetwork": "Rede Virtual", - "unencryptedShell": "shell não criptografado", - "addressIp": "Endereço / IP", - "friendlyName": "Nome Amigável", - "folderAndAdvanced": "Pasta & Avançada", - "privateNotes": "Notas do trabalho", - "privateNotesPlaceholder": "Detalhes sobre este servidor...", - "pinToTop": "Fixar no topo", - "pinToTopDesc": "Sempre mostrar este host no topo da lista", - "portKnockingSequence": "Sequência de Portas Knocking", - "addKnockBtn": "Adicionar toco", - "noPortKnocking": "Nenhuma porta ativa configurada.", - "knockPort": "Porta do Knock", - "protocol": "Protocol", - "delayAfterMs": "Atraso após (ms)", - "useSocks5Proxy": "Usar Proxy SOCKS5", - "useSocks5ProxyDesc": "Conexão de rota através de um servidor proxy", - "proxyHost": "Servidor de Proxy", - "proxyPort": "Porta do Proxy", - "proxyUsername": "Usuário do Proxy", - "proxyPassword": "Senha do Proxy", - "proxySingleMode": "Proxy Único", - "proxyChainMode": "Corrente de Proxy", - "you": "Tu", - "jumpHostChainLabel": "Corrente de Host Salto", - "addJumpBtn": "Adicionar Salto", - "noJumpHosts": "Nenhum host de salto configurado.", - "selectAServer": "Selecione um servidor...", - "sshPort": "Porta SSH", - "authMethod": "Método de Autenticação", - "storedCredential": "Credenciais armazenadas", - "selectACredential": "Selecione uma credencial...", - "keyTypeLabel": "Tipo de chave", - "keyTypeAuto": "Detecção automática", - "keyPasteTab": "Colar", - "keyUploadTab": "Transferir", - "keyFileLoaded": "Arquivo de chave carregado", - "keyUploadClick": "Clique para enviar .pem / .key / .ppk", - "clearKey": "Limpar Chave", - "keySaved": "Chave SSH salva", - "keyReplaceNotice": "colar uma nova chave abaixo para substituí-la", - "keyPassphraseSaved": "Senha salva, digite a mudar", - "replaceKey": "Substituir chave", - "forceKeyboardInteractiveLabel": "Forçar teclado interativo", - "forceKeyboardInteractiveShortDesc": "Forçar entrada de senha manual, mesmo se chaves estiverem presentes", - "terminalAppearance": "Aparência do Terminal", - "colorTheme": "Tema de Cor", - "fontFamilyLabel": "Família de fonte", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protocolo", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Estilo do cursor", - "letterSpacingPx": "Espaçamento das letras (px)", - "lineHeightLabel": "Altura da linha", - "bellStyleLabel": "Estilo do sino", - "backspaceModeLabel": "Modo Backspace", - "cursorBlinking": "Piscar cursor", - "cursorBlinkingDesc": "Ativar animação piscante para o cursor do terminal", - "rightClickSelectsWordLabel": "Clique com botão direito seleciona Palavra", - "rightClickSelectsWordShortDesc": "Selecione a palavra no botão direito do mouse", - "behaviorAndAdvanced": "Comportamento & Avançado", - "scrollbackBufferLabel": "Buffer de rolagem", - "scrollbackMaxLines": "Número máximo de linhas mantidas no histórico", - "sshAgentForwardingLabel": "Encaminhamento de agente SSH", - "sshAgentForwardingShortDesc": "Passe suas chaves SSH locais para este host", - "enableAutoMosh": "Habilitar Mosh Automático", - "enableAutoMoshDesc": "Prefere Mosh por SSH se disponível", - "enableAutoTmux": "Ativar Tmux Automático", - "enableAutoTmuxDesc": "Iniciar ou anexar automaticamente à sessão tmux", - "sudoPasswordAutoFillLabel": "Auto-preenchimento de Senha Sudo", - "sudoPasswordAutoFillShortDesc": "Automaticamente fornecer senha sudo quando solicitado", - "sudoPasswordLabel": "Senha Sudo", - "environmentVariablesLabel": "Variáveis de Ambiente", - "addVariableBtn": "Adicionar Variável", - "noEnvVars": "Nenhuma variável de ambiente configurada.", - "fastScrollModifierLabel": "Modificador de rolagem rápido", - "fastScrollSensitivityLabel": "Sensibilidade de rolagem rápida", - "moshCommandLabel": "Comando Mosh", - "startupSnippetLabel": "Trecho de Inicialização", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Intervalo de Keepalive (segundos)", - "maxKeepaliveMisses": "Máximo de Perdas Keepalive", - "tunnelSettings": "Configurações de túnel", - "enableTunneling": "Ativar Túnel", - "enableTunnelingDesc": "Ativar a funcionalidade de túnel SSH para esse host", - "serverTunnelsSection": "Túneis do servidor", - "addTunnelBtn": "Adicionar túnel", - "noTunnelsConfigured": "Nenhum túnel configurado.", - "tunnelLabel": "Túnel {{number}}", - "tunnelType": "Tipo de túnel", - "tunnelModeLocalDesc": "Encaminhar uma porta local para uma porta no servidor remoto (ou um host acessível a partir da).", - "tunnelModeRemoteDesc": "Encaminha uma porta no servidor remoto de volta para uma porta local na sua máquina.", - "tunnelModeDynamicDesc": "Crie um proxy SOCKS5 em uma porta local para encaminhamento de porta dinâmica.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Este host (túnel direto)", - "endpointHost": "Host de Endpoint", - "endpointPort": "Porta de Endpoint", - "bindHost": "Vincular Host", - "sourcePort": "Porta de origem", - "maxRetries": "Máximo de buscas", - "retryIntervalS": "Intervalo de Repetir", - "autoStartLabel": "Auto-iniciar", - "autoStartDesc": "Conectar automaticamente este túnel quando o host é carregado", - "tunnelConnecting": "Túnel conectando...", - "tunnelDisconnected": "Túnel desconectado", - "failedToConnectTunnel": "Falha ao conectar", - "failedToDisconnectTunnel": "Falha ao desconectar", - "dockerIntegration": "Integração Docker", - "enableDockerMonitor": "Ativar Docker", - "enableDockerMonitorDesc": "Monitorar e gerenciar contêineres neste host via Docker", - "enableFileManagerMonitor": "Ativar Gerenciador de Arquivos", - "enableFileManagerMonitorDesc": "Navegue e gerencie arquivos neste host através do SFTP", - "defaultPathLabel": "Caminho Padrão", - "fileManagerPathHint": "O diretório a abrir quando o gerenciador de arquivos é aberto para este host.", - "statusChecksLabel": "Verificações de Status", - "enableStatusChecks": "Habilitar Verificação de Status", - "enableStatusChecksDesc": "Periodicamente ping este host para verificar a disponibilidade", - "useGlobalInterval": "Usar Intervalo Global", - "useGlobalIntervalDesc": "Substituir com o intervalo de verificação de status de todo o servidor", - "checkIntervalS": "Intervalo de verificação", - "checkIntervalDesc": "Segundos entre cada ping de conectividade", - "metricsCollectionLabel": "Coleção de Métricas", - "enableMetricsLabel": "Habilitar métricas", - "enableMetricsDesc": "Coletar CPU, RAM, disco e uso de rede deste host", - "useGlobalMetrics": "Usar Intervalo Global", - "useGlobalMetricsDesc": "Sobrescrever com o intervalo de métricas para o servidor", - "metricsIntervalS": "Intervalo de Métricas", - "metricsIntervalDesc2": "Segundos entre snapshots métricos", - "visibleWidgets": "Widgets visíveis", - "cpuUsageLabel": "Uso da CPU", - "cpuUsageDesc": "CPU por cento, carregar médias de carga, gráfico de linha", - "memoryLabel": "Memória Utilizada", - "memoryDesc": "Uso de RAM, troque, em cache", - "storageLabel": "Uso do disco", - "storageDesc": "Uso do disco por ponto de montagem", - "networkLabel": "Interfaces de Rede", - "networkDesc": "Lista de interface e banda", - "uptimeLabel": "Tempo em atividade", - "uptimeDesc": "Tempo de atividade e inicialização do sistema", - "systemInfoLabel": "Informações do Sistema", - "systemInfoDesc": "OS, kernel, hostname, arquitetura", - "recentLoginsLabel": "Logins recentes", - "recentLoginsDesc": "Eventos bem-sucedidos e falhados de login", - "topProcessesLabel": "Processos mais Populares", - "topProcessesDesc": "PID, CPU%, MEM%, comando", - "listeningPortsLabel": "Porta de Escuta", - "listeningPortsDesc": "Abrir portas com processo e estado", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Palavra-passe", + "authTypeKey": "Chave SSH", + "authTypeCredential": "Credencial", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Nenhum", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, status do SELinux", - "quickActionsLabel": "Ações rápidas", - "quickActionsToolbar": "Ações rápidas aparecem como botões na barra de estatísticas do servidor para execução de comando com um clique.", - "noQuickActions": "Nenhuma ação rápida ainda.", - "buttonLabel": "Rótulo do botão", - "selectSnippetPlaceholder": "Selecionar snippet...", - "addActionBtn": "Adicionar ação", - "hostSharedSuccessfully": "Hospedeiro compartilhado com sucesso", - "failedToShareHost": "Falha ao compartilhar host", - "accessRevoked": "Acesso revogado", - "failedToRevokeAccess": "Falha ao revogar acesso", - "cancelBtn": "cancelar", - "savingBtn": "Salvando...", - "addHostBtn": "Adicionar Host", - "hostUpdated": "Servidor atualizado", - "hostCreated": "Host criado", - "failedToSave": "Falha ao salvar o host", - "credentialUpdated": "Credencial atualizada", - "credentialCreated": "Credencial criada", - "failedToSaveCredential": "Falha ao salvar credencial", - "backToHosts": "Voltar aos hosts", - "backToCredentials": "Voltar às Credenciais", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancelar", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Fixado", - "noHostsFound": "Nenhum host encontrado", - "tryDifferentTerm": "Tente um termo diferente", - "addFirstHost": "Adicione o seu primeiro host para começar", - "noCredentialsFound": "Nenhuma credencial encontrada", - "addCredentialBtn": "Adicionar Credencial", - "updateCredentialBtn": "Atualizar Credencial", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Funcionalidades", - "noFolder": "(Sem pasta)", - "deleteSelected": "excluir", - "exitSelection": "Sair da seleção", - "importSkip": "Importar (ignorar existente)", - "importOverwrite": "Importação (sobrescrever)", - "collapseBtn": "Recolher", - "importExportBtn": "Importar / Exportar", - "hostStatusesRefreshed": "Status do host atualizados", - "failedToRefreshHosts": "Falha ao atualizar hosts", - "movedHostTo": "Mudou {{host}} para \"{{folder}}\"", - "failedToMoveHost": "Falha ao mover host", - "folderRenamedTo": "Pasta renomeada para \"{{name}}\"", - "deletedFolder": "Pasta apagada \"{{name}}\"", - "failedToDeleteFolder": "Falha ao excluir pasta", - "deleteAllInFolder": "Excluir todos os hosts em \"{{name}}\"? Isso não pode ser desfeito.", - "deletedHost": "{{name}} Excluído", - "copiedToClipboard": "Copiado para o clipboard", - "terminalUrlCopied": "URL do terminal copiado", - "fileManagerUrlCopied": "URL do Gerenciador de Arquivos copiado", - "tunnelUrlCopied": "URL do túnel copiado", - "dockerUrlCopied": "URL Docker copiado", - "serverStatsUrlCopied": "URL das estatísticas do servidor copiado", - "rdpUrlCopied": "URL RDP copiada", - "vncUrlCopied": "URL VNC copiada", - "telnetUrlCopied": "URL da rede copiada", - "remoteDesktopUrlCopied": "URL da área de trabalho remoto copiada", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancelar", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Estatuto", + "GroupByProtocol": "Protocolo", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Expandir ações", "collapseActions": "Ações de cobrança", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Pacote mágico enviado para {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Falha ao enviar o pacote mágico", - "cloneHostAction": "Clonar Host", - "copyAddress": "Copiar Endereço", - "copyLink": "Copiar link", - "copyTerminalUrlAction": "Copiar URL do Terminal", - "copyFileManagerUrlAction": "Copiar URL do Gerenciador de Arquivos", - "copyTunnelUrlAction": "Copiar URL do túnel", - "copyDockerUrlAction": "Copiar URL do Docker", - "copyServerStatsUrlAction": "Copiar URL das Estatísticas do Servidor", - "copyRdpUrlAction": "Copiar URL do RDP", - "copyVncUrlAction": "Copiar URL do VNC", - "copyTelnetUrlAction": "Copiar URL da Telnet", - "copyRemoteDesktopUrlAction": "Copiar URL do Desktop Remoto", - "deleteCredentialConfirm": "Excluir credencial \"{{name}}\"?", - "deletedCredential": "{{name}} Excluído", - "deploySSHKeyTitle": "Chave SSH de deploy", - "deployingBtn": "Implementando...", - "deployBtn": "Implantar", - "failedToDeployKey": "Falha ao publicar chave", - "deleteHostsConfirm": "Excluir o host {{count}}{{plural}}? Isso não pode ser desfeito.", - "movedToRoot": "Movido para a raiz", - "failedToMoveHosts": "Falha ao mover hosts", - "enableTerminalFeature": "Ativar Terminal", - "disableTerminalFeature": "Desativar Terminal", - "enableFilesFeature": "Habilitar arquivos", - "disableFilesFeature": "Desabilitar Arquivos", - "enableTunnelsFeature": "Ativar túneis", - "disableTunnelsFeature": "Desativar Túneis", - "enableDockerFeature": "Ativar Docker", - "disableDockerFeature": "Desativar Docker", - "addTagsPlaceholder": "Adicionar tags...", - "authDetails": "Detalhes de autenticação", - "credType": "tipo", - "generateKeyPairDesc": "Gerar um novo par de chaves, chaves privadas e públicas serão preenchidas automaticamente.", - "generatingKey": "Gerando...", - "generateLabel": "Gerar {{label}}", - "uploadFileBtn": "Upload de arquivo", - "keyPassphraseOptional": "Senha Chave (Opcional)", - "sshPublicKeyOptional": "Chave Pública SSH (Opcional)", - "publicKeyGenerated": "Chave pública gerada", - "failedToGeneratePublicKey": "Falha ao derivar chave pública", - "publicKeyCopied": "Chave pública copiada", - "keyPairGenerated": "Um par de chaves {{label}} gerado", - "failedToGenerateKeyPair": "Falha ao gerar o par de chaves", - "searchHostsPlaceholder": "Pesquisar hospedeiros, endereços, etiquetas…", - "searchCredentialsPlaceholder": "Pesquisar credenciais…", - "refreshBtn": "atualizar", - "addTag": "Adicionar tags...", - "deleteConfirmBtn": "excluir", - "tunnelRequirementsText": "O servidor SSH deve ter GatewayPorts sim, AllowTcpForwarding yes, e permitRootLogin yes definido em /etc/ssh/sshd_config.", - "deleteHostConfirm": "Excluir \"{{name}}\"?", - "enableAtLeastOneProtocol": "Ative pelo menos um protocolo acima para configurar as configurações de autenticação e conexão.", - "keyPassphrase": "Senha Chave", - "connectBtn": "Conectar", - "disconnectBtn": "Desconectar", - "basicInformation": "Informações Básicas", - "authDetailsSection": "Detalhes de autenticação", - "credTypeLabel": "tipo", - "hostsTab": "Anfitriões", - "credentialsTab": "Credenciais", - "selectMultiple": "Selecionar múltiplos", - "selectHosts": "Selecionar hosts", - "connectionLabel": "Ligação", - "authenticationLabel": "Autenticação", - "generateKeyPairTitle": "Gerar par de chaves", - "generateKeyPairDescription": "Gerar um novo par de chaves, chaves privadas e públicas serão preenchidas automaticamente.", - "generateFromPrivateKey": "Gerar a partir da Chave Privada", - "refreshBtn2": "atualizar", - "exitSelectionTitle": "Sair da seleção", - "exportAll": "Exportar tudo", - "addHostBtn2": "Adicionar Host", - "addCredentialBtn2": "Adicionar Credencial", - "checkingHostStatuses": "Verificando status do host...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Fixado", - "hostsExported": "Hosts exportados com sucesso", + "hostsExported": "Hosts exported successfully", "exportFailed": "Falha ao exportar hosts", - "sampleDownloaded": "Exemplo de arquivo baixado", - "failedToDeleteCredential2": "Falha ao excluir credencial", - "noFolderOption": "(Sem pasta)", - "nSelected": "{{count}} selecionado", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Funcionalidades", - "moveMenu": "Mover-se", - "cancelSelection": "cancelar", - "deployDialogDesc": "Implantar {{name}} em um host authorized_keys.", - "targetHostLabel": "Host de destino", - "selectHostOption": "Selecione um host...", - "keyDeployedSuccess": "Chave implantada com sucesso", - "failedToDeployKey2": "Falha ao publicar chave", - "deletedCount": "Hosts {{count}} excluídos", - "failedToDeleteCount": "Falha ao excluir hosts {{count}}", - "duplicatedHost": "Duplicado \"{{name}}\"", - "failedToDuplicateHost": "Falha ao duplicar host", - "updatedCount": "Hosts {{count}} atualizados", - "friendlyNameLabel": "Nome Amigável", - "descriptionLabel": "Descrição:", - "loadingHost": "Carregando host...", - "loadingHosts": "Carregando hosts...", - "loadingCredentials": "Carregando credenciais...", - "noHostsYet": "Nenhum host ainda", - "noHostsMatchSearch": "Nenhum host corresponde à sua pesquisa", - "hostNotFound": "Host não encontrado", - "searchHosts": "Procurar hosts...", + "moveMenu": "Mover", + "connectSelected": "Connect", + "cancelSelection": "Cancelar", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Classificar hosts", "sortDefault": "Ordem padrão", "sortNameAsc": "Nome (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Túnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "Etiquetas", - "shareHost": "Host de compartilhamento", - "shareHostTitle": "Compartilhar: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Este host deve usar uma credencial para permitir o compartilhamento. Edite o host e atribua uma credencial primeiro." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Ligação", - "authentication": "Autenticação", - "connectionSettings": "Configurações de conexão", - "displaySettings": "Configurações de exibição", - "audioSettings": "Configurações de Áudio", - "rdpPerformance": "Desempenho RDP", - "deviceRedirection": "Redirecionamento do dispositivo", - "session": "Sessão", - "gateway": "Desvio", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credencial", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Área", - "sessionRecording": "Gravação de Sessão", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Configurações do VNC", - "terminalSettings": "Configurações do Terminal", - "rdpPort": "Porta RDP", - "username": "Usuário:", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Palavra-passe", - "domain": "Domínio", - "securityMode": "Modo de Segurança", - "colorDepth": "Profundidade da Cor", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Altura", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Método de Redimensionar", - "clientName": "Nome do Cliente", - "initialProgram": "Programa inicial", - "serverLayout": "Layout do Servidor", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Porta do Gateway", - "gatewayUsername": "Usuário do Gateway", - "gatewayPassword": "Senha do Gateway", - "gatewayDomain": "Domínio de Gateway", - "remoteAppProgram": "Programa RemoteApp", - "workingDirectory": "Diretório de trabalho", - "arguments": "Parâmetros", - "normalizeLineEndings": "Normalizar Extensões de Linha", - "recordingPath": "Caminho de gravação", - "recordingName": "Nome da gravação", - "macAddress": "Endereço MAC", - "broadcastAddress": "Endereço de Transmissão", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Tempo de Espera", - "driveName": "Nome da unidade", - "drivePath": "Caminho do Drive", - "ignoreCertificate": "Ignorar Certificado", - "ignoreCertificateDesc": "Permitir conexões para hosts com certificados auto-assinados", - "forceLossless": "Forçar perda", - "forceLosslessDesc": "Forçar codificação de imagens sem perdas (maior qualidade, mais largura de banda)", - "disableAudio": "Desativar Áudio", - "disableAudioDesc": "Silenciar todo o áudio da sessão remota", - "enableAudioInput": "Habilitar Entrada de Áudio (Microfone)", - "enableAudioInputDesc": "Encaminhar o microfone local para a sessão remota", - "wallpaper": "Plano de fundo", - "wallpaperDesc": "Mostrar plano de fundo da área de trabalho (desabilitar melhora o desempenho)", - "theming": "Temas", - "themingDesc": "Ativar temas e estilos visuais", - "fontSmoothing": "Suavização da Fonte", - "fontSmoothingDesc": "Habilitar renderização de fonte ClearType", - "fullWindowDrag": "Arrastar a janela completa", - "fullWindowDragDesc": "Mostrar conteúdo da janela ao arrastar", - "desktopComposition": "Composição da mesa", - "desktopCompositionDesc": "Habilitar efeitos de vidro Aero", - "menuAnimations": "Animações do menu", - "menuAnimationsDesc": "Ativar animações de deslize e deslize do menu", - "disableBitmapCaching": "Desabilitar Cache Bitmap", - "disableBitmapCachingDesc": "Desativar o cache do bitmap (pode ajudar com glitches)", - "disableOffscreenCaching": "Desativar Cache Offscreen", - "disableOffscreenCachingDesc": "Desativar cache de tela desligada", - "disableGlyphCaching": "Desativar Cache Glyph", - "disableGlyphCachingDesc": "Desligar cache glifo", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Usar RemoteFX pipeline graphics", - "enablePrinting": "Ativar impressão", - "enablePrintingDesc": "Redirecionar impressoras locais para a sessão remota", - "enableDriveRedirection": "Habilitar redirecionamento de unidade", - "enableDriveRedirectionDesc": "Mapear uma pasta local como um drive na sessão remota", - "createDrivePath": "Criar caminho de unidade", - "createDrivePathDesc": "Criar automaticamente a pasta se ela não existir", - "disableDownload": "Desativar download", - "disableDownloadDesc": "Impedir o download de arquivos da sessão remota", - "disableUpload": "Desabilitar Upload", - "disableUploadDesc": "Evitar o envio de arquivos para a sessão remota", - "enableTouch": "Ativar Touch", - "enableTouchDesc": "Ativar encaminhamento de entrada de toque", - "consoleSession": "Sessão de Console", - "consoleSessionDesc": "Conectar ao console (sessão 0) em vez de uma nova sessão", - "sendWolPacket": "Enviar Pacote WOL", - "sendWolPacketDesc": "Envie um pacote mágico para acordar este host antes de conectar", - "disableCopy": "Desativar Cópia", - "disableCopyDesc": "Impedir a cópia de texto da sessão remota", - "disablePaste": "Desativar Colar", - "disablePasteDesc": "Impedir colar texto na sessão remota", - "createPathIfMissing": "Criar caminho se estiver faltando", - "createPathIfMissingDesc": "Criar automaticamente o diretório de gravação", - "excludeOutput": "Excluir saída", - "excludeOutputDesc": "Não gravar a saída da tela (apenas metadados)", - "excludeMouse": "Excluir mouse", - "excludeMouseDesc": "Não grave os movimentos do mouse", - "includeKeystrokes": "Incluir Teclas Pressionadas", - "includeKeystrokesDesc": "Gravar teclas rasteiras brutas além da saída da tela", - "vncPort": "Porta VNC", - "vncPassword": "Senha VNC", - "vncUsernameOptional": "Nome de usuário (opcional)", - "vncLeaveBlank": "Deixe em branco se não necessário", - "cursorMode": "Modo Cursor", - "swapRedBlue": "Trocar Vermelho/Azul", - "swapRedBlueDesc": "Troque os canais de cor vermelho e azul (corrige alguns problemas de cor)", - "readOnly": "Somente leitura", - "readOnlyDesc": "Ver a tela remota sem enviar qualquer entrada", - "telnetPort": "Porta de Telnet", - "terminalType": "Tipo de Terminal", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Esquema de Cor", - "backspaceKey": "Chave de Backspace", - "saveHostFirst": "Salve o host primeiro.", - "sharingOptionsAfterSave": "Opções de compartilhamento estão disponíveis após o host ser salvo.", - "sharingLoadError": "Não foi possível carregar os dados de compartilhamento. Verifique sua conexão e tente novamente.", - "shareHostSection": "Host de compartilhamento", - "shareWithUser": "Compartilhar com Usuário", - "shareWithRole": "Compartilhar com Função", - "selectUser": "Selecionar usuário", - "selectRole": "Selecione a função", - "selectUserOption": "Selecione um usuário...", - "selectRoleOption": "Selecione uma função...", - "permissionLevel": "Nível de permissão", - "expiresInHours": "Expira em (horas)", - "noExpiryPlaceholder": "Deixe em branco para não expirar", - "shareBtn": "Compartilhar", - "currentAccess": "Acesso atual", - "typeHeader": "tipo", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Permisschar@@0o", - "grantedByHeader": "Concedido por", - "expiresHeader": "Expira", - "noAccessEntries": "Ainda não há entradas de acesso.", - "expiredLabel": "Expirado", - "neverLabel": "nunca", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "cancelar", - "savingBtn": "Salvando...", - "updateHostBtn": "Atualizar Host", - "addHostBtn": "Adicionar Host" + "cancelBtn": "Cancelar", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Procurar por hosts, comandos ou configurações...", - "quickActions": "Ações rápidas", - "hostManager": "Gerenciador de Host", - "hostManagerDesc": "Gerenciar, adicionar ou editar hosts", - "addNewHost": "Adicionar Novo Host", - "addNewHostDesc": "Registrar um novo host", - "adminSettings": "Configurações de administrador", - "adminSettingsDesc": "Configurar preferências do sistema e usuários", - "userProfile": "Informações do Perfil", - "userProfileDesc": "Gerenciar sua conta e preferências", - "addCredential": "Adicionar Credencial", - "addCredentialDesc": "Armazenar chaves SSH ou senhas", - "recentActivity": "Atividade recente", - "serversAndHosts": "Servidores e Hosts", - "noHostsFound": "Nenhum host encontrado \"{{search}}\"", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", "links": "Links", "navigate": "Navigate", - "select": "Selecionar", - "toggleWith": "Alternar com" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Nenhuma aba atribuída", + "noTabAssigned": "No tab assigned", "focusedPane": "Painel ativo" }, "connections": { "noConnections": "Sem ligações", "noConnectionsDesc": "Abra um terminal, um gestor de ficheiros ou uma área de trabalho remota para ver aqui as ligações.", - "connectedFor": "Ligado por {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Conectado", "disconnected": "Desconectado", "closeTab": "Fechar aba", @@ -801,358 +981,374 @@ "sectionBackground": "Fundo", "backgroundDesc": "As sessões permanecem ativas durante 30 minutos após a desconexão e podem ser reconectadas.", "persisted": "Persistiu em segundo plano", - "expiresIn": "Expira em {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Procurar ligações...", - "noSearchResults": "Nenhuma ligação corresponde à sua pesquisa." + "noSearchResults": "Nenhuma ligação corresponde à sua pesquisa.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Conectando à sessão {{type}}", - "connectionError": "Erro de conexão", - "connectionFailed": "Conexão falhou", - "failedToConnect": "Falha ao obter token de conexão", - "hostNotFound": "Host não encontrado", - "noHostSelected": "Nenhum host selecionado", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Falha na ligação", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "Reconectar", - "retry": "Repetir", - "guacdUnavailable": "Serviço de desktop remoto (guacd) não disponível. Por favor certifique-se que o guacd está sendo executado e acessível e configurado corretamente nas configurações de administração.", + "retry": "Tentar novamente", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Tela de bloqueio)", - "winKey": "Chave do Windows", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Turno", - "win": "Vitória", - "stickyActive": "{{key}} (retido - clique para liberar)", - "stickyInactive": "{{key}} (clique para travar)", - "esc": "Prosseguir", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Residencial", - "end": "Término", - "pageUp": "Página Acima", - "pageDown": "Página abaixo", - "arrowUp": "Seta para cima", - "arrowDown": "Seta para baixo", - "arrowLeft": "Seta para esquerda", - "arrowRight": "Seta para direita", - "fnToggle": "Chaves de função", - "reconnect": "Reconectar Sessão", - "collapse": "Recolher barra de ferramentas", - "expand": "Expandir barra de ferramentas", - "dragHandle": "Arraste para reposicionar" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Conectar ao Host", - "clear": "Limpar", - "paste": "Colar", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "Reconectar", - "connectionLost": "Conexão perdida", + "connectionLost": "Connection lost", "connected": "Conectado", - "clipboardWriteFailed": "Falha ao copiar para a área de transferência. Certifique-se de que a página seja servida por HTTPS ou localhost.", - "clipboardReadFailed": "Falha ao ler da área de transferência. Certifique-se de que as permissões da área de transferência foram concedidas.", - "clipboardHttpWarning": "Colar requer HTTPS. Use Ctrl+Shift+V ou sirva Termix em HTTPS.", - "unknownError": "Ocorreu um erro desconhecido", - "websocketError": "Erro de conexão WebSocket", - "connecting": "Conectandochar@@0", - "noHostSelected": "Nenhum host selecionado", - "reconnecting": "Reconectando... ({{attempt}}/{{max}})", - "reconnected": "Reconectado com sucesso", - "tmuxSessionCreated": "sessão tmux criada: {{name}}", - "tmuxSessionAttached": "sessão tmux anexada: {{name}}", - "tmuxUnavailable": "tmux não está instalado no host remoto, voltando ao shell padrão", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", "tmuxSessionPickerTitle": "tmux Sessions", - "tmuxSessionPickerDesc": "Sessões tmux existentes encontradas neste host. Selecione uma para reanexar ou criar uma nova sessão.", - "tmuxWindows": "Janelas", - "tmuxWindowCount": "{{count}} janela", - "tmuxAttached": "Clientes anexados", - "tmuxAttachedCount": "{{count}} anexou", - "tmuxLastActivity": "Última atividade", - "tmuxTimeJustNow": "neste momento", - "tmuxTimeMinutes": "{{count}}m atrás", - "tmuxTimeHours": "{{count}}há h", - "tmuxTimeDays": "{{count}}há alguns dias", - "tmuxCreateNew": "Iniciar nova sessão", - "tmuxCopyHint": "Ajustar seleção e pressione Enter para copiar para área de transferência", - "tmuxDetach": "Desanexar da sessão do tmux", - "tmuxDetached": "Desanexado da sessão do tmux", - "maxReconnectAttemptsReached": "Máximo de tentativas de reconexão alcançadas", - "closeTab": "FECHAR", - "connectionTimeout": "Conexão expirada", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Executando {{command}} - {{host}}", - "totpRequired": "Autenticação dupla requerida", - "totpCodeLabel": "Código de verificação", - "totpVerify": "Verificar", - "warpgateAuthRequired": "Autenticação Warpgate Necessária", - "warpgateSecurityKey": "Chave de Segurança", - "warpgateAuthUrl": "URL de autenticação", - "warpgateOpenBrowser": "Abrir no Navegador", - "warpgateContinue": "Eu concluí a autenticação", - "opksshAuthRequired": "Autenticação OPKSSH necessária", - "opksshAuthDescription": "Conclua a autenticação no seu navegador para continuar. Essa sessão permanecerá válida por 24 horas.", - "opksshOpenBrowser": "Abra o navegador para autenticar", - "opksshWaitingForAuth": "Aguardando autenticação no navegador...", - "opksshAuthenticating": "Processando autenticação...", - "opksshTimeout": "Tempo de autenticação esgotado. Por favor, tente novamente.", - "opksshAuthFailed": "Falha na autenticação. Por favor, verifique suas credenciais e tente novamente.", - "opksshSignInWith": "Entrar com {{provider}}", - "sudoPasswordPopupTitle": "Inserir senha?", - "websocketAbnormalClose": "A conexão foi fechada inesperadamente. Isso pode ser devido a um problema de configuração do proxy reverso ou SSL. Por favor, verifique os logs do servidor.", - "connectionLogTitle": "Registro de conexão", - "connectionLogCopy": "Copiar logs para área de transferência", - "connectionLogEmpty": "Ainda não há registros de conexão", - "connectionLogWaiting": "Aguardando registros de conexão...", - "connectionLogCopied": "Logs de conexão copiados para área de transferência", - "connectionLogCopyFailed": "Falha ao copiar os logs para a área de transferência", - "connectionRejected": "Conexão rejeitada pelo servidor. Verifique sua autenticação e configuração de rede.", - "hostKeyRejected": "Verificação de chave do host SSH rejeitada. Conexão cancelada.", - "sessionTakenOver": "A sessão foi aberta em outra aba. Reconectando..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Aberto", + "linkDialogCopy": "Cópia", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Aba dividida", + "addToSplit": "Adicionar à divisão", + "removeFromSplit": "Remover da divisão" + } }, "fileManager": { - "noHostSelected": "Nenhum host selecionado", - "initializingEditor": "Inicializando o editor...", - "file": "Arquivo", - "folder": "pasta", - "uploadFile": "Enviar Arquivo", - "downloadFile": "BAIXAR", - "extractArchive": "Extrair arquivo", - "extractingArchive": "Extraindo {{name}}...", - "archiveExtractedSuccessfully": "{{name}} extraído com sucesso", - "extractFailed": "Falha ao extrair", - "compressFile": "Compactar arquivo", - "compressFiles": "Compactar arquivos", - "compressFilesDesc": "Comprimir itens {{count}} em um arquivo", - "archiveName": "Nome do Arquivo", - "enterArchiveName": "Informe o nome do arquivo...", - "compressionFormat": "Formato de compressão", - "selectedFiles": "Arquivos selecionados", - "andMoreFiles": "e mais {{count}}...", - "compress": "Compactar", - "compressingFiles": "Comprimindo {{count}} itens em {{name}}...", - "filesCompressedSuccessfully": "{{name}} criado com sucesso", - "compressFailed": "Compressão falhou", - "edit": "Alterar", - "preview": "Pré-visualizar", - "previous": "Anterior", - "next": "Próximo", - "pageXOfY": "Página {{current}} de {{total}}", - "zoomOut": "Diminuir o zoom", - "zoomIn": "Aumentar zoom", - "newFile": "Novo arquivo", - "newFolder": "Adicionar uma pasta", - "rename": "Renomear", - "uploading": "Enviando...", - "uploadingFile": "Enviando {{name}}...", - "fileName": "Nome do arquivo", - "folderName": "Nome da pasta", - "fileUploadedSuccessfully": "Arquivo \"{{name}}\" carregado com sucesso", - "failedToUploadFile": "Falha ao carregar arquivo", - "fileDownloadedSuccessfully": "Arquivo \"{{name}}\" baixado com sucesso", - "failedToDownloadFile": "Não foi possível baixar o arquivo", - "fileCreatedSuccessfully": "Arquivo \"{{name}}\" criado com sucesso", - "folderCreatedSuccessfully": "Pasta \"{{name}}\" criada com sucesso", - "failedToCreateItem": "Falha ao criar item", - "operationFailed": "A operação {{operation}} falhou para {{name}}: {{error}}", - "failedToResolveSymlink": "Falha ao resolver link simbólico", - "itemsDeletedSuccessfully": "Itens {{count}} excluídos com sucesso", - "failedToDeleteItems": "Falha ao excluir itens", - "sudoPasswordRequired": "Senha do Administrador Necessária", - "enterSudoPassword": "Digite a senha sudo para continuar esta operação", - "sudoPassword": "Senha sudo", - "sudoOperationFailed": "Operação sudo falhou", - "sudoAuthFailed": "Falha na autenticação Sudo", - "dragFilesToUpload": "Solte os arquivos aqui para enviar", - "emptyFolder": "Esta pasta está vazia", - "searchFiles": "Pesquisar arquivos...", - "upload": "Transferir", - "selectHostToStart": "Selecione um host para iniciar o gerenciamento de arquivos", - "sshRequiredForFileManager": "O gerenciador de arquivos requer SSH. Este host não tem o SSH habilitado.", - "failedToConnect": "Falha ao conectar com SSH", - "failedToLoadDirectory": "Falha ao carregar diretório", - "noSSHConnection": "Nenhuma conexão SSH disponível", - "copy": "copiar", - "cut": "Recortar", - "paste": "Colar", - "copyPath": "Copiar Caminho", - "copyPaths": "Copiar caminhos", - "delete": "excluir", - "properties": "propriedades", - "refresh": "atualizar", - "downloadFiles": "Baixar arquivos {{count}} para o Navegador", - "copyFiles": "Copiar itens {{count}}", - "cutFiles": "Cortar {{count}} itens", - "deleteFiles": "Excluir {{count}} itens", - "filesCopiedToClipboard": "{{count}} itens copiados para a área de transferência", - "filesCutToClipboard": "{{count}} itens cortados na área de transferência", - "pathCopiedToClipboard": "Caminho copiado para área de transferência", - "pathsCopiedToClipboard": "{{count}} caminhos copiados para a área de transferência", - "failedToCopyPath": "Falha ao copiar caminho para área de transferência", - "movedItems": "Itens de {{count}} movidos", - "failedToDeleteItem": "Falha ao excluir item", - "itemRenamedSuccessfully": "{{type}} renomeado com sucesso", - "failedToRenameItem": "Falha ao renomear item", - "download": "BAIXAR", - "permissions": "Permissões", - "size": "Tamanho", - "modified": "Modificado", - "path": "Caminho", - "confirmDelete": "Tem certeza que deseja excluir {{name}}?", - "permissionDenied": "Permissão negada", - "serverError": "Erro no Servidor", - "fileSavedSuccessfully": "Arquivo salvo com sucesso", - "failedToSaveFile": "Falha ao salvar arquivo", - "confirmDeleteSingleItem": "Tem certeza de que quer apagar permanentemente \"{{name}}\"?", - "confirmDeleteMultipleItems": "Tem certeza de que deseja excluir permanentemente itens {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Tem certeza de que deseja excluir permanentemente itens {{count}} ? Isso inclui pastas e seu conteúdo.", - "confirmDeleteFolder": "Tem a certeza de que pretende eliminar permanentemente a pasta \"{{name}}\" e todo o seu conteúdo?", - "permanentDeleteWarning": "Esta ação não pode ser desfeita. O(s) item(ns) serão excluídos permanentemente do servidor.", - "recent": "Recente", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Cópia", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Fixado", - "folderShortcuts": "Atalhos da pasta", - "failedToReconnectSSH": "Falha ao reconectar a sessão SSH", - "openTerminalHere": "Abrir Terminal Aqui", - "run": "Executar", - "openTerminalInFolder": "Abrir Terminal nesta Pasta", - "openTerminalInFileLocation": "Abrir Terminal no Local do Arquivo", - "runningFile": "Executando - {{file}}", - "onlyRunExecutableFiles": "Só é possível executar arquivos executáveis", - "directories": "Diretórios", - "removedFromRecentFiles": "Removido \"{{name}}\" dos arquivos recentes", - "removeFailed": "Falha ao remover", - "unpinnedSuccessfully": "\"{{name}}desafixado\" com sucesso", - "unpinFailed": "Desafixar falhou", - "removedShortcut": "Atalho \"{{name}} removido \"", - "removeShortcutFailed": "Falha ao remover atalho", - "clearedAllRecentFiles": "Todos os arquivos recentes foram removidos", - "clearFailed": "Falha ao apagar", - "removeFromRecentFiles": "Remover dos arquivos recentes", - "clearAllRecentFiles": "Limpar todos os arquivos recentes", - "unpinFile": "Desafixar arquivo", - "removeShortcut": "Remover atalho", - "pinFile": "Fixar arquivo", - "addToShortcuts": "Adicionar a atalhos", - "pasteFailed": "A colagem falhou", - "noUndoableActions": "Nenhuma ação irreversível", - "undoCopySuccess": "Operação de cópia desfeita: {{count}} excluídos arquivos copiados", - "undoCopyFailedDelete": "Desfazer falhou: Não foi possível excluir nenhum arquivo copiado", - "undoCopyFailedNoInfo": "Desfazer falhou: Não foi possível encontrar informações do arquivo copiado", - "undoMoveSuccess": "Operação movida desfeita: arquivos {{count}} movidos de volta para o local original", - "undoMoveFailedMove": "Desfazer falhou: Não foi possível mover nenhum arquivo de volta", - "undoMoveFailedNoInfo": "Desfazer falhou: Não foi possível encontrar informação de arquivo movido", - "undoDeleteNotSupported": "Operação de exclusão não pode ser desfeita: Os arquivos foram excluídos permanentemente do servidor", - "undoTypeNotSupported": "Tipo de operação desfazer não suportado", - "undoOperationFailed": "Falha na operação", - "unknownError": "Erro desconhecido", - "confirm": "Confirmar", - "find": "Localizar...", - "replace": "Substituir", - "downloadInstead": "Em vez disso, baixar", - "keyboardShortcuts": "Atalhos do teclado", - "searchAndReplace": "Pesquisar e substituir", - "editing": "Editando", - "search": "Pesquisa", - "findNext": "Localizar Próximo", - "findPrevious": "Localizar Anterior", - "save": "Guardar", - "selectAll": "Selecionar Todos", - "undo": "Desfazer", - "redo": "Refazer", - "moveLineUp": "Mover Linha para Cima", - "moveLineDown": "Mover Linha para Baixo", - "toggleComment": "Alternar comentário", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Correr", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Não foi possível carregar a imagem", - "startTyping": "Comece a digitar...", - "unknownSize": "Tamanho desconhecido", - "fileIsEmpty": "O arquivo está vazio", - "largeFileWarning": "Aviso de arquivo grande", - "largeFileWarningDesc": "Este arquivo tem o tamanho {{size}} , o que pode causar problemas de desempenho quando aberto como texto.", - "fileNotFoundAndRemoved": "O arquivo \"{{name}}\" não foi encontrado e foi removido dos arquivos recentes/fixados", - "failedToLoadFile": "Falha ao carregar arquivo: {{error}}", - "serverErrorOccurred": "Ocorreu um erro no servidor. Tente novamente mais tarde.", - "autoSaveFailed": "Auto-salvamento falhou", - "fileAutoSaved": "Arquivo salvo automaticamente", - "moveFileFailed": "Falha ao mover {{name}}", - "moveOperationFailed": "Falha ao mover", - "canOnlyCompareFiles": "Só é possível comparar dois arquivos", - "comparingFiles": "Comparando arquivos: {{file1}} e {{file2}}", - "dragFailed": "Falha ao arrastar", - "filePinnedSuccessfully": "Arquivo \"{{name}}\" fixado com sucesso", - "pinFileFailed": "Falha ao fixar arquivo", - "fileUnpinnedSuccessfully": "Arquivo \"{{name}}\" desafixado com sucesso", - "unpinFileFailed": "Falha ao desafixar arquivo", - "shortcutAddedSuccessfully": "Atalho para a pasta \"{{name}}\" adicionado com sucesso", - "addShortcutFailed": "Falha ao adicionar atalho", - "operationCompletedSuccessfully": "{{operation}} Itens {{count}} com sucesso", - "operationCompleted": "{{operation}} Itens em {{count}}", - "downloadFileSuccess": "Arquivo {{name}} baixado com sucesso", - "downloadFileFailed": "Download falhou", - "moveTo": "Mover para {{name}}", - "diffCompareWith": "Comparar diferenças com {{name}}", - "dragOutsideToDownload": "Arraste fora do janela para baixar (arquivos{{count}})", - "newFolderDefault": "Pasta", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Itens de {{count}} movidos com sucesso para {{target}}", - "move": "Mover-se", - "searchInFile": "Procurar no arquivo (Ctrl+F)", - "showKeyboardShortcuts": "Exibir atalhos de teclado", - "startWritingMarkdown": "Comece a escrever o seu conteúdo markdown...", - "loadingFileComparison": "Carregando comparação de arquivo...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Mover", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Comparar", - "sideBySide": "Lado a lado", - "inline": "Embutido", - "fileComparison": "Comparação de arquivos: {{file1}} vs {{file2}}", - "fileTooLarge": "Arquivo muito grande: {{error}}", - "sshConnectionFailed": "Falha na conexão SSH. Por favor, verifique sua conexão com {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Falha ao carregar arquivo: {{error}}", - "connecting": "Conectandochar@@0", - "connectedSuccessfully": "Conectado com sucesso", - "totpVerificationFailed": "Falha na verificação TOTP", - "warpgateVerificationFailed": "Falha na autenticação do Warpgate", - "authenticationFailed": "Falha na autenticação", - "verificationCodePrompt": "Código de verificação:", - "changePermissions": "Alterar permissões", - "currentPermissions": "Permissões Atuais", - "owner": "Proprietário", - "group": "grupo", - "others": "Outros", - "read": "Lido", - "write": "Salvar", - "execute": "Executar", - "permissionsChangedSuccessfully": "Permissões alteradas com sucesso", - "failedToChangePermissions": "Falha ao alterar permissões", - "name": "Nome:", - "sortByName": "Nome:", - "sortByDate": "Data de Modificação", - "sortBySize": "Tamanho", - "ascending": "Ascendente", - "descending": "Descendente", - "root": "raiz", - "new": "Novidades", - "sortBy": "Classificar por", - "items": "itens", - "selected": "Selecionado", - "editor": "Editores", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", "octal": "Octal", - "storage": "Armazenamento", - "disk": "Disco", - "used": "Utilizado", - "of": "de", - "toggleSidebar": "Alternar barra lateral", - "cannotLoadPdf": "Não é possível carregar PDF", - "pdfLoadError": "Houve um erro ao carregar este arquivo PDF.", - "loadingPdf": "Carregando PDF...", - "loadingPage": "Carregando página..." + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Copiar para o host…", - "moveToHost": "Mover para o host…", - "copyItemsToHost": "Copiar {{count}} itens para o host…", - "moveItemsToHost": "Mover {{count}} itens para o host…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Não existem outros servidores de gestão de ficheiros disponíveis.", "noHostsConnectedHint": "Adicione outro host SSH com o Gestor de Ficheiros ativado no Gestor de Hosts.", "selectDestinationHost": "Selecione o host de destino", @@ -1164,48 +1360,48 @@ "browseDestination": "Navegue ou introduza o caminho", "confirmCopy": "Cópia", "confirmMove": "Mover", - "transferring": "Transferindo…", - "compressing": "Comprimindo…", - "extracting": "Extração…", - "transferringItems": "Transferir {{current}} de {{total}} itens…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transferência concluída", "transferError": "A transferência falhou", - "transferPartial": "Transferência concluída com {{count}} erros", - "transferPartialHint": "Não foi possível transferir: {{paths}}", - "itemsSummary": "{{count}} artigos", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "O destino deve ser um diretório para transferências de múltiplos itens.", "selectThisFolder": "Selecione esta pasta", "browsePathWillBeCreated": "Esta pasta ainda não existe. Será criada quando a transferência começar.", "browsePathError": "Não foi possível abrir este caminho no host de destino.", "goUp": "Subir", - "copyFolderToHost": "Copiar pasta para o host…", - "moveFolderToHost": "Mover pasta para o host…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Pronto", - "hostConnecting": "Ligar…", + "hostConnecting": "Connecting…", "hostDisconnected": "Não conectado", "hostAuthRequired": "Autenticação necessária — abra primeiro o Gestor de Ficheiros neste host.", "hostConnectionFailed": "Falha na ligação", "metricsTitle": "Horários de transferência", - "metricsPrepare": "Preparar destino: {{duration}}", - "metricsCompress": "Comprimir na origem: {{duration}}", - "metricsHopSourceRead": "Origem → servidor: {{throughput}}", - "metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}", - "metricsTransfer": "De uma ponta à outra: {{throughput}} ({{duration}})", - "metricsExtract": "Extrair no destino: {{duration}}", - "metricsSourceDelete": "Remover da fonte: {{duration}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", "metricsTotal": "Total: {{duration}}", - "progressCompressing": "Compressão no host de origem…", - "progressExtracting": "Extração no destino…", - "progressTransferring": "Transferir dados…", - "progressReconnecting": "Reconectando…", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Faixas de transferência paralelas", - "parallelSegmentsOption": "{{count}} faixas", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Os ficheiros grandes estão divididos em partes de 256 MB. Várias vias utilizam ligações separadas (como iniciar várias transferências) para obter uma taxa de transferência total mais elevada.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} faixas)", - "progressTransferringItems": "Transferir ficheiros ({{current}} de {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} ficheiros", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Ficheiros de origem mantidos (transferência parcial)", "jumpHostLimitation": "Ambos os hosts devem ser acessíveis a partir do servidor Termix. O encaminhamento direto de host para host não é suportado.", "cancel": "Cancelar", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Seleciona o método de compressão (tar) ou SFTP por ficheiro com base na quantidade de ficheiros, tamanho e compressibilidade. Os ficheiros individuais utilizam sempre SFTP de streaming.", "methodTarHint": "Comprima na origem, transfira um único ficheiro comprimido e extraia no destino. Requer a utilização do tar em ambos os hosts Unix.", "methodItemSftpHint": "Transfira cada ficheiro individualmente via SFTP. Funciona em todos os hosts, incluindo o Windows.", - "methodPreviewLoading": "Cálculo do método de transferência…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Não foi possível visualizar o método de transferência. O servidor ainda escolherá um método quando iniciar o servidor.", "methodPreviewWillUseTar": "Será utilizado: Ficheiro tar", "methodPreviewWillUseItemSftp": "Será utilizado: SFTP por ficheiro", - "methodPreviewScanSummary": "{{fileCount}} ficheiros, {{totalSize}} total (verificado no host de origem).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Cada ficheiro utiliza o mesmo fluxo SFTP como uma cópia de ficheiro único, um após o outro. O progresso é combinado em todos os ficheiros, pelo que a barra se move lentamente durante a transferência de ficheiros grandes.", "methodReason": { "user_item_sftp": "Escolheu SFTP por ficheiro.", "user_tar": "Escolheu o ficheiro tar.", "tar_unavailable": "O ficheiro tar não está disponível num ou em ambos os hosts — em vez disso, será utilizado o SFTP por ficheiro.", "windows_host": "O sistema operativo host é o Windows — o ficheiro tar não é utilizado.", - "auto_multi_large": "Automático: vários ficheiros, incluindo um ficheiro grande ({{largestSize}}) com dados compressíveis — pacotes tar numa única transferência.", - "auto_single_large_in_archive": "Automático: um ficheiro grande ({{largestSize}}) neste conjunto — SFTP por ficheiro.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automático: dados maioritariamente não compressíveis — SFTP por ficheiro.", - "auto_many_files": "Automático: demasiados ficheiros ({{fileCount}}) — o tar reduz a sobrecarga por ficheiro.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automático: SFTP por ficheiro para este conjunto." }, "progressCancel": "Cancelar", - "progressCancelling": "Cancelando…", + "progressCancelling": "Cancelling…", "progressStalled": "Paralisado", "resumedHint": "Religado a uma transferência ativa iniciada noutra janela.", "transferCancelled": "Transferência cancelada", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Os dados parciais foram mantidos no destino. A tentativa será retomada quando a ligação for restabelecida." }, "tunnels": { - "noSshTunnels": "Sem Túneis SSH", - "createFirstTunnelMessage": "Você ainda não criou nenhum túnel SSH. Configure as conexões de túnel no Gerenciador de Host para começar.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Conectado", "disconnected": "Desconectado", - "connecting": "Conectandochar@@0", - "error": "ERRO", - "canceling": "Cancelando...", - "connect": "Conectar", - "disconnect": "Desconectar", - "cancel": "cancelar", - "port": "Porta", - "localPort": "Porta local", - "remotePort": "Porta remota", - "currentHostPort": "Porta atual do Host", - "endpointPort": "Porta de Endpoint", - "bindIp": "IP local", - "endpointSshConfig": "Configuração do Endpoint SSH", - "endpointSshHost": "Host do Endpoint SSH", - "endpointSshHostPlaceholder": "Selecione um host configurado", - "endpointSshHostRequired": "Selecione um host SSH para cada túnel do cliente.", - "attempt": "Tentativa {{current}} de {{max}}", - "nextRetryIn": "Próxima repetição em {{seconds}} segundos", - "clientTunnels": "Túneis do cliente", - "clientTunnel": "Túnel Cliente", - "addClientTunnel": "Adicionar túnel de cliente", - "noClientTunnels": "Nenhum túnel do cliente configurado nesta área de trabalho.", - "tunnelName": "Nome do túnel", - "remoteHost": "Host Remoto", - "autoStart": "Início automático", - "clientAutoStartDesc": "Inicia quando este cliente desktop abre e permanece conectado.", - "clientManualStartDesc": "Use Iniciar e Parar dessa linha. O Termix não abrirá automaticamente.", - "clientRemoteServerNote": "O encaminhamento remoto pode exigir AllowTcpForwarding e GatewayPorts no servidor SSH do endpoint. A porta remota é fechada quando este desktop desconecta.", - "clientTunnelStarted": "Túnel de cliente iniciado", - "clientTunnelStopped": "Túnel de cliente parado", - "tunnelTestSucceeded": "Teste de túnel bem-sucedido", - "tunnelTestFailed": "Teste do túnel falhou", - "localSaved": "Túneis do cliente salvos", - "localSaveError": "Falha ao salvar túneis locais do cliente", - "invalidBindIp": "O IP local deve ter um endereço IPv4 válido.", - "invalidLocalTargetIp": "IP de destino local deve ser um endereço IPv4 válido.", - "invalidLocalPort": "A porta local deve estar entre 1 e 65535.", - "invalidRemotePort": "Porta remota deve estar entre 1 e 65535.", - "invalidLocalTargetPort": "Porta local de destino deve estar entre 1 e 65535.", - "invalidEndpointPort": "Porta de Endpoint deve estar entre 1 e 65535.", - "duplicateAutoStartBind": "Apenas um túnel de cliente iniciar automaticamente pode usar o {{bind}}.", - "manualControlError": "Falha ao atualizar o estado do túnel.", - "active": "ativo", - "start": "Iniciar", - "stop": "Interromper", - "test": "teste", - "type": "Tipo de túnel", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancelar", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", "typeLocal": "Local (-L)", - "typeRemote": "Remoto (-R)", - "typeDynamic": "Dinâmico (-D)", - "typeServerLocalDesc": "Host atual para endpoint.", - "typeServerRemoteDesc": "Endpoint de volta ao host atual.", - "typeClientLocalDesc": "Computador local para endpoint.", - "typeClientRemoteDesc": "Endpoint de volta ao computador local.", - "typeClientDynamicDesc": "SOCKS no computador local.", - "typeDynamicDesc": "Encaminhar tráfego SOCKS5 CONNECT através de SSH", - "forwardDescriptionServerLocal": "Host atual {{sourcePort}} → endpoint {{endpointPort}}.", - "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → host atual {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS no host atual {{sourcePort}}.", - "forwardDescriptionClientLocal": "{{sourcePort}} local → remoto {{endpointPort}}.", - "forwardDescriptionClientRemote": "{{sourcePort}} remoto → {{endpointPort}} local.", - "forwardDescriptionClientDynamic": "SOCKS na porta local {{sourcePort}}.", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "{{localPort}} local → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → {{localPort}} local", - "autoNameClientDynamic": "format@@0 SOCKS {{localPort}} via {{endpoint}}", - "route": "Itinerário:", - "lastStarted": "Último início", - "lastTested": "Último teste", - "lastError": "Último erro", - "maxRetries": "Máximo de buscas", - "maxRetriesDescription": "Quantidade máxima de tentativas de repetição.", - "retryInterval": "Intervalo de Repetir (segundos)", - "retryIntervalDescription": "Tempo de espera entre tentativas novamente.", - "local": "Localização", - "remote": "Remoto", - "destination": "Destino", - "host": "Servidor", - "mode": "Modo", - "noHostSelected": "Nenhum host selecionado", - "working": "Trabalhando..." + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "cpu", - "memory": "Memória", - "disk": "Disco", - "network": "Rede", - "uptime": "Tempo em atividade", - "processes": "processos", - "available": "Disponível", - "free": "Gratuito", - "connecting": "Conectandochar@@0", - "connectionFailed": "Falha ao conectar ao servidor", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", "naCpus": "N/A CPU(s)", - "cpuCores_one": "Núcleo {{count}}", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Uso da CPU", - "memoryUsage": "Memória Utilizada", - "diskUsage": "Uso do disco", - "failedToFetchHostConfig": "Falha ao buscar a configuração do host", - "serverOffline": "Servidor Offline", - "cannotFetchMetrics": "Não é possível buscar métricas do servidor offline", - "totpFailed": "Falha na verificação TOTP", - "noneAuthNotSupported": "As estatísticas do servidor não suportam tipo de autenticação 'nenhum'.", - "load": "Carregar", - "systemInfo": "Informação do Sistema", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Sistema operacional", + "operatingSystem": "Operating System", "kernel": "Kernel", - "seconds": "segundos", - "networkInterfaces": "Interfaces de Rede", - "noInterfacesFound": "Nenhuma interface de rede encontrada", - "noProcessesFound": "Nenhum processo encontrado", - "loginStats": "Estatísticas de Login SSH", - "noRecentLoginData": "Nenhum dado de login recente", - "executingQuickAction": "Executando {{name}}...", - "quickActionSuccess": "{{name}} completado com sucesso", - "quickActionFailed": "{{name}} falhou", - "quickActionError": "Falha ao executar {{name}}", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Porta de Escuta", - "protocol": "Protocol", - "port": "Porta", - "address": "Endereço", - "process": "processo", - "noData": "Sem dados de portas de escuta" + "title": "Listening Ports", + "protocol": "Protocolo", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inativo", - "policy": "Política", - "rules": "regras", - "noData": "Nenhum firewall disponível", - "action": "Acão", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Porta", - "source": "fonte", - "anywhere": "Em qualquer lugar" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Carga Média", - "swap": "Trocar", - "architecture": "Arquitetura", - "refresh": "atualizar", - "retry": "Repetir" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Tentar novamente", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Correr", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "SSH auto-hospedado e gestão de desktop remoto", - "loginTitle": "Faça login para Termix", - "registerTitle": "Criar conta", - "forgotPassword": "Esqueceu a senha?", - "rememberMe": "Lembrar dispositivo por 30 dias (inclui TOTP)", - "noAccount": "Não possui uma conta?", - "hasAccount": "Já possui uma conta?", - "twoFactorAuth": "Autenticação dupla", - "enterCode": "Inserir código de verificação", - "backupCode": "Ou usar código de backup", - "verifyCode": "Verificar Código", - "redirectingToApp": "Redirecionando para o aplicativo...", - "sshAuthenticationRequired": "Autenticação SSH necessária", - "sshNoKeyboardInteractive": "Autenticação Interativa do Keyboard-Indisponível", - "sshAuthenticationFailed": "Falha na autenticação", - "sshAuthenticationTimeout": "Timeout de autenticação", - "sshNoKeyboardInteractiveDescription": "O servidor não suporta autenticação interativa de teclado. Por favor, forneça sua senha ou chave SSH.", - "sshAuthFailedDescription": "As credenciais fornecidas estavam incorretas. Por favor, tente novamente com credenciais válidas.", - "sshTimeoutDescription": "A tentativa de autenticação expirou. Tente novamente.", - "sshProvideCredentialsDescription": "Por favor, forneça suas credenciais SSH para conectar a este servidor.", - "sshPasswordDescription": "Digite a senha para esta conexão SSH.", - "sshKeyPasswordDescription": "Se a sua chave SSH estiver criptografada, digite a senha aqui.", - "passphraseRequired": "Senha Obrigatória", - "passphraseRequiredDescription": "A chave SSH está criptografada. Digite a senha para desbloqueá-la.", - "back": "Anterior", - "firstUser": "Primeiro usuário", - "firstUserMessage": "Você é o primeiro usuário e será feito um administrador. Você pode ver as configurações de administrador na lista de usuários da barra lateral. Se você acha que isso é um erro, verifique os logs do docker ou crie uma questão no GitHub.", - "external": "externo", - "loginWithExternal": "Entrar com o provedor externo", - "loginWithExternalDesc": "Fazer login usando seu provedor de identidade externo configurado", - "externalNotSupportedInElectron": "A autenticação externa ainda não é suportada no aplicativo Electron. Por favor, use a versão web para logar OIDC.", - "resetPasswordButton": "Redefinir a senha", - "sendResetCode": "Enviar Código de Redefinição", - "resetCodeDesc": "Digite seu nome de usuário para receber um código de redefinição de senha. O código será logado nos logs do contêiner docker.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verificar Código", - "enterResetCode": "Insira o código de 6 dígitos do contêiner docker para o usuário:", - "newPassword": "Nova Palavra-Passe", - "confirmNewPassword": "Confirmar senha", - "enterNewPassword": "Digite sua nova senha para o usuário:", - "signUp": "Criar conta", - "desktopApp": "Aplicativo para computador", - "loggingInToDesktopApp": "Fazendo login no aplicativo para computador", - "loadingServer": "Carregando servidor...", - "dataLossWarning": "Redefinir sua senha desta forma irá apagar todos os seus hosts, credenciais e outros dados criptografados salvos por SSH. Essa ação não pode ser desfeita. Apenas use isso se você esqueceu sua senha e não está logado.", - "authenticationDisabled": "Autenticação desabilitada", - "authenticationDisabledDesc": "Todos os métodos de autenticação estão desativados no momento. Entre em contato com o administrador.", - "attemptsRemaining": "Tentativas {{count}} restantes" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verificar chave do host SSH", - "keyChangedWarning": "Chave do host SSH alterada", - "firstConnectionTitle": "Primeira vez conectando-se a este host", - "firstConnectionDescription": "A autenticidade deste host não pode ser estabelecida. Verifique a impressão digital que você espera.", - "keyChangedDescription": "A chave do host para este servidor mudou desde a sua última conexão. Isso pode indicar um problema de segurança.", - "previousKey": "Chave anterior", - "newFingerprint": "Nova impressão digital", - "fingerprint": "Impressão digital", - "verifyInstructions": "Caso você confie neste host, clique em Aceitar para continuar e salvar esta impressão digital para conexões futuras.", - "securityWarning": "Aviso de segurança", - "acceptAndContinue": "Aceitar e Continuar", - "acceptNewKey": "Aceitar nova chave e continuar" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Não foi possível conectar ao banco de dados", - "unknownError": "Erro desconhecido", - "loginFailed": "Falha no login", - "failedPasswordReset": "Falha ao iniciar a redefinição de senha", - "failedVerifyCode": "Falha ao verificar código de redefinição", - "failedCompleteReset": "Falha ao concluir a redefinição de senha", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Falha ao iniciar o login OIDC", - "silentSigninOidcUnavailable": "O login silencioso foi solicitado, mas o login do OIDC não está disponível.", - "failedUserInfo": "Falha ao obter informações do usuário após o login", - "oidcAuthFailed": "Falha na autenticação OIDC", - "invalidAuthUrl": "URL de autorização inválida recebida do backend", - "requiredField": "Este campo é obrigatório", - "minLength": "Tamanho mínimo de {{min}}", - "passwordMismatch": "As senhas não coincidem", - "passwordLoginDisabled": "Nome de usuário/senha está desativado no momento", - "sessionExpired": "Sessão expirou - por favor faça o login novamente", - "totpRateLimited": "Taxa limitada: Muitas tentativas de verificação TOTP. Tente novamente mais tarde.", - "totpRateLimitedWithTime": "Taxa limitada: Muitas tentativas de verificação TOTP. Aguarde {{time}} segundos antes de tentar novamente.", - "resetCodeRateLimited": "Taxa limitada: Muitas tentativas de verificação. Por favor, tente novamente mais tarde.", - "resetCodeRateLimitedWithTime": "Taxa limitada: Muitas tentativas de verificação. Por favor, aguarde {{time}} segundos antes de tentar novamente.", - "authTokenSaveFailed": "Falha ao salvar token de autenticação", - "failedToLoadServer": "Falha ao carregar servidor" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "O registro da nova conta está desativado por um administrador. Por favor, entre em contato com um administrador.", - "userNotAllowed": "Sua conta não está autorizada a se registrar. Por favor, contate um administrador.", - "databaseConnectionFailed": "Falha ao conectar ao servidor do banco de dados", - "resetCodeSent": "Redefinir código enviado para os logs Docker", - "codeVerified": "Código verificado com sucesso", - "passwordResetSuccess": "Senha redefinida com sucesso", - "loginSuccess": "Login bem-sucedido", - "registrationSuccess": "Registrado com sucesso" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Túneis locais de desktop, direcionando hosts SSH configurados.", - "c2sTunnelPresets": "Predefinições do Túnel Cliente", - "c2sTunnelPresetsDesc": "Salvar a lista de túneis locais do cliente local como uma predefinição de servidor nomeada ou carregar uma predefinição de volta para este cliente.", - "c2sTunnelPresetsUnavailable": "Predefinições de túnel cliente só estão disponíveis no cliente desktop.", - "c2sPresetName": "Nome da predefinição", - "c2sPresetNamePlaceholder": "Nome da predefinição cliente", - "c2sPresetToLoad": "Predefinição para carregar", - "c2sNoPresetSelected": "Nenhuma predefinição selecionada", - "c2sNoPresets": "Nenhuma predefinição salva", - "c2sLoadPreset": "Carregar", - "c2sCurrentLocalConfig": "{{count}} túneis locais do cliente configurados nesta área de trabalho.", - "c2sPresetSyncNote": "As predefinições são imagens explícitas; carregar uma substitui a lista de túneis de cliente local desse cliente.", - "c2sPresetSaved": "Túnel de cliente predefinido salvo", - "c2sPresetLoaded": "Túnel cliente predefinido carregado localmente", - "c2sPresetRenamed": "Pré-ajuste do túnel cliente renomeado", - "c2sPresetDeleted": "Prédefinição de túnel de cliente excluído", - "c2sPresetLoadError": "Falha ao carregar as predefinições do túnel do cliente" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "IDIOMA", - "keyPassword": "Senha da chave", - "pastePrivateKey": "Cole sua chave privada aqui...", - "localListenerHost": "127.0.0.1 (ouvir localmente)", - "localTargetHost": "127.0.0.1 (alvo neste computador)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Digite sua senha", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Painel", - "loading": "Carregando painel...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "SUPORTE", + "support": "Support", "discord": "Discord", - "serverOverview": "Visão Geral do Servidor", - "version": "Versão", - "upToDate": "Até a data", - "updateAvailable": "Atualização disponível", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Tempo em atividade", - "database": "Banco", - "healthy": "Saudável", - "error": "ERRO", - "totalHosts": "Hosts totais", - "totalTunnels": "Total de túneis", - "totalCredentials": "Credenciais totais", - "recentActivity": "Atividade recente", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Carregando atividade recente...", - "noRecentActivity": "Nenhuma atividade recente", - "quickActions": "Ações rápidas", - "addHost": "Adicionar Host", - "addCredential": "Adicionar Credencial", - "adminSettings": "Configurações de administrador", - "userProfile": "Informações do Perfil", - "serverStats": "Estatísticas do servidor", - "loadingServerStats": "Carregando estatísticas do servidor...", - "noServerData": "Nenhum dado de servidor disponível", - "cpu": "cpu", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personalizar Painel", - "dashboardSettings": "Configurações do painel", - "enableDisableCards": "Ativar/Desativar cartões", - "resetLayout": "Restaurar ao Padrão", - "serverOverviewCard": "Visão Geral do Servidor", - "recentActivityCard": "Atividade recente", - "networkGraphCard": "Gráfico da Rede", - "networkGraph": "Gráfico da Rede", - "quickActionsCard": "Ações rápidas", - "serverStatsCard": "Estatísticas do servidor", - "panelMain": "Principal", - "panelSide": "Lado", - "justNow": "neste momento" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "ESTÁVEL", - "hostsOnline": "Hosts online", - "activeTunnels": "Túneis ativos", - "registerNewServer": "Registrar um novo servidor", - "storeSshKeysOrPasswords": "Armazenar chaves SSH ou senhas", - "manageUsersAndRoles": "Gerenciar usuários e funções", - "manageYourAccount": "Gerencie sua conta", - "hostStatus": "Status do Host", - "noHostsConfigured": "Nenhum host configurado", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", - "offline": "DESLIGAR", - "onlineLower": "Disponível", + "offline": "OFFLINE", + "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Adicionar:", - "commandPalette": "Paleta de comando", - "done": "Concluído", - "editModeInstructions": "Arraste cartões para reordenar · Arraste o divisor de coluna para redimensionar colunas · Arraste a borda inferior de um cartão para redimensionar sua altura · Lixeira para remover", - "empty": "Vazio", - "clear": "Limpar" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Cópia", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Adicionar Host", - "addGroup": "Adicionar Grupo", - "addLink": "Adicionar Link", - "zoomIn": "Aumentar zoom", - "zoomOut": "Diminuir o zoom", - "resetView": "Redefinir visualização", - "selectHost": "Selecione o Host", - "chooseHost": "Escolha um host...", - "parentGroup": "Grupo Pai", - "noGroup": "Nenhum grupo", - "groupName": "Nome do Grupo", - "color": "Cor", - "source": "fonte", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Mover para o grupo", - "selectGroup": "Selecionar grupo...", - "addConnection": "Adicionar conexão", - "hostDetails": "Detalhes do Host", - "removeFromGroup": "Remover do grupo", - "addHostHere": "Adicionar Host Aqui", - "editGroup": "Editar Grupo", - "delete": "excluir", - "add": "Adicionar", - "create": "Crio", - "move": "Mover-se", - "connect": "Conectar", - "createGroup": "Criar grupo", - "selectSourcePlaceholder": "Selecione a Fonte...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Mover", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Arquivo inválido", - "hostAlreadyExists": "O host já está na topologia", - "connectionExists": "Conexão já existe", - "unknown": "Desconhecido", - "name": "Nome:", - "ip": "PI", - "status": "SItuação", - "failedToAddNode": "Falha ao adicionar nó", - "sourceDifferentFromTarget": "Origem e alvo devem ser diferentes", - "exportJSON": "Exportar JSON", - "importJSON": "Importar JSON", - "terminal": "Terminal", - "fileManager": "Gerenciador de Arquivos", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Estatuto", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "terminal", + "fileManager": "Gestor de arquivos", "tunnel": "Túnel", - "docker": "Atracador", - "serverStats": "Estatísticas do servidor", - "noNodes": "Nenhum nó ainda" + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "O Docker não está habilitado para este host", - "validating": "Validando o Docker...", - "connecting": "Conectandochar@@0", - "error": "ERRO", - "version": "{{version}} Docker", - "connectionFailed": "Falha ao conectar ao Docker", - "containerStarted": "Contêiner {{name}} iniciado", - "failedToStartContainer": "Falha ao iniciar o contêiner {{name}}", - "containerStopped": "O contêiner {{name}} parou", - "failedToStopContainer": "Falha ao parar o contêiner {{name}}", - "containerRestarted": "Contêiner {{name}} reiniciado", - "failedToRestartContainer": "Falha ao reiniciar o contêiner {{name}}", - "containerPaused": "Recipiente {{name}} pausado", - "containerUnpaused": "Recipiente {{name}} despausado", - "failedToTogglePauseContainer": "Falha ao alternar estado de pausa para o contêiner {{name}}", - "containerRemoved": "{{name}} do contêiner removido", - "failedToRemoveContainer": "Falha ao remover contêiner {{name}}", - "image": "Imagem:", - "ports": "Portas", - "noPorts": "Nenhuma porta", - "start": "Iniciar", - "confirmRemoveContainer": "Você tem certeza que deseja remover o contêiner '{{name}}'? Esta ação não pode ser desfeita.", - "runningContainerWarning": "Aviso: Este contêiner está em execução no momento. Removê-lo irá parar o contêiner primeiro.", - "loadingContainers": "Carregando contêineres...", - "manager": "Gerenciador de Docker", - "autoRefresh": "Atualização Automática", - "timestamps": "Data", - "lines": "linhas", - "filterLogs": "Filtrar registros...", - "refresh": "atualizar", - "download": "BAIXAR", - "clear": "Limpar", - "logsDownloaded": "Registros baixados com sucesso", - "last50": "Últimos 50", - "last100": "Últimas 100", - "last500": "Últimas 500", - "last1000": "Últimas 1000", - "allLogs": "Todos os registros", - "noLogsMatching": "Nenhum registro correspondente \"{{query}}\"", - "noLogsAvailable": "Não há registros disponíveis", - "noContainersFound": "Nenhum contêiner encontrado", - "noContainersFoundHint": "Nenhum contêiner Docker está disponível neste host", - "searchPlaceholder": "Procurar contêineres...", - "allStatuses": "Todos os Status", - "stateRunning": "Executando", - "statePaused": "Pausado", - "stateExited": "Saída", - "stateRestarting": "Reiniciando", - "noContainersMatchFilters": "Nenhum contêiner corresponde aos seus filtros", - "noContainersMatchFiltersHint": "Tente ajustar sua pesquisa ou critério de filtro", - "failedToFetchStats": "Falha ao obter estatísticas do contêiner", - "containerNotRunning": "Contêiner não executando", - "startContainerToViewStats": "Inicie o contêiner para ver estatísticas", - "loadingStats": "Carregando estatísticas...", - "errorLoadingStats": "Erro ao carregar estatísticas", - "noStatsAvailable": "Não há estatísticas disponíveis", - "cpuUsage": "Uso da CPU", - "current": "Atual", - "memoryUsage": "Memória Utilizada", - "networkIo": "I/O de rede", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Saída", - "blockIo": "Bloco I/O", - "read": "Lido", - "write": "Salvar", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "Informação do contêiner", - "name": "Nome:", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Estado:", - "containerMustBeRunning": "O contêiner deve estar em execução para acessar o console", - "verificationCodePrompt": "Inserir código de verificação", - "totpVerificationFailed": "Falha na verificação TOTP. Tente novamente.", - "warpgateVerificationFailed": "A autenticação do Warpgate falhou. Por favor, tente novamente.", - "connectedTo": "Conectado a {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Desconectado", - "consoleError": "Erro de console", - "errorMessage": "Erro: {{message}}", - "failedToConnect": "Falha ao conectar ao contêiner", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", "console": "Console", - "selectShell": "Selecionar shell", - "bash": "Pancada", - "sh": "estrito", - "ash": "cinzas", - "connect": "Conectar", - "disconnect": "Desconectar", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Não conectado", - "clickToConnect": "Clique em conectar para iniciar uma sessão shell", - "connectingTo": "Conectando a {{containerName}}...", - "containerNotFound": "Contêiner não encontrado", - "backToList": "Voltar para a Lista", - "logs": "Registros", - "stats": "Estatísticas", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", "consoleTab": "Console", - "startContainerToAccess": "Iniciar o contêiner para acessar o console" + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Gerais", - "sectionOidc": "OCIDADE", - "sectionUsers": "Utilizadores", - "sectionSessions": "Sessões", - "sectionRoles": "Papéis", - "sectionDatabase": "Banco", - "sectionApiKeys": "Chaves API", - "allowRegistration": "Permitir Registro de Usuário", - "allowRegistrationDesc": "Deixe novos usuários se registrarem", - "allowPasswordLogin": "Permitir acesso à senha", - "allowPasswordLoginDesc": "Usuário/senha para login", - "oidcAutoProvision": "Auto-Provisão OIDC", - "oidcAutoProvisionDesc": "Criar contas automaticamente para usuários OIDC, mesmo que o registro esteja desativado", - "allowPasswordReset": "Permitir redefinição de senha", - "allowPasswordResetDesc": "Redefinir código via logs do Docker", - "sessionTimeout": "Sessão expirada", - "hours": "horas", - "sessionTimeoutRange": "Mínimo de 1h · Máximo de 720h", - "monitoringDefaults": "Padrões de monitoramento", - "statusCheck": "Verificação de status", - "metrics": "Métricas", - "sec": "seg.", - "logLevel": "Nível do Registro", - "enableGuacamole": "Ativar Guacamole", - "enableGuacamoleDesc": "desktop remoto RDP/VNC", - "guacdUrl": "URL guacd", - "oidcDescription": "Configure o OpenID Connect para SSO. Campos marcados * são necessários.", - "oidcClientId": "ID do Cliente", - "oidcClientSecret": "Segredo do Cliente", - "oidcAuthUrl": "URL de autorização", - "oidcIssuerUrl": "URL do Emissor", - "oidcTokenUrl": "URL do token", - "oidcUserIdentifier": "Caminho do usuário", - "oidcDisplayName": "Exibir Caminho do Nome", - "oidcScopes": "Âmbitos", - "oidcUserinfoUrl": "Substituir URL do Userinfo", - "oidcAllowedUsers": "Usuários permitidos", - "oidcAllowedUsersDesc": "Um e-mail por linha. Deixe em branco para permitir que todos.", - "removeOidc": "Excluir", - "usersCount": "Usuários {{count}}", - "createUser": "Crio", - "newRole": "Nova Permissão", - "roleName": "Nome:", - "roleDisplayName": "Nome para exibição", - "roleDescription": "Descrição:", - "rolesCount": "Funções {{count}}", - "createRole": "Crio", - "creating": "Criando...", - "exportDatabase": "Exportar banco de dados", - "exportDatabaseDesc": "Baixar um backup de todos os hosts, credenciais e configurações", - "export": "Exportação", - "exporting": "Exportando...", - "importDatabase": "Importar base de dados", - "importDatabaseDesc": "Restaurar a partir de um arquivo de backup .sqlite", - "importDatabaseSelected": "Selecionado: {{name}}", - "selectFile": "Selecione o arquivo", - "changeFile": "Troca", - "import": "Importação", - "importing": "Importando...", - "apiKeysCount": "Chaves {{count}}", - "newApiKey": "Nova chave de API", - "apiKeyCreatedWarning": "Chave criada - copiá-la agora, ela não será exibida novamente.", - "apiKeyName": "Nome:", - "apiKeyUser": "Usuário", - "apiKeySelectUser": "Selecione um usuário...", - "apiKeyExpiresAt": "Expira em", - "createKey": "Criar chave", - "apiKeyNoExpiry": "Sem expiração", + "sectionGeneral": "General", + "sectionOidc": "OIDC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Limpar filtros", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Estatuto", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remover", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Dupla Autenticação", - "authTypeOidc": "OCIDADE", - "authTypeLocal": "Localização", - "adminStatusAdministrator": "Administrador", - "adminStatusRegularUser": "Usuário Normal", + "authTypeDual": "Dual Auth", + "authTypeOidc": "OIDC", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", - "systemBadge": "SIM", - "customBadge": "PERSÃO", - "youBadge": "VOCÊ", - "sessionsActive": "{{count}} ativo", - "sessionActive": "Ativo: {{time}}", - "sessionExpires": "Exx: {{time}}", - "revokeAll": "TODOS", - "revokeAllSessionsSuccess": "Todas as sessões do usuário revogadas", - "revokeAllSessionsFailed": "Falha ao revogar sessões", - "revokeSessionFailed": "Falha ao revogar sessão", - "addRole": "Adicionar função", - "noCustomRoles": "Nenhum cargo personalizado definido", - "removeRoleFailed": "Falha ao remover papel", - "assignRoleFailed": "Falha ao atribuir papel", - "deleteRoleFailed": "Falha ao excluir papel", - "userAdminAccess": "Administrador", - "userAdminAccessDesc": "Acesso completo a todas as configurações de administrador", - "userRoles": "Papéis", - "revokeAllUserSessions": "Revogar todas as sessões", - "revokeAllUserSessionsDesc": "Forçar o re-login em todos os dispositivos", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "A exclusão deste usuário é permanente.", - "deleteUser": "Excluir {{username}}", - "deleting": "Excluindo...", - "deleteUserFailed": "Falha ao excluir usuário", - "deleteUserSuccess": "Usuário \"{{username}}\" excluído", - "deleteRoleSuccess": "Função \"{{name}}\" excluído", - "revokeKeySuccess": "Chave \"{{name}}\" revogada", - "revokeKeyFailed": "Falha ao revogar a chave", - "copiedToClipboard": "Copiado para o clipboard", - "done": "Concluído", - "createUserTitle": "Criar Usuário", - "createUserDesc": "Crie uma nova conta local.", - "createUserUsername": "Usuário:", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Palavra-passe", - "createUserPasswordHint": "Mínimo 6 caracteres.", - "createUserEnterUsername": "Digite o usuário", - "createUserEnterPassword": "Insira a senha", - "createUserSubmit": "Criar Usuário", - "editUserTitle": "Gerenciar Usuário: {{username}}", - "editUserDesc": "Editar funções, status de administrador, sessões e configurações da conta.", - "editUserUsername": "Usuário:", - "editUserAuthType": "Tipo de Autenticação", - "editUserAdminStatus": "Status do administrador", - "editUserUserId": "ID de usuário", - "linkAccountTitle": "Vincular OIDC à conta da senha", - "linkAccountDesc": "Mesclar a conta OIDC {{username}} com uma conta local existente.", - "linkAccountWarningTitle": "Isto irá:", - "linkAccountEffect1": "Excluir conta somente OIDC", - "linkAccountEffect2": "Adicione login OIDC à conta de destino", - "linkAccountEffect3": "Permitir tanto acesso OIDC quanto acesso à senha", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Digite o nome de usuário da conta local para vincular", - "linkAccounts": "Vincular Contas", - "linkAccountSuccess": "Conta OIDC ligada a \"{{username}}\"", - "linkAccountFailed": "Falha ao ligar a conta OIDC", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Tipo de autenticação", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Ligando...", - "saving": "Salvando...", - "updateRegistrationFailed": "Falha ao atualizar configuração de registro", - "updatePasswordLoginFailed": "Falha ao atualizar configuração de login de senha", - "updateOidcAutoProvisionFailed": "Falha ao atualizar a auto disposição OIDC", - "updatePasswordResetFailed": "Falha ao atualizar a configuração de redefinição de senha", - "sessionTimeoutRange2": "Tempo limite da sessão deve ser entre 1 e 720 horas", - "sessionTimeoutSaved": "Timeout da sessão salvo", - "sessionTimeoutSaveFailed": "Falha ao salvar tempo limite de sessão", - "monitoringIntervalInvalid": "Valores de intervalo inválidos", - "monitoringSaved": "Configurações de monitoramento salvas", - "monitoringSaveFailed": "Falha ao salvar configurações de monitoramento", - "guacamoleSaved": "Configurações de Guacamole salvas", - "guacamoleSaveFailed": "Falha ao salvar configurações de Guacamole", - "guacamoleUpdateFailed": "Falha ao atualizar a configuração de Guacamole", - "logLevelUpdateFailed": "Falha ao atualizar o nível de log", - "oidcSaved": "Configuração OIDC salva", - "oidcSaveFailed": "Falha ao salvar configuração OIDC", - "oidcRemoved": "Configuração OIDC removida", - "oidcRemoveFailed": "Falha ao remover a configuração OIDC", - "createUserRequired": "Nome de usuário e senha são obrigatórios", - "createUserPasswordTooShort": "A senha deve ter pelo menos 6 caracteres", - "createUserSuccess": "Usuário \"{{username}}\" criado", - "createUserFailed": "Falha ao criar usuário", - "updateAdminStatusFailed": "Falha ao atualizar status do administrador", - "allSessionsRevoked": "Todas as sessões revogadas", - "revokeSessionsFailed": "Falha ao revogar sessões", - "createRoleRequired": "Nome e nome de exibição são necessários", - "createRoleSuccess": "Papel \"{{name}}\" criado", - "createRoleFailed": "Falha ao criar papel", - "apiKeyNameRequired": "O nome da chave é obrigatório", - "apiKeyUserRequired": "O ID do usuário é necessário", - "apiKeyCreatedSuccess": "Chave da API \"{{name}}\" criado", - "apiKeyCreateFailed": "Falha ao criar chave de API", - "exportSuccess": "Banco de dados exportado com sucesso", - "exportFailed": "Exportação do banco de dados falhou", - "importSelectFile": "Por favor, selecione um arquivo primeiro", - "importCompleted": "Importação concluída: {{total}} artigos importados, {{skipped}} ignorados", - "importFailed": "Importação falhou: {{error}}", - "importError": "Falha ao importar banco" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Servidor", - "hostPlaceholder": "192.168.1.1 ou exemplo.com", - "portLabel": "Porta", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Usuário:", - "usernamePlaceholder": "usuário", - "authLabel": "Autenticação", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Palavra-passe", - "passwordPlaceholder": "Senha", - "privateKeyLabel": "Chave Privada", - "privateKeyPlaceholder": "Colar chave privada...", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", "credentialLabel": "Credencial", - "credentialPlaceholder": "Selecione uma credencial salva", - "connectToTerminal": "Conectar ao Terminal", - "connectToFiles": "Conectar aos arquivos" + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Nenhum terminal selecionado", - "noTerminalSelectedHint": "Abra uma aba de terminal SSH para ver seu histórico de comandos", - "searchPlaceholder": "Pesquisar histórico...", - "clearAll": "Limpar Tudo", - "noHistoryEntries": "Não há entradas no histórico", - "trackingDisabled": "Rastreamento do histórico está desativado", - "trackingDisabledHint": "Ative-o nas configurações do seu perfil para gravar comandos." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Gravação de Teclas", - "recordToTerminals": "Registro em terminais", - "selectAll": "TODOS", - "selectNone": "Nenhuma", - "noTerminalTabsOpen": "Nenhuma aba de terminal aberta", - "selectTerminalsAbove": "Selecione os terminais acima", - "broadcastInputPlaceholder": "Digite aqui para transmitir keystroks...", - "stopRecording": "Parar Gravação", - "startRecording": "Iniciar Gravação", - "settingsTitle": "Confirgurações", - "enableRightClickCopyPaste": "Habilitar copiar/colar com botão direito" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Nenhum", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Disposição", - "selectLayoutAbove": "Selecione um layout acima", - "selectLayoutHint": "Escolha quantos painéis mostrar", - "panesTitle": "Painéis", - "openTabsTitle": "Abas abertas", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Arraste os separadores para os painéis acima ou utilize a Atribuição Rápida.", - "dropHere": "Solte aqui", - "emptyPane": "Vazio", - "dashboard": "Painel", - "clearSplitScreen": "Limpar Tela dividida", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Atribuição rápida", - "alreadyAssigned": "Painel {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Aba dividida", "addToSplit": "Adicionar à divisão", "removeFromSplit": "Remover da divisão", - "assignToPane": "Atribuir ao painel" + "assignToPane": "Atribuir ao painel", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Criar Snippet", - "createSnippetDescription": "Criar um novo snippet de comando para a execução rápida", - "nameLabel": "Nome:", - "namePlaceholder": "ex.: Reiniciar o Nginx", - "descriptionLabel": "Descrição:", - "descriptionPlaceholder": "Descrição opcional", - "optional": "Opcional", - "folderLabel": "pasta", - "noFolder": "Nenhuma pasta (Descategorizada)", - "commandLabel": "Comando", - "commandPlaceholder": "ex.: sudo systemctl reinicializa o nginx", - "cancel": "cancelar", - "createSnippetButton": "Criar Snippet", - "createFolderTitle": "Criar pasta", - "createFolderDescription": "Organize seus snippets em pastas", - "folderNameLabel": "Nome da pasta", - "folderNamePlaceholder": "ex.: Comandos do Sistema, Scripts Docker", - "folderColorLabel": "Cor da pasta", - "folderIconLabel": "Ícone da pasta", - "previewLabel": "Pré-visualizar", - "folderNameFallback": "Nome da pasta", - "createFolderButton": "Criar pasta", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancelar", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "TODOS", - "selectNone": "Nenhuma", - "noTerminalTabsOpen": "Nenhuma aba de terminal aberta", - "searchPlaceholder": "Buscar snippets...", - "newSnippet": "Novo Trecho", - "newFolder": "Adicionar uma pasta", - "run": "Executar", - "noSnippetsInFolder": "Não há snippets nesta pasta", - "uncategorized": "Descategorizado", - "editSnippetTitle": "Editar Trecho", - "editSnippetDescription": "Atualizar este comando snippet", - "saveSnippetButton": "Salvar as alterações", - "createSuccess": "Snippet criado com sucesso", - "createFailed": "Falha ao criar snippet", - "updateSuccess": "Trecho atualizado com sucesso", - "updateFailed": "Falha ao atualizar snippet", - "deleteFailed": "Falha ao excluir snippet", - "folderCreateSuccess": "Pasta criada com sucesso", - "folderCreateFailed": "Falha ao criar pasta", - "editFolderTitle": "Editar Pasta", - "editFolderDescription": "Renomear ou alterar a aparência desta pasta", - "saveFolderButton": "Salvar as alterações", - "editFolder": "Editar Pasta", - "deleteFolder": "Excluir pasta", - "folderDeleteSuccess": "Pasta \"{{name}}excluída", - "folderDeleteFailed": "Falha ao excluir pasta", - "folderEditSuccess": "Pasta atualizada com sucesso", - "folderEditFailed": "Falha ao atualizar a pasta", - "confirmRunMessage": "Executar \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Nenhum", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Correr", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Correr", - "runSuccess": "Executado \"{{name}}\" em {{count}} terminal(is)", - "copySuccess": "Copiado \"{{name}}\" para área de transferência", - "shareTitle": "Compartilhar Snippet", - "shareUser": "Usuário", - "shareRole": "Funções", - "selectUser": "Selecione um usuário...", - "selectRole": "Selecione uma função...", - "shareSuccess": "Snippet compartilhado com sucesso", - "shareFailed": "Falha ao compartilhar snippet", - "revokeSuccess": "Acesso revogado", - "revokeFailed": "Falha ao revogar acesso", - "currentAccess": "Acesso atual", - "shareLoadError": "Não foi possível carregar os dados de compartilhamento", - "loading": "Carregandochar@@0", - "close": "FECHAR", - "reorderFailed": "Falha ao guardar a ordem do trecho de código" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Falha ao guardar a ordem do trecho de código", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "conta", - "sectionAppearance": "Aparência", - "sectionSecurity": "Segurança", - "sectionApiKeys": "Chaves API", - "sectionC2sTunnels": "Túneis C2S", - "usernameLabel": "Usuário:", - "roleLabel": "Funções", - "roleAdministrator": "Administrador", - "authMethodLabel": "Método de Autenticação", - "authMethodLocal": "Localização", - "twoFaLabel": "A2F", - "twoFaOn": "Ligado", - "twoFaOff": "Desligado", - "versionLabel": "Versão", - "deleteAccount": "Excluir Conta", - "deleteAccountDescription": "Excluir permanentemente sua conta", - "deleteButton": "excluir", - "deleteAccountPermanent": "Esta ação é permanente e não pode ser desfeita.", - "deleteAccountWarning": "Todas as sessões, hosts, credenciais e configurações serão excluídas permanentemente.", - "confirmPasswordDeletePlaceholder": "Digite sua senha para confirmar", - "languageLabel": "IDIOMA", - "themeLabel": "Tema", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Cor do acento", - "settingsTerminal": "Terminal", - "commandAutocomplete": "Auto-completar comando", - "commandAutocompleteDesc": "Mostrar autocomplete durante a digitação", - "historyTracking": "Rastreamento do Histórico", - "historyTrackingDesc": "Rastrear comandos do terminal", - "syntaxHighlighting": "Realce de sintaxe", - "syntaxHighlightingDesc": "Destacar saída do terminal", - "commandPalette": "Paleta de comando", - "commandPaletteDesc": "Ativar atalho de teclado", + "accentColorLabel": "Accent Color", + "settingsTerminal": "terminal", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Reabrir separadores ao fazer login", "reopenTabsOnLoginDesc": "Restaure as suas abas abertas ao iniciar sessão ou atualizar a página, mesmo noutro dispositivo.", - "confirmTabClose": "Confirmar Fechar Aba", - "confirmTabCloseDesc": "Perguntar antes de fechar os guias dos terminais", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Exibir Tags do Host", - "showHostTagsDesc": "Exibir tags na lista de endereços", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Clique para expandir as ações do anfitrião", "hostTrayOnClickDesc": "Mostrar sempre os botões de ligação; clicar para expandir as opções de gestão em vez de passar o cursor sobre as mesmas.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Aplicação Pin Rail", "pinAppRailDesc": "Mantenha a barra lateral esquerda da aplicação sempre expandida, em vez de expandir ao passar o cursor sobre a mesma.", - "settingsSnippets": "Trechos", - "foldersCollapsed": "Pastas colapsadas", - "foldersCollapsedDesc": "Recolher pastas por padrão", - "confirmExecution": "Confirmar execução", - "confirmExecutionDesc": "Confirme antes de executar trechos", - "settingsUpdates": "Atualizações", - "disableUpdateChecks": "Desativar Verificações de Atualizações", - "disableUpdateChecksDesc": "Interromper a verificação de atualizações", - "totpAuthenticator": "Autenticador TOTP", - "totpEnabled": "2FA está habilitado", - "totpDisabled": "Adicionar segurança extra ao login", - "disable": "Desligado", - "enable": "Habilitado", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Escaneie o código QR ou insira o segredo no seu aplicativo de autenticação, e digite o código de 6 dígitos", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verificar", - "changePassword": "Mudar a senha", - "currentPasswordLabel": "Palavra-passe Atual", - "currentPasswordPlaceholder": "Senha atual", - "newPasswordLabel": "Nova Palavra-Passe", - "newPasswordPlaceholder": "Nova senha", - "confirmPasswordLabel": "Confirme a Nova Senha", - "confirmPasswordPlaceholder": "Confirme a nova senha", - "updatePassword": "Atualizar Senha", - "createApiKeyTitle": "Criar chave de API", - "createApiKeyDescription": "Gere uma nova chave de API para acesso programático.", - "apiKeyNameLabel": "Nome:", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "opcional", - "cancel": "cancelar", - "createKey": "Criar chave", - "apiKeyCount": "Chaves {{count}}", - "newKey": "Nova Chave", - "noApiKeys": "Ainda não há chaves de API.", - "apiKeyActive": "ativo", - "apiKeyUsageHint": "Inclua sua chave no", - "apiKeyUsageHintHeader": "cabeçalho.", - "apiKeyPermissionsHint": "Chaves herdam as permissões do usuário criador.", - "roleUser": "Usuário", - "authMethodDual": "Dupla Autenticação", - "authMethodOidc": "OCIDADE", - "totpSetupFailed": "Falha ao iniciar a configuração TOTP", - "totpEnter6Digits": "Insira um código de 6 dígitos", - "totpEnabledSuccess": "Autenticação de dois fatores ativada", - "totpInvalidCode": "Código inválido, por favor tente novamente", - "totpDisableInputRequired": "Digite seu código TOTP ou senha", - "totpDisabledSuccess": "Autenticação de dois fatores desativada", - "totpDisableFailed": "Falha ao desativar 2FA", - "totpDisableTitle": "Desativar 2FA", - "totpDisablePlaceholder": "Insira o código ou senha TOTP", - "totpDisableConfirm": "Desativar 2FA", - "totpContinueVerify": "Continuar a verificar", - "totpVerifyTitle": "Verificar Código", - "totpBackupTitle": "Códigos de recuperação", - "totpDownloadBackup": "Baixar códigos de recuperação", - "done": "Concluído", - "secretCopied": "Segredo copiado para área de transferência", - "apiKeyNameRequired": "O nome da chave é obrigatório", - "apiKeyCreated": "Chave da API \"{{name}}\" criado", - "apiKeyCreateFailed": "Falha ao criar chave de API", - "apiKeyUser": "Usuário", - "apiKeyExpires": "Expira", - "apiKeyRevoked": "Chave de API \"{{name}}\" revogada", - "apiKeyRevokeFailed": "Falha ao revogar chave de API", - "passwordFieldsRequired": "Senhas atuais e novas são necessárias", - "passwordMismatch": "As senhas não coincidem", - "passwordTooShort": "A senha deve ter pelo menos 6 caracteres", - "passwordUpdated": "Senha atualizada com sucesso", - "passwordUpdateFailed": "Falha ao atualizar a senha", - "deletePasswordRequired": "É necessário uma senha para excluir sua conta", - "deleteFailed": "Falha ao excluir conta", - "deleting": "Excluindo...", - "colorPickerTooltip": "Abrir seletor de cores", - "themeSystem": "SISTEMA", - "themeLight": "Fino", - "themeDark": "Escuro", - "themeDracula": "Drácula", + "optional": "optional", + "cancel": "Cancelar", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", + "authMethodOidc": "OIDC", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Ensolarado", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Um Escuro", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Etiquetas", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Tentar novamente", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remover", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/ro_RO.json b/src/ui/locales/translated/ro_RO.json index f996b419..81df4d8a 100644 --- a/src/ui/locales/translated/ro_RO.json +++ b/src/ui/locales/translated/ro_RO.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Dosare", - "folder": "Dosar", + "folders": "Folders", + "folder": "Folder", "password": "Parolă", - "key": "Cheie", - "sshPrivateKey": "Cheie Privată SSH", - "upload": "Incarca", - "keyPassword": "Parolă cheie", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "Cheie SSH", - "uploadPrivateKeyFile": "Încărcați un fișier cu cheie privată", - "searchCredentials": "Căutare acreditări...", - "addCredential": "Adaugă acreditare", - "caCertificate": "Certificat CA (-cert.pub)", - "caCertificateDescription": "Opţional: Încărcaţi sau lipiţi fişierul de certificat semnat CA (de ex. id_ed25519-cert.pub). Necesar atunci când serverul SSH utilizează o autorizaţie bazată pe certificat.", - "uploadCertFile": "Încărcați fișierul -cert.pub", - "clearCert": "Curăță", - "certLoaded": "Certificat încărcat", - "certPublicKeyLabel": "Certificat CA", - "certTypeLabel": "Tipul certificatului", - "pasteOrUploadCert": "Inserați sau încărcați un certificat -cert.pub...", - "hasCaCert": "Are certificat CA", - "noCaCert": "Fără certificat CA" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Ordine implicită", + "sortNameAsc": "Nume (A → Z)", + "sortNameDesc": "Nume (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Ștergeți filtrele", + "filterTypeGroup": "Type", + "filterTypePassword": "Parolă", + "filterTypeKey": "Cheie SSH", + "filterTagsGroup": "Etichete" }, "homepage": { - "failedToLoadAlerts": "Încărcarea alertelor a eșuat", - "failedToDismissAlert": "Eroare la respingerea alertei" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Configurare server", - "description": "Configuraţi URL-ul serverului de Termix pentru a vă conecta la serviciile de backend", - "serverUrl": "URL Server", - "enterServerUrl": "Te rog introdu un URL de server", - "saveFailed": "Salvarea configurației a eșuat", - "saveError": "Eroare la salvarea configurației", - "saving": "Salvare...", - "saveConfig": "Salvați configurația", - "helpText": "Introduceți adresa URL unde funcționează serverul dvs. Termix (de exemplu, http://localhost:30001 sau https://your-server.com)", - "changeServer": "Schimbă Server", - "mustIncludeProtocol": "URL-ul serverului trebuie să înceapă cu http:// sau http://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Permiteți certificatul nevalid", "allowInvalidCertificateDesc": "A se utiliza numai pentru servere auto-găzduite de încredere, cu certificate autosemnate sau cu adresă IP.", - "useEmbedded": "Utilizare server local", - "embeddedDesc": "Rulează Termix cu serverul local încorporat (nu este nevoie de niciun server de la distanță)", - "embeddedConnecting": "Conectare la serverul local...", - "embeddedNotReady": "Serverul local nu este încă gata. Vă rugăm să aşteptaţi un moment şi să încercaţi din nou.", - "localServer": "Server local" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Elimina" }, "versionCheck": { - "error": "Eroare la verificarea versiunii", - "checkFailed": "Verificarea actualizărilor a eșuat", - "upToDate": "Aplicația este actualizată", - "currentVersion": "Rulați versiunea {{version}}", - "updateAvailable": "Actualizare disponibilă", - "newVersionAvailable": "O nouă versiune este disponibilă! Funcționezi {{current}}, dar {{latest}} este disponibil.", - "betaVersion": "Versiune Beta", - "betaVersionDesc": "Rulați {{current}}, care este mai nou decât cea mai recentă versiune stabilă {{latest}}.", - "releasedOn": "Publicat pe {{date}}", - "downloadUpdate": "Descarcă actualizare", - "checking": "Se caută actualizări...", - "checkUpdates": "Verifică pentru actualizări", - "checkingUpdates": "Se caută actualizări...", - "updateRequired": "Actualizare necesară" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Inchide", + "close": "Close", "minimize": "Minimize", "online": "Online", "offline": "Offline", - "continue": "Continuă", - "maintenance": "Mentenanţă", - "degraded": "Degradat", - "error": "Eroare", - "warning": "Avertizare", - "unsavedChanges": "Modificări nesalvate", - "dismiss": "Renunţaţi", - "loading": "Încărcare...", - "optional": "Opţional", - "connect": "Conectează-te", - "copied": "Copiat", - "connecting": "Conectare...", - "updateAvailable": "Actualizare disponibilă", - "appName": "Termen", - "openInNewTab": "Deschide într-o filă nouă", - "noReleases": "Fără lansări", - "updatesAndReleases": "Actualizări & lansări", - "newVersionAvailable": "O nouă versiune ({{version}}) este disponibilă.", - "failedToFetchUpdateInfo": "Obținerea informațiilor de actualizare a eșuat", - "preRelease": "Pre-Eliberare", - "noReleasesFound": "Nici o lansare găsită.", - "cancel": "Anulează", - "username": "Nume", - "login": "Autentificare", - "register": "Inregistrare", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Anula", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Parolă", - "confirmPassword": "Confirmare parolă", - "back": "Înapoi", - "save": "Salvează", - "saving": "Salvare...", - "delete": "Ștergere", - "rename": "Redenumire", - "edit": "Editare", - "add": "Adăugare", - "confirm": "Confirmare", - "no": "Nr", - "or": "SAU", - "next": "Următoarea", - "previous": "Anterior", - "refresh": "Împrospătează", - "language": "Limba", - "checking": "Verificare...", - "checkingDatabase": "Verificare conexiune la baza de date...", - "checkingAuthentication": "Verificare autentificare...", - "backendReconnected": "Conexiune server restaurată", - "connectionDegraded": "Conexiune la server pierdută, se recuperează…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Elimină", - "create": "Crează", - "update": "Actualizare", - "copy": "Copiază", - "copyFailed": "Copierea în clipboard a eșuat", + "remove": "Elimina", + "create": "Create", + "update": "Update", + "copy": "Copie", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Restaurează", - "of": "din" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Acasă", + "home": "Home", "terminal": "Terminal", - "docker": "Doctor", - "tunnels": "Tuneluri", - "fileManager": "Manager fişiere", - "serverStats": "Statistici server", + "docker": "Docher", + "tunnels": "Tunnels", + "fileManager": "Manager de fișiere", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "admin": "Admin", - "userProfile": "Profil utilizator", - "splitScreen": "Ecran Divizat", - "confirmClose": "Închide această sesiune activă?", - "close": "Inchide", - "cancel": "Anulează", - "sshManager": "Manager SSH", - "cannotSplitTab": "Nu se poate împărți această filă", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Anula", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Copiază parola", - "copySudoPassword": "Copiază parola Sudo", - "passwordCopied": "Parola a fost copiată în clipboard", - "noPasswordAvailable": "Nici o parolă disponibilă", - "failedToCopyPassword": "Copierea parolei a eșuat", - "refreshTab": "Reîmprospătează conexiunea", - "openFileManager": "Deschide managerul de fişiere", - "dashboard": "Panou", - "networkGraph": "Grafic rețea", - "quickConnect": "Conectare rapidă", - "sshTools": "Instrumente SSH", - "history": "Istoric", - "hosts": "Gazde", - "snippets": "Snippet-uri", - "hostManager": "Manager Gazdă", - "credentials": "Acreditări", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Conexiuni", "roleAdministrator": "Administrator", - "roleUser": "Utilizator" + "roleUser": "User" }, "hosts": { - "hosts": "Gazde", - "noHosts": "Fără gazde SSH", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", "retry": "Reîncercați", - "refresh": "Împrospătează", - "optional": "Opţional", - "downloadSample": "Descarcă eșantion", - "failedToDeleteHost": "Nu s-a putut șterge {{name}}", - "importSkipExisting": "Import (săriți peste existență)", - "connectionDetails": "Detalii conexiune", - "ssh": "SH", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", + "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Desktop la distanță", - "port": "Portul", - "username": "Nume", - "folder": "Dosar", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", "tags": "Etichete", - "pin": "Fixează", - "addHost": "Adaugă Gazdă", - "editHost": "Editează Gazda", - "cloneHost": "Gazda Clonei", - "enableTerminal": "Activează Terminal", - "enableTunnel": "Activează tunelul", - "enableFileManager": "Activează Managerul de Fișiere", - "enableDocker": "Activează Docker", - "defaultPath": "Cale implicită", - "connection": "Conexiune", - "upload": "Incarca", - "authentication": "Autentificare", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Parolă", - "key": "Cheie", - "credential": "Acreditări", - "none": "Niciunul", - "sshPrivateKey": "Cheie Privată SSH", - "keyType": "Tip cheie", - "uploadFile": "Incarca fisier", - "tabGeneral": "Generalități", - "tabSsh": "SH", + "key": "Key", + "credential": "Acreditare", + "none": "Nici unul", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", + "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", - "tabVnc": "NVC", - "tabTunnels": "Tuneluri", - "tabDocker": "Doctor", - "tabFiles": "Fișiere", - "tabStats": "Statistici", + "tabVnc": "VNC", + "tabTunnels": "Tunnels", + "tabDocker": "Docher", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Partajare", - "tabAuthentication": "Autentificare", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunel", - "fileManager": "Manager fişiere", - "serverStats": "Statistici server", - "status": "Status", - "folderRenamed": "Dosar \"{{oldName}}\" redenumit \"{{newName}}\" cu succes", - "failedToRenameFolder": "Nu s-a putut redenumi dosarul", - "movedToFolder": "Mutat la \"{{folder}}\"", - "editHostTooltip": "Editare gazdă", - "statusChecks": "Verificări stare", - "metricsCollection": "Colecție de valori", - "metricsInterval": "Intervalul de colectare a valorilor", - "metricsIntervalDesc": "Cât de des se colectează statisticile serverului (5s - 1h)", - "behavior": "Comportament", - "themePreview": "Previzualizare temă", - "theme": "Tema", - "fontFamily": "Familia de fonturi", + "fileManager": "Manager de fișiere", + "serverStats": "Host Metrics", + "status": "Stare", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Spațiere de scrisori", - "lineHeight": "Înălțime linie", - "cursorStyle": "Stil cursor", - "cursorBlink": "Clipire cursor", - "scrollbackBuffer": "Tampon de Derulare", - "bellStyle": "Stil Bell", - "rightClickSelectsWord": "Cuvânt Selectare Click Dreapta", - "fastScrollModifier": "Modificare derulare rapidă", - "fastScrollSensitivity": "Sensibilitate derulare rapidă", - "sshAgentForwarding": "Agent SSH Redirecționare", - "backspaceMode": "Mod spațiu fundal", - "startupSnippet": "Snippet de pornire", - "selectSnippet": "Selectaţi snippet", - "forceKeyboardInteractive": "Forțează tastatura- interactivă", - "overrideCredentialUsername": "Suprascrie utilizatorul de acreditare", - "overrideCredentialUsernameDesc": "Utilizați numele de utilizator specificat mai sus în locul numelui de utilizator al acreditării", - "jumpHostChain": "Lanț gazdă salt", - "portKnocking": "Ciorna portului", - "addKnock": "Adaugă port", - "addProxyNode": "Adaugă modul", - "proxyNode": "Nod proxy", - "proxyType": "Tip Proxy", - "quickActions": "Acțiuni rapide", - "sudoPasswordAutoFill": "Completare automată parolă Sudo", - "sudoPassword": "Parolă Sudo", - "keepaliveInterval": "Interval Keepalive (ms)", - "moshCommand": "Comanda MOSH", - "environmentVariables": "Variabile de mediu", - "addVariable": "Adaugă variabilă", - "docker": "Doctor", - "copyTerminalUrl": "Copiază URL-ul Terminal", - "copyFileManagerUrl": "Copiază URL-ul managerului de fișiere", - "copyRemoteDesktopUrl": "Copiază URL-ul pentru Desktop la distanță", - "failedToConnect": "Conectarea la consolă a eșuat", - "connect": "Conectează-te", - "disconnect": "Deconectare", - "start": "Pornire", - "enableStatusCheck": "Activează verificarea stării", - "enableMetrics": "Activează valorile", - "bulkUpdateFailed": "Actualizare în masă eșuată", - "selectAll": "Selectează tot", - "deselectAll": "Deselectează tot", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docher", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Proiectile securizate", - "virtualNetwork": "Rețea virtuală", - "unencryptedShell": "Proiectil necriptat", - "addressIp": "Adresă / IP", - "friendlyName": "Nume prietenos", - "folderAndAdvanced": "Dosar și Avansat", - "privateNotes": "Note private", - "privateNotesPlaceholder": "Detalii despre acest server...", - "pinToTop": "Fixează sus", - "pinToTopDesc": "Arată întotdeauna această gazdă în partea de sus a listei", - "portKnockingSequence": "Secvenţa de Knocking port", - "addKnockBtn": "Adaugă Ciocănire", - "noPortKnocking": "Nici un bătut de port configurat.", - "knockPort": "Port Ciocănire", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", "protocol": "Protocol", - "delayAfterMs": "Întârziere după (ms)", - "useSocks5Proxy": "Folosește Proxy SOCKS5", - "useSocks5ProxyDesc": "Ruta conexiunea printr-un server proxy", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", "proxyHost": "Proxy Host", - "proxyPort": "Port Proxy", - "proxyUsername": "Utilizator Proxy", - "proxyPassword": "Parolă proxy", - "proxySingleMode": "Proxy unic", - "proxyChainMode": "Lanț Proxy", - "you": "Tu", - "jumpHostChainLabel": "Lanț gazdă salt", - "addJumpBtn": "Adaugă salt", - "noJumpHosts": "Nu sunt gazde salt configurate.", - "selectAServer": "Selectează un server...", - "sshPort": "Portul SSH", - "authMethod": "Metoda de autentificare", - "storedCredential": "Acreditări stocate", - "selectACredential": "Selectați o acreditare...", - "keyTypeLabel": "Tip cheie", - "keyTypeAuto": "Detectare automată", - "keyPasteTab": "Lipește", - "keyUploadTab": "Incarca", - "keyFileLoaded": "Fișier cheie încărcat", - "keyUploadClick": "Click pentru a încărca .pem / .key / .ppk", - "clearKey": "Șterge cheia", - "keySaved": "Cheia SSH salvată", - "keyReplaceNotice": "lipeste o noua cheie de mai jos pentru a o inlocui", - "keyPassphraseSaved": "Parola salvată, tastați pentru a schimba", - "replaceKey": "Înlocuiți cheia", - "forceKeyboardInteractiveLabel": "Forțează interactiv tastatura", - "forceKeyboardInteractiveShortDesc": "Forțează introducerea parolei manuale chiar dacă sunt chei", - "terminalAppearance": "Aspectul terminal", - "colorTheme": "Tema de culoare", - "fontFamilyLabel": "Familia de fonturi", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Stil cursor", - "letterSpacingPx": "Spațiere de scrisori (px)", - "lineHeightLabel": "Înălțime linie", - "bellStyleLabel": "Stil Bell", - "backspaceModeLabel": "Mod spațiu fundal", - "cursorBlinking": "Clipire cursor", - "cursorBlinkingDesc": "Activează animația de clipire pentru cursorul terminal", - "rightClickSelectsWordLabel": "Click dreapta - Cuvânt Selectare", - "rightClickSelectsWordShortDesc": "Selectaţi cuvântul sub cursor la clic-dreapta", - "behaviorAndAdvanced": "Comportament & Avansat", - "scrollbackBufferLabel": "Tampon de Derulare", - "scrollbackMaxLines": "Numărul maxim de linii păstrate în istoric", - "sshAgentForwardingLabel": "Agent SSH Redirecționare", - "sshAgentForwardingShortDesc": "Transmite cheile SSH locale acestei gazde", - "enableAutoMosh": "Activează Auto-Mosh", - "enableAutoMoshDesc": "Preferă Mosh peste SSH dacă este disponibil", - "enableAutoTmux": "Activează Auto-Tmux", - "enableAutoTmuxDesc": "Lansează automat sau atașează la sesiunea tmux", - "sudoPasswordAutoFillLabel": "Completare automată parolă Sudo", - "sudoPasswordAutoFillShortDesc": "Furnizează automat parola sudo când i se solicită", - "sudoPasswordLabel": "Parolă Sudo", - "environmentVariablesLabel": "Variabile de mediu", - "addVariableBtn": "Adaugă variabilă", - "noEnvVars": "Nicio variabilă de mediu configurată.", - "fastScrollModifierLabel": "Modificare derulare rapidă", - "fastScrollSensitivityLabel": "Sensibilitate derulare rapidă", - "moshCommandLabel": "Comanda Moscheii", - "startupSnippetLabel": "Snippet de pornire", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Interval Keepalive (secunde)", - "maxKeepaliveMisses": "Max Keepalive ratează", - "tunnelSettings": "Setări tunel", - "enableTunneling": "Activează tunelarea", - "enableTunnelingDesc": "Activează funcționalitatea tunelului SSH pentru această gazdă", - "serverTunnelsSection": "Tuneluri server", - "addTunnelBtn": "Adaugă tunel", - "noTunnelsConfigured": "Niciun tunel configurat.", - "tunnelLabel": "Tunel {{number}}", - "tunnelType": "Tip tunel", - "tunnelModeLocalDesc": "Înaintează un port local către un port de pe serverul de la distanță (sau o gazdă accesibilă de la acesta).", - "tunnelModeRemoteDesc": "Inainteaza un port pe server inapoi catre un port local de pe calculatorul tau.", - "tunnelModeDynamicDesc": "Creați un proxy SOCKS5 pe un port local pentru un port dinamic de înaintare.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Această gazdă (tunel direct)", - "endpointHost": "Gazdă de sfârșit", - "endpointPort": "Port final", - "bindHost": "Leagă Gazda", - "sourcePort": "Portul sursă", - "maxRetries": "Repetări maxime", - "retryIntervalS": "Reîncearcă Interval (s)", - "autoStartLabel": "Auto-pornire", - "autoStartDesc": "Conectează automat acest tunel atunci când gazda este încărcată", - "tunnelConnecting": "Conectare tunel...", - "tunnelDisconnected": "Tunel deconectat", - "failedToConnectTunnel": "Conectare nereușită", - "failedToDisconnectTunnel": "Deconectare eșuată", - "dockerIntegration": "Integrare Docker", - "enableDockerMonitor": "Activează Docker", - "enableDockerMonitorDesc": "Monitorizează și gestionează containerele pe această gazdă prin intermediul Docker", - "enableFileManagerMonitor": "Activează Managerul de Fișiere", - "enableFileManagerMonitorDesc": "Răsfoiți și gestionați fișierele pe această gazdă prin SFTP", - "defaultPathLabel": "Cale implicită", - "fileManagerPathHint": "Directorul se deschide atunci când managerul de fişiere lansează pentru această gazdă.", - "statusChecksLabel": "Verificări stare", - "enableStatusChecks": "Activează Verificările Stării", - "enableStatusChecksDesc": "Periodic pâna la această gazdă pentru a verifica disponibilitatea", - "useGlobalInterval": "Folosește Interval Global", - "useGlobalIntervalDesc": "Suprascrie cu intervalul de verificare a stării pe panoul serverului", - "checkIntervalS": "Verifică intervalul (s)", - "checkIntervalDesc": "Secunde între fiecare limitare a conectivității", - "metricsCollectionLabel": "Colecție de valori", - "enableMetricsLabel": "Activează valorile", - "enableMetricsDesc": "Colectează CPU, RAM, disk și utilizarea rețelei de pe această gazdă", - "useGlobalMetrics": "Folosește Interval Global", - "useGlobalMetricsDesc": "Suprascrie cu intervalul de măsurare la nivelul serverului", - "metricsIntervalS": "Interval de valori", - "metricsIntervalDesc2": "Secunde între imagini metrice", - "visibleWidgets": "Widget-uri vizibile", - "cpuUsageLabel": "Utilizare procesor", - "cpuUsageDesc": "Procentul procesorului, mediile de încărcare, graficul sparkline", - "memoryLabel": "Utilizare memorie", - "memoryDesc": "Utilizare RAM, swap, cache", - "storageLabel": "Utilizare disc", - "storageDesc": "Utilizare disc per punct de montare", - "networkLabel": "Interfețe de rețea", - "networkDesc": "Lista de interfață și lățimea de bandă", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Parolă", + "authTypeKey": "Cheie SSH", + "authTypeCredential": "Acreditare", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Nici unul", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", "uptimeLabel": "Uptime", "uptimeDesc": "System uptime and boot time", - "systemInfoLabel": "Informații despre sistem", - "systemInfoDesc": "OS, kernel, hostname, arhitectură", - "recentLoginsLabel": "Autentificări recente", - "recentLoginsDesc": "Evenimente de conectare cu succes și eșuate", - "topProcessesLabel": "Procese de top", - "topProcessesDesc": "PID, CPU%, MEM%, comandă", - "listeningPortsLabel": "Ascultarea porturilor", - "listeningPortsDesc": "Deschideți porturile cu proces și stare", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", "firewallLabel": "Firewall", - "firewallDesc": "Firewall, AppArmor, status SELinux", - "quickActionsLabel": "Acțiuni rapide", - "quickActionsToolbar": "Acțiunile rapide apar ca butoane în bara de statistici a serverului pentru execuția comenzii cu un singur clic.", - "noQuickActions": "Nici o acțiune rapidă încă.", - "buttonLabel": "Eticheta butonului", - "selectSnippetPlaceholder": "Selectați snippet...", - "addActionBtn": "Adaugă Acțiune", - "hostSharedSuccessfully": "Gazda partajată cu succes", - "failedToShareHost": "Distribuirea gazdei a eșuat", - "accessRevoked": "Acces revocat", - "failedToRevokeAccess": "Eroare la revocarea accesului", - "cancelBtn": "Anulează", - "savingBtn": "Salvare...", - "addHostBtn": "Adaugă Gazdă", - "hostUpdated": "Gazdă actualizată", - "hostCreated": "Gazdă creată", - "failedToSave": "Salvarea gazdei a eșuat", - "credentialUpdated": "Acreditări actualizate", - "credentialCreated": "Acreditări create", - "failedToSaveCredential": "Salvarea acreditărilor a eșuat", - "backToHosts": "Înapoi la gazde", - "backToCredentials": "Înapoi la acreditări", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Anula", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Fixat", - "noHostsFound": "Nicio gazdă găsită", - "tryDifferentTerm": "Încercați un termen diferit", - "addFirstHost": "Adaugă primul tău gazdă pentru a începe", - "noCredentialsFound": "Acreditările nu au fost găsite", - "addCredentialBtn": "Adaugă acreditare", - "updateCredentialBtn": "Acreditări actualizare", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Caracteristici", - "noFolder": "(Fără dosar)", - "deleteSelected": "Ștergere", - "exitSelection": "Ieșiți din selecție", - "importSkip": "Import (săriți peste existență)", - "importOverwrite": "Import (suprascriere)", - "collapseBtn": "Restrânge", - "importExportBtn": "Importă / Exportă", - "hostStatusesRefreshed": "Stările gazdei reîmprospătate", - "failedToRefreshHosts": "Reîmprospătarea gazdelor a eșuat", - "movedHostTo": "Mutați {{host}} la \"{{folder}}\"", - "failedToMoveHost": "Mutarea gazdei a eșuat", - "folderRenamedTo": "Dosar redenumit \"{{name}}\"", - "deletedFolder": "Dosar șters \"{{name}}\"", - "failedToDeleteFolder": "Eroare la ștergerea dosarului", - "deleteAllInFolder": "Ștergeți toate gazdele din \"{{name}}\"? Acest lucru nu poate fi anulat.", - "deletedHost": "Eliminat {{name}}", - "copiedToClipboard": "Copiat în clipboard", - "terminalUrlCopied": "URL terminal copiat", - "fileManagerUrlCopied": "URL Manager de fişiere copiat", - "tunnelUrlCopied": "URL tunel copiat", - "dockerUrlCopied": "URL Docker copiat", - "serverStatsUrlCopied": "URL Statistici server copiat", - "rdpUrlCopied": "URL-ul DRP copiat", - "vncUrlCopied": "URL VNC copiat", - "telnetUrlCopied": "URL telnet copiat", - "remoteDesktopUrlCopied": "URL la distanță pentru Desktop copiat", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Anula", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Stare", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Extindeți acțiunile", "collapseActions": "Acțiuni de restrângere", "wakeOnLanAction": "Trezire prin LAN", - "wakeOnLanSuccess": "Pachet magic trimis către {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Nu s-a putut trimite pachetul magic", - "cloneHostAction": "Gazda Clonei", - "copyAddress": "Copiază adresa", - "copyLink": "Copiază link-ul", - "copyTerminalUrlAction": "Copiază URL-ul Terminal", - "copyFileManagerUrlAction": "Copiază URL-ul managerului de fișiere", - "copyTunnelUrlAction": "Copiază URL-ul tunelului", - "copyDockerUrlAction": "Copiază URL-ul Docker", - "copyServerStatsUrlAction": "Copiază URL-ul de statistici al serverului", - "copyRdpUrlAction": "Copiază URL-ul DRP", - "copyVncUrlAction": "Copiază URL-ul VNC", - "copyTelnetUrlAction": "Copiază URL-ul Telnet", - "copyRemoteDesktopUrlAction": "Copiază URL-ul pentru Desktop la distanță", - "deleteCredentialConfirm": "Ștergeți acreditările \"{{name}}\"?", - "deletedCredential": "Eliminat {{name}}", - "deploySSHKeyTitle": "Lansează Cheie SSH", - "deployingBtn": "Desfășurare...", - "deployBtn": "Desfășurare", - "failedToDeployKey": "Lansarea cheii a eșuat", - "deleteHostsConfirm": "Ștergeți {{count}} gazdă{{plural}}? Acest lucru nu poate fi anulat.", - "movedToRoot": "Mutat la root", - "failedToMoveHosts": "Mutarea gazdelor a eșuat", - "enableTerminalFeature": "Activează Terminal", - "disableTerminalFeature": "Dezactivează terminalul", - "enableFilesFeature": "Activare fişiere", - "disableFilesFeature": "Dezactivează fișierele", - "enableTunnelsFeature": "Activează tunelurile", - "disableTunnelsFeature": "Dezactivează tunelurile", - "enableDockerFeature": "Activează Docker", - "disableDockerFeature": "Dezactivează Docker", - "addTagsPlaceholder": "Adaugă etichete...", - "authDetails": "Detalii autentificare", - "credType": "Tip", - "generateKeyPairDesc": "Generarea unei noi perechi de chei, atât private, cât și publice, va fi completată automat.", - "generatingKey": "Generare...", - "generateLabel": "Generează {{label}}", - "uploadFileBtn": "Incarca fisier", - "keyPassphraseOptional": "Parolă cheie (opțional)", - "sshPublicKeyOptional": "Cheie publică SSH (opțional)", - "publicKeyGenerated": "Cheie publică generată", - "failedToGeneratePublicKey": "Nu s-a putut obține cheia publică", - "publicKeyCopied": "Cheie publică copiată", - "keyPairGenerated": "{{label}} pereche de chei generată", - "failedToGenerateKeyPair": "Nu s-a putut genera perechea cheilor", - "searchHostsPlaceholder": "Caută gazde, adrese, etichete…", - "searchCredentialsPlaceholder": "Căutare acreditări…", - "refreshBtn": "Împrospătează", - "addTag": "Adaugă etichete...", - "deleteConfirmBtn": "Ștergere", - "tunnelRequirementsText": "Serverul SSH trebuie să aibă GatewayPorts da, AllowTcpForwarding da și permitere RootLogin setat în /etc/ssh/ssh/sshd_config.", - "deleteHostConfirm": "Ștergeți \"{{name}}\"?", - "enableAtLeastOneProtocol": "Activați cel puțin un protocol de mai sus pentru a configura setările de autentificare și conexiune.", - "keyPassphrase": "Parola cheie", - "connectBtn": "Conectează-te", - "disconnectBtn": "Deconectare", - "basicInformation": "Informatii de baza", - "authDetailsSection": "Detalii autentificare", - "credTypeLabel": "Tip", - "hostsTab": "Gazde", - "credentialsTab": "Acreditări", - "selectMultiple": "Selectează mai multe", - "selectHosts": "Selectează gazdele", - "connectionLabel": "Conexiune", - "authenticationLabel": "Autentificare", - "generateKeyPairTitle": "Generează pereche de chei", - "generateKeyPairDescription": "Generarea unei noi perechi de chei, atât private, cât și publice, va fi completată automat.", - "generateFromPrivateKey": "Generează din Cheie Privată", - "refreshBtn2": "Împrospătează", - "exitSelectionTitle": "Ieșiți din selecție", - "exportAll": "Exportă tot", - "addHostBtn2": "Adaugă Gazdă", - "addCredentialBtn2": "Adaugă acreditare", - "checkingHostStatuses": "Verificare stări gazdă...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Fixat", - "hostsExported": "Gazde exportate cu succes", + "hostsExported": "Hosts exported successfully", "exportFailed": "Nu s-au putut exporta gazdele", - "sampleDownloaded": "Mostră fișier descărcat", - "failedToDeleteCredential2": "Nu s-a reușit ștergerea acreditărilor", - "noFolderOption": "(Fără dosar)", - "nSelected": "{{count}} selectate", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Caracteristici", - "moveMenu": "Mutare", - "cancelSelection": "Anulează", - "deployDialogDesc": "Lansează {{name}} la tastele autorizate.", - "targetHostLabel": "Gazda țintă", - "selectHostOption": "Selectează o gazdă...", - "keyDeployedSuccess": "Cheie implementată cu succes", - "failedToDeployKey2": "Lansarea cheii a eșuat", - "deletedCount": "{{count}} host-uri șterse", - "failedToDeleteCount": "Ștergerea host-urilor {{count}} a eșuat", - "duplicatedHost": "Duplicat \"{{name}}\"", - "failedToDuplicateHost": "Duplicarea gazdei a eșuat", - "updatedCount": "Actualizat {{count}} gazde", - "friendlyNameLabel": "Nume prietenos", - "descriptionLabel": "Descriere", - "loadingHost": "Se încarcă gazda...", - "loadingHosts": "Se încarcă gazde...", - "loadingCredentials": "Se încarcă acreditările...", - "noHostsYet": "Nicio gazdă încă", - "noHostsMatchSearch": "Nicio gazdă nu se potrivește cu căutarea ta", - "hostNotFound": "Gazda nu a fost găsită", - "searchHosts": "Caută gazde...", + "moveMenu": "Mişcare", + "connectSelected": "Connect", + "cancelSelection": "Anula", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Sortează gazdele", "sortDefault": "Ordine implicită", "sortNameAsc": "Nume (A → Z)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunel", "filterFeatureDocker": "Docher", "filterTagsGroup": "Etichete", - "shareHost": "Distribuie gazda", - "shareHostTitle": "Partajare: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Acest gazdă trebuie să utilizeze o acreditare pentru a activa partajarea. Editați gazda și atribuiți o acreditare mai întâi." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Conexiune", - "authentication": "Autentificare", - "connectionSettings": "Setări conexiune", - "displaySettings": "Setări de afișare", - "audioSettings": "Setări audio", - "rdpPerformance": "Performanță DRP", - "deviceRedirection": "Redirecționare dispozitiv", - "session": "Sesiune", - "gateway": "Poartă", - "remoteApp": "TelecomandareAplicație", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Acreditare", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", "clipboard": "Clipboard", - "sessionRecording": "Înregistrare sesiune", - "wakeOnLan": "Pornit-de-LAN", - "vncSettings": "Setări VNC", - "terminalSettings": "Setări terminal", - "rdpPort": "Port RDP", - "username": "Nume", + "sessionRecording": "Session Recording", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Parolă", - "domain": "Domeniu", - "securityMode": "Mod de securitate", - "colorDepth": "Adâncime culoare", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Înălțime", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Metoda de redimensionare", - "clientName": "Nume client", - "initialProgram": "Program inițial", - "serverLayout": "Aspect server", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Portul gateway-ului", - "gatewayUsername": "Utilizator Gateway", - "gatewayPassword": "Parolă gateway", - "gatewayDomain": "Domeniu gateway", - "remoteAppProgram": "Program RemoteApp", - "workingDirectory": "Director de lucru", - "arguments": "Argumente", - "normalizeLineEndings": "Normalizează liniile de sfârșit", - "recordingPath": "Cale de înregistrare", - "recordingName": "Nume înregistrare", - "macAddress": "Adresă MAC", - "broadcastAddress": "Adresă difuzare", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Timpul (e) de așteptare", - "driveName": "Nume unitate", - "drivePath": "Calea Drive", - "ignoreCertificate": "Ignoră certificatul", - "ignoreCertificateDesc": "Permite conexiuni cu certificate autosemnate", - "forceLossless": "Forțează pierderea", - "forceLosslessDesc": "Forțează codificarea fără pierderi a imaginilor (de calitate superioară, lățime de bandă mai mare)", - "disableAudio": "Dezactivare audio", - "disableAudioDesc": "Dezactivează sunetul din sesiunea la distanță", - "enableAudioInput": "Activează intrare audio (Microfon)", - "enableAudioInputDesc": "Retrimite microfonul local la sesiunea de la distanță", - "wallpaper": "Fundal", - "wallpaperDesc": "Arată imaginea de fundal pe desktop (dezactivarea îmbunătățește performanța)", - "theming": "Tema", - "themingDesc": "Activează teme vizuale și stiluri", - "fontSmoothing": "Smoothing font", - "fontSmoothingDesc": "Activează redarea fontului ClearType", - "fullWindowDrag": "Glisare în fereastră completă", - "fullWindowDragDesc": "Arată conținutul ferestrei în timpul tragerii", - "desktopComposition": "Componență Desktop", - "desktopCompositionDesc": "Activează efectele Aero glass", - "menuAnimations": "Animaţii meniu", - "menuAnimationsDesc": "Activare animații de estompare și diapozitiv meniu", - "disableBitmapCaching": "Dezactivează Caching Bitmap", - "disableBitmapCachingDesc": "Dezactivează cache-ul bitmap (poate ajuta cu glituri)", - "disableOffscreenCaching": "Dezactivează Caching în afara ecranului", - "disableOffscreenCachingDesc": "Oprește memoria cache", - "disableGlyphCaching": "Dezactivează Glyph Caching", - "disableGlyphCachingDesc": "Opriţi cache-ul glicol", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Utilizați conducta grafică RemoteFX", - "enablePrinting": "Activează imprimarea", - "enablePrintingDesc": "Redirecţionaţi imprimantele locale la sesiunea de la distanţă", - "enableDriveRedirection": "Activează redirecționarea unității", - "enableDriveRedirectionDesc": "Mapează un folder local ca o unitate în sesiunea de la distanţă", - "createDrivePath": "Crează Calea Unității", - "createDrivePathDesc": "Creează automat dosarul dacă acesta nu există", - "disableDownload": "Dezactivează descărcarea", - "disableDownloadDesc": "Previne descărcarea fişierelor din sesiunea la distanţă", - "disableUpload": "Dezactivează Încărcarea", - "disableUploadDesc": "Împiedicați încărcarea fișierelor în sesiunea de la distanță", - "enableTouch": "Activare atingere", - "enableTouchDesc": "Activează redirecționarea către atingere", - "consoleSession": "Sesiune Consolă", - "consoleSessionDesc": "Conectează-te la consolă (sesiunea 0) în loc de o nouă sesiune", - "sendWolPacket": "Trimite Pachet WOL", - "sendWolPacketDesc": "Trimite un pachet magic pentru a trezi această gazdă înainte de conectare", - "disableCopy": "Dezactivează copierea", - "disableCopyDesc": "Împiedică copierea textului din sesiunea la distanță", - "disablePaste": "Dezactivează Lipirea", - "disablePasteDesc": "Împiedică inserarea textului în sesiunea de la distanţă", - "createPathIfMissing": "Crează calea dacă lipsește", - "createPathIfMissingDesc": "Creează automat directorul de înregistrare", - "excludeOutput": "Exclude ieșirea", - "excludeOutputDesc": "Nu înregistra ieșirea ecranului (doar metadate)", - "excludeMouse": "Exclude mouse", - "excludeMouseDesc": "Nu înregistra mișcările mouse-ului", - "includeKeystrokes": "Include tastări", - "includeKeystrokesDesc": "Înregistrează tastele brute în plus față de ieșirea ecranului", - "vncPort": "Port VNC", - "vncPassword": "Parolă VNC", - "vncUsernameOptional": "Nume utilizator (opţional)", - "vncLeaveBlank": "Lăsați necompletat dacă nu este necesar", - "cursorMode": "Modul Cursor", - "swapRedBlue": "Schimbă Roșu/Albastru", - "swapRedBlueDesc": "Schimbă canalele de culoare roşie şi albastră (rezolvă unele probleme de culoare)", - "readOnly": "Doar citire", - "readOnlyDesc": "Vezi ecranul la distanţă fără a trimite nici o intrare", - "telnetPort": "Port Telnet", - "terminalType": "Tip terminal", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Schemă de culori", - "backspaceKey": "Cheie de fundal", - "saveHostFirst": "Salvează gazda mai întâi.", - "sharingOptionsAfterSave": "Opțiuni de partajare sunt disponibile după ce gazda a fost salvată.", - "sharingLoadError": "Eroare la încărcarea partajării datelor. Verificați conexiunea și încercați din nou.", - "shareHostSection": "Distribuie gazda", - "shareWithUser": "Partajează cu utilizatorul", - "shareWithRole": "Partajează cu Rol", - "selectUser": "Selectează utilizator", - "selectRole": "Selectaţi rolul", - "selectUserOption": "Selectați un utilizator...", - "selectRoleOption": "Selectează un rol...", - "permissionLevel": "Nivel permisiuni", - "expiresInHours": "Expiră în (ore)", - "noExpiryPlaceholder": "Lăsați gol pentru a nu expira", - "shareBtn": "Distribuie", - "currentAccess": "Acces curent", - "typeHeader": "Tip", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Permisiune", - "grantedByHeader": "Oferit de", - "expiresHeader": "Expiră", - "noAccessEntries": "Nici o intrare de acces încă.", - "expiredLabel": "Expirat", - "neverLabel": "Niciodată", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Anulează", - "savingBtn": "Salvare...", - "updateHostBtn": "Actualizare Gazdă", - "addHostBtn": "Adaugă Gazdă" + "cancelBtn": "Anula", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Caută gazde, comenzi sau setări...", - "quickActions": "Acțiuni rapide", - "hostManager": "Manager Gazdă", - "hostManagerDesc": "Gestionează, adaugă sau editează gazde", - "addNewHost": "Adaugă Gazdă Nouă", - "addNewHostDesc": "Înregistrează un nou gazdă", - "adminSettings": "Setări Admin", - "adminSettingsDesc": "Configurați preferințele de sistem și utilizatorii", - "userProfile": "Profil utilizator", - "userProfileDesc": "Gestionează-ți contul și preferințele", - "addCredential": "Adaugă acreditare", - "addCredentialDesc": "Stocare chei SSH sau parole", - "recentActivity": "Activitate recentă", - "serversAndHosts": "Servere & Gazde", - "noHostsFound": "Nicio gazdă găsită se potrivește \"{{search}}\"", - "links": "Link-uri", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Selectare", - "toggleWith": "Comută cu" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Nici o filă atribuită", + "noTabAssigned": "No tab assigned", "focusedPane": "Panou activ" }, "connections": { "noConnections": "Fără conexiuni", "noConnectionsDesc": "Deschideți un terminal, un manager de fișiere sau un desktop la distanță pentru a vedea conexiunile aici", - "connectedFor": "Conectat pentru {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Conectat", "disconnected": "Deconectat", "closeTab": "Închide fila", @@ -801,358 +981,374 @@ "sectionBackground": "Fundal", "backgroundDesc": "Sesiunile persistă timp de 30 de minute după deconectare și pot fi reconectate.", "persisted": "A persistat în fundal", - "expiresIn": "Expiră în {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Căutați conexiuni...", - "noSearchResults": "Nicio conexiune nu corespunde căutării dvs." + "noSearchResults": "Nicio conexiune nu corespunde căutării dvs.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Conectare la {{type}} sesiune...", - "connectionError": "Eroare de conexiune", - "connectionFailed": "Conexiune eșuată", - "failedToConnect": "Obținerea token-ului de conectare a eșuat", - "hostNotFound": "Gazda nu a fost găsită", - "noHostSelected": "Niciun gazdă selectat", - "reconnect": "Reconectare", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Conexiunea a eșuat", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Reconectați-vă", "retry": "Reîncercați", - "guacdUnavailable": "Serviciul desktop la distanţă (guacd) nu este disponibil. Vă rugăm să vă asiguraţi că guacd rulează şi este accesibil şi configurat corespunzător în setările de administrare.", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (ecran blocat)", - "winKey": "Cheie Windows", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Schimb", - "win": "Victorie", - "stickyActive": "{{key}} (latched - click pentru lansare)", - "stickyInactive": "{{key}} (click pentru a latch)", - "esc": "Evadează", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Acasă", - "end": "Sfârșit", - "pageUp": "Pagină în sus", - "pageDown": "Pagină jos", - "arrowUp": "Săgeată în sus", - "arrowDown": "Săgeată jos", - "arrowLeft": "Săgeată la stânga", - "arrowRight": "Săgeată la dreapta", - "fnToggle": "Taste Funcție", - "reconnect": "Reconectează Sesiunea", - "collapse": "Restrânge bara de instrumente", - "expand": "Extinde bara de instrumente", - "dragHandle": "Trageți pentru a repoziționa" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Conectează-te la Gazdă", - "clear": "Curăță", - "paste": "Lipește", - "reconnect": "Reconectare", - "connectionLost": "Conexiune pierdută", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconectați-vă", + "connectionLost": "Connection lost", "connected": "Conectat", - "clipboardWriteFailed": "Copierea în clipboard a eșuat. Asigură-te că pagina este deservită prin HTTPS sau localhost.", - "clipboardReadFailed": "Nu a reușit să citească din clipboard. Asigurați-vă că sunt acordate permisiuni pentru clipboard.", - "clipboardHttpWarning": "Lipirea necesită HTTPS. Folosește Ctrl+Shift+V sau servește Termix-ul prin HTTPS.", - "unknownError": "Eroare necunoscută", - "websocketError": "Eroare la conexiunea WebSocket", - "connecting": "Conectare...", - "noHostSelected": "Niciun gazdă selectat", - "reconnecting": "Reconectare... ({{attempt}}/{{max}})", - "reconnected": "Reconectat cu succes", - "tmuxSessionCreated": "sesiune tmux creată: {{name}}", - "tmuxSessionAttached": "sesiune tmux atașată: {{name}}", - "tmuxUnavailable": "tmux nu este instalat pe gazda telecomandei, revenind la shell standard", - "tmuxSessionPickerTitle": "Sesiuni tmux", - "tmuxSessionPickerDesc": "Sesiuni tmux existente găsite pe această gazdă. Selectați una pentru a reatașa sau pentru a crea o sesiune nouă.", - "tmuxWindows": "Ferestre", - "tmuxWindowCount": "{{count}} fereastră", - "tmuxAttached": "Clienți atașați", - "tmuxAttachedCount": "{{count}} atașat", - "tmuxLastActivity": "Ultima activitate", - "tmuxTimeJustNow": "chiar acum", - "tmuxTimeMinutes": "{{count}}m în urmă", - "tmuxTimeHours": "{{count}}acum o oră", - "tmuxTimeDays": "{{count}}d acum", - "tmuxCreateNew": "Începe o sesiune nouă", - "tmuxCopyHint": "Reglaţi selecţia şi apăsaţi Enter pentru a copia în clipboard", - "tmuxDetach": "Detașează de sesiunea tmux", - "tmuxDetached": "Detaşat de sesiunea tmux", - "maxReconnectAttemptsReached": "Reconexiunea maximă a fost atinsă", - "closeTab": "Inchide", - "connectionTimeout": "Conexiune expirată", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Rulând {{command}} - {{host}}", - "totpRequired": "Autentificare dublu factor necesară", - "totpCodeLabel": "Cod de verificare", - "totpVerify": "Verifică", - "warpgateAuthRequired": "Autentificare la urzeală obligatorie", - "warpgateSecurityKey": "Cheie de securitate", - "warpgateAuthUrl": "URL autentificare", - "warpgateOpenBrowser": "Deschide în browser", - "warpgateContinue": "Am finalizat autentificarea", - "opksshAuthRequired": "Autentificare OPKSSH necesară", - "opksshAuthDescription": "Finalizați autentificarea în browser-ul dvs. pentru a continua. Această sesiune va rămâne valabilă 24 de ore.", - "opksshOpenBrowser": "Deschide browser-ul pentru autentificare", - "opksshWaitingForAuth": "Se așteaptă autentificarea în browser...", - "opksshAuthenticating": "Se procesează autentificarea...", - "opksshTimeout": "Autentificarea a expirat. Încercați din nou.", - "opksshAuthFailed": "Autentificare eșuată. Te rugăm să verifici acreditările și să încerci din nou.", - "opksshSignInWith": "Conectați-vă cu {{provider}}", - "sudoPasswordPopupTitle": "Introduceți parola?", - "websocketAbnormalClose": "Conexiune închisă neașteptat. Acest lucru se poate datora unei probleme de configurare invers proxy sau SSL. Vă rugăm să verificați jurnalele serverului.", - "connectionLogTitle": "Jurnal de conexiune", - "connectionLogCopy": "Copiază jurnalele în clipboard", - "connectionLogEmpty": "Încă nu există jurnale de conexiune", - "connectionLogWaiting": "Se așteaptă jurnalele de conexiune...", - "connectionLogCopied": "Jurnalele de conexiune copiate în clipboard", - "connectionLogCopyFailed": "Copierea jurnalelor în clipboard a eșuat", - "connectionRejected": "Conexiune respinsă de server. Verificați autentificarea și configurarea rețelei.", - "hostKeyRejected": "Verificarea cheii gazdă SSH a fost respinsă. Conexiune anulată.", - "sessionTakenOver": "Sesiunea a fost deschisă într-o altă filă. Reconectare..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Deschide", + "linkDialogCopy": "Copie", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Tabulă divizată", + "addToSplit": "Adăugați la divizare", + "removeFromSplit": "Eliminați din Split" + } }, "fileManager": { - "noHostSelected": "Niciun gazdă selectat", - "initializingEditor": "Se inițializează editorul...", - "file": "Fişier", - "folder": "Dosar", - "uploadFile": "Incarca fisier", - "downloadFile": "Descărcare", - "extractArchive": "Extrage arhiva", - "extractingArchive": "Se extrage {{name}}...", - "archiveExtractedSuccessfully": "{{name}} extrase cu succes", - "extractFailed": "Extragere eșuată", - "compressFile": "Fișier de comprimare", - "compressFiles": "Comprimă fişiere", - "compressFilesDesc": "Comprimă {{count}} elemente într-o arhivă", - "archiveName": "Nume arhivă", - "enterArchiveName": "Introduceți numele arhivei...", - "compressionFormat": "Format de comprimare", - "selectedFiles": "Fișiere selectate", - "andMoreFiles": "și {{count}} mai mult...", - "compress": "Comprimă", - "compressingFiles": "Se comprimă {{count}} elemente în {{name}}...", - "filesCompressedSuccessfully": "{{name}} creat cu succes", - "compressFailed": "Compresie eșuată", - "edit": "Editare", - "preview": "Previzualizare", - "previous": "Anterior", - "next": "Următoarea", - "pageXOfY": "Pagina {{current}} {{total}}", - "zoomOut": "Micșorare", - "zoomIn": "Mărire în", - "newFile": "Fișier nou", - "newFolder": "Dosar nou", - "rename": "Redenumire", - "uploading": "Încărcare...", - "uploadingFile": "Se încarcă {{name}}...", - "fileName": "Numele fișierului", - "folderName": "Nume folder", - "fileUploadedSuccessfully": "Fişier \"{{name}}\" încărcat cu succes", - "failedToUploadFile": "Încărcarea fișierului a eșuat", - "fileDownloadedSuccessfully": "Fişier \"{{name}}\" descărcat cu succes", - "failedToDownloadFile": "Descărcarea fișierului a eșuat", - "fileCreatedSuccessfully": "Fişier \"{{name}}\" creat cu succes", - "folderCreatedSuccessfully": "Dosar \"{{name}}\" creat cu succes", - "failedToCreateItem": "Crearea elementului a eșuat", - "operationFailed": "Operația {{operation}} a eșuat pentru {{name}}: {{error}}", - "failedToResolveSymlink": "Rezolvarea legăturii simbolice a eșuat", - "itemsDeletedSuccessfully": "{{count}} elemente șterse cu succes", - "failedToDeleteItems": "Ștergerea elementelor a eșuat", - "sudoPasswordRequired": "Parolă administrator necesară", - "enterSudoPassword": "Introduceți parola sudo pentru a continua această operațiune", - "sudoPassword": "Parolă Sudo", - "sudoOperationFailed": "Operația Sudo a eșuat", - "sudoAuthFailed": "Autentificare Sudo eșuată", - "dragFilesToUpload": "Plasați fișierele aici pentru a le încărca", - "emptyFolder": "Acest dosar este gol", - "searchFiles": "Căutare fișiere...", - "upload": "Incarca", - "selectHostToStart": "Selectați un gazdă pentru a începe gestionarea fișierelor", - "sshRequiredForFileManager": "Managerul de fișiere necesită SSH. Acest gazdă nu are SSH activat.", - "failedToConnect": "Conectarea la SSH a eșuat", - "failedToLoadDirectory": "Încărcarea directorului a eșuat", - "noSSHConnection": "Nicio conexiune SSH disponibilă", - "copy": "Copiază", - "cut": "Taie", - "paste": "Lipește", - "copyPath": "Copiază calea", - "copyPaths": "Copiază calea", - "delete": "Ștergere", - "properties": "Proprietăți", - "refresh": "Împrospătează", - "downloadFiles": "Descărcați {{count}} fișiere în browser", - "copyFiles": "Copiază elementele {{count}}", - "cutFiles": "Tăiați {{count}} elemente", - "deleteFiles": "Ştergeţi {{count}} elemente", - "filesCopiedToClipboard": "{{count}} elemente copiate în clipboard", - "filesCutToClipboard": "{{count}} elemente tăiate în clipboard", - "pathCopiedToClipboard": "Cale copiată în clipboard", - "pathsCopiedToClipboard": "{{count}} căi copiate în clipboard", - "failedToCopyPath": "Copierea căii în clipboard a eșuat", - "movedItems": "Mutat {{count}} elemente", - "failedToDeleteItem": "Ștergerea elementului a eșuat", - "itemRenamedSuccessfully": "{{type}} redenumit cu succes", - "failedToRenameItem": "Nu s-a putut redenumi elementul", - "download": "Descărcare", - "permissions": "Permisiuni", - "size": "Dimensiune", - "modified": "Modificat", - "path": "Cale", - "confirmDelete": "Sunteți sigur că doriți să ștergeți {{name}}?", - "permissionDenied": "Permisiune refuzată", - "serverError": "Eroare server", - "fileSavedSuccessfully": "Fișier salvat cu succes", - "failedToSaveFile": "Salvarea fișierului a eșuat", - "confirmDeleteSingleItem": "Sunteţi sigur că doriţi să ştergeţi definitiv \"{{name}}\"?", - "confirmDeleteMultipleItems": "Sunteți sigur că doriți să ștergeți definitiv elementele {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Sunteți sigur că doriți să ștergeți definitiv elementele {{count}} ? Aceasta include dosarele și conținutul lor.", - "confirmDeleteFolder": "Sunteţi sigur că doriţi să ştergeţi definitiv folderul \"{{name}}\" şi tot conţinutul acestuia?", - "permanentDeleteWarning": "Această acțiune nu poate fi anulată. Elementul(ele) va fi șters(e) definitiv de pe server.", - "recent": "Recente", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copie", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Fixat", - "folderShortcuts": "Comenzi rapide dosar", - "failedToReconnectSSH": "Reconectarea sesiunii SSH a eșuat", - "openTerminalHere": "Deschide Terminalul aici", - "run": "Rulează", - "openTerminalInFolder": "Deschide terminalul în acest folder", - "openTerminalInFileLocation": "Deschide terminalul la locația fișierului", - "runningFile": "Rulare - {{file}}", - "onlyRunExecutableFiles": "Pot rula numai fișiere executabile", - "directories": "Directoare", - "removedFromRecentFiles": "Eliminat \"{{name}}\" din fișierele recente", - "removeFailed": "Eliminare eșuată", - "unpinnedSuccessfully": "Deconectat \"{{name}}\" cu succes", - "unpinFailed": "Anulare fixare eșuată", - "removedShortcut": "Scurtătură eliminată \"{{name}}\"", - "removeShortcutFailed": "Eliminare comandă rapidă eșuată", - "clearedAllRecentFiles": "Toate fișierele recente au fost șterse", - "clearFailed": "Curățare eșuată", - "removeFromRecentFiles": "Șterge din fișierele recente", - "clearAllRecentFiles": "Ştergeţi toate fişierele recente", - "unpinFile": "Anulează fixarea fișierului", - "removeShortcut": "Elimină scurtătura", - "pinFile": "Fixează fișierul", - "addToShortcuts": "Adaugă la comenzi rapide", - "pasteFailed": "Lipirea a eșuat", - "noUndoableActions": "Nicio acțiune de neatins", - "undoCopySuccess": "Operație de copiere neterminată: {{count}} au copiat fișiere", - "undoCopyFailedDelete": "Anulare eșuată: Nu s-au putut șterge fișierele copiate", - "undoCopyFailedNoInfo": "Anulare eșuată: Nu s-a putut găsi informațiile copiate ale fișierului", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Aleargă", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", - "undoMoveFailedMove": "Anulare eșuată: Nu se pot muta fișierele înapoi", - "undoMoveFailedNoInfo": "Anulare eșuată: Nu am putut găsi informațiile despre fișierul mutat", - "undoDeleteNotSupported": "Operația de ștergere nu poate fi anulată: Fișierele au fost șterse permanent de pe server", - "undoTypeNotSupported": "Tip de operațiune undo nesuportată", - "undoOperationFailed": "Operația de anulare a eșuat", - "unknownError": "Eroare necunoscută", - "confirm": "Confirmare", - "find": "Găsiți...", - "replace": "Înlocuiește", - "downloadInstead": "Descarcă în schimb", - "keyboardShortcuts": "Scurtături tastatură", - "searchAndReplace": "Căutare & Înlocuire", - "editing": "Editare", - "search": "Caută", - "findNext": "Găsește următorul", - "findPrevious": "Găsește anterior", - "save": "Salvează", - "selectAll": "Selectează tot", - "undo": "Anulează", - "redo": "Reface", - "moveLineUp": "Mută linia în sus", - "moveLineDown": "Mută linia jos", - "toggleComment": "Comutare comentariu", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Încărcarea imaginii a eșuat", - "startTyping": "Începeți să tastați...", - "unknownSize": "Dimensiune necunoscută", - "fileIsEmpty": "Fișierul este gol", - "largeFileWarning": "Avertisment pentru fișiere mari", - "largeFileWarningDesc": "Acest fișier este {{size}} în dimensiune, ceea ce poate cauza probleme de performanță când este deschis ca text.", - "fileNotFoundAndRemoved": "Fișierul \"{{name}}\" nu a fost găsit și a fost eliminat din fișiere recente/fixate", - "failedToLoadFile": "Eroare la încărcarea fișierului: {{error}}", - "serverErrorOccurred": "Eroare de server. Te rugăm să încerci din nou mai târziu.", - "autoSaveFailed": "Salvarea automată a eșuat", - "fileAutoSaved": "Fișier salvat automat", - "moveFileFailed": "Nu s-a reușit mutarea {{name}}", - "moveOperationFailed": "Operațiune de mutare eșuată", - "canOnlyCompareFiles": "Se pot compara doar două fișiere", - "comparingFiles": "Comparare fișiere: {{file1}} și {{file2}}", - "dragFailed": "Operațiune de tragere eșuată", - "filePinnedSuccessfully": "Fişier \"{{name}}\" fixat cu succes", - "pinFileFailed": "Nu s-a reușit fixarea fișierului", - "fileUnpinnedSuccessfully": "Fişier \"{{name}}\" desprins cu succes", - "unpinFileFailed": "Nu s-a putut anula fixarea fișierului", - "shortcutAddedSuccessfully": "Scurtătură folder \"{{name}}\" adăugat cu succes", - "addShortcutFailed": "Adăugarea de comenzi rapide a eșuat", - "operationCompletedSuccessfully": "{{operation}} {{count}} elemente cu succes", - "operationCompleted": "{{operation}} {{count}} elemente", - "downloadFileSuccess": "Fișier {{name}} descărcat cu succes", - "downloadFileFailed": "Descărcare eșuată", - "moveTo": "Mutați în {{name}}", - "diffCompareWith": "Diff comparativ cu {{name}}", - "dragOutsideToDownload": "Trage fereastra afară pentru a descărca ({{count}} fișiere)", - "newFolderDefault": "Dosar nou", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Au fost mutate cu succes {{count}} elemente în {{target}}", - "move": "Mutare", - "searchInFile": "Căutare în fișier (Ctrl+F)", - "showKeyboardShortcuts": "Afișare scurtături tastatură", - "startWritingMarkdown": "Începe să scrii conținutul markdown...", - "loadingFileComparison": "Se încarcă compararea fișierelor...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Mişcare", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Compară", - "sideBySide": "Listă lângă laterală", + "compare": "Compare", + "sideBySide": "Side by Side", "inline": "Inline", - "fileComparison": "Comparare fișiere: {{file1}} vs {{file2}}", - "fileTooLarge": "Fișier prea mare: {{error}}", - "sshConnectionFailed": "Conexiunea SSH a eșuat. Verificați conexiunea la {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Eroare la încărcarea fișierului: {{error}}", - "connecting": "Conectare...", - "connectedSuccessfully": "Conectat cu succes", - "totpVerificationFailed": "Verificarea TOTP a eșuat", - "warpgateVerificationFailed": "Autentificarea cu teleportare eșuată", - "authenticationFailed": "Autentificare eșuată", - "verificationCodePrompt": "Cod de verificare:", - "changePermissions": "Schimbă Permisiunile", - "currentPermissions": "Permisiuni curente", - "owner": "Proprietar", - "group": "Grup", - "others": "Altele", - "read": "Citește", - "write": "Scrie", - "execute": "Execută", - "permissionsChangedSuccessfully": "Permisiuni schimbate cu succes", - "failedToChangePermissions": "Schimbarea permisiunilor a eșuat", - "name": "Nume", - "sortByName": "Nume", - "sortByDate": "Data modificării", - "sortBySize": "Dimensiune", - "ascending": "Crescător", - "descending": "Descrescător", - "root": "Rădăcină", - "new": "Nou", - "sortBy": "Sortează după", - "items": "Articole", - "selected": "Selectate", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", "editor": "Editor", "octal": "Octal", - "storage": "Depozitare", - "disk": "Disc", - "used": "Utilizat", - "of": "din", - "toggleSidebar": "Comută bara laterală", - "cannotLoadPdf": "Nu se poate încărca PDF", - "pdfLoadError": "A apărut o eroare la încărcarea acestui fișier PDF.", - "loadingPdf": "Se încarcă PDF...", - "loadingPage": "Se încarcă pagina..." + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Copiați către gazdă…", - "moveToHost": "Mutare la gazdă…", - "copyItemsToHost": "Copiați elementele {{count}} pe gazda…", - "moveItemsToHost": "Mută elementele {{count}} către gazda…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Nu sunt disponibile alte gazde de gestionare a fișierelor.", "noHostsConnectedHint": "Adăugați o altă gazdă SSH cu File Manager activat în Host Manager.", "selectDestinationHost": "Selectați gazda de destinație", @@ -1164,48 +1360,48 @@ "browseDestination": "Răsfoiți sau introduceți calea", "confirmCopy": "Copie", "confirmMove": "Mişcare", - "transferring": "Transferarea…", - "compressing": "Comprimarea…", - "extracting": "Extragerea…", - "transferringItems": "Se transferă {{current}} din {{total}} articole…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transfer finalizat", "transferError": "Transferul a eșuat", - "transferPartial": "Transfer finalizat cu erori {{count}}", - "transferPartialHint": "Nu s-a putut transfera: {{paths}}", - "itemsSummary": "{{count}} articole", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Destinația trebuie să fie un director pentru transferurile cu mai multe elemente", "selectThisFolder": "Selectați acest folder", "browsePathWillBeCreated": "Acest folder nu există încă. Va fi creat când va începe transferul.", "browsePathError": "Nu s-a putut deschide această cale pe gazda destinație.", "goUp": "Mergi sus", - "copyFolderToHost": "Copiați folderul pe gazdă…", - "moveFolderToHost": "Mută folderul pe gazdă…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Gata", - "hostConnecting": "Conectare…", + "hostConnecting": "Connecting…", "hostDisconnected": "Neconectat", "hostAuthRequired": "Autentificare necesară — deschideți mai întâi File Manager pe această gazdă", "hostConnectionFailed": "Conexiunea a eșuat", "metricsTitle": "Orele de transfer", - "metricsPrepare": "Pregătiți destinația: {{duration}}", - "metricsCompress": "Comprimare pe sursă: {{duration}}", - "metricsHopSourceRead": "Sursă → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → destinație (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → destinație (locală): {{throughput}}", - "metricsTransfer": "De la un capăt la altul: {{throughput}} ({{duration}})", - "metricsExtract": "Extras la destinație: {{duration}}", - "metricsSourceDelete": "Eliminare din sursă: {{duration}}", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", "metricsTotal": "Total: {{duration}}", - "progressCompressing": "Comprimare pe gazda sursă…", - "progressExtracting": "Extragerea la destinație…", - "progressTransferring": "Transferul datelor…", - "progressReconnecting": "Reconectare…", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Benzi de transfer paralele", - "parallelSegmentsOption": "{{count}} benzi", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Fișierele mari sunt împărțite în blocuri de 256 MB. Mai multe benzi utilizează conexiuni separate (cum ar fi pornirea mai multor transferuri) pentru un debit total mai mare.", - "progressTotalSpeed": "{{speed}} total ({{lanes}} benzi)", - "progressTransferringItems": "Transferarea fișierelor ({{current}} din {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} fișiere", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Fișiere sursă păstrate (transfer parțial)", "jumpHostLimitation": "Ambele gazde trebuie să fie accesibile de pe serverul Termix. Rutarea directă de la gazdă la gazdă nu este acceptată.", "cancel": "Anula", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Alege SFTP tar sau per fișier în funcție de numărul de fișiere, dimensiune și compresibilitate. Fișierele individuale utilizează întotdeauna SFTP în flux continuu.", "methodTarHint": "Comprimare la sursă, transfer o arhivă, extragere la destinație. Necesită tar pe ambele gazde Unix.", "methodItemSftpHint": "Transferă fiecare fișier individual prin SFTP. Funcționează pe toate gazdele, inclusiv Windows.", - "methodPreviewLoading": "Metoda de calcul a transferului…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Nu s-a putut previzualiza metoda de transfer. Serverul va alege în continuare o metodă când porniți.", "methodPreviewWillUseTar": "Se va folosi: arhiva Tar", "methodPreviewWillUseItemSftp": "Se va utiliza: SFTP per fișier", - "methodPreviewScanSummary": "{{fileCount}} fișiere, {{totalSize}} în total (scanate pe gazda sursă).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Fiecare fișier folosește același flux SFTP ca o copie a unui singur fișier, una după alta. Progresul este combinat în toate fișierele, astfel încât bara se mișcă lent în timpul fișierelor mari.", "methodReason": { "user_item_sftp": "Ai ales SFTP per fișier.", "user_tar": "Ai ales arhiva tar.", "tar_unavailable": "Tar nu este disponibil pe una sau ambele gazde — se va folosi în schimb SFTP per fișier.", "windows_host": "Este implicată o gazdă Windows — nu se folosește fișierul tar.", - "auto_multi_large": "Automat: fișiere multiple, inclusiv un fișier mare ({{largestSize}}) cu date compresibile — pachete tar într-un singur transfer.", - "auto_single_large_in_archive": "Automat: un fișier mare ({{largestSize}}) în acest set — SFTP per fișier.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Automat: date în mare parte incompresibile — SFTP per fișier.", - "auto_many_files": "Auto: multe fișiere ({{fileCount}}) — tar reduce costul per fișier.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Automat: SFTP per fișier pentru acest set." }, "progressCancel": "Anula", - "progressCancelling": "Anulare…", + "progressCancelling": "Cancelling…", "progressStalled": "Blocat", "resumedHint": "Reconectare la un transfer activ început într-o altă fereastră.", "transferCancelled": "Transfer anulat", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Date parțiale au fost păstrate la destinație. Reîncercarea va fi reluată după restabilirea conexiunii." }, "tunnels": { - "noSshTunnels": "Fără tuneluri SSH", - "createFirstTunnelMessage": "Nu ai creat încă nici un tunel SSH. Configurați conexiunile tunelului în Managerul de Gazdă pentru a începe.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Conectat", "disconnected": "Deconectat", - "connecting": "Conectare...", - "error": "Eroare", - "canceling": "Anulare...", - "connect": "Conectează-te", - "disconnect": "Deconectare", - "cancel": "Anulează", - "port": "Portul", - "localPort": "Port local", - "remotePort": "Port la distanță", - "currentHostPort": "Portul Gazdei Curente", - "endpointPort": "Port final", - "bindIp": "IP local", - "endpointSshConfig": "Configurare SSH final", - "endpointSshHost": "Sfârșit gazdă SSH", - "endpointSshHostPlaceholder": "Selectați un gazdă configurat", - "endpointSshHostRequired": "Selectați o gazdă SSH pentru fiecare tunel client.", - "attempt": "Încercare de {{current}} de {{max}}", - "nextRetryIn": "Următoarea reîncercare în {{seconds}} secunde", - "clientTunnels": "Tuneluri client", - "clientTunnel": "Tunelul clientului", - "addClientTunnel": "Adaugă Tunel Client", - "noClientTunnels": "Nu există tuneluri client configurate pe acest desktop.", - "tunnelName": "Nume tunel", - "remoteHost": "Gazdă la distanță", - "autoStart": "Pornire automată", - "clientAutoStartDesc": "Începe atunci când acest client pentru desktop se deschide și rămâne conectat.", - "clientManualStartDesc": "Folosiți Start și Stop de la acest rând. Termixul nu îl va deschide automat.", - "clientRemoteServerNote": "Redirecționarea la distanță poate necesita AllowTcpForwarding și GatewayPorts pe serverul SSH final. Portul de la distanță se închide atunci când acest desktop se deconectează.", - "clientTunnelStarted": "Tunelul clientului a început", - "clientTunnelStopped": "Tunelul clientului oprit", - "tunnelTestSucceeded": "Test tunel reușit", - "tunnelTestFailed": "Testul tunelului a eșuat", - "localSaved": "Tuneluri client salvate", - "localSaveError": "Salvarea tunelurilor client locale nu a reușit", - "invalidBindIp": "IP-ul local trebuie să fie o adresă IPv4 validă.", - "invalidLocalTargetIp": "IP-ul ţintă local trebuie să fie o adresă IPv4 validă.", - "invalidLocalPort": "Portul local trebuie să aibă între 1 şi 65535.", - "invalidRemotePort": "Portul la distanță trebuie să fie între 1 și 65535.", - "invalidLocalTargetPort": "Portul ţintă local trebuie să fie între 1 şi 65535.", - "invalidEndpointPort": "Portul punctului final trebuie să fie cuprins între 1 și 65535.", - "duplicateAutoStartBind": "Doar un singur tunel de pornire automată poate utiliza {{bind}}.", - "manualControlError": "Actualizarea stării tunelului a eșuat.", - "active": "Activ", - "start": "Pornire", - "stop": "Oprește", - "test": "Testare", - "type": "Tip tunel", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Anula", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", "typeLocal": "Local (-L)", - "typeRemote": "Distanta (-R)", - "typeDynamic": "Dinamic (-D)", - "typeServerLocalDesc": "Până la punctul final gazda curentă.", - "typeServerRemoteDesc": "Punct final înapoi la gazda curentă.", - "typeClientLocalDesc": "Localizarea calculatorului este finalizată.", - "typeClientRemoteDesc": "Punct final înapoi la calculatorul local.", - "typeClientDynamicDesc": "SOCKS pe calculatorul local.", - "typeDynamicDesc": "Transmitere trafic SOCKS5 CONNECT prin SSH", - "forwardDescriptionServerLocal": "Actuala gazdă {{sourcePort}} → final {{endpointPort}}.", - "forwardDescriptionServerRemote": "Sfârşit {{endpointPort}} → Gazda curentă {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS pe gazda curentă {{sourcePort}}.", - "forwardDescriptionClientLocal": "{{sourcePort}} → {{endpointPort}} telecomandă.", - "forwardDescriptionClientRemote": "{{sourcePort}} → {{endpointPort}} local.", - "forwardDescriptionClientDynamic": "SOCKS pentru portul local {{sourcePort}}.", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "{{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → {{localPort}} local", - "autoNameClientDynamic": "SOCKS {{localPort}} prin {{endpoint}}", - "route": "Rută:", - "lastStarted": "Ultima dată început", - "lastTested": "Ultimul test", - "lastError": "Ultima eroare", - "maxRetries": "Repetări maxime", - "maxRetriesDescription": "Numărul maxim de încercări de reîncercare.", - "retryInterval": "Interval de reîncercare (secunde)", - "retryIntervalDescription": "Timpul de asteptare intre incercarile de reincercare.", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", "local": "Local", - "remote": "Distanta", - "destination": "Destinație", - "host": "Gazdă", - "mode": "Mod", - "noHostSelected": "Niciun gazdă selectat", - "working": "Procesare..." + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "procesor", - "memory": "Memorie", - "disk": "Disc", - "network": "Rețea", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", "uptime": "Uptime", - "processes": "Procese", - "available": "Disponibil", - "free": "Gratuit", - "connecting": "Conectare...", - "connectionFailed": "Conectarea la server a eșuat", - "naCpus": "N/un procesor", - "cpuCores_one": "{{count}} Nucleu", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Utilizare procesor", - "memoryUsage": "Utilizare memorie", - "diskUsage": "Utilizare disc", - "failedToFetchHostConfig": "Preluarea configuratiei gazdei a esuat", - "serverOffline": "Server offline", - "cannotFetchMetrics": "Valorile nu pot fi preluate de pe serverul offline", - "totpFailed": "Verificarea TOTP a eșuat", - "noneAuthNotSupported": "Statisticile serverului nu acceptă tipul de autentificare 'non'.", - "load": "Încărcare", - "systemInfo": "Informatii Sistem", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Sistem de operare", - "kernel": "Nucleu", - "seconds": "secunde", - "networkInterfaces": "Interfețe de rețea", - "noInterfacesFound": "Nu s-au găsit interfețe de rețea", - "noProcessesFound": "Nici un proces găsit", - "loginStats": "Statistici autentificare SSH", - "noRecentLoginData": "Nu există date recente de conectare", - "executingQuickAction": "Executând {{name}}...", - "quickActionSuccess": "{{name}} completat cu succes", - "quickActionFailed": "{{name}} a eșuat", - "quickActionError": "Eșec la executarea {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Ascultarea porturilor", + "title": "Listening Ports", "protocol": "Protocol", - "port": "Portul", - "address": "Adresa", - "process": "Procesare", - "noData": "Date din porturi care nu sunt ascultate" + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { "title": "Firewall", - "inactive": "Inactiv", - "policy": "Politică", - "rules": "reguli", - "noData": "Nu sunt disponibile date firewall-uri", - "action": "Acțiune", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Portul", - "source": "Sursa", - "anywhere": "Oriunde" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Încărcare medie", - "swap": "Schimbă", - "architecture": "Arhitectură", - "refresh": "Împrospătează", - "retry": "Reîncercați" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Reîncercați", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Aleargă", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Gestionare SSH și desktop la distanță auto-găzduită", - "loginTitle": "Autentificare în Termix", - "registerTitle": "Creare cont", - "forgotPassword": "Parolă uitată?", - "rememberMe": "Ține minte dispozitivul pentru 30 de zile (include TOTP)", - "noAccount": "Nu ai un cont?", - "hasAccount": "Ai deja un cont?", - "twoFactorAuth": "Autentificare în doi pași", - "enterCode": "Introduceți codul de verificare", - "backupCode": "Sau folosește codul backup-ului", - "verifyCode": "Verifică codul", - "redirectingToApp": "Redirecționare către aplicație...", - "sshAuthenticationRequired": "Autentificare SSH necesară", - "sshNoKeyboardInteractive": "Autentificare cu tastatură indisponibilă", - "sshAuthenticationFailed": "Autentificare eșuată", - "sshAuthenticationTimeout": "Timp de autentificare", - "sshNoKeyboardInteractiveDescription": "Serverul nu acceptă autentificare interactivă tastatură. Vă rugăm să furnizați parola sau cheia SSH.", - "sshAuthFailedDescription": "Acreditările furnizate au fost incorecte. Te rugăm să încerci din nou cu acreditări valide.", - "sshTimeoutDescription": "Încercarea de autentificare a expirat. Încercați din nou.", - "sshProvideCredentialsDescription": "Te rugăm să introduci datele tale de autentificare SSH pentru a te conecta la acest server.", - "sshPasswordDescription": "Introduceți parola pentru această conexiune SSH.", - "sshKeyPasswordDescription": "Dacă cheia SSH este criptată, introduceți parola de acces aici.", - "passphraseRequired": "Parolă necesară", - "passphraseRequiredDescription": "Cheia SSH este criptată. Introduceți parola de acces pentru a o debloca.", - "back": "Înapoi", - "firstUser": "Primul utilizator", - "firstUserMessage": "Sunteți primul utilizator și va fi făcut administrator. Puteți vedea setările de administrare în meniul dropdown. Dacă credeți că este o greșeală, verificați jurnalele de andocare, sau creați o problemă GitHub.", - "external": "Extern", - "loginWithExternal": "Autentificare cu furnizor extern", - "loginWithExternalDesc": "Autentifică-te folosind furnizorul de identitate extern configurat", - "externalNotSupportedInElectron": "Autentificarea externă nu este încă acceptată în aplicația Electron. Vă rugăm să folosiți versiunea web pentru autentificarea OIDC.", - "resetPasswordButton": "Resetare parolă", - "sendResetCode": "Trimite codul de resetare", - "resetCodeDesc": "Introdu numele tău de utilizator pentru a primi un cod de resetare a parolei. Codul va fi autentificat în jurnalele containerelor de andocare.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verifică codul", - "enterResetCode": "Introdu codul de 6 cifre din jurnalele containerelor de andocare pentru utilizator:", - "newPassword": "Parolă nouă", - "confirmNewPassword": "Confirmare parolă", - "enterNewPassword": "Introduceți noua parolă pentru utilizator:", - "signUp": "Înscrie-te", - "desktopApp": "Aplicație desktop", - "loggingInToDesktopApp": "Conectare la aplicația desktop", - "loadingServer": "Se încarcă serverul...", - "dataLossWarning": "Resetarea parolei în acest mod va șterge toate gazdele SSH salvate, credențialele și alte date criptate. Această acțiune nu poate fi anulată. Folosiți doar dacă ați uitat parola și nu sunteți conectat.", - "authenticationDisabled": "Autentificare dezactivată", - "authenticationDisabledDesc": "Toate metodele de autentificare sunt momentan dezactivate. Vă rugăm să contactaţi administratorul.", - "attemptsRemaining": "{{count}} încercări rămase" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verificare cheie gazdă SSH", - "keyChangedWarning": "Cheie gazdă SSH schimbată", - "firstConnectionTitle": "Conectare pentru prima dată la această gazdă", - "firstConnectionDescription": "Autenticitatea acestui gazdă nu poate fi stabilită. Verificați ca amprenta să corespundă cu ceea ce așteptați.", - "keyChangedDescription": "Cheia gazdă a acestui server s-a schimbat de la ultima conexiune. Aceasta ar putea indica o problemă de securitate.", - "previousKey": "Cheie anterioară", - "newFingerprint": "Amprentă nouă", - "fingerprint": "Amprentă", - "verifyInstructions": "Dacă aveți încredere în această gazdă, faceți clic pe Accept pentru a continua și a salva amprenta pentru conexiunile viitoare.", - "securityWarning": "Avertizare de securitate", - "acceptAndContinue": "Acceptați și continuați", - "acceptNewKey": "Acceptați o nouă cheie și continuați" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Nu s-a putut conecta la baza de date", - "unknownError": "Eroare necunoscută", - "loginFailed": "Autentificare eșuată", - "failedPasswordReset": "Nu s-a reușit inițializarea resetării parolei", - "failedVerifyCode": "Verificarea codului de resetare a eșuat", - "failedCompleteReset": "Finalizarea resetării parolei a eșuat", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Pornirea autentificării OIDC a eșuat", - "silentSigninOidcUnavailable": "Autentificare silențioasă a fost solicitată, dar autentificarea OIDC nu este disponibilă.", - "failedUserInfo": "Obținerea informațiilor utilizatorului a eșuat după autentificare", - "oidcAuthFailed": "Autentificarea OIDC a eșuat", - "invalidAuthUrl": "URL autorizare invalid primit de la backend", - "requiredField": "Acest câmp este necesar", - "minLength": "Lungimea minimă este {{min}}", - "passwordMismatch": "Parolele nu corespund", - "passwordLoginDisabled": "Numele de utilizator/parola este dezactivat în prezent", - "sessionExpired": "Sesiunea a expirat - vă rugăm să vă autentificați din nou", - "totpRateLimited": "Evaluare limitată: Prea multe încercări de verificare TOTP. Vă rugăm să încercaţi din nou mai târziu.", - "totpRateLimitedWithTime": "Evaluare limitată: Prea multe încercări de verificare TOTP. Vă rugăm să așteptați {{time}} secunde înainte de a încerca din nou.", - "resetCodeRateLimited": "Evaluare limitată: Prea multe încercări de verificare. Vă rugăm să încercați din nou mai târziu.", - "resetCodeRateLimitedWithTime": "Evaluare limitată: Prea multe încercări de verificare. Vă rugăm să așteptați {{time}} secunde înainte de a încerca din nou.", - "authTokenSaveFailed": "Salvarea token-ului de autentificare a eșuat", - "failedToLoadServer": "Încărcarea serverului a eșuat" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Înregistrarea unui cont nou este momentan dezactivată de un administrator. Vă rugăm să vă autentificați sau să contactați un administrator.", - "userNotAllowed": "Contul dvs. nu este autorizat să se înregistreze. Vă rugăm să contactaţi un administrator.", - "databaseConnectionFailed": "Conectarea la serverul bazei de date a eșuat", - "resetCodeSent": "Cod de resetare trimis la jurnalele Docker", - "codeVerified": "Cod verificat cu succes", - "passwordResetSuccess": "Parola de resetare cu succes", - "loginSuccess": "Autentificare reușită", - "registrationSuccess": "Înregistrare reușită" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Tuneluri locale pentru desktop care vizează gazdele SSH configurate.", - "c2sTunnelPresets": "Setările Tunelului Client", - "c2sTunnelPresetsDesc": "Salvați lista locală de tunel a acestui client desktop ca o anumită presetare de server sau încărcați o presetare înapoi în acest client.", - "c2sTunnelPresetsUnavailable": "Setările de presetare ale clientului sunt disponibile doar în clientul desktop.", - "c2sPresetName": "Nume presetare", - "c2sPresetNamePlaceholder": "Numele prestabilit al clientului", - "c2sPresetToLoad": "Presetare la încărcare", - "c2sNoPresetSelected": "Nicio presetare selectată", - "c2sNoPresets": "Nicio presetare salvată", - "c2sLoadPreset": "Încărcare", - "c2sCurrentLocalConfig": "{{count}} local client tunel configurat pe acest desktop.", - "c2sPresetSyncNote": "Presetarile sunt instantanee explicite; incarcarea uneia inlocuieste aceasta lista locala de clienti clienti din lista locala.", - "c2sPresetSaved": "Presetare client tunel salvat", - "c2sPresetLoaded": "Setul de presetare al clientului încărcat local", - "c2sPresetRenamed": "Setul prestabilit al clientului a fost redenumit", - "c2sPresetDeleted": "Setare presetare client ștearsă", - "c2sPresetLoadError": "Încărcarea presetărilor client tunel a eșuat" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Limba", - "keyPassword": "parola cheii", - "pastePrivateKey": "Lipiți cheia privată aici...", - "localListenerHost": "127.0.0,1 (ascultați local)", - "localTargetHost": "127.0.0,1 (țintă pe acest calculator)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Introduceți parola", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Panou", - "loading": "Se încarcă tabloul de bord...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Suport", + "support": "Support", "discord": "Discord", - "serverOverview": "Vizualizare server", - "version": "Versiune", - "upToDate": "Până la data", - "updateAvailable": "Actualizare disponibilă", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", "uptime": "Uptime", - "database": "Baza de date", - "healthy": "sănătos", - "error": "Eroare", - "totalHosts": "Total gazde", - "totalTunnels": "Total tuneluri", - "totalCredentials": "Total acreditări", - "recentActivity": "Activitate recentă", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Se încarcă activitatea recentă...", - "noRecentActivity": "Nicio activitate recentă", - "quickActions": "Acțiuni rapide", - "addHost": "Adaugă Gazdă", - "addCredential": "Adaugă acreditare", - "adminSettings": "Setări Admin", - "userProfile": "Profil utilizator", - "serverStats": "Statistici server", - "loadingServerStats": "Se încarcă statisticile serverului...", - "noServerData": "Nu sunt disponibile date de server", - "cpu": "procesor", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Personalizează tabloul de bord", - "dashboardSettings": "Setări tablou de bord", - "enableDisableCards": "Activează/Dezactivează Cardurile", - "resetLayout": "Resetare la valorile implicite", - "serverOverviewCard": "Vizualizare server", - "recentActivityCard": "Activitate recentă", - "networkGraphCard": "Grafic rețea", - "networkGraph": "Grafic rețea", - "quickActionsCard": "Acțiuni rapide", - "serverStatsCard": "Statistici server", - "panelMain": "Principal", - "panelSide": "Lateral", - "justNow": "chiar acum" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "STABILE", - "hostsOnline": "Gazde Online", - "activeTunnels": "Tuneluri active", - "registerNewServer": "Înregistrează un nou server", - "storeSshKeysOrPasswords": "Stocare chei SSH sau parole", - "manageUsersAndRoles": "Gestionează utilizatorii și rolurile", - "manageYourAccount": "Gestionează-ți contul", - "hostStatus": "Starea Gazdei", - "noHostsConfigured": "Nicio gazdă configurată", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Adăugaţi:", - "commandPalette": "Paletă de comandă", - "done": "Terminat", - "editModeInstructions": "Trage cardurile pentru a reordona · Trage separatorul de coloană pentru a redimensiona coloane · Trage marginea de jos a unui card pentru a-i redimensiona înălțimea · Gunoi pentru a elimina", - "empty": "Golire", - "clear": "Curăță" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copie", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Adaugă Gazdă", - "addGroup": "Adaugă grup", - "addLink": "Adaugă link", - "zoomIn": "Mărire în", - "zoomOut": "Micșorare", - "resetView": "Resetare vizualizare", - "selectHost": "Selectați Gazda", - "chooseHost": "Alege o gazdă...", - "parentGroup": "Grup părinte", - "noGroup": "Niciun grup", - "groupName": "Nume grup", - "color": "Culoare", - "source": "Sursa", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Mutare în grup", - "selectGroup": "Selectați grupul...", - "addConnection": "Adaugă conexiune", - "hostDetails": "Detalii Gazdă", - "removeFromGroup": "Elimină din grup", - "addHostHere": "Adaugă gazdă aici", - "editGroup": "Editează grup", - "delete": "Ștergere", - "add": "Adăugare", - "create": "Crează", - "move": "Mutare", - "connect": "Conectează-te", - "createGroup": "Creare grup", - "selectSourcePlaceholder": "Selectează sursa...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Mişcare", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Fișier nevalid", - "hostAlreadyExists": "Gazda este deja în topologie", - "connectionExists": "Conexiunea există deja", - "unknown": "Necunoscut", - "name": "Nume", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "Status", - "failedToAddNode": "Adăugarea nodului a eșuat", - "sourceDifferentFromTarget": "Sursa și ținta trebuie să fie diferite", - "exportJSON": "Exportă JSON", - "importJSON": "Importă JSON", + "status": "Stare", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Manager fişiere", + "fileManager": "Manager de fișiere", "tunnel": "Tunel", - "docker": "Doctor", - "serverStats": "Statistici server", - "noNodes": "Nu există încă noduri" + "docker": "Docher", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Dockerul nu este activat pentru această gazdă", - "validating": "Se validează Doctorul...", - "connecting": "Conectare...", - "error": "Eroare", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Conectarea la Docker a eșuat", - "containerStarted": "Container {{name}} a început", - "failedToStartContainer": "Pornirea containerului {{name}} a eșuat", - "containerStopped": "Container {{name}} oprit", - "failedToStopContainer": "Nu s-a putut opri containerul {{name}}", - "containerRestarted": "Container {{name}} repornit", - "failedToRestartContainer": "Repornirea containerului {{name}} a eșuat", - "containerPaused": "Containerul {{name}} a fost întrerupt", - "containerUnpaused": "Container {{name}} neîntrerupt", - "failedToTogglePauseContainer": "Comutarea comutării întreruperii pentru containerul {{name}}", - "containerRemoved": "Container {{name}} eliminat", - "failedToRemoveContainer": "Nu s-a putut elimina containerul {{name}}", - "image": "Imagine", - "ports": "Porturi", - "noPorts": "Nu există porturi", - "start": "Pornire", - "confirmRemoveContainer": "Sunteți sigur că doriți să eliminați containerul '{{name}}'? Această acțiune nu poate fi anulată.", - "runningContainerWarning": "Avertisment: Acest recipient rulează. Scoaterea va opri mai întâi containerul.", - "loadingContainers": "Se încarcă containerele...", - "manager": "Managerul Docker", - "autoRefresh": "Reîmprospătare automată", - "timestamps": "Marcaje de timp", - "lines": "Linii", - "filterLogs": "Filtrează jurnalele...", - "refresh": "Împrospătează", - "download": "Descărcare", - "clear": "Curăță", - "logsDownloaded": "Loguri descărcate cu succes", - "last50": "Ultimele 50", - "last100": "Ultimele 100", - "last500": "Ultimele 500", - "last1000": "Ultimele 1000", - "allLogs": "Toate jurnalele", - "noLogsMatching": "Niciun jurnal se potrivește \"{{query}}\"", - "noLogsAvailable": "Niciun jurnal disponibil", - "noContainersFound": "Nici un container găsit", - "noContainersFoundHint": "Nu sunt containere docker disponibile pe această gazdă", - "searchPlaceholder": "Căutare containere...", - "allStatuses": "Toate stările", - "stateRunning": "Rulează", - "statePaused": "Pauză", - "stateExited": "Ieşit", - "stateRestarting": "Repornire", - "noContainersMatchFilters": "Niciun container nu se potrivește cu filtrele tale", - "noContainersMatchFiltersHint": "Încercați să ajustați criteriile de căutare sau filtrare", - "failedToFetchStats": "Preluarea statisticilor containerelor a eșuat", - "containerNotRunning": "Containerul nu rulează", - "startContainerToViewStats": "Începeți containerul pentru a vizualiza statisticile", - "loadingStats": "Se încarcă statisticile...", - "errorLoadingStats": "Eroare la încărcarea statisticilor", - "noStatsAvailable": "Nu există statistici disponibile", - "cpuUsage": "Utilizare procesor", - "current": "Actuală", - "memoryUsage": "Utilizare memorie", - "networkIo": "Rețea I/O", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Ieșire", - "blockIo": "Blochează I/O", - "read": "Citește", - "write": "Scrie", - "pids": "PID-uri", - "containerInformation": "Informații despre container", - "name": "Nume", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Județ", - "containerMustBeRunning": "Containerul trebuie să ruleze pentru a accesa consola", - "verificationCodePrompt": "Introduceți codul de verificare", - "totpVerificationFailed": "Verificarea TOTP a eșuat. Încercați din nou.", - "warpgateVerificationFailed": "Autentificarea cu teleportare a eșuat. Te rugăm să încerci din nou.", - "connectedTo": "Conectat la {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Deconectat", - "consoleError": "Eroare de consolă", - "errorMessage": "Eroare: {{message}}", - "failedToConnect": "Conectarea la container a eșuat", - "console": "Consolă", - "selectShell": "Selectează proiectil", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", - "sh": "pânză", - "ash": "cenuşă", - "connect": "Conectează-te", - "disconnect": "Deconectare", - "notConnected": "Nu este conectat", - "clickToConnect": "Faceți clic pe conectare pentru a începe o sesiune de shell", - "connectingTo": "Conectare la {{containerName}}...", - "containerNotFound": "Containerul nu a fost găsit", - "backToList": "Înapoi la listă", - "logs": "Jurnale", - "stats": "Statistici", - "consoleTab": "Consolă", - "startContainerToAccess": "Porniți containerul pentru a accesa consola" + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Neconectat", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Generalități", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Utilizatori", - "sectionSessions": "Sesiuni", - "sectionRoles": "Roluri", - "sectionDatabase": "Baza de date", - "sectionApiKeys": "Chei API", - "allowRegistration": "Permite înregistrarea utilizatorului", - "allowRegistrationDesc": "Permite utilizatorilor noi să se înregistreze automat", - "allowPasswordLogin": "Permiteți autentificarea cu parolă", - "allowPasswordLoginDesc": "Nume utilizator/parolă", - "oidcAutoProvision": "Furnizare automată OIDC", - "oidcAutoProvisionDesc": "Creare automată conturi pentru utilizatori OIDC chiar și atunci când înregistrarea este dezactivată", - "allowPasswordReset": "Permiteți resetarea parolei", - "allowPasswordResetDesc": "Resetează codul prin jurnalele Docker", - "sessionTimeout": "Timeout sesiune", - "hours": "ore", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Ștergeți filtrele", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Stare", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "Monitorizarea implicita", - "statusCheck": "Verificare stare", - "metrics": "Valori", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", "sec": "sec", - "logLevel": "Nivel jurnal", - "enableGuacamole": "Activează Guacamol", - "enableGuacamoleDesc": "desktop la distanță RDP/VNC", - "guacdUrl": "URL guacd", - "oidcDescription": "Configurați OpenID Connect pentru câmpurile marcate * sunt obligatorii.", - "oidcClientId": "ID client", - "oidcClientSecret": "Secret client", - "oidcAuthUrl": "URL-ul de autorizare", - "oidcIssuerUrl": "URL emitent", - "oidcTokenUrl": "URL token", - "oidcUserIdentifier": "Calea identificatorului utilizatorului", - "oidcDisplayName": "Afișează calea numelui", - "oidcScopes": "Domeniu", - "oidcUserinfoUrl": "Suprascrie URL-ul utilizatorului", - "oidcAllowedUsers": "Utilizatori permiși", - "oidcAllowedUsersDesc": "Un e-mail pe linie. Lăsați gol pentru a permite tuturor.", - "removeOidc": "Elimină", - "usersCount": "{{count}} utilizatori", - "createUser": "Crează", - "newRole": "Rol nou", - "roleName": "Nume", - "roleDisplayName": "Nume afișat", - "roleDescription": "Descriere", - "rolesCount": "{{count}} rol", - "createRole": "Crează", - "creating": "Creare...", - "exportDatabase": "Exportă baza de date", - "exportDatabaseDesc": "Descarcă o copie de rezervă a tuturor host-urilor, credențialelor și setărilor", - "export": "Exportă", - "exporting": "Exportare...", - "importDatabase": "Importă baza de date", - "importDatabaseDesc": "Restaurează dintr-un fișier de backup .sqlite", - "importDatabaseSelected": "Selectat: {{name}}", - "selectFile": "Selectaţi fişierul", - "changeFile": "Schimbă", - "import": "Importă", - "importing": "Importare...", - "apiKeysCount": "{{count}} chei", - "newApiKey": "Cheie API nouă", - "apiKeyCreatedWarning": "Cheie creată - copiați-o acum, nu va mai fi afișată din nou.", - "apiKeyName": "Nume", - "apiKeyUser": "Utilizator", - "apiKeySelectUser": "Selectați un utilizator...", - "apiKeyExpiresAt": "Expiră la", - "createKey": "Crează cheie", - "apiKeyNoExpiry": "Fără expirare", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Elimina", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Autentificare dublă", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", "authTypeLocal": "Local", "adminStatusAdministrator": "Administrator", - "adminStatusRegularUser": "Utilizator obișnuit", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "PERSONALIZARE", - "youBadge": "Tu", - "sessionsActive": "{{count}} activ", - "sessionActive": "Activ: {{time}}", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "Toate", - "revokeAllSessionsSuccess": "Toate sesiunile pentru utilizator au fost revocate", - "revokeAllSessionsFailed": "Eroare la revocarea sesiunilor", - "revokeSessionFailed": "Eroare la revocarea sesiunii", - "addRole": "Adaugă rol", - "noCustomRoles": "Niciun rol personalizat definit", - "removeRoleFailed": "Nu s-a putut elimina rolul", - "assignRoleFailed": "Atribuirea rolului a eșuat", - "deleteRoleFailed": "Ștergerea rolului a eșuat", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", "userAdminAccess": "Administrator", - "userAdminAccessDesc": "Acces complet la toate setările de administrare", - "userRoles": "Roluri", - "revokeAllUserSessions": "Revocă toate sesiunile", - "revokeAllUserSessionsDesc": "Forțează reautentificarea pe toate dispozitivele", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Ștergerea acestui utilizator este permanentă.", - "deleteUser": "Șterge {{username}}", - "deleting": "Ștergere...", - "deleteUserFailed": "Ștergerea utilizatorului a eșuat", - "deleteUserSuccess": "Utilizator \"{{username}}\" șters", - "deleteRoleSuccess": "Rol \"{{name}}\" şters", - "revokeKeySuccess": "Cheie \"{{name}}\" revocată", - "revokeKeyFailed": "Anularea cheii a eșuat", - "copiedToClipboard": "Copiat în clipboard", - "done": "Terminat", - "createUserTitle": "Creare utilizator", - "createUserDesc": "Creează un nou cont local.", - "createUserUsername": "Nume", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Parolă", - "createUserPasswordHint": "Minim 6 caractere.", - "createUserEnterUsername": "Introdu numele de utilizator", - "createUserEnterPassword": "Introduceți parola", - "createUserSubmit": "Creare utilizator", - "editUserTitle": "Gestionare utilizator: {{username}}", - "editUserDesc": "Editează roluri, stare administrator, sesiuni și setări cont.", - "editUserUsername": "Nume", - "editUserAuthType": "Tip Auth", - "editUserAdminStatus": "Starea Administratorului", - "editUserUserId": "ID Utilizator", - "linkAccountTitle": "Link OIDC la contul de parolă", - "linkAccountDesc": "Îmbinați contul OIDC {{username}} cu un cont local existent.", - "linkAccountWarningTitle": "Acest lucru va:", - "linkAccountEffect1": "Ștergeți contul OIDC-only", - "linkAccountEffect2": "Adăugați autentificarea OIDC în contul țintă", - "linkAccountEffect3": "Permite atât OIDC cât și parola de conectare", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Introduceți numele de utilizator al contului local pentru a vă conecta la", - "linkAccounts": "Conturi de legătură", - "linkAccountSuccess": "Cont OIDC conectat la „{{username}}”", - "linkAccountFailed": "Conectarea contului OIDC a eșuat", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Tip de autentificare", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Se conectează...", - "saving": "Salvare...", - "updateRegistrationFailed": "Actualizarea setării de înregistrare a eșuat", - "updatePasswordLoginFailed": "Actualizarea parolei de conectare a eșuat", - "updateOidcAutoProvisionFailed": "Actualizarea setării de autofurnizare OIDC a eșuat", - "updatePasswordResetFailed": "Actualizarea setării de resetare a parolei a eșuat", - "sessionTimeoutRange2": "Perioada de expirare a sesiunii trebuie să fie între 1 şi 720 ore", - "sessionTimeoutSaved": "Sepire sesiune salvată", - "sessionTimeoutSaveFailed": "Salvarea sesiunii a eșuat", - "monitoringIntervalInvalid": "Valori interval nevalid", - "monitoringSaved": "Setări de monitorizare salvate", - "monitoringSaveFailed": "Salvarea setărilor de monitorizare a eșuat", - "guacamoleSaved": "Setări Guacamole salvate", - "guacamoleSaveFailed": "Salvarea setărilor Guacamole a eșuat", - "guacamoleUpdateFailed": "Actualizarea setării Guacamole a eșuat", - "logLevelUpdateFailed": "Actualizarea nivelului de jurnal a eșuat", - "oidcSaved": "Configurație OIDC salvată", - "oidcSaveFailed": "Salvarea configurației OIDC a eșuat", - "oidcRemoved": "Configurație OIDC eliminată", - "oidcRemoveFailed": "Ștergerea configurației OIDC a eșuat", - "createUserRequired": "Numele de utilizator și parola sunt necesare", - "createUserPasswordTooShort": "Parola trebuie să conțină cel puțin 6 caractere", - "createUserSuccess": "Utilizator \"{{username}}\" creat", - "createUserFailed": "Crearea utilizatorului a eșuat", - "updateAdminStatusFailed": "Actualizarea stării de administrare a eșuat", - "allSessionsRevoked": "Toate sesiunile au fost anulate", - "revokeSessionsFailed": "Eroare la revocarea sesiunilor", - "createRoleRequired": "Numele și numele afișat sunt obligatorii", - "createRoleSuccess": "Rol \"{{name}}\" creat", - "createRoleFailed": "Crearea rolului a eșuat", - "apiKeyNameRequired": "Numele cheii este necesar", - "apiKeyUserRequired": "ID-ul de utilizator este necesar", - "apiKeyCreatedSuccess": "API-cheie \"{{name}}\" creat", - "apiKeyCreateFailed": "Crearea cheii API a eșuat", - "exportSuccess": "Baza de date exportată cu succes", - "exportFailed": "Exportarea bazei de date a eșuat", - "importSelectFile": "Vă rugăm să selectaţi mai întâi un fişier", - "importCompleted": "Import finalizat: {{total}} articole importate, {{skipped}} omis", - "importFailed": "Importare eșuată: {{error}}", - "importError": "Importarea bazei de date a eșuat" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Gazdă", - "hostPlaceholder": "192.168.1.1 sau exemplu.com", - "portLabel": "Portul", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Nume", - "usernamePlaceholder": "utilizator", - "authLabel": "Autorizare", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Parolă", - "passwordPlaceholder": "parolă", - "privateKeyLabel": "Cheie privată", - "privateKeyPlaceholder": "Lipiți cheia privată...", - "credentialLabel": "Acreditări", - "credentialPlaceholder": "Selectați o acreditare salvată", - "connectToTerminal": "Conectează-te la Terminal", - "connectToFiles": "Conectează-te la Fișiere" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Acreditare", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Niciun terminal selectat", - "noTerminalSelectedHint": "Deschide o fereastră SSH terminal pentru a vedea istoricul comenzilor", - "searchPlaceholder": "Istoricul căutării...", - "clearAll": "Șterge tot", - "noHistoryEntries": "Nici o intrare în istoric", - "trackingDisabled": "Urmărirea istoricului este dezactivată", - "trackingDisabledHint": "Activați-l în setările profilului dvs. pentru a înregistra comenzi." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Înregistrare cheie", - "recordToTerminals": "Înregistrare la terminale", - "selectAll": "Toate", - "selectNone": "Niciunul", - "noTerminalTabsOpen": "Nici o filă terminală deschisă", - "selectTerminalsAbove": "Selectați terminalele de mai sus", - "broadcastInputPlaceholder": "Scrie aici pentru a transmite tastatura...", - "stopRecording": "Oprește înregistrarea", - "startRecording": "Începe înregistrarea", - "settingsTitle": "Setări", - "enableRightClickCopyPaste": "Activează copy/paste clic-dreapta" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Nici unul", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Aspect", - "selectLayoutAbove": "Selectaţi un aspect de mai sus", - "selectLayoutHint": "Alege câte panouri să fie afișate", - "panesTitle": "Panouri", - "openTabsTitle": "Deschide filele", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Trageți filele în panourile de mai sus sau utilizați Atribuire rapidă", - "dropHere": "Plasează aici", - "emptyPane": "Golire", - "dashboard": "Panou", - "clearSplitScreen": "Golește ecranul împărțit", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Atribuire rapidă", - "alreadyAssigned": "Panou {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Tabulă divizată", "addToSplit": "Adăugați la divizare", "removeFromSplit": "Eliminați din Split", - "assignToPane": "Atribuire panoului" + "assignToPane": "Atribuire panoului", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Creează fragmente", - "createSnippetDescription": "Creați un nou snippet de comenzi pentru execuție rapidă", - "nameLabel": "Nume", - "namePlaceholder": "de exemplu, reporniţi Nginx", - "descriptionLabel": "Descriere", - "descriptionPlaceholder": "Descriere opțională", - "optional": "Opţional", - "folderLabel": "Dosar", - "noFolder": "Niciun dosar (neclasificat)", - "commandLabel": "Comanda", - "commandPlaceholder": "de exemplu, sudo systemctl repornire nginx", - "cancel": "Anulează", - "createSnippetButton": "Creează fragmente", - "createFolderTitle": "Creare folder", - "createFolderDescription": "Organizați fragmentele în dosare", - "folderNameLabel": "Nume folder", - "folderNamePlaceholder": "de ex. Comenzi de sistem, Scripturi Docker", - "folderColorLabel": "Culoare dosar", - "folderIconLabel": "Iconiță Folder", - "previewLabel": "Previzualizare", - "folderNameFallback": "Nume folder", - "createFolderButton": "Creare folder", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Anula", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Toate", - "selectNone": "Niciunul", - "noTerminalTabsOpen": "Nici o filă terminală deschisă", - "searchPlaceholder": "Caută fragmente...", - "newSnippet": "Fragment nou", - "newFolder": "Dosar nou", - "run": "Rulează", - "noSnippetsInFolder": "Niciun snippets în acest dosar", - "uncategorized": "Neclasificat", - "editSnippetTitle": "Editare fragmente", - "editSnippetDescription": "Actualizează această comandă snippet", - "saveSnippetButton": "Salvează modificările", - "createSuccess": "Fragment creat cu succes", - "createFailed": "Crearea snippet a eșuat", - "updateSuccess": "Fragment actualizat cu succes", - "updateFailed": "Actualizarea snippet a eșuat", - "deleteFailed": "Ștergerea snippet-ului a eșuat", - "folderCreateSuccess": "Folder creat cu succes", - "folderCreateFailed": "Nu s-a reușit crearea dosarului", - "editFolderTitle": "Editare dosar", - "editFolderDescription": "Redenumiți sau schimbați aspectul acestui dosar", - "saveFolderButton": "Salvează modificările", - "editFolder": "Editare dosar", - "deleteFolder": "Ștergere dosar", - "folderDeleteSuccess": "Dosar \"{{name}}\" șters", - "folderDeleteFailed": "Eroare la ștergerea dosarului", - "folderEditSuccess": "Dosar actualizat cu succes", - "folderEditFailed": "Actualizarea dosarului a eșuat", - "confirmRunMessage": "Executați „{{name}}”?", + "selectAll": "All", + "selectNone": "Nici unul", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Aleargă", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Aleargă", - "runSuccess": "Ran \"{{name}}\" în terminalul(ele) {{count}}", - "copySuccess": "A copiat \"{{name}}\" în clipboard", - "shareTitle": "Distribuie fragmentul", - "shareUser": "Utilizator", - "shareRole": "Rol", - "selectUser": "Selectați un utilizator...", - "selectRole": "Selectează un rol...", - "shareSuccess": "Snippet partajat cu succes", - "shareFailed": "Distribuire snippet eșuată", - "revokeSuccess": "Acces revocat", - "revokeFailed": "Eroare la revocarea accesului", - "currentAccess": "Acces curent", - "shareLoadError": "Încărcarea datelor partajate a eșuat", - "loading": "Încărcare...", - "close": "Inchide", - "reorderFailed": "Nu s-a putut salva ordinea fragmentelor." + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Nu s-a putut salva ordinea fragmentelor.", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Cont", - "sectionAppearance": "Aspectul", - "sectionSecurity": "Securitate", - "sectionApiKeys": "Chei API", - "sectionC2sTunnels": "Tuneluri C2S", - "usernameLabel": "Nume", - "roleLabel": "Rol", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", "roleAdministrator": "Administrator", - "authMethodLabel": "Metoda de autentificare", + "authMethodLabel": "Auth Method", "authMethodLocal": "Local", - "twoFaLabel": "2F", - "twoFaOn": "Activat", - "twoFaOff": "Dezactivat", - "versionLabel": "Versiune", - "deleteAccount": "Ștergere cont", - "deleteAccountDescription": "Șterge permanent contul tău", - "deleteButton": "Ștergere", - "deleteAccountPermanent": "Această acţiune este permanentă şi nu poate fi anulată.", - "deleteAccountWarning": "Toate sesiunile, gazdele, credențialele și setările vor fi șterse definitiv.", - "confirmPasswordDeletePlaceholder": "Introduceți parola pentru a confirma", - "languageLabel": "Limba", - "themeLabel": "Tema", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Culoare accent", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Comanda Autocompletare", - "commandAutocompleteDesc": "Arată autocompletarea în timpul tastării", - "historyTracking": "Urmărire istoric", - "historyTrackingDesc": "Urmăriți comenzile terminalului", - "syntaxHighlighting": "Evidențiere sintaxă", - "syntaxHighlightingDesc": "Evidențiază ieșirea terminalului", - "commandPalette": "Paletă de comandă", - "commandPaletteDesc": "Activează scurtătura pentru tastatură", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Redeschideți filele la conectare", "reopenTabsOnLoginDesc": "Restaurați filele deschise atunci când vă conectați sau reîmprospătați pagina, chiar și de pe un alt dispozitiv", - "confirmTabClose": "Confirmă fila închisă", - "confirmTabCloseDesc": "Întreabă înainte de a închide filele terminale", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Arată etichetele gazdei", - "showHostTagsDesc": "Afișează etichetele în lista de host-uri", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Faceți clic pentru a extinde acțiunile gazdei", "hostTrayOnClickDesc": "Afișați întotdeauna butoanele de conectare; faceți clic pentru a extinde opțiunile de gestionare în loc să treceți cu mouse-ul peste", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Fixează aplicația Pin Rail", "pinAppRailDesc": "Mențineți șina aplicației din bara laterală stângă mereu extinsă, în loc să se extindă la trecerea cu mouse-ul peste mouse", - "settingsSnippets": "Snippet-uri", - "foldersCollapsed": "Dosare Restrânse", - "foldersCollapsedDesc": "Restrânge implicit dosarele", - "confirmExecution": "Confirmare execuție", - "confirmExecutionDesc": "Confirmă înainte de a rula snippet-uri", - "settingsUpdates": "Actualizări", - "disableUpdateChecks": "Dezactivează verificările actualizărilor", - "disableUpdateChecksDesc": "Opriți verificarea pentru actualizări", - "totpAuthenticator": "Autentificator TOTP", - "totpEnabled": "2FA este activat", - "totpDisabled": "Adăugare securitate suplimentară autentificare", - "disable": "Dezactivează", - "enable": "Activare", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Scanați codul QR sau introduceți secret în aplicația de autentificare, apoi introduceți codul de 6 cifre", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verifică", - "changePassword": "Schimbare parolă", - "currentPasswordLabel": "Parola curentă", - "currentPasswordPlaceholder": "Parola curentă", - "newPasswordLabel": "Parolă nouă", - "newPasswordPlaceholder": "Parola nouă", - "confirmPasswordLabel": "Confirmare parolă nouă", - "confirmPasswordPlaceholder": "Confirmare parolă nouă", - "updatePassword": "Actualizare parolă", - "createApiKeyTitle": "Creare cheie API", - "createApiKeyDescription": "Generează o nouă cheie API pentru acces programatic.", - "apiKeyNameLabel": "Nume", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "opţional", - "cancel": "Anulează", - "createKey": "Crează cheie", - "apiKeyCount": "{{count}} chei", - "newKey": "Cheie nouă", - "noApiKeys": "Nici o cheie API încă.", - "apiKeyActive": "Activ", - "apiKeyUsageHint": "Includeți cheia dumneavoastră în", - "apiKeyUsageHintHeader": "antet.", - "apiKeyPermissionsHint": "Taste moștenesc permisiunile utilizatorului de a crea.", - "roleUser": "Utilizator", - "authMethodDual": "Autentificare dublă", + "optional": "optional", + "cancel": "Anula", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Pornirea setării TOTP a eșuat", - "totpEnter6Digits": "Introduceți un cod de 6 cifre", - "totpEnabledSuccess": "Autentificare doi factori activată", - "totpInvalidCode": "Cod nevalid, încercați din nou", - "totpDisableInputRequired": "Introduceți codul sau parola TOTP", - "totpDisabledSuccess": "Autentificare doi factori dezactivată", - "totpDisableFailed": "Dezactivarea 2FA a eșuat", - "totpDisableTitle": "Dezactivează 2FA", - "totpDisablePlaceholder": "Introduceți codul TOTP sau parola", - "totpDisableConfirm": "Dezactivează 2FA", - "totpContinueVerify": "Continuați să verificați", - "totpVerifyTitle": "Verifică codul", - "totpBackupTitle": "Coduri de rezervă", - "totpDownloadBackup": "Descarcă codurile de rezervă", - "done": "Terminat", - "secretCopied": "Secret copiat în clipboard", - "apiKeyNameRequired": "Numele cheii este necesar", - "apiKeyCreated": "API-cheie \"{{name}}\" creat", - "apiKeyCreateFailed": "Crearea cheii API a eșuat", - "apiKeyUser": "Utilizator", - "apiKeyExpires": "Expiră", - "apiKeyRevoked": "Cheie API \"{{name}}\" revocată", - "apiKeyRevokeFailed": "Eroare la revocarea cheii API", - "passwordFieldsRequired": "Sunt necesare parole curente și noi", - "passwordMismatch": "Parolele nu corespund", - "passwordTooShort": "Parola trebuie să conțină cel puțin 6 caractere", - "passwordUpdated": "Parola actualizată cu succes", - "passwordUpdateFailed": "Actualizarea parolei a eșuat", - "deletePasswordRequired": "Parola este necesară pentru a șterge contul dvs.", - "deleteFailed": "Ștergerea contului a eșuat", - "deleting": "Ștergere...", - "colorPickerTooltip": "Deschide selectorul de culori", - "themeSystem": "Sistem", - "themeLight": "Lumină", - "themeDark": "Întunecat", - "themeDracula": "Draculă", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solarizat", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Un întunecat", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Etichete", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Reîncercați", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Elimina", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/ru_RU.json b/src/ui/locales/translated/ru_RU.json index 77750546..9f51c098 100644 --- a/src/ui/locales/translated/ru_RU.json +++ b/src/ui/locales/translated/ru_RU.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Папки", - "folder": "Папка", + "folders": "Folders", + "folder": "Folder", "password": "Пароль", - "key": "Ключ", - "sshPrivateKey": "SSH закрытый ключ", - "upload": "Выгрузить", - "keyPassword": "Пароль ключа", - "sshKey": "SSH ключ", - "uploadPrivateKeyFile": "Загрузить файл с закрытым ключом", - "searchCredentials": "Поиск учетных данных...", - "addCredential": "Добавить учетные данные", - "caCertificate": "Сертификат ЦС (-cert.pub)", - "caCertificateDescription": "Необязательно: Загрузите или вставьте файл подписанного CA-сертификата (например, id_ed25519-cert.pub). Обязательно, когда SSH сервер использует авторизацию на основе сертификата.", - "uploadCertFile": "Загрузить -cert.pub файл", - "clearCert": "Очистить", - "certLoaded": "Сертификат загружен", - "certPublicKeyLabel": "Сертификат ЦС", - "certTypeLabel": "Тип сертификата", - "pasteOrUploadCert": "Вставьте или загрузите сертификат -cert.pub...", - "hasCaCert": "Имеет сертификат ЦС", - "noCaCert": "Нет сертификата ЦС" + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "Ключ SSH", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Порядок по умолчанию", + "sortNameAsc": "Имя (от А до Я)", + "sortNameDesc": "Имя (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Очистить фильтры", + "filterTypeGroup": "Type", + "filterTypePassword": "Пароль", + "filterTypeKey": "Ключ SSH", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Не удалось загрузить оповещения", - "failedToDismissAlert": "Не удалось уволить оповещение" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Конфигурация сервера", - "description": "Настройте URL сервера Termix для подключения к вашим сервисам backend", - "serverUrl": "URL сервера", - "enterServerUrl": "Пожалуйста, введите URL сервера", - "saveFailed": "Не удалось сохранить настройки", - "saveError": "Ошибка при сохранении конфигурации", - "saving": "Сохранение...", - "saveConfig": "Сохранить конфигурацию", - "helpText": "Введите URL, на котором запущен сервер Termix (например, http://localhost:30001 или https://your-server.com)", - "changeServer": "Сменить сервер", - "mustIncludeProtocol": "Адрес сервера должен начинаться с http:// или https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Разрешить использование недействительного сертификата", "allowInvalidCertificateDesc": "Использовать только для доверенных серверов, размещенных на собственном сервере и имеющих самоподписанные сертификаты или сертификаты IP-адресов.", - "useEmbedded": "Использовать локальный сервер", - "embeddedDesc": "Запустить Termix со встроенным локальным сервером (удалённый сервер не требуется)", - "embeddedConnecting": "Подключение к локальному серверу...", - "embeddedNotReady": "Локальный сервер еще не готов. Пожалуйста, подождите минуту и повторите попытку.", - "localServer": "Локальный сервер" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Удалять" }, "versionCheck": { - "error": "Ошибка проверки версии", - "checkFailed": "Не удалось проверить обновления", - "upToDate": "Приложение обновлено", - "currentVersion": "Вы используете версию {{version}}", - "updateAvailable": "Доступно обновление", - "newVersionAvailable": "Доступна новая версия! Вы используете {{current}}, но {{latest}} доступен.", - "betaVersion": "Бета-версия", - "betaVersionDesc": "Вы используете {{current}}, который новее, чем последний стабильный релиз {{latest}}.", - "releasedOn": "Выпущено на {{date}}", - "downloadUpdate": "Загрузить обновление", - "checking": "Проверка обновлений...", - "checkUpdates": "Проверить обновления", - "checkingUpdates": "Проверка обновлений...", - "updateRequired": "Требуется обновление" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Закрыть", - "minimize": "Свернуть", - "online": "Онлайн", - "offline": "Оффлайн", - "continue": "Продолжить", - "maintenance": "Техническое обслуживание", - "degraded": "Ухудшение", - "error": "Ошибка", - "warning": "Предупреждение", - "unsavedChanges": "Несохраненные изменения", - "dismiss": "Отклонить", - "loading": "Загрузка...", - "optional": "Опционально", - "connect": "Подключиться", - "copied": "Скопировано", - "connecting": "Подключение...", - "updateAvailable": "Доступно обновление", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Открыть в новой вкладке", - "noReleases": "Нет релизов", - "updatesAndReleases": "Обновления и релизы", - "newVersionAvailable": "Доступна новая версия ({{version}}).", - "failedToFetchUpdateInfo": "Не удалось получить информацию об обновлении", - "preRelease": "Пре-релиз", - "noReleasesFound": "Релизы не найдены.", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", "cancel": "Отмена", - "username": "Имя пользователя", - "login": "Логин", - "register": "Регистрация", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Пароль", - "confirmPassword": "Подтверждение пароля", - "back": "Назад", - "save": "Сохранить", - "saving": "Сохранение...", - "delete": "Удалить", - "rename": "Переименовать", - "edit": "Редактирование", - "add": "Добавить", - "confirm": "Подтвердить", - "no": "Нет", - "or": "ИЛИ", - "next": "Следующий", - "previous": "Предыдущий", - "refresh": "Обновить", - "language": "Язык", - "checking": "Проверка...", - "checkingDatabase": "Проверка подключения к базе данных...", - "checkingAuthentication": "Проверка аутентификации...", - "backendReconnected": "Соединение с сервером восстановлено", - "connectionDegraded": "Соединение с сервером потеряно, восстановление…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Удалить", - "create": "Создать", - "update": "Обновить", - "copy": "Копировать", - "copyFailed": "Не удалось скопировать в буфер обмена", + "remove": "Удалять", + "create": "Create", + "update": "Update", + "copy": "Копия", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Восстановить", - "of": "из" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Домашний", + "home": "Home", "terminal": "Терминал", - "docker": "Докер", - "tunnels": "Туннели", + "docker": "Docker", + "tunnels": "Tunnels", "fileManager": "Файловый менеджер", - "serverStats": "Статистика сервера", - "admin": "Админ", - "userProfile": "Профиль пользователя", - "splitScreen": "Разделить экран", - "confirmClose": "Закрыть эту активную сессию?", - "close": "Закрыть", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", "cancel": "Отмена", - "sshManager": "SSH менеджер", - "cannotSplitTab": "Нельзя разделить эту вкладку", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Скопировать пароль", - "copySudoPassword": "Скопировать пароль Sudo", - "passwordCopied": "Пароль скопирован в буфер обмена", - "noPasswordAvailable": "Пароль не доступен", - "failedToCopyPassword": "Не удалось скопировать пароль", - "refreshTab": "Обновить соединение", - "openFileManager": "Открыть файловый менеджер", - "dashboard": "Панель", - "networkGraph": "Сетевой график", - "quickConnect": "Быстрое подключение", - "sshTools": "SSH инструменты", - "history": "История", - "hosts": "Узлы", - "snippets": "Сниппеты", - "hostManager": "Менеджер хостов", - "credentials": "Учетные данные", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Связи", - "roleAdministrator": "Администратор", - "roleUser": "Пользователь" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Узлы", - "noHosts": "Нет SSH хостов", - "retry": "Повторить", - "refresh": "Обновить", - "optional": "Опционально", - "downloadSample": "Скачать образец", - "failedToDeleteHost": "Не удалось удалить {{name}}", - "importSkipExisting": "Импорт (пропустить существующий)", - "connectionDetails": "Детали подключения", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Повторить попытку", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Telnet", - "remoteDesktop": "Удаленный рабочий стол", - "port": "Порт", - "username": "Имя пользователя", - "folder": "Папка", - "tags": "Теги", - "pin": "Закрепить", - "addHost": "Добавить хост", - "editHost": "Изменить хост", - "cloneHost": "Клонировать хост", - "enableTerminal": "Включить терминал", - "enableTunnel": "Включить Туннель", - "enableFileManager": "Включить Диспетчер файлов", - "enableDocker": "Включить Docker", - "defaultPath": "Путь по умолчанию", - "connection": "Подключение", - "upload": "Выгрузить", - "authentication": "Аутентификация", + "telnet": "Телнет", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Пароль", - "key": "Ключ", - "credential": "Учётные данные", - "none": "Нет", - "sshPrivateKey": "SSH закрытый ключ", - "keyType": "Тип ключа", - "uploadFile": "Загрузить файл", - "tabGeneral": "Общие положения", + "key": "Key", + "credential": "Credential", + "none": "Никто", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", - "tabVnc": "ВНК", - "tabTunnels": "Туннели", - "tabDocker": "Докер", - "tabFiles": "Файлы", - "tabStats": "Статистика", - "tabTelnet": "Telnet", - "tabSharing": "Поделиться", - "tabAuthentication": "Проверка подлинности", + "tabTerminal": "Терминал", + "tabRdp": "РДП", + "tabVnc": "VNC", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Телнет", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Терминал", "tunnel": "Туннель", "fileManager": "Файловый менеджер", - "serverStats": "Статистика сервера", + "serverStats": "Host Metrics", "status": "Статус", - "folderRenamed": "Папка \"{{oldName}}\" успешно переименована в \"{{newName}}\"", - "failedToRenameFolder": "Не удалось переименовать папку", - "movedToFolder": "Перемещено в \"{{folder}}\"", - "editHostTooltip": "Изменить узел", - "statusChecks": "Проверки состояния", - "metricsCollection": "Коллекция метрик", - "metricsInterval": "Интервал сбора метрик", - "metricsIntervalDesc": "Как часто собирать статистику сервера (5s - 1ч)", - "behavior": "Поведение", - "themePreview": "Предпросмотр темы", - "theme": "Тема", - "fontFamily": "Семейство шрифтов", - "fontSize": "Размер шрифта", - "letterSpacing": "Интервал букв", - "lineHeight": "Высота линии", - "cursorStyle": "Стиль курсора", - "cursorBlink": "Ярлык курсора", - "scrollbackBuffer": "Буфер прокрутки", - "bellStyle": "Стиль колокольни", - "rightClickSelectsWord": "Щелкните правой кнопкой мыши для выбора слова", - "fastScrollModifier": "Модификатор быстрой прокрутки", - "fastScrollSensitivity": "Быстрая чувствительность прокрутки", - "sshAgentForwarding": "Перенаправление SSH агента", - "backspaceMode": "Режим Backspace", - "startupSnippet": "Сниппет запуска", - "selectSnippet": "Выбрать сниппет", - "forceKeyboardInteractive": "Интерактивная клавиатура", - "overrideCredentialUsername": "Переопределить имя пользователя", - "overrideCredentialUsernameDesc": "Используйте имя пользователя, указанное выше, вместо имени пользователя", - "jumpHostChain": "Цепь Прыжков", - "portKnocking": "Летание портов", - "addKnock": "Добавить порт", - "addProxyNode": "Добавить узел", - "proxyNode": "Узел прокси", - "proxyType": "Тип прокси", - "quickActions": "Быстрые действия", - "sudoPasswordAutoFill": "Автозаполнение пароля", - "sudoPassword": "Sudo Пароль", - "keepaliveInterval": "Защитный интервал (мс)", - "moshCommand": "Команда MOSH", - "environmentVariables": "Переменные окружения", - "addVariable": "Добавить переменную", - "docker": "Докер", - "copyTerminalUrl": "Копировать URL терминала", - "copyFileManagerUrl": "Копировать URL диспетчера файлов", - "copyRemoteDesktopUrl": "Копировать URL удаленного рабочего стола", - "failedToConnect": "Не удалось подключиться к консоли", - "connect": "Подключиться", - "disconnect": "Отключиться", - "start": "Начать", - "enableStatusCheck": "Включить проверку статуса", - "enableMetrics": "Включить метрики", - "bulkUpdateFailed": "Массовое обновление не удалось", - "selectAll": "Выделить все", - "deselectAll": "Отменить выбор", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Защищенная раковина", - "virtualNetwork": "Виртуальная сеть", - "unencryptedShell": "Незашифрованная оболочка", - "addressIp": "Адрес / IP", - "friendlyName": "Дружественное имя", - "folderAndAdvanced": "Папка и расширенные", - "privateNotes": "Личные заметки", - "privateNotesPlaceholder": "Детали об этом сервере...", - "pinToTop": "Прикрепить к началу", - "pinToTopDesc": "Всегда показывать этот хост в верхней части списка", - "portKnockingSequence": "Порт отталкивает последовательность", - "addKnockBtn": "Добавить тук", - "noPortKnocking": "Нет настроенных портов.", - "knockPort": "Порт Тука", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", "protocol": "Protocol", - "delayAfterMs": "Задержка после (мс)", - "useSocks5Proxy": "Использовать SOCKS5 прокси", - "useSocks5ProxyDesc": "Перенаправлять соединение через прокси-сервер", - "proxyHost": "Прокси хост", - "proxyPort": "Порт прокси", - "proxyUsername": "Имя пользователя прокси", - "proxyPassword": "Пароль прокси", - "proxySingleMode": "Одиночный прокси", - "proxyChainMode": "Цепочка прокси", - "you": "Вы", - "jumpHostChainLabel": "Цепь Прыжков", - "addJumpBtn": "Добавить прыжок", - "noJumpHosts": "Хосты прыжков не настроены.", - "selectAServer": "Выберите сервер...", - "sshPort": "SSH порт", - "authMethod": "Метод аутентификации", - "storedCredential": "Сохраненные учетные данные", - "selectACredential": "Выберите учетные данные...", - "keyTypeLabel": "Тип ключа", - "keyTypeAuto": "Автоопределение", - "keyPasteTab": "Вставить", - "keyUploadTab": "Выгрузить", - "keyFileLoaded": "Файл ключа загружен", - "keyUploadClick": "Нажмите, чтобы загрузить .pem / .key / .ppk", - "clearKey": "Очистить ключ", - "keySaved": "SSH ключ сохранен", - "keyReplaceNotice": "вставьте новый ключ ниже, чтобы заменить его", - "keyPassphraseSaved": "Парольная фраза сохранена, тип для изменения", - "replaceKey": "Заменить ключ", - "forceKeyboardInteractiveLabel": "Интерактивная клавиатура", - "forceKeyboardInteractiveShortDesc": "Принудительно вводить пароль вручную, даже если есть ключи", - "terminalAppearance": "Внешний вид терминала", - "colorTheme": "Цветовая схема", - "fontFamilyLabel": "Семейство шрифтов", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "ОПКШ", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Стиль курсора", - "letterSpacingPx": "Интервал букв (px)", - "lineHeightLabel": "Высота линии", - "bellStyleLabel": "Стиль колокольни", - "backspaceModeLabel": "Режим Backspace", - "cursorBlinking": "Привязка курсора", - "cursorBlinkingDesc": "Включить анимацию мигания для курсора терминала", - "rightClickSelectsWordLabel": "Щелкните правой кнопкой мыши по слову", - "rightClickSelectsWordShortDesc": "Выберите слово под курсором при клике правой кнопкой мыши", - "behaviorAndAdvanced": "Поведение и расширенные", - "scrollbackBufferLabel": "Буфер прокрутки", - "scrollbackMaxLines": "Максимальное количество строк в истории", - "sshAgentForwardingLabel": "Перенаправление SSH агента", - "sshAgentForwardingShortDesc": "Передайте ваши локальные ключи SSH этому хосту", - "enableAutoMosh": "Включить автомош", - "enableAutoMoshDesc": "Предпочитайте Mosh по SSH если есть", - "enableAutoTmux": "Включить авторежим", - "enableAutoTmuxDesc": "Автоматически запускать или прикрепить к сеансу tmux", - "sudoPasswordAutoFillLabel": "Автозаполнение пароля", - "sudoPasswordAutoFillShortDesc": "Автоматически предоставлять пароль sudo при появлении запроса", - "sudoPasswordLabel": "Sudo Пароль", - "environmentVariablesLabel": "Переменные окружения", - "addVariableBtn": "Добавить переменную", - "noEnvVars": "Переменные окружения не настроены.", - "fastScrollModifierLabel": "Модификатор быстрой прокрутки", - "fastScrollSensitivityLabel": "Быстрая чувствительность прокрутки", - "moshCommandLabel": "Мош Командование", - "startupSnippetLabel": "Сниппет запуска", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Интервал поддержания соединения (секунды)", - "maxKeepaliveMisses": "Максимальное количество пропусков", - "tunnelSettings": "Настройки Туннеля", - "enableTunneling": "Включить туннелирование", - "enableTunnelingDesc": "Включить функциональность SSH туннеля для этого узла", - "serverTunnelsSection": "Серверные туннели", - "addTunnelBtn": "Добавить Туннель", - "noTunnelsConfigured": "Туннели не настроены.", - "tunnelLabel": "Туннель {{number}}", - "tunnelType": "Тип туннеля", - "tunnelModeLocalDesc": "Переслать локальный порт на порт удаленного сервера (или хост, доступный из него).", - "tunnelModeRemoteDesc": "Переслать порт на удаленный сервер обратно на локальный порт на вашей машине.", - "tunnelModeDynamicDesc": "Создайте SOCKS5 прокси на локальном порту для динамической пересылки портов.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Этот хост (прямой туннель)", - "endpointHost": "Конечная точка хоста", - "endpointPort": "Порт точки входа", - "bindHost": "Привязать хост", - "sourcePort": "Порт источника", - "maxRetries": "Макс. повторов", - "retryIntervalS": "Интервал повтора (ы)", - "autoStartLabel": "Автозапуск", - "autoStartDesc": "Автоматически подключать этот туннель при загрузке узла", - "tunnelConnecting": "Подключение туннеля...", - "tunnelDisconnected": "Туннель отключен", - "failedToConnectTunnel": "Не удалось подключиться", - "failedToDisconnectTunnel": "Не удалось отключить", - "dockerIntegration": "Интеграция Docker", - "enableDockerMonitor": "Включить Docker", - "enableDockerMonitorDesc": "Отслеживать и управлять контейнерами на этом хосте через Docker", - "enableFileManagerMonitor": "Включить Диспетчер файлов", - "enableFileManagerMonitorDesc": "Просмотр и управление файлами на этом хосте поверх SFTP", - "defaultPathLabel": "Путь по умолчанию", - "fileManagerPathHint": "Каталог для открытия при запуске файлового менеджера для этого узла.", - "statusChecksLabel": "Проверки состояния", - "enableStatusChecks": "Включить проверку состояния", - "enableStatusChecksDesc": "Периодически запрашивать этот узел для проверки доступности", - "useGlobalInterval": "Использовать глобальный интервал", - "useGlobalIntervalDesc": "Переопределить с интервалом проверки состояния сервера", - "checkIntervalS": "Проверить интервал (ы)", - "checkIntervalDesc": "Секунд между каждым пингом подключения", - "metricsCollectionLabel": "Коллекция метрик", - "enableMetricsLabel": "Включить метрики", - "enableMetricsDesc": "Собрать процессор, ОЗУ, диск и сетевое использование с этого узла", - "useGlobalMetrics": "Использовать глобальный интервал", - "useGlobalMetricsDesc": "Переопределить с помощью интервала общесистемных метрик", - "metricsIntervalS": "Интервал (ы) метрик", - "metricsIntervalDesc2": "Секунды между метрическими снимками", - "visibleWidgets": "Видимые виджеты", - "cpuUsageLabel": "Загрузка ЦП", - "cpuUsageDesc": "Процент ЦП, средние значения загрузки, график искривления", - "memoryLabel": "Использование памяти", - "memoryDesc": "Использование ОЗУ, swap, кэш", - "storageLabel": "Использование диска", - "storageDesc": "Использование диска за точку монтирования", - "networkLabel": "Сетевые интерфейсы", - "networkDesc": "Список интерфейсов и пропускная способность", - "uptimeLabel": "Время работы", - "uptimeDesc": "Время работы системы и время загрузки", - "systemInfoLabel": "Системная информация", - "systemInfoDesc": "ОС, ядро, имя хоста, архитектура", - "recentLoginsLabel": "Последние Логины", - "recentLoginsDesc": "Успешные и неудачные события входа", - "topProcessesLabel": "Топ процессов", - "topProcessesDesc": "PID, CPU%, MEM%, команда", - "listeningPortsLabel": "Порты прослушивания", - "listeningPortsDesc": "Открывать порты процесса и состояния", - "firewallLabel": "Брандмауэр", - "firewallDesc": "Брандмауэр, AppArmor, статус SELinux", - "quickActionsLabel": "Быстрые действия", - "quickActionsToolbar": "На панели инструментов Server Stats отображаются быстрые действия для выполнения команды одним щелчком.", - "noQuickActions": "Пока нет быстрых действий.", - "buttonLabel": "Ярлык кнопки", - "selectSnippetPlaceholder": "Выберите сниппет...", - "addActionBtn": "Добавить действие", - "hostSharedSuccessfully": "Хост успешно поделился", - "failedToShareHost": "Не удалось поделиться узлом", - "accessRevoked": "Доступ отозван", - "failedToRevokeAccess": "Не удалось отменить доступ", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Пароль", + "authTypeKey": "Ключ SSH", + "authTypeCredential": "Credential", + "authTypeOpkssh": "ОПКШ", + "authTypeNone": "Никто", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", "cancelBtn": "Отмена", - "savingBtn": "Сохранение...", - "addHostBtn": "Добавить хост", - "hostUpdated": "Хост обновлен", - "hostCreated": "Узел создан", - "failedToSave": "Не удалось сохранить узел", - "credentialUpdated": "Учетные данные обновлены", - "credentialCreated": "Учетные данные созданы", - "failedToSaveCredential": "Не удалось сохранить учетные данные", - "backToHosts": "Вернуться к узлам", - "backToCredentials": "Назад к учетным данным", - "pinned": "Прикреплено", - "noHostsFound": "Хосты не найдены", - "tryDifferentTerm": "Попробуйте другой термин", - "addFirstHost": "Добавьте свой первый хост, чтобы начать", - "noCredentialsFound": "Учетные данные не найдены", - "addCredentialBtn": "Добавить учетные данные", - "updateCredentialBtn": "Обновить учетные данные", - "features": "Возможности", - "noFolder": "(Нет папки)", - "deleteSelected": "Удалить", - "exitSelection": "Выйти из выбора", - "importSkip": "Импорт (пропустить существующий)", - "importOverwrite": "Импорт (перезапись)", - "collapseBtn": "Свернуть", - "importExportBtn": "Импорт / Экспорт", - "hostStatusesRefreshed": "Статусы узлов обновлены", - "failedToRefreshHosts": "Не удалось обновить хосты", - "movedHostTo": "Перемещено {{host}} в \"{{folder}}\"", - "failedToMoveHost": "Не удалось переместить узел", - "folderRenamedTo": "Папка переименована в \"{{name}}\"", - "deletedFolder": "Удалена папка \"{{name}}\"", - "failedToDeleteFolder": "Не удалось удалить папку", - "deleteAllInFolder": "Удалить все узлы в \"{{name}}\"? Это не может быть отменено.", - "deletedHost": "{{name}} удалена", - "copiedToClipboard": "Скопировано в буфер обмена", - "terminalUrlCopied": "URL терминала скопирован", - "fileManagerUrlCopied": "URL менеджера файлов скопирован", - "tunnelUrlCopied": "Ссылка на туннель скопирована", - "dockerUrlCopied": "URL Docker скопирован", - "serverStatsUrlCopied": "Скопирован URL статистики сервера", - "rdpUrlCopied": "URL RDP скопирован", - "vncUrlCopied": "VNC URL скопирован", - "telnetUrlCopied": "Скопирован Telnet URL", - "remoteDesktopUrlCopied": "URL удаленного рабочего стола скопирован", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Закреплено", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Функции", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Отмена", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Статус", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Развернуть действия", "collapseActions": "Свернуть действия", "wakeOnLanAction": "Пробуждение по локальной сети", - "wakeOnLanSuccess": "Волшебный пакет отправлен на {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Не удалось отправить волшебный пакет.", - "cloneHostAction": "Клонировать хост", - "copyAddress": "Копировать адрес", - "copyLink": "Скопировать ссылку", - "copyTerminalUrlAction": "Копировать URL терминала", - "copyFileManagerUrlAction": "Копировать URL диспетчера файлов", - "copyTunnelUrlAction": "Скопировать URL туннеля", - "copyDockerUrlAction": "Скопировать URL Docker", - "copyServerStatsUrlAction": "Копировать URL статистики сервера", - "copyRdpUrlAction": "Копировать URL RDP", - "copyVncUrlAction": "Копировать VNC URL", - "copyTelnetUrlAction": "Скопировать URL Telnet", - "copyRemoteDesktopUrlAction": "Копировать URL удаленного рабочего стола", - "deleteCredentialConfirm": "Удалить учетные данные \"{{name}}?", - "deletedCredential": "{{name}} удалена", - "deploySSHKeyTitle": "Установка SSH ключа", - "deployingBtn": "Развертывание...", - "deployBtn": "Развертывание", - "failedToDeployKey": "Не удалось развернуть ключ", - "deleteHostsConfirm": "Удалить {{count}} хост{{plural}}? Это действие не может быть отменено.", - "movedToRoot": "Перемещено в root", - "failedToMoveHosts": "Не удалось переместить хосты", - "enableTerminalFeature": "Включить терминал", - "disableTerminalFeature": "Отключить терминал", - "enableFilesFeature": "Включить файлы", - "disableFilesFeature": "Отключить файлы", - "enableTunnelsFeature": "Включить туннели", - "disableTunnelsFeature": "Отключить туннели", - "enableDockerFeature": "Включить Docker", - "disableDockerFeature": "Отключить Docker", - "addTagsPlaceholder": "Добавить теги...", - "authDetails": "Подробности аутентификации", - "credType": "Тип", - "generateKeyPairDesc": "Создать новую пару ключей, как приватные, так и открытые ключи будут заполняться автоматически.", - "generatingKey": "Создание...", - "generateLabel": "Сгенерировать {{label}}", - "uploadFileBtn": "Загрузить файл", - "keyPassphraseOptional": "Пароль ключа (необязательно)", - "sshPublicKeyOptional": "Публичный SSH ключ (необязательно)", - "publicKeyGenerated": "Публичный ключ сгенерирован", - "failedToGeneratePublicKey": "Не удалось получить открытый ключ", - "publicKeyCopied": "Открытый ключ скопирован", - "keyPairGenerated": "Сгенерирована пара ключей {{label}}", - "failedToGenerateKeyPair": "Не удалось сгенерировать пару ключей", - "searchHostsPlaceholder": "Поиск хостов, адресов, тегов…", - "searchCredentialsPlaceholder": "Поиск учетных данных…", - "refreshBtn": "Обновить", - "addTag": "Добавить теги...", - "deleteConfirmBtn": "Удалить", - "tunnelRequirementsText": "SSH сервер должен иметь GatewayPorts да, AllowTcpForwarding да и PermitRootLogin да в /etc/ssh/sshd_config.", - "deleteHostConfirm": "Удалить \"{{name}}\"?", - "enableAtLeastOneProtocol": "Включите по крайней мере один протокол для настройки параметров аутентификации и соединения.", - "keyPassphrase": "Ключевая фраза", - "connectBtn": "Подключиться", - "disconnectBtn": "Отключиться", - "basicInformation": "Основная информация", - "authDetailsSection": "Подробности аутентификации", - "credTypeLabel": "Тип", - "hostsTab": "Узлы", - "credentialsTab": "Полномочия", - "selectMultiple": "Выбрать несколько", - "selectHosts": "Выберите хосты", - "connectionLabel": "Подключение", - "authenticationLabel": "Проверка подлинности", - "generateKeyPairTitle": "Сгенерировать ключевую пару", - "generateKeyPairDescription": "Создать новую пару ключей, как приватные, так и открытые ключи будут заполняться автоматически.", - "generateFromPrivateKey": "Сгенерировать из приватного ключа", - "refreshBtn2": "Обновить", - "exitSelectionTitle": "Выйти из выбора", - "exportAll": "Экспортировать все", - "addHostBtn2": "Добавить хост", - "addCredentialBtn2": "Добавить учетные данные", - "checkingHostStatuses": "Проверка состояния узла...", - "pinnedSection": "Прикреплено", - "hostsExported": "Узлы успешно экспортированы", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Закреплено", + "hostsExported": "Hosts exported successfully", "exportFailed": "Не удалось экспортировать хосты.", - "sampleDownloaded": "Пример загруженного файла", - "failedToDeleteCredential2": "Не удалось удалить учетные данные", - "noFolderOption": "(Нет папки)", - "nSelected": "{{count}} выбран", - "featuresMenu": "Возможности", - "moveMenu": "Переместить", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Функции", + "moveMenu": "Двигаться", + "connectSelected": "Connect", "cancelSelection": "Отмена", - "deployDialogDesc": "Разверните {{name}} на authorized_keys узла.", - "targetHostLabel": "Целевой хост", - "selectHostOption": "Выберите хост...", - "keyDeployedSuccess": "Ключ успешно развернут", - "failedToDeployKey2": "Не удалось развернуть ключ", - "deletedCount": "Удаленные {{count}} узлы", - "failedToDeleteCount": "Не удалось удалить узлы {{count}}", - "duplicatedHost": "Дублировано \"{{name}}\"", - "failedToDuplicateHost": "Не удалось дублировать узел", - "updatedCount": "Обновлено узлов {{count}}", - "friendlyNameLabel": "Дружественное имя", - "descriptionLabel": "Описание", - "loadingHost": "Загрузка хоста...", - "loadingHosts": "Загрузка узлов...", - "loadingCredentials": "Загрузка учетных данных...", - "noHostsYet": "Хостов пока нет", - "noHostsMatchSearch": "Нет хостов, соответствующих вашему запросу", - "hostNotFound": "Хост не найден", - "searchHosts": "Поиск узлов...", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Сортировка хостов", "sortDefault": "Порядок по умолчанию", "sortNameAsc": "Имя (от А до Я)", @@ -586,209 +751,224 @@ "filterHosts": "Фильтрация хостов", "filterClearAll": "Очистить фильтры", "filterStatusGroup": "Статус", - "filterOnline": "Онлайн", - "filterOffline": "Офлайн", + "filterOnline": "Online", + "filterOffline": "Offline", "filterPinned": "Закреплено", "filterAuthGroup": "Тип аутентификации", "filterAuthPassword": "Пароль", "filterAuthKey": "Ключ SSH", - "filterAuthCredential": "Удостоверение личности", + "filterAuthCredential": "Credential", "filterAuthNone": "Никто", "filterAuthOpkssh": "ОПКШ", - "filterProtocolGroup": "Протокол", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "РДП", - "filterProtocolVnc": "ВНК", + "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Телнет", "filterFeaturesGroup": "Функции", "filterFeatureTerminal": "Терминал", "filterFeatureFileManager": "Файловый менеджер", "filterFeatureTunnel": "Туннель", "filterFeatureDocker": "Docker", - "filterTagsGroup": "Теги", - "shareHost": "Поделиться хостом", - "shareHostTitle": "Поделиться: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Этот узел должен использовать учетные данные для включения общего доступа. Сначала отредактируйте узел и назначьте учетные данные." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Подключение", - "authentication": "Проверка подлинности", - "connectionSettings": "Настройки соединения", - "displaySettings": "Настройки отображения", - "audioSettings": "Настройки звука", - "rdpPerformance": "Производительность RDP", - "deviceRedirection": "Перенаправление устройства", - "session": "Сессия", - "gateway": "Шлюз", - "remoteApp": "Удалить", - "clipboard": "Буфер обмена", - "sessionRecording": "Запись сессии", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Настройки VNC", - "terminalSettings": "Настройки терминала", - "rdpPort": "Порт RDP", - "username": "Имя пользователя", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Пароль", - "domain": "Домен", - "securityMode": "Режим безопасности", - "colorDepth": "Глубина цвета", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Высота", - "dpi": "ДОИ", - "resizeMethod": "Изменить размер", - "clientName": "Имя Клиента", - "initialProgram": "Начальная программа", - "serverLayout": "Макет сервера", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Порт шлюза", - "gatewayUsername": "Имя пользователя шлюза", - "gatewayPassword": "Пароль шлюза", - "gatewayDomain": "Домен шлюза", - "remoteAppProgram": "Программа для удаленного приложения", - "workingDirectory": "Рабочая папка", - "arguments": "Аргументы", - "normalizeLineEndings": "Нормализовать концы линии", - "recordingPath": "Путь записи", - "recordingName": "Имя записи", - "macAddress": "MAC адрес", - "broadcastAddress": "Адрес трансляции", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Время ожидания (ы)", - "driveName": "Имя диска", - "drivePath": "Путь к диску", - "ignoreCertificate": "Игнорировать сертификат", - "ignoreCertificateDesc": "Разрешить соединения с хостами с самоподписанными сертификатами", - "forceLossless": "Неустрашимый", - "forceLosslessDesc": "Принудительное кодирование изображения без потерь (высокое качество, больше пропускной способности)", - "disableAudio": "Отключить звук", - "disableAudioDesc": "Отключить весь звук из удаленного сеанса", - "enableAudioInput": "Включить аудио ввод (Microphone)", - "enableAudioInputDesc": "Передать локальный микрофон на удаленный сеанс", - "wallpaper": "Обои", - "wallpaperDesc": "Показывать обои рабочего стола (отключение увеличивает производительность)", - "theming": "Темы", - "themingDesc": "Включить визуальные темы и стили", - "fontSmoothing": "Сглаживание шрифта", - "fontSmoothingDesc": "Включить рендеринг шрифта ClearType", - "fullWindowDrag": "Полное переключение окна", - "fullWindowDragDesc": "Показывать содержимое окна при перетаскивании", - "desktopComposition": "Состав рабочего стола", - "desktopCompositionDesc": "Включить эффекты Aero", - "menuAnimations": "Анимация меню", - "menuAnimationsDesc": "Включить анимацию затухания меню и слайда", - "disableBitmapCaching": "Отключить кэширование изображений", - "disableBitmapCachingDesc": "Выключить кэш изображений (может помочь с подсветками)", - "disableOffscreenCaching": "Отключить кэширование", - "disableOffscreenCachingDesc": "Выключить кэш оффэкрана", - "disableGlyphCaching": "Отключить кэширование символов", - "disableGlyphCachingDesc": "Выключить кэш глифов", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Использовать графический конвейер RemoteFX", - "enablePrinting": "Включить печать", - "enablePrintingDesc": "Перенаправить локальные принтеры на удаленный сеанс", - "enableDriveRedirection": "Включить перенаправление диска", - "enableDriveRedirectionDesc": "Распознавать локальную папку как диск в удаленном сеансе", - "createDrivePath": "Создать путь к диску", - "createDrivePathDesc": "Автоматически создайте папку, если она не существует", - "disableDownload": "Отключить загрузку", - "disableDownloadDesc": "Запретить загрузку файлов с удаленного сеанса", - "disableUpload": "Отключить загрузку", - "disableUploadDesc": "Предотвратить загрузку файлов на удаленный сеанс", - "enableTouch": "Включить касание", - "enableTouchDesc": "Включить переадресацию ввода касания", - "consoleSession": "Сеанс консоли", - "consoleSessionDesc": "Подключиться к консоли (сессия 0) вместо новой сессии", - "sendWolPacket": "Отправить WOL пакет", - "sendWolPacketDesc": "Отправить волшебный пакет, чтобы разбудить этот хост перед подключением", - "disableCopy": "Отключить копирование", - "disableCopyDesc": "Запретить копирование текста из удаленного сеанса", - "disablePaste": "Отключить вставку", - "disablePasteDesc": "Предотвратить вставку текста в удаленный сеанс", - "createPathIfMissing": "Создать путь, если отсутствует", - "createPathIfMissingDesc": "Автоматически создавать директорию записи", - "excludeOutput": "Исключить вывод", - "excludeOutputDesc": "Не записывать вывод экрана (только метаданные)", - "excludeMouse": "Исключить мышь", - "excludeMouseDesc": "Не записывать движения мыши", - "includeKeystrokes": "Включить горячие клавиши", - "includeKeystrokesDesc": "Запись сырых клавиш в дополнение к экрану", - "vncPort": "Порт VNC", - "vncPassword": "Пароль VNC", - "vncUsernameOptional": "Имя пользователя (необязательно)", - "vncLeaveBlank": "Оставьте пустым, если не требуется", - "cursorMode": "Режим курсора", - "swapRedBlue": "Поменять красный/синий", - "swapRedBlueDesc": "Поменять местами красно-синие каналы (исправляет некоторые проблемы цвета)", - "readOnly": "Только чтение", - "readOnlyDesc": "Просмотр удаленного экрана без отправки ввода", - "telnetPort": "Порт Telnet", - "terminalType": "Тип терминала", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Цветовая схема", - "backspaceKey": "Ключ Backspace", - "saveHostFirst": "Сначала сохраните узел.", - "sharingOptionsAfterSave": "Параметры общего доступа доступны после сохранения узла.", - "sharingLoadError": "Не удалось загрузить данные обмена. Проверьте подключение и повторите попытку.", - "shareHostSection": "Поделиться хостом", - "shareWithUser": "Поделиться с пользователем", - "shareWithRole": "Поделиться с ролью", - "selectUser": "Выбрать пользователя", - "selectRole": "Выберите роль", - "selectUserOption": "Выберите пользователя...", - "selectRoleOption": "Выберите роль...", - "permissionLevel": "Уровень разрешений", - "expiresInHours": "Истекает через (часы)", - "noExpiryPlaceholder": "Оставьте пустым для отсутствия срока действия", - "shareBtn": "Поделиться", - "currentAccess": "Текущий доступ", - "typeHeader": "Тип", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Разрешение", - "grantedByHeader": "Предоставлено", - "expiresHeader": "Истекает", - "noAccessEntries": "Нет записей доступа.", - "expiredLabel": "Истёк", - "neverLabel": "Никогда", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", "cancelBtn": "Отмена", - "savingBtn": "Сохранение...", - "updateHostBtn": "Обновить хост", - "addHostBtn": "Добавить хост" + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Поиск узлов, команд или настроек...", - "quickActions": "Быстрые действия", - "hostManager": "Менеджер хостов", - "hostManagerDesc": "Управлять, добавлять или редактировать хосты", - "addNewHost": "Добавить новый хост", - "addNewHostDesc": "Зарегистрировать новый хост", - "adminSettings": "Админ настройки", - "adminSettingsDesc": "Настройка системных настроек и пользователей", - "userProfile": "Профиль пользователя", - "userProfileDesc": "Управление учетной записью и настройками", - "addCredential": "Добавить учетные данные", - "addCredentialDesc": "Хранить ключи или пароли SSH", - "recentActivity": "Недавняя активность", - "serversAndHosts": "Серверы и хосты", - "noHostsFound": "Не найдено узлов по запросу \"{{search}}\"", - "links": "Ссылки", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Выбрать", - "toggleWith": "Переключить с" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Вкладка не назначена", + "noTabAssigned": "No tab assigned", "focusedPane": "Активная панель" }, "connections": { "noConnections": "Нет подключений", "noConnectionsDesc": "Откройте терминал, файловый менеджер или удаленный рабочий стол, чтобы увидеть подключения здесь.", - "connectedFor": "Подключено для {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Подключено", "disconnected": "Отключено", "closeTab": "Закрыть вкладку", @@ -801,358 +981,374 @@ "sectionBackground": "Фон", "backgroundDesc": "После отключения сеанс связи длится 30 минут, после чего его можно повторно подключить.", "persisted": "Сохранялся на заднем плане", - "expiresIn": "Срок действия истекает через {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Поиск связей...", - "noSearchResults": "Поисковые запросы не соответствуют вашим запросам." + "noSearchResults": "Поисковые запросы не соответствуют вашим запросам.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Подключение к {{type}} сессии...", - "connectionError": "Ошибка подключения", - "connectionFailed": "Не удалось подключиться", - "failedToConnect": "Не удалось получить токен подключения", - "hostNotFound": "Хост не найден", - "noHostSelected": "Хост не выбран", - "reconnect": "Переподключить", - "retry": "Повторить", - "guacdUnavailable": "Служба удаленного рабочего стола (guacd) недоступна. Убедитесь, что guacd запущен и правильно настроен в настройках администратора.", - "ctrlAltDel": "Ctrl + Alt+Del", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Соединение не удалось.", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Переподключитесь", + "retry": "Повторить попытку", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", + "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { - "ctrlAltDel": "Ctrl + Alt+Del", - "winL": "Win+L (экран блокировки)", - "winKey": "Ключ Windows", + "ctrlAltDel": "Ctrl+Alt+Del", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Сдвиг", - "win": "Победить", - "stickyActive": "{{key}} (закрыто - нажмите, чтобы освободить)", - "stickyInactive": "{{key}} (нажмите для защелки)", - "esc": "Экран", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Домашний", - "end": "Конец", - "pageUp": "Страница вверх", - "pageDown": "Страница вниз", - "arrowUp": "Стрелка вверх", - "arrowDown": "Стрелка вниз", - "arrowLeft": "Стрелка влево", - "arrowRight": "Стрелка вправо", - "fnToggle": "Функциональные ключи", - "reconnect": "Переподключить сессию", - "collapse": "Свернуть панель инструментов", - "expand": "Развернуть панель инструментов", - "dragHandle": "Перетащите для перемещения" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Подключиться к хосту", - "clear": "Очистить", - "paste": "Вставить", - "reconnect": "Переподключить", - "connectionLost": "Соединение потеряно", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Переподключитесь", + "connectionLost": "Connection lost", "connected": "Подключено", - "clipboardWriteFailed": "Не удалось скопировать в буфер обмена. Убедитесь, что страница отправляется через HTTPS или localhost.", - "clipboardReadFailed": "Не удалось прочитать из буфера обмена. Убедитесь, что права доступа предоставлены.", - "clipboardHttpWarning": "Вставка требует HTTPS. Используйте Ctrl+Shift+V или используйте Termix по HTTPS.", - "unknownError": "Произошла неизвестная ошибка", - "websocketError": "Ошибка подключения к WebSocket", - "connecting": "Подключение...", - "noHostSelected": "Хост не выбран", - "reconnecting": "Переподключение... ({{attempt}}/{{max}})", - "reconnected": "Переподключено успешно", - "tmuxSessionCreated": "сеанс tmux создан: {{name}}", - "tmuxSessionAttached": "прикрепленный сеанс tmux: {{name}}", - "tmuxUnavailable": "tmux не установлен на удаленном хосте, возвращаясь к стандартной оболочке", - "tmuxSessionPickerTitle": "tmux сеансы", - "tmuxSessionPickerDesc": "Найденные на этом узле сеансы tmux. Выберите один для повторного присоединения или создания новой сессии.", - "tmuxWindows": "Окна", - "tmuxWindowCount": "{{count}} окно", - "tmuxAttached": "Прикрепленные клиенты", - "tmuxAttachedCount": "{{count}} прикреплен", - "tmuxLastActivity": "Последнее действие", - "tmuxTimeJustNow": "только что", - "tmuxTimeMinutes": "{{count}}м назад", - "tmuxTimeHours": "{{count}}ч назад", - "tmuxTimeDays": "{{count}}дней назад", - "tmuxCreateNew": "Начать новую сессию", - "tmuxCopyHint": "Настройте выделение и нажмите Enter для копирования в буфер обмена", - "tmuxDetach": "Отсоединиться от сеанса tmux", - "tmuxDetached": "Отключено от сеанса tmux", - "maxReconnectAttemptsReached": "Достигнуто максимальное число попыток восстановления соединения", - "closeTab": "Закрыть", - "connectionTimeout": "Таймаут подключения", - "terminalTitle": "Терминал - {{host}}", - "terminalWithPath": "Терминал - {{host}}:{{path}}", - "runTitle": "Запуск {{command}} - {{host}}", - "totpRequired": "Требуется двухфакторная аутентификация", - "totpCodeLabel": "Проверочный код", - "totpVerify": "Подтвердить", - "warpgateAuthRequired": "Требуется аутентификация по Warpgate", - "warpgateSecurityKey": "Ключ безопасности", - "warpgateAuthUrl": "URL аутентификации", - "warpgateOpenBrowser": "Открыть в браузере", - "warpgateContinue": "Я завершаю аутентификацию", - "opksshAuthRequired": "Требуется аутентификация OPKSSH", - "opksshAuthDescription": "Завершите аутентификацию в браузере, чтобы продолжить. Этот сеанс будет оставаться действительным в течение 24 часов.", - "opksshOpenBrowser": "Аутентификация в браузере", - "opksshWaitingForAuth": "Ожидание аутентификации в браузере...", - "opksshAuthenticating": "Обработка аутентификации...", - "opksshTimeout": "Истекло время аутентификации. Попробуйте еще раз.", - "opksshAuthFailed": "Аутентификация не удалась. Проверьте учетные данные и повторите попытку.", - "opksshSignInWith": "Войти с помощью {{provider}}", - "sudoPasswordPopupTitle": "Вставить пароль?", - "websocketAbnormalClose": "Неожиданное соединение закрыто. Это может быть вызвано проблемой конфигурации обратного прокси или SSL. Пожалуйста, проверьте журналы сервера.", - "connectionLogTitle": "Журнал подключений", - "connectionLogCopy": "Скопировать логи в буфер обмена", - "connectionLogEmpty": "Пока нет журналов подключения", - "connectionLogWaiting": "Ожидание журналов подключения...", - "connectionLogCopied": "Журналы подключения скопированы в буфер обмена", - "connectionLogCopyFailed": "Не удалось скопировать журналы в буфер обмена", - "connectionRejected": "Соединение отклонено сервером. Проверьте вашу аутентификацию и конфигурацию сети.", - "hostKeyRejected": "Проверка SSH ключа хоста отклонена. Соединение отменено.", - "sessionTakenOver": "Сессия была открыта в другой вкладке. Повторное подключение..." + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Открыть", + "linkDialogCopy": "Копия", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Разделить вкладку", + "addToSplit": "Добавить в раздел", + "removeFromSplit": "Удалить из Сплита" + } }, "fileManager": { - "noHostSelected": "Хост не выбран", - "initializingEditor": "Инициализация редактора...", - "file": "Файл", - "folder": "Папка", - "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": "Переименовать", - "uploading": "Загрузка...", - "uploadingFile": "Загрузка {{name}}...", - "fileName": "Имя файла", - "folderName": "Имя папки", - "fileUploadedSuccessfully": "Файл \"{{name}}\" успешно загружен", - "failedToUploadFile": "Не удалось загрузить файл", - "fileDownloadedSuccessfully": "Файл \"{{name}}\" успешно загружен", - "failedToDownloadFile": "Не удалось загрузить файл", - "fileCreatedSuccessfully": "Файл \"{{name}}\" успешно создан", - "folderCreatedSuccessfully": "Папка \"{{name}}\" успешно создана", - "failedToCreateItem": "Не удалось создать элемент", - "operationFailed": "Ошибка операции {{operation}} для {{name}}: {{error}}", - "failedToResolveSymlink": "Не удалось разрешить символическую ссылку", - "itemsDeletedSuccessfully": "{{count}} элементы успешно удалены", - "failedToDeleteItems": "Не удалось удалить элементы", - "sudoPasswordRequired": "Требуется пароль администратора", - "enterSudoPassword": "Введите пароль sudo для продолжения этой операции", - "sudoPassword": "Sudo пароль", - "sudoOperationFailed": "Сбой операции с Суданом", - "sudoAuthFailed": "Ошибка аутентификации в Sudo", - "dragFilesToUpload": "Перетащите файлы сюда, чтобы загрузить", - "emptyFolder": "Эта папка пуста", - "searchFiles": "Поиск файлов...", - "upload": "Выгрузить", - "selectHostToStart": "Выберите хост для запуска управления файлами", - "sshRequiredForFileManager": "Файловый менеджер требует SSH. Этот хост не поддерживает SSH.", - "failedToConnect": "Не удалось подключиться к SSH", - "failedToLoadDirectory": "Не удалось загрузить каталог", - "noSSHConnection": "Нет доступного SSH соединения", - "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}}?", - "permissionDenied": "Отказано в доступе", - "serverError": "Ошибка сервера", - "fileSavedSuccessfully": "Файл успешно сохранен", - "failedToSaveFile": "Не удалось сохранить файл", - "confirmDeleteSingleItem": "Вы уверены, что хотите навсегда удалить \"{{name}}\"?", - "confirmDeleteMultipleItems": "Вы уверены, что хотите навсегда удалить элементы {{count}}?", - "confirmDeleteMultipleItemsWithFolders": "Вы уверены, что хотите навсегда удалить {{count}} ? Включает в себя папки и их содержимое.", - "confirmDeleteFolder": "Вы уверены, что хотите навсегда удалить папку \"{{name}}\" и все ее содержимое?", - "permanentDeleteWarning": "Это действие нельзя отменить. Элемент(ы) будут окончательно удалены с сервера.", - "recent": "Недавние", - "pinned": "Прикреплено", - "folderShortcuts": "Ярлыки папок", - "failedToReconnectSSH": "Не удалось переподключить SSH сеанс", - "openTerminalHere": "Открыть терминал здесь", - "run": "Запустить", - "openTerminalInFolder": "Открыть терминал в этой папке", - "openTerminalInFileLocation": "Открыть терминал в расположении файла", - "runningFile": "Запуск - {{file}}", - "onlyRunExecutableFiles": "Можно запускать только исполняемые файлы", - "directories": "Каталоги", - "removedFromRecentFiles": "Удалено \"{{name}}\" из последних файлов", - "removeFailed": "Не удалось удалить", - "unpinnedSuccessfully": "Откреплено \"{{name}}\" успешно", - "unpinFailed": "Открепить не удалось", - "removedShortcut": "Удалён ярлык \"{{name}}\"", - "removeShortcutFailed": "Не удалось удалить ярлык", - "clearedAllRecentFiles": "Все недавние файлы удалены", - "clearFailed": "Сбой очистки", - "removeFromRecentFiles": "Удалить из недавних файлов", - "clearAllRecentFiles": "Очистить все недавние файлы", - "unpinFile": "Открепить файл", - "removeShortcut": "Удалить ярлык", - "pinFile": "Закрепить файл", - "addToShortcuts": "Добавить в ярлыки", - "pasteFailed": "Ошибка вставки", - "noUndoableActions": "Нет невыполнимых действий", - "undoCopySuccess": "Операция отмены копии: удалено {{count}} скопированных файлов", - "undoCopyFailedDelete": "Не удалось отменить: Не удалось удалить скопированные файлы", - "undoCopyFailedNoInfo": "Ошибка отмены: Не удалось найти скопированную информацию о файле", - "undoMoveSuccess": "Операция отменена: Перемещение файлов {{count}} обратно в исходное место", - "undoMoveFailedMove": "Не удалось отменить: Не удалось переместить файлы обратно", - "undoMoveFailedNoInfo": "Не удалось отменить: информация о перемещенном файле не найдена", - "undoDeleteNotSupported": "Операция удаления не может быть отменена: файлы были навсегда удалены с сервера", - "undoTypeNotSupported": "Неподдерживаемый тип операции отмены", - "undoOperationFailed": "Не удалось отменить операцию", - "unknownError": "Неизвестная ошибка", - "confirm": "Подтвердить", - "find": "Найти...", - "replace": "Заменить", - "downloadInstead": "Загрузить вместо этого", - "keyboardShortcuts": "Горячие клавиши", - "searchAndReplace": "Поиск и замена", - "editing": "Редактирование", - "search": "Искать", - "findNext": "Найти далее", - "findPrevious": "Найти предыдущий", - "save": "Сохранить", - "selectAll": "Выделить все", - "undo": "Отменить", - "redo": "Повторить", - "moveLineUp": "Переместить строку вверх", - "moveLineDown": "Переместить линию вниз", - "toggleComment": "Переключить комментарий", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Копия", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Закреплено", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Бегать", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Не удалось загрузить изображение", - "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": "Новая папка", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Успешно перемещено {{count}} элементов в {{target}}", - "move": "Переместить", - "searchInFile": "Поиск в файле (Ctrl+F)", - "showKeyboardShortcuts": "Показать горячие клавиши", - "startWritingMarkdown": "Начните писать ваше содержимое markdown...", - "loadingFileComparison": "Загрузка сравнения файлов...", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Двигаться", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "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": "Изменить права доступа", - "currentPermissions": "Текущие разрешения", - "owner": "Владелец", - "group": "Группа", - "others": "Другие", - "read": "Чтение", - "write": "Написать", - "execute": "Выполнить", - "permissionsChangedSuccessfully": "Права доступа успешно изменены", - "failedToChangePermissions": "Не удалось изменить права доступа", - "name": "Наименование", - "sortByName": "Наименование", - "sortByDate": "Дата изменения", - "sortBySize": "Размер", - "ascending": "По возрастанию", - "descending": "По убыванию", - "root": "Корень", - "new": "Новый", - "sortBy": "Сортировать по", - "items": "Предметы", - "selected": "Выбрано", - "editor": "Редактор", - "octal": "Октальный", - "storage": "Хранилище", - "disk": "Диск", - "used": "Использовано", - "of": "из", - "toggleSidebar": "Переключить боковую панель", - "cannotLoadPdf": "Не удается загрузить PDF", - "pdfLoadError": "Произошла ошибка при загрузке этого PDF-файла.", - "loadingPdf": "Загрузка PDF...", - "loadingPage": "Загрузка страницы..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Скопировать на хост…", - "moveToHost": "Переместить на хост…", - "copyItemsToHost": "Скопировать {{count}} элементов на хост…", - "moveItemsToHost": "Переместить {{count}} элементов на хост…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Других хостов для файловых менеджеров нет в наличии.", "noHostsConnectedHint": "Добавьте еще один SSH-хост с включенным файловым менеджером в диспетчере хостов.", "selectDestinationHost": "Выберите целевой хост", @@ -1164,48 +1360,48 @@ "browseDestination": "Просмотрите или введите путь", "confirmCopy": "Копия", "confirmMove": "Двигаться", - "transferring": "Передача…", - "compressing": "Сжатие…", - "extracting": "Извлечение…", - "transferringItems": "Передача {{current}} элементов {{total}}…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Передача завершена", "transferError": "Перевод не удался", - "transferPartial": "Передача завершена с ошибками {{count}}", - "transferPartialHint": "Не удалось передать: {{paths}}", - "itemsSummary": "{{count}} предметов", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "В качестве пункта назначения должен быть каталог для передачи нескольких элементов.", "selectThisFolder": "Выберите эту папку", "browsePathWillBeCreated": "Эта папка пока не существует. Она будет создана при начале передачи.", "browsePathError": "Не удалось открыть этот путь на целевом хосте.", "goUp": "Поднимитесь", - "copyFolderToHost": "Скопируйте папку на хост…", - "moveFolderToHost": "Переместить папку на хост…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Готовый", - "hostConnecting": "Подключение…", + "hostConnecting": "Connecting…", "hostDisconnected": "Не подключено", "hostAuthRequired": "Требуется аутентификация — сначала откройте файловый менеджер на этом хосте.", "hostConnectionFailed": "Соединение не удалось.", "metricsTitle": "Сроки трансферов", - "metricsPrepare": "Подготовьте пункт назначения: {{duration}}", - "metricsCompress": "Сжатие по источнику: {{duration}}", - "metricsHopSourceRead": "Источник → сервер: {{throughput}}", - "metricsHopDestSftpWrite": "Сервер → назначение (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Сервер → назначение (локальное): {{throughput}}", - "metricsTransfer": "Сквозное сканирование: {{throughput}} ({{duration}})", - "metricsExtract": "Выгрузка в пункте назначения: {{duration}}", - "metricsSourceDelete": "Удалить из источника: {{duration}}", - "metricsTotal": "Итого: {{duration}}", - "progressCompressing": "Сжатие на исходном хосте…", - "progressExtracting": "Извлечение в целевом месте…", - "progressTransferring": "Передача данных…", - "progressReconnecting": "Воссоединение…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Параллельные полосы для пересадки", - "parallelSegmentsOption": "{{count}} полосы", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Большие файлы разбиваются на фрагменты по 256 МБ. Для увеличения общей пропускной способности используются несколько каналов связи (например, запуск нескольких передач одновременно).", - "progressTotalSpeed": "{{speed}} всего ({{lanes}} полос)", - "progressTransferringItems": "Передача файлов ({{current}} из {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} файлы", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Исходные файлы сохранены (частичная передача).", "jumpHostLimitation": "Оба хоста должны быть доступны с сервера Termix. Прямая маршрутизация между хостами не поддерживается.", "cancel": "Отмена", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Выбор способа передачи данных (tar или SFTP для каждого файла) зависит от количества файлов, их размера и возможности сжатия. Для отдельных файлов всегда используется потоковая передача SFTP.", "methodTarHint": "Сжатие на источнике, передача одного архива, распаковка в пункте назначения. Требуется tar на обоих Unix-хостах.", "methodItemSftpHint": "Передавайте каждый файл по отдельности по протоколу SFTP. Работает на всех хостах, включая Windows.", - "methodPreviewLoading": "Метод расчета переноса…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Не удалось предварительно просмотреть способ передачи. Сервер все равно выберет способ передачи при запуске.", "methodPreviewWillUseTar": "Будет использоваться: архив Tar", "methodPreviewWillUseItemSftp": "Будет использоваться: SFTP для каждого файла.", - "methodPreviewScanSummary": "{{fileCount}} файлов, {{totalSize}} всего (просканировано на исходном хосте).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Каждый файл копируется по одному и тому же SFTP-потоку, один за другим. Прогресс суммируется по всем файлам, поэтому индикатор выполнения движется медленно при работе с большими файлами.", "methodReason": { "user_item_sftp": "Вы выбрали SFTP для каждого файла.", "user_tar": "Вы выбрали архив tar.", "tar_unavailable": "Tar недоступен на одном или обоих хостах — вместо него будет использоваться SFTP для каждого файла.", "windows_host": "Используется хост под управлением Windows — архив tar не применяется.", - "auto_multi_large": "Авто: несколько файлов, включая большой файл ({{largestSize}}) с сжимаемыми данными — tar-архивы объединяются в один файл для передачи.", - "auto_single_large_in_archive": "Авто: один большой файл ({{largestSize}}) в этом наборе — SFTP для каждого файла.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Авто: преимущественно несжимаемые данные — SFTP для каждого файла.", - "auto_many_files": "Авто: много файлов ({{fileCount}}) — tar уменьшает накладные расходы на каждый файл.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Авто: SFTP для каждого файла в этом наборе." }, "progressCancel": "Отмена", - "progressCancelling": "Отмена…", + "progressCancelling": "Cancelling…", "progressStalled": "Застрял", "resumedHint": "Восстановлено соединение с активной передачей данных, начатой в другом окне.", "transferCancelled": "Трансфер отменен", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Частичные данные были сохранены на целевом устройстве. Повторная попытка будет предпринята после восстановления соединения." }, "tunnels": { - "noSshTunnels": "Нет SSH туннелей", - "createFirstTunnelMessage": "Вы еще не создали SSH туннелей. Настройте туннельные соединения в менеджере хостов, чтобы начать.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Подключено", "disconnected": "Отключено", - "connecting": "Подключение...", - "error": "Ошибка", - "canceling": "Отмена...", - "connect": "Подключиться", - "disconnect": "Отключиться", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", "cancel": "Отмена", - "port": "Порт", - "localPort": "Локальный порт", - "remotePort": "Удаленный порт", - "currentHostPort": "Текущий порт хоста", - "endpointPort": "Порт точки входа", - "bindIp": "Локальный IP", - "endpointSshConfig": "Конфигурация SSH", - "endpointSshHost": "Конечная точка SSH хоста", - "endpointSshHostPlaceholder": "Выберите настроенный хост", - "endpointSshHostRequired": "Выберите SSH хост конечной точки для каждого клиентского туннеля.", - "attempt": "Попытка {{current}} из {{max}}", - "nextRetryIn": "Следующая повтор через {{seconds}} секунд", - "clientTunnels": "Клиентские туннели", - "clientTunnel": "Клиентский Туннель", - "addClientTunnel": "Добавить клиентский туннель", - "noClientTunnels": "На этом рабочем столе не настроены клиентские туннели.", - "tunnelName": "Название Туннеля", - "remoteHost": "Удаленный хост", - "autoStart": "Автозапуск", - "clientAutoStartDesc": "Запускается после открытия этого десктопного клиента и остаётся подключенным.", - "clientManualStartDesc": "Используйте Start and Stop from this row. Termix не будет открывать его автоматически.", - "clientRemoteServerNote": "Удаленная пересылка может потребовать AllowTcpForwarding и GatewayPorts на сервере SSH. Удаленный порт закрывается при отключении рабочего стола.", - "clientTunnelStarted": "Клиентский туннель запущен", - "clientTunnelStopped": "Клиентский туннель остановлен", - "tunnelTestSucceeded": "Туннельный тест выполнен", - "tunnelTestFailed": "Тест туннеля не удался", - "localSaved": "Клиентские туннели сохранены", - "localSaveError": "Не удалось сохранить локальные клиентские туннели", - "invalidBindIp": "Локальный IP должен быть действительным адресом IPv4.", - "invalidLocalTargetIp": "Локальный целевой IP должен быть действительным адресом IPv4.", - "invalidLocalPort": "Локальный порт должен быть от 1 до 65535.", - "invalidRemotePort": "Удаленный порт должен быть от 1 до 65535.", - "invalidLocalTargetPort": "Локальный целевой порт должен быть от 1 до 65535.", - "invalidEndpointPort": "Порт конечной точки должен быть от 1 до 65535.", - "duplicateAutoStartBind": "Только один клиентский туннель автозапуска может использовать {{bind}}.", - "manualControlError": "Не удалось обновить состояние туннеля.", - "active": "Активный", - "start": "Начать", - "stop": "Остановить", - "test": "Тест", - "type": "Тип туннеля", - "typeLocal": "Локальный (-L)", - "typeRemote": "Удалённый (-R)", - "typeDynamic": "Динамика (-D)", - "typeServerLocalDesc": "Текущий хост до конечной точки.", - "typeServerRemoteDesc": "Вернуться к текущему хосту.", - "typeClientLocalDesc": "Локальный компьютер к конечной точке.", - "typeClientRemoteDesc": "Вернуться на локальный компьютер.", - "typeClientDynamicDesc": "SOCKS на локальном компьютере.", - "typeDynamicDesc": "Переадресация SOCKS5 CONNECT трафика через SSH", - "forwardDescriptionServerLocal": "Текущий хост {{sourcePort}} → конечная точка {{endpointPort}}.", - "forwardDescriptionServerRemote": "Конечная точка {{endpointPort}} → текущий хост {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS при текущем хосте {{sourcePort}}.", - "forwardDescriptionClientLocal": "Локальный {{sourcePort}} → удаленный {{endpointPort}}.", - "forwardDescriptionClientRemote": "Удаленная {{sourcePort}} → локальная {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS на локальном порту {{sourcePort}}.", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS через {{endpoint}}", - "autoNameClientLocal": "Локальная {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → локальная {{localPort}}", - "autoNameClientDynamic": "{{localPort}} SOCKS {{localPort}} через {{endpoint}}", - "route": "Маршрут:", - "lastStarted": "Последнее начало", - "lastTested": "Последняя проверка", - "lastError": "Последняя ошибка", - "maxRetries": "Макс. повторов", - "maxRetriesDescription": "Максимальное количество попыток повторной попытки.", - "retryInterval": "Интервал повтора (секунд)", - "retryIntervalDescription": "Время ожидания между попытками повтора.", - "local": "Локальный", - "remote": "Удалённый", - "destination": "Назначение", - "host": "Хост", - "mode": "Режим", - "noHostSelected": "Хост не выбран", - "working": "Работаю..." + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "ЦП", - "memory": "Память", - "disk": "Диск", - "network": "Сеть", - "uptime": "Время работы", - "processes": "Процессы", - "available": "Доступно", - "free": "Свободно", - "connecting": "Подключение...", - "connectionFailed": "Не удалось подключиться к серверу", - "naCpus": "Н/А ЦП(и)", - "cpuCores_one": "Ядро {{count}}", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Загрузка ЦП", - "memoryUsage": "Использование памяти", - "diskUsage": "Использование диска", - "failedToFetchHostConfig": "Не удалось получить конфигурацию узла", - "serverOffline": "Сервер оффлайн", - "cannotFetchMetrics": "Не удается получить метрики с сервера оффлайн", - "totpFailed": "Ошибка проверки TOTP", - "noneAuthNotSupported": "Статистика сервера не поддерживает тип аутентификации «нет».", - "load": "Нагрузка", - "systemInfo": "Информация о системе", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Операционная система", - "kernel": "Ядро", - "seconds": "секунд", - "networkInterfaces": "Сетевые интерфейсы", - "noInterfacesFound": "Сетевых интерфейсов не найдено", - "noProcessesFound": "Процессы не найдены", - "loginStats": "Статистика входа SSH", - "noRecentLoginData": "Нет последних данных для входа", - "executingQuickAction": "Выполнение {{name}}...", - "quickActionSuccess": "{{name}} успешно завершен", - "quickActionFailed": "{{name}} не удалось", - "quickActionError": "Не удалось выполнить {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Прослушиваемые порты", - "protocol": "Протокол", - "port": "Порт", - "address": "Адрес", - "process": "Процесс", - "noData": "Нет данных портов для прослушивания" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Брандмауэр", - "inactive": "Неактивный", - "policy": "Политика", - "rules": "правила", - "noData": "Данные брандмауэра не доступны", - "action": "Действие", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Порт", - "source": "Источник", - "anywhere": "Где угодно" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Средняя нагрузка", - "swap": "Поменять", - "architecture": "Архитектура", - "refresh": "Обновить", - "retry": "Повторить" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Повторить попытку", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Бегать", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Самостоятельно размещаемые SSH-серверы и системы удаленного управления рабочим столом", - "loginTitle": "Войти в Термикс", - "registerTitle": "Создать Аккаунт", - "forgotPassword": "Забыли пароль?", - "rememberMe": "Запомнить устройство на 30 дней (включая TOTP)", - "noAccount": "У вас нет учетной записи?", - "hasAccount": "Уже зарегистрированы?", - "twoFactorAuth": "Двухфакторная аутентификация", - "enterCode": "Введите код подтверждения", - "backupCode": "Или используйте код резервной копии", - "verifyCode": "Проверить код", - "redirectingToApp": "Перенаправление на приложение...", - "sshAuthenticationRequired": "Требуется SSH аутентификация", - "sshNoKeyboardInteractive": "Клавиатура - Интерактивная аутентификация недоступна", - "sshAuthenticationFailed": "Ошибка аутентификации", - "sshAuthenticationTimeout": "Таймаут аутентификации", - "sshNoKeyboardInteractiveDescription": "Сервер не поддерживает интерактивную аутентификацию с клавиатуры. Пожалуйста, введите ваш пароль или SSH ключ.", - "sshAuthFailedDescription": "Предоставленные учетные данные неверны. Пожалуйста, попробуйте еще раз с действительными учетными данными.", - "sshTimeoutDescription": "Время попытки аутентификации истекло. Пожалуйста, попробуйте еще раз.", - "sshProvideCredentialsDescription": "Пожалуйста, предоставьте ваши учетные данные SSH для подключения к этому серверу.", - "sshPasswordDescription": "Введите пароль для этого SSH соединения.", - "sshKeyPasswordDescription": "Если ваш SSH ключ зашифрован, введите здесь ключевую фразу.", - "passphraseRequired": "Требуется пароль", - "passphraseRequiredDescription": "SSH ключ зашифрован. Пожалуйста, введите парольную фразу для разблокировки.", - "back": "Назад", - "firstUser": "Первый пользователь", - "firstUserMessage": "Вы первый пользователь и будете созданы администратором. Вы можете просмотреть настройки администратора в раскрывающемся списке пользователя боковой панели. Если вы считаете, что это ошибка, проверьте логи docker или создайте GitHub.", - "external": "Внешний", - "loginWithExternal": "Войти через внешнего провайдера", - "loginWithExternalDesc": "Войти с помощью настроенного провайдера внешней идентификации", - "externalNotSupportedInElectron": "Внешняя аутентификация еще не поддерживается в приложении Electron. Пожалуйста, используйте веб-версию для входа в OIDC.", - "resetPasswordButton": "Сбросить пароль", - "sendResetCode": "Отправить код сброса", - "resetCodeDesc": "Введите имя пользователя для получения кода сброса пароля. Код будет вошел в журналы контейнера docker.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Проверить код", - "enterResetCode": "Введите 6-значный код из журналов docker container для пользователя:", - "newPassword": "Новый пароль", - "confirmNewPassword": "Подтверждение пароля", - "enterNewPassword": "Введите новый пароль для пользователя:", - "signUp": "Регистрация", - "desktopApp": "Приложение для рабочего стола", - "loggingInToDesktopApp": "Вход в приложение для компьютера", - "loadingServer": "Загрузка сервера...", - "dataLossWarning": "Сброс пароля таким образом удалит все сохраненные SSH хосты, учетные данные и другие зашифрованные данные. Это действие нельзя отменить. Используйте только если вы забыли пароль и не вошли в систему.", - "authenticationDisabled": "Аутентификация отключена", - "authenticationDisabledDesc": "Все методы аутентификации в настоящее время отключены. Обратитесь к администратору.", - "attemptsRemaining": "{{count}} попыток осталось" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Проверка SSH ключа хоста", - "keyChangedWarning": "SSH ключ хоста изменен", - "firstConnectionTitle": "Впервые подключение к этому узлу", - "firstConnectionDescription": "Логичность этого узла не может быть установлена. Проверьте отпечаток пальца так, что вы ожидаете.", - "keyChangedDescription": "Ключ хоста для этого сервера изменился с момента вашего последнего подключения. Это может указывать на проблему безопасности.", - "previousKey": "Предыдущий ключ", - "newFingerprint": "Новый отпечаток пальца", - "fingerprint": "Отпечаток пальца", - "verifyInstructions": "Если вы доверяете этому узлу, нажмите «Принять», чтобы продолжить, и сохраните отпечаток пальца для будущих подключений.", - "securityWarning": "Предупреждение о безопасности", - "acceptAndContinue": "Принять и продолжить", - "acceptNewKey": "Принять новый ключ и продолжить" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Не удалось подключиться к базе данных", - "unknownError": "Неизвестная ошибка", - "loginFailed": "Вход не удался", - "failedPasswordReset": "Не удалось сбросить пароль", - "failedVerifyCode": "Не удалось проверить код сброса", - "failedCompleteReset": "Не удалось завершить сброс пароля", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Не удалось запустить вход OIDC", - "silentSigninOidcUnavailable": "Запрошен беззвучный вход, но OIDC вход недоступен.", - "failedUserInfo": "Не удалось получить информацию о пользователе после входа", - "oidcAuthFailed": "Ошибка аутентификации OIDC", - "invalidAuthUrl": "Неправильный URL-адрес авторизации получен из бэкэнда", - "requiredField": "Это поле является обязательным", - "minLength": "Минимальная длина - {{min}}", - "passwordMismatch": "Пароли не совпадают", - "passwordLoginDisabled": "Имя пользователя/пароль в настоящее время отключены", - "sessionExpired": "Истек срок действия сессии - пожалуйста, войдите снова", - "totpRateLimited": "Оценить ограничено: Слишком много попыток проверки TOTP. Пожалуйста, повторите попытку позже.", - "totpRateLimitedWithTime": "Ставка ограничена: Слишком много попыток проверки TOTP. Пожалуйста, подождите {{time}} секунд, прежде чем повторить попытку.", - "resetCodeRateLimited": "Оценить ограничено: слишком много попыток проверки. Пожалуйста, повторите попытку позже.", - "resetCodeRateLimitedWithTime": "Оценить ограничено: слишком много попыток проверки. Пожалуйста, подождите {{time}} секунд, прежде чем повторить попытку.", - "authTokenSaveFailed": "Не удалось сохранить токен аутентификации", - "failedToLoadServer": "Не удалось загрузить сервер" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Регистрация новой учетной записи отключена администратором. Пожалуйста, войдите в систему или свяжитесь с администратором.", - "userNotAllowed": "Ваша учетная запись не авторизована для регистрации. Пожалуйста, свяжитесь с администратором.", - "databaseConnectionFailed": "Не удалось подключиться к серверу базы данных", - "resetCodeSent": "Код сброса отправлен в логи Docker", - "codeVerified": "Код успешно подтвержден", - "passwordResetSuccess": "Пароль успешно сброшен", - "loginSuccess": "Вход выполнен", - "registrationSuccess": "Регистрация прошла успешно" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Местные настольные туннели, нацеленные на настроенные хосты SSH.", - "c2sTunnelPresets": "Пресеты клиентского туннеля", - "c2sTunnelPresetsDesc": "Сохраните список локальных туннелей этого клиента в качестве именованного шаблона сервера или загрузите пресет обратно в этот клиент.", - "c2sTunnelPresetsUnavailable": "Пресеты Клиентского туннеля доступны только в клиенте для рабочего стола.", - "c2sPresetName": "Имя шаблона", - "c2sPresetNamePlaceholder": "Имя шаблона клиента", - "c2sPresetToLoad": "Пресет для загрузки", - "c2sNoPresetSelected": "Пресет не выбран", - "c2sNoPresets": "Пресеты не сохранены", - "c2sLoadPreset": "Нагрузка", - "c2sCurrentLocalConfig": "Конфигурация локального клиентского туннеля(ов) {{count}} на этом рабочем столе.", - "c2sPresetSyncNote": "Пресеты являются явными снимками; загрузка одной заменяет список локальных клиентских туннелей этого клиента.", - "c2sPresetSaved": "Предустановка туннеля клиента сохранена", - "c2sPresetLoaded": "Конфигурация туннеля клиента загружена локально", - "c2sPresetRenamed": "Предустановка туннеля клиента переименована", - "c2sPresetDeleted": "Предустановка туннеля клиента удалена", - "c2sPresetLoadError": "Не удалось загрузить пресеты туннеля клиента" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Язык", - "keyPassword": "пароль ключа", - "pastePrivateKey": "Вставьте ваш закрытый ключ здесь...", - "localListenerHost": "127.0.0.1 (слушать локально)", - "localTargetHost": "127.0.0.1 (цель на этом компьютере)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Введите ваш пароль", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Панель", - "loading": "Загрузка панели управления...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Поддержка", + "support": "Support", "discord": "Discord", - "serverOverview": "Обзор сервера", - "version": "Версии", - "upToDate": "Актуально", - "updateAvailable": "Доступно обновление", - "beta": "Бета", - "uptime": "Время работы", - "database": "База данных", - "healthy": "Исправен", - "error": "Ошибка", - "totalHosts": "Всего хостов", - "totalTunnels": "Всего туннелей", - "totalCredentials": "Всего учетных данных", - "recentActivity": "Недавняя активность", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Загрузка недавней активности...", - "noRecentActivity": "Нет недавних действий", - "quickActions": "Быстрые действия", - "addHost": "Добавить хост", - "addCredential": "Добавить учетные данные", - "adminSettings": "Админ настройки", - "userProfile": "Профиль пользователя", - "serverStats": "Статистика сервера", - "loadingServerStats": "Загрузка статистики сервера...", - "noServerData": "Нет доступных данных сервера", - "cpu": "ЦП", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Настроить панель", - "dashboardSettings": "Настройки панели инструментов", - "enableDisableCards": "Включить/выключить карты", - "resetLayout": "Сброс по умолчанию", - "serverOverviewCard": "Обзор сервера", - "recentActivityCard": "Недавняя активность", - "networkGraphCard": "Сетевой график", - "networkGraph": "Сетевой график", - "quickActionsCard": "Быстрые действия", - "serverStatsCard": "Статистика сервера", - "panelMain": "Главный", - "panelSide": "Грань", - "justNow": "только что" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "СТАБИЛЬНЫЙ", - "hostsOnline": "Хосты онлайн", - "activeTunnels": "Активные туннели", - "registerNewServer": "Зарегистрировать новый сервер", - "storeSshKeysOrPasswords": "Хранить ключи или пароли SSH", - "manageUsersAndRoles": "Управление пользователями и ролями", - "manageYourAccount": "Управление аккаунтом", - "hostStatus": "Состояние хоста", - "noHostsConfigured": "Хосты не настроены", - "online": "ОНЛАЙН", - "offline": "ОФЛАЙН", - "onlineLower": "Онлайн", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", + "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Добавить:", - "commandPalette": "Палитра команд", - "done": "Готово", - "editModeInstructions": "Перетащите карты для изменения порядка · Перетащите разделитель столбцов в размер столбцов · Перетащите нижний край карты, чтобы изменить его высоту · Корзина, чтобы удалить", - "empty": "Пусто", - "clear": "Очистить" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Копия", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Добавить хост", - "addGroup": "Добавить группу", - "addLink": "Добавить ссылку", - "zoomIn": "Увеличить", - "zoomOut": "Уменьшить", - "resetView": "Сбросить вид", - "selectHost": "Выберите хост", - "chooseHost": "Выберите хост...", - "parentGroup": "Родительская группа", - "noGroup": "Нет группы", - "groupName": "Название группы", - "color": "Цвет", - "source": "Источник", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Переместить в группу", - "selectGroup": "Выберите группу...", - "addConnection": "Добавить соединение", - "hostDetails": "Детали хоста", - "removeFromGroup": "Удалить из группы", - "addHostHere": "Добавить узел здесь", - "editGroup": "Изменить группу", - "delete": "Удалить", - "add": "Добавить", - "create": "Создать", - "move": "Переместить", - "connect": "Подключиться", - "createGroup": "Создать группу", - "selectSourcePlaceholder": "Выберите источник...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Двигаться", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Недопустимый файл", - "hostAlreadyExists": "Хост уже находится в топологии", - "connectionExists": "Соединение уже существует", - "unknown": "Неизвестен", - "name": "Наименование", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Статус", - "failedToAddNode": "Не удалось добавить узел", - "sourceDifferentFromTarget": "Источник и цель должны отличаться", - "exportJSON": "Экспорт JSON", - "importJSON": "Импорт JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Терминал", "fileManager": "Файловый менеджер", "tunnel": "Туннель", - "docker": "Докер", - "serverStats": "Статистика сервера", - "noNodes": "Пока нет узлов" + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker не включен для этого узла", - "validating": "Проверка докера...", - "connecting": "Подключение...", - "error": "Ошибка", - "version": "Докер {{version}}", - "connectionFailed": "Не удалось подключиться к Docker", - "containerStarted": "Запущен контейнер {{name}}", - "failedToStartContainer": "Не удалось запустить контейнер {{name}}", - "containerStopped": "Контейнер {{name}} остановлен", - "failedToStopContainer": "Не удалось остановить контейнер {{name}}", - "containerRestarted": "Контейнер {{name}} перезапущен", - "failedToRestartContainer": "Не удалось перезапустить контейнер {{name}}", - "containerPaused": "Контейнер {{name}} приостановлен", - "containerUnpaused": "Контейнер {{name}} снят на паузе", - "failedToTogglePauseContainer": "Не удалось переключить состояние паузы для контейнера {{name}}", - "containerRemoved": "Контейнер {{name}} удален", - "failedToRemoveContainer": "Не удалось удалить контейнер {{name}}", - "image": "Изображение", - "ports": "Порты", - "noPorts": "Нет портов", - "start": "Начать", - "confirmRemoveContainer": "Вы уверены, что хотите удалить контейнер '{{name}}'? Это действие нельзя отменить.", - "runningContainerWarning": "Предупреждение: Этот контейнер в настоящее время запущен. Удаление его сначала остановит контейнер.", - "loadingContainers": "Загрузка контейнеров...", - "manager": "Менеджер Docker", - "autoRefresh": "Автообновление", - "timestamps": "Метки времени", - "lines": "Строки", - "filterLogs": "Фильтровать журналы...", - "refresh": "Обновить", - "download": "Скачать", - "clear": "Очистить", - "logsDownloaded": "Журналы успешно загружены", - "last50": "Последние 50", - "last100": "Последние 100", - "last500": "Последние 500", - "last1000": "Последние 1000", - "allLogs": "Все журналы", - "noLogsMatching": "Нет журналов по запросу \"{{query}}\"", - "noLogsAvailable": "Нет доступных журналов", - "noContainersFound": "Контейнеры не найдены", - "noContainersFoundHint": "На этом узле нет доступных контейнеров Docker", - "searchPlaceholder": "Поиск контейнеров...", - "allStatuses": "Все статусы", - "stateRunning": "Выполняется", - "statePaused": "Пауза", - "stateExited": "Выход", - "stateRestarting": "Перезапуск", - "noContainersMatchFilters": "Нет контейнеров, соответствующих вашим фильтрам", - "noContainersMatchFiltersHint": "Попробуйте изменить критерии поиска или фильтра", - "failedToFetchStats": "Не удалось получить статистику контейнера", - "containerNotRunning": "Контейнер не запущен", - "startContainerToViewStats": "Запустите контейнер для просмотра статистики", - "loadingStats": "Загрузка статистики...", - "errorLoadingStats": "Ошибка загрузки статистики", - "noStatsAvailable": "Нет доступной статистики", - "cpuUsage": "Загрузка ЦП", - "current": "Текущее", - "memoryUsage": "Использование памяти", - "networkIo": "Сеть I/O", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Вывод", - "blockIo": "Блок I/O", - "read": "Чтение", - "write": "Написать", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "Информация о контейнере", - "name": "Наименование", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Состояние", - "containerMustBeRunning": "Контейнер должен быть запущен для доступа к консоли", - "verificationCodePrompt": "Введите код подтверждения", - "totpVerificationFailed": "Ошибка проверки TOTP. Пожалуйста, попробуйте еще раз.", - "warpgateVerificationFailed": "Ошибка аутентификации Warpgate. Пожалуйста, попробуйте еще раз.", - "connectedTo": "Подключено к {{containerName}}", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", "disconnected": "Отключено", - "consoleError": "Ошибка консоли", - "errorMessage": "Ошибка: {{message}}", - "failedToConnect": "Не удалось подключиться к контейнеру", - "console": "Консоль", - "selectShell": "Выберите оболочку", - "bash": "Баш", - "sh": "сч", - "ash": "пепел", - "connect": "Подключиться", - "disconnect": "Отключиться", - "notConnected": "Не подключен", - "clickToConnect": "Нажмите \"Подключиться\", чтобы начать сеанс оболочки", - "connectingTo": "Подключение к {{containerName}}...", - "containerNotFound": "Контейнер не найден", - "backToList": "Назад к списку", - "logs": "Логи", - "stats": "Статистика", - "consoleTab": "Консоль", - "startContainerToAccess": "Запустите контейнер для доступа к консоли" + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Не подключено", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Общие положения", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Пользователи", - "sectionSessions": "Сессии", - "sectionRoles": "Роли", - "sectionDatabase": "База данных", - "sectionApiKeys": "Ключи API", - "allowRegistration": "Разрешить регистрацию пользователей", - "allowRegistrationDesc": "Позволить новым пользователям самостоятельно регистрироваться", - "allowPasswordLogin": "Разрешить вход в пароль", - "allowPasswordLoginDesc": "Имя пользователя/пароль", - "oidcAutoProvision": "OIDC Автообеспечение", - "oidcAutoProvisionDesc": "Автоматическое создание учетных записей для пользователей OIDC, даже если регистрация отключена", - "allowPasswordReset": "Разрешить сброс пароля", - "allowPasswordResetDesc": "Сбросить код через логи Docker", - "sessionTimeout": "Таймаут сессии", - "hours": "часов", - "sessionTimeoutRange": "Мин. 1ч · Макс 720 ч", - "monitoringDefaults": "Контроль по умолчанию", - "statusCheck": "Проверка статуса", - "metrics": "Метрики", - "sec": "сек", - "logLevel": "Уровень журнала", - "enableGuacamole": "Включить Guacamole", - "enableGuacamoleDesc": "Удаленный рабочий стол RDP/VNC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Очистить фильтры", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Статус", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "Настроить OpenID Connect для SSO. Поля, отмеченные * обязательны.", - "oidcClientId": "ID клиента", - "oidcClientSecret": "Секрет клиента", - "oidcAuthUrl": "URL авторизации", - "oidcIssuerUrl": "URL эмитента", - "oidcTokenUrl": "URL токена", - "oidcUserIdentifier": "Путь к идентификатору пользователя", - "oidcDisplayName": "Отображаемый путь", - "oidcScopes": "Области", - "oidcUserinfoUrl": "Переопределить URL пользовательской информации", - "oidcAllowedUsers": "Разрешенные пользователи", - "oidcAllowedUsersDesc": "Один адрес электронной почты на строку. Оставьте пустым, чтобы разрешить всем.", - "removeOidc": "Удалить", - "usersCount": "{{count}} пользователей", - "createUser": "Создать", - "newRole": "Новая роль", - "roleName": "Наименование", - "roleDisplayName": "Показать имя", - "roleDescription": "Описание", - "rolesCount": "{{count}} ролей", - "createRole": "Создать", - "creating": "Создание...", - "exportDatabase": "Экспорт базы данных", - "exportDatabaseDesc": "Скачать резервную копию всех хостов, учетных данных и настроек", - "export": "Экспорт", - "exporting": "Экспортируется...", - "importDatabase": "Импорт базы данных", - "importDatabaseDesc": "Восстановить из файла резервной копии .sqlite", - "importDatabaseSelected": "Выбрано: {{name}}", - "selectFile": "Выбрать файл", - "changeFile": "Изменить", - "import": "Импорт", - "importing": "Импортируем...", - "apiKeysCount": "{{count}} ключи", - "newApiKey": "Новый ключ API", - "apiKeyCreatedWarning": "Ключ создан - скопируйте его сейчас, он не будет отображаться снова.", - "apiKeyName": "Наименование", - "apiKeyUser": "Пользователь", - "apiKeySelectUser": "Выберите пользователя...", - "apiKeyExpiresAt": "Истекает", - "createKey": "Создать ключ", - "apiKeyNoExpiry": "Нет срока действия", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Удалять", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Двойная авторизация", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Локальный", - "adminStatusAdministrator": "Администратор", - "adminStatusRegularUser": "Обычный пользователь", - "adminBadge": "АДМИН", - "systemBadge": "СИС", - "customBadge": "КЛИЕНТЫ", - "youBadge": "ВЫ", - "sessionsActive": "{{count}} активен", - "sessionActive": "Активно: {{time}}", - "sessionExpires": "Эксп: {{time}}", - "revokeAll": "Все", - "revokeAllSessionsSuccess": "Все сессии для пользователя отозваны", - "revokeAllSessionsFailed": "Не удалось отозвать сессии", - "revokeSessionFailed": "Не удалось отозвать сессию", - "addRole": "Добавить роль", - "noCustomRoles": "Не определены пользовательские роли", - "removeRoleFailed": "Не удалось удалить роль", - "assignRoleFailed": "Не удалось назначить роль", - "deleteRoleFailed": "Не удалось удалить роль", - "userAdminAccess": "Администратор", - "userAdminAccessDesc": "Полный доступ ко всем настройкам администратора", - "userRoles": "Роли", - "revokeAllUserSessions": "Отозвать все сессии", - "revokeAllUserSessionsDesc": "Принудительный повторный вход на всех устройствах", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", + "adminBadge": "ADMIN", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Удаление этого пользователя необратимо.", - "deleteUser": "Удалить {{username}}", - "deleting": "Удаление...", - "deleteUserFailed": "Не удалось удалить пользователя", - "deleteUserSuccess": "Пользователь \"{{username}}\" удален", - "deleteRoleSuccess": "Роль \"{{name}}\" удалена", - "revokeKeySuccess": "Ключ \"{{name}}\" отозван", - "revokeKeyFailed": "Не удалось отозвать ключ", - "copiedToClipboard": "Скопировано в буфер обмена", - "done": "Готово", - "createUserTitle": "Создать пользователя", - "createUserDesc": "Создать новый локальный аккаунт.", - "createUserUsername": "Имя пользователя", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Пароль", - "createUserPasswordHint": "Минимум 6 символов.", - "createUserEnterUsername": "Введите имя пользователя", - "createUserEnterPassword": "Введите пароль", - "createUserSubmit": "Создать пользователя", - "editUserTitle": "Управление пользователем: {{username}}", - "editUserDesc": "Изменение ролей, статуса администратора, сессий и настроек учетной записи.", - "editUserUsername": "Имя пользователя", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", "editUserAuthType": "Тип аутентификации", - "editUserAdminStatus": "Статус админа", - "editUserUserId": "ID пользователя", - "linkAccountTitle": "Привязать OIDC к учетной записи паролей", - "linkAccountDesc": "Объединить OIDC аккаунт {{username}} с существующей локальной учетной записью.", - "linkAccountWarningTitle": "Это будет:", - "linkAccountEffect1": "Удалить учетную запись только OIDC", - "linkAccountEffect2": "Добавить OIDC логин в целевую учетную запись", - "linkAccountEffect3": "Разрешить вход в OIDC и пароль", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Введите имя пользователя локального аккаунта для ссылки на", - "linkAccounts": "Связать аккаунты", - "linkAccountSuccess": "Учетная запись OIDC связана с \"{{username}}\"", - "linkAccountFailed": "Не удалось связать учетную запись OIDC.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Связывание...", - "saving": "Сохранение...", - "updateRegistrationFailed": "Не удалось обновить регистрацию", - "updatePasswordLoginFailed": "Не удалось обновить настройку входа в пароль", - "updateOidcAutoProvisionFailed": "Не удалось обновить автонастройку OIDC", - "updatePasswordResetFailed": "Не удалось обновить настройку сброса пароля", - "sessionTimeoutRange2": "Таймаут сессии должен быть от 1 до 720 часов", - "sessionTimeoutSaved": "Таймаут сессии сохранен", - "sessionTimeoutSaveFailed": "Не удалось сохранить тайм-аут сессии", - "monitoringIntervalInvalid": "Неверные значения интервала", - "monitoringSaved": "Настройки мониторинга сохранены", - "monitoringSaveFailed": "Не удалось сохранить настройки мониторинга", - "guacamoleSaved": "Настройки Guacamole сохранены", - "guacamoleSaveFailed": "Не удалось сохранить настройки Guacamole", - "guacamoleUpdateFailed": "Не удалось обновить настройки Guacamole", - "logLevelUpdateFailed": "Не удалось обновить уровень журнала", - "oidcSaved": "Конфигурация OIDC сохранена", - "oidcSaveFailed": "Не удалось сохранить настройки OIDC", - "oidcRemoved": "Настройки OIDC удалены", - "oidcRemoveFailed": "Не удалось удалить конфигурацию OIDC", - "createUserRequired": "Требуется имя пользователя и пароль", - "createUserPasswordTooShort": "Пароль должен содержать не менее 6 символов", - "createUserSuccess": "Пользователь \"{{username}}\" создан", - "createUserFailed": "Не удалось создать пользователя", - "updateAdminStatusFailed": "Не удалось обновить статус администратора", - "allSessionsRevoked": "Все сессии отозваны", - "revokeSessionsFailed": "Не удалось отозвать сессии", - "createRoleRequired": "Имя и отображаемое имя обязательны", - "createRoleSuccess": "Создана роль \"{{name}}\"", - "createRoleFailed": "Не удалось создать роль", - "apiKeyNameRequired": "Требуется имя ключа", - "apiKeyUserRequired": "Требуется ID пользователя", - "apiKeyCreatedSuccess": "API ключ \"{{name}}\" создан", - "apiKeyCreateFailed": "Не удалось создать ключ API", - "exportSuccess": "База данных успешно экспортирована", - "exportFailed": "Не удалось экспортировать базу данных", - "importSelectFile": "Сначала выберите файл", - "importCompleted": "Импорт завершен: {{total}} элементов импортировано, {{skipped}} пропущено", - "importFailed": "Ошибка импорта: {{error}}", - "importError": "Не удалось импортировать базу данных" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Терминал", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Хост", - "hostPlaceholder": "192.168.1.1 или example.com", - "portLabel": "Порт", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Имя пользователя", - "usernamePlaceholder": "имя пользователя", - "authLabel": "Авто", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Пароль", - "passwordPlaceholder": "пароль", - "privateKeyLabel": "Приватный ключ", - "privateKeyPlaceholder": "Вставить приватный ключ...", - "credentialLabel": "Полномочия", - "credentialPlaceholder": "Выберите сохраненные учетные данные", - "connectToTerminal": "Подключиться к терминалу", - "connectToFiles": "Подключение к файлам" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Credential", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Терминал не выбран", - "noTerminalSelectedHint": "Откройте вкладку SSH terminal для просмотра истории команд", - "searchPlaceholder": "Поиск истории...", - "clearAll": "Очистить все", - "noHistoryEntries": "Нет записей в истории", - "trackingDisabled": "Отслеживание истории отключено", - "trackingDisabledHint": "Включите его в настройках вашего профиля для записи команд." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Запись ключа", - "recordToTerminals": "Запись в терминалы", - "selectAll": "Все", - "selectNone": "Нет", - "noTerminalTabsOpen": "Нет открытых вкладок терминала", - "selectTerminalsAbove": "Выберите терминалы выше", - "broadcastInputPlaceholder": "Введите здесь, чтобы транслировать клавиши...", - "stopRecording": "Остановить запись", - "startRecording": "Начать запись", - "settingsTitle": "Настройки", - "enableRightClickCopyPaste": "Включить копирование/вставка правой кнопкой мыши" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Никто", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Макет", - "selectLayoutAbove": "Выберите макет выше", - "selectLayoutHint": "Выберите количество панелей для отображения", - "panesTitle": "Панели", - "openTabsTitle": "Открытые вкладки", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Перетащите вкладки в панели выше или воспользуйтесь функцией быстрого назначения.", - "dropHere": "Перетащите сюда", - "emptyPane": "Пусто", - "dashboard": "Панель", - "clearSplitScreen": "Очистить разделение экрана", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Быстрое назначение", - "alreadyAssigned": "Панель {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Разделить вкладку", "addToSplit": "Добавить в раздел", "removeFromSplit": "Удалить из Сплита", - "assignToPane": "Назначить на панель" + "assignToPane": "Назначить на панель", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Создать сниппет", - "createSnippetDescription": "Создать новую команду сниппета для быстрого выполнения", - "nameLabel": "Наименование", - "namePlaceholder": "например, перезагрузите Nginx", - "descriptionLabel": "Описание", - "descriptionPlaceholder": "Дополнительное описание", - "optional": "Опционально", - "folderLabel": "Папка", - "noFolder": "Нет папки (без категории)", - "commandLabel": "Команда", - "commandPlaceholder": "например, nginx перезапуск sudo systemctl", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", "cancel": "Отмена", - "createSnippetButton": "Создать сниппет", - "createFolderTitle": "Создать папку", - "createFolderDescription": "Организовать ваши сниппеты в папках", - "folderNameLabel": "Имя папки", - "folderNamePlaceholder": "например, Системные команды, Docker скрипты", - "folderColorLabel": "Цвет папки", - "folderIconLabel": "Иконка папки", - "previewLabel": "Предпросмотр", - "folderNameFallback": "Имя папки", - "createFolderButton": "Создать папку", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Все", - "selectNone": "Нет", - "noTerminalTabsOpen": "Нет открытых вкладок терминала", - "searchPlaceholder": "Поиск сниппетов...", - "newSnippet": "Новый сниппет", - "newFolder": "Новая папка", - "run": "Запустить", - "noSnippetsInFolder": "В этой папке нет фрагментов", - "uncategorized": "Без категории", - "editSnippetTitle": "Редактировать сниппет", - "editSnippetDescription": "Обновить эту команду сниппета", - "saveSnippetButton": "Сохранить изменения", - "createSuccess": "Сниппет успешно создан", - "createFailed": "Не удалось создать сниппет", - "updateSuccess": "Сниппет успешно обновлен", - "updateFailed": "Не удалось обновить сниппет", - "deleteFailed": "Не удалось удалить сниппет", - "folderCreateSuccess": "Папка успешно создана", - "folderCreateFailed": "Не удалось создать папку", - "editFolderTitle": "Изменить папку", - "editFolderDescription": "Переименовать или изменить внешний вид этой папки", - "saveFolderButton": "Сохранить изменения", - "editFolder": "Изменить папку", - "deleteFolder": "Удалить папку", - "folderDeleteSuccess": "Папка \"{{name}}\" удалена", - "folderDeleteFailed": "Не удалось удалить папку", - "folderEditSuccess": "Папка успешно обновлена", - "folderEditFailed": "Не удалось обновить папку", - "confirmRunMessage": "Запустить \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Никто", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Бегать", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Бегать", - "runSuccess": "Ранг \"{{name}}\" в терминалах {{count}}", - "copySuccess": "Скопировано \"{{name}}\" в буфер обмена", - "shareTitle": "Поделиться сниппетом", - "shareUser": "Пользователь", - "shareRole": "Роль", - "selectUser": "Выберите пользователя...", - "selectRole": "Выберите роль...", - "shareSuccess": "Сниппет успешно поделился", - "shareFailed": "Не удалось поделиться сниппетом", - "revokeSuccess": "Доступ отозван", - "revokeFailed": "Не удалось отменить доступ", - "currentAccess": "Текущий доступ", - "shareLoadError": "Не удалось загрузить данные общего доступа", - "loading": "Загрузка...", - "close": "Закрыть", - "reorderFailed": "Не удалось сохранить порядок фрагментов." + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Не удалось сохранить порядок фрагментов.", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Аккаунт", - "sectionAppearance": "Внешний вид", - "sectionSecurity": "Безопасность", - "sectionApiKeys": "Ключи API", - "sectionC2sTunnels": "Туннели C2S", - "usernameLabel": "Имя пользователя", - "roleLabel": "Роль", - "roleAdministrator": "Администратор", - "authMethodLabel": "Метод аутентификации", - "authMethodLocal": "Локальный", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "На", - "twoFaOff": "Выкл", - "versionLabel": "Версии", - "deleteAccount": "Удалить аккаунт", - "deleteAccountDescription": "Окончательно удалить свой аккаунт", - "deleteButton": "Удалить", - "deleteAccountPermanent": "Это действие является постоянным и не может быть отменено.", - "deleteAccountWarning": "Все сессии, хосты, учетные данные и настройки будут удалены навсегда.", - "confirmPasswordDeletePlaceholder": "Введите ваш пароль для подтверждения", - "languageLabel": "Язык", - "themeLabel": "Тема", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Цвет акцента", + "accentColorLabel": "Accent Color", "settingsTerminal": "Терминал", - "commandAutocomplete": "Автозаполнение команды", - "commandAutocompleteDesc": "Показывать автозаполнение при вводе текста", - "historyTracking": "История отслеживания", - "historyTrackingDesc": "Отслеживать команды терминалов", - "syntaxHighlighting": "Подсветка синтаксиса", - "syntaxHighlightingDesc": "Выделить вывод терминала", - "commandPalette": "Палитра команд", - "commandPaletteDesc": "Включить горячую клавишу", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Открывайте вкладки повторно при входе в систему.", "reopenTabsOnLoginDesc": "Восстанавливайте открытые вкладки при входе в систему или обновлении страницы, даже с другого устройства.", - "confirmTabClose": "Подтвердить закрытие вкладки", - "confirmTabCloseDesc": "Спрашивать перед закрытием вкладок терминала", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Показать теги хоста", - "showHostTagsDesc": "Отображать теги в списке узлов", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Нажмите, чтобы развернуть действия с хостом.", "hostTrayOnClickDesc": "Всегда отображайте кнопки подключения; щелкните по ним, чтобы развернуть параметры управления, вместо того чтобы наводить курсор на них.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Панель приложений Pin", "pinAppRailDesc": "Левая боковая панель приложения всегда должна быть развернута, а не расширяться при наведении курсора.", - "settingsSnippets": "Сниппеты", - "foldersCollapsed": "Папки свернуты", - "foldersCollapsedDesc": "Свернуть папки по умолчанию", - "confirmExecution": "Подтвердить исполнение", - "confirmExecutionDesc": "Подтвердить перед запуском сниппетов", - "settingsUpdates": "Обновления", - "disableUpdateChecks": "Отключить проверки обновлений", - "disableUpdateChecksDesc": "Остановить проверку обновлений", - "totpAuthenticator": "TOTP аутентификатор", - "totpEnabled": "2FA включено", - "totpDisabled": "Добавить дополнительную безопасность входа", - "disable": "Отключено", - "enable": "Включить", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Отсканируйте QR-код или введите секретный код в приложении для аутентификации, а затем введите 6-значный код", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Подтвердить", - "changePassword": "Изменить пароль", - "currentPasswordLabel": "Текущий пароль", - "currentPasswordPlaceholder": "Текущий пароль", - "newPasswordLabel": "Новый пароль", - "newPasswordPlaceholder": "Новый пароль", - "confirmPasswordLabel": "Подтвердите новый пароль", - "confirmPasswordPlaceholder": "Подтвердите новый пароль", - "updatePassword": "Обновить пароль", - "createApiKeyTitle": "Создать ключ API", - "createApiKeyDescription": "Генерировать новый ключ API для доступа к программам.", - "apiKeyNameLabel": "Наименование", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "опционально", + "optional": "optional", "cancel": "Отмена", - "createKey": "Создать ключ", - "apiKeyCount": "{{count}} ключи", - "newKey": "Новый ключ", - "noApiKeys": "Пока нет ключей API.", - "apiKeyActive": "Активный", - "apiKeyUsageHint": "Включить ваш ключ в", - "apiKeyUsageHintHeader": "заголовок.", - "apiKeyPermissionsHint": "Ключи наследуют права создаваемого пользователя.", - "roleUser": "Пользователь", - "authMethodDual": "Двойная авторизация", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Не удалось запустить настройку TOTP", - "totpEnter6Digits": "Введите 6-значный код", - "totpEnabledSuccess": "Двухфакторная аутентификация включена", - "totpInvalidCode": "Неверный код, попробуйте еще раз", - "totpDisableInputRequired": "Введите код TOTP или пароль", - "totpDisabledSuccess": "Двухфакторная аутентификация отключена", - "totpDisableFailed": "Не удалось отключить 2FA", - "totpDisableTitle": "Отключить 2FA", - "totpDisablePlaceholder": "Введите код TOTP или пароль", - "totpDisableConfirm": "Отключить 2FA", - "totpContinueVerify": "Продолжить проверку", - "totpVerifyTitle": "Проверить код", - "totpBackupTitle": "Резервные коды", - "totpDownloadBackup": "Скачать резервные коды", - "done": "Готово", - "secretCopied": "Секрет скопирован в буфер обмена", - "apiKeyNameRequired": "Требуется имя ключа", - "apiKeyCreated": "API ключ \"{{name}}\" создан", - "apiKeyCreateFailed": "Не удалось создать ключ API", - "apiKeyUser": "Пользователь", - "apiKeyExpires": "Истекает", - "apiKeyRevoked": "API ключ \"{{name}}\" отозван", - "apiKeyRevokeFailed": "Не удалось отозвать ключ API", - "passwordFieldsRequired": "Требуется текущий и новый пароль", - "passwordMismatch": "Пароли не совпадают", - "passwordTooShort": "Пароль должен содержать не менее 6 символов", - "passwordUpdated": "Пароль успешно обновлен", - "passwordUpdateFailed": "Не удалось обновить пароль", - "deletePasswordRequired": "Требуется пароль для удаления вашей учетной записи", - "deleteFailed": "Не удалось удалить аккаунт", - "deleting": "Удаление...", - "colorPickerTooltip": "Открыть выбор цвета", - "themeSystem": "Система", - "themeLight": "Светлая", - "themeDark": "Тёмная", - "themeDracula": "Дракула", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Соляризованный", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Один темный", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Повторить попытку", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Удалять", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/sr_SP.json b/src/ui/locales/translated/sr_SP.json index 5eaf8982..39e4dbe5 100644 --- a/src/ui/locales/translated/sr_SP.json +++ b/src/ui/locales/translated/sr_SP.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Фасцикле", - "folder": "Фасцикла", - "password": "Лозинка", - "key": "Кључ", - "sshPrivateKey": "SSH приватни кључ", - "upload": "Отпреми", - "keyPassword": "Кључна лозинка", - "sshKey": "SSH кључ", - "uploadPrivateKeyFile": "Отпреми датотеку приватног кључа", - "searchCredentials": "Претражите акредитиве...", - "addCredential": "Додај акредитив", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "CA сертификат (-cert.pub)", "caCertificateDescription": "Опционо: Отпремите или налепите датотеку сертификата потписану од стране CA (нпр. id_ed25519-cert.pub). Обавезно када ваш SSH сервер користи ауторизацију засновану на сертификату.", "uploadCertFile": "Отпреми датотеку -cert.pub", - "clearCert": "Јасно", + "clearCert": "Clear", "certLoaded": "Сертификат је учитан", "certPublicKeyLabel": "CA сертификат", "certTypeLabel": "Тип сертификата", "pasteOrUploadCert": "Налепите или отпремите -cert.pub сертификат...", "hasCaCert": "Има CA сертификат", - "noCaCert": "Нема CA сертификата" + "noCaCert": "Нема CA сертификата", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Подразумевани редослед", + "sortNameAsc": "Име (А → Ш)", + "sortNameDesc": "Име (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Обриши филтере", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Учитавање обавештења није успело", - "failedToDismissAlert": "Одбацивање упозорења није успело" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Конфигурација сервера", - "description": "Конфигуришите URL адресу Termix сервера да бисте се повезали са вашим бекенд сервисима", - "serverUrl": "URL сервера", - "enterServerUrl": "Молимо вас да унесете URL адресу сервера", - "saveFailed": "Чување конфигурације није успело", - "saveError": "Грешка при чувању конфигурације", - "saving": "Чување...", - "saveConfig": "Сачувај конфигурацију", - "helpText": "Унесите URL адресу на којој ради ваш Termix сервер (нпр. http://localhost:30001 или https://your-server.com)", - "changeServer": "Промени сервер", - "mustIncludeProtocol": "URL сервера мора да почиње са http:// или https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Дозволи неважећи сертификат", "allowInvalidCertificateDesc": "Користите само за поуздане самохостоване сервере са самопотписаним сертификатима или сертификатима за IP адресу.", - "useEmbedded": "Користи локални сервер", - "embeddedDesc": "Покрените Termix са уграђеним локалним сервером (није потребан удаљени сервер)", - "embeddedConnecting": "Повезивање са локалним сервером...", - "embeddedNotReady": "Локални сервер још није спреман. Молимо сачекајте тренутак и покушајте поново.", - "localServer": "Локални сервер" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Локални сервер", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Грешка при провери верзије", - "checkFailed": "Провера ажурирања није успела", - "upToDate": "Апликација је ажурирана", - "currentVersion": "Користите верзију {{version}}", - "updateAvailable": "Ажурирање је доступно", - "newVersionAvailable": "Нова верзија је доступна! Користите {{current}}, али је доступан {{latest}}.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Бета верзија", - "betaVersionDesc": "Користите {{current}}, што је новије од најновије стабилне верзије {{latest}}.", - "releasedOn": "Објављено {{date}}", - "downloadUpdate": "Преузми ажурирање", - "checking": "Провера ажурирања...", - "checkUpdates": "Провери ажурирања", - "checkingUpdates": "Провера ажурирања...", - "updateRequired": "Потребно је ажурирање" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Затвори", - "minimize": "Минимизирај", - "online": "Онлајн", - "offline": "Офлајн", - "continue": "Настави", - "maintenance": "Одржавање", - "degraded": "Деградирано", - "error": "Грешка", - "warning": "Упозорење", - "unsavedChanges": "Несачуване промене", - "dismiss": "Одбаци", - "loading": "Учитавање...", - "optional": "Опционо", - "connect": "Повежи се", - "copied": "Копирано", - "connecting": "Повезивање...", - "updateAvailable": "Ажурирање је доступно", - "appName": "Термикс", - "openInNewTab": "Отвори у новој картици", - "noReleases": "Нема издања", - "updatesAndReleases": "Ажурирања и издања", - "newVersionAvailable": "Доступна је нова верзија ({{version}}).", - "failedToFetchUpdateInfo": "Није успело преузимање информација о ажурирању", - "preRelease": "Претходно издање", - "noReleasesFound": "Није пронађено ниједно издање.", - "cancel": "Откажи", - "username": "Корисничко име", - "login": "Пријава", - "register": "Региструј се", - "password": "Лозинка", - "confirmPassword": "Потврдите лозинку", - "back": "Назад", - "save": "Сачувај", - "saving": "Чување...", - "delete": "Обриши", - "rename": "Преименуј", - "edit": "Измени", - "add": "Додај", - "confirm": "Потврди", - "no": "Не", - "or": "ИЛИ", - "next": "Следеће", - "previous": "Претходно", - "refresh": "Освежи", - "language": "Језик", - "checking": "Провера...", - "checkingDatabase": "Провера везе са базом података...", - "checkingAuthentication": "Провера аутентификације...", - "backendReconnected": "Веза са сервером је враћена", - "connectionDegraded": "Веза са сервером је прекинута, враћање везе…", - "reload": "Поново учитај", - "remove": "Уклони", - "create": "Креирај", - "update": "Ажурирање", - "copy": "Копија", - "copyFailed": "Копирање у међуспремник није успело", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Максимизирај", "restore": "Врати", - "of": "од" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Дом", - "terminal": "Терминал", - "docker": "Докер", - "tunnels": "Тунели", - "fileManager": "Менаџер датотека", - "serverStats": "Статистика сервера", - "admin": "Администратор", - "userProfile": "Кориснички профил", - "splitScreen": "Подељени екран", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Да ли желите да затворите ову активну сесију?", - "close": "Затвори", - "cancel": "Откажи", - "sshManager": "SSH менаџер", - "cannotSplitTab": "Није могуће поделити ову картицу", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Копирај лозинку", - "copySudoPassword": "Копирај Судо лозинку", - "passwordCopied": "Лозинка је копирана у међуспремник", - "noPasswordAvailable": "Није доступна лозинка", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "Копирање лозинке није успело", "refreshTab": "Освежи везу", - "openFileManager": "Отвори менаџер датотека", - "dashboard": "Контролна табла", - "networkGraph": "Мрежни графикон", - "quickConnect": "Брзо повезивање", - "sshTools": "SSH алати", - "history": "Историја", - "hosts": "Домаћини", - "snippets": "Исечци", - "hostManager": "Менаџер домаћина", - "credentials": "Акредитиви", - "connections": "Везе", - "roleAdministrator": "Администратор", - "roleUser": "Корисник" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Домаћини", - "noHosts": "Нема SSH хостова", - "retry": "Покушај поново", - "refresh": "Освежи", - "optional": "Опционо", - "downloadSample": "Преузми узорак", - "failedToDeleteHost": "Брисање {{name}} није успело", - "importSkipExisting": "Увези (прескочи постојеће)", - "connectionDetails": "Детаљи везе", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Телнет", - "remoteDesktop": "Удаљена радна површина", - "port": "Лука", - "username": "Корисничко име", - "folder": "Фасцикла", - "tags": "Ознаке", - "pin": "Закачи", - "addHost": "Додај хоста", - "editHost": "Измени хоста", - "cloneHost": "Клонирај хост", - "enableTerminal": "Омогући терминал", - "enableTunnel": "Омогући тунел", - "enableFileManager": "Омогући менаџер датотека", - "enableDocker": "Омогући Докер", - "defaultPath": "Подразумевана путања", - "connection": "Веза", - "upload": "Отпреми", - "authentication": "Аутентификација", - "password": "Лозинка", - "key": "Кључ", - "credential": "Акредитив", - "none": "Ниједан", - "sshPrivateKey": "SSH приватни кључ", - "keyType": "Тип кључа", - "uploadFile": "Отпреми датотеку", - "tabGeneral": "Опште", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "РДП", + "tabTerminal": "Terminal", + "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Тунели", - "tabDocker": "Докер", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "Датотеке", - "tabStats": "Статистика", - "tabTelnet": "Телнет", - "tabSharing": "Дељење", - "tabAuthentication": "Аутентификација", - "terminal": "Терминал", - "tunnel": "Тунел", - "fileManager": "Менаџер датотека", - "serverStats": "Статистика сервера", - "status": "Статус", - "folderRenamed": "Фасцикла „{{oldName}}“ је успешно преименована у „{{newName}}“", - "failedToRenameFolder": "Преименовање фасцикле није успело", - "movedToFolder": "Премештено у „{{folder}}“", - "editHostTooltip": "Измени хоста", - "statusChecks": "Провере статуса", - "metricsCollection": "Колекција метрика", - "metricsInterval": "Интервал прикупљања метрика", - "metricsIntervalDesc": "Колико често прикупљати статистику сервера (5 с - 1 сат)", - "behavior": "Понашање", - "themePreview": "Преглед теме", - "theme": "Тема", - "fontFamily": "Породица фонтова", - "fontSize": "Величина фонта", - "letterSpacing": "Размак између слова", - "lineHeight": "Висина линије", - "cursorStyle": "Стил курсора", - "cursorBlink": "Трептање курсора", - "scrollbackBuffer": "Бафер за померање уназад", - "bellStyle": "Стил звона", - "rightClickSelectsWord": "Десни клик бира реч", - "fastScrollModifier": "Модификатор брзог скроловања", - "fastScrollSensitivity": "Осетљивост брзог скроловања", - "sshAgentForwarding": "Прослеђивање SSH агента", - "backspaceMode": "Режим брзе плоче", - "startupSnippet": "Исечак за покретање", - "selectSnippet": "Изаберите исечак", - "forceKeyboardInteractive": "Присилна интерактивност тастатуре", - "overrideCredentialUsername": "Замени корисничко име за акредитиве", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Користите корисничко име наведено горе уместо корисничког имена акредитива", - "jumpHostChain": "Скок ланца хоста", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Лук Нокинг", "addKnock": "Додај порт", "addProxyNode": "Додај чвор", - "proxyNode": "Прокси чвор", - "proxyType": "Тип проксија", - "quickActions": "Брзе акције", - "sudoPasswordAutoFill": "Аутоматско попуњавање лозинке за Судо", - "sudoPassword": "Судо лозинка", - "keepaliveInterval": "Интервал одржавања активности (ms)", - "moshCommand": "MOSH команда", - "environmentVariables": "Променљиве окружења", - "addVariable": "Додај променљиву", - "docker": "Докер", - "copyTerminalUrl": "Копирај URL терминала", - "copyFileManagerUrl": "Копирај URL менаџера датотека", - "copyRemoteDesktopUrl": "Копирај URL адресу удаљене радне површине", - "failedToConnect": "Повезивање са конзолом није успело", - "connect": "Повежи се", - "disconnect": "Прекини везу", - "start": "Почетак", - "enableStatusCheck": "Омогући проверу статуса", - "enableMetrics": "Омогући метрике", - "bulkUpdateFailed": "Групно ажурирање није успело", - "selectAll": "Изабери све", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Поништи избор свих", "protocols": "Протоколи", "secureShell": "Безбедна шкољка", @@ -272,6 +303,9 @@ "unencryptedShell": "Нешифрована љуска", "addressIp": "Адреса / ИП", "friendlyName": "Пријатељско име", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Фолдер и напредно", "privateNotes": "Приватне белешке", "privateNotesPlaceholder": "Детаљи о овом серверу...", @@ -281,18 +315,18 @@ "addKnockBtn": "Додај куцање", "noPortKnocking": "Није конфигурисано пребацивање портова на другу страну (port knocking).", "knockPort": "Нок Порт", - "protocol": "Протокол", + "protocol": "Protocol", "delayAfterMs": "Кашњење после (ms)", "useSocks5Proxy": "Користите SOCKS5 прокси", "useSocks5ProxyDesc": "Усмерите везу преко прокси сервера", - "proxyHost": "Прокси хост", - "proxyPort": "Прокси порт", - "proxyUsername": "Корисничко име проксија", - "proxyPassword": "Лозинка проксија", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Један прокси", - "proxyChainMode": "Прокси ланац", + "proxyChainMode": "Proxy Chain", "you": "Ти", - "jumpHostChainLabel": "Скок ланца хоста", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Додај скок", "noJumpHosts": "Није конфигурисан ниједан хост за прелазак.", "selectAServer": "Изаберите сервер...", @@ -300,10 +334,10 @@ "authMethod": "Метода овлашћења", "storedCredential": "Сачувани акредитив", "selectACredential": "Изаберите акредитив...", - "keyTypeLabel": "Тип кључа", - "keyTypeAuto": "Аутоматско откривање", - "keyPasteTab": "Залепи", - "keyUploadTab": "Отпреми", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Кључна датотека је учитана", "keyUploadClick": "Кликните да бисте отпремили .pem / .key / .ppk", "clearKey": "Обриши тастер", @@ -311,59 +345,105 @@ "keyReplaceNotice": "Налепите нови кључ испод да бисте га заменили", "keyPassphraseSaved": "Лозинка је сачувана, унесите текст да бисте је променили", "replaceKey": "Замените кључ", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Присилна интерактивност тастатуре", "forceKeyboardInteractiveShortDesc": "Присилите ручни унос лозинке чак и ако су кључеви присутни", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Изглед терминала", "colorTheme": "Тема боја", - "fontFamilyLabel": "Породица фонтова", - "fontSizeLabel": "Величина фонта", - "cursorStyleLabel": "Стил курсора", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Размак између слова (px)", - "lineHeightLabel": "Висина линије", - "bellStyleLabel": "Стил звона", - "backspaceModeLabel": "Режим брзе плоче", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Курсор трепери", "cursorBlinkingDesc": "Омогући трепћућу анимацију за курсор терминала", "rightClickSelectsWordLabel": "Десни клик бира реч", "rightClickSelectsWordShortDesc": "Изаберите реч испод курсора кликом десним тастером миша", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Истицање синтаксе", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Временске ознаке", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Понашање и напредно", - "scrollbackBufferLabel": "Бафер за померање уназад", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Максималан број линија сачуваних у историји", - "sshAgentForwardingLabel": "Прослеђивање SSH агента", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Проследите своје локалне SSH кључеве овом хосту", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Омогући аутоматско покретање", "enableAutoMoshDesc": "Преферирај Mosh у односу на SSH ако је доступан", "enableAutoTmux": "Омогући аутоматски Tmux", "enableAutoTmuxDesc": "Аутоматски покрени или прикључи се tmux сесији", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Аутоматско попуњавање лозинке за Sudo", "sudoPasswordAutoFillShortDesc": "Аутоматски унесите лозинку за судо када се то затражи", - "sudoPasswordLabel": "Судо лозинка", - "environmentVariablesLabel": "Променљиве окружења", - "addVariableBtn": "Додај променљиву", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Ниједна променљива окружења није конфигурисана.", - "fastScrollModifierLabel": "Модификатор брзог скроловања", - "fastScrollSensitivityLabel": "Осетљивост брзог скроловања", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Мош команда", - "startupSnippetLabel": "Исечак за покретање", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Интервал одржавања активности (секунде)", "maxKeepaliveMisses": "Максимални промашаји у Keepalive-у", "tunnelSettings": "Подешавања тунела", "enableTunneling": "Омогући тунелирање", "enableTunnelingDesc": "Омогући функционалност SSH тунела за овај хост", "serverTunnelsSection": "Серверски тунели", - "addTunnelBtn": "Додај тунел", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Није конфигурисан ниједан тунел.", - "tunnelLabel": "Тунел {{number}}", - "tunnelType": "Тип тунела", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Прослеђује локални порт на порт на удаљеном серверу (или хосту који је доступан са њега).", "tunnelModeRemoteDesc": "Проследите порт на удаљеном серверу назад на локални порт на вашој машини.", "tunnelModeDynamicDesc": "Направите SOCKS5 прокси на локалном порту за динамичко прослеђивање портова.", "sameHost": "Овај хост (директни тунел)", "endpointHost": "Крајњи хост", - "endpointPort": "Порт крајње тачке", + "endpointPort": "Endpoint Port", "bindHost": "Повежи хост", - "sourcePort": "Изворни порт", - "maxRetries": "Максималан број поновних покушаја", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Интервал поновног покушаја (s)", "autoStartLabel": "Аутоматско покретање", "autoStartDesc": "Аутоматски повежи овај тунел када се хост учита", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Повезивање није успело", "failedToDisconnectTunnel": "Прекид везе није успео", "dockerIntegration": "Интеграција Докера", - "enableDockerMonitor": "Омогући Докер", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Пратите и управљајте контејнерима на овом хосту путем Докера", - "enableFileManagerMonitor": "Омогући менаџер датотека", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Прегледајте и управљајте датотекама на овом хосту преко SFTP-а", - "defaultPathLabel": "Подразумевана путања", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "Директоријум који треба отворити када се покрене менаџер датотека за овај хост.", - "statusChecksLabel": "Провере статуса", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Омогући провере статуса", "enableStatusChecksDesc": "Периодично пингујте овај хост да бисте проверили доступност", "useGlobalInterval": "Користи глобални интервал", "useGlobalIntervalDesc": "Замени интервал провере статуса на нивоу сервера", "checkIntervalS": "Интервал провере(е)", "checkIntervalDesc": "Секунде између сваког пинга за повезивање", - "metricsCollectionLabel": "Колекција метрика", - "enableMetricsLabel": "Омогући метрике", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Прикупљајте податке о коришћењу процесора, RAM-а, диска и мреже са овог хоста", "useGlobalMetrics": "Користи глобални интервал", "useGlobalMetricsDesc": "Замени интервалом метрика на нивоу сервера", "metricsIntervalS": "Интервал(и) метрика", "metricsIntervalDesc2": "Секунде између снимака метрика", "visibleWidgets": "Видљиви виџети", - "cpuUsageLabel": "Искоришћеност процесора", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "Проценат процесора, просечно оптерећење, графикон са блистер кривином", - "memoryLabel": "Коришћење меморије", + "memoryLabel": "Memory Usage", "memoryDesc": "Коришћење РАМ-а, размена, кеширана меморија", - "storageLabel": "Искоришћеност диска", + "storageLabel": "Disk Usage", "storageDesc": "Коришћење диска по тачки монтирања", - "networkLabel": "Мрежни интерфејси", + "networkLabel": "Network Interfaces", "networkDesc": "Листа интерфејса и пропусни опсег", - "uptimeLabel": "Време непрекидног рада", + "uptimeLabel": "Uptime", "uptimeDesc": "Време рада система и време покретања", "systemInfoLabel": "Информације о систему", "systemInfoDesc": "ОС, језгро, име хоста, архитектура", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Успешни и неуспешни догађаји пријављивања", "topProcessesLabel": "Најважнији процеси", "topProcessesDesc": "ПИД, ЦПУ%, МЕМОРИЈА%, команда", - "listeningPortsLabel": "Портови за слушање", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Отворени портови са процесом и стањем", - "firewallLabel": "Заштитни зид (фајервол)", + "firewallLabel": "Firewall", "firewallDesc": "Статус заштитног зида, AppArmor-а, SELinux-а", - "quickActionsLabel": "Брзе акције", - "quickActionsToolbar": "Брзе акције се појављују као дугмад у траци са алаткама Статистика сервера за извршавање команди једним кликом.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Још нема брзих акција.", "buttonLabel": "Ознака дугмета", "selectSnippetPlaceholder": "Изаберите исечак...", "addActionBtn": "Додај акцију", "hostSharedSuccessfully": "Хост је успешно дељен", - "failedToShareHost": "Дељење хоста није успело", + "failedToShareHost": "Failed to share host", "accessRevoked": "Приступ је опозван", - "failedToRevokeAccess": "Опозивање приступа није успело", - "cancelBtn": "Откажи", - "savingBtn": "Чување...", - "addHostBtn": "Додај хоста", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Хост је ажуриран", "hostCreated": "Хост је креиран", "failedToSave": "Чување хоста није успело", "credentialUpdated": "Акредитив је ажуриран", "credentialCreated": "Акредитив је креиран", - "failedToSaveCredential": "Чување акредитива није успело", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Назад на хостове", "backToCredentials": "Назад на акредитиве", - "pinned": "Закачено", - "noHostsFound": "Нису пронађени хостови", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Пробајте други термин", "addFirstHost": "Додајте свог првог хоста да бисте започели", "noCredentialsFound": "Нису пронађени акредитиви", - "addCredentialBtn": "Додај акредитив", - "updateCredentialBtn": "Ажурирај акредитив", - "features": "Карактеристике", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Нема фасцикле)", - "deleteSelected": "Обриши", + "deleteSelected": "Delete", "exitSelection": "Излаз из селекције", - "importSkip": "Увези (прескочи постојеће)", + "importSkip": "Import (skip existing)", "importOverwrite": "Увези (препиши)", "collapseBtn": "Склопи", "importExportBtn": "Увоз / Извоз", "hostStatusesRefreshed": "Статуси хоста освежени", "failedToRefreshHosts": "Освежавање хостова није успело", - "movedHostTo": "Премештено {{host}} у „{{folder}}“", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Премештање хоста није успело", - "folderRenamedTo": "Фасцикла је преименована у „{{name}}“", - "deletedFolder": "Обрисана фасцикла „{{name}}“", - "failedToDeleteFolder": "Брисање фасцикле није успело", - "deleteAllInFolder": "Обрисати све хостове у „{{name}}“? Ово се не може поништити.", - "deletedHost": "Обрисано {{name}}", - "copiedToClipboard": "Копирано у међуспремник", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Уреди фасциклу", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Уреди фасциклу", + "deleteFolder": "Обриши фасциклу", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Премештање хостова није успело", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "URL терминала је копиран", "fileManagerUrlCopied": "URL менаџера датотека је копиран", "tunnelUrlCopied": "URL тунела је копиран", "dockerUrlCopied": "URL адреса Докера је копирана", - "serverStatsUrlCopied": "URL за статистику сервера је копиран", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP URL је копиран", "vncUrlCopied": "VNC URL је копиран", "telnetUrlCopied": "УРЛ адреса Телнета је копирана", @@ -471,109 +633,112 @@ "expandActions": "Прошири акције", "collapseActions": "Скупи радње", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Магични пакет послат на {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Слање магичног пакета није успело", - "cloneHostAction": "Клонирај хост", + "cloneHostAction": "Clone Host", "copyAddress": "Копирај адресу", "copyLink": "Копирај линк", - "copyTerminalUrlAction": "Копирај URL терминала", - "copyFileManagerUrlAction": "Копирај URL менаџера датотека", - "copyTunnelUrlAction": "Копирај URL тунела", - "copyDockerUrlAction": "Копирај Докер УРЛ", - "copyServerStatsUrlAction": "Копирај URL статистике сервера", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "Копирај RDP URL", "copyVncUrlAction": "Копирај VNC URL", "copyTelnetUrlAction": "Копирај Telnet URL", - "copyRemoteDesktopUrlAction": "Копирај URL адресу удаљене радне површине", - "deleteCredentialConfirm": "Обришите акредитив „{{name}}“?", - "deletedCredential": "Обрисано {{name}}", - "deploySSHKeyTitle": "Примена SSH кључа", - "deployingBtn": "Распоређивање...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Распореди", "failedToDeployKey": "Примена кључа није успела", - "deleteHostsConfirm": "Обриши {{count}} хост{{plural}}? Ово се не може поништити.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Премештено у корен", - "failedToMoveHosts": "Премештање хостова није успело", - "enableTerminalFeature": "Омогући терминал", - "disableTerminalFeature": "Онемогући терминал", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Омогући датотеке", "disableFilesFeature": "Онемогући датотеке", "enableTunnelsFeature": "Омогући тунеле", "disableTunnelsFeature": "Онемогући тунеле", - "enableDockerFeature": "Омогући Докер", - "disableDockerFeature": "Онемогући Докер", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Додај ознаке...", "authDetails": "Детаљи аутентификације", - "credType": "Тип", + "credType": "Type", "generateKeyPairDesc": "Генеришите нови пар кључева, и приватни и јавни кључеви ће бити аутоматски попуњени.", "generatingKey": "Генерисање...", - "generateLabel": "Генериши {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Отпреми датотеку", "keyPassphraseOptional": "Кључна лозинка (опционо)", "sshPublicKeyOptional": "SSH јавни кључ (опционо)", "publicKeyGenerated": "Јавни кључ генерисан", "failedToGeneratePublicKey": "Извођење јавног кључа није успело", "publicKeyCopied": "Јавни кључ је копиран", - "keyPairGenerated": "{{label}} генерисан пар кључева", - "failedToGenerateKeyPair": "Генерисање пара кључева није успело", - "searchHostsPlaceholder": "Претрага хостова, адреса, ознака…", - "searchCredentialsPlaceholder": "Претрага акредитива…", - "refreshBtn": "Освежи", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Додај ознаке...", - "deleteConfirmBtn": "Обриши", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH сервер мора имати подешена подешавања за GatewayPorts, AllowTcpForwarding и PermitRootLogin у /etc/ssh/sshd_config.", - "deleteHostConfirm": "Обрисати „{{name}}“?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Омогућите барем један протокол изнад да бисте конфигурисали подешавања аутентификације и повезивања.", - "keyPassphrase": "Кључна лозинка", - "connectBtn": "Повежи се", - "disconnectBtn": "Прекини везу", - "basicInformation": "Основне информације", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Детаљи аутентификације", - "credTypeLabel": "Тип", - "hostsTab": "Домаћини", - "credentialsTab": "Акредитиви", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Изаберите више", "selectHosts": "Изаберите хостове", - "connectionLabel": "Веза", - "authenticationLabel": "Аутентификација", - "generateKeyPairTitle": "Генериши пар кључева", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Генеришите нови пар кључева, и приватни и јавни кључеви ће бити аутоматски попуњени.", - "generateFromPrivateKey": "Генериши из приватног кључа", - "refreshBtn2": "Освежи", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Излаз из селекције", "exportAll": "Извези све", - "addHostBtn2": "Додај хоста", - "addCredentialBtn2": "Додај акредитив", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Провера статуса хоста...", - "pinnedSection": "Закачено", + "pinnedSection": "Pinned", "hostsExported": "Хостови су успешно извезени", "exportFailed": "Извоз хостова није успео", "sampleDownloaded": "Пример датотеке је преузет", - "failedToDeleteCredential2": "Брисање акредитива није успело", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Нема фасцикле)", - "nSelected": "{{count}} изабрано", - "featuresMenu": "Карактеристике", - "moveMenu": "Помери", - "cancelSelection": "Откажи", - "deployDialogDesc": "Распореди {{name}} на authorized_keys хоста.", - "targetHostLabel": "Циљни хост", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Изаберите хост...", "keyDeployedSuccess": "Кључ је успешно распоређен", "failedToDeployKey2": "Примена кључа није успела", - "deletedCount": "Обрисани {{count}} хостови", - "failedToDeleteCount": "Брисање {{count}} хостова није успело", - "duplicatedHost": "Дуплирано „{{name}}“", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Дуплирање хоста није успело", - "updatedCount": "Ажурирани {{count}} хостови", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Пријатељско име", - "descriptionLabel": "Опис", + "descriptionLabel": "Description", "loadingHost": "Учитавање хоста...", - "loadingHosts": "Учитавање хостова...", - "loadingCredentials": "Учитавање акредитива...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Још нема домаћина", - "noHostsMatchSearch": "Ниједан хост не одговара вашој претрази", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Хост није пронађен", - "searchHosts": "Претражи хостове...", + "searchHosts": "Search hosts...", "sortHosts": "Сортирај хостове", "sortDefault": "Подразумевани редослед", "sortNameAsc": "Име (А → Ш)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "Прво закачено", "filterHosts": "Филтрирај хостове", "filterClearAll": "Обриши филтере", - "filterStatusGroup": "Статус", - "filterOnline": "Онлајн", - "filterOffline": "Офлајн", - "filterPinned": "Закачено", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "Тип овлашћења", - "filterAuthPassword": "Лозинка", - "filterAuthKey": "SSH кључ", - "filterAuthCredential": "Акредитив", - "filterAuthNone": "Ниједан", - "filterAuthOpkssh": "ОПКШ", - "filterProtocolGroup": "Протокол", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", + "filterAuthOpkssh": "OPKSSH", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", - "filterProtocolRdp": "РДП", + "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", - "filterProtocolTelnet": "Телнет", - "filterFeaturesGroup": "Карактеристике", - "filterFeatureTerminal": "Терминал", - "filterFeatureFileManager": "Менаџер датотека", - "filterFeatureTunnel": "Тунел", - "filterFeatureDocker": "Докер", - "filterTagsGroup": "Ознаке", - "shareHost": "Дели хост", - "shareHostTitle": "Подели: {{name}}", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Овај хост мора да користи акредитив да би омогућио дељење. Прво измените хост и доделите акредитив." }, "guac": { - "connection": "Веза", - "authentication": "Аутентификација", - "connectionSettings": "Подешавања везе", - "displaySettings": "Подешавања екрана", - "audioSettings": "Подешавања звука", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Сачувани акредитив", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Метода овлашћења", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Изаберите акредитив...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "Перформансе РДП-а", - "deviceRedirection": "Преусмеравање уређаја", - "session": "Сесија", - "gateway": "Капија", - "remoteApp": "Удаљена апликација", - "clipboard": "Међуспремник", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "Снимање сесије", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC подешавања", - "terminalSettings": "Подешавања терминала", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "РДП порт", - "username": "Корисничко име", - "password": "Лозинка", - "domain": "Домен", - "securityMode": "Безбедносни режим", - "colorDepth": "Дубина боје", - "width": "Ширина", - "height": "Висина", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Метод промене величине", - "clientName": "Име клијента", - "initialProgram": "Почетни програм", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Распоред сервера", - "timezone": "Временска зона", - "gatewayHostname": "Име хоста мрежног пролаза", - "gatewayPort": "Порт за пролаз", - "gatewayUsername": "Корисничко име на гејтвеју", - "gatewayPassword": "Лозинка за пролаз", - "gatewayDomain": "Домен капије", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "Програм RemoteApp", "workingDirectory": "Радни директоријум", "arguments": "Аргументи", "normalizeLineEndings": "Нормализуј завршетке линија", - "recordingPath": "Путања снимања", - "recordingName": "Назив снимка", - "macAddress": "MAC адреса", - "broadcastAddress": "Адреса за емитовање", - "udpPort": "UDP порт", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Време чекања (s)", - "driveName": "Назив диска", - "drivePath": "Путања диска", - "ignoreCertificate": "Игнориши сертификат", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Дозволи везе са хостовима са самопотписаним сертификатима", - "forceLossless": "Присилно без губитака", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Присилно кодирање слике без губитака (виши квалитет, већи пропусни опсег)", - "disableAudio": "Онемогући звук", + "disableAudio": "Disable Audio", "disableAudioDesc": "Искључите сав звук из удаљене сесије", "enableAudioInput": "Омогући аудио улаз (микрофон)", "enableAudioInputDesc": "Прослеђивање локалног микрофона на удаљену сесију", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Омогући ефекте Aero Glass-а", "menuAnimations": "Анимације менија", "menuAnimationsDesc": "Омогући анимације постепеног постепеног померања менија и слајдова", - "disableBitmapCaching": "Онемогући кеширање битмапа", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Искључите кеш битмапа (може помоћи код грешака)", - "disableOffscreenCaching": "Онемогући кеширање ван екрана", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Искључите кеш меморију ван екрана", - "disableGlyphCaching": "Онемогући кеширање глифова", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Искључите кеш глифова", - "enableGfx": "Омогући графичке ефекте", + "enableGfx": "Enable GFX", "enableGfxDesc": "Користите графички цевовод RemoteFX", - "enablePrinting": "Омогући штампање", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Преусмерите локалне штампаче на удаљену сесију", - "enableDriveRedirection": "Омогући преусмеравање диска", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Мапирајте локалну фасциклу као диск у удаљеној сесији", - "createDrivePath": "Креирај путању диска", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Аутоматски креирај фасциклу ако не постоји", - "disableDownload": "Онемогући преузимање", + "disableDownload": "Disable Download", "disableDownloadDesc": "Спречите преузимање датотека са удаљене сесије", - "disableUpload": "Онемогући отпремање", + "disableUpload": "Disable Upload", "disableUploadDesc": "Спречите отпремање датотека на удаљену сесију", - "enableTouch": "Омогући додир", + "enableTouch": "Enable Touch", "enableTouchDesc": "Омогући преусмеравање уноса додиром", - "consoleSession": "Конзолна сесија", + "consoleSession": "Console Session", "consoleSessionDesc": "Повежите се са конзолом (сесија 0) уместо нове сесије", "sendWolPacket": "Пошаљи WOL пакет", "sendWolPacketDesc": "Пошаљите магични пакет да пробудите овај хост пре повезивања", - "disableCopy": "Онемогући копирање", + "disableCopy": "Disable Copy", "disableCopyDesc": "Спречите копирање текста из удаљене сесије", - "disablePaste": "Онемогући лепљење", + "disablePaste": "Disable Paste", "disablePasteDesc": "Спречите лепљење текста у удаљену сесију", "createPathIfMissing": "Креирај путању ако недостаје", "createPathIfMissingDesc": "Аутоматски креирајте директоријум за снимање", - "excludeOutput": "Искључи излаз", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Не снимај излаз екрана (само метаподаци)", - "excludeMouse": "Искључи миш", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Не снимај покрете миша", "includeKeystrokes": "Укључи притиске на тастатури", "includeKeystrokesDesc": "Снимање сирових притиска тастера поред излаза на екран", @@ -718,102 +896,105 @@ "vncPassword": "VNC лозинка", "vncUsernameOptional": "Корисничко име (опционо)", "vncLeaveBlank": "Оставите празно ако није потребно", - "cursorMode": "Режим курсора", - "swapRedBlue": "Замена црвене/плаве", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Замена црвених и плавих канала боја (решава неке проблеме са бојама)", "readOnly": "Само за читање", "readOnlyDesc": "Погледајте удаљени екран без слања било каквог уноса", "telnetPort": "Телнет порт", - "terminalType": "Тип терминала", - "fontName": "Назив фонта", - "fontSize": "Величина фонта", - "colorScheme": "Шема боја", - "backspaceKey": "Тастер Backspace", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Прво сачувајте домаћина.", "sharingOptionsAfterSave": "Опције дељења су доступне након што је хост сачуван.", "sharingLoadError": "Учитавање података за дељење није успело. Проверите везу и покушајте поново.", - "shareHostSection": "Дели хост", - "shareWithUser": "Подели са корисником", - "shareWithRole": "Дели са улогом", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Изаберите корисника", - "selectRole": "Изаберите улогу", + "selectRole": "Select Role", "selectUserOption": "Изаберите корисника...", "selectRoleOption": "Изаберите улогу...", - "permissionLevel": "Ниво дозволе", + "permissionLevel": "Permission Level", "expiresInHours": "Истиче за (сати)", "noExpiryPlaceholder": "Оставите празно ако нема рока истека", - "shareBtn": "Дели", - "currentAccess": "Тренутни приступ", - "typeHeader": "Тип", - "targetHeader": "Циљ", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "Дозвола", - "grantedByHeader": "Доделио/ла", - "expiresHeader": "Истиче", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Још нема уноса за приступ.", - "expiredLabel": "Истекло", - "neverLabel": "Никад", - "revokeBtn": "Поништи", - "cancelBtn": "Откажи", - "savingBtn": "Чување...", - "updateHostBtn": "Ажурирај хост", - "addHostBtn": "Додај хоста" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Претражите хостове, команде или подешавања...", - "quickActions": "Брзе акције", - "hostManager": "Менаџер домаћина", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Управљајте, додајте или измените хостове", "addNewHost": "Додај новог хоста", "addNewHostDesc": "Региструјте новог хоста", - "adminSettings": "Администраторска подешавања", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Конфигуришите системске поставке и кориснике", - "userProfile": "Кориснички профил", + "userProfile": "User Profile", "userProfileDesc": "Управљајте својим налогом и подешавањима", - "addCredential": "Додај акредитив", + "addCredential": "Add Credential", "addCredentialDesc": "Чувајте SSH кључеве или лозинке", - "recentActivity": "Недавне активности", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Сервери и хостови", - "noHostsFound": "Није пронађен ниједан хост који одговара „{{search}}“", - "links": "Линкови", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Навигација", - "select": "Изаберите", + "select": "Select", "toggleWith": "Укључи/искључи" }, "splitScreen": { - "paneEmpty": "Окно {{index}} - празно", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Није додељен таб", "focusedPane": "Активни панел" }, "connections": { "noConnections": "Нема веза", "noConnectionsDesc": "Отворите терминал, менаџер датотека или удаљену радну површину да бисте видели везе овде", - "connectedFor": "Повезано за {{duration}}", - "connected": "Повезано", - "disconnected": "Искључено", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Затвори картицу", "closeConnection": "Затвори везу", "forgetTab": "Заборави", - "removeBackground": "Уклони", - "reconnect": "Поново се повежите", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Поново отвори", "sectionOpen": "Отворено", "sectionBackground": "Позадина", "backgroundDesc": "Сесије трају 30 минута након прекида везе и могу се поново повезати.", "persisted": "Истрајало у позадини", - "expiresIn": "Истиче за {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Претражи везе...", - "noSearchResults": "Ниједна веза не одговара вашој претрази" + "noSearchResults": "Ниједна веза не одговара вашој претрази", + "rename": "Rename session" }, "guacamole": { - "connecting": "Повезивање са {{type}} сесијом...", - "connectionError": "Грешка у повезивању", - "connectionFailed": "Повезивање није успело", - "failedToConnect": "Није успело добијање токена за повезивање", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Хост није пронађен", - "noHostSelected": "Није изабран домаћин", - "reconnect": "Поново се повежите", - "retry": "Покушај поново", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "Услуга удаљеног рачунара (guacd) није доступна. Молимо вас да се уверите да је guacd покренут, доступан и правилно конфигурисан у администраторским подешавањима.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "Win+L (Закључавање екрана)", "winKey": "Windows тастер", "ctrl": "Ctrl", - "alt": "Алтернативно", - "shift": "Померање", + "alt": "Alt", + "shift": "Shift", "win": "Победа", - "stickyActive": "{{key}} (закључано - кликните да бисте отпустили)", - "stickyInactive": "{{key}} (кликните да бисте закључали)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Бег", "tab": "Таб", - "home": "Дом", + "home": "Home", "end": "Крај", "pageUp": "Страница нагоре", "pageDown": "Страница надоле", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Повежи се са хостом", - "clear": "Јасно", - "paste": "Залепи", - "reconnect": "Поново се повежите", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Веза је прекинута", - "connected": "Повезано", - "clipboardWriteFailed": "Копирање у међуспремник није успело. Уверите се да се страница приказује преко HTTPS-а или localhost-а.", - "clipboardReadFailed": "Читање из међуспремника није успело. Уверите се да су дозволе за међуспремник одобрене.", - "clipboardHttpWarning": "Лепљење захтева HTTPS. Користите Ctrl+Shift+V или послужите Termix преко HTTPS-а.", - "unknownError": "Дошло је до непознате грешке", - "websocketError": "Грешка при повезивању са WebSocket-ом", - "connecting": "Повезивање...", - "noHostSelected": "Није изабран домаћин", - "reconnecting": "Поновно повезивање... ({{attempt}}/{{max}})", - "reconnected": "Поново повезано успешно", - "tmuxSessionCreated": "tmux сесија креирана: {{name}}", - "tmuxSessionAttached": "приложена tmux сесија: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux није инсталиран на удаљеном хосту, враћа се на стандардну љуску", "tmuxSessionPickerTitle": "tmux сесије", "tmuxSessionPickerDesc": "Постојеће tmux сесије су пронађене на овом хосту. Изаберите једну да бисте је поново повезали или креирали нову сесију.", - "tmuxWindows": "Прозори", - "tmuxWindowCount": "{{count}} прозор", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Прикључени клијенти", - "tmuxAttachedCount": "{{count}} приложено", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Последња активност", "tmuxTimeJustNow": "управо сада", - "tmuxTimeMinutes": "{{count}}пре мин", - "tmuxTimeHours": "{{count}}пре сати", - "tmuxTimeDays": "{{count}}пре д", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Започни нову сесију", "tmuxCopyHint": "Прилагодите избор и притисните Ентер да бисте копирали у међуспремник", "tmuxDetach": "Одвоји се од tmux сесије", "tmuxDetached": "Одвојено од tmux сесије", - "maxReconnectAttemptsReached": "Достигнут је максималан број покушаја поновног повезивања", - "closeTab": "Затвори", - "connectionTimeout": "Временско ограничење везе", - "terminalTitle": "Терминал - {{host}}", - "terminalWithPath": "Терминал - {{host}}:{{path}}", - "runTitle": "Покреће се {{command}} - {{host}}", - "totpRequired": "Потребна је двофакторска аутентификација", - "totpCodeLabel": "Верификациони код", - "totpVerify": "Верификуј", - "warpgateAuthRequired": "Потребна је аутентификација Варпгејта", - "warpgateSecurityKey": "Безбедносни кључ", - "warpgateAuthUrl": "URL адреса за аутентификацију", - "warpgateOpenBrowser": "Отвори у прегледачу", - "warpgateContinue": "Завршио/ла сам аутентификацију", - "opksshAuthRequired": "Потребна је аутентификација OPKSSH", - "opksshAuthDescription": "Завршите аутентификацију у прегледачу да бисте наставили. Ова сесија ће остати важећа 24 сата.", - "opksshOpenBrowser": "Отворите прегледач за аутентификацију", - "opksshWaitingForAuth": "Чекање аутентификације у прегледачу...", - "opksshAuthenticating": "Обрада аутентификације...", - "opksshTimeout": "Временско ограничење за аутентификацију је истекло. Молимо покушајте поново.", - "opksshAuthFailed": "Аутентификација није успела. Проверите своје акредитиве и покушајте поново.", - "opksshSignInWith": "Пријавите се са {{provider}}", - "sudoPasswordPopupTitle": "Унети лозинку?", - "websocketAbnormalClose": "Веза је неочекивано прекинута. Ово може бити због проблема са обрнутим проксијем или SSL конфигурацијом. Молимо вас да проверите логове сервера.", - "connectionLogTitle": "Дневник везе", - "connectionLogCopy": "Копирајте логове у међуспремник", - "connectionLogEmpty": "Још нема евиденција веза", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Отворено", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Чекање евиденције везе...", - "connectionLogCopied": "Дневници веза копирани у међуспремник", - "connectionLogCopyFailed": "Копирање логова у међуспремник није успело", - "connectionRejected": "Сервер је одбио везу. Проверите аутентификацију и конфигурацију мреже.", - "hostKeyRejected": "Верификација SSH кључа хоста је одбијена. Веза је отказана.", - "sessionTakenOver": "Сесија је отворена у другој картици. Поновно повезивање..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Подели картицу", + "addToSplit": "Додај у Сплит", + "removeFromSplit": "Уклони из Сплита" + } }, "fileManager": { - "noHostSelected": "Није изабран домаћин", + "noHostSelected": "No host selected", "initializingEditor": "Иницијализација уређивача...", - "file": "Датотека", - "folder": "Фасцикла", - "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": "Преименуј", - "uploading": "Отпремање...", - "uploadingFile": "Отпремање {{name}}...", - "fileName": "Име датотеке", - "folderName": "Назив фасцикле", - "fileUploadedSuccessfully": "Датотека „{{name}}“ је успешно отпремљена", - "failedToUploadFile": "Отпремање датотеке није успело", - "fileDownloadedSuccessfully": "Датотека „{{name}}“ је успешно преузета", - "failedToDownloadFile": "Преузимање датотеке није успело", - "fileCreatedSuccessfully": "Датотека „{{name}}“ је успешно креирана", - "folderCreatedSuccessfully": "Фасцикла „{{name}}“ је успешно креирана", - "failedToCreateItem": "Није успело креирање ставке", - "operationFailed": "Операција {{operation}} није успела за {{name}}: {{error}}", - "failedToResolveSymlink": "Није успело решавање симболичке везе", - "itemsDeletedSuccessfully": "{{count}} ставке су успешно обрисане", - "failedToDeleteItems": "Брисање ставки није успело", - "sudoPasswordRequired": "Потребна је администраторска лозинка", - "enterSudoPassword": "Унесите лозинку за судо да бисте наставили ову операцију", - "sudoPassword": "Sudo лозинка", - "sudoOperationFailed": "Sudo операција није успела", - "sudoAuthFailed": "Судо аутентификација није успела", - "dragFilesToUpload": "Отпустите датотеке овде да бисте их отпремили", - "emptyFolder": "Ова фасцикла је празна", - "searchFiles": "Претражи датотеке...", - "upload": "Отпреми", - "selectHostToStart": "Изаберите хост да бисте започели управљање датотекама", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "Менаџер датотека захтева SSH. Овај хост нема омогућен SSH.", - "failedToConnect": "Повезивање са SSH-ом није успело", - "failedToLoadDirectory": "Учитавање директоријума није успело", - "noSSHConnection": "SSH веза није доступна", - "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}}?", - "permissionDenied": "Дозвола одбијена", - "serverError": "Грешка сервера", - "fileSavedSuccessfully": "Датотека је успешно сачувана", - "failedToSaveFile": "Чување датотеке није успело", - "confirmDeleteSingleItem": "Да ли сте сигурни да желите трајно да избришете „{{name}}“?", - "confirmDeleteMultipleItems": "Да ли сте сигурни да желите трајно да избришете {{count}} ставке?", - "confirmDeleteMultipleItemsWithFolders": "Да ли сте сигурни да желите трајно да избришете {{count}} ставке? Ово укључује фасцикле и њихов садржај.", - "confirmDeleteFolder": "Да ли сте сигурни да желите трајно да избришете фасциклу „{{name}}“ и сав њен садржај?", - "permanentDeleteWarning": "Ова радња се не може поништити. Ставка(е) ће бити трајно избрисане са сервера.", - "recent": "Недавно", - "pinned": "Закачено", - "folderShortcuts": "Пречице за фасцикле", - "failedToReconnectSSH": "Поновно повезивање SSH сесије није успело", - "openTerminalHere": "Отвори терминал овде", - "run": "Трчи", - "openTerminalInFolder": "Отвори терминал у овој фасцикли", - "openTerminalInFileLocation": "Отвори терминал на локацији датотеке", - "runningFile": "Трчање - {{file}}", - "onlyRunExecutableFiles": "Може покренути само извршне датотеке", - "directories": "Директоријуми", - "removedFromRecentFiles": "Уклоњено је „{{name}}“ из недавних датотека", - "removeFailed": "Уклањање није успело", - "unpinnedSuccessfully": "Откачено „{{name}}“ успешно", - "unpinFailed": "Откачивање није успело", - "removedShortcut": "Уклоњена је пречица „{{name}}“", - "removeShortcutFailed": "Уклањање пречице није успело", - "clearedAllRecentFiles": "Обрисани су сви недавно објављени фајлови", - "clearFailed": "Брисање није успело", - "removeFromRecentFiles": "Уклони из недавних датотека", - "clearAllRecentFiles": "Обриши све недавно објављене датотеке", - "unpinFile": "Откачи датотеку", - "removeShortcut": "Уклони пречицу", - "pinFile": "Закачи датотеку", - "addToShortcuts": "Додај у пречице", - "pasteFailed": "Лепљење није успело", - "noUndoableActions": "Нема радњи које се могу поништити", - "undoCopySuccess": "Поништена операција копирања: Обрисано {{count}} копираних датотека", - "undoCopyFailedDelete": "Поништавање није успело: Није могуће обрисати ниједну копирану датотеку", - "undoCopyFailedNoInfo": "Поништавање није успело: Нису пронађене информације о копираној датотеци", - "undoMoveSuccess": "Поништена операција премештања: Премештено {{count}} датотека назад на оригиналну локацију", - "undoMoveFailedMove": "Поништавање није успело: Није могуће вратити датотеке", - "undoMoveFailedNoInfo": "Поништавање није успело: Нису пронађене информације о премештеној датотеци", - "undoDeleteNotSupported": "Брисање се не може поништити: Датотеке су трајно обрисане са сервера", - "undoTypeNotSupported": "Неподржани тип операције поништавања", - "undoOperationFailed": "Поништавање није успело", - "unknownError": "Непозната грешка", - "confirm": "Потврди", - "find": "Пронађи...", - "replace": "Замени", - "downloadInstead": "Преузми уместо тога", - "keyboardShortcuts": "Пречице на тастатури", - "searchAndReplace": "Претражи и замени", - "editing": "Уређивање", - "search": "Претрага", - "findNext": "Пронађи следеће", - "findPrevious": "Пронађи претходно", - "save": "Сачувај", - "selectAll": "Изабери све", - "undo": "Поништи", - "redo": "Понови", - "moveLineUp": "Помери ред нагоре", - "moveLineDown": "Помери ред надоле", - "toggleComment": "Укључи/искључи коментар", - "autoComplete": "Аутоматско довршавање", - "imageLoadError": "Учитавање слике није успело", - "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": "НоваДатотека.txt", - "successfullyMovedItems": "Успешно премештено {{count}} ставки у {{target}}", - "move": "Помери", - "searchInFile": "Претражи у датотеци (Ctrl+F)", - "showKeyboardShortcuts": "Прикажи пречице на тастатури", - "startWritingMarkdown": "Почните да пишете свој садржај у markdown формату...", - "loadingFileComparison": "Учитавање поређења датотека...", - "reload": "Поново учитај", - "compare": "Упореди", - "sideBySide": "Један поред другог", - "inline": "Уграђено", - "fileComparison": "Поређење датотека: {{file1}} наспрам {{file2}}", - "fileTooLarge": "Датотека је превелика: {{error}}", - "sshConnectionFailed": "SSH веза није успела. Молимо вас да проверите везу са {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Учитавање датотеке није успело: {{error}}", - "connecting": "Повезивање...", - "connectedSuccessfully": "Успешно повезано", - "totpVerificationFailed": "Верификација TOTP-а није успела", - "warpgateVerificationFailed": "Аутентификација Варпгејта није успела", - "authenticationFailed": "Аутентификација није успела", - "verificationCodePrompt": "Верификациони код:", - "changePermissions": "Промени дозволе", - "currentPermissions": "Тренутне дозволе", - "owner": "Власник", - "group": "Група", - "others": "Други", - "read": "Читај", - "write": "Пиши", - "execute": "Изврши", - "permissionsChangedSuccessfully": "Дозволе су успешно промењене", - "failedToChangePermissions": "Промена дозвола није успела", - "name": "Име", - "sortByName": "Име", - "sortByDate": "Датум измене", - "sortBySize": "Величина", - "ascending": "Растуће", - "descending": "Опадајући", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Корен", "new": "Ново", "sortBy": "Сортирај по", @@ -1139,20 +1335,20 @@ "editor": "Уредник", "octal": "Октално", "storage": "Складиштење", - "disk": "Диск", - "used": "Коришћено", - "of": "од", - "toggleSidebar": "Укључи/искључи бочну траку", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "Није могуће учитати PDF", "pdfLoadError": "Дошло је до грешке при учитавању ове PDF датотеке.", "loadingPdf": "Учитавање PDF-а...", "loadingPage": "Учитавање странице..." }, "transfer": { - "copyToHost": "Копирај на хост…", - "moveToHost": "Премести на хост…", - "copyItemsToHost": "Копирај {{count}} ставке за хостовање…", - "moveItemsToHost": "Премести {{count}} ставке на хост…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Нема других доступних хостова за управљање датотекама.", "noHostsConnectedHint": "Додајте још један SSH хост са омогућеним File Manager-ом у Host Manager-у.", "selectDestinationHost": "Изаберите одредишни хост", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Прошири недавна одредишта", "browseFolders": "Прегледајте одредишне фасцикле", "browseDestination": "Прегледајте или унесите путању", - "confirmCopy": "Копија", - "confirmMove": "Помери", - "transferring": "Пренос…", - "compressing": "Компресија…", - "extracting": "Издвајање…", - "transferringItems": "Пренос {{current}} од {{total}} ставки…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Пренос завршен", "transferError": "Пренос није успео", - "transferPartial": "Пренос завршен са {{count}} грешака", - "transferPartialHint": "Није могуће пренети: {{paths}}", - "itemsSummary": "{{count}} ставке", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Одредиште мора бити директоријум за преносе више ставки", "selectThisFolder": "Изаберите ову фасциклу", "browsePathWillBeCreated": "Ова фасцикла још увек не постоји. Биће креирана када пренос почне.", "browsePathError": "Није могуће отворити ову путању на одредишном хосту.", "goUp": "Иди горе", - "copyFolderToHost": "Копирај фасциклу на хост…", - "moveFolderToHost": "Премести фасциклу на хост…", - "hostReady": "Спреман", - "hostConnecting": "Повезивање…", - "hostDisconnected": "Није повезано", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Потребна је аутентификација — прво отворите File Manager на овом хосту", - "hostConnectionFailed": "Повезивање није успело", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Времена трансфера", - "metricsPrepare": "Припреми одредиште: {{duration}}", - "metricsCompress": "Компресуј на изворном коду: {{duration}}", - "metricsHopSourceRead": "Извор → сервер: {{throughput}}", - "metricsHopDestSftpWrite": "Сервер → одредиште (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Сервер → одредиште (локално): {{throughput}}", - "metricsTransfer": "Од краја до краја: {{throughput}} ({{duration}})", - "metricsExtract": "Издвајање на одредишту: {{duration}}", - "metricsSourceDelete": "Уклони из извора: {{duration}}", - "metricsTotal": "Укупно: {{duration}}", - "progressCompressing": "Компресија на изворном хосту…", - "progressExtracting": "Распакује се на одредишту…", - "progressTransferring": "Пренос података…", - "progressReconnecting": "Поновно повезивање…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Паралелне траке за прелазак", - "parallelSegmentsOption": "{{count}} траке", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Велике датотеке су подељене на делове од 256 MB. Вишеструке траке користе одвојене везе (као што је покретање неколико преноса) за већи укупни проток.", - "progressTotalSpeed": "{{speed}} укупно ({{lanes}} трака)", - "progressTransferringItems": "Пренос датотека ({{current}} од {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} датотеке", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Изворне датотеке сачуване (делимични пренос)", "jumpHostLimitation": "Оба хоста морају бити доступна са Termix сервера. Директно рутирање од хоста до хоста није подржано.", - "cancel": "Откажи", + "cancel": "Cancel", "methodLabel": "Метод преноса", "methodAuto": "Аутоматски", "methodTar": "Тар архива", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Бира tar или SFTP за сваку датотеку на основу броја датотека, величине и компресибилности. Појединачне датотеке увек користе SFTP за стримовање.", "methodTarHint": "Компресуј на изворном коду, пренеси једну архиву, распакуј на одредишту. Потребан је tar на оба Unix хоста.", "methodItemSftpHint": "Пренесите сваку датотеку појединачно преко SFTP-а. Ради на свим хостовима, укључујући Windows.", - "methodPreviewLoading": "Израчунавање методе преноса…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Није могуће прегледати метод преноса. Сервер ће ипак изабрати метод када покренете.", "methodPreviewWillUseTar": "Користиће се: Тар архива", "methodPreviewWillUseItemSftp": "Користиће се: SFTP за сваку датотеку", - "methodPreviewScanSummary": "{{fileCount}} датотека, {{totalSize}} укупно (скенирано на изворном хосту).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Свака датотека користи исти SFTP ток као и копија појединачних датотека, једна за другом. Напредак се комбинује за све датотеке, тако да се трака помера споро током великих датотека.", "methodReason": { "user_item_sftp": "Изабрали сте SFTP за сваку датотеку.", "user_tar": "Изабрали сте tar архиву.", "tar_unavailable": "Тар није доступан на једном или оба хоста — уместо тога ће се користити SFTP протокол за сваку датотеку.", "windows_host": "Укључен је Windows хост — tar се не користи.", - "auto_multi_large": "Аутоматски: више датотека укључујући велику датотеку ({{largestSize}}) са компресибилним подацима — tar пакети у један пренос.", - "auto_single_large_in_archive": "Аутоматски: једна велика датотека ({{largestSize}}) у овом скупу — SFTP за сваку датотеку.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Аутоматски: углавном несемпљиви подаци — SFTP по датотеци.", - "auto_many_files": "Аутоматски: много датотека ({{fileCount}}) — tar смањује оптерећење по датотеци.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Аутоматски: SFTP за сваку датотеку за овај скуп." }, - "progressCancel": "Откажи", - "progressCancelling": "Отказивање…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Заустављено", "resumedHint": "Поново повезано са активним преносом започетим у другом прозору.", "transferCancelled": "Трансфер отказан", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Неке делимичне датотеке нису могле бити уклоњене", "cleanupDestFilesNothing": "Нема ништа за чишћење на одредишту", "cleanupDestFilesError": "Чишћење није успело", - "retryTransfer": "Покушај поново", + "retryTransfer": "Retry", "retryTransferError": "Поновни покушај није успео", "transferFailedRetryHint": "Делимични подаци су сачувани на одредишту. Покушај ће бити настављен када се веза поново успостави." }, "tunnels": { - "noSshTunnels": "Нема SSH тунела", - "createFirstTunnelMessage": "Још увек нисте креирали ниједан SSH тунел. Конфигуришите тунелске везе у Host Manager-у да бисте започели.", - "connected": "Повезано", - "disconnected": "Искључено", - "connecting": "Повезивање...", - "error": "Грешка", - "canceling": "Отказивање...", - "connect": "Повежи се", - "disconnect": "Прекини везу", - "cancel": "Откажи", - "port": "Лука", - "localPort": "Локални порт", - "remotePort": "Удаљени порт", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Тренутни порт хоста", - "endpointPort": "Порт крајње тачке", + "endpointPort": "Endpoint Port", "bindIp": "Локална ИП адреса", - "endpointSshConfig": "SSH конфигурација крајње тачке", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "SSH хост крајње тачке", "endpointSshHostPlaceholder": "Изаберите конфигурисани хост", "endpointSshHostRequired": "Изаберите SSH хост крајње тачке за сваки клијентски тунел.", - "attempt": "Покушај {{current}} од {{max}}", - "nextRetryIn": "Следећи поновни покушај за {{seconds}} секунди", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Клијентски тунели", "clientTunnel": "Тунел клијента", "addClientTunnel": "Додај клијентски тунел", "noClientTunnels": "Ниједан клијентски тунел није конфигурисан на овој радној површини.", - "tunnelName": "Назив тунела", - "remoteHost": "Удаљени хост", - "autoStart": "Аутоматски старт", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Покреће се када се овај десктоп клијент отвори и остане повезан.", "clientManualStartDesc": "Користите „Старт“ и „Стоп“ из овог реда. Termix га неће аутоматски отворити.", "clientRemoteServerNote": "Даљинско преусмеравање може захтевати AllowTcpForwarding и GatewayPorts на SSH серверу крајње тачке. Удаљени порт се затвара када се ова радна површина искључи.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "Удаљени порт мора бити између 1 и 65535.", "invalidLocalTargetPort": "Локални циљни порт мора бити између 1 и 65535.", "invalidEndpointPort": "Порт крајње тачке мора бити између 1 и 65535.", - "duplicateAutoStartBind": "Само један аутоматски покренути клијентски тунел може да користи {{bind}}.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Ажурирање стања тунела није успело.", - "active": "Активно", - "start": "Почетак", - "stop": "Заустави", - "test": "Тест", - "type": "Тип тунела", - "typeLocal": "Локално (-Л)", - "typeRemote": "Даљински (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Динамички (-Д)", "typeServerLocalDesc": "Тренутни хост до крајње тачке.", "typeServerRemoteDesc": "Крајња тачка назад на тренутни хост.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Крајња тачка назад на локални рачунар.", "typeClientDynamicDesc": "SOCKS на локалном рачунару.", "typeDynamicDesc": "Прослеђивање SOCKS5 CONNECT саобраћаја преко SSH-а", - "forwardDescriptionServerLocal": "Тренутни хост {{sourcePort}} → крајња тачка {{endpointPort}}.", - "forwardDescriptionServerRemote": "Крајња тачка {{endpointPort}} → тренутни хост {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS на тренутном хосту {{sourcePort}}.", - "forwardDescriptionClientLocal": "Локално {{sourcePort}} → удаљено {{endpointPort}}.", - "forwardDescriptionClientRemote": "Удаљено {{sourcePort}} → локално {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS на локалном порту {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → ЧАРАПЕ преко {{endpoint}}", - "autoNameClientLocal": "Локално {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → локално {{localPort}}", - "autoNameClientDynamic": "ЧАРАПЕ {{localPort}} преко {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Рута:", "lastStarted": "Последњи пут започет", "lastTested": "Последње тестирање", "lastError": "Последња грешка", - "maxRetries": "Максималан број поновних покушаја", + "maxRetries": "Max Retries", "maxRetriesDescription": "Максималан број поновних покушаја.", - "retryInterval": "Интервал поновног покушаја (секунде)", - "retryIntervalDescription": "Време чекања између поновних покушаја.", - "local": "Локално", - "remote": "Даљински", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Одредиште", "host": "Домаћин", "mode": "Режим", - "noHostSelected": "Није изабран домаћин", + "noHostSelected": "No host selected", "working": "Ради се..." }, - "serverStats": { - "cpu": "Процесор", - "memory": "Памћење", - "disk": "Диск", - "network": "Мрежа", - "uptime": "Време непрекидног рада", - "processes": "Процеси", - "available": "Доступно", - "free": "Бесплатно", - "connecting": "Повезивање...", - "connectionFailed": "Повезивање са сервером није успело", - "naCpus": "Н/Д процесор(и)", - "cpuCores_one": "{{count}} Језгро", - "cpuCores_other": "{{count}} Језгра", - "cpuUsage": "Искоришћеност процесора", - "memoryUsage": "Коришћење меморије", - "diskUsage": "Искоришћеност диска", - "failedToFetchHostConfig": "Није успело преузимање конфигурације хоста", - "serverOffline": "Сервер ван мреже", - "cannotFetchMetrics": "Није могуће преузети метрике са офлајн сервера", - "totpFailed": "Верификација TOTP-а није успела", - "noneAuthNotSupported": "Статистика сервера не подржава тип аутентификације „ниједан“.", - "load": "Учитај", - "systemInfo": "Системске информације", - "hostname": "Име хоста", - "operatingSystem": "Оперативни систем", - "kernel": "Језгро", - "seconds": "секунде", - "networkInterfaces": "Мрежни интерфејси", - "noInterfacesFound": "Није пронађен ниједан мрежни интерфејс", - "noProcessesFound": "Није пронађен ниједан процес", - "loginStats": "Статистика SSH пријава", - "noRecentLoginData": "Нема скорашњих података за пријављивање", - "executingQuickAction": "Извршава се {{name}}...", - "quickActionSuccess": "{{name}} успешно завршено", - "quickActionFailed": "{{name}} није успело", - "quickActionError": "Није успело извршавање {{name}}", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Портови за слушање", - "protocol": "Протокол", - "port": "Лука", - "address": "Адреса", - "process": "Процес", - "noData": "Нема података о портовима за слушање" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Сви", + "noData": "No listening ports data" }, "firewall": { - "title": "Заштитни зид (фајервол)", - "inactive": "Неактивно", - "policy": "Политика", - "rules": "правила", - "noData": "Нема доступних података о заштитном зиду", - "action": "Акција", - "protocol": "Прото", - "port": "Лука", - "source": "Извор", - "anywhere": "Било где" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Учитај просек", "swap": "Замена", "architecture": "Архитектура", - "refresh": "Освежи", - "retry": "Покушај поново" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Ради се...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Самостално хостовано SSH и управљање удаљеном радном површином", - "loginTitle": "Пријавите се на Termix", - "registerTitle": "Направи налог", - "forgotPassword": "Заборавили сте лозинку?", - "rememberMe": "Запамти уређај 30 дана (укључује TOTP)", - "noAccount": "Немате налог?", - "hasAccount": "Већ имате налог?", - "twoFactorAuth": "Двофакторска аутентификација", - "enterCode": "Унесите верификациони код", - "backupCode": "Или користите резервни код", - "verifyCode": "Верификујте код", - "redirectingToApp": "Преусмеравање на апликацију...", - "sshAuthenticationRequired": "Потребна је SSH аутентификација", - "sshNoKeyboardInteractive": "Интерактивна аутентификација преко тастатуре није доступна", - "sshAuthenticationFailed": "Аутентификација није успела", - "sshAuthenticationTimeout": "Временско ограничење аутентификације", - "sshNoKeyboardInteractiveDescription": "Сервер не подржава интерактивну аутентификацију помоћу тастатуре. Молимо вас да унесете лозинку или SSH кључ.", - "sshAuthFailedDescription": "Унети акредитиви су били нетачни. Молимо вас да покушате поново са важећим акредитивима.", - "sshTimeoutDescription": "Временско ограничење покушаја аутентификације је истекло. Молимо покушајте поново.", - "sshProvideCredentialsDescription": "Молимо вас да наведете своје SSH акредитиве да бисте се повезали са овим сервером.", - "sshPasswordDescription": "Унесите лозинку за ову SSH везу.", - "sshKeyPasswordDescription": "Ако је ваш SSH кључ шифрован, унесите лозинку овде.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Потребна је лозинка", "passphraseRequiredDescription": "SSH кључ је шифрован. Унесите лозинку да бисте га откључали.", - "back": "Назад", - "firstUser": "Први корисник", - "firstUserMessage": "Ви сте први корисник и бићете постављени за администратора. Подешавања администратора можете видети у падајућем менију корисника на бочној траци. Ако мислите да је ово грешка, проверите логове Docker-а или креирајте проблем на GitHub-у.", - "external": "Спољни", - "loginWithExternal": "Пријавите се са спољним добављачем", - "loginWithExternalDesc": "Пријавите се користећи свог конфигурисаног спољног добављача идентитета", - "externalNotSupportedInElectron": "Спољна аутентификација још увек није подржана у апликацији Electron. Молимо вас да користите веб верзију за пријаву путем OIDC-а.", - "resetPasswordButton": "Ресетуј лозинку", - "sendResetCode": "Пошаљи код за ресетовање", - "resetCodeDesc": "Унесите своје корисничко име да бисте добили код за ресетовање лозинке. Код ће бити забележен у логовима Docker контејнера.", - "resetCode": "Ресетуј код", - "verifyCodeButton": "Верификујте код", - "enterResetCode": "Унесите 6-цифрени код из логова Docker контејнера за корисника:", - "newPassword": "Нова лозинка", - "confirmNewPassword": "Потврдите лозинку", - "enterNewPassword": "Унесите нову лозинку за корисника:", - "signUp": "Региструј се", - "desktopApp": "Десктоп апликација", - "loggingInToDesktopApp": "Пријављивање у апликацију за десктоп", - "loadingServer": "Учитавање сервера...", - "dataLossWarning": "Ресетовањем лозинке на овај начин избрисаћете све сачуване SSH хостове, акредитиве и друге шифроване податке. Ова радња се не може поништити. Користите ово само ако сте заборавили лозинку и нисте пријављени.", - "authenticationDisabled": "Аутентификација је онемогућена", - "authenticationDisabledDesc": "Све методе аутентификације су тренутно онемогућене. Контактирајте администратора.", - "attemptsRemaining": "{{count}} преосталих покушаја" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Проверите SSH кључ хоста", - "keyChangedWarning": "SSH кључ хоста је промењен", - "firstConnectionTitle": "Прво повезивање са овим хостом", - "firstConnectionDescription": "Аутентичност овог хоста не може бити утврђена. Проверите да ли отисак прста одговара очекивањима.", - "keyChangedDescription": "Кључ хоста за овај сервер се променио од ваше последње везе. Ово би могло да указује на безбедносни проблем.", - "previousKey": "Претходни кључ", - "newFingerprint": "Нови отисак прста", - "fingerprint": "Отисак прста", - "verifyInstructions": "Ако верујете овом хосту, кликните на „Прихвати“ да бисте наставили и сачували овај отисак прста за будуће везе.", - "securityWarning": "Безбедносно упозорење", - "acceptAndContinue": "Прихвати и настави", - "acceptNewKey": "Прихвати нови кључ и настави" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Није могуће повезати се са базом података", - "unknownError": "Непозната грешка", - "loginFailed": "Пријављивање није успело", - "failedPasswordReset": "Покретање ресетовања лозинке није успело", - "failedVerifyCode": "Није успело потврђивање кода за ресетовање", - "failedCompleteReset": "Ресетовање лозинке није успело", - "invalidTotpCode": "Неважећи TOTP код", - "failedOidcLogin": "Није успело покретање OIDC пријаве", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Затражено је тихо пријављивање, али пријављивање преко OIDC-а није доступно.", "failedUserInfo": "Није успело добијање корисничких података након пријаве", - "oidcAuthFailed": "OIDC аутентификација није успела", - "invalidAuthUrl": "Неважећи URL за ауторизацију примљен од бекенда", - "requiredField": "Ово поље је обавезно", - "minLength": "Минимална дужина је {{min}}", - "passwordMismatch": "Лозинке се не подударају", - "passwordLoginDisabled": "Пријава корисничким именом/лозинком је тренутно онемогућена", - "sessionExpired": "Сесија је истекла - молимо вас да се поново пријавите", - "totpRateLimited": "Ограничена брзина: Превише покушаја верификације TOTP-а. Молимо покушајте поново касније.", - "totpRateLimitedWithTime": "Ограничена брзина: Превише покушаја верификације TOTP-а. Молимо сачекајте {{time}} секунди пре него што покушате поново.", - "resetCodeRateLimited": "Ограничена брзина: Превише покушаја верификације. Молимо покушајте поново касније.", - "resetCodeRateLimitedWithTime": "Ограничена брзина: Превише покушаја верификације. Молимо сачекајте {{time}} секунди пре него што покушате поново.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Чување токена за аутентификацију није успело", "failedToLoadServer": "Учитавање сервера није успело" }, "messages": { - "registrationDisabled": "Регистрација новог налога је тренутно онемогућена од стране администратора. Молимо вас да се пријавите или контактирате администратора.", - "userNotAllowed": "Ваш налог није овлашћен за регистрацију. Молимо контактирајте администратора.", - "databaseConnectionFailed": "Није успело повезивање са сервером базе података", - "resetCodeSent": "Ресетујте код послат у Docker логове", - "codeVerified": "Код је успешно верификован", - "passwordResetSuccess": "Ресетовање лозинке је успешно", - "loginSuccess": "Пријава је успешна", - "registrationSuccess": "Регистрација је успешна" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Локални тунели за рачунаре усмерени на конфигурисане SSH хостове.", "c2sTunnelPresets": "Унапред подешена подешавања клијентског тунела", "c2sTunnelPresetsDesc": "Сачувајте локалну листу тунела овог десктоп клијента као именовани пресет сервера или поново учитајте пресет у овог клијента.", "c2sTunnelPresetsUnavailable": "Унапред подешена подешавања тунела клијента доступна су само у десктоп клијенту.", - "c2sPresetName": "Име пресета", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Назив унапред подешеног подешавања клијента", "c2sPresetToLoad": "Унапред подешено за учитавање", "c2sNoPresetSelected": "Није изабран ниједан унапред подешени подешавања", "c2sNoPresets": "Нема сачуваних предефинисаних подешавања", - "c2sLoadPreset": "Учитај", - "c2sCurrentLocalConfig": "{{count}} локалних клијентских тунела конфигурисаних на овој радној површини.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Унапред подешена подешавања су експлицитни снимци; учитавање једног замењује листу локалних тунела клијената овог десктоп клијента.", "c2sPresetSaved": "Унапред подешено подешавање тунела клијента је сачувано", "c2sPresetLoaded": "Унапред унапред учитан тунел клијента", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Језик", - "keyPassword": "кључна лозинка", - "pastePrivateKey": "Налепите свој приватни кључ овде...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (слушај локално)", "localTargetHost": "127.0.0.1 (циљ на овом рачунару)", "socksListenerHost": "127.0.0.1 (SOCKS слушалац)", - "enterPassword": "Унесите лозинку", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Контролна табла", - "loading": "Учитавање контролне табле...", - "github": "ГитХаб", - "support": "Подршка", - "discord": "Неслагање", - "serverOverview": "Преглед сервера", - "version": "Верзија", - "upToDate": "Ажурирано", - "updateAvailable": "Ажурирање је доступно", + "title": "Dashboard", + "loading": "Loading dashboard...", + "github": "GitHub", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Бета", - "uptime": "Време непрекидног рада", - "database": "База података", - "healthy": "Здраво", - "error": "Грешка", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "Укупан број домаћина", - "totalTunnels": "Укупан број тунела", - "totalCredentials": "Укупан број акредитива", - "recentActivity": "Недавне активности", - "reset": "Ресетуј", - "loadingRecentActivity": "Учитавање недавних активности...", - "noRecentActivity": "Нема скорашњих активности", - "quickActions": "Брзе акције", - "addHost": "Додај хоста", - "addCredential": "Додај акредитив", - "adminSettings": "Администраторска подешавања", - "userProfile": "Кориснички профил", - "serverStats": "Статистика сервера", - "loadingServerStats": "Учитавање статистике сервера...", - "noServerData": "Нема доступних података са сервера", - "cpu": "Процесор", - "ram": "РАМ меморија", - "customizeLayout": "Прилагоди контролну таблу", - "dashboardSettings": "Подешавања контролне табле", - "enableDisableCards": "Омогући/онемогући картице", - "resetLayout": "Ресетуј на подразумевано", - "serverOverviewCard": "Преглед сервера", - "recentActivityCard": "Недавне активности", - "networkGraphCard": "Мрежни графикон", - "networkGraph": "Мрежни графикон", - "quickActionsCard": "Брзе акције", - "serverStatsCard": "Статистика сервера", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Главни", "panelSide": "Страна", - "justNow": "управо сада" + "justNow": "управо сада", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "СТАБИЛНО", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "Ниједан хост није конфигурисан", "online": "ОНЛАЈН", "offline": "ОФЛАЈН", - "onlineLower": "Онлајн", - "nodes": "{{count}} чворова", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Додај:", "commandPalette": "Палета команди", "done": "Готово", "editModeInstructions": "Превуците картице да бисте променили редослед · Превуците разделник колона да бисте променили величину колона · Превуците доњу ивицу картице да бисте променили величину њене висине · Отпад да бисте уклонили", "empty": "Празно", - "clear": "Јасно" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Додај хоста", - "addGroup": "Додај групу", - "addLink": "Додај линк", - "zoomIn": "Увећај", - "zoomOut": "Умањи", - "resetView": "Ресетуј приказ", - "selectHost": "Изаберите хост", - "chooseHost": "Изаберите домаћина...", - "parentGroup": "Матична група", - "noGroup": "Нема групе", - "groupName": "Назив групе", - "color": "Боја", - "source": "Извор", - "target": "Циљ", - "moveToGroup": "Премести у групу", - "selectGroup": "Изаберите групу...", - "addConnection": "Додај везу", - "hostDetails": "Детаљи домаћина", - "removeFromGroup": "Уклони из групе", - "addHostHere": "Додај хост овде", - "editGroup": "Уреди групу", - "delete": "Обриши", - "add": "Додај", - "create": "Креирај", - "move": "Помери", - "connect": "Повежи се", - "createGroup": "Направи групу", - "selectSourcePlaceholder": "Изаберите извор...", - "selectTargetPlaceholder": "Изаберите циљ...", - "invalidFile": "Неважећа датотека", - "hostAlreadyExists": "Хост је већ у топологији", - "connectionExists": "Веза већ постоји", - "unknown": "Непознато", - "name": "Име", - "ip": "ИП", - "status": "Статус", - "failedToAddNode": "Додавање чвора није успело", - "sourceDifferentFromTarget": "Извор и циљ морају бити различити", - "exportJSON": "Извези JSON", - "importJSON": "Увези JSON", - "terminal": "Терминал", - "fileManager": "Менаџер датотека", - "tunnel": "Тунел", - "docker": "Докер", - "serverStats": "Статистика сервера", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Још нема чворова" }, "docker": { - "notEnabled": "Докер није омогућен за овај хост", - "validating": "Валидација Докера...", - "connecting": "Повезивање...", - "error": "Грешка", - "version": "Докер {{version}}", - "connectionFailed": "Повезивање са Докером није успело", - "containerStarted": "Контејнер {{name}} је покренут", - "failedToStartContainer": "Покретање контејнера {{name}} није успело", - "containerStopped": "Контејнер {{name}} је заустављен", - "failedToStopContainer": "Заустављање контејнера {{name}} није успело", - "containerRestarted": "Контејнер {{name}} поново покренут", - "failedToRestartContainer": "Поновно покретање контејнера није успело {{name}}", - "containerPaused": "Контејнер {{name}} је паузиран", - "containerUnpaused": "Паузирање контејнера {{name}} је прекинуто", - "failedToTogglePauseContainer": "Није успело пребацивање стања паузе за контејнер {{name}}", - "containerRemoved": "Контејнер {{name}} је уклоњен", - "failedToRemoveContainer": "Није успело уклањање контејнера {{name}}", - "image": "Слика", - "ports": "Портови", - "noPorts": "Нема портова", - "start": "Почетак", - "confirmRemoveContainer": "Да ли сте сигурни да желите да уклоните контејнер „{{name}}“? Ова радња се не може поништити.", - "runningContainerWarning": "Упозорење: Овај контејнер је тренутно покренут. Његово уклањање ће прво зауставити рад контејнера.", - "loadingContainers": "Учитавање контејнера...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Докер менаџер", - "autoRefresh": "Аутоматско освежавање", + "autoRefresh": "Auto Refresh", "timestamps": "Временске ознаке", "lines": "Линије", - "filterLogs": "Филтрирај логове...", - "refresh": "Освежи", - "download": "Преузми", - "clear": "Јасно", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Дневници су успешно преузети", "last50": "Последњих 50", "last100": "Последњих 100", "last500": "Последњих 500", "last1000": "Последњих 1000", "allLogs": "Сви дневници", - "noLogsMatching": "Нема логова који одговарају „{{query}}“", - "noLogsAvailable": "Нема доступних логова", - "noContainersFound": "Нису пронађени контејнери", - "noContainersFoundHint": "На овом хосту нису доступни Docker контејнери", - "searchPlaceholder": "Претражи контејнере...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Сви статуси", - "stateRunning": "Трчање", + "stateRunning": "Running", "statePaused": "Паузирано", "stateExited": "Изашао/ла", "stateRestarting": "Поновно покретање", - "noContainersMatchFilters": "Ниједан контејнер не одговара вашим филтерима", - "noContainersMatchFiltersHint": "Покушајте да прилагодите критеријуме претраге или филтрирања", - "failedToFetchStats": "Није успело преузимање статистике контејнера", - "containerNotRunning": "Контејнер се не покреће", - "startContainerToViewStats": "Покрените контејнер да бисте видели статистику", - "loadingStats": "Учитавање статистике...", - "errorLoadingStats": "Грешка при учитавању статистике", - "noStatsAvailable": "Нема доступних статистика", - "cpuUsage": "Искоришћеност процесора", - "current": "Тренутни", - "memoryUsage": "Коришћење меморије", - "networkIo": "Мрежни улаз/излаз", - "input": "Унос", - "output": "Излаз", - "blockIo": "Блок У/И", - "read": "Читај", - "write": "Пиши", - "pids": "ПИД-ови", - "containerInformation": "Информације о контејнеру", - "name": "Име", - "id": "ИД", - "state": "Држава", - "containerMustBeRunning": "Контејнер мора бити покренут да би се приступило конзоли", - "verificationCodePrompt": "Унесите верификациони код", - "totpVerificationFailed": "Верификација TOTP-а није успела. Молимо покушајте поново.", - "warpgateVerificationFailed": "Аутентификација преко Ворпгејта није успела. Молимо покушајте поново.", - "connectedTo": "Повезано са {{containerName}}", - "disconnected": "Искључено", - "consoleError": "Грешка конзоле", - "errorMessage": "Грешка: {{message}}", - "failedToConnect": "Повезивање са контејнером није успело", - "console": "Конзола", - "selectShell": "Изаберите љуску", - "bash": "Баш", - "sh": "ш", - "ash": "пепео", - "connect": "Повежи се", - "disconnect": "Прекини везу", - "notConnected": "Није повезано", - "clickToConnect": "Кликните на повезивање да бисте покренули сесију шкољке", - "connectingTo": "Повезивање са {{containerName}}...", - "containerNotFound": "Контејнер није пронађен", - "backToList": "Назад на листу", - "logs": "Дневници", - "stats": "Статистика", - "consoleTab": "Конзола", - "startContainerToAccess": "Покрените контејнер да бисте приступили конзоли" + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Опште", - "sectionOidc": "ОИДЦ", - "sectionUsers": "Корисници", + "sectionGeneral": "General", + "sectionOidc": "OIDC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Сесије", - "sectionRoles": "Улоге", - "sectionDatabase": "База података", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API кључеви", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Обриши филтере", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Сви", "allowRegistration": "Дозволи регистрацију корисника", - "allowRegistrationDesc": "Дозволите новим корисницима да се сами региструју", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Дозволи пријаву лозинком", "allowPasswordLoginDesc": "Пријава корисничким именом/лозинком", "oidcAutoProvision": "Аутоматско обезбеђивање OIDC-а", - "oidcAutoProvisionDesc": "Аутоматски креирајте налоге за OIDC кориснике чак и када је регистрација онемогућена", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Дозволи ресетовање лозинке", "allowPasswordResetDesc": "Ресетујте код путем Докер логова", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Временско ограничење сесије", - "hours": "сати", + "hours": "hours", "sessionTimeoutRange": "Мин. 1 сат · Макс. 720 сати", - "monitoringDefaults": "Праћење подразумеваних подешавања", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Провера статуса", - "metrics": "Метрике", + "metrics": "Metrics", "sec": "сек", "logLevel": "Ниво логова", "enableGuacamole": "Омогући гуакамоле", "enableGuacamoleDesc": "RDP/VNC удаљена радна површина", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "URL адреса guacd-а", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "Конфигуришите OpenID Connect за SSO. Поља означена * су обавезна.", - "oidcClientId": "ИД клијента", - "oidcClientSecret": "Тајна клијентска порука", - "oidcAuthUrl": "URL за ауторизацију", - "oidcIssuerUrl": "URL издаваоца", - "oidcTokenUrl": "URL адреса токена", - "oidcUserIdentifier": "Путања идентификатора корисника", - "oidcDisplayName": "Путања приказаног имена", - "oidcScopes": "Опсези", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Замени URL са корисничким информацијама", - "oidcAllowedUsers": "Дозвољени корисници", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Једна имејл адреса по реду. Оставите празно да бисте дозволили све.", - "removeOidc": "Уклони", - "usersCount": "{{count}} корисника", - "createUser": "Креирај", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Нова улога", - "roleName": "Име", - "roleDisplayName": "Приказано име", - "roleDescription": "Опис", - "rolesCount": "{{count}} улоге", - "createRole": "Креирај", - "creating": "Креирање...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Извоз базе података", "exportDatabaseDesc": "Преузмите резервну копију свих хостова, акредитива и подешавања", - "export": "Извоз", - "exporting": "Извоз...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Увоз базе података", "importDatabaseDesc": "Враћање из .sqlite датотеке резервне копије", - "importDatabaseSelected": "Изабрано: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Изаберите датотеку", - "changeFile": "Промена", - "import": "Увоз", - "importing": "Увоз...", - "apiKeysCount": "{{count}} тастери", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Нови API кључ", "apiKeyCreatedWarning": "Кључ је креиран - копирајте га сада, неће се више приказивати.", - "apiKeyName": "Име", - "apiKeyUser": "Корисник", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Изаберите корисника...", - "apiKeyExpiresAt": "Истиче у", + "apiKeyExpiresAt": "Expires At", "createKey": "Направи кључ", "apiKeyNoExpiry": "Без истека", "revokedBadge": "ПОНИШТЕНО", - "authTypeDual": "Двострука аутентификација", - "authTypeOidc": "ОИДЦ", - "authTypeLocal": "Локално", - "adminStatusAdministrator": "Администратор", - "adminStatusRegularUser": "Редован корисник", + "authTypeDual": "Dual Auth", + "authTypeOidc": "OIDC", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "АДМИНИСТРАТОР", "systemBadge": "СИСТЕМ", "customBadge": "ПРИЛАГОЂЕНО", "youBadge": "ТИ", - "sessionsActive": "{{count}} активно", - "sessionActive": "Активно: {{time}}", - "sessionExpires": "Рок трајања: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", "revokeAll": "Сви", "revokeAllSessionsSuccess": "Све сесије за корисника су опозване", - "revokeAllSessionsFailed": "Опозивање сесија није успело", - "revokeSessionFailed": "Опозивање сесије није успело", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Додај улогу", "noCustomRoles": "Нема дефинисаних прилагођених улога", - "removeRoleFailed": "Уклањање улоге није успело", - "assignRoleFailed": "Додељивање улоге није успело", - "deleteRoleFailed": "Брисање улоге није успело", - "userAdminAccess": "Администратор", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Потпун приступ свим администраторским подешавањима", - "userRoles": "Улоге", - "revokeAllUserSessions": "Поништи све сесије", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Присили поновно пријављивање на свим уређајима", - "revoke": "Поништи", + "revoke": "Revoke", "deleteUserWarning": "Брисање овог корисника је трајно.", - "deleteUser": "Обриши {{username}}", - "deleting": "Брисање...", - "deleteUserFailed": "Брисање корисника није успело", - "deleteUserSuccess": "Корисник „{{username}}“ је обрисан", - "deleteRoleSuccess": "Улога „{{name}}“ је обрисана", - "revokeKeySuccess": "Кључ „{{name}}“ је опозван", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Опозивање кључа није успело", - "copiedToClipboard": "Копирано у међуспремник", + "copiedToClipboard": "Copied to clipboard", "done": "Готово", - "createUserTitle": "Креирај корисника", + "createUserTitle": "Create User", "createUserDesc": "Направите нови локални налог.", - "createUserUsername": "Корисничко име", - "createUserPassword": "Лозинка", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Минимум 6 карактера.", - "createUserEnterUsername": "Унесите корисничко име", - "createUserEnterPassword": "Унесите лозинку", - "createUserSubmit": "Креирај корисника", - "editUserTitle": "Управљај корисником: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Уредите улоге, администраторски статус, сесије и подешавања налога.", - "editUserUsername": "Корисничко име", + "editUserUsername": "Username", "editUserAuthType": "Тип овлашћења", - "editUserAdminStatus": "Статус администратора", - "editUserUserId": "ИД корисника", - "linkAccountTitle": "Повежите OIDC са налогом са лозинком", - "linkAccountDesc": "Спојите OIDC налог {{username}} са постојећим локалним налогом.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Ово ће:", "linkAccountEffect1": "Избришите само OIDC налог", "linkAccountEffect2": "Додајте OIDC пријаву на циљни налог", "linkAccountEffect3": "Дозволи пријаву и OIDC и лозинком", - "linkAccountTargetUsername": "Циљно корисничко име", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Унесите корисничко име локалног налога за повезивање", - "linkAccounts": "Повежи налоге", - "linkAccountSuccess": "OIDC налог повезан са „{{username}}“", - "linkAccountFailed": "Повезивање OIDC налога није успело", - "linkAccountInProgress": "Повезивање...", - "saving": "Чување...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Ажурирање подешавања регистрације није успело", "updatePasswordLoginFailed": "Ажурирање подешавања за пријаву лозинком није успело", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Ажурирање подешавања аутоматског обезбеђивања OIDC-а није успело", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Ажурирање подешавања за ресетовање лозинке није успело", "sessionTimeoutRange2": "Временско ограничење сесије мора бити између 1 и 720 сати", "sessionTimeoutSaved": "Временско ограничење сесије је сачувано", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Неважеће вредности интервала", "monitoringSaved": "Подешавања праћења су сачувана", "monitoringSaveFailed": "Чување подешавања праћења није успело", - "guacamoleSaved": "Подешавања за гуакамоле су сачувана", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Чување подешавања за гуакамоле није успело", "guacamoleUpdateFailed": "Ажурирање подешавања за гвакамоле није успело", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Ажурирање нивоа евиденције није успело", "oidcSaved": "OIDC конфигурација је сачувана", "oidcSaveFailed": "Чување OIDC конфигурације није успело", "oidcRemoved": "OIDC конфигурација је уклоњена", "oidcRemoveFailed": "Уклањање OIDC конфигурације није успело", "createUserRequired": "Корисничко име и лозинка су обавезни", - "createUserPasswordTooShort": "Лозинка мора имати најмање 6 карактера", - "createUserSuccess": "Корисник „{{username}}“ је креирао", - "createUserFailed": "Није успело креирање корисника", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Ажурирање статуса администратора није успело", "allSessionsRevoked": "Све сесије су опозване", - "revokeSessionsFailed": "Опозивање сесија није успело", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Име и име за приказ су обавезни", - "createRoleSuccess": "Улога „{{name}}“ је креирана", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Није успело креирање улоге", "apiKeyNameRequired": "Назив кључа је обавезан", "apiKeyUserRequired": "ИД корисника је обавезан", - "apiKeyCreatedSuccess": "API кључ „{{name}}“ је креиран", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Није успело креирање API кључа", "exportSuccess": "База података је успешно извезена", "exportFailed": "Извоз базе података није успео", "importSelectFile": "Прво изаберите датотеку", - "importCompleted": "Увоз завршен: {{total}} ставки је увезено, {{skipped}} прескочено", - "importFailed": "Увоз није успео: {{error}}", - "importError": "Увоз базе података није успео" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Увоз базе података није успео", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Домаћин", - "hostPlaceholder": "192.168.1.1 или example.com", - "portLabel": "Лука", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Корисничко име", - "usernamePlaceholder": "корисничко име", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Овлашћење", - "passwordLabel": "Лозинка", - "passwordPlaceholder": "лозинка", - "privateKeyLabel": "Приватни кључ", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Налепи приватни кључ...", - "credentialLabel": "Акредитив", + "credentialLabel": "Credential", "credentialPlaceholder": "Изаберите сачувани акредитив", - "connectToTerminal": "Повежи се са терминалом", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Повежи се са датотекама" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Обриши све", "noHistoryEntries": "Нема уноса у историји", "trackingDisabled": "Праћење историје је онемогућено", - "trackingDisabledHint": "Омогућите то у подешавањима профила да бисте снимали команде." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Снимање кључа", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Снимање на терминале", "selectAll": "Сви", - "selectNone": "Ниједан", + "selectNone": "None", "noTerminalTabsOpen": "Нема отворених картица терминала", "selectTerminalsAbove": "Изаберите терминале изнад", "broadcastInputPlaceholder": "Куцајте овде да бисте емитовали притиске тастера...", "stopRecording": "Заустави снимање", "startRecording": "Почни снимање", - "settingsTitle": "Подешавања", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Омогући копирање/лепљење десним кликом" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "Превуците картице у горње окне или користите Брзо додељивање", "dropHere": "Спусти овде", "emptyPane": "Празно", - "dashboard": "Контролна табла", + "dashboard": "Dashboard", "clearSplitScreen": "Обриши подељени екран", "quickAssign": "Брзо додељивање", - "alreadyAssigned": "Окно {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Подели картицу", "addToSplit": "Додај у Сплит", "removeFromSplit": "Уклони из Сплита", - "assignToPane": "Додели окну" + "assignToPane": "Додели окну", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Направи исечак", - "createSnippetDescription": "Направите нови исечак команде за брзо извршавање", - "nameLabel": "Име", - "namePlaceholder": "нпр. Рестартујте Nginx", - "descriptionLabel": "Опис", - "descriptionPlaceholder": "Опциони опис", - "optional": "Опционо", - "folderLabel": "Фасцикла", - "noFolder": "Нема фасцикле (Некатегоризовано)", - "commandLabel": "Команда", - "commandPlaceholder": "нпр. sudo systemctl рестарт nginx", - "cancel": "Откажи", - "createSnippetButton": "Направи исечак", - "createFolderTitle": "Направи фасциклу", - "createFolderDescription": "Организујте своје фрагменте у фасцикле", - "folderNameLabel": "Назив фасцикле", - "folderNamePlaceholder": "нпр. системске команде, Докер скрипте", - "folderColorLabel": "Боја фасцикле", - "folderIconLabel": "Икона фасцикле", - "previewLabel": "Преглед", - "folderNameFallback": "Назив фасцикле", - "createFolderButton": "Направи фасциклу", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Циљни терминали", "selectAll": "Сви", - "selectNone": "Ниједан", + "selectNone": "None", "noTerminalTabsOpen": "Нема отворених картица терминала", - "searchPlaceholder": "Претражи фрагменте...", - "newSnippet": "Нови исечак", - "newFolder": "Нова фасцикла", - "run": "Трчи", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Нема фрагмената у овој фасцикли", - "uncategorized": "Некатегоризовано", - "editSnippetTitle": "Измени исечак", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Ажурирајте овај исечак команде", "saveSnippetButton": "Сачувај измене", - "createSuccess": "Исечак је успешно креиран", - "createFailed": "Није успело креирање фрагмента", - "updateSuccess": "Исечак је успешно ажуриран", - "updateFailed": "Ажурирање исечка није успело", - "deleteFailed": "Брисање исечка није успело", - "folderCreateSuccess": "Фолдер је успешно креиран", - "folderCreateFailed": "Није успело креирање фасцикле", - "editFolderTitle": "Уреди фасциклу", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Преименујте или промените изглед ове фасцикле", "saveFolderButton": "Сачувај измене", "editFolder": "Уреди фасциклу", "deleteFolder": "Обриши фасциклу", - "folderDeleteSuccess": "Фасцикла „{{name}}“ је обрисана", - "folderDeleteFailed": "Брисање фасцикле није успело", - "folderEditSuccess": "Фолдер је успешно ажуриран", - "folderEditFailed": "Ажурирање фасцикле није успело", - "confirmRunMessage": "Покрени „{{name}}“?", - "confirmRunButton": "Трчи", - "runSuccess": "Покренуо је „{{name}}“ у {{count}} терминалу(има)", - "copySuccess": "Копирано „{{name}}“ у међуспремник", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Дели исечак", - "shareUser": "Корисник", - "shareRole": "Улога", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Изаберите корисника...", "selectRole": "Изаберите улогу...", "shareSuccess": "Исечак је успешно дељен", "shareFailed": "Дељење фрагмента није успело", "revokeSuccess": "Приступ је опозван", - "revokeFailed": "Опозивање приступа није успело", - "currentAccess": "Тренутни приступ", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Учитавање података о дељењу није успело", - "loading": "Учитавање...", - "close": "Затвори", - "reorderFailed": "Чување редоследа исечака није успело" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Чување редоследа исечака није успело", + "importExport": "Увоз / Извоз", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Ниједан хост није конфигурисан", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Налог", - "sectionAppearance": "Изглед", - "sectionSecurity": "Безбедност", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API кључеви", "sectionC2sTunnels": "C2S тунели", - "usernameLabel": "Корисничко име", - "roleLabel": "Улога", - "roleAdministrator": "Администратор", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Метода овлашћења", - "authMethodLocal": "Локално", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "Укључено", "twoFaOff": "Искључено", - "versionLabel": "Верзија", - "deleteAccount": "Обриши налог", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Трајно избришите свој налог", - "deleteButton": "Обриши", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Ова радња је трајна и не може се поништити.", "deleteAccountWarning": "Све сесије, хостови, акредитиви и подешавања биће трајно избрисани.", - "confirmPasswordDeletePlaceholder": "Унесите лозинку да бисте потврдили", - "languageLabel": "Језик", - "themeLabel": "Тема", - "fontSizeLabel": "Величина фонта", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Акцентна боја", - "settingsTerminal": "Терминал", - "commandAutocomplete": "Аутоматско довршавање команди", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Прикажи аутоматско довршавање током куцања", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Праћење историје", "historyTrackingDesc": "Праћење терминалних команди", - "syntaxHighlighting": "Истицање синтаксе", - "syntaxHighlightingDesc": "Истакните излаз терминала", "commandPalette": "Палета команди", "commandPaletteDesc": "Омогући пречицу на тастатури", "reopenTabsOnLogin": "Поново отвори картице при пријављивању", "reopenTabsOnLoginDesc": "Вратите отворене картице када се пријавите или освежите страницу, чак и са другог уређаја", "confirmTabClose": "Потврди затварање картице", "confirmTabCloseDesc": "Питај пре затварања картица терминала", - "settingsSidebar": "Бочна трака", - "showHostTags": "Прикажи ознаке хоста", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Приказ ознака на листи хостова", "hostTrayOnClick": "Кликните да проширите Акције хоста", "hostTrayOnClickDesc": "Увек приказуј дугмад за повезивање; кликните да бисте проширили опције управљања уместо да пређете показивачем миша изнад њих.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Закачи шину апликација", "pinAppRailDesc": "Нека лева бочна трака апликације увек буде проширена уместо да се проширује при преласку мишем преко ње", - "settingsSnippets": "Исечци", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Фасцикле су склопљене", "foldersCollapsedDesc": "Сажми фасцикле подразумевано", "confirmExecution": "Потврди извршење", "confirmExecutionDesc": "Потврдите пре покретања фрагмената", - "settingsUpdates": "Ажурирања", + "settingsUpdates": "Updates", "disableUpdateChecks": "Онемогући провере ажурирања", "disableUpdateChecksDesc": "Престани да провераваш ажурирања", "totpAuthenticator": "TOTP аутентификатор", @@ -2109,68 +2612,68 @@ "qrCode": "QR код", "totpInstructions": "Скенирајте QR код или унесите тајни код у апликацију за аутентификацију, а затим унесите шестоцифрени код", "totpCodePlaceholder": "000000", - "verify": "Верификуј", - "changePassword": "Промена лозинке", - "currentPasswordLabel": "Тренутна лозинка", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Тренутна лозинка", - "newPasswordLabel": "Нова лозинка", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Нова лозинка", "confirmPasswordLabel": "Потврдите нову лозинку", "confirmPasswordPlaceholder": "Потврдите нову лозинку", "updatePassword": "Ажурирај лозинку", "createApiKeyTitle": "Креирај API кључ", "createApiKeyDescription": "Генеришите нови API кључ за програмски приступ.", - "apiKeyNameLabel": "Име", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "нпр. CI цевовод", "expiryDateLabel": "Датум истека", "optional": "опционо", - "cancel": "Откажи", + "cancel": "Cancel", "createKey": "Направи кључ", - "apiKeyCount": "{{count}} тастери", + "apiKeyCount": "{{count}} keys", "newKey": "Нови кључ", "noApiKeys": "Још нема API кључева.", - "apiKeyActive": "Активно", + "apiKeyActive": "Active", "apiKeyUsageHint": "Укључите свој кључ у", "apiKeyUsageHintHeader": "заглавље.", "apiKeyPermissionsHint": "Кључеви наслеђују дозволе корисника који их креира.", - "roleUser": "Корисник", - "authMethodDual": "Двострука аутентификација", - "authMethodOidc": "ОИДЦ", - "totpSetupFailed": "Покретање подешавања TOTP-а није успело", + "roleUser": "User", + "authMethodDual": "Dual Auth", + "authMethodOidc": "OIDC", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Унесите шестоцифрени код", "totpEnabledSuccess": "Омогућена је двофакторска аутентификација", "totpInvalidCode": "Неважећи код, покушајте поново", "totpDisableInputRequired": "Унесите свој TOTP код или лозинку", - "totpDisabledSuccess": "Двофакторска аутентификација је онемогућена", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "Онемогућавање 2FA није успело", - "totpDisableTitle": "Онемогући 2FA", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Унесите TOTP код или лозинку", - "totpDisableConfirm": "Онемогући 2FA", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Настави са верификацијом", - "totpVerifyTitle": "Верификујте код", - "totpBackupTitle": "Резервни кодови", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Преузмите резервне кодове", "done": "Готово", "secretCopied": "Тајни токен је копиран у међуспремник", "apiKeyNameRequired": "Назив кључа је обавезан", - "apiKeyCreated": "API кључ „{{name}}“ је креиран", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Није успело креирање API кључа", - "apiKeyUser": "Корисник", - "apiKeyExpires": "Истиче", - "apiKeyRevoked": "API кључ „{{name}}“ је опозван", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "Опозивање API кључа није успело", "passwordFieldsRequired": "Потребне су тренутна и нова лозинка", - "passwordMismatch": "Лозинке се не подударају", - "passwordTooShort": "Лозинка мора имати најмање 6 карактера", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Лозинка је успешно ажурирана", "passwordUpdateFailed": "Ажурирање лозинке није успело", "deletePasswordRequired": "За брисање налога потребна је лозинка", - "deleteFailed": "Брисање налога није успело", - "deleting": "Брисање...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Отвори бирач боја", - "themeSystem": "Систем", - "themeLight": "Светло", - "themeDark": "Тамно", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Дракула", "themeCatppuccin": "Катпучин", "themeNord": "Норд", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Грувбокс" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "управо сада", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Таб", + "backTab": "⇥", + "arrowUp": "Стрелица нагоре", + "arrowDown": "Стрелица надоле", + "arrowLeft": "Стрелица лево", + "arrowRight": "Стрелица десно", + "home": "Home", + "end": "Крај", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Готово" } } diff --git a/src/ui/locales/translated/sv_SE.json b/src/ui/locales/translated/sv_SE.json index 012cf333..1155a4a7 100644 --- a/src/ui/locales/translated/sv_SE.json +++ b/src/ui/locales/translated/sv_SE.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Mappar", - "folder": "Mapp", + "folders": "Folders", + "folder": "Folder", "password": "Lösenord", - "key": "Nyckel", - "sshPrivateKey": "SSH privat nyckel", - "upload": "Ladda upp", - "keyPassword": "Nyckel Lösenord", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", "sshKey": "SSH-nyckel", - "uploadPrivateKeyFile": "Ladda upp privat nyckelfil", - "searchCredentials": "Sök användaruppgifter...", - "addCredential": "Lägg till autentiseringsuppgifter", - "caCertificate": "Certifikat från CA (-cert.pub)", - "caCertificateDescription": "Valfritt: Ladda upp eller klistra in den CA-signerade certifikatfilen (t.ex. id_ed25519-cert.pub). Krävs när din SSH-server använder certifikatbaserad auktorisering.", - "uploadCertFile": "Ladda upp -cert.pub fil", - "clearCert": "Rensa", - "certLoaded": "Certifikat laddat", - "certPublicKeyLabel": "Certifikat från CA", - "certTypeLabel": "Typ av certifikat", - "pasteOrUploadCert": "Klistra in eller ladda upp ett -cert.pub certifikat...", - "hasCaCert": "Har CA-certifikat", - "noCaCert": "Inget CA-certifikat" + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Standardbeställning", + "sortNameAsc": "Namn (A → Ö)", + "sortNameDesc": "Namn (Ö → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Rensa filter", + "filterTypeGroup": "Type", + "filterTypePassword": "Lösenord", + "filterTypeKey": "SSH-nyckel", + "filterTagsGroup": "Taggar" }, "homepage": { - "failedToLoadAlerts": "Det gick inte att ladda varningar", - "failedToDismissAlert": "Det gick inte att avfärda varningen" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Serverns konfiguration", - "description": "Konfigurera Termix server-URL för att ansluta till dina backend-tjänster", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", "serverUrl": "Server URL", - "enterServerUrl": "Ange en server-URL", - "saveFailed": "Det gick inte att spara konfigurationen", - "saveError": "Fel vid sparande av konfiguration", - "saving": "Sparar...", - "saveConfig": "Spara konfiguration", - "helpText": "Ange den URL där din Termix server körs (t.ex., http://localhost:30001 eller https://your-server.com)", - "changeServer": "Ändra server", - "mustIncludeProtocol": "Server-URL måste börja med http:// eller https://", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Tillåt ogiltigt certifikat", "allowInvalidCertificateDesc": "Använd endast för betrodda självhostade servrar med självsignerade certifikat eller IP-adresscertifikat.", - "useEmbedded": "Använd lokal server", - "embeddedDesc": "Kör Termix med den inbyggda lokala servern (ingen fjärrserver behövs)", - "embeddedConnecting": "Ansluter till lokal server...", - "embeddedNotReady": "Lokal server är inte redo än. Vänligen vänta en stund och försök igen.", - "localServer": "Lokal server" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Ta bort" }, "versionCheck": { - "error": "Fel vid versionskontroll", - "checkFailed": "Det gick inte att söka efter uppdateringar", - "upToDate": "Appen är uppdaterad", - "currentVersion": "Du kör version {{version}}", - "updateAvailable": "Uppdatering tillgänglig", - "newVersionAvailable": "En ny version är tillgänglig! Du kör {{current}}, men {{latest}} är tillgänglig.", - "betaVersion": "Beta version", - "betaVersionDesc": "Du kör {{current}}som är nyare än den senaste stabila utgåvan {{latest}}.", - "releasedOn": "Släppt på {{date}}", - "downloadUpdate": "Ladda ner uppdatering", - "checking": "Söker efter uppdateringar...", - "checkUpdates": "Sök efter uppdateringar", - "checkingUpdates": "Söker efter uppdateringar...", - "updateRequired": "Uppdatering krävs" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Stäng", + "close": "Close", "minimize": "Minimize", "online": "Online", - "offline": "Offline", - "continue": "Fortsätt", - "maintenance": "Underhåll", - "degraded": "Avbruten", - "error": "Fel", - "warning": "Varning", - "unsavedChanges": "Osparade ändringar", - "dismiss": "Avfärda", - "loading": "Laddar...", - "optional": "Valfri", - "connect": "Anslut", - "copied": "Kopierad", - "connecting": "Ansluter...", - "updateAvailable": "Uppdatering tillgänglig", + "offline": "Off-line", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Öppna i ny flik", - "noReleases": "Inga releaser", - "updatesAndReleases": "Uppdateringar och utgåvor", - "newVersionAvailable": "En ny version ({{version}}) är tillgänglig.", - "failedToFetchUpdateInfo": "Det gick inte att hämta uppdateringsinformation", - "preRelease": "Försläpp", - "noReleasesFound": "Inga utgåvor hittades.", - "cancel": "Avbryt", - "username": "Användarnamn", - "login": "Inloggning", - "register": "Registrera", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Avboka", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Lösenord", - "confirmPassword": "Bekräfta lösenord", - "back": "Tillbaka", - "save": "Spara", - "saving": "Sparar...", - "delete": "Radera", - "rename": "Döp om", - "edit": "Redigera", - "add": "Lägg till", - "confirm": "Bekräfta", - "no": "Nej", - "or": "ELLER", - "next": "Nästa", - "previous": "Föregående", - "refresh": "Uppdatera", - "language": "Språk", - "checking": "Kontrollerar...", - "checkingDatabase": "Kontrollerar databasanslutning...", - "checkingAuthentication": "Kontrollerar autentisering...", - "backendReconnected": "Serveranslutning återställd", - "connectionDegraded": "Serveranslutning förlorad, återställer…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "Radera", - "create": "Skapa", - "update": "Uppdatera", + "remove": "Ta bort", + "create": "Create", + "update": "Update", "copy": "Kopiera", - "copyFailed": "Det gick inte att kopiera till urklipp", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Återställ", - "of": "av" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Hem", + "home": "Home", "terminal": "Terminal", - "docker": "Docker", - "tunnels": "Tunnlar", - "fileManager": "Filhanterare", - "serverStats": "Server statistik", - "admin": "Administratör", - "userProfile": "Användarprofil", - "splitScreen": "Delad skärm", - "confirmClose": "Stäng denna aktiva session?", - "close": "Stäng", - "cancel": "Avbryt", + "docker": "Hamnarbetare", + "tunnels": "Tunnels", + "fileManager": "Filhanteraren", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Avboka", "sshManager": "SSH Manager", - "cannotSplitTab": "Kan inte dela den här fliken", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Kopiera lösenord", - "copySudoPassword": "Kopiera Sudo lösenord", - "passwordCopied": "Lösenord kopierat till urklipp", - "noPasswordAvailable": "Inget lösenord tillgängligt", - "failedToCopyPassword": "Det gick inte att kopiera lösenord", - "refreshTab": "Uppdatera anslutning", - "openFileManager": "Öppna filhanteraren", - "dashboard": "Instrumentpanel", - "networkGraph": "Nätverksgraf", - "quickConnect": "Snabb anslutning", - "sshTools": "SSH-verktyg", - "history": "Historik", - "hosts": "Värdar", - "snippets": "Textmoduler", - "hostManager": "Värdhanterare", - "credentials": "Användaruppgifter", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "Anslutningar", - "roleAdministrator": "Administratör", - "roleUser": "Användare" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Värdar", - "noHosts": "Inga SSH-värdar", - "retry": "Försök igen", - "refresh": "Uppdatera", - "optional": "Valfri", - "downloadSample": "Ladda ner exempel", - "failedToDeleteHost": "Det gick inte att ta bort {{name}}", - "importSkipExisting": "Importera (hoppa över befintliga)", - "connectionDetails": "Kontaktuppgifter", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Försöka igen", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Fjärrskrivbord", + "remoteDesktop": "Remote Desktop", "port": "Port", - "username": "Användarnamn", - "folder": "Mapp", + "username": "Username", + "folder": "Folder", "tags": "Taggar", - "pin": "Fäst", - "addHost": "Lägg till värd", - "editHost": "Redigera värd", - "cloneHost": "Klona Värd", - "enableTerminal": "Aktivera Terminal", - "enableTunnel": "Aktivera tunnel", - "enableFileManager": "Aktivera filhanteraren", - "enableDocker": "Aktivera Docker", - "defaultPath": "Standard sökväg", - "connection": "Anslutning", - "upload": "Ladda upp", - "authentication": "Autentisering", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Lösenord", - "key": "Nyckel", - "credential": "Uppgifter", + "key": "Key", + "credential": "Referenser", "none": "Ingen", - "sshPrivateKey": "SSH privat nyckel", - "keyType": "Nyckel typ", - "uploadFile": "Ladda upp fil", - "tabGeneral": "Allmänt", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", + "tabTerminal": "Terminal", + "tabRdp": "Landsbygdsutveckling", "tabVnc": "VNC", - "tabTunnels": "Tunnlar", - "tabDocker": "Docker", - "tabFiles": "Filer", - "tabStats": "Statistik", + "tabTunnels": "Tunnels", + "tabDocker": "Hamnarbetare", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Delning", - "tabAuthentication": "Autentisering", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Terminal", "tunnel": "Tunnel", - "fileManager": "Filhanterare", - "serverStats": "Server statistik", + "fileManager": "Filhanteraren", + "serverStats": "Host Metrics", "status": "Status", - "folderRenamed": "Mappen \"{{oldName}}\" bytt namn till \"{{newName}}\" lyckades", - "failedToRenameFolder": "Det gick inte att byta namn på mapp", - "movedToFolder": "Flyttade till \"{{folder}}\"", - "editHostTooltip": "Redigera värd", - "statusChecks": "Statuskontroller", - "metricsCollection": "Metrics samling", - "metricsInterval": "Intervall för Metrics samling", - "metricsIntervalDesc": "Hur ofta man samlar in serverstatistik (5s - 1h)", - "behavior": "Beteende", - "themePreview": "Förhandsgranska tema", - "theme": "Tema", - "fontFamily": "Teckensnittsfamilj", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Brev mellanrum", - "lineHeight": "Linje höjd", - "cursorStyle": "Markörens stil", - "cursorBlink": "Markör Blink", - "scrollbackBuffer": "Scrollback buffert", - "bellStyle": "Klockans stil", - "rightClickSelectsWord": "Högerklicka väljer ord", - "fastScrollModifier": "Snabb bläddringsmodifierare", - "fastScrollSensitivity": "Snabb rullningskänslighet", - "sshAgentForwarding": "SSH agentvidarebefordran", - "backspaceMode": "Läge för backsteg", - "startupSnippet": "Starta textmodulen", - "selectSnippet": "Välj snippet", - "forceKeyboardInteractive": "Tvinga interaktiv tangentbord", - "overrideCredentialUsername": "Åsidosätt Användarnamn", - "overrideCredentialUsernameDesc": "Använd det användarnamn som anges ovan istället för användarnamnet", - "jumpHostChain": "Hopp värdkedja", - "portKnocking": "Port knackning", - "addKnock": "Lägg till port", - "addProxyNode": "Lägg till nod", - "proxyNode": "Proxy nod", - "proxyType": "Typ av proxy", - "quickActions": "Snabba åtgärder", - "sudoPasswordAutoFill": "Sudo Lösenord Auto-Fill", - "sudoPassword": "Sudo Lösenord", - "keepaliveInterval": "Håll tidsintervall (ms)", - "moshCommand": "MOSH-kommando", - "environmentVariables": "Miljövariabler", - "addVariable": "Lägg till variabel", - "docker": "Docker", - "copyTerminalUrl": "Kopiera Terminal URL", - "copyFileManagerUrl": "Kopiera filhanterarens URL", - "copyRemoteDesktopUrl": "Kopiera URL för fjärrskrivbord", - "failedToConnect": "Det gick inte att ansluta till konsolen", - "connect": "Anslut", - "disconnect": "Koppla från", - "start": "Starta", - "enableStatusCheck": "Aktivera statuskontroll", - "enableMetrics": "Aktivera statistik", - "bulkUpdateFailed": "Bulkuppdatering misslyckades", - "selectAll": "Markera alla", - "deselectAll": "Avmarkera alla", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Hamnarbetare", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Säker skal", - "virtualNetwork": "Virtuellt nätverk", - "unencryptedShell": "Okrypterad skal", - "addressIp": "Adress / IP", - "friendlyName": "Vänligt namn", - "folderAndAdvanced": "Mapp & Avancerat", - "privateNotes": "Privata anteckningar", - "privateNotesPlaceholder": "Detaljer om denna server...", - "pinToTop": "Fäst högst upp", - "pinToTopDesc": "Visa alltid denna värd högst upp i listan", - "portKnockingSequence": "Portens knackande sekvens", - "addKnockBtn": "Lägg till knock", - "noPortKnocking": "Ingen portknackning konfigurerad.", - "knockPort": "Knacka port", - "protocol": "Protocol", - "delayAfterMs": "Fördröjning efter (ms)", - "useSocks5Proxy": "Använd SOCKS5-proxy", - "useSocks5ProxyDesc": "Ruttanslutning via en proxyserver", - "proxyHost": "Proxy värd", - "proxyPort": "Proxy port", - "proxyUsername": "Proxy användarnamn", - "proxyPassword": "Proxy Lösenord", - "proxySingleMode": "Enskild proxy", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Protokoll", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", "proxyChainMode": "Proxy Chain", - "you": "Du", - "jumpHostChainLabel": "Hopp värdkedja", - "addJumpBtn": "Lägg till hopp", - "noJumpHosts": "Inga hopp värdar konfigurerade.", - "selectAServer": "Välj en server...", - "sshPort": "SSH-port", - "authMethod": "Auth metod", - "storedCredential": "Lagrad referens", - "selectACredential": "Välj en inloggning...", - "keyTypeLabel": "Nyckel typ", - "keyTypeAuto": "Identifiera automatiskt", - "keyPasteTab": "Klistra in", - "keyUploadTab": "Ladda upp", - "keyFileLoaded": "Nyckelfil laddad", - "keyUploadClick": "Klicka för att ladda upp .pem / .key / .ppk", - "clearKey": "Rensa nyckel", - "keySaved": "SSH-nyckel sparad", - "keyReplaceNotice": "klistra in en ny nyckel nedan för att ersätta den", - "keyPassphraseSaved": "Lösenfras sparad, skriv för att ändra", - "replaceKey": "Ersätt nyckel", - "forceKeyboardInteractiveLabel": "Tvinga interaktiv tangentbord", - "forceKeyboardInteractiveShortDesc": "Tvinga manuell lösenordsinmatning även om nycklar finns", - "terminalAppearance": "Utseende terminal", - "colorTheme": "Färg tema", - "fontFamilyLabel": "Teckensnittsfamilj", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Markörens stil", - "letterSpacingPx": "Brev mellanrum (px)", - "lineHeightLabel": "Linje höjd", - "bellStyleLabel": "Klockans stil", - "backspaceModeLabel": "Läge för backsteg", - "cursorBlinking": "Markör Blinkande", - "cursorBlinkingDesc": "Aktivera blinkande animering för terminalmarkören", - "rightClickSelectsWordLabel": "Högerklicka Väljer Word", - "rightClickSelectsWordShortDesc": "Välj ordet under markören vid högerklicka", - "behaviorAndAdvanced": "Beteende & Avancerat", - "scrollbackBufferLabel": "Scrollback buffert", - "scrollbackMaxLines": "Maximalt antal rader som hålls i historiken", - "sshAgentForwardingLabel": "SSH agentvidarebefordran", - "sshAgentForwardingShortDesc": "Passera dina lokala SSH-nycklar till denna värd", - "enableAutoMosh": "Aktivera Auto-Mosh", - "enableAutoMoshDesc": "Föredrar Mosh över SSH om tillgängligt", - "enableAutoTmux": "Aktivera Auto-Tmux", - "enableAutoTmuxDesc": "Starta eller bifoga automatiskt till tmux-sessionen", - "sudoPasswordAutoFillLabel": "Sudo Lösenord Autofyllning", - "sudoPasswordAutoFillShortDesc": "Ange automatiskt sudo lösenord när du blir ombedd", - "sudoPasswordLabel": "Sudo Lösenord", - "environmentVariablesLabel": "Miljövariabler", - "addVariableBtn": "Lägg till variabel", - "noEnvVars": "Inga miljövariabler konfigurerade.", - "fastScrollModifierLabel": "Snabb bläddringsmodifierare", - "fastScrollSensitivityLabel": "Snabb rullningskänslighet", - "moshCommandLabel": "Mosh Kommando", - "startupSnippetLabel": "Starta textmodulen", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Keepalive-intervall (sekunder)", - "maxKeepaliveMisses": "Max antal missar", - "tunnelSettings": "Inställningar för tunneln", - "enableTunneling": "Aktivera tunnel", - "enableTunnelingDesc": "Aktivera SSH-tunnelfunktionen för denna värd", - "serverTunnelsSection": "Serverns tunnlar", - "addTunnelBtn": "Lägg till tunnel", - "noTunnelsConfigured": "Inga tunnlar konfigurerade.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", "tunnelLabel": "Tunnel {{number}}", - "tunnelType": "Typ av tunnel", - "tunnelModeLocalDesc": "Vidarebefordra en lokal port till en port på fjärrservern (eller en värd som kan nås från den).", - "tunnelModeRemoteDesc": "Vidarebefordra en port på fjärrservern tillbaka till en lokal port på din maskin.", - "tunnelModeDynamicDesc": "Skapa en SOCKS5-proxy på en lokal port för dynamisk portvidarebefordran.", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Denna värd (direkt tunnel)", - "endpointHost": "Slutpunkt värd", - "endpointPort": "Slutpunkt port", - "bindHost": "Bind värd", - "sourcePort": "Källans port", - "maxRetries": "Max antal försök", - "retryIntervalS": "Försök igen intervall (er)", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", "autoStartLabel": "Auto-start", - "autoStartDesc": "Anslut automatiskt denna tunnel när värden är laddad", - "tunnelConnecting": "Tunneln ansluter...", - "tunnelDisconnected": "Tunnel frånkopplad", - "failedToConnectTunnel": "Det gick inte att ansluta", - "failedToDisconnectTunnel": "Misslyckades att koppla från", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", "dockerIntegration": "Docker Integration", - "enableDockerMonitor": "Aktivera Docker", - "enableDockerMonitorDesc": "Övervaka och hantera behållare på denna värd via Docker", - "enableFileManagerMonitor": "Aktivera filhanteraren", - "enableFileManagerMonitorDesc": "Bläddra och hantera filer på denna värd via SFTP", - "defaultPathLabel": "Standard sökväg", - "fileManagerPathHint": "Katalogen att öppna när filhanteraren startar för denna värd.", - "statusChecksLabel": "Statuskontroller", - "enableStatusChecks": "Aktivera statuskontroller", - "enableStatusChecksDesc": "Ping denna värd regelbundet för att verifiera tillgängligheten", - "useGlobalInterval": "Använd globalt intervall", - "useGlobalIntervalDesc": "Åsidosätt med intervallet för statuskontroll över hela servern", - "checkIntervalS": "Kontrollera intervall (er)", - "checkIntervalDesc": "Sekunder mellan varje anslutning ping", - "metricsCollectionLabel": "Metrics samling", - "enableMetricsLabel": "Aktivera statistik", - "enableMetricsDesc": "Samla CPU, RAM, disk och nätverksanvändning från denna värd", - "useGlobalMetrics": "Använd globalt intervall", - "useGlobalMetricsDesc": "Åsidosätt med det serveromfattande intervallet", - "metricsIntervalS": "Metrics intervall (er)", - "metricsIntervalDesc2": "Sekunder mellan metriska ögonblicksbilder", - "visibleWidgets": "Synliga widgetar", - "cpuUsageLabel": "CPU användning", - "cpuUsageDesc": "CPU-procent, belastningsmedelvärden, sparkline graf", - "memoryLabel": "Minnesanvändning", - "memoryDesc": "RAM-användning, byte, cachelagrad", - "storageLabel": "Diskanvändning", - "storageDesc": "Diskanvändning per monteringspunkt", - "networkLabel": "Nätverksgränssnitt", - "networkDesc": "Gränssnittslista och bandbredd", - "uptimeLabel": "Drifttid", - "uptimeDesc": "Systemets drifttid och starttid", - "systemInfoLabel": "Systeminformation", - "systemInfoDesc": "OS, kärna, värdnamn, arkitektur", - "recentLoginsLabel": "Senaste inloggningar", - "recentLoginsDesc": "Lyckade och misslyckade inloggningshändelser", - "topProcessesLabel": "Topp processer", - "topProcessesDesc": "PID, CPU%, MEM%, kommando", - "listeningPortsLabel": "Lyssnar på portar", - "listeningPortsDesc": "Öppna portar med process och tillstånd", - "firewallLabel": "Brandvägg", - "firewallDesc": "Brandvägg, AppArmor, SELinux status", - "quickActionsLabel": "Snabba åtgärder", - "quickActionsToolbar": "Snabbåtgärder visas som knappar i serverstatistikens verktygsfält för ett klick kommandoutförande.", - "noQuickActions": "Inga snabba åtgärder ännu.", - "buttonLabel": "Knapp etikett", - "selectSnippetPlaceholder": "Välj snippet...", - "addActionBtn": "Lägg till åtgärd", - "hostSharedSuccessfully": "Värden delades framgångsrikt", - "failedToShareHost": "Misslyckades att dela värd", - "accessRevoked": "Åtkomst återkallad", - "failedToRevokeAccess": "Det gick inte att återkalla åtkomst", - "cancelBtn": "Avbryt", - "savingBtn": "Sparar...", - "addHostBtn": "Lägg till värd", - "hostUpdated": "Värd uppdaterad", - "hostCreated": "Värd skapad", - "failedToSave": "Det gick inte att spara värden", - "credentialUpdated": "Uppgifter uppdaterade", - "credentialCreated": "Uppgifter skapad", - "failedToSaveCredential": "Kunde inte spara autentiseringsuppgifter", - "backToHosts": "Tillbaka till värdar", - "backToCredentials": "Tillbaka till inloggningsuppgifter", - "pinned": "Klistrad", - "noHostsFound": "Inga värdar hittades", - "tryDifferentTerm": "Prova en annan term", - "addFirstHost": "Lägg till din första värd för att komma igång", - "noCredentialsFound": "Inga inloggningsuppgifter hittades", - "addCredentialBtn": "Lägg till autentiseringsuppgifter", - "updateCredentialBtn": "Uppdatera autentiseringsuppgifter", - "features": "Funktioner", - "noFolder": "(Ingen mapp)", - "deleteSelected": "Radera", - "exitSelection": "Avsluta markering", - "importSkip": "Importera (hoppa över befintliga)", - "importOverwrite": "Importera (skriv över)", - "collapseBtn": "Komprimera", - "importExportBtn": "Importera / Exportera", - "hostStatusesRefreshed": "Värdstatusar uppdaterade", - "failedToRefreshHosts": "Det gick inte att uppdatera värdar", - "movedHostTo": "Flyttade {{host}} till \"{{folder}}\"", - "failedToMoveHost": "Det gick inte att flytta värd", - "folderRenamedTo": "Mappen har bytt namn till \"{{name}}\"", - "deletedFolder": "Raderad mapp \"{{name}}\"", - "failedToDeleteFolder": "Kunde inte ta bort mapp", - "deleteAllInFolder": "Ta bort alla värdar i \"{{name}}\"? Detta kan inte ångras.", - "deletedHost": "Raderad {{name}}", - "copiedToClipboard": "Kopierad till urklipp", - "terminalUrlCopied": "Terminal URL kopierad", - "fileManagerUrlCopied": "Filhanterarens URL har kopierats", - "tunnelUrlCopied": "Tunnel URL kopierad", - "dockerUrlCopied": "Docker URL kopierad", - "serverStatsUrlCopied": "Server statistik-URL kopierad", - "rdpUrlCopied": "RDP-URL kopierad", - "vncUrlCopied": "VNC-URL kopierad", - "telnetUrlCopied": "Telnet URL kopierad", - "remoteDesktopUrlCopied": "URL för fjärrskrivbord har kopierats", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Lösenord", + "authTypeKey": "SSH-nyckel", + "authTypeCredential": "Referenser", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "Ingen", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Avboka", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "Fäst", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Drag", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Avboka", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protokoll", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Expandera åtgärder", "collapseActions": "Komprimera åtgärder", "wakeOnLanAction": "Vakna på LAN", - "wakeOnLanSuccess": "Magiskt paket skickat till {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Misslyckades med att skicka magiskt paket", - "cloneHostAction": "Klona Värd", - "copyAddress": "Kopiera adress", - "copyLink": "Kopiera länk", - "copyTerminalUrlAction": "Kopiera Terminal URL", - "copyFileManagerUrlAction": "Kopiera filhanterarens URL", - "copyTunnelUrlAction": "Kopiera tunnel URL", - "copyDockerUrlAction": "Kopiera Docker-URL", - "copyServerStatsUrlAction": "Kopiera serverstatistik URL", - "copyRdpUrlAction": "Kopiera RDP-URL", - "copyVncUrlAction": "Kopiera VNC-URL", - "copyTelnetUrlAction": "Kopiera Telnet URL", - "copyRemoteDesktopUrlAction": "Kopiera URL för fjärrskrivbord", - "deleteCredentialConfirm": "Ta bort autentiseringsuppgifter \"{{name}}\"?", - "deletedCredential": "Raderad {{name}}", - "deploySSHKeyTitle": "Distribuera SSH-nyckel", - "deployingBtn": "Utrustar...", - "deployBtn": "Distribuera", - "failedToDeployKey": "Det gick inte att distribuera nyckel", - "deleteHostsConfirm": "Ta bort {{count}} värd{{plural}}? Detta kan inte ångras.", - "movedToRoot": "Flyttad till rot", - "failedToMoveHosts": "Det gick inte att flytta värdar", - "enableTerminalFeature": "Aktivera Terminal", - "disableTerminalFeature": "Inaktivera Terminal", - "enableFilesFeature": "Aktivera filer", - "disableFilesFeature": "Inaktivera filer", - "enableTunnelsFeature": "Aktivera tunnlar", - "disableTunnelsFeature": "Inaktivera tunnlar", - "enableDockerFeature": "Aktivera Docker", - "disableDockerFeature": "Inaktivera Docker", - "addTagsPlaceholder": "Lägg till taggar...", - "authDetails": "Autentiseringsdetaljer", - "credType": "Typ", - "generateKeyPairDesc": "Skapa ett nytt nyckelpar, både privata och offentliga nycklar kommer att fyllas automatiskt.", - "generatingKey": "Genererar...", - "generateLabel": "Generera {{label}}", - "uploadFileBtn": "Ladda upp fil", - "keyPassphraseOptional": "Lösenfras (valfritt)", - "sshPublicKeyOptional": "Publik SSH-nyckel (valfritt)", - "publicKeyGenerated": "Offentlig nyckel genererad", - "failedToGeneratePublicKey": "Det gick inte att härleda publik nyckel", - "publicKeyCopied": "Publik nyckel kopierad", - "keyPairGenerated": "{{label}} nyckelpar genererade", - "failedToGenerateKeyPair": "Det gick inte att generera nyckelpar", - "searchHostsPlaceholder": "Sök värdar, adresser, taggar…", - "searchCredentialsPlaceholder": "Sök inloggningsuppgifter…", - "refreshBtn": "Uppdatera", - "addTag": "Lägg till taggar...", - "deleteConfirmBtn": "Radera", - "tunnelRequirementsText": "SSH-servern måste ha GatewayPorts ja, AllowTcpForwarding ja, och PermitRootLogin ja satt i /etc/ssh/sshd_config.", - "deleteHostConfirm": "Ta bort \"{{name}}\"?", - "enableAtLeastOneProtocol": "Aktivera minst ett protokoll ovan för att konfigurera autentisering och anslutningsinställningar.", - "keyPassphrase": "Lösenfras för nyckel", - "connectBtn": "Anslut", - "disconnectBtn": "Koppla från", - "basicInformation": "Grundläggande information", - "authDetailsSection": "Autentiseringsdetaljer", - "credTypeLabel": "Typ", - "hostsTab": "Värdar", - "credentialsTab": "Användaruppgifter", - "selectMultiple": "Välj flera", - "selectHosts": "Välj värdar", - "connectionLabel": "Anslutning", - "authenticationLabel": "Autentisering", - "generateKeyPairTitle": "Generera nyckelpar", - "generateKeyPairDescription": "Skapa ett nytt nyckelpar, både privata och offentliga nycklar kommer att fyllas automatiskt.", - "generateFromPrivateKey": "Generera från privat nyckel", - "refreshBtn2": "Uppdatera", - "exitSelectionTitle": "Avsluta markering", - "exportAll": "Exportera alla", - "addHostBtn2": "Lägg till värd", - "addCredentialBtn2": "Lägg till autentiseringsuppgifter", - "checkingHostStatuses": "Kontrollerar värdstatus...", - "pinnedSection": "Klistrad", - "hostsExported": "Värdar exporterade framgångsrikt", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "Fäst", + "hostsExported": "Hosts exported successfully", "exportFailed": "Misslyckades med att exportera värdar", - "sampleDownloaded": "Exempelfil hämtad", - "failedToDeleteCredential2": "Kunde inte ta bort autentiseringsuppgifter", - "noFolderOption": "(Ingen mapp)", - "nSelected": "{{count}} vald", - "featuresMenu": "Funktioner", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "Drag", "moveMenu": "Flytta", - "cancelSelection": "Avbryt", - "deployDialogDesc": "Distribuera {{name}} till en värds authorized_keys.", - "targetHostLabel": "Målets värd", - "selectHostOption": "Välj en värd...", - "keyDeployedSuccess": "Nyckeln har installerats", - "failedToDeployKey2": "Det gick inte att distribuera nyckel", - "deletedCount": "Raderade {{count}} värdar", - "failedToDeleteCount": "Det gick inte att ta bort {{count}} värdar", - "duplicatedHost": "Duplicerad \"{{name}}\"", - "failedToDuplicateHost": "Det gick inte att duplicera värd", - "updatedCount": "Uppdaterade {{count}} värdar", - "friendlyNameLabel": "Vänligt namn", - "descriptionLabel": "Beskrivning", - "loadingHost": "Laddar värd...", - "loadingHosts": "Laddar värdar...", - "loadingCredentials": "Laddar referenser...", - "noHostsYet": "Ännu inga värdar", - "noHostsMatchSearch": "Inga värdar matchar din sökning", - "hostNotFound": "Värden hittades inte", - "searchHosts": "Sök värdar...", + "connectSelected": "Connect", + "cancelSelection": "Avboka", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Sortera värdar", "sortDefault": "Standardbeställning", "sortNameAsc": "Namn (A → Ö)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Hamnarbetare", "filterTagsGroup": "Taggar", - "shareHost": "Dela värd", - "shareHostTitle": "Dela: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Denna värd måste använda en inloggning för att aktivera delning. Redigera värden och tilldela en inloggning först." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "Anslutning", - "authentication": "Autentisering", - "connectionSettings": "Inställningar för anslutning", - "displaySettings": "Visa inställningar", - "audioSettings": "Inställningar för ljud", - "rdpPerformance": "RDP prestanda", - "deviceRedirection": "Omdirigering av enhet", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Referenser", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", "session": "Session", - "gateway": "Portgång", - "remoteApp": "Fjärrapp", - "clipboard": "Urklipp", - "sessionRecording": "Sessionsinspelning", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC inställningar", - "terminalSettings": "Terminalinställningar", - "rdpPort": "RDP-port", - "username": "Användarnamn", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Lösenord", - "domain": "Domän", - "securityMode": "Säkerhetsläge", - "colorDepth": "Färg djup", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Höjd", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Ändra storlek", - "clientName": "Klientens namn", - "initialProgram": "Initialt program", - "serverLayout": "Serverns layout", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Gateway port", - "gatewayUsername": "Gateway användarnamn", - "gatewayPassword": "Gateway Lösenord", - "gatewayDomain": "Gateway domän", - "remoteAppProgram": "Fjärrapp Program", - "workingDirectory": "Arbetar katalog", - "arguments": "Argument", - "normalizeLineEndings": "Normalisera radslut", - "recordingPath": "Sökväg för inspelning", - "recordingName": "Inspelningsnamn", - "macAddress": "MAC adress", - "broadcastAddress": "Sändnings adress", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Väntetid (er)", - "driveName": "Enhetens namn", - "drivePath": "Sökväg för enhet", - "ignoreCertificate": "Ignorera certifikat", - "ignoreCertificateDesc": "Tillåt anslutningar till värdar med självsignerade certifikat", - "forceLossless": "Tvinga förlustfri", - "forceLosslessDesc": "Tvinga förlustfri bildkodning (högre kvalitet, mer bandbredd)", - "disableAudio": "Inaktivera ljud", - "disableAudioDesc": "Stäng av allt ljud från fjärrsessionen", - "enableAudioInput": "Aktivera ljudinmatning (mikrofon)", - "enableAudioInputDesc": "Vidarebefordra lokal mikrofon till fjärrsessionen", - "wallpaper": "Bakgrund", - "wallpaperDesc": "Visa skrivbordsunderlägg (inaktivera förbättrar prestanda)", - "theming": "Tema", - "themingDesc": "Aktivera visuella teman och stilar", - "fontSmoothing": "Utjämning av typsnitt", - "fontSmoothingDesc": "Aktivera ClearType-teckensnittsrendering", - "fullWindowDrag": "Helfönstret drar", - "fullWindowDragDesc": "Visa fönsterinnehåll medan du drar", - "desktopComposition": "Skrivbordssammansättning", - "desktopCompositionDesc": "Aktivera Aero-glaseffekter", - "menuAnimations": "Menyanimationer", - "menuAnimationsDesc": "Aktivera menytoning och bildspel", - "disableBitmapCaching": "Inaktivera Bitmap Caching", - "disableBitmapCachingDesc": "Stäng av bitmap cache (kan hjälpa till med buggar)", - "disableOffscreenCaching": "Inaktivera cachning av Offscreen", - "disableOffscreenCachingDesc": "Stäng av offscreen-cache", - "disableGlyphCaching": "Inaktivera Glyph Caching", - "disableGlyphCachingDesc": "Stäng av glyfcache", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Använd RemoteFX grafik pipeline", - "enablePrinting": "Aktivera utskrift", - "enablePrintingDesc": "Omdirigera lokala skrivare till fjärrsessionen", - "enableDriveRedirection": "Aktivera omdirigering av enhet", - "enableDriveRedirectionDesc": "Karta en lokal mapp som en enhet i fjärrsessionen", - "createDrivePath": "Skapa sökväg", - "createDrivePathDesc": "Skapa mappen automatiskt om den inte existerar", - "disableDownload": "Inaktivera nedladdning", - "disableDownloadDesc": "Förhindra nedladdning av filer från fjärrsessionen", - "disableUpload": "Inaktivera uppladdning", - "disableUploadDesc": "Förhindra uppladdning av filer till fjärrsessionen", - "enableTouch": "Aktivera tryck", - "enableTouchDesc": "Aktivera vidarebefordran av tryckindata", - "consoleSession": "Konsolens session", - "consoleSessionDesc": "Anslut till konsolen (session 0) istället för en ny session", - "sendWolPacket": "Skicka WOL-paket", - "sendWolPacketDesc": "Skicka ett magiskt paket för att väcka denna värd innan du ansluter", - "disableCopy": "Inaktivera kopiering", - "disableCopyDesc": "Förhindra kopiering av text från fjärrsessionen", - "disablePaste": "Inaktivera klistra in", - "disablePasteDesc": "Förhindra att klistra in text i fjärrsessionen", - "createPathIfMissing": "Skapa sökväg om det saknas", - "createPathIfMissingDesc": "Skapa automatiskt inspelningsmappen", - "excludeOutput": "Exkludera utdata", - "excludeOutputDesc": "Spela inte in skärmutmatning (endast metadata)", - "excludeMouse": "Exkludera mus", - "excludeMouseDesc": "Spela inte in musrörelser", - "includeKeystrokes": "Inkludera tangenttryckningar", - "includeKeystrokesDesc": "Spela in råa tangenttryckningar förutom skärmutmatning", - "vncPort": "VNC-port", - "vncPassword": "VNC Lösenord", - "vncUsernameOptional": "Användarnamn (valfritt)", - "vncLeaveBlank": "Lämna tomt om det inte krävs", - "cursorMode": "Markörens läge", - "swapRedBlue": "Byt röd/blå", - "swapRedBlueDesc": "Byt ut de röda och blå färgkanalerna (fixar vissa färgfrågor)", - "readOnly": "Skrivskyddad", - "readOnlyDesc": "Visa fjärrskärmen utan att skicka någon ingång", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", "telnetPort": "Telnet Port", - "terminalType": "Terminal typ", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Färgschema", - "backspaceKey": "Nyckel för backsteg", - "saveHostFirst": "Spara värden först.", - "sharingOptionsAfterSave": "Delningsalternativ är tillgängliga efter att värden har sparats.", - "sharingLoadError": "Det gick inte att ladda delningsdata. Kontrollera din anslutning och försök igen.", - "shareHostSection": "Dela värd", - "shareWithUser": "Dela med användare", - "shareWithRole": "Dela med roll", - "selectUser": "Välj användare", - "selectRole": "Välj roll", - "selectUserOption": "Välj en användar...", - "selectRoleOption": "Välj en roll...", - "permissionLevel": "Behörighetsnivå", - "expiresInHours": "Förfaller om (timmar)", - "noExpiryPlaceholder": "Lämna tomt för inget utgångsdatum", - "shareBtn": "Dela", - "currentAccess": "Aktuell åtkomst", - "typeHeader": "Typ", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Behörighet", - "grantedByHeader": "Beviljad av", - "expiresHeader": "Förfaller", - "noAccessEntries": "Inga accessposter ännu.", - "expiredLabel": "Förfallen", - "neverLabel": "Aldrig", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", - "cancelBtn": "Avbryt", - "savingBtn": "Sparar...", - "updateHostBtn": "Uppdatera värd", - "addHostBtn": "Lägg till värd" + "cancelBtn": "Avboka", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Sök värdar, kommandon eller inställningar...", - "quickActions": "Snabba åtgärder", - "hostManager": "Värdhanterare", - "hostManagerDesc": "Hantera, lägga till eller redigera värdar", - "addNewHost": "Lägg till ny värd", - "addNewHostDesc": "Registrera en ny värd", - "adminSettings": "Administratörsinställningar", - "adminSettingsDesc": "Konfigurera systeminställningar och användare", - "userProfile": "Användarprofil", - "userProfileDesc": "Hantera ditt konto och inställningar", - "addCredential": "Lägg till autentiseringsuppgifter", - "addCredentialDesc": "Spara SSH-nycklar eller lösenord", - "recentActivity": "Senaste aktivitet", - "serversAndHosts": "Servrar och värdar", - "noHostsFound": "Inga värdar hittade matchande \"{{search}}\"", - "links": "Länkar", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Välj", - "toggleWith": "Växla med" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Ingen flik tilldelad", + "noTabAssigned": "No tab assigned", "focusedPane": "Aktiv ruta" }, "connections": { "noConnections": "Inga anslutningar", "noConnectionsDesc": "Öppna en terminal, filhanterare eller fjärrskrivbord för att se anslutningar här", - "connectedFor": "Ansluten för {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Ansluten", "disconnected": "Osammanhängande", "closeTab": "Stäng fliken", @@ -801,358 +981,374 @@ "sectionBackground": "Bakgrund", "backgroundDesc": "Sessioner kvarstår i 30 minuter efter frånkoppling och kan återanslutas.", "persisted": "Fortsatte i bakgrunden", - "expiresIn": "Utgår om {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Sök efter kopplingar...", - "noSearchResults": "Inga kontakter matchar din sökning" + "noSearchResults": "Inga kontakter matchar din sökning", + "rename": "Rename session" }, "guacamole": { - "connecting": "Ansluter till {{type}} session...", - "connectionError": "Anslutningsfel", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "Anslutningen misslyckades", - "failedToConnect": "Det gick inte att hämta anslutningstoken", - "hostNotFound": "Värden hittades inte", - "noHostSelected": "Ingen värd vald", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "Återanslut", - "retry": "Försök igen", - "guacdUnavailable": "Fjärrskrivbordstjänst (guacd) är inte tillgänglig. Se till att guacd körs och är tillgänglig och konfigurerad korrekt i administratörsinställningar.", + "retry": "Försöka igen", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Lock skärm)", - "winKey": "Windows nyckel", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "Skift", - "win": "Vinn", - "stickyActive": "{{key}} (låst - klicka för att släppa)", - "stickyInactive": "{{key}} (klicka för att låsa)", - "esc": "Fly", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Hem", - "end": "Slut", - "pageUp": "Sida upp", - "pageDown": "Sida ner", - "arrowUp": "Pil upp", - "arrowDown": "Pil ner", - "arrowLeft": "Pil vänster", - "arrowRight": "Pil till höger", - "fnToggle": "Funktionsnycklar", - "reconnect": "Återanslut sessionen", - "collapse": "Komprimera verktygsfältet", - "expand": "Expandera verktygsfältet", - "dragHandle": "Dra för att flytta" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "Anslut till värd", - "clear": "Rensa", - "paste": "Klistra in", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "Återanslut", - "connectionLost": "Anslutning förlorad", + "connectionLost": "Connection lost", "connected": "Ansluten", - "clipboardWriteFailed": "Det gick inte att kopiera till urklipp. Se till att sidan serveras över HTTPS eller localhost.", - "clipboardReadFailed": "Det gick inte att läsa från urklipp. Se till att urklippsbehörigheterna är beviljade.", - "clipboardHttpWarning": "Klistra in kräver HTTPS. Använd Ctrl+Shift+V eller servera Termix över HTTPS.", - "unknownError": "Okänt fel uppstod", - "websocketError": "WebSocket anslutningsfel", - "connecting": "Ansluter...", - "noHostSelected": "Ingen värd vald", - "reconnecting": "Återansluter... ({{attempt}}/{{max}})", - "reconnected": "Återansluten framgångsrikt", - "tmuxSessionCreated": "tmux-session skapad: {{name}}", - "tmuxSessionAttached": "tmux session bifogad: {{name}}", - "tmuxUnavailable": "tmux är inte installerat på fjärrvärden, faller tillbaka till standard skal", - "tmuxSessionPickerTitle": "tmux sessioner", - "tmuxSessionPickerDesc": "Befintliga tmux-sessioner hittades på den här värden. Välj en för att ansluta eller skapa en ny session.", - "tmuxWindows": "Fönster", - "tmuxWindowCount": "{{count}} fönster", - "tmuxAttached": "Bifogade klienter", - "tmuxAttachedCount": "{{count}} bifogad", - "tmuxLastActivity": "Senaste aktivitet", - "tmuxTimeJustNow": "just nu", - "tmuxTimeMinutes": "{{count}}m sedan", - "tmuxTimeHours": "{{count}}h sedan", - "tmuxTimeDays": "{{count}}d sedan", - "tmuxCreateNew": "Starta ny session", - "tmuxCopyHint": "Justera markering och tryck Enter för att kopiera till urklipp", - "tmuxDetach": "Ta bort från tmux session", - "tmuxDetached": "Fristående från tmux-session", - "maxReconnectAttemptsReached": "Maximalt antal återanslutningsförsök har uppnåtts", - "closeTab": "Stäng", - "connectionTimeout": "Tidsgräns för anslutning", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Kör {{command}} - {{host}}", - "totpRequired": "Tvåfaktorsautentisering krävs", - "totpCodeLabel": "Verifieringskod", - "totpVerify": "Verifiera", - "warpgateAuthRequired": "Warpgate-autentisering krävs", - "warpgateSecurityKey": "Säkerhetsnyckel", - "warpgateAuthUrl": "URL för autentisering", - "warpgateOpenBrowser": "Öppna i webbläsare", - "warpgateContinue": "Jag har slutfört autentisering", - "opksshAuthRequired": "OPKSSH-autentisering krävs", - "opksshAuthDescription": "Fullständig autentisering i din webbläsare för att fortsätta. Denna session kommer att förbli giltig i 24 timmar.", - "opksshOpenBrowser": "Öppna webbläsaren för att autentisera", - "opksshWaitingForAuth": "Väntar på autentisering i webbläsaren...", - "opksshAuthenticating": "Bearbetar autentisering...", - "opksshTimeout": "Autentisering gick ut. Försök igen.", - "opksshAuthFailed": "Autentisering misslyckades. Kontrollera dina uppgifter och försök igen.", - "opksshSignInWith": "Logga in med {{provider}}", - "sudoPasswordPopupTitle": "Infoga lösenord?", - "websocketAbnormalClose": "Anslutning stängd oväntat. Detta kan bero på en omvänd proxy eller SSL-konfigurationsproblem. Kontrollera serverloggar.", - "connectionLogTitle": "Anslutningslogg", - "connectionLogCopy": "Kopiera loggar till urklipp", - "connectionLogEmpty": "Inga anslutningsloggar ännu", - "connectionLogWaiting": "Väntar på anslutningsloggar...", - "connectionLogCopied": "Anslutningsloggar kopierade till urklipp", - "connectionLogCopyFailed": "Det gick inte att kopiera loggar till urklipp", - "connectionRejected": "Anslutning avvisad av servern. Kontrollera din autentisering och nätverkskonfiguration.", - "hostKeyRejected": "Verifiering av SSH-värdnyckel avvisad. Anslutningen avbröts.", - "sessionTakenOver": "Sessionen öppnades i en annan flik. Återansluter..." + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Öppna", + "linkDialogCopy": "Kopiera", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Dela fliken", + "addToSplit": "Lägg till i delning", + "removeFromSplit": "Ta bort från Split" + } }, "fileManager": { - "noHostSelected": "Ingen värd vald", - "initializingEditor": "Initierar redaktör...", - "file": "Fil", - "folder": "Mapp", - "uploadFile": "Ladda upp fil", - "downloadFile": "Hämta", - "extractArchive": "Extrahera arkiv", - "extractingArchive": "Extraherar {{name}}...", - "archiveExtractedSuccessfully": "{{name}} har extraherats", - "extractFailed": "Extrahering misslyckades", - "compressFile": "Komprimera fil", - "compressFiles": "Komprimera filer", - "compressFilesDesc": "Komprimera {{count}} objekt till ett arkiv", - "archiveName": "Arkivets namn", - "enterArchiveName": "Ange arkivnamn...", - "compressionFormat": "Komprimeringsformat", - "selectedFiles": "Valda filer", - "andMoreFiles": "och {{count}} mer...", - "compress": "Komprimera", - "compressingFiles": "Komprimerar {{count}} objekt till {{name}}...", - "filesCompressedSuccessfully": "{{name}} har skapats", - "compressFailed": "Komprimering misslyckades", - "edit": "Redigera", - "preview": "Förhandsgranska", - "previous": "Föregående", - "next": "Nästa", - "pageXOfY": "Sida {{current}} av {{total}}", - "zoomOut": "Zooma ut", - "zoomIn": "Zooma in", - "newFile": "Ny fil", - "newFolder": "Ny mapp", - "rename": "Döp om", - "uploading": "Uppladdar...", - "uploadingFile": "Laddar upp {{name}}...", - "fileName": "Filnamn", - "folderName": "Mappens namn", - "fileUploadedSuccessfully": "Filen \"{{name}}\" laddades upp", - "failedToUploadFile": "Det gick inte att ladda upp fil", - "fileDownloadedSuccessfully": "Filen \"{{name}}\" hämtades framgångsrikt", - "failedToDownloadFile": "Kunde inte ladda ner fil", - "fileCreatedSuccessfully": "Filen \"{{name}}\" har skapats", - "folderCreatedSuccessfully": "Mappen \"{{name}}\" har skapats", - "failedToCreateItem": "Det gick inte att skapa objekt", - "operationFailed": "{{operation}} misslyckades för {{name}}: {{error}}", - "failedToResolveSymlink": "Det gick inte att lösa symbolisk länk", - "itemsDeletedSuccessfully": "{{count}} objekt har tagits bort", - "failedToDeleteItems": "Misslyckades att ta bort objekt", - "sudoPasswordRequired": "Lösenord för administratör krävs", - "enterSudoPassword": "Ange sudo lösenord för att fortsätta åtgärden", - "sudoPassword": "Sudo lösenord", - "sudoOperationFailed": "Sudo operation misslyckades", - "sudoAuthFailed": "Sudo-autentisering misslyckades", - "dragFilesToUpload": "Släpp filer här för att ladda upp", - "emptyFolder": "Denna mapp är tom", - "searchFiles": "Sök filer...", - "upload": "Ladda upp", - "selectHostToStart": "Välj en värd för att starta filhantering", - "sshRequiredForFileManager": "Filhanteraren kräver SSH. Värden har inte SSH aktiverat.", - "failedToConnect": "Det gick inte att ansluta till SSH", - "failedToLoadDirectory": "Det gick inte att ladda katalog", - "noSSHConnection": "Ingen SSH-anslutning tillgänglig", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "copy": "Kopiera", - "cut": "Klipp", - "paste": "Klistra in", - "copyPath": "Kopiera sökväg", - "copyPaths": "Kopiera sökvägar", - "delete": "Radera", - "properties": "Egenskaper", - "refresh": "Uppdatera", - "downloadFiles": "Ladda ner {{count}} filer till Webbläsaren", - "copyFiles": "Kopiera {{count}} objekt", - "cutFiles": "Klipp ut {{count}} objekt", - "deleteFiles": "Ta bort {{count}} objekt", - "filesCopiedToClipboard": "{{count}} objekt kopierade till urklipp", - "filesCutToClipboard": "{{count}} objekt klippta till urklipp", - "pathCopiedToClipboard": "Sökväg kopierad till urklipp", - "pathsCopiedToClipboard": "{{count}} vägar kopierade till urklipp", - "failedToCopyPath": "Det gick inte att kopiera sökvägen till urklipp", - "movedItems": "Flyttade {{count}} objekt", - "failedToDeleteItem": "Misslyckades att ta bort objekt", - "itemRenamedSuccessfully": "{{type}} omdöpt framgångsrikt", - "failedToRenameItem": "Det gick inte att byta namn på objekt", - "download": "Hämta", - "permissions": "Behörigheter", - "size": "Storlek", - "modified": "Ändrad", - "path": "Sökväg", - "confirmDelete": "Är du säker på att du vill radera {{name}}?", - "permissionDenied": "Åtkomst nekad", - "serverError": "Serverfel", - "fileSavedSuccessfully": "Filen har sparats", - "failedToSaveFile": "Det gick inte att spara filen", - "confirmDeleteSingleItem": "Är du säker på att du vill ta bort permanent \"{{name}}\"?", - "confirmDeleteMultipleItems": "Är du säker på att du vill radera {{count}} objekt permanent?", - "confirmDeleteMultipleItemsWithFolders": "Är du säker på att du vill ta bort {{count}} objekt permanent? Detta inkluderar mappar och deras innehåll.", - "confirmDeleteFolder": "Är du säker på att du vill ta bort mappen \"{{name}}\" och allt dess innehåll?", - "permanentDeleteWarning": "Denna åtgärd kan inte ångras. Objektet kommer att raderas permanent från servern.", - "recent": "Senaste", - "pinned": "Klistrad", - "folderShortcuts": "Genvägar för mapp", - "failedToReconnectSSH": "Det gick inte att återansluta SSH-sessionen", - "openTerminalHere": "Öppna Terminal här", - "run": "Kör", - "openTerminalInFolder": "Öppna Terminal i den här mappen", - "openTerminalInFileLocation": "Öppna Terminal på filens plats", - "runningFile": "Körs - {{file}}", - "onlyRunExecutableFiles": "Kan bara köra körbara filer", - "directories": "Kataloger", - "removedFromRecentFiles": "Tog bort \"{{name}}\" från de senaste filerna", - "removeFailed": "Borttagning misslyckades", - "unpinnedSuccessfully": "Ej fäst \"{{name}}\" lyckades", - "unpinFailed": "Lossa misslyckades", - "removedShortcut": "Tog bort genväg \"{{name}}\"", - "removeShortcutFailed": "Ta bort genväg misslyckades", - "clearedAllRecentFiles": "Rensade alla senaste filer", - "clearFailed": "Rensa misslyckades", - "removeFromRecentFiles": "Ta bort från senaste filer", - "clearAllRecentFiles": "Rensa alla senaste filer", - "unpinFile": "Lossa fil", - "removeShortcut": "Ta bort genväg", - "pinFile": "Fäst fil", - "addToShortcuts": "Lägg till genvägar", - "pasteFailed": "Klistra in misslyckades", - "noUndoableActions": "Inga ogenomförbara åtgärder", - "undoCopySuccess": "Ogiltig kopieringsoperation: Raderade {{count}} kopierade filer", - "undoCopyFailedDelete": "Ångra misslyckades: Kunde inte ta bort några kopierade filer", - "undoCopyFailedNoInfo": "Ångra misslyckades: Kunde inte hitta kopierad filinformation", - "undoMoveSuccess": "Ångra flyttning: Flyttade {{count}} filer tillbaka till ursprunglig plats", - "undoMoveFailedMove": "Ångra misslyckades: Kunde inte flytta några filer tillbaka", - "undoMoveFailedNoInfo": "Ångra misslyckades: Kunde inte hitta flyttad filinformation", - "undoDeleteNotSupported": "Borttagningsåtgärden kan inte ångras: Filer har tagits bort permanent från servern", - "undoTypeNotSupported": "Ångra åtgärdstypen stöds inte", - "undoOperationFailed": "Ångra åtgärden misslyckades", - "unknownError": "Okänt fel", - "confirm": "Bekräfta", - "find": "Sök...", - "replace": "Ersätt", - "downloadInstead": "Ladda ner istället", - "keyboardShortcuts": "Genvägar för tangentbord", - "searchAndReplace": "Sök & Ersätt", - "editing": "Redigerar", - "search": "Sök", - "findNext": "Hitta nästa", - "findPrevious": "Hitta föregående", - "save": "Spara", - "selectAll": "Markera alla", - "undo": "Ångra", - "redo": "Gör om", - "moveLineUp": "Flytta linjen uppåt", - "moveLineDown": "Flytta linjen nedåt", - "toggleComment": "Växla kommentar", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Fäst", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Sikt", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Det gick inte att ladda bilden", - "startTyping": "Börja skriva...", - "unknownSize": "Okänd storlek", - "fileIsEmpty": "Filen är tom", - "largeFileWarning": "Stor filvarning", - "largeFileWarningDesc": "Denna fil är {{size}} i storlek, vilket kan orsaka prestandaproblem när den öppnas som text.", - "fileNotFoundAndRemoved": "Filen \"{{name}}\" hittades inte och har tagits bort från senast/fästa filer", - "failedToLoadFile": "Det gick inte att ladda filen: {{error}}", - "serverErrorOccurred": "Serverfel uppstod. Försök igen senare.", - "autoSaveFailed": "Auto-sparning misslyckades", - "fileAutoSaved": "Fil automatiskt sparad", - "moveFileFailed": "Det gick inte att flytta {{name}}", - "moveOperationFailed": "Flyttningen misslyckades", - "canOnlyCompareFiles": "Kan bara jämföra två filer", - "comparingFiles": "Jämföra filer: {{file1}} och {{file2}}", - "dragFailed": "Drag operation misslyckades", - "filePinnedSuccessfully": "Filen \"{{name}}\" fäst framgångsrikt", - "pinFileFailed": "Det gick inte att fästa filen", - "fileUnpinnedSuccessfully": "Filen \"{{name}}\" lossas framgångsrikt", - "unpinFileFailed": "Det gick inte att lossa filen", - "shortcutAddedSuccessfully": "Genväg till mappen \"{{name}}\" har lagts till", - "addShortcutFailed": "Kunde inte lägga till genväg", - "operationCompletedSuccessfully": "{{operation}} {{count}} objekt framgångsrikt", - "operationCompleted": "{{operation}} {{count}} objekt", - "downloadFileSuccess": "Filen {{name}} hämtades framgångsrikt", - "downloadFileFailed": "Nedladdning misslyckades", - "moveTo": "Flytta till {{name}}", - "diffCompareWith": "Diff jämför med {{name}}", - "dragOutsideToDownload": "Dra utanför fönstret för att ladda ner ({{count}} filer)", - "newFolderDefault": "NyMapp", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Framgångsrikt flyttat {{count}} objekt till {{target}}", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", "move": "Flytta", - "searchInFile": "Sök i fil (Ctrl+F)", - "showKeyboardShortcuts": "Visa kortkommandon", - "startWritingMarkdown": "Börja skriva ditt markdown-innehåll...", - "loadingFileComparison": "Laddar filjämförelse...", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "reload": "Reload", - "compare": "Jämför", - "sideBySide": "Sida vid sida", - "inline": "Infogad", - "fileComparison": "Filjämförelse: {{file1}} vs {{file2}}", - "fileTooLarge": "Filen är för stor: {{error}}", - "sshConnectionFailed": "SSH-anslutningen misslyckades. Kontrollera din anslutning till {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Det gick inte att ladda filen: {{error}}", - "connecting": "Ansluter...", - "connectedSuccessfully": "Ansluten lyckades", - "totpVerificationFailed": "TOTP-verifiering misslyckades", - "warpgateVerificationFailed": "Warpgate-autentisering misslyckades", - "authenticationFailed": "Autentisering misslyckades", - "verificationCodePrompt": "Verifieringskod:", - "changePermissions": "Ändra behörigheter", - "currentPermissions": "Aktuella behörigheter", - "owner": "Ägare", - "group": "Grupp", - "others": "Andra", - "read": "Läsa", - "write": "Skriv", - "execute": "Utför", - "permissionsChangedSuccessfully": "Behörigheterna har ändrats", - "failedToChangePermissions": "Det gick inte att ändra behörigheter", - "name": "Namn", - "sortByName": "Namn", - "sortByDate": "Ändrad datum", - "sortBySize": "Storlek", - "ascending": "Stigande", - "descending": "Fallande", - "root": "Rot", - "new": "Ny", - "sortBy": "Sortera efter", - "items": "Objekt", - "selected": "Vald", - "editor": "Redigerare", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", "octal": "Octal", - "storage": "Lagring", - "disk": "Diskett", - "used": "Använt", - "of": "av", - "toggleSidebar": "Växla sidofält", - "cannotLoadPdf": "Kan inte ladda PDF", - "pdfLoadError": "Det gick inte att ladda denna PDF-fil.", - "loadingPdf": "Laddar PDF...", - "loadingPage": "Laddar sida..." + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Kopiera till värd…", - "moveToHost": "Flytta till värd…", - "copyItemsToHost": "Kopiera {{count}} objekt till…", - "moveItemsToHost": "Flytta {{count}} objekt till…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Inga andra filhanterarvärdar tillgängliga.", "noHostsConnectedHint": "Lägg till en annan SSH-värd med filhanteraren aktiverad i värdhanteraren.", "selectDestinationHost": "Välj destinationsvärd", @@ -1164,48 +1360,48 @@ "browseDestination": "Bläddra eller ange sökväg", "confirmCopy": "Kopiera", "confirmMove": "Flytta", - "transferring": "Överför…", - "compressing": "Komprimering…", - "extracting": "Extraherar…", - "transferringItems": "Överför {{current}} av {{total}} objekt…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Överföringen är klar", "transferError": "Överföringen misslyckades", - "transferPartial": "Överföringen slutförd med {{count}} fel", - "transferPartialHint": "Kunde inte överföra: {{paths}}", - "itemsSummary": "{{count}} objekt", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Destinationen måste vara en katalog för överföringar av flera objekt", "selectThisFolder": "Välj den här mappen", "browsePathWillBeCreated": "Den här mappen finns inte ännu. Den kommer att skapas när överföringen startar.", "browsePathError": "Kunde inte öppna den här sökvägen på målvärden.", "goUp": "Gå upp", - "copyFolderToHost": "Kopiera mapp till värden…", - "moveFolderToHost": "Flytta mappen till värden…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Redo", - "hostConnecting": "Ansluter…", + "hostConnecting": "Connecting…", "hostDisconnected": "Inte ansluten", "hostAuthRequired": "Autentisering krävs — öppna filhanteraren på den här värden först", "hostConnectionFailed": "Anslutningen misslyckades", "metricsTitle": "Överföringstider", - "metricsPrepare": "Förbered destination: {{duration}}", - "metricsCompress": "Komprimera på källan: {{duration}}", - "metricsHopSourceRead": "Källa → server: {{throughput}}", - "metricsHopDestSftpWrite": "Server → destination (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Server → destination (lokal): {{throughput}}", - "metricsTransfer": "Från slut till slut: {{throughput}} ({{duration}})", - "metricsExtract": "Extrahera på destination: {{duration}}", - "metricsSourceDelete": "Ta bort från källan: {{duration}}", - "metricsTotal": "Totalt: {{duration}}", - "progressCompressing": "Komprimering på källvärd…", - "progressExtracting": "Extraherar på destination…", - "progressTransferring": "Överför data…", - "progressReconnecting": "Återansluter…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Parallella överföringsfält", - "parallelSegmentsOption": "{{count}} körfält", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Stora filer delas upp i bitar på 256 MB. Flera filer använder separata anslutningar (som att starta flera överföringar) för högre total dataflöde.", - "progressTotalSpeed": "{{speed}} totalt ({{lanes}} körfält)", - "progressTransferringItems": "Överföra filer ({{current}} av {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} filer", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Källfiler behållna (delvis överföring)", "jumpHostLimitation": "Båda värdarna måste vara nåbara från Termix-servern. Direkt routing mellan värdar stöds inte.", "cancel": "Avboka", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Väljer tar eller SFTP per fil baserat på filantal, storlek och komprimerbarhet. Enstaka filer använder alltid strömmande SFTP.", "methodTarHint": "Komprimera vid källan, överför ett arkiv, extrahera vid destinationen. Kräver tar på båda Unix-värdarna.", "methodItemSftpHint": "Överför varje fil individuellt via SFTP. Fungerar på alla värdar inklusive Windows.", - "methodPreviewLoading": "Beräkning av överföringsmetod…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Kunde inte förhandsgranska överföringsmetoden. Servern kommer fortfarande att välja en metod när du startar.", "methodPreviewWillUseTar": "Kommer att använda: Tar-arkiv", "methodPreviewWillUseItemSftp": "Kommer att använda: SFTP per fil", - "methodPreviewScanSummary": "{{fileCount}} filer, {{totalSize}} totalt (skannat på källvärd).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Varje fil använder samma SFTP-ström som en kopia av en enda fil, en efter en. Förloppet kombineras över alla filer, så stapeln rör sig långsamt vid stora filer.", "methodReason": { "user_item_sftp": "Du valde SFTP per fil.", "user_tar": "Du valde tar-arkivet.", "tar_unavailable": "Tar är inte tillgängligt på en eller båda värdarna — SFTP per fil kommer att användas istället.", "windows_host": "En Windows-värd är inblandad — tar används inte.", - "auto_multi_large": "Auto: flera filer inklusive en stor fil ({{largestSize}}) med komprimerbar data — tar-paket samlas i en överföring.", - "auto_single_large_in_archive": "Auto: en stor fil ({{largestSize}}) i denna uppsättning — SFTP per fil.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Auto: mestadels inkomprimerbar data — SFTP per fil.", - "auto_many_files": "Auto: många filer ({{fileCount}}) — tar minskar overhead per fil.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Auto: SFTP per fil för den här uppsättningen." }, "progressCancel": "Avboka", - "progressCancelling": "Avbryter…", + "progressCancelling": "Cancelling…", "progressStalled": "Stannade", "resumedHint": "Återansluten till en aktiv överföring som startade i ett annat fönster.", "transferCancelled": "Överföringen avbruten", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "Delvis data sparades på destinationen. Försöket återupptas när anslutningen är tillbaka." }, "tunnels": { - "noSshTunnels": "Inga SSH-tunnlar", - "createFirstTunnelMessage": "Du har inte skapat några SSH-tunnlar än. Konfigurera tunnelanslutningar i värdhanteraren för att komma igång.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Ansluten", - "disconnected": "Frånkopplad", - "connecting": "Ansluter...", - "error": "Fel", - "canceling": "Avbrytar...", - "connect": "Anslut", - "disconnect": "Koppla från", - "cancel": "Avbryt", + "disconnected": "Osammanhängande", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Avboka", "port": "Port", - "localPort": "Lokal port", - "remotePort": "Fjärr port", - "currentHostPort": "Nuvarande värdport", - "endpointPort": "Slutpunkt port", - "bindIp": "Lokal IP", - "endpointSshConfig": "Slutpunkt SSH-konfiguration", - "endpointSshHost": "Slutpunkt SSH värd", - "endpointSshHostPlaceholder": "Välj en konfigurerad värd", - "endpointSshHostRequired": "Välj en slutpunkt SSH-värd för varje klienttunnel.", - "attempt": "Försök {{current}} av {{max}}", - "nextRetryIn": "Nästa försök igen om {{seconds}} sekunder", - "clientTunnels": "Klienttunnlar", - "clientTunnel": "Klienttunnel", - "addClientTunnel": "Lägg till klienttunnel", - "noClientTunnels": "Inga klienttunnlar konfigurerade på detta skrivbord.", - "tunnelName": "Tunnel namn", - "remoteHost": "Fjärrkontroll värd", - "autoStart": "Starta automatiskt", - "clientAutoStartDesc": "Startar när denna klient öppnas och förblir ansluten.", - "clientManualStartDesc": "Använd Start och Stop från denna rad. Termix kommer inte att öppna den automatiskt.", - "clientRemoteServerNote": "Fjärrvidarebefordran kan kräva AllowTcpForwarding och GatewayPorts på endpoint SSH-servern. Fjärrporten stängs när detta skrivbord kopplas från.", - "clientTunnelStarted": "Klienttunneln startad", - "clientTunnelStopped": "Klienttunneln stoppad", - "tunnelTestSucceeded": "Tunneltestet lyckades", - "tunnelTestFailed": "Tunneltestet misslyckades", - "localSaved": "Klienttunnlar sparade", - "localSaveError": "Det gick inte att spara lokala klienttunnlar", - "invalidBindIp": "Lokala IP måste vara en giltig IPv4-adress.", - "invalidLocalTargetIp": "Lokalt mål IP måste vara en giltig IPv4-adress.", - "invalidLocalPort": "Lokal hamn måste vara mellan 1 och 65535.", - "invalidRemotePort": "Fjärrporten måste vara mellan 1 och 65535.", - "invalidLocalTargetPort": "Lokal målport måste vara mellan 1 och 65535.", - "invalidEndpointPort": "Endpoint port måste vara mellan 1 och 65535.", - "duplicateAutoStartBind": "Endast en automatisk start klienttunnel kan använda {{bind}}.", - "manualControlError": "Det gick inte att uppdatera tunnelns tillstånd.", - "active": "Aktiv", - "start": "Starta", - "stop": "Stoppa", - "test": "Testa", - "type": "Typ av tunnel", - "typeLocal": "Lokal (-L)", - "typeRemote": "Fjärrkontroll (-R)", - "typeDynamic": "Dynamisk (-D)", - "typeServerLocalDesc": "Nuvarande värd till slutpunkt.", - "typeServerRemoteDesc": "Slutpunkt tillbaka till nuvarande värd.", - "typeClientLocalDesc": "Lokal dator till slutpunkt.", - "typeClientRemoteDesc": "Slutpunkt tillbaka till lokal dator.", - "typeClientDynamicDesc": "SOCKS på lokal dator.", - "typeDynamicDesc": "Vidarebefordra SOCKS5 CONNECT trafik genom SSH", - "forwardDescriptionServerLocal": "Nuvarande värd {{sourcePort}} → slutpunkt {{endpointPort}}.", - "forwardDescriptionServerRemote": "Slutpunkt {{endpointPort}} → nuvarande värd {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS på nuvarande värd {{sourcePort}}.", - "forwardDescriptionClientLocal": "Lokalt {{sourcePort}} → remote {{endpointPort}}.", - "forwardDescriptionClientRemote": "Fjärr {{sourcePort}} → lokal {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS på lokal port {{sourcePort}}.", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", - "autoNameClientLocal": "Lokalt {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokal {{localPort}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Route:", - "lastStarted": "Senast startad", - "lastTested": "Senast testad", - "lastError": "Senaste fel", - "maxRetries": "Max antal försök", - "maxRetriesDescription": "Maximalt antal försök att försöka igen.", - "retryInterval": "Försök igen intervall (sekunder)", - "retryIntervalDescription": "Dags att vänta mellan försök igen.", - "local": "Lokal", - "remote": "Fjärrkontroll", - "destination": "Mål", - "host": "Värd", - "mode": "Läge", - "noHostSelected": "Ingen värd vald", - "working": "Arbetar..." + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Minne", - "disk": "Diskett", - "network": "Nätverk", - "uptime": "Drifttid", - "processes": "Processer", - "available": "Tillgänglig", - "free": "Gratis", - "connecting": "Ansluter...", - "connectionFailed": "Det gick inte att ansluta till servern", - "naCpus": "N/A CPU(er)", - "cpuCores_one": "{{count}} Kärna", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU användning", - "memoryUsage": "Minnesanvändning", - "diskUsage": "Diskanvändning", - "failedToFetchHostConfig": "Det gick inte att hämta värdkonfiguration", - "serverOffline": "Servern offline", - "cannotFetchMetrics": "Kan inte hämta mätvärden från offline-server", - "totpFailed": "TOTP-verifiering misslyckades", - "noneAuthNotSupported": "Serverstatistik stöder inte autentiseringstypen \"ingen\".", - "load": "Ladda", - "systemInfo": "Systeminformation", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Operativsystem", - "kernel": "Kärna", - "seconds": "sekunder", - "networkInterfaces": "Nätverksgränssnitt", - "noInterfacesFound": "Inga nätverksgränssnitt hittades", - "noProcessesFound": "Inga processer hittades", - "loginStats": "SSH inloggningsstatistik", - "noRecentLoginData": "Inga senaste inloggningsdata", - "executingQuickAction": "Kör {{name}}...", - "quickActionSuccess": "{{name}} slutförd", - "quickActionFailed": "{{name}} misslyckades", - "quickActionError": "Det gick inte att köra {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Lyssnar på portar", - "protocol": "Protocol", + "title": "Listening Ports", + "protocol": "Protokoll", "port": "Port", - "address": "Adress", - "process": "Bearbeta", - "noData": "Ingen lyssnande portdata" + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Brandvägg", - "inactive": "Inaktiv", + "title": "Firewall", + "inactive": "Inactive", "policy": "Policy", - "rules": "regler", - "noData": "Inga brandväggsdata tillgängliga", - "action": "Åtgärd", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", "port": "Port", - "source": "Källa", - "anywhere": "Någonstans" + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Ladda genomsnittet", - "swap": "Byt", - "architecture": "Arkitektur", - "refresh": "Uppdatera", - "retry": "Försök igen" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Försöka igen", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Sikt", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Självhostad SSH och fjärrskrivbordshantering", - "loginTitle": "Logga in till Termix", - "registerTitle": "Skapa konto", - "forgotPassword": "Glömt lösenordet?", - "rememberMe": "Kom ihåg enheten i 30 dagar (inkluderar TOTP)", - "noAccount": "Har du inget konto?", - "hasAccount": "Har du redan ett konto?", - "twoFactorAuth": "Tvåfaktorsautentisering", - "enterCode": "Ange verifieringskod", - "backupCode": "Eller använd säkerhetskod", - "verifyCode": "Verifiera kod", - "redirectingToApp": "Omdirigerar till app...", - "sshAuthenticationRequired": "SSH-autentisering krävs", - "sshNoKeyboardInteractive": "Tangentbord-Interaktiv Autentisering ej tillgänglig", - "sshAuthenticationFailed": "Autentisering misslyckades", - "sshAuthenticationTimeout": "Tidsgräns för autentisering", - "sshNoKeyboardInteractiveDescription": "Servern stöder inte tangentbords-interaktiv autentisering. Ange ditt lösenord eller SSH-nyckel.", - "sshAuthFailedDescription": "De angivna autentiseringsuppgifterna var felaktiga. Försök igen med giltiga uppgifter.", - "sshTimeoutDescription": "Autentiseringsförsöket gick ut. Försök igen.", - "sshProvideCredentialsDescription": "Ange dina SSH-uppgifter för att ansluta till den här servern.", - "sshPasswordDescription": "Ange lösenordet för denna SSH-anslutning.", - "sshKeyPasswordDescription": "Om din SSH-nyckel är krypterad, ange lösenfrasen här.", - "passphraseRequired": "Lösenfras krävs", - "passphraseRequiredDescription": "SSH-nyckeln är krypterad. Ange lösenfrasen för att låsa upp den.", - "back": "Tillbaka", - "firstUser": "Första användaren", - "firstUserMessage": "Du är den första användaren och kommer att göras en administratör. Du kan se administratörsinställningarna i sidolisten för användarens rullgardinsmeny. Om du tror att detta är ett misstag, kontrollera docker loggar, eller skapa en GitHub fråga.", - "external": "Extern", - "loginWithExternal": "Logga in med extern leverantör", - "loginWithExternalDesc": "Logga in med din konfigurerade externa identitetsleverantör", - "externalNotSupportedInElectron": "Extern autentisering stöds inte i appen Electron ännu. Använd webbversionen för OIDC-inloggning.", - "resetPasswordButton": "Återställ lösenord", - "sendResetCode": "Skicka återställningskod", - "resetCodeDesc": "Ange ditt användarnamn för att få en återställningskod för lösenord. Koden kommer att loggas in i behållarens loggar.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Verifiera kod", - "enterResetCode": "Ange den 6-siffriga koden från behållaren loggar för användare:", - "newPassword": "Nytt lösenord", - "confirmNewPassword": "Bekräfta lösenord", - "enterNewPassword": "Ange ditt nya lösenord för användare:", - "signUp": "Registrera dig", - "desktopApp": "Skrivbord app", - "loggingInToDesktopApp": "Loggar in på skrivbordsappen", - "loadingServer": "Laddar servern...", - "dataLossWarning": "Återställa ditt lösenord på detta sätt kommer att ta bort alla dina sparade SSH-värdar, inloggningsuppgifter och andra krypterade data. Denna åtgärd kan inte ångras. Använd endast detta om du har glömt ditt lösenord och inte är inloggad.", - "authenticationDisabled": "Autentisering inaktiverad", - "authenticationDisabledDesc": "Alla autentiseringsmetoder är för närvarande inaktiverade. Kontakta din administratör.", - "attemptsRemaining": "{{count}} försök återstår" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Verifiera SSH-värdnyckel", - "keyChangedWarning": "SSH Värdnyckel ändrad", - "firstConnectionTitle": "Första gången du ansluter till denna värd", - "firstConnectionDescription": "Autenticiteten hos denna värd kan inte fastställas. Kontrollera att fingeravtrycket matchar det du förväntar dig.", - "keyChangedDescription": "Värdnyckeln för denna server har ändrats sedan din senaste anslutning. Detta kan indikera ett säkerhetsproblem.", - "previousKey": "Föregående nyckel", - "newFingerprint": "Nytt fingeravtryck", - "fingerprint": "Fingeravtryck", - "verifyInstructions": "Om du litar på detta värd, klicka på Acceptera för att fortsätta och spara detta fingeravtryck för framtida anslutningar.", - "securityWarning": "Varning för säkerhet", - "acceptAndContinue": "Godkänn och fortsätt", - "acceptNewKey": "Acceptera ny nyckel och fortsätt" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Kunde inte ansluta till databasen", - "unknownError": "Okänt fel", - "loginFailed": "Inloggning misslyckades", - "failedPasswordReset": "Det gick inte att initiera återställning av lösenord", - "failedVerifyCode": "Det gick inte att verifiera återställningskoden", - "failedCompleteReset": "Det gick inte att slutföra lösenordsåterställningen", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Det gick inte att starta OIDC-inloggning", - "silentSigninOidcUnavailable": "Tyst inloggning begärdes, men OIDC-inloggning är inte tillgänglig.", - "failedUserInfo": "Det gick inte att hämta användarinformation efter inloggningen", - "oidcAuthFailed": "OIDC-autentisering misslyckades", - "invalidAuthUrl": "Ogiltig auktoriserings-URL mottagen från backend", - "requiredField": "Detta fält är tvingande", - "minLength": "Minsta längd är {{min}}", - "passwordMismatch": "Lösenorden matchar inte", - "passwordLoginDisabled": "Användarnamn/lösenord inloggning är för närvarande inaktiverad", - "sessionExpired": "Sessionen löpte ut - logga in igen", - "totpRateLimited": "Betygsbegränsning: För många TOTP-verifieringsförsök. Försök igen senare.", - "totpRateLimitedWithTime": "Betygsbegränsad: För många TOTP-verifieringsförsök. Vänligen vänta {{time}} sekunder innan du försöker igen.", - "resetCodeRateLimited": "Betygsbegränsning: För många verifieringsförsök. Försök igen senare.", - "resetCodeRateLimitedWithTime": "Betygsbegränsning: För många verifieringsförsök. Vänligen vänta {{time}} sekunder innan du försöker igen.", - "authTokenSaveFailed": "Det gick inte att spara autentiseringstoken", - "failedToLoadServer": "Det gick inte att ladda servern" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Registrering av nytt konto är för närvarande inaktiverat av en administratör. Logga in eller kontakta en administratör.", - "userNotAllowed": "Ditt konto har inte behörighet att registrera sig. Kontakta en administratör.", - "databaseConnectionFailed": "Det gick inte att ansluta till databasservern", - "resetCodeSent": "Återställ koden skickad till Docker-loggar", - "codeVerified": "Koden har verifierats", - "passwordResetSuccess": "Lösenord återställt framgångsrikt", - "loginSuccess": "Inloggning lyckades", - "registrationSuccess": "Registreringen lyckades" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Lokala stationära tunnlar med inriktning på konfigurerade SSH-värdar.", - "c2sTunnelPresets": "Förinställningar för klienttunnel", - "c2sTunnelPresetsDesc": "Spara klientens lokala tunnellista som en namngiven server förinställning, eller ladda en förinställning tillbaka till denna klient.", - "c2sTunnelPresetsUnavailable": "Förinställningar för klienttunnlar är endast tillgängliga i klientklienten.", - "c2sPresetName": "Förinställt namn", - "c2sPresetNamePlaceholder": "Klientens förinställda namn", - "c2sPresetToLoad": "Förval att ladda", - "c2sNoPresetSelected": "Ingen förinställning vald", - "c2sNoPresets": "Inga förval sparade", - "c2sLoadPreset": "Ladda", - "c2sCurrentLocalConfig": "{{count}} lokala klienttunnel(er) konfigurerade på detta skrivbord.", - "c2sPresetSyncNote": "Förval är explicita ögonblicksbilder; inläsning av en ersätter klientens lokala klienttunnellista.", - "c2sPresetSaved": "Förinställning för klienttunneln sparad", - "c2sPresetLoaded": "Klienttunnelförinställning laddad lokalt", - "c2sPresetRenamed": "Förinställd klienttunnel bytt namn", - "c2sPresetDeleted": "Förinställning för klienttunneln borttagen", - "c2sPresetLoadError": "Det gick inte att ladda förinställningar för klienttunneln" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Språk", - "keyPassword": "nyckel lösenord", - "pastePrivateKey": "Klistra in din privata nyckel här...", - "localListenerHost": "127.0.0.1 (lyssna lokalt)", - "localTargetHost": "127.0.0.1 (mål på denna dator)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Ange ditt lösenord", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Instrumentpanel", - "loading": "Laddar instrumentpanelen...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Stöd", + "support": "Support", "discord": "Discord", - "serverOverview": "Serverns översikt", + "docs": "Docs", + "serverOverview": "Server Overview", "version": "Version", - "upToDate": "Upp till datum", - "updateAvailable": "Uppdatering tillgänglig", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Drifttid", - "database": "Databas", - "healthy": "Friska", - "error": "Fel", - "totalHosts": "Totalt antal värdar", - "totalTunnels": "Totalt antal tunnlar", - "totalCredentials": "Totalt antal uppgifter", - "recentActivity": "Senaste aktivitet", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Laddar senaste aktivitet...", - "noRecentActivity": "Ingen ny aktivitet", - "quickActions": "Snabba åtgärder", - "addHost": "Lägg till värd", - "addCredential": "Lägg till autentiseringsuppgifter", - "adminSettings": "Administratörsinställningar", - "userProfile": "Användarprofil", - "serverStats": "Server statistik", - "loadingServerStats": "Laddar serverstatistik...", - "noServerData": "Ingen serverdata tillgänglig", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Anpassa instrumentpanel", - "dashboardSettings": "Inställningar för instrumentpanel", - "enableDisableCards": "Aktivera/inaktivera kort", - "resetLayout": "Återställ till standard", - "serverOverviewCard": "Serverns översikt", - "recentActivityCard": "Senaste aktivitet", - "networkGraphCard": "Nätverksgraf", - "networkGraph": "Nätverksgraf", - "quickActionsCard": "Snabba åtgärder", - "serverStatsCard": "Server statistik", - "panelMain": "Huvud", - "panelSide": "Sida", - "justNow": "just nu" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "STABELL", - "hostsOnline": "Värdar online", - "activeTunnels": "Aktiva tunnlar", - "registerNewServer": "Registrera en ny server", - "storeSshKeysOrPasswords": "Spara SSH-nycklar eller lösenord", - "manageUsersAndRoles": "Hantera användare och roller", - "manageYourAccount": "Hantera ditt konto", - "hostStatus": "Värd Status", - "noHostsConfigured": "Inga värdar konfigurerade", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", "online": "ONLINE", - "offline": "AVBRYT", + "offline": "OFFLINE", "onlineLower": "Online", "nodes": "{{count}} nodes", - "add": "Lägg till:", - "commandPalette": "Kommando palett", - "done": "Klar", - "editModeInstructions": "Dra kort för att ändra ordning · Dra kolumnavdelaren för att ändra storlek kolumner · Dra nedre kanten av ett kort för att ändra storlek på höjden · Papperskorgen för att ta bort", - "empty": "Tom", - "clear": "Rensa" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Kopiera", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Lägg till värd", - "addGroup": "Lägg till grupp", - "addLink": "Lägg till länk", - "zoomIn": "Zooma in", - "zoomOut": "Zooma ut", - "resetView": "Återställ vy", - "selectHost": "Välj värd", - "chooseHost": "Välj en värd...", - "parentGroup": "Överordnad grupp", - "noGroup": "Ingen grupp", - "groupName": "Gruppens namn", - "color": "Färg", - "source": "Källa", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Flytta till grupp", - "selectGroup": "Välj grupp...", - "addConnection": "Lägg till anslutning", - "hostDetails": "Värduppgifter", - "removeFromGroup": "Ta bort från grupp", - "addHostHere": "Lägg till värd här", - "editGroup": "Redigera grupp", - "delete": "Radera", - "add": "Lägg till", - "create": "Skapa", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", "move": "Flytta", - "connect": "Anslut", - "createGroup": "Skapa grupp", - "selectSourcePlaceholder": "Välj källa...", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Ogiltig fil", - "hostAlreadyExists": "Värd finns redan i topologin", - "connectionExists": "Anslutningen finns redan", - "unknown": "Okänd", - "name": "Namn", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", "status": "Status", - "failedToAddNode": "Det gick inte att lägga till noden", - "sourceDifferentFromTarget": "Källa och mål måste vara olika", - "exportJSON": "Exportera JSON", - "importJSON": "Importera JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Terminal", - "fileManager": "Filhanterare", + "fileManager": "Filhanteraren", "tunnel": "Tunnel", - "docker": "Docker", - "serverStats": "Server statistik", - "noNodes": "Inga noder ännu" + "docker": "Hamnarbetare", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker är inte aktiverat för denna värd", - "validating": "Validerar docker...", - "connecting": "Ansluter...", - "error": "Fel", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Det gick inte att ansluta till Docker", - "containerStarted": "Behållare {{name}} startad", - "failedToStartContainer": "Det gick inte att starta behållare {{name}}", - "containerStopped": "Behållare {{name}} stoppad", - "failedToStopContainer": "Det gick inte att stoppa behållare {{name}}", - "containerRestarted": "Behållare {{name}} omstartad", - "failedToRestartContainer": "Det gick inte att starta om behållare {{name}}", - "containerPaused": "Behållare {{name}} pausad", - "containerUnpaused": "Behållare {{name}} opausad", - "failedToTogglePauseContainer": "Det gick inte att växla pausstatus för behållare {{name}}", - "containerRemoved": "Behållare {{name}} borttagen", - "failedToRemoveContainer": "Det gick inte att ta bort behållare {{name}}", - "image": "Bild", - "ports": "Hamnar", - "noPorts": "Inga portar", - "start": "Starta", - "confirmRemoveContainer": "Är du säker på att du vill ta bort behållaren '{{name}}'? Åtgärden kan inte ångras.", - "runningContainerWarning": "Varning: Denna behållare körs just nu. Borttagning av den kommer att stoppa behållaren först.", - "loadingContainers": "Laddar behållare...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker Manager", - "autoRefresh": "Uppdatera automatiskt", - "timestamps": "Tidsstämplar", - "lines": "Linjer", - "filterLogs": "Filtrera loggar...", - "refresh": "Uppdatera", - "download": "Hämta", - "clear": "Rensa", - "logsDownloaded": "Hämtningen av loggar lyckades", - "last50": "Senaste 50", - "last100": "Sista 100", - "last500": "Senaste 500", - "last1000": "Sista 1000", - "allLogs": "Alla loggar", - "noLogsMatching": "Inga loggar som matchar \"{{query}}\"", - "noLogsAvailable": "Inga loggar tillgängliga", - "noContainersFound": "Inga behållare hittades", - "noContainersFoundHint": "Inga Docker-behållare finns tillgängliga på denna värd", - "searchPlaceholder": "Sök behållare...", - "allStatuses": "Alla statusar", - "stateRunning": "Körs", - "statePaused": "Pausad", - "stateExited": "Avslutad", - "stateRestarting": "Startar om", - "noContainersMatchFilters": "Inga behållare matchar dina filter", - "noContainersMatchFiltersHint": "Försök att justera sök- eller filterkriterierna", - "failedToFetchStats": "Det gick inte att hämta containerstatistik", - "containerNotRunning": "Behållare körs inte", - "startContainerToViewStats": "Starta behållaren för att visa statistik", - "loadingStats": "Laddar statistik...", - "errorLoadingStats": "Fel vid inläsning av statistik", - "noStatsAvailable": "Ingen statistik tillgänglig", - "cpuUsage": "CPU användning", - "current": "Nuvarande", - "memoryUsage": "Minnesanvändning", - "networkIo": "Nätverk I/O", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Utdata", - "blockIo": "Blockera I/O", - "read": "Läsa", - "write": "Skriv", - "pids": "PID", - "containerInformation": "Information om behållare", - "name": "Namn", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Län", - "containerMustBeRunning": "Behållare måste köras för att komma åt konsolen", - "verificationCodePrompt": "Ange verifieringskod", - "totpVerificationFailed": "TOTP-verifiering misslyckades. Försök igen.", - "warpgateVerificationFailed": "Warpgate-autentisering misslyckades. Försök igen.", - "connectedTo": "Ansluten till {{containerName}}", - "disconnected": "Frånkopplad", - "consoleError": "Fel vid konsol", - "errorMessage": "Fel: {{message}}", - "failedToConnect": "Det gick inte att ansluta till behållare", - "console": "Konsol", - "selectShell": "Välj skal", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Osammanhängande", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "aska", - "connect": "Anslut", - "disconnect": "Koppla från", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Inte ansluten", - "clickToConnect": "Klicka på anslut för att starta en skal-session", - "connectingTo": "Ansluter till {{containerName}}...", - "containerNotFound": "Behållare hittades inte", - "backToList": "Tillbaka till listan", - "logs": "Loggar", - "stats": "Statistik", - "consoleTab": "Konsol", - "startContainerToAccess": "Starta behållaren för att komma åt konsolen" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Allmänt", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Användare", - "sectionSessions": "Sessioner", - "sectionRoles": "Roller", - "sectionDatabase": "Databas", - "sectionApiKeys": "API Nycklar", - "allowRegistration": "Tillåt registrering av användare", - "allowRegistrationDesc": "Låt nya användare självregistrera sig", - "allowPasswordLogin": "Tillåt lösenordsinloggning", - "allowPasswordLoginDesc": "Användarnamn/lösenord inloggning", - "oidcAutoProvision": "Auto-tilldelning av OIDC", - "oidcAutoProvisionDesc": "Skapa automatiskt konton för OIDC-användare även när registreringen är inaktiverad", - "allowPasswordReset": "Tillåt återställning av lösenord", - "allowPasswordResetDesc": "Återställ kod via Docker loggar", - "sessionTimeout": "Timeout för sessionen", - "hours": "timmar", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Rensa filter", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", "sessionTimeoutRange": "Min 1h · Max 720h", - "monitoringDefaults": "Övervakning av standard", - "statusCheck": "Statuskontroll", - "metrics": "Meter", - "sec": "sek", - "logLevel": "Loggnivå", - "enableGuacamole": "Aktivera Guacamole", - "enableGuacamoleDesc": "RDP/VNC fjärrskrivbord", - "guacdUrl": "URL för guacd", - "oidcDescription": "Konfigurera OpenID Connect för SSO. Fält markerade * är obligatoriska.", - "oidcClientId": "Klient ID", - "oidcClientSecret": "Klienthemlighet", - "oidcAuthUrl": "URL för auktorisering", - "oidcIssuerUrl": "Utfärdarens URL", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", "oidcTokenUrl": "Token URL", - "oidcUserIdentifier": "Sökväg för användaridentifierare", - "oidcDisplayName": "Visa sökväg för namn", - "oidcScopes": "Omfattningar", - "oidcUserinfoUrl": "Åsidosätt Användarinfo URL", - "oidcAllowedUsers": "Tillåtna användare", - "oidcAllowedUsersDesc": "Ett e-postmeddelande per rad. Lämna tomt för att tillåta alla.", - "removeOidc": "Radera", - "usersCount": "{{count}} användare", - "createUser": "Skapa", - "newRole": "Ny roll", - "roleName": "Namn", - "roleDisplayName": "Visningsnamn", - "roleDescription": "Beskrivning", - "rolesCount": "{{count}} roller", - "createRole": "Skapa", - "creating": "Skapar...", - "exportDatabase": "Exportera databas", - "exportDatabaseDesc": "Ladda ner en säkerhetskopia av alla värdar, inloggningsuppgifter och inställningar", - "export": "Exportera", - "exporting": "exporterar...", - "importDatabase": "Importera databas", - "importDatabaseDesc": "Återställ från en .sqlite backupfil", - "importDatabaseSelected": "Vald: {{name}}", - "selectFile": "Välj fil", - "changeFile": "Ändra", - "import": "Importera", - "importing": "Importerar...", - "apiKeysCount": "{{count}} nycklar", - "newApiKey": "Ny API-nyckel", - "apiKeyCreatedWarning": "Nyckel skapad - kopiera den nu, den kommer inte att visas igen.", - "apiKeyName": "Namn", - "apiKeyUser": "Användare", - "apiKeySelectUser": "Välj en användar...", - "apiKeyExpiresAt": "Förfaller vid", - "createKey": "Skapa nyckel", - "apiKeyNoExpiry": "Inget utgångsdatum", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Ta bort", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Lokal", - "adminStatusAdministrator": "Administratör", - "adminStatusRegularUser": "Vanlig användare", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ADMIN", - "systemBadge": "SYRA", - "customBadge": "ANVÄND", - "youBadge": "DU", - "sessionsActive": "{{count}} aktiv", - "sessionActive": "Aktiv: {{time}}", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "Alla", - "revokeAllSessionsSuccess": "Alla sessioner för användare återkallade", - "revokeAllSessionsFailed": "Det gick inte att återkalla sessioner", - "revokeSessionFailed": "Det gick inte att återkalla sessionen", - "addRole": "Lägg till roll", - "noCustomRoles": "Inga anpassade roller har definierats", - "removeRoleFailed": "Kunde inte ta bort roll", - "assignRoleFailed": "Det gick inte att tilldela roll", - "deleteRoleFailed": "Kunde inte ta bort roll", - "userAdminAccess": "Administratör", - "userAdminAccessDesc": "Full tillgång till alla administratörsinställningar", - "userRoles": "Roller", - "revokeAllUserSessions": "Återkalla alla sessioner", - "revokeAllUserSessionsDesc": "Tvinga återinloggning på alla enheter", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Borttagning av denna användare är permanent.", - "deleteUser": "Ta bort {{username}}", - "deleting": "Raderar...", - "deleteUserFailed": "Det gick inte att ta bort användaren", - "deleteUserSuccess": "Användare \"{{username}}\" raderad", - "deleteRoleSuccess": "Roll \"{{name}}\" raderad", - "revokeKeySuccess": "Nyckel \"{{name}}\" återkallad", - "revokeKeyFailed": "Det gick inte att återkalla nyckel", - "copiedToClipboard": "Kopierad till urklipp", - "done": "Klar", - "createUserTitle": "Skapa användare", - "createUserDesc": "Skapa ett nytt lokalt konto.", - "createUserUsername": "Användarnamn", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Lösenord", - "createUserPasswordHint": "Minsta 6 tecken.", - "createUserEnterUsername": "Ange användarnamn", - "createUserEnterPassword": "Ange lösenord", - "createUserSubmit": "Skapa användare", - "editUserTitle": "Hantera användare: {{username}}", - "editUserDesc": "Redigera roller, administratörsstatus, sessioner och kontoinställningar.", - "editUserUsername": "Användarnamn", - "editUserAuthType": "Auth typ", - "editUserAdminStatus": "Admins status", - "editUserUserId": "Användar-ID", - "linkAccountTitle": "Länka OIDC till lösenordskonto", - "linkAccountDesc": "Slå ihop OIDC-kontot {{username}} med ett befintligt lokalt konto.", - "linkAccountWarningTitle": "Detta kommer att:", - "linkAccountEffect1": "Ta bort endast OIDC-konto", - "linkAccountEffect2": "Lägg till OIDC-inloggning till målkontot", - "linkAccountEffect3": "Tillåt både OIDC och lösenord inloggning", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Ange det lokala kontots användarnamn för att länka till", - "linkAccounts": "Länka konton", - "linkAccountSuccess": "OIDC-konto länkat till \"{{username}}\"", - "linkAccountFailed": "Misslyckades med att länka OIDC-kontot", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", + "editUserAuthType": "Aut.typ", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Länkar...", - "saving": "Sparar...", - "updateRegistrationFailed": "Det gick inte att uppdatera registreringsinställningen", - "updatePasswordLoginFailed": "Det gick inte att uppdatera lösenordsinställningen", - "updateOidcAutoProvisionFailed": "Det gick inte att uppdatera auto-provisionsinställningen för OIDC", - "updatePasswordResetFailed": "Det gick inte att uppdatera inställningen för lösenordsåterställning", - "sessionTimeoutRange2": "Sessionstiderna måste vara mellan 1 och 720 timmar", - "sessionTimeoutSaved": "Sessionens timeout sparad", - "sessionTimeoutSaveFailed": "Det gick inte att spara sessionens timeout", - "monitoringIntervalInvalid": "Ogiltiga intervallvärden", - "monitoringSaved": "Övervakningsinställningar sparade", - "monitoringSaveFailed": "Det gick inte att spara övervakningsinställningar", - "guacamoleSaved": "Guacamole-inställningar sparade", - "guacamoleSaveFailed": "Det gick inte att spara Guacamole-inställningarna", - "guacamoleUpdateFailed": "Det gick inte att uppdatera Guacamole-inställningen", - "logLevelUpdateFailed": "Det gick inte att uppdatera loggnivån", - "oidcSaved": "OIDC-konfiguration sparad", - "oidcSaveFailed": "Det gick inte att spara OIDC-konfiguration", - "oidcRemoved": "OIDC-konfiguration borttagen", - "oidcRemoveFailed": "Det gick inte att ta bort OIDC-konfiguration", - "createUserRequired": "Användarnamn och lösenord krävs", - "createUserPasswordTooShort": "Lösenordet måste vara minst 6 tecken", - "createUserSuccess": "Användare \"{{username}}\" skapad", - "createUserFailed": "Det gick inte att skapa användare", - "updateAdminStatusFailed": "Det gick inte att uppdatera administratörsstatus", - "allSessionsRevoked": "Alla sessioner återkallade", - "revokeSessionsFailed": "Det gick inte att återkalla sessioner", - "createRoleRequired": "Namn och visningsnamn krävs", - "createRoleSuccess": "Roll \"{{name}}\" skapad", - "createRoleFailed": "Det gick inte att skapa roll", - "apiKeyNameRequired": "Nyckelnamn krävs", - "apiKeyUserRequired": "Användar-ID krävs", - "apiKeyCreatedSuccess": "API-nyckel \"{{name}}\" skapad", - "apiKeyCreateFailed": "Det gick inte att skapa API-nyckel", - "exportSuccess": "Databas exporterades framgångsrikt", - "exportFailed": "Databasexport misslyckades", - "importSelectFile": "Välj en fil först", - "importCompleted": "Importen slutförd: {{total}} objekt importerade, {{skipped}} överhoppad", - "importFailed": "Importen misslyckades: {{error}}", - "importError": "Databasimport misslyckades" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Värd", - "hostPlaceholder": "192.168.1.1 eller exempel.se", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Användarnamn", - "usernamePlaceholder": "användarnamn", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Auth", "passwordLabel": "Lösenord", - "passwordPlaceholder": "lösenord", - "privateKeyLabel": "Privat nyckel", - "privateKeyPlaceholder": "Klistra in privat nyckel...", - "credentialLabel": "Uppgifter", - "credentialPlaceholder": "Välj en sparad referens", - "connectToTerminal": "Anslut till terminal", - "connectToFiles": "Anslut till filer" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Referenser", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Ingen terminal vald", - "noTerminalSelectedHint": "Öppna en SSH-terminalflik för att visa dess kommandohistorik", - "searchPlaceholder": "Sök historik...", - "clearAll": "Rensa alla", - "noHistoryEntries": "Inga historikposter", - "trackingDisabled": "Historikspårning är inaktiverad", - "trackingDisabledHint": "Aktivera det i dina profilinställningar för att spela in kommandon." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Nyckel inspelning", - "recordToTerminals": "Spela in till terminaler", - "selectAll": "Alla", + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", "selectNone": "Ingen", - "noTerminalTabsOpen": "Inga terminalflikar öppna", - "selectTerminalsAbove": "Välj terminaler ovan", - "broadcastInputPlaceholder": "Skriv här för att sända tangenttryckningar...", - "stopRecording": "Stoppa inspelning", - "startRecording": "Starta inspelning", - "settingsTitle": "Inställningar", - "enableRightClickCopyPaste": "Aktivera högerklicka på kopiera/klistra in" + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { "layoutTitle": "Layout", - "selectLayoutAbove": "Välj en layout ovan", - "selectLayoutHint": "Välj hur många rutor som ska visas", - "panesTitle": "Paneler", - "openTabsTitle": "Öppna flikar", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Dra flikar till rutor ovan eller använd Snabbtilldelning", - "dropHere": "Släpp här", - "emptyPane": "Tom", - "dashboard": "Instrumentpanel", - "clearSplitScreen": "Rensa delad skärm", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Snabbtilldelning", - "alreadyAssigned": "Ruta {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Dela fliken", "addToSplit": "Lägg till i delning", "removeFromSplit": "Ta bort från Split", - "assignToPane": "Tilldela till ruta" + "assignToPane": "Tilldela till ruta", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Skapa textmodulen", - "createSnippetDescription": "Skapa en ny kommandotsnippet för snabb körning", - "nameLabel": "Namn", - "namePlaceholder": "t.ex., starta om Nginx", - "descriptionLabel": "Beskrivning", - "descriptionPlaceholder": "Valfri beskrivning", - "optional": "Valfri", - "folderLabel": "Mapp", - "noFolder": "Ingen mapp (okategoriserad)", - "commandLabel": "Kommando", - "commandPlaceholder": "t.ex., sudo systemctl omstart nginx", - "cancel": "Avbryt", - "createSnippetButton": "Skapa textmodulen", - "createFolderTitle": "Skapa mapp", - "createFolderDescription": "Organisera dina textmoduler i mappar", - "folderNameLabel": "Mappens namn", - "folderNamePlaceholder": "t.ex., Systemkommandon, Docker skript", - "folderColorLabel": "Mappens färg", - "folderIconLabel": "Mappens ikon", - "previewLabel": "Förhandsgranska", - "folderNameFallback": "Mappens namn", - "createFolderButton": "Skapa mapp", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Avboka", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Alla", + "selectAll": "All", "selectNone": "Ingen", - "noTerminalTabsOpen": "Inga terminalflikar öppna", - "searchPlaceholder": "Sök snippets...", - "newSnippet": "Ny textmodul", - "newFolder": "Ny mapp", - "run": "Kör", - "noSnippetsInFolder": "Inga textmoduler i den här mappen", - "uncategorized": "Okategoriserad", - "editSnippetTitle": "Redigera textmodulen", - "editSnippetDescription": "Uppdatera detta kommando snippet", - "saveSnippetButton": "Spara ändringar", - "createSuccess": "Textmodulen har skapats", - "createFailed": "Det gick inte att skapa snippet", - "updateSuccess": "Textmodulen har uppdaterats", - "updateFailed": "Det gick inte att uppdatera snippet", - "deleteFailed": "Det gick inte att ta bort snippet", - "folderCreateSuccess": "Mappen har skapats", - "folderCreateFailed": "Det gick inte att skapa mapp", - "editFolderTitle": "Redigera mapp", - "editFolderDescription": "Döp om eller ändra utseendet på denna mapp", - "saveFolderButton": "Spara ändringar", - "editFolder": "Redigera mapp", - "deleteFolder": "Ta bort mapp", - "folderDeleteSuccess": "Mappen \"{{name}}\" raderad", - "folderDeleteFailed": "Kunde inte ta bort mapp", - "folderEditSuccess": "Mappen har uppdaterats", - "folderEditFailed": "Det gick inte att uppdatera mappen", - "confirmRunMessage": "Kör \"{{name}}\"?", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Sikt", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Sikt", - "runSuccess": "Ran \"{{name}}\" i {{count}} terminal(er)", - "copySuccess": "Kopierade \"{{name}}\" till urklipp", - "shareTitle": "Dela textmodulen", - "shareUser": "Användare", - "shareRole": "Roll", - "selectUser": "Välj en användar...", - "selectRole": "Välj en roll...", - "shareSuccess": "Textmodulen delades framgångsrikt", - "shareFailed": "Misslyckades att dela snippet", - "revokeSuccess": "Åtkomst återkallad", - "revokeFailed": "Det gick inte att återkalla åtkomst", - "currentAccess": "Aktuell åtkomst", - "shareLoadError": "Misslyckades att ladda delningsdata", - "loading": "Laddar...", - "close": "Stäng", - "reorderFailed": "Det gick inte att spara kodavsnittets ordning" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Det gick inte att spara kodavsnittets ordning", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Konto", - "sectionAppearance": "Utseende", - "sectionSecurity": "Säkerhet", - "sectionApiKeys": "API Nycklar", - "sectionC2sTunnels": "C2S tunnlar", - "usernameLabel": "Användarnamn", - "roleLabel": "Roll", - "roleAdministrator": "Administratör", - "authMethodLabel": "Auth metod", - "authMethodLocal": "Lokal", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", "twoFaLabel": "2FA", - "twoFaOn": "På", - "twoFaOff": "Av", + "twoFaOn": "On", + "twoFaOff": "Off", "versionLabel": "Version", - "deleteAccount": "Ta bort konto", - "deleteAccountDescription": "Radera ditt konto permanent", - "deleteButton": "Radera", - "deleteAccountPermanent": "Denna åtgärd är permanent och kan inte ångras.", - "deleteAccountWarning": "Alla sessioner, värdar, inloggningsuppgifter och inställningar kommer att tas bort permanent.", - "confirmPasswordDeletePlaceholder": "Ange ditt lösenord för att bekräfta", - "languageLabel": "Språk", - "themeLabel": "Tema", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Accentfärg", + "accentColorLabel": "Accent Color", "settingsTerminal": "Terminal", - "commandAutocomplete": "Kommandot Autokomplettering", - "commandAutocompleteDesc": "Visa autocomplete medan du skriver", - "historyTracking": "Spårning av historik", - "historyTrackingDesc": "Spåra terminalkommandon", - "syntaxHighlighting": "Syntax markerar", - "syntaxHighlightingDesc": "Markera terminalutgång", - "commandPalette": "Kommando palett", - "commandPaletteDesc": "Aktivera kortkommando", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Öppna flikar igen vid inloggning", "reopenTabsOnLoginDesc": "Återställ dina öppna flikar när du loggar in eller uppdaterar sidan, även från en annan enhet", - "confirmTabClose": "Bekräfta flikstängning", - "confirmTabCloseDesc": "Fråga innan terminalflikar stängs", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Visa värdtaggar", - "showHostTagsDesc": "Visa taggar i värdlistan", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Klicka för att expandera värdåtgärder", "hostTrayOnClickDesc": "Visa alltid anslutningsknappar; klicka för att expandera hanteringsalternativ istället för att hålla muspekaren över", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "Håll applist i vänster sidofält alltid expanderad istället för att expandera när du håller muspekaren över den", - "settingsSnippets": "Textmoduler", - "foldersCollapsed": "Mappar kollapsade", - "foldersCollapsedDesc": "Kollapsa mappar som standard", - "confirmExecution": "Bekräfta utförande", - "confirmExecutionDesc": "Bekräfta innan du kör textmoduler", - "settingsUpdates": "Uppdateringar", - "disableUpdateChecks": "Inaktivera uppdateringskontroller", - "disableUpdateChecksDesc": "Sluta leta efter uppdateringar", - "totpAuthenticator": "TOTP-autentiserare", - "totpEnabled": "2FA är aktiverat", - "totpDisabled": "Lägg till extra inloggningssäkerhet", - "disable": "Inaktivera", - "enable": "Aktivera", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Skanna QR-koden eller ange hemlighet i din autentiseringsapp och ange sedan den 6-siffriga koden", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Verifiera", - "changePassword": "Ändra lösenord", - "currentPasswordLabel": "Nuvarande lösenord", - "currentPasswordPlaceholder": "Nuvarande lösenord", - "newPasswordLabel": "Nytt lösenord", - "newPasswordPlaceholder": "Nytt lösenord", - "confirmPasswordLabel": "Bekräfta nytt lösenord", - "confirmPasswordPlaceholder": "Bekräfta nytt lösenord", - "updatePassword": "Uppdatera lösenord", - "createApiKeyTitle": "Skapa API-nyckel", - "createApiKeyDescription": "Skapa en ny API-nyckel för programmatisk åtkomst.", - "apiKeyNameLabel": "Namn", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "valfri", - "cancel": "Avbryt", - "createKey": "Skapa nyckel", - "apiKeyCount": "{{count}} nycklar", - "newKey": "Ny nyckel", - "noApiKeys": "Inga API-nycklar än.", - "apiKeyActive": "Aktiv", - "apiKeyUsageHint": "Inkludera din nyckel i", - "apiKeyUsageHintHeader": "rubrik.", - "apiKeyPermissionsHint": "Nycklar ärver behörigheter för att skapa användaren.", - "roleUser": "Användare", + "optional": "optional", + "cancel": "Avboka", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Det gick inte att starta TOTP-installationen", - "totpEnter6Digits": "Ange en 6-siffrig kod", - "totpEnabledSuccess": "Tvåfaktorsautentisering aktiverad", - "totpInvalidCode": "Ogiltig kod, försök igen", - "totpDisableInputRequired": "Ange din TOTP-kod eller lösenord", - "totpDisabledSuccess": "Tvåfaktorsautentisering inaktiverad", - "totpDisableFailed": "Det gick inte att inaktivera 2FA", - "totpDisableTitle": "Inaktivera 2FA", - "totpDisablePlaceholder": "Ange TOTP-kod eller lösenord", - "totpDisableConfirm": "Inaktivera 2FA", - "totpContinueVerify": "Fortsätt att verifiera", - "totpVerifyTitle": "Verifiera kod", - "totpBackupTitle": "Säkerhetskopiera koder", - "totpDownloadBackup": "Ladda ned säkerhetskopieringskoder", - "done": "Klar", - "secretCopied": "Hemligheten har kopierats till urklipp", - "apiKeyNameRequired": "Nyckelnamn krävs", - "apiKeyCreated": "API-nyckel \"{{name}}\" skapad", - "apiKeyCreateFailed": "Det gick inte att skapa API-nyckel", - "apiKeyUser": "Användare", - "apiKeyExpires": "Förfaller", - "apiKeyRevoked": "API-nyckel \"{{name}}\" återkallad", - "apiKeyRevokeFailed": "Det gick inte att återkalla API-nyckel", - "passwordFieldsRequired": "Nuvarande och nya lösenord krävs", - "passwordMismatch": "Lösenorden matchar inte", - "passwordTooShort": "Lösenordet måste vara minst 6 tecken", - "passwordUpdated": "Lösenordet har uppdaterats", - "passwordUpdateFailed": "Det gick inte att uppdatera lösenordet", - "deletePasswordRequired": "Lösenord krävs för att ta bort ditt konto", - "deleteFailed": "Kunde inte ta bort konto", - "deleting": "Raderar...", - "colorPickerTooltip": "Öppna färgväljaren", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", "themeSystem": "System", - "themeLight": "Ljus", - "themeDark": "Mörk", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Solariserad", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "En mörk", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Taggar", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Försöka igen", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Ta bort", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/th_TH.json b/src/ui/locales/translated/th_TH.json index 33551e1e..59bd9728 100644 --- a/src/ui/locales/translated/th_TH.json +++ b/src/ui/locales/translated/th_TH.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "โฟลเดอร์", - "folder": "โฟลเดอร์", - "password": "รหัสผ่าน", - "key": "สำคัญ", - "sshPrivateKey": "คีย์ส่วนตัว SSH", - "upload": "อัปโหลด", - "keyPassword": "รหัสผ่าน", - "sshKey": "คีย์ SSH", - "uploadPrivateKeyFile": "อัปโหลดไฟล์คีย์ส่วนตัว", - "searchCredentials": "ค้นหาข้อมูลประจำตัว...", - "addCredential": "เพิ่มข้อมูลรับรอง", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "ใบรับรอง CA (-cert.pub)", "caCertificateDescription": "ขั้นตอนเสริม: อัปโหลดหรือวางไฟล์ใบรับรองที่ลงนามโดย CA (เช่น id_ed25519-cert.pub) จำเป็นต้องใช้เมื่อเซิร์ฟเวอร์ SSH ของคุณใช้การตรวจสอบสิทธิ์แบบใช้ใบรับรอง", "uploadCertFile": "อัปโหลดไฟล์ -cert.pub", - "clearCert": "ชัดเจน", + "clearCert": "Clear", "certLoaded": "โหลดใบรับรองแล้ว", "certPublicKeyLabel": "ใบรับรอง CA", "certTypeLabel": "ประเภทใบรับรอง", "pasteOrUploadCert": "วางหรืออัปโหลดไฟล์ใบรับรอง -cert.pub...", "hasCaCert": "มีใบรับรอง CA", - "noCaCert": "ไม่มีใบรับรอง CA" + "noCaCert": "ไม่มีใบรับรอง CA", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "ลำดับเริ่มต้น", + "sortNameAsc": "ชื่อ (A → Z)", + "sortNameDesc": "ชื่อ (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "ล้างตัวกรอง", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "ไม่สามารถโหลดการแจ้งเตือนได้", - "failedToDismissAlert": "ไม่สามารถปิดการแจ้งเตือนได้" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "การกำหนดค่าเซิร์ฟเวอร์", - "description": "กำหนดค่า URL ของเซิร์ฟเวอร์ Termix เพื่อเชื่อมต่อกับบริการแบ็กเอนด์ของคุณ", - "serverUrl": "URL ของเซิร์ฟเวอร์", - "enterServerUrl": "โปรดป้อน URL ของเซิร์ฟเวอร์", - "saveFailed": "ไม่สามารถบันทึกการตั้งค่าได้", - "saveError": "เกิดข้อผิดพลาดในการบันทึกการตั้งค่า", - "saving": "ประหยัด...", - "saveConfig": "บันทึกการตั้งค่า", - "helpText": "ป้อน URL ที่เซิร์ฟเวอร์ Termix ของคุณกำลังทำงานอยู่ (เช่น http://localhost:30001 หรือ https://your-server.com)", - "changeServer": "เปลี่ยนเซิร์ฟเวอร์", - "mustIncludeProtocol": "URL ของเซิร์ฟเวอร์ต้องขึ้นต้นด้วย http:// หรือ https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "อนุญาตให้ใช้ใบรับรองที่ไม่ถูกต้อง", "allowInvalidCertificateDesc": "ใช้ได้เฉพาะกับเซิร์ฟเวอร์ที่ดูแลเองที่เชื่อถือได้ ซึ่งมีใบรับรองแบบลงนามเองหรือใบรับรองตามที่อยู่ IP เท่านั้น", - "useEmbedded": "ใช้เซิร์ฟเวอร์ภายในเครื่อง", - "embeddedDesc": "เรียกใช้งาน Termix ด้วยเซิร์ฟเวอร์ภายในเครื่อง (ไม่จำเป็นต้องใช้เซิร์ฟเวอร์ระยะไกล)", - "embeddedConnecting": "กำลังเชื่อมต่อกับเซิร์ฟเวอร์ภายใน...", - "embeddedNotReady": "เซิร์ฟเวอร์ในพื้นที่ยังไม่พร้อมใช้งาน โปรดรอสักครู่แล้วลองใหม่อีกครั้ง", - "localServer": "เซิร์ฟเวอร์ภายใน" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "เซิร์ฟเวอร์ภายใน", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "ข้อผิดพลาดในการตรวจสอบเวอร์ชัน", - "checkFailed": "ไม่สามารถตรวจสอบการอัปเดตได้", - "upToDate": "แอปได้รับการอัปเดตแล้ว", - "currentVersion": "คุณกำลังใช้งานเวอร์ชัน {{version}}", - "updateAvailable": "มีการอัปเดตแล้ว", - "newVersionAvailable": "มีเวอร์ชันใหม่ให้ใช้งานแล้ว! คุณกำลังใช้งาน {{current}}อยู่ แต่มี {{latest}} ให้ใช้งานแล้ว", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "เวอร์ชันเบต้า", - "betaVersionDesc": "คุณกำลังใช้งาน {{current}}ซึ่งใหม่กว่าเวอร์ชันเสถียรล่าสุด {{latest}}", - "releasedOn": "เผยแพร่เมื่อ {{date}}", - "downloadUpdate": "ดาวน์โหลดการอัปเดต", - "checking": "กำลังตรวจสอบการอัปเดต...", - "checkUpdates": "ตรวจสอบการอัปเดต", - "checkingUpdates": "กำลังตรวจสอบการอัปเดต...", - "updateRequired": "ต้องอัปเดตข้อมูล" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "ปิด", - "minimize": "ลดขนาด", - "online": "ออนไลน์", - "offline": "ออฟไลน์", - "continue": "ดำเนินการต่อ", - "maintenance": "การซ่อมบำรุง", - "degraded": "เสื่อมสภาพ", - "error": "ข้อผิดพลาด", - "warning": "คำเตือน", - "unsavedChanges": "การเปลี่ยนแปลงที่ยังไม่ได้บันทึก", - "dismiss": "อนุญาตให้ออกไป", - "loading": "กำลังโหลด...", - "optional": "ไม่จำเป็น", - "connect": "เชื่อมต่อ", - "copied": "คัดลอกแล้ว", - "connecting": "กำลังเชื่อมต่อ...", - "updateAvailable": "มีการอัปเดตแล้ว", - "appName": "เทอร์มิกซ์", - "openInNewTab": "เปิดในแท็บใหม่", - "noReleases": "ไม่มีการเผยแพร่", - "updatesAndReleases": "การอัปเดตและการเผยแพร่", - "newVersionAvailable": "มีเวอร์ชันใหม่ ({{version}}) ให้ใช้งานแล้ว", - "failedToFetchUpdateInfo": "ไม่สามารถดึงข้อมูลการอัปเดตได้", - "preRelease": "ก่อนวางจำหน่าย", - "noReleasesFound": "ไม่พบข้อมูลการเผยแพร่ใดๆ", - "cancel": "ยกเลิก", - "username": "ชื่อผู้ใช้", - "login": "เข้าสู่ระบบ", - "register": "ลงทะเบียน", - "password": "รหัสผ่าน", - "confirmPassword": "ยืนยันรหัสผ่าน", - "back": "กลับ", - "save": "บันทึก", - "saving": "ประหยัด...", - "delete": "ลบ", - "rename": "เปลี่ยนชื่อ", - "edit": "แก้ไข", - "add": "เพิ่ม", - "confirm": "ยืนยัน", - "no": "เลขที่", - "or": "หรือ", - "next": "ต่อไป", - "previous": "ก่อนหน้า", - "refresh": "รีเฟรช", - "language": "ภาษา", - "checking": "กำลังตรวจสอบ...", - "checkingDatabase": "กำลังตรวจสอบการเชื่อมต่อฐานข้อมูล...", - "checkingAuthentication": "กำลังตรวจสอบการยืนยันตัวตน...", - "backendReconnected": "การเชื่อมต่อเซิร์ฟเวอร์กลับมาใช้งานได้แล้ว", - "connectionDegraded": "การเชื่อมต่อเซิร์ฟเวอร์ขาดหาย กำลังกู้คืน…", - "reload": "โหลดซ้ำ", - "remove": "ลบ", - "create": "สร้าง", - "update": "อัปเดต", - "copy": "สำเนา", - "copyFailed": "ไม่สามารถคัดลอกไปยังคลิปบอร์ดได้", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "เพิ่มให้สูงสุด", "restore": "คืนค่า", - "of": "ของ" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "บ้าน", - "terminal": "เทอร์มินัล", - "docker": "ด็อกเกอร์", - "tunnels": "อุโมงค์", - "fileManager": "ตัวจัดการไฟล์", - "serverStats": "สถิติเซิร์ฟเวอร์", - "admin": "ผู้ดูแลระบบ", - "userProfile": "โปรไฟล์ผู้ใช้", - "splitScreen": "แบ่งหน้าจอ", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "ปิดเซสชันที่ใช้งานอยู่นี้หรือไม่?", - "close": "ปิด", - "cancel": "ยกเลิก", - "sshManager": "ตัวจัดการ SSH", - "cannotSplitTab": "ไม่สามารถแบ่งแท็บนี้ได้", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "คัดลอกรหัสผ่าน", - "copySudoPassword": "คัดลอกรหัสผ่าน Sudo", - "passwordCopied": "คัดลอกรหัสผ่านไปยังคลิปบอร์ดแล้ว", - "noPasswordAvailable": "ไม่มีรหัสผ่านให้ใช้งาน", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "ไม่สามารถคัดลอกรหัสผ่านได้", "refreshTab": "รีเฟรชการเชื่อมต่อ", - "openFileManager": "เปิดตัวจัดการไฟล์", - "dashboard": "แดชบอร์ด", - "networkGraph": "กราฟเครือข่าย", - "quickConnect": "การเชื่อมต่อด่วน", - "sshTools": "เครื่องมือ SSH", - "history": "ประวัติศาสตร์", - "hosts": "โฮสต์", - "snippets": "เศษเสี้ยว", - "hostManager": "ผู้จัดการโฮสต์", - "credentials": "คุณสมบัติ", - "connections": "การเชื่อมต่อ", - "roleAdministrator": "ผู้ดูแลระบบ", - "roleUser": "ผู้ใช้" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "โฮสต์", - "noHosts": "ไม่มีโฮสต์ SSH", - "retry": "ลองใหม่อีกครั้ง", - "refresh": "รีเฟรช", - "optional": "ไม่จำเป็น", - "downloadSample": "ดาวน์โหลดตัวอย่าง", - "failedToDeleteHost": "ไม่สามารถลบ {{name}} ได้", - "importSkipExisting": "นำเข้า (ข้ามรายการที่มีอยู่)", - "connectionDetails": "รายละเอียดการเชื่อมต่อ", - "ssh": "เอสเอช", - "telnet": "เทลเน็ต", - "remoteDesktop": "รีโมทเดสก์ท็อป", - "port": "ท่าเรือ", - "username": "ชื่อผู้ใช้", - "folder": "โฟลเดอร์", - "tags": "แท็ก", - "pin": "เข็มหมุด", - "addHost": "เพิ่มโฮสต์", - "editHost": "แก้ไขโฮสต์", - "cloneHost": "โคลนโฮสต์", - "enableTerminal": "เปิดใช้งานเทอร์มินัล", - "enableTunnel": "เปิดใช้งานอุโมงค์", - "enableFileManager": "เปิดใช้งานตัวจัดการไฟล์", - "enableDocker": "เปิดใช้งาน Docker", - "defaultPath": "เส้นทางเริ่มต้น", - "connection": "การเชื่อมต่อ", - "upload": "อัปโหลด", - "authentication": "การตรวจสอบสิทธิ์", - "password": "รหัสผ่าน", - "key": "สำคัญ", - "credential": "ใบรับรอง", - "none": "ไม่มี", - "sshPrivateKey": "คีย์ส่วนตัว SSH", - "keyType": "ประเภทกุญแจ", - "uploadFile": "อัปโหลดไฟล์", - "tabGeneral": "ทั่วไป", - "tabSsh": "เอสเอช", - "tabRdp": "อาร์ดีพี", - "tabVnc": "วีเอ็นซี", - "tabTunnels": "อุโมงค์", - "tabDocker": "ด็อกเกอร์", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", + "ssh": "SSH", + "telnet": "Telnet", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", + "tabSsh": "SSH", + "tabTerminal": "Terminal", + "tabRdp": "RDP", + "tabVnc": "VNC", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "ไฟล์", - "tabStats": "สถิติ", - "tabTelnet": "เทลเน็ต", - "tabSharing": "การแบ่งปัน", - "tabAuthentication": "การตรวจสอบสิทธิ์", - "terminal": "เทอร์มินัล", - "tunnel": "อุโมงค์", - "fileManager": "ตัวจัดการไฟล์", - "serverStats": "สถิติเซิร์ฟเวอร์", - "status": "สถานะ", - "folderRenamed": "เปลี่ยนชื่อโฟลเดอร์ \"{{oldName}}\" เป็น \"{{newName}}\" สำเร็จแล้ว", - "failedToRenameFolder": "ไม่สามารถเปลี่ยนชื่อโฟลเดอร์ได้", - "movedToFolder": "ย้ายไปที่ \"{{folder}}\"", - "editHostTooltip": "แก้ไขโฮสต์", - "statusChecks": "การตรวจสอบสถานะ", - "metricsCollection": "การรวบรวมเมตริก", - "metricsInterval": "ช่วงเวลาการเก็บรวบรวมเมตริก", - "metricsIntervalDesc": "ควรเก็บรวบรวมสถิติเซิร์ฟเวอร์บ่อยแค่ไหน (5 วินาที - 1 ชั่วโมง)", - "behavior": "พฤติกรรม", - "themePreview": "ตัวอย่างธีม", - "theme": "ธีม", - "fontFamily": "ตระกูลฟอนต์", - "fontSize": "ขนาดตัวอักษร", - "letterSpacing": "ระยะห่างระหว่างตัวอักษร", - "lineHeight": "ความสูงของเส้น", - "cursorStyle": "รูปแบบเคอร์เซอร์", - "cursorBlink": "เคอร์เซอร์กระพริบ", - "scrollbackBuffer": "บัฟเฟอร์การเลื่อนกลับ", - "bellStyle": "สไตล์เบลล์", - "rightClickSelectsWord": "คลิกขวาแล้วเลือก Word", - "fastScrollModifier": "ตัวแก้ไขการเลื่อนเร็ว", - "fastScrollSensitivity": "ความไวในการเลื่อนเร็ว", - "sshAgentForwarding": "การส่งต่อเอเจนต์ SSH", - "backspaceMode": "โหมดลบ", - "startupSnippet": "ตัวอย่างโค้ดสำหรับเริ่มต้น", - "selectSnippet": "เลือกส่วนย่อย", - "forceKeyboardInteractive": "แป้นพิมพ์แบบอินเทอร์แอคทีฟของ Force", - "overrideCredentialUsername": "แทนที่ชื่อผู้ใช้ข้อมูลประจำตัว", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Telnet", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "ใช้ชื่อผู้ใช้ที่ระบุไว้ข้างต้นแทนชื่อผู้ใช้ของข้อมูลประจำตัว", - "jumpHostChain": "ห่วงโซ่ Jump Host", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "การเคาะพอร์ต", "addKnock": "เพิ่มพอร์ต", "addProxyNode": "เพิ่มโหนด", - "proxyNode": "โหนดพร็อกซี", - "proxyType": "ประเภทพร็อกซี", - "quickActions": "การดำเนินการด่วน", - "sudoPasswordAutoFill": "การกรอกรหัสผ่านอัตโนมัติของ Sudo", - "sudoPassword": "รหัสผ่าน Sudo", - "keepaliveInterval": "ช่วงเวลาการรักษาการเชื่อมต่อ (มิลลิวินาที)", - "moshCommand": "กองบัญชาการ MOSH", - "environmentVariables": "ตัวแปรสภาพแวดล้อม", - "addVariable": "เพิ่มตัวแปร", - "docker": "ด็อกเกอร์", - "copyTerminalUrl": "คัดลอก URL ของเทอร์มินัล", - "copyFileManagerUrl": "คัดลอก URL ของตัวจัดการไฟล์", - "copyRemoteDesktopUrl": "คัดลอก URL ของเดสก์ท็อประยะไกล", - "failedToConnect": "ไม่สามารถเชื่อมต่อกับคอนโซลได้", - "connect": "เชื่อมต่อ", - "disconnect": "ตัดการเชื่อมต่อ", - "start": "เริ่ม", - "enableStatusCheck": "เปิดใช้งานการตรวจสอบสถานะ", - "enableMetrics": "เปิดใช้งานเมตริก", - "bulkUpdateFailed": "การอัปเดตจำนวนมากไม่สำเร็จ", - "selectAll": "เลือกทั้งหมด", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "ยกเลิกการเลือกทั้งหมด", "protocols": "โปรโตคอล", "secureShell": "เปลือกหุ้มที่ปลอดภัย", @@ -272,6 +303,9 @@ "unencryptedShell": "เชลล์ที่ไม่ได้เข้ารหัส", "addressIp": "ที่อยู่ / IP", "friendlyName": "ชื่อที่เป็นมิตร", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "โฟลเดอร์และขั้นสูง", "privateNotes": "บันทึกส่วนตัว", "privateNotesPlaceholder": "รายละเอียดเกี่ยวกับเซิร์ฟเวอร์นี้...", @@ -281,18 +315,18 @@ "addKnockBtn": "เพิ่มการเคาะ", "noPortKnocking": "ไม่ได้ตั้งค่าการตรวจจับพอร์ต (port knocking) ไว้", "knockPort": "น็อคพอร์ต", - "protocol": "โปรโตคอล", + "protocol": "Protocol", "delayAfterMs": "เวลาหน่วงหลังจาก (มิลลิวินาที)", "useSocks5Proxy": "ใช้พร็อกซี SOCKS5", "useSocks5ProxyDesc": "การเชื่อมต่อเส้นทางผ่านพร็อกซีเซิร์ฟเวอร์", - "proxyHost": "พร็อกซีโฮสต์", - "proxyPort": "พอร์ตพร็อกซี", - "proxyUsername": "ชื่อผู้ใช้พร็อกซี", - "proxyPassword": "รหัสผ่านพร็อกซี", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "พร็อกซีเดี่ยว", - "proxyChainMode": "พร็อกซีเชน", + "proxyChainMode": "Proxy Chain", "you": "คุณ", - "jumpHostChainLabel": "ห่วงโซ่ Jump Host", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "เพิ่มการกระโดด", "noJumpHosts": "ไม่ได้กำหนดค่า jump host ไว้", "selectAServer": "เลือกเซิร์ฟเวอร์...", @@ -300,10 +334,10 @@ "authMethod": "วิธีการตรวจสอบสิทธิ์", "storedCredential": "ข้อมูลประจำตัวที่บันทึกไว้", "selectACredential": "เลือกข้อมูลประจำตัว...", - "keyTypeLabel": "ประเภทกุญแจ", - "keyTypeAuto": "ตรวจจับอัตโนมัติ", - "keyPasteTab": "แปะ", - "keyUploadTab": "อัปโหลด", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "โหลดไฟล์คีย์แล้ว", "keyUploadClick": "คลิกเพื่ออัปโหลดไฟล์ .pem / .key / .ppk", "clearKey": "กุญแจล้าง", @@ -311,59 +345,105 @@ "keyReplaceNotice": "วางคีย์ใหม่ด้านล่างเพื่อแทนที่คีย์เดิม", "keyPassphraseSaved": "บันทึกรหัสผ่านแล้ว พิมพ์เพื่อเปลี่ยน", "replaceKey": "เปลี่ยนกุญแจ", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "แป้นพิมพ์แบบอินเทอร์แอคทีฟของ Force", "forceKeyboardInteractiveShortDesc": "บังคับให้ป้อนรหัสผ่านด้วยตนเองแม้ว่าจะมีกุญแจอยู่ก็ตาม", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "ลักษณะปลายทาง", "colorTheme": "ธีมสี", - "fontFamilyLabel": "ตระกูลฟอนต์", - "fontSizeLabel": "ขนาดตัวอักษร", - "cursorStyleLabel": "รูปแบบเคอร์เซอร์", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "ระยะห่างระหว่างตัวอักษร (พิกเซล)", - "lineHeightLabel": "ความสูงของเส้น", - "bellStyleLabel": "สไตล์เบลล์", - "backspaceModeLabel": "โหมดลบ", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "เคอร์เซอร์กะพริบ", "cursorBlinkingDesc": "เปิดใช้งานแอนิเมชั่นกระพริบสำหรับเคอร์เซอร์เทอร์มินัล", "rightClickSelectsWordLabel": "คลิกขวา เลือก Word", "rightClickSelectsWordShortDesc": "เลือกคำที่อยู่ใต้เคอร์เซอร์เมื่อคลิกขวา", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "การเน้นไวยากรณ์", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "ไทม์สแตมป์", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "พฤติกรรมและขั้นสูง", - "scrollbackBufferLabel": "บัฟเฟอร์การเลื่อนกลับ", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "จำนวนบรรทัดสูงสุดที่เก็บไว้ในประวัติ", - "sshAgentForwardingLabel": "การส่งต่อเอเจนต์ SSH", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "ส่งคีย์ SSH ในเครื่องของคุณไปยังโฮสต์นี้", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "เปิดใช้งาน Auto-Mosh", "enableAutoMoshDesc": "หากมีตัวเลือก ให้เลือกใช้ Mosh แทน SSH", "enableAutoTmux": "เปิดใช้งาน Auto-Tmux", "enableAutoTmuxDesc": "เปิดใช้งานหรือเชื่อมต่อกับเซสชัน tmux โดยอัตโนมัติ", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "การกรอกรหัสผ่านอัตโนมัติของ Sudo", "sudoPasswordAutoFillShortDesc": "ป้อนรหัสผ่าน sudo โดยอัตโนมัติเมื่อได้รับแจ้ง", - "sudoPasswordLabel": "รหัสผ่าน Sudo", - "environmentVariablesLabel": "ตัวแปรสภาพแวดล้อม", - "addVariableBtn": "เพิ่มตัวแปร", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "ไม่มีการกำหนดค่าตัวแปรสภาพแวดล้อมใดๆ", - "fastScrollModifierLabel": "ตัวแก้ไขการเลื่อนเร็ว", - "fastScrollSensitivityLabel": "ความไวในการเลื่อนเร็ว", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "ม็อช คอมมานโด", - "startupSnippetLabel": "ตัวอย่างโค้ดสำหรับเริ่มต้น", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "ช่วงเวลาการเชื่อมต่อ (วินาที)", "maxKeepaliveMisses": "แม็กซ์ คีทอะไลฟ์ พลาด", "tunnelSettings": "การตั้งค่าอุโมงค์", "enableTunneling": "เปิดใช้งานการสร้างอุโมงค์", "enableTunnelingDesc": "เปิดใช้งานฟังก์ชันอุโมงค์ SSH สำหรับโฮสต์นี้", "serverTunnelsSection": "อุโมงค์เซิร์ฟเวอร์", - "addTunnelBtn": "เพิ่มอุโมงค์", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "ไม่มีการกำหนดค่าอุโมงค์ใดๆ", - "tunnelLabel": "อุโมงค์ {{number}}", - "tunnelType": "ประเภทอุโมงค์", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "ส่งต่อพอร์ตภายในเครื่องไปยังพอร์ตบนเซิร์ฟเวอร์ระยะไกล (หรือโฮสต์ที่สามารถเข้าถึงได้จากเซิร์ฟเวอร์นั้น)", "tunnelModeRemoteDesc": "ส่งต่อพอร์ตบนเซิร์ฟเวอร์ระยะไกลกลับมายังพอร์ตภายในเครื่องของคุณ", "tunnelModeDynamicDesc": "สร้างพร็อกซี SOCKS5 บนพอร์ตภายในเครื่องเพื่อใช้ในการส่งต่อพอร์ตแบบไดนามิก", "sameHost": "โฮสต์นี้ (อุโมงค์ตรง)", "endpointHost": "โฮสต์ปลายทาง", - "endpointPort": "พอร์ตปลายทาง", + "endpointPort": "Endpoint Port", "bindHost": "โฮสต์ผูก", - "sourcePort": "พอร์ตต้นทาง", - "maxRetries": "จำนวนครั้งการลองใหม่สูงสุด", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "ช่วงเวลาการลองใหม่ (วินาที)", "autoStartLabel": "เริ่มอัตโนมัติ", "autoStartDesc": "เชื่อมต่ออุโมงค์นี้โดยอัตโนมัติเมื่อโหลดโฮสต์เสร็จ", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "ไม่สามารถเชื่อมต่อได้", "failedToDisconnectTunnel": "ไม่สามารถตัดการเชื่อมต่อได้", "dockerIntegration": "การผสานรวม Docker", - "enableDockerMonitor": "เปิดใช้งาน Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "ตรวจสอบและจัดการคอนเทนเนอร์บนโฮสต์นี้ผ่าน Docker", - "enableFileManagerMonitor": "เปิดใช้งานตัวจัดการไฟล์", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "เรียกดูและจัดการไฟล์บนโฮสต์นี้ผ่านทาง SFTP", - "defaultPathLabel": "เส้นทางเริ่มต้น", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "โฟลเดอร์ที่จะเปิดเมื่อโปรแกรมจัดการไฟล์เริ่มทำงานสำหรับโฮสต์นี้", - "statusChecksLabel": "การตรวจสอบสถานะ", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "เปิดใช้งานการตรวจสอบสถานะ", "enableStatusChecksDesc": "ตรวจสอบความพร้อมใช้งานของโฮสต์นี้เป็นระยะโดยการ ping ไปยังโฮสต์นี้", "useGlobalInterval": "ใช้ช่วงเวลาทั่วโลก", "useGlobalIntervalDesc": "แทนที่ด้วยช่วงเวลาตรวจสอบสถานะทั่วทั้งเซิร์ฟเวอร์", "checkIntervalS": "ช่วงเวลาตรวจสอบ", "checkIntervalDesc": "เวลาเป็นวินาทีระหว่างการส่งสัญญาณเชื่อมต่อแต่ละครั้ง", - "metricsCollectionLabel": "การรวบรวมเมตริก", - "enableMetricsLabel": "เปิดใช้งานเมตริก", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "รวบรวมข้อมูลการใช้งาน CPU, RAM, ดิสก์ และเครือข่ายจากโฮสต์นี้", "useGlobalMetrics": "ใช้ช่วงเวลาทั่วโลก", "useGlobalMetricsDesc": "แทนที่ด้วยช่วงเวลาการวัดเมตริกทั่วทั้งเซิร์ฟเวอร์", "metricsIntervalS": "ช่วงเวลาการวัด (วินาที)", "metricsIntervalDesc2": "จำนวนวินาทีระหว่างการบันทึกภาพเมตริก", "visibleWidgets": "วิดเจ็ตที่มองเห็นได้", - "cpuUsageLabel": "การใช้งาน CPU", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "เปอร์เซ็นต์การใช้งาน CPU, ค่าเฉลี่ยโหลด, กราฟสปาร์คไลน์", - "memoryLabel": "การใช้งานหน่วยความจำ", + "memoryLabel": "Memory Usage", "memoryDesc": "การใช้งาน RAM, สวอป, แคช", - "storageLabel": "การใช้งานดิสก์", + "storageLabel": "Disk Usage", "storageDesc": "ปริมาณการใช้ดิสก์ต่อจุดเชื่อมต่อ", - "networkLabel": "อินเทอร์เฟซเครือข่าย", + "networkLabel": "Network Interfaces", "networkDesc": "รายการอินเทอร์เฟซและแบนด์วิดท์", - "uptimeLabel": "เวลาใช้งาน", + "uptimeLabel": "Uptime", "uptimeDesc": "เวลาการทำงานของระบบและเวลาบูตเครื่อง", "systemInfoLabel": "ข้อมูลระบบ", "systemInfoDesc": "ระบบปฏิบัติการ, เคอร์เนล, ชื่อโฮสต์, สถาปัตยกรรม", @@ -409,61 +532,100 @@ "recentLoginsDesc": "เหตุการณ์การเข้าสู่ระบบสำเร็จและล้มเหลว", "topProcessesLabel": "กระบวนการสำคัญ", "topProcessesDesc": "PID, เปอร์เซ็นต์ CPU, เปอร์เซ็นต์หน่วยความจำ, คำสั่ง", - "listeningPortsLabel": "พอร์ตรับฟัง", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "เปิดพอร์ตด้วยกระบวนการและสถานะ", - "firewallLabel": "ไฟร์วอลล์", + "firewallLabel": "Firewall", "firewallDesc": "สถานะไฟร์วอลล์, AppArmor, SELinux", - "quickActionsLabel": "การดำเนินการด่วน", - "quickActionsToolbar": "การดำเนินการด่วนจะปรากฏเป็นปุ่มในแถบเครื่องมือสถิติเซิร์ฟเวอร์ เพื่อให้สามารถเรียกใช้คำสั่งได้ด้วยการคลิกเพียงครั้งเดียว", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "ยังไม่มีการดำเนินการใดๆ อย่างเร่งด่วนในขณะนี้", "buttonLabel": "ป้ายกำกับปุ่ม", "selectSnippetPlaceholder": "เลือกส่วนย่อย...", "addActionBtn": "เพิ่มการดำเนินการ", "hostSharedSuccessfully": "โฮสต์แชร์สำเร็จแล้ว", - "failedToShareHost": "ไม่สามารถแชร์โฮสต์ได้", + "failedToShareHost": "Failed to share host", "accessRevoked": "สิทธิ์การเข้าถึงถูกเพิกถอน", - "failedToRevokeAccess": "ไม่สามารถเพิกถอนสิทธิ์การเข้าถึงได้", - "cancelBtn": "ยกเลิก", - "savingBtn": "ประหยัด...", - "addHostBtn": "เพิ่มโฮสต์", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "โฮสต์ได้รับการอัปเดตแล้ว", "hostCreated": "โฮสต์สร้าง", "failedToSave": "ไม่สามารถบันทึกโฮสต์ได้", "credentialUpdated": "ข้อมูลประจำตัวได้รับการอัปเดตแล้ว", "credentialCreated": "สร้างข้อมูลประจำตัวแล้ว", - "failedToSaveCredential": "ไม่สามารถบันทึกข้อมูลประจำตัวได้", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "กลับไปที่หน้าโฮสต์", "backToCredentials": "กลับไปที่ข้อมูลประจำตัว", - "pinned": "ปักหมุด", - "noHostsFound": "ไม่พบโฮสต์", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "ลองใช้คำอื่นดู", "addFirstHost": "เพิ่มโฮสต์แรกของคุณเพื่อเริ่มต้นใช้งาน", "noCredentialsFound": "ไม่พบข้อมูลประจำตัว", - "addCredentialBtn": "เพิ่มข้อมูลรับรอง", - "updateCredentialBtn": "อัปเดตข้อมูลรับรอง", - "features": "คุณสมบัติ", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(ไม่มีโฟลเดอร์)", - "deleteSelected": "ลบ", + "deleteSelected": "Delete", "exitSelection": "การเลือกทางออก", - "importSkip": "นำเข้า (ข้ามรายการที่มีอยู่)", + "importSkip": "Import (skip existing)", "importOverwrite": "นำเข้า (เขียนทับ)", "collapseBtn": "ทรุด", "importExportBtn": "นำเข้า/ส่งออก", "hostStatusesRefreshed": "สถานะโฮสต์ได้รับการอัปเดตแล้ว", "failedToRefreshHosts": "ไม่สามารถรีเฟรชโฮสต์ได้", - "movedHostTo": "ย้าย {{host}} ไปที่ \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "ไม่สามารถย้ายโฮสต์ได้", - "folderRenamedTo": "เปลี่ยนชื่อโฟลเดอร์เป็น \"{{name}}\"", - "deletedFolder": "โฟลเดอร์ที่ถูกลบ \"{{name}}\"", - "failedToDeleteFolder": "ไม่สามารถลบโฟลเดอร์ได้", - "deleteAllInFolder": "ลบโฮสต์ทั้งหมดใน \"{{name}}\"? การดำเนินการนี้ไม่สามารถย้อนกลับได้", - "deletedHost": "ลบแล้ว {{name}}", - "copiedToClipboard": "คัดลอกไปยังคลิปบอร์ดแล้ว", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "แก้ไขโฟลเดอร์", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "แก้ไขโฟลเดอร์", + "deleteFolder": "ลบโฟลเดอร์", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "ไม่สามารถย้ายโฮสต์ได้", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "คัดลอก URL ของเทอร์มินัลแล้ว", "fileManagerUrlCopied": "คัดลอก URL ของตัวจัดการไฟล์แล้ว", "tunnelUrlCopied": "คัดลอก URL ของอุโมงค์แล้ว", "dockerUrlCopied": "คัดลอก URL ของ Docker แล้ว", - "serverStatsUrlCopied": "คัดลอก URL สถิติเซิร์ฟเวอร์แล้ว", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "คัดลอก URL ของ RDP แล้ว", "vncUrlCopied": "คัดลอก URL ของ VNC แล้ว", "telnetUrlCopied": "คัดลอก URL ของ Telnet แล้ว", @@ -471,109 +633,112 @@ "expandActions": "ขยายการดำเนินการ", "collapseActions": "การดำเนินการยุบ", "wakeOnLanAction": "เปิดใช้งานผ่าน LAN", - "wakeOnLanSuccess": "แพ็กเก็ตเวทมนตร์ถูกส่งไปยัง {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "ส่งแพ็กเก็ตเวทมนตร์ไม่สำเร็จ", - "cloneHostAction": "โคลนโฮสต์", + "cloneHostAction": "Clone Host", "copyAddress": "คัดลอกที่อยู่", "copyLink": "คัดลอกลิงก์", - "copyTerminalUrlAction": "คัดลอก URL ของเทอร์มินัล", - "copyFileManagerUrlAction": "คัดลอก URL ของตัวจัดการไฟล์", - "copyTunnelUrlAction": "คัดลอก URL อุโมงค์", - "copyDockerUrlAction": "คัดลอก URL ของ Docker", - "copyServerStatsUrlAction": "คัดลอก URL สถิติเซิร์ฟเวอร์", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "คัดลอก URL ของ RDP", "copyVncUrlAction": "คัดลอก URL ของ VNC", "copyTelnetUrlAction": "คัดลอก URL ของ Telnet", - "copyRemoteDesktopUrlAction": "คัดลอก URL ของเดสก์ท็อประยะไกล", - "deleteCredentialConfirm": "ลบข้อมูลประจำตัว \"{{name}}\"?", - "deletedCredential": "ลบแล้ว {{name}}", - "deploySSHKeyTitle": "ปรับใช้คีย์ SSH", - "deployingBtn": "กำลังติดตั้ง...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "ปรับใช้", "failedToDeployKey": "ไม่สามารถใช้งานคีย์ได้", - "deleteHostsConfirm": "ลบ {{count}} โฮสต์{{plural}}? ไม่สามารถยกเลิกได้", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "ย้ายไปยังรูทแล้ว", - "failedToMoveHosts": "ไม่สามารถย้ายโฮสต์ได้", - "enableTerminalFeature": "เปิดใช้งานเทอร์มินัล", - "disableTerminalFeature": "ปิดใช้งานเทอร์มินัล", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "เปิดใช้งานไฟล์", "disableFilesFeature": "ปิดใช้งานไฟล์", "enableTunnelsFeature": "เปิดใช้งานอุโมงค์", "disableTunnelsFeature": "ปิดใช้งานอุโมงค์", - "enableDockerFeature": "เปิดใช้งาน Docker", - "disableDockerFeature": "ปิดใช้งาน Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "เพิ่มแท็ก...", "authDetails": "รายละเอียดการตรวจสอบสิทธิ์", - "credType": "พิมพ์", + "credType": "Type", "generateKeyPairDesc": "สร้างคู่คีย์ใหม่ โดยทั้งคีย์ส่วนตัวและคีย์สาธารณะจะถูกกรอกโดยอัตโนมัติ", "generatingKey": "กำลังสร้าง...", - "generateLabel": "สร้าง {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "อัปโหลดไฟล์", "keyPassphraseOptional": "รหัสผ่านหลัก (ไม่บังคับ)", "sshPublicKeyOptional": "คีย์สาธารณะ SSH (ไม่บังคับ)", "publicKeyGenerated": "สร้างคีย์สาธารณะแล้ว", "failedToGeneratePublicKey": "ไม่สามารถสร้างคีย์สาธารณะได้", "publicKeyCopied": "คัดลอกคีย์สาธารณะแล้ว", - "keyPairGenerated": "สร้างคู่คีย์ {{label}} แล้ว", - "failedToGenerateKeyPair": "ไม่สามารถสร้างคู่คีย์ได้", - "searchHostsPlaceholder": "ค้นหาโฮสต์ ที่อยู่ แท็ก…", - "searchCredentialsPlaceholder": "ข้อมูลประจำตัวการค้นหา…", - "refreshBtn": "รีเฟรช", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "เพิ่มแท็ก...", - "deleteConfirmBtn": "ลบ", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "เซิร์ฟเวอร์ SSH ต้องตั้งค่า GatewayPorts yes, AllowTcpForwarding yes และ PermitRootLogin yes ในไฟล์ /etc/ssh/sshd_config", - "deleteHostConfirm": "ลบ \"{{name}}\"?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "เปิดใช้งานโปรโตคอลอย่างน้อยหนึ่งรายการด้านบนเพื่อกำหนดค่าการตรวจสอบสิทธิ์และการตั้งค่าการเชื่อมต่อ", - "keyPassphrase": "รหัสผ่านหลัก", - "connectBtn": "เชื่อมต่อ", - "disconnectBtn": "ตัดการเชื่อมต่อ", - "basicInformation": "ข้อมูลพื้นฐาน", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "รายละเอียดการตรวจสอบสิทธิ์", - "credTypeLabel": "พิมพ์", - "hostsTab": "โฮสต์", - "credentialsTab": "คุณสมบัติ", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "เลือกหลายรายการ", "selectHosts": "เลือกโฮสต์", - "connectionLabel": "การเชื่อมต่อ", - "authenticationLabel": "การตรวจสอบสิทธิ์", - "generateKeyPairTitle": "สร้างคู่คีย์", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "สร้างคู่คีย์ใหม่ โดยทั้งคีย์ส่วนตัวและคีย์สาธารณะจะถูกกรอกโดยอัตโนมัติ", - "generateFromPrivateKey": "สร้างจากรหัสส่วนตัว", - "refreshBtn2": "รีเฟรช", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "การเลือกทางออก", "exportAll": "ส่งออกทั้งหมด", - "addHostBtn2": "เพิ่มโฮสต์", - "addCredentialBtn2": "เพิ่มข้อมูลรับรอง", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "กำลังตรวจสอบสถานะของโฮสต์...", - "pinnedSection": "ปักหมุด", + "pinnedSection": "Pinned", "hostsExported": "การส่งออกโฮสต์สำเร็จแล้ว", "exportFailed": "ไม่สามารถส่งออกโฮสต์ได้", "sampleDownloaded": "ดาวน์โหลดไฟล์ตัวอย่างแล้ว", - "failedToDeleteCredential2": "ไม่สามารถลบข้อมูลประจำตัวได้", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(ไม่มีโฟลเดอร์)", - "nSelected": "{{count}} เลือกแล้ว", - "featuresMenu": "คุณสมบัติ", - "moveMenu": "เคลื่อนไหว", - "cancelSelection": "ยกเลิก", - "deployDialogDesc": "ปรับใช้ {{name}} กับ authorized_keys ของโฮสต์", - "targetHostLabel": "โฮสต์เป้าหมาย", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "เลือกโฮสต์...", "keyDeployedSuccess": "คีย์ถูกใช้งานสำเร็จแล้ว", "failedToDeployKey2": "ไม่สามารถใช้งานคีย์ได้", - "deletedCount": "โฮสต์ที่ถูกลบ {{count}}", - "failedToDeleteCount": "ไม่สามารถลบโฮสต์ {{count}} ได้", - "duplicatedHost": "ซ้ำกัน \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "ไม่สามารถสร้างโฮสต์ซ้ำได้", - "updatedCount": "อัปเดตโฮสต์ {{count}} แล้ว", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "ชื่อที่เป็นมิตร", - "descriptionLabel": "คำอธิบาย", + "descriptionLabel": "Description", "loadingHost": "กำลังโหลดโฮสต์...", - "loadingHosts": "กำลังโหลดโฮสต์...", - "loadingCredentials": "กำลังโหลดข้อมูลประจำตัว...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "ยังไม่มีโฮสต์", - "noHostsMatchSearch": "ไม่พบโฮสต์ใดตรงกับผลการค้นหาของคุณ", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "ไม่พบโฮสต์", - "searchHosts": "ค้นหาโฮสต์...", + "searchHosts": "Search hosts...", "sortHosts": "เรียงลำดับโฮสต์", "sortDefault": "ลำดับเริ่มต้น", "sortNameAsc": "ชื่อ (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "ปักหมุดไว้ก่อน", "filterHosts": "ตัวกรองโฮสต์", "filterClearAll": "ล้างตัวกรอง", - "filterStatusGroup": "สถานะ", - "filterOnline": "ออนไลน์", - "filterOffline": "ออฟไลน์", - "filterPinned": "ปักหมุด", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "ประเภทการตรวจสอบสิทธิ์", - "filterAuthPassword": "รหัสผ่าน", - "filterAuthKey": "คีย์ SSH", - "filterAuthCredential": "ใบรับรอง", - "filterAuthNone": "ไม่มี", - "filterAuthOpkssh": "โอพีเคเอสเอช", - "filterProtocolGroup": "โปรโตคอล", - "filterProtocolSsh": "เอสเอช", - "filterProtocolRdp": "อาร์ดีพี", - "filterProtocolVnc": "วีเอ็นซี", - "filterProtocolTelnet": "เทลเน็ต", - "filterFeaturesGroup": "คุณสมบัติ", - "filterFeatureTerminal": "เทอร์มินัล", - "filterFeatureFileManager": "ตัวจัดการไฟล์", - "filterFeatureTunnel": "อุโมงค์", - "filterFeatureDocker": "ด็อกเกอร์", - "filterTagsGroup": "แท็ก", - "shareHost": "แชร์โฮสต์", - "shareHostTitle": "แชร์: {{name}}", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", + "filterAuthOpkssh": "OPKSSH", + "filterProtocolGroup": "Protocol", + "filterProtocolSsh": "SSH", + "filterProtocolRdp": "RDP", + "filterProtocolVnc": "VNC", + "filterProtocolTelnet": "Telnet", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "โฮสต์นี้ต้องใช้ข้อมูลรับรองเพื่อเปิดใช้งานการแชร์ แก้ไขข้อมูลโฮสต์และกำหนดข้อมูลรับรองก่อน" }, "guac": { - "connection": "การเชื่อมต่อ", - "authentication": "การตรวจสอบสิทธิ์", - "connectionSettings": "การตั้งค่าการเชื่อมต่อ", - "displaySettings": "การตั้งค่าการแสดงผล", - "audioSettings": "การตั้งค่าเสียง", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "ข้อมูลประจำตัวที่บันทึกไว้", + "noCredential": "No credential (direct credentials below)", + "authMethod": "วิธีการตรวจสอบสิทธิ์", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "เลือกข้อมูลประจำตัว...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "ประสิทธิภาพ RDP", - "deviceRedirection": "การเปลี่ยนเส้นทางอุปกรณ์", - "session": "การประชุม", - "gateway": "เกตเวย์", - "remoteApp": "รีโมทแอป", - "clipboard": "คลิปบอร์ด", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "การบันทึกการประชุม", - "wakeOnLan": "ปลุกเครื่องผ่าน LAN", - "vncSettings": "การตั้งค่า VNC", - "terminalSettings": "การตั้งค่าเทอร์มินัล", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "พอร์ต RDP", - "username": "ชื่อผู้ใช้", - "password": "รหัสผ่าน", - "domain": "โดเมน", - "securityMode": "โหมดความปลอดภัย", - "colorDepth": "ความลึกของสี", - "width": "ความกว้าง", - "height": "ความสูง", - "dpi": "ดีพีไอ", - "resizeMethod": "วิธีการปรับขนาด", - "clientName": "ชื่อลูกค้า", - "initialProgram": "โปรแกรมเริ่มต้น", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "เค้าโครงเซิร์ฟเวอร์", - "timezone": "เขตเวลา", - "gatewayHostname": "ชื่อโฮสต์เกตเวย์", - "gatewayPort": "พอร์ตเกตเวย์", - "gatewayUsername": "ชื่อผู้ใช้เกตเวย์", - "gatewayPassword": "รหัสผ่านเกตเวย์", - "gatewayDomain": "โดเมนเกตเวย์", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "โปรแกรม RemoteApp", "workingDirectory": "ไดเร็กทอรีการทำงาน", "arguments": "ข้อโต้แย้ง", "normalizeLineEndings": "ปรับความยาวบรรทัดให้เป็นมาตรฐาน", - "recordingPath": "เส้นทางการบันทึก", - "recordingName": "ชื่อการบันทึก", - "macAddress": "ที่อยู่ MAC", - "broadcastAddress": "ที่อยู่กระจายเสียง", - "udpPort": "พอร์ต UDP", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "ระยะเวลารอคอย (วินาที)", - "driveName": "ชื่อไดรฟ์", - "drivePath": "เส้นทางขับรถ", - "ignoreCertificate": "ละเว้นใบรับรอง", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "อนุญาตการเชื่อมต่อกับโฮสต์ที่มีใบรับรองที่ลงนามด้วยตนเอง", - "forceLossless": "บังคับการสูญเสีย", + "forceLossless": "Force Lossless", "forceLosslessDesc": "บังคับใช้การเข้ารหัสภาพแบบไม่สูญเสียคุณภาพ (คุณภาพสูงกว่า ใช้แบนด์วิดท์มากกว่า)", - "disableAudio": "ปิดใช้งานเสียง", + "disableAudio": "Disable Audio", "disableAudioDesc": "ปิดเสียงทั้งหมดจากการเชื่อมต่อระยะไกล", "enableAudioInput": "เปิดใช้งานการรับเสียง (ไมโครโฟน)", "enableAudioInputDesc": "ส่งต่อไมโครโฟนในเครื่องไปยังเซสชันระยะไกล", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "เปิดใช้งานเอฟเฟกต์กระจก Aero", "menuAnimations": "แอนิเมชันเมนู", "menuAnimationsDesc": "เปิดใช้งานแอนิเมชั่นเฟดและสไลด์ของเมนู", - "disableBitmapCaching": "ปิดใช้งานการแคชภาพบิตแมป", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "ปิดใช้งานแคชภาพบิตแมป (อาจช่วยลดปัญหาภาพกระตุกได้)", - "disableOffscreenCaching": "ปิดใช้งานการแคชแบบออฟสกรีน", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "ปิดใช้งานแคชแบบออฟไลน์", - "disableGlyphCaching": "ปิดใช้งานการแคชสัญลักษณ์", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "ปิดใช้งานแคชสัญลักษณ์", - "enableGfx": "เปิดใช้งาน GFX", + "enableGfx": "Enable GFX", "enableGfxDesc": "ใช้ไปป์ไลน์กราฟิก RemoteFX", - "enablePrinting": "เปิดใช้งานการพิมพ์", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "โอนย้ายเครื่องพิมพ์ในเครื่องไปยังเซสชันระยะไกล", - "enableDriveRedirection": "เปิดใช้งานการเปลี่ยนเส้นทางไดรฟ์", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "แมปโฟลเดอร์ในเครื่องเป็นไดรฟ์ในเซสชันระยะไกล", - "createDrivePath": "สร้างเส้นทางไดรฟ์", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "สร้างโฟลเดอร์โดยอัตโนมัติหากยังไม่มีอยู่", - "disableDownload": "ปิดใช้งานการดาวน์โหลด", + "disableDownload": "Disable Download", "disableDownloadDesc": "ป้องกันการดาวน์โหลดไฟล์จากการเชื่อมต่อระยะไกล", - "disableUpload": "ปิดใช้งานการอัปโหลด", + "disableUpload": "Disable Upload", "disableUploadDesc": "ป้องกันการอัปโหลดไฟล์ไปยังเซสชันระยะไกล", - "enableTouch": "เปิดใช้งานระบบสัมผัส", + "enableTouch": "Enable Touch", "enableTouchDesc": "เปิดใช้งานการส่งต่อข้อมูลการสัมผัส", - "consoleSession": "เซสชันคอนโซล", + "consoleSession": "Console Session", "consoleSessionDesc": "เชื่อมต่อกับคอนโซล (เซสชัน 0) แทนที่จะสร้างเซสชันใหม่", "sendWolPacket": "ส่งแพ็กเก็ต WOL", "sendWolPacketDesc": "ส่งแพ็กเก็ตเวทมนตร์เพื่อปลุกโฮสต์นี้ก่อนเชื่อมต่อ", - "disableCopy": "ปิดใช้งานการคัดลอก", + "disableCopy": "Disable Copy", "disableCopyDesc": "ป้องกันการคัดลอกข้อความจากเซสชันระยะไกล", - "disablePaste": "ปิดใช้งานการวาง", + "disablePaste": "Disable Paste", "disablePasteDesc": "ป้องกันการวางข้อความลงในเซสชันระยะไกล", "createPathIfMissing": "สร้างเส้นทางหากยังไม่มีอยู่", "createPathIfMissingDesc": "สร้างไดเร็กทอรีสำหรับการบันทึกโดยอัตโนมัติ", - "excludeOutput": "ไม่รวมผลลัพธ์", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "ห้ามบันทึกข้อมูลที่แสดงบนหน้าจอ (บันทึกเฉพาะข้อมูลเมตาเท่านั้น)", - "excludeMouse": "ไม่รวมเมาส์", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "ห้ามบันทึกการเคลื่อนไหวของเมาส์", "includeKeystrokes": "รวมการกดแป้นพิมพ์", "includeKeystrokesDesc": "บันทึกการกดแป้นพิมพ์ดิบนอกเหนือจากข้อมูลที่แสดงผลบนหน้าจอ", @@ -718,102 +896,105 @@ "vncPassword": "รหัสผ่าน VNC", "vncUsernameOptional": "ชื่อผู้ใช้ (ไม่บังคับ)", "vncLeaveBlank": "เว้นว่างไว้หากไม่ต้องการใช้", - "cursorMode": "โหมดเคอร์เซอร์", - "swapRedBlue": "สลับสีแดง/น้ำเงิน", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "สลับช่องสีแดงและสีน้ำเงิน (แก้ไขปัญหาเรื่องสีบางอย่าง)", "readOnly": "อ่านอย่างเดียว", "readOnlyDesc": "ดูหน้าจอระยะไกลโดยไม่ต้องส่งข้อมูลใดๆ", "telnetPort": "พอร์ตเทลเน็ต", - "terminalType": "ประเภทเทอร์มินัล", - "fontName": "ชื่อแบบอักษร", - "fontSize": "ขนาดตัวอักษร", - "colorScheme": "โทนสี", - "backspaceKey": "ปุ่มลบ", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "บันทึกข้อมูลโฮสต์ก่อน", "sharingOptionsAfterSave": "ตัวเลือกการแชร์จะพร้อมใช้งานหลังจากบันทึกโฮสต์แล้ว", "sharingLoadError": "ไม่สามารถโหลดข้อมูลการแชร์ได้ โปรดตรวจสอบการเชื่อมต่อของคุณแล้วลองใหม่อีกครั้ง", - "shareHostSection": "แชร์โฮสต์", - "shareWithUser": "แชร์กับผู้ใช้", - "shareWithRole": "แชร์กับบทบาท", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "เลือกผู้ใช้", - "selectRole": "เลือกบทบาท", + "selectRole": "Select Role", "selectUserOption": "เลือกผู้ใช้...", "selectRoleOption": "เลือกบทบาท...", - "permissionLevel": "ระดับการอนุญาต", + "permissionLevel": "Permission Level", "expiresInHours": "หมดอายุใน (ชั่วโมง)", "noExpiryPlaceholder": "เว้นว่างไว้เพื่อป้องกันการหมดอายุ", - "shareBtn": "แบ่งปัน", - "currentAccess": "การเข้าถึงปัจจุบัน", - "typeHeader": "พิมพ์", - "targetHeader": "เป้า", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "การอนุญาต", - "grantedByHeader": "ได้รับอนุญาตโดย", - "expiresHeader": "หมดอายุ", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "ยังไม่มีข้อมูลการเข้าถึงใดๆ", - "expiredLabel": "หมดอายุ", - "neverLabel": "ไม่เคย", - "revokeBtn": "ถอน", - "cancelBtn": "ยกเลิก", - "savingBtn": "ประหยัด...", - "updateHostBtn": "อัปเดตโฮสต์", - "addHostBtn": "เพิ่มโฮสต์" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "ค้นหาโฮสต์ คำสั่ง หรือการตั้งค่า...", - "quickActions": "การดำเนินการด่วน", - "hostManager": "ผู้จัดการโฮสต์", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "จัดการ เพิ่ม หรือแก้ไขโฮสต์", "addNewHost": "เพิ่มโฮสต์ใหม่", "addNewHostDesc": "ลงทะเบียนโฮสต์ใหม่", - "adminSettings": "การตั้งค่าผู้ดูแลระบบ", + "adminSettings": "Admin Settings", "adminSettingsDesc": "ตั้งค่าระบบและผู้ใช้", - "userProfile": "โปรไฟล์ผู้ใช้", + "userProfile": "User Profile", "userProfileDesc": "จัดการบัญชีและตั้งค่าของคุณ", - "addCredential": "เพิ่มข้อมูลรับรอง", + "addCredential": "Add Credential", "addCredentialDesc": "จัดเก็บคีย์ SSH หรือรหัสผ่าน", - "recentActivity": "กิจกรรมล่าสุด", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "เซิร์ฟเวอร์และโฮสต์", - "noHostsFound": "ไม่พบโฮสต์ที่ตรงกับ \"{{search}}\"", - "links": "ลิงก์", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "นำทาง", - "select": "เลือก", + "select": "Select", "toggleWith": "สลับด้วย" }, "splitScreen": { - "paneEmpty": "บานหน้าต่าง {{index}} - ว่างเปล่า", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "ไม่มีการกำหนดแท็บ", "focusedPane": "หน้าต่างที่ใช้งานอยู่" }, "connections": { "noConnections": "ไม่มีการเชื่อมต่อ", "noConnectionsDesc": "เปิดเทอร์มินัล โปรแกรมจัดการไฟล์ หรือเดสก์ท็อประยะไกล เพื่อดูการเชื่อมต่อได้ที่นี่", - "connectedFor": "เชื่อมต่อเป็นเวลา {{duration}}", - "connected": "เชื่อมต่อแล้ว", - "disconnected": "ตัดการเชื่อมต่อ", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "ปิดแท็บ", "closeConnection": "ความสัมพันธ์ใกล้ชิด", "forgetTab": "ลืม", - "removeBackground": "ลบ", - "reconnect": "เชื่อมต่อใหม่", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "เปิดใหม่", "sectionOpen": "เปิด", "sectionBackground": "พื้นหลัง", "backgroundDesc": "การเชื่อมต่อจะยังคงอยู่เป็นเวลา 30 นาทีหลังจากตัดการเชื่อมต่อ และสามารถเชื่อมต่อใหม่ได้", "persisted": "ยังคงอยู่ในพื้นหลัง", - "expiresIn": "หมดอายุใน {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "ค้นหาการเชื่อมต่อ...", - "noSearchResults": "ไม่พบผลลัพธ์ที่ตรงกับการค้นหาของคุณ" + "noSearchResults": "ไม่พบผลลัพธ์ที่ตรงกับการค้นหาของคุณ", + "rename": "Rename session" }, "guacamole": { - "connecting": "กำลังเชื่อมต่อกับเซสชัน {{type}}...", - "connectionError": "ข้อผิดพลาดในการเชื่อมต่อ", - "connectionFailed": "การเชื่อมต่อล้มเหลว", - "failedToConnect": "ไม่สามารถรับโทเค็นการเชื่อมต่อได้", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "ไม่พบโฮสต์", - "noHostSelected": "ไม่ได้เลือกโฮสต์", - "reconnect": "เชื่อมต่อใหม่", - "retry": "ลองใหม่อีกครั้ง", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "บริการเดสก์ท็อประยะไกล (guacd) ไม่พร้อมใช้งาน โปรดตรวจสอบให้แน่ใจว่า guacd กำลังทำงาน สามารถเข้าถึงได้ และกำหนดค่าอย่างถูกต้องในการตั้งค่าผู้ดูแลระบบ", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "Win+L (หน้าจอล็อก)", "winKey": "ปุ่ม Windows", "ctrl": "Ctrl", - "alt": "อัลท์", - "shift": "กะ", + "alt": "Alt", + "shift": "Shift", "win": "ชนะ", - "stickyActive": "{{key}} (ล็อคอยู่ - คลิกเพื่อปลดล็อค)", - "stickyInactive": "{{key}} (คลิกเพื่อล็อค)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "หนี", "tab": "แท็บ", - "home": "บ้าน", + "home": "Home", "end": "จบ", "pageUp": "เลื่อนขึ้น", "pageDown": "เลื่อนลง", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "เชื่อมต่อกับโฮสต์", - "clear": "ชัดเจน", - "paste": "แปะ", - "reconnect": "เชื่อมต่อใหม่", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "การเชื่อมต่อขาดหาย", - "connected": "เชื่อมต่อแล้ว", - "clipboardWriteFailed": "ไม่สามารถคัดลอกไปยังคลิปบอร์ดได้ โปรดตรวจสอบให้แน่ใจว่าหน้าเว็บนั้นให้บริการผ่าน HTTPS หรือ localhost", - "clipboardReadFailed": "ไม่สามารถอ่านข้อมูลจากคลิปบอร์ดได้ โปรดตรวจสอบให้แน่ใจว่าได้ให้สิทธิ์การเข้าถึงคลิปบอร์ดแล้ว", - "clipboardHttpWarning": "การวางต้องใช้ HTTPS กด Ctrl+Shift+V หรือใช้งาน Termix ผ่าน HTTPS", - "unknownError": "เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "websocketError": "ข้อผิดพลาดในการเชื่อมต่อ WebSocket", - "connecting": "กำลังเชื่อมต่อ...", - "noHostSelected": "ไม่ได้เลือกโฮสต์", - "reconnecting": "กำลังเชื่อมต่อใหม่... ({{attempt}}/{{max}})", - "reconnected": "เชื่อมต่อสำเร็จแล้ว", - "tmuxSessionCreated": "สร้างเซสชัน tmux แล้ว: {{name}}", - "tmuxSessionAttached": "การเชื่อมต่อเซสชัน tmux: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux ไม่ได้ติดตั้งอยู่บนโฮสต์ระยะไกล จึงใช้เชลล์มาตรฐานแทน", "tmuxSessionPickerTitle": "เซสชัน tmux", "tmuxSessionPickerDesc": "พบเซสชัน tmux ที่มีอยู่แล้วในโฮสต์นี้ เลือกหนึ่งเซสชันเพื่อเชื่อมต่อใหม่หรือสร้างเซสชันใหม่", - "tmuxWindows": "วินโดวส์", - "tmuxWindowCount": "{{count}} หน้าต่าง", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "ลูกค้าที่แนบมาด้วย", - "tmuxAttachedCount": "{{count}} แนบมาด้วย", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "กิจกรรมล่าสุด", "tmuxTimeJustNow": "เมื่อสักครู่นี้เอง", - "tmuxTimeMinutes": "{{count}}นาทีที่แล้ว", - "tmuxTimeHours": "{{count}}ชั่วโมงที่แล้ว", - "tmuxTimeDays": "{{count}}วันก่อน", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "เริ่มเซสชั่นใหม่", "tmuxCopyHint": "ปรับตำแหน่งที่เลือกแล้วกด Enter เพื่อคัดลอกไปยังคลิปบอร์ด", "tmuxDetach": "ยกเลิกการเชื่อมต่อจากเซสชัน tmux", "tmuxDetached": "ตัดการเชื่อมต่อจากเซสชัน tmux แล้ว", - "maxReconnectAttemptsReached": "จำนวนครั้งการเชื่อมต่อใหม่สูงสุดครบแล้ว", - "closeTab": "ปิด", - "connectionTimeout": "หมดเวลาการเชื่อมต่อ", - "terminalTitle": "เทอร์มินัล - {{host}}", - "terminalWithPath": "เทอร์มินัล - {{host}}:{{path}}", - "runTitle": "กำลังวิ่ง {{command}} - {{host}}", - "totpRequired": "ต้องใช้การยืนยันตัวตนสองขั้นตอน", - "totpCodeLabel": "รหัสยืนยัน", - "totpVerify": "ตรวจสอบ", - "warpgateAuthRequired": "ต้องยืนยันตัวตนผ่านวาร์ปเกต", - "warpgateSecurityKey": "รหัสความปลอดภัย", - "warpgateAuthUrl": "URL สำหรับการตรวจสอบสิทธิ์", - "warpgateOpenBrowser": "เปิดในเบราว์เซอร์", - "warpgateContinue": "ฉันทำการยืนยันตัวตนเสร็จเรียบร้อยแล้ว", - "opksshAuthRequired": "ต้องใช้การตรวจสอบสิทธิ์ OPKSSH", - "opksshAuthDescription": "โปรดยืนยันตัวตนในเบราว์เซอร์ของคุณเพื่อดำเนินการต่อ เซสชันนี้จะมีอายุใช้งาน 24 ชั่วโมง", - "opksshOpenBrowser": "เปิดเบราว์เซอร์เพื่อยืนยันตัวตน", - "opksshWaitingForAuth": "กำลังรอการยืนยันตัวตนในเบราว์เซอร์...", - "opksshAuthenticating": "กำลังตรวจสอบสิทธิ์...", - "opksshTimeout": "การตรวจสอบสิทธิ์หมดเวลา โปรดลองอีกครั้ง", - "opksshAuthFailed": "การตรวจสอบสิทธิ์ล้มเหลว โปรดตรวจสอบข้อมูลประจำตัวของคุณและลองอีกครั้ง", - "opksshSignInWith": "ลงชื่อเข้าใช้ด้วย {{provider}}", - "sudoPasswordPopupTitle": "ใส่รหัสผ่าน?", - "websocketAbnormalClose": "การเชื่อมต่อถูกตัดโดยไม่คาดคิด อาจเกิดจากปัญหาเกี่ยวกับรีเวิร์สพร็อกซีหรือการกำหนดค่า SSL โปรดตรวจสอบบันทึกของเซิร์ฟเวอร์", - "connectionLogTitle": "บันทึกการเชื่อมต่อ", - "connectionLogCopy": "คัดลอกบันทึกไปยังคลิปบอร์ด", - "connectionLogEmpty": "ยังไม่มีบันทึกการเชื่อมต่อ", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "เปิด", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "กำลังรอข้อมูลบันทึกการเชื่อมต่อ...", - "connectionLogCopied": "บันทึกการเชื่อมต่อถูกคัดลอกไปยังคลิปบอร์ด", - "connectionLogCopyFailed": "ไม่สามารถคัดลอกบันทึกไปยังคลิปบอร์ดได้", - "connectionRejected": "เซิร์ฟเวอร์ปฏิเสธการเชื่อมต่อ โปรดตรวจสอบการยืนยันตัวตนและการกำหนดค่าเครือข่ายของคุณ", - "hostKeyRejected": "การตรวจสอบคีย์โฮสต์ SSH ถูกปฏิเสธ การเชื่อมต่อถูกยกเลิก", - "sessionTakenOver": "เซสชั่นนี้เปิดอยู่ในแท็บอื่น กำลังเชื่อมต่อใหม่..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "แท็บแยก", + "addToSplit": "เพิ่มลงในการแบ่ง", + "removeFromSplit": "ลบออกจากการแบ่ง" + } }, "fileManager": { - "noHostSelected": "ไม่ได้เลือกโฮสต์", + "noHostSelected": "No host selected", "initializingEditor": "กำลังเริ่มต้นโปรแกรมแก้ไข...", - "file": "ไฟล์", - "folder": "โฟลเดอร์", - "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": "เปลี่ยนชื่อ", - "uploading": "กำลังอัปโหลด...", - "uploadingFile": "กำลังอัปโหลด {{name}}...", - "fileName": "ชื่อไฟล์", - "folderName": "ชื่อโฟลเดอร์", - "fileUploadedSuccessfully": "ไฟล์ \"{{name}}\" อัปโหลดสำเร็จแล้ว", - "failedToUploadFile": "ไม่สามารถอัปโหลดไฟล์ได้", - "fileDownloadedSuccessfully": "ดาวน์โหลดไฟล์ \"{{name}}\" สำเร็จแล้ว", - "failedToDownloadFile": "ไม่สามารถดาวน์โหลดไฟล์ได้", - "fileCreatedSuccessfully": "สร้างไฟล์ \"{{name}}\" สำเร็จแล้ว", - "folderCreatedSuccessfully": "สร้างโฟลเดอร์ \"{{name}}\" สำเร็จแล้ว", - "failedToCreateItem": "ไม่สามารถสร้างรายการได้", - "operationFailed": "การดำเนินการ {{operation}} ล้มเหลวสำหรับ {{name}}: {{error}}", - "failedToResolveSymlink": "ไม่สามารถแก้ไขลิงก์สัญลักษณ์ได้", - "itemsDeletedSuccessfully": "รายการ {{count}} ถูกลบสำเร็จแล้ว", - "failedToDeleteItems": "ไม่สามารถลบรายการได้", - "sudoPasswordRequired": "ต้องใช้รหัสผ่านผู้ดูแลระบบ", - "enterSudoPassword": "ป้อนรหัสผ่าน sudo เพื่อดำเนินการต่อ", - "sudoPassword": "รหัสผ่าน Sudo", - "sudoOperationFailed": "การดำเนินการ Sudo ล้มเหลว", - "sudoAuthFailed": "การตรวจสอบสิทธิ์ Sudo ล้มเหลว", - "dragFilesToUpload": "ลากไฟล์มาวางที่นี่เพื่ออัปโหลด", - "emptyFolder": "โฟลเดอร์นี้ว่างเปล่า", - "searchFiles": "ค้นหาไฟล์...", - "upload": "อัปโหลด", - "selectHostToStart": "เลือกโฮสต์เพื่อเริ่มการจัดการไฟล์", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "โปรแกรมจัดการไฟล์ต้องการการเชื่อมต่อ SSH แต่เครื่องนี้ไม่ได้เปิดใช้งาน SSH", - "failedToConnect": "ไม่สามารถเชื่อมต่อ SSH ได้", - "failedToLoadDirectory": "ไม่สามารถโหลดไดเร็กทอรีได้", - "noSSHConnection": "ไม่มีการเชื่อมต่อ SSH ให้ใช้งาน", - "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}}?", - "permissionDenied": "ไม่ได้รับอนุญาต", - "serverError": "ข้อผิดพลาดของเซิร์ฟเวอร์", - "fileSavedSuccessfully": "บันทึกไฟล์สำเร็จแล้ว", - "failedToSaveFile": "ไม่สามารถบันทึกไฟล์ได้", - "confirmDeleteSingleItem": "คุณแน่ใจหรือไม่ว่าต้องการลบ \"{{name}} \" อย่างถาวร?", - "confirmDeleteMultipleItems": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการ {{count}} อย่างถาวร?", - "confirmDeleteMultipleItemsWithFolders": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการ {{count}} รายการอย่างถาวร ซึ่งรวมถึงโฟลเดอร์และเนื้อหาภายในด้วย", - "confirmDeleteFolder": "คุณแน่ใจหรือไม่ว่าต้องการลบโฟลเดอร์ \"{{name}}\" และเนื้อหาทั้งหมดในนั้นอย่างถาวร?", - "permanentDeleteWarning": "การดำเนินการนี้ไม่สามารถยกเลิกได้ รายการดังกล่าวจะถูกลบออกจากเซิร์ฟเวอร์อย่างถาวร", - "recent": "ล่าสุด", - "pinned": "ปักหมุด", - "folderShortcuts": "ทางลัดโฟลเดอร์", - "failedToReconnectSSH": "ไม่สามารถเชื่อมต่อเซสชัน SSH ใหม่ได้", - "openTerminalHere": "เปิดเทอร์มินัลที่นี่", - "run": "วิ่ง", - "openTerminalInFolder": "เปิดเทอร์มินัลในโฟลเดอร์นี้", - "openTerminalInFileLocation": "เปิดเทอร์มินัลที่ตำแหน่งไฟล์", - "runningFile": "การวิ่ง - {{file}}", - "onlyRunExecutableFiles": "สามารถเรียกใช้งานได้เฉพาะไฟล์ปฏิบัติการเท่านั้น", - "directories": "รายชื่อ", - "removedFromRecentFiles": "ลบ \"{{name}}\" ออกจากไฟล์ล่าสุดแล้ว", - "removeFailed": "ลบสิ่งที่ล้มเหลว", - "unpinnedSuccessfully": "ยกเลิกการตรึง \"{{name}}\" สำเร็จแล้ว", - "unpinFailed": "ยกเลิกการตรึงไม่สำเร็จ", - "removedShortcut": "ลบทางลัด \"{{name}} \" ออกแล้ว", - "removeShortcutFailed": "การลบทางลัดล้มเหลว", - "clearedAllRecentFiles": "ลบไฟล์ล่าสุดทั้งหมดแล้ว", - "clearFailed": "เคลียร์ล้มเหลว", - "removeFromRecentFiles": "ลบออกจากไฟล์ล่าสุด", - "clearAllRecentFiles": "ลบไฟล์ล่าสุดทั้งหมด", - "unpinFile": "ยกเลิกการตรึงไฟล์", - "removeShortcut": "ลบทางลัด", - "pinFile": "ไฟล์พิน", - "addToShortcuts": "เพิ่มไปยังทางลัด", - "pasteFailed": "การวางล้มเหลว", - "noUndoableActions": "ไม่มีการกระทำใดที่ย้อนกลับไม่ได้", - "undoCopySuccess": "ยกเลิกการคัดลอก: ลบไฟล์ที่คัดลอก {{count}} ไฟล์", - "undoCopyFailedDelete": "การยกเลิกการกระทำล้มเหลว: ไม่สามารถลบไฟล์ที่คัดลอกไว้ได้", - "undoCopyFailedNoInfo": "การยกเลิกการกระทำล้มเหลว: ไม่พบข้อมูลไฟล์ที่คัดลอกไว้", - "undoMoveSuccess": "ยกเลิกการย้าย: ย้ายไฟล์ {{count}} ไฟล์กลับไปยังตำแหน่งเดิม", - "undoMoveFailedMove": "การยกเลิกไม่สำเร็จ: ไม่สามารถย้ายไฟล์ใดๆ กลับได้", - "undoMoveFailedNoInfo": "การยกเลิกไม่สำเร็จ: ไม่พบข้อมูลไฟล์ที่ถูกย้าย", - "undoDeleteNotSupported": "ไม่สามารถยกเลิกการลบได้: ไฟล์ถูกลบออกจากเซิร์ฟเวอร์อย่างถาวรแล้ว", - "undoTypeNotSupported": "ประเภทการดำเนินการยกเลิกที่ไม่รองรับ", - "undoOperationFailed": "การยกเลิกการดำเนินการล้มเหลว", - "unknownError": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "confirm": "ยืนยัน", - "find": "หา...", - "replace": "แทนที่", - "downloadInstead": "ดาวน์โหลดแทน", - "keyboardShortcuts": "แป้นพิมพ์ลัด", - "searchAndReplace": "ค้นหาและแทนที่", - "editing": "การแก้ไข", - "search": "ค้นหา", - "findNext": "ค้นหาถัดไป", - "findPrevious": "ค้นหาก่อนหน้า", - "save": "บันทึก", - "selectAll": "เลือกทั้งหมด", - "undo": "เลิกทำ", - "redo": "ทำซ้ำ", - "moveLineUp": "เคลื่อนแถว", - "moveLineDown": "เลื่อนเส้นลง", - "toggleComment": "สลับการแสดงความคิดเห็น", - "autoComplete": "การเติมข้อความอัตโนมัติ", - "imageLoadError": "ไม่สามารถโหลดรูปภาพได้", - "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": "ไฟล์ใหม่.txt", - "successfullyMovedItems": "ย้ายรายการ {{count}} รายการไปยัง {{target}} สำเร็จแล้ว", - "move": "เคลื่อนไหว", - "searchInFile": "ค้นหาในไฟล์ (Ctrl+F)", - "showKeyboardShortcuts": "แสดงทางลัดแป้นพิมพ์", - "startWritingMarkdown": "เริ่มเขียนเนื้อหา Markdown ของคุณได้เลย...", - "loadingFileComparison": "กำลังโหลดการเปรียบเทียบไฟล์...", - "reload": "โหลดซ้ำ", - "compare": "เปรียบเทียบ", - "sideBySide": "เคียงข้างกัน", - "inline": "อินไลน์", - "fileComparison": "การเปรียบเทียบไฟล์: {{file1}} กับ {{file2}}", - "fileTooLarge": "ไฟล์มีขนาดใหญ่เกินไป: {{error}}", - "sshConnectionFailed": "การเชื่อมต่อ SSH ล้มเหลว โปรดตรวจสอบการเชื่อมต่อของคุณกับ {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "ไม่สามารถโหลดไฟล์ได้: {{error}}", - "connecting": "กำลังเชื่อมต่อ...", - "connectedSuccessfully": "เชื่อมต่อสำเร็จแล้ว", - "totpVerificationFailed": "การตรวจสอบ TOTP ล้มเหลว", - "warpgateVerificationFailed": "การตรวจสอบสิทธิ์วาร์ปไม่สำเร็จ", - "authenticationFailed": "การตรวจสอบสิทธิ์ล้มเหลว", - "verificationCodePrompt": "รหัสยืนยัน:", - "changePermissions": "เปลี่ยนสิทธิ์การเข้าถึง", - "currentPermissions": "สิทธิ์การเข้าถึงปัจจุบัน", - "owner": "เจ้าของ", - "group": "กลุ่ม", - "others": "คนอื่น", - "read": "อ่าน", - "write": "เขียน", - "execute": "ดำเนินการ", - "permissionsChangedSuccessfully": "สิทธิ์การเข้าถึงเปลี่ยนแปลงสำเร็จแล้ว", - "failedToChangePermissions": "ไม่สามารถเปลี่ยนสิทธิ์ได้", - "name": "ชื่อ", - "sortByName": "ชื่อ", - "sortByDate": "วันที่แก้ไขล่าสุด", - "sortBySize": "ขนาด", - "ascending": "ขึ้นไป", - "descending": "ลง", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "ราก", "new": "ใหม่", "sortBy": "เรียงลำดับตาม", @@ -1139,20 +1335,20 @@ "editor": "บรรณาธิการ", "octal": "แปด", "storage": "พื้นที่จัดเก็บ", - "disk": "ดิสก์", - "used": "ใช้แล้ว", - "of": "ของ", - "toggleSidebar": "สลับแถบด้านข้าง", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "ไม่สามารถโหลดไฟล์ PDF ได้", "pdfLoadError": "เกิดข้อผิดพลาดในการโหลดไฟล์ PDF นี้", "loadingPdf": "กำลังโหลดไฟล์ PDF...", "loadingPage": "กำลังโหลดหน้าเว็บ..." }, "transfer": { - "copyToHost": "คัดลอกไปยังโฮสต์…", - "moveToHost": "ย้ายไปยังโฮสต์…", - "copyItemsToHost": "คัดลอกรายการ {{count}} รายการไปยังโฮสต์…", - "moveItemsToHost": "ย้ายรายการ {{count}} รายการไปยังโฮสต์…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "ไม่มีโฮสต์ตัวจัดการไฟล์อื่นให้บริการ", "noHostsConnectedHint": "เพิ่มโฮสต์ SSH อีกตัวโดยเปิดใช้งานตัวจัดการไฟล์ในตัวจัดการโฮสต์", "selectDestinationHost": "เลือกโฮสต์ปลายทาง", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "ขยายข้อมูลจุดหมายปลายทางล่าสุด", "browseFolders": "เรียกดูโฟลเดอร์ปลายทาง", "browseDestination": "เรียกดูหรือป้อนเส้นทาง", - "confirmCopy": "สำเนา", - "confirmMove": "เคลื่อนไหว", - "transferring": "กำลังโอน…", - "compressing": "กำลังบีบอัด…", - "extracting": "กำลังแยก…", - "transferringItems": "กำลังโอนย้ายรายการ {{current}} รายการ {{total}} รายการ…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "การโอนเสร็จสมบูรณ์", "transferError": "การโอนล้มเหลว", - "transferPartial": "การโอนเสร็จสมบูรณ์โดยมีข้อผิดพลาด {{count}}", - "transferPartialHint": "ไม่สามารถโอนเงินได้: {{paths}}", - "itemsSummary": "{{count}} รายการ", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "สำหรับการโอนย้ายหลายรายการ ปลายทางต้องเป็นไดเร็กทอรี", "selectThisFolder": "เลือกโฟลเดอร์นี้", "browsePathWillBeCreated": "โฟลเดอร์นี้ยังไม่มีอยู่ จะถูกสร้างขึ้นเมื่อการถ่ายโอนเริ่มต้นขึ้น", "browsePathError": "ไม่สามารถเปิดเส้นทางนี้บนโฮสต์ปลายทางได้", "goUp": "ขึ้นไป", - "copyFolderToHost": "คัดลอกโฟลเดอร์ไปยังโฮสต์…", - "moveFolderToHost": "ย้ายโฟลเดอร์ไปยังโฮสต์…", - "hostReady": "พร้อม", - "hostConnecting": "กำลังเชื่อมต่อ…", - "hostDisconnected": "ไม่ได้เชื่อมต่อ", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "ต้องมีการยืนยันตัวตน — โปรดเปิดตัวจัดการไฟล์บนโฮสต์นี้ก่อน", - "hostConnectionFailed": "การเชื่อมต่อล้มเหลว", + "hostConnectionFailed": "Connection failed", "metricsTitle": "เวลาในการโอนย้าย", - "metricsPrepare": "เตรียมปลายทาง: {{duration}}", - "metricsCompress": "บีบอัดจากแหล่งที่มา: {{duration}}", - "metricsHopSourceRead": "แหล่งที่มา → เซิร์ฟเวอร์: {{throughput}}", - "metricsHopDestSftpWrite": "เซิร์ฟเวอร์ → ปลายทาง (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "เซิร์ฟเวอร์ → ปลายทาง (ภายในเครื่อง): {{throughput}}", - "metricsTransfer": "จากต้นทางถึงปลายทาง: {{throughput}} ({{duration}})", - "metricsExtract": "แตกไฟล์ที่ปลายทาง: {{duration}}", - "metricsSourceDelete": "ลบออกจากแหล่งที่มา: {{duration}}", - "metricsTotal": "รวม: {{duration}}", - "progressCompressing": "กำลังบีบอัดบนโฮสต์ต้นทาง…", - "progressExtracting": "กำลังแตกไฟล์ที่ปลายทาง…", - "progressTransferring": "กำลังถ่ายโอนข้อมูล…", - "progressReconnecting": "กำลังเชื่อมต่อใหม่…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "ช่องทางเปลี่ยนถ่ายแบบขนาน", - "parallelSegmentsOption": "{{count}} เลน", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "ไฟล์ขนาดใหญ่จะถูกแบ่งออกเป็นส่วนย่อยขนาด 256 MB การใช้หลายเลนจะใช้การเชื่อมต่อแยกกัน (เช่น การเริ่มการถ่ายโอนหลายรายการพร้อมกัน) เพื่อให้ได้ปริมาณงานโดยรวมที่สูงขึ้น", - "progressTotalSpeed": "{{speed}} รวม ({{lanes}} เลน)", - "progressTransferringItems": "กำลังถ่ายโอนไฟล์ ({{current}} จาก {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "ไฟล์ {{current}} / {{total}}", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "ไฟล์ต้นฉบับถูกเก็บไว้ (ถ่ายโอนบางส่วน)", "jumpHostLimitation": "โฮสต์ทั้งสองต้องสามารถเข้าถึงได้จากเซิร์ฟเวอร์ Termix ไม่รองรับการกำหนดเส้นทางโดยตรงระหว่างโฮสต์", - "cancel": "ยกเลิก", + "cancel": "Cancel", "methodLabel": "วิธีการถ่ายโอน", "methodAuto": "อัตโนมัติ", "methodTar": "คลังข้อมูลทาร์", @@ -1216,25 +1412,25 @@ "methodAutoHint": "เลือกใช้ไฟล์บีบอัดแบบ tar หรือ SFTP แบบต่อไฟล์ โดยพิจารณาจากจำนวนไฟล์ ขนาดไฟล์ และความสามารถในการบีบอัด ไฟล์เดี่ยวจะใช้ SFTP แบบสตรีมมิ่งเสมอ", "methodTarHint": "บีบอัดไฟล์ที่ต้นทาง ถ่ายโอนไฟล์เก็บถาวรหนึ่งไฟล์ และแตกไฟล์ที่ปลายทาง ต้องใช้ tar บนเครื่อง Unix ทั้งสองเครื่อง", "methodItemSftpHint": "โอนไฟล์แต่ละไฟล์ทีละไฟล์ผ่าน SFTP ใช้งานได้กับทุกระบบปฏิบัติการ รวมถึง Windows", - "methodPreviewLoading": "กำลังคำนวณวิธีการโอน…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "ไม่สามารถดูตัวอย่างวิธีการถ่ายโอนได้ เซิร์ฟเวอร์จะเลือกวิธีการเมื่อคุณเริ่มต้นใช้งาน", "methodPreviewWillUseTar": "จะใช้: ไฟล์เก็บถาวร Tar", "methodPreviewWillUseItemSftp": "จะใช้: SFTP แบบแยกไฟล์", - "methodPreviewScanSummary": "ไฟล์ {{fileCount}} ไฟล์, รวม {{totalSize}} ไฟล์ (สแกนจากโฮสต์ต้นทาง)", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "แต่ละไฟล์จะใช้สตรีม SFTP เดียวกันในการคัดลอกไฟล์ทีละไฟล์ ความคืบหน้าจะถูกรวมเข้าด้วยกัน ทำให้แถบแสดงความคืบหน้าเคลื่อนที่ช้าลงเมื่อคัดลอกไฟล์ขนาดใหญ่", "methodReason": { "user_item_sftp": "คุณเลือกใช้ SFTP แบบต่อไฟล์", "user_tar": "คุณเลือกไฟล์เก็บถาวรแบบ tar", "tar_unavailable": "Tar ไม่สามารถใช้งานได้บนโฮสต์หนึ่งหรือทั้งสองโฮสต์ จึงจะใช้ SFTP แบบแยกไฟล์แทน", "windows_host": "ระบบปฏิบัติการที่ใช้คือ Windows — ไม่ได้ใช้โปรแกรม tar", - "auto_multi_large": "อัตโนมัติ: ไฟล์หลายไฟล์ รวมถึงไฟล์ขนาดใหญ่ ({{largestSize}}) ที่มีข้อมูลที่สามารถบีบอัดได้ — tar จะรวมไฟล์เหล่านั้นไว้ในการถ่ายโอนครั้งเดียว", - "auto_single_large_in_archive": "อัตโนมัติ: ไฟล์ขนาดใหญ่หนึ่งไฟล์ ({{largestSize}}) ในชุดนี้ — SFTP ต่อไฟล์", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "อัตโนมัติ: ข้อมูลส่วนใหญ่ไม่สามารถบีบอัดได้ — SFTP แบบแยกไฟล์", - "auto_many_files": "อัตโนมัติ: หลายไฟล์ ({{fileCount}}) — tar ช่วยลดภาระต่อไฟล์", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "อัตโนมัติ: ตั้งค่า SFTP สำหรับแต่ละไฟล์ในชุดนี้" }, - "progressCancel": "ยกเลิก", - "progressCancelling": "การยกเลิก…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "หยุดชะงัก", "resumedHint": "เชื่อมต่อใหม่กับการถ่ายโอนที่เริ่มทำงานในหน้าต่างอื่นแล้ว", "transferCancelled": "การโอนเงินถูกยกเลิก", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "ไม่สามารถลบไฟล์บางส่วนได้", "cleanupDestFilesNothing": "ไม่มีอะไรต้องทำความสะอาดที่ปลายทาง", "cleanupDestFilesError": "การทำความสะอาดล้มเหลว", - "retryTransfer": "ลองใหม่อีกครั้ง", + "retryTransfer": "Retry", "retryTransferError": "การลองใหม่ล้มเหลว", "transferFailedRetryHint": "ข้อมูลบางส่วนถูกเก็บไว้ในปลายทาง การลองใหม่จะดำเนินการต่อเมื่อการเชื่อมต่อกลับมาใช้งานได้" }, "tunnels": { - "noSshTunnels": "ไม่มีอุโมงค์ SSH", - "createFirstTunnelMessage": "คุณยังไม่ได้สร้างอุโมงค์ SSH ใดๆ เลย กำหนดค่าการเชื่อมต่ออุโมงค์ใน Host Manager เพื่อเริ่มต้นใช้งาน", - "connected": "เชื่อมต่อแล้ว", - "disconnected": "ตัดการเชื่อมต่อ", - "connecting": "กำลังเชื่อมต่อ...", - "error": "ข้อผิดพลาด", - "canceling": "ยกเลิก...", - "connect": "เชื่อมต่อ", - "disconnect": "ตัดการเชื่อมต่อ", - "cancel": "ยกเลิก", - "port": "ท่าเรือ", - "localPort": "ท่าเรือท้องถิ่น", - "remotePort": "พอร์ตระยะไกล", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "พอร์ตโฮสต์ปัจจุบัน", - "endpointPort": "พอร์ตปลายทาง", + "endpointPort": "Endpoint Port", "bindIp": "ที่อยู่ IP ภายใน", - "endpointSshConfig": "การกำหนดค่า SSH ปลายทาง", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "โฮสต์ SSH ปลายทาง", "endpointSshHostPlaceholder": "เลือกโฮสต์ที่กำหนดค่าไว้", "endpointSshHostRequired": "เลือกโฮสต์ SSH ปลายทางสำหรับแต่ละอุโมงค์ไคลเอ็นต์", - "attempt": "ความพยายาม {{current}} ของ {{max}}", - "nextRetryIn": "ลองใหม่อีกครั้งใน {{seconds}} วินาที", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "อุโมงค์ไคลเอ็นต์", "clientTunnel": "อุโมงค์ลูกค้า", "addClientTunnel": "เพิ่มอุโมงค์ไคลเอ็นต์", "noClientTunnels": "ไม่มีการกำหนดค่าอุโมงค์ไคลเอ็นต์บนเดสก์ท็อปนี้", - "tunnelName": "ชื่ออุโมงค์", - "remoteHost": "โฮสต์ระยะไกล", - "autoStart": "เริ่มอัตโนมัติ", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "เริ่มทำงานเมื่อโปรแกรมไคลเอ็นต์บนเดสก์ท็อปนี้เปิดขึ้นและเชื่อมต่ออยู่ตลอดเวลา", "clientManualStartDesc": "ใช้ปุ่ม Start และ Stop จากแถวนี้ Termix จะไม่เปิดไฟล์นี้โดยอัตโนมัติ", "clientRemoteServerNote": "การส่งต่อพอร์ตระยะไกลอาจต้องใช้การตั้งค่า AllowTcpForwarding และ GatewayPorts บนเซิร์ฟเวอร์ SSH ปลายทาง พอร์ตระยะไกลจะปิดลงเมื่อเดสก์ท็อปนี้ตัดการเชื่อมต่อ", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "พอร์ตระยะไกลต้องอยู่ระหว่าง 1 ถึง 65535", "invalidLocalTargetPort": "พอร์ตเป้าหมายในเครื่องต้องอยู่ระหว่าง 1 ถึง 65535", "invalidEndpointPort": "พอร์ตปลายทางต้องอยู่ระหว่าง 1 ถึง 65535", - "duplicateAutoStartBind": "อุโมงค์ไคลเอ็นต์ที่เริ่มต้นอัตโนมัติเพียงหนึ่งเดียวเท่านั้นที่สามารถใช้ {{bind}} ได้", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "ไม่สามารถอัปเดตสถานะอุโมงค์ได้", - "active": "คล่องแคล่ว", - "start": "เริ่ม", - "stop": "หยุด", - "test": "ทดสอบ", - "type": "ประเภทอุโมงค์", - "typeLocal": "ท้องถิ่น (-L)", - "typeRemote": "รีโมท (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "ไดนามิก (-D)", "typeServerLocalDesc": "ปัจจุบันโฮสต์ไปยังเอนด์พอยต์", "typeServerRemoteDesc": "ปลายทางกลับไปยังโฮสต์ปัจจุบัน", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "ปลายทางกลับไปยังคอมพิวเตอร์เครื่องโลคอล", "typeClientDynamicDesc": "ถุงเท้าบนคอมพิวเตอร์เครื่องโลคัล", "typeDynamicDesc": "ส่งต่อทราฟฟิก SOCKS5 CONNECT ผ่าน SSH", - "forwardDescriptionServerLocal": "โฮสต์ปัจจุบัน {{sourcePort}} → ปลายทาง {{endpointPort}}", - "forwardDescriptionServerRemote": "ปลายทาง {{endpointPort}} → โฮสต์ปัจจุบัน {{sourcePort}}", - "forwardDescriptionServerDynamic": "SOCKS บนโฮสต์ปัจจุบัน {{sourcePort}}.", - "forwardDescriptionClientLocal": "เครื่องโลคอล {{sourcePort}} → รีโมท {{endpointPort}}", - "forwardDescriptionClientRemote": "รีโมท {{sourcePort}} → โลคอล {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS บนพอร์ตท้องถิ่น {{sourcePort}}", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → ถุงเท้า ผ่านทาง {{endpoint}}", - "autoNameClientLocal": "โลคอล {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → โลคอล {{localPort}}", - "autoNameClientDynamic": "ถุงเท้า {{localPort}} ผ่าน {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "เส้นทาง:", "lastStarted": "เริ่มครั้งล่าสุด", "lastTested": "ทดสอบครั้งล่าสุด", "lastError": "ข้อผิดพลาดล่าสุด", - "maxRetries": "จำนวนครั้งการลองใหม่สูงสุด", + "maxRetries": "Max Retries", "maxRetriesDescription": "จำนวนครั้งสูงสุดที่สามารถลองใหม่ได้", - "retryInterval": "ช่วงเวลาการลองใหม่ (วินาที)", - "retryIntervalDescription": "ต้องรอเวลาระหว่างการลองใหม่แต่ละครั้ง", - "local": "ท้องถิ่น", - "remote": "ระยะไกล", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "ปลายทาง", "host": "เจ้าภาพ", "mode": "โหมด", - "noHostSelected": "ไม่ได้เลือกโฮสต์", + "noHostSelected": "No host selected", "working": "การทำงาน..." }, - "serverStats": { - "cpu": "ซีพียู", - "memory": "หน่วยความจำ", - "disk": "ดิสก์", - "network": "เครือข่าย", - "uptime": "เวลาใช้งาน", - "processes": "กระบวนการ", - "available": "มีอยู่", - "free": "ฟรี", - "connecting": "กำลังเชื่อมต่อ...", - "connectionFailed": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้", - "naCpus": "ไม่มีข้อมูล CPU", - "cpuCores_one": "{{count}} แกนหลัก", - "cpuCores_other": "{{count}} คอร์", - "cpuUsage": "การใช้งาน CPU", - "memoryUsage": "การใช้งานหน่วยความจำ", - "diskUsage": "การใช้งานดิสก์", - "failedToFetchHostConfig": "ไม่สามารถดึงข้อมูลการกำหนดค่าโฮสต์ได้", - "serverOffline": "เซิร์ฟเวอร์ออฟไลน์", - "cannotFetchMetrics": "ไม่สามารถดึงข้อมูลเมตริกจากเซิร์ฟเวอร์ออฟไลน์ได้", - "totpFailed": "การตรวจสอบ TOTP ล้มเหลว", - "noneAuthNotSupported": "สถิติเซิร์ฟเวอร์ไม่รองรับประเภทการตรวจสอบสิทธิ์แบบ 'none'", - "load": "โหลด", - "systemInfo": "ข้อมูลระบบ", - "hostname": "ชื่อโฮสต์", - "operatingSystem": "ระบบปฏิบัติการ", - "kernel": "เคอร์เนล", - "seconds": "วินาที", - "networkInterfaces": "อินเทอร์เฟซเครือข่าย", - "noInterfacesFound": "ไม่พบอินเทอร์เฟซเครือข่าย", - "noProcessesFound": "ไม่พบกระบวนการใดๆ", - "loginStats": "สถิติการเข้าสู่ระบบ SSH", - "noRecentLoginData": "ไม่มีข้อมูลการเข้าสู่ระบบล่าสุด", - "executingQuickAction": "กำลังดำเนินการ {{name}}...", - "quickActionSuccess": "{{name}} เสร็จสมบูรณ์เรียบร้อยแล้ว", - "quickActionFailed": "{{name}} ล้มเหลว", - "quickActionError": "ไม่สามารถดำเนินการ {{name}} ได้", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "พอร์ตรับฟัง", - "protocol": "โปรโตคอล", - "port": "ท่าเรือ", - "address": "ที่อยู่", - "process": "กระบวนการ", - "noData": "ไม่มีข้อมูลพอร์ตการฟัง" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "ทั้งหมด", + "noData": "No listening ports data" }, "firewall": { - "title": "ไฟร์วอลล์", - "inactive": "ไม่ใช้งาน", - "policy": "นโยบาย", - "rules": "กฎ", - "noData": "ไม่มีข้อมูลไฟร์วอลล์ให้ใช้งาน", - "action": "การกระทำ", - "protocol": "โปรโต", - "port": "ท่าเรือ", - "source": "แหล่งที่มา", - "anywhere": "ทุกที่" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "โหลดเฉลี่ย", "swap": "แลกเปลี่ยน", "architecture": "สถาปัตยกรรม", - "refresh": "รีเฟรช", - "retry": "ลองใหม่อีกครั้ง" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "การทำงาน...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "การจัดการ SSH และเดสก์ท็อประยะไกลแบบโฮสต์เอง", - "loginTitle": "เข้าสู่ระบบ Termix", - "registerTitle": "สร้างบัญชี", - "forgotPassword": "ลืมรหัสผ่านใช่ไหม?", - "rememberMe": "จดจำอุปกรณ์เป็นเวลา 30 วัน (รวมถึง TOTP)", - "noAccount": "ยังไม่มีบัญชีใช่ไหม?", - "hasAccount": "มีบัญชีอยู่แล้วใช่ไหม?", - "twoFactorAuth": "การตรวจสอบสิทธิ์แบบสองปัจจัย", - "enterCode": "ป้อนรหัสยืนยัน", - "backupCode": "หรือใช้รหัสสำรอง", - "verifyCode": "ยืนยันรหัส", - "redirectingToApp": "กำลังเปลี่ยนเส้นทางไปยังแอป...", - "sshAuthenticationRequired": "ต้องมีการตรวจสอบสิทธิ์ SSH", - "sshNoKeyboardInteractive": "การตรวจสอบสิทธิ์แบบโต้ตอบผ่านแป้นพิมพ์ไม่พร้อมใช้งาน", - "sshAuthenticationFailed": "การตรวจสอบสิทธิ์ล้มเหลว", - "sshAuthenticationTimeout": "หมดเวลาการตรวจสอบสิทธิ์", - "sshNoKeyboardInteractiveDescription": "เซิร์ฟเวอร์ไม่รองรับการตรวจสอบสิทธิ์แบบโต้ตอบด้วยแป้นพิมพ์ โปรดป้อนรหัสผ่านหรือคีย์ SSH ของคุณ", - "sshAuthFailedDescription": "ข้อมูลประจำตัวที่ให้มาไม่ถูกต้อง โปรดลองอีกครั้งด้วยข้อมูลประจำตัวที่ถูกต้อง", - "sshTimeoutDescription": "การพยายามยืนยันตัวตนหมดเวลา โปรดลองอีกครั้ง", - "sshProvideCredentialsDescription": "โปรดระบุข้อมูลประจำตัว SSH ของคุณเพื่อเชื่อมต่อกับเซิร์ฟเวอร์นี้", - "sshPasswordDescription": "ป้อนรหัสผ่านสำหรับการเชื่อมต่อ SSH นี้", - "sshKeyPasswordDescription": "หากคีย์ SSH ของคุณถูกเข้ารหัส ให้ป้อนรหัสผ่านที่นี่", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "ต้องใส่รหัสผ่าน", "passphraseRequiredDescription": "คีย์ SSH ถูกเข้ารหัสไว้ โปรดป้อนรหัสผ่านเพื่อปลดล็อก", - "back": "กลับ", - "firstUser": "ผู้ใช้คนแรก", - "firstUserMessage": "คุณเป็นผู้ใช้คนแรกและจะได้รับสิทธิ์เป็นผู้ดูแลระบบ คุณสามารถดูการตั้งค่าผู้ดูแลระบบได้ในเมนูแบบเลื่อนลงผู้ใช้ด้านข้าง หากคุณคิดว่านี่เป็นข้อผิดพลาด โปรดตรวจสอบบันทึกของ Docker หรือสร้างปัญหาใน GitHub", - "external": "ภายนอก", - "loginWithExternal": "เข้าสู่ระบบด้วยผู้ให้บริการภายนอก", - "loginWithExternalDesc": "เข้าสู่ระบบโดยใช้ผู้ให้บริการยืนยันตัวตนภายนอกที่คุณกำหนดค่าไว้", - "externalNotSupportedInElectron": "แอป Electron ยังไม่รองรับการตรวจสอบสิทธิ์จากภายนอก โปรดใช้เวอร์ชันเว็บสำหรับการเข้าสู่ระบบ OIDC", - "resetPasswordButton": "รีเซ็ตรหัสผ่าน", - "sendResetCode": "ส่งรหัสรีเซ็ต", - "resetCodeDesc": "ป้อนชื่อผู้ใช้ของคุณเพื่อรับรหัสรีเซ็ต mật khẩu รหัสจะถูกบันทึกไว้ในบันทึกของคอนเทนเนอร์ Docker", - "resetCode": "รีเซ็ตโค้ด", - "verifyCodeButton": "ยืนยันรหัส", - "enterResetCode": "ป้อนรหัส 6 หลักจากบันทึกคอนเทนเนอร์ Docker สำหรับผู้ใช้:", - "newPassword": "รหัสผ่านใหม่", - "confirmNewPassword": "ยืนยันรหัสผ่าน", - "enterNewPassword": "ป้อนรหัสผ่านใหม่สำหรับผู้ใช้:", - "signUp": "ลงทะเบียน", - "desktopApp": "แอปเดสก์ท็อป", - "loggingInToDesktopApp": "การเข้าสู่ระบบแอปพลิเคชันบนเดสก์ท็อป", - "loadingServer": "กำลังโหลดเซิร์ฟเวอร์...", - "dataLossWarning": "การรีเซ็ตรหัสผ่านด้วยวิธีนี้จะลบข้อมูลโฮสต์ SSH ข้อมูลประจำตัว และข้อมูลที่เข้ารหัสอื่นๆ ที่บันทึกไว้ทั้งหมด การกระทำนี้ไม่สามารถย้อนกลับได้ โปรดใช้วิธีนี้เฉพาะในกรณีที่คุณลืมรหัสผ่านและไม่ได้เข้าสู่ระบบเท่านั้น", - "authenticationDisabled": "การตรวจสอบสิทธิ์ถูกปิดใช้งาน", - "authenticationDisabledDesc": "ขณะนี้วิธีการยืนยันตัวตนทั้งหมดถูกปิดใช้งาน โปรดติดต่อผู้ดูแลระบบของคุณ", - "attemptsRemaining": "เหลือการลองอีก {{count}} ครั้ง" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "ตรวจสอบคีย์โฮสต์ SSH", - "keyChangedWarning": "คีย์โฮสต์ SSH เปลี่ยนแล้ว", - "firstConnectionTitle": "นี่เป็นครั้งแรกที่เชื่อมต่อกับโฮสต์นี้", - "firstConnectionDescription": "ไม่สามารถตรวจสอบความถูกต้องของโฮสต์นี้ได้ โปรดตรวจสอบว่าลายนิ้วมือตรงกับที่คุณคาดหวังหรือไม่", - "keyChangedDescription": "รหัสโฮสต์ของเซิร์ฟเวอร์นี้มีการเปลี่ยนแปลงนับตั้งแต่การเชื่อมต่อครั้งล่าสุดของคุณ ซึ่งอาจบ่งชี้ถึงปัญหาด้านความปลอดภัย", - "previousKey": "คีย์ก่อนหน้า", - "newFingerprint": "ลายนิ้วมือใหม่", - "fingerprint": "ลายนิ้วมือ", - "verifyInstructions": "หากคุณเชื่อถือโฮสต์นี้ โปรดคลิก ยอมรับ เพื่อดำเนินการต่อและบันทึกข้อมูลนี้สำหรับการเชื่อมต่อในอนาคต", - "securityWarning": "คำเตือนด้านความปลอดภัย", - "acceptAndContinue": "ยอมรับและดำเนินการต่อ", - "acceptNewKey": "ยอมรับรหัสใหม่และดำเนินการต่อ" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "ไม่สามารถเชื่อมต่อกับฐานข้อมูลได้", - "unknownError": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "loginFailed": "การเข้าสู่ระบบล้มเหลว", - "failedPasswordReset": "ไม่สามารถเริ่มการรีเซ็ตรหัสผ่านได้", - "failedVerifyCode": "ไม่สามารถตรวจสอบรหัสรีเซ็ตได้", - "failedCompleteReset": "การรีเซ็ตรหัสผ่านล้มเหลว", - "invalidTotpCode": "รหัส TOTP ไม่ถูกต้อง", - "failedOidcLogin": "ไม่สามารถเริ่มต้นการเข้าสู่ระบบ OIDC ได้", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "มีการร้องขอการเข้าสู่ระบบแบบเงียบ แต่ไม่สามารถเข้าสู่ระบบ OIDC ได้", "failedUserInfo": "ไม่สามารถดึงข้อมูลผู้ใช้ได้หลังจากเข้าสู่ระบบ", - "oidcAuthFailed": "การตรวจสอบสิทธิ์ OIDC ล้มเหลว", - "invalidAuthUrl": "ได้รับ URL การอนุญาตที่ไม่ถูกต้องจากแบ็กเอนด์", - "requiredField": "ช่องนี้จำเป็นต้องกรอก", - "minLength": "ความยาวขั้นต่ำคือ {{min}}", - "passwordMismatch": "รหัสผ่านไม่ตรงกัน", - "passwordLoginDisabled": "ขณะนี้การเข้าสู่ระบบด้วยชื่อผู้ใช้/รหัสผ่านถูกปิดใช้งานอยู่", - "sessionExpired": "เซッションหมดอายุแล้ว โปรดเข้าสู่ระบบอีกครั้ง", - "totpRateLimited": "จำกัดจำนวนครั้ง: พยายามยืนยัน TOTP มากเกินไป โปรดลองใหม่อีกครั้งในภายหลัง", - "totpRateLimitedWithTime": "จำกัดจำนวนครั้ง: พยายามยืนยัน TOTP มากเกินไป โปรดรอ {{time}} วินาทีก่อนลองอีกครั้ง", - "resetCodeRateLimited": "จำกัดจำนวนครั้งในการยืนยัน: มีการพยายามยืนยันมากเกินไป โปรดลองใหม่อีกครั้งในภายหลัง", - "resetCodeRateLimitedWithTime": "จำกัดจำนวนครั้ง: มีการพยายามยืนยันมากเกินไป โปรดรอ {{time}} วินาทีก่อนลองอีกครั้ง", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "ไม่สามารถบันทึกโทเค็นการตรวจสอบสิทธิ์ได้", "failedToLoadServer": "ไม่สามารถโหลดเซิร์ฟเวอร์ได้" }, "messages": { - "registrationDisabled": "ขณะนี้ผู้ดูแลระบบได้ปิดใช้งานการลงทะเบียนบัญชีใหม่แล้ว โปรดเข้าสู่ระบบหรือติดต่อผู้ดูแลระบบ", - "userNotAllowed": "บัญชีของคุณไม่ได้รับอนุญาตให้ลงทะเบียน โปรดติดต่อผู้ดูแลระบบ", - "databaseConnectionFailed": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลได้", - "resetCodeSent": "รหัสรีเซ็ตถูกส่งไปยังบันทึกของ Docker แล้ว", - "codeVerified": "ตรวจสอบรหัสสำเร็จแล้ว", - "passwordResetSuccess": "การรีเซ็ตรหัสผ่านสำเร็จแล้ว", - "loginSuccess": "เข้าสู่ระบบสำเร็จ", - "registrationSuccess": "การลงทะเบียนสำเร็จ" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "อุโมงค์เดสก์ท็อปภายในเครื่องที่กำหนดเป้าหมายไปยังโฮสต์ SSH ที่กำหนดค่าไว้", "c2sTunnelPresets": "ค่าที่ตั้งไว้ล่วงหน้าสำหรับอุโมงค์ไคลเอ็นต์", "c2sTunnelPresetsDesc": "บันทึกรายการอุโมงค์ภายในเครื่องของไคลเอนต์เดสก์ท็อปนี้เป็นค่าที่ตั้งไว้ล่วงหน้าของเซิร์ฟเวอร์ที่มีชื่อ หรือโหลดค่าที่ตั้งไว้ล่วงหน้ากลับไปยังไคลเอนต์นี้", "c2sTunnelPresetsUnavailable": "การตั้งค่าล่วงหน้าสำหรับอุโมงค์ไคลเอ็นต์มีให้ใช้งานเฉพาะในไคลเอ็นต์เดสก์ท็อปเท่านั้น", - "c2sPresetName": "ชื่อพรีเซ็ต", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "ชื่อการตั้งค่าล่วงหน้าของลูกค้า", "c2sPresetToLoad": "ตั้งค่าล่วงหน้าเพื่อโหลด", "c2sNoPresetSelected": "ไม่ได้เลือกค่าที่ตั้งไว้ล่วงหน้า", "c2sNoPresets": "ไม่มีการบันทึกค่าที่ตั้งไว้ล่วงหน้า", - "c2sLoadPreset": "โหลด", - "c2sCurrentLocalConfig": "{{count}} อุโมงค์ไคลเอ็นต์ภายในเครื่องที่กำหนดค่าไว้บนเดสก์ท็อปนี้", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "ค่าที่ตั้งไว้ล่วงหน้าเป็นภาพรวมที่ถูกกำหนดไว้อย่างชัดเจน การโหลดค่าใดค่าหนึ่งจะแทนที่รายการอุโมงค์ไคลเอ็นต์ในเครื่องของไคลเอ็นต์เดสก์ท็อปนี้", "c2sPresetSaved": "บันทึกการตั้งค่าอุโมงค์ไคลเอ็นต์ไว้แล้ว", "c2sPresetLoaded": "โหลดค่าที่ตั้งไว้ล่วงหน้าของอุโมงค์ไคลเอ็นต์ในเครื่องแล้ว", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "ภาษา", - "keyPassword": "รหัสผ่านสำคัญ", - "pastePrivateKey": "วางรหัสส่วนตัวของคุณที่นี่...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (ฟังในพื้นที่ของคุณ)", "localTargetHost": "127.0.0.1 (เป้าหมายบนคอมพิวเตอร์เครื่องนี้)", "socksListenerHost": "127.0.0.1 (ผู้ฟัง SOCKS)", - "enterPassword": "ป้อนรหัสผ่านของคุณ", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "แดชบอร์ด", - "loading": "กำลังโหลดแดชบอร์ด...", - "github": "กิตฮับ", - "support": "สนับสนุน", - "discord": "ดิสคอร์ด", - "serverOverview": "ภาพรวมเซิร์ฟเวอร์", - "version": "เวอร์ชั่น", - "upToDate": "อัปเดตล่าสุด", - "updateAvailable": "มีการอัปเดตแล้ว", + "title": "Dashboard", + "loading": "Loading dashboard...", + "github": "GitHub", + "support": "Support", + "discord": "Discord", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "เบต้า", - "uptime": "เวลาใช้งาน", - "database": "ฐานข้อมูล", - "healthy": "สุขภาพดี", - "error": "ข้อผิดพลาด", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "โฮสต์ทั้งหมด", - "totalTunnels": "อุโมงค์ทั้งหมด", - "totalCredentials": "ข้อมูลประจำตัวทั้งหมด", - "recentActivity": "กิจกรรมล่าสุด", - "reset": "รีเซ็ต", - "loadingRecentActivity": "กำลังโหลดกิจกรรมล่าสุด...", - "noRecentActivity": "ไม่มีกิจกรรมล่าสุด", - "quickActions": "การดำเนินการด่วน", - "addHost": "เพิ่มโฮสต์", - "addCredential": "เพิ่มข้อมูลรับรอง", - "adminSettings": "การตั้งค่าผู้ดูแลระบบ", - "userProfile": "โปรไฟล์ผู้ใช้", - "serverStats": "สถิติเซิร์ฟเวอร์", - "loadingServerStats": "กำลังโหลดข้อมูลสถิติเซิร์ฟเวอร์...", - "noServerData": "ไม่มีข้อมูลเซิร์ฟเวอร์", - "cpu": "ซีพียู", - "ram": "แรม", - "customizeLayout": "ปรับแต่งแดชบอร์ด", - "dashboardSettings": "การตั้งค่าแดชบอร์ด", - "enableDisableCards": "เปิดใช้งาน/ปิดใช้งานการ์ด", - "resetLayout": "รีเซ็ตเป็นค่าเริ่มต้น", - "serverOverviewCard": "ภาพรวมเซิร์ฟเวอร์", - "recentActivityCard": "กิจกรรมล่าสุด", - "networkGraphCard": "กราฟเครือข่าย", - "networkGraph": "กราฟเครือข่าย", - "quickActionsCard": "การดำเนินการด่วน", - "serverStatsCard": "สถิติเซิร์ฟเวอร์", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "หลัก", "panelSide": "ด้านข้าง", - "justNow": "เมื่อสักครู่นี้เอง" + "justNow": "เมื่อสักครู่นี้เอง", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "มั่นคง", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "ไม่มีการกำหนดค่าโฮสต์", "online": "ออนไลน์", "offline": "ออฟไลน์", - "onlineLower": "ออนไลน์", - "nodes": "โหนด {{count}}", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "เพิ่ม:", "commandPalette": "พาเลทคำสั่ง", "done": "เสร็จแล้ว", "editModeInstructions": "ลากการ์ดเพื่อจัดเรียงลำดับใหม่ · ลากเส้นแบ่งคอลัมน์เพื่อปรับขนาดคอลัมน์ · ลากขอบด้านล่างของการ์ดเพื่อปรับขนาดความสูง · ลากไอคอนถังขยะเพื่อลบออก", "empty": "ว่างเปล่า", - "clear": "ชัดเจน" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "เพิ่มโฮสต์", - "addGroup": "เพิ่มกลุ่ม", - "addLink": "เพิ่มลิงก์", - "zoomIn": "ซูมเข้า", - "zoomOut": "ซูมออก", - "resetView": "รีเซ็ตมุมมอง", - "selectHost": "เลือกโฮสต์", - "chooseHost": "เลือกเจ้าภาพ...", - "parentGroup": "กลุ่มผู้ปกครอง", - "noGroup": "ไม่มีกลุ่ม", - "groupName": "ชื่อกลุ่ม", - "color": "สี", - "source": "แหล่งที่มา", - "target": "เป้า", - "moveToGroup": "ย้ายไปยังกลุ่ม", - "selectGroup": "เลือกกลุ่ม...", - "addConnection": "เพิ่มการเชื่อมต่อ", - "hostDetails": "รายละเอียดโฮสต์", - "removeFromGroup": "ลบออกจากกลุ่ม", - "addHostHere": "เพิ่มโฮสต์ที่นี่", - "editGroup": "แก้ไขกลุ่ม", - "delete": "ลบ", - "add": "เพิ่ม", - "create": "สร้าง", - "move": "เคลื่อนไหว", - "connect": "เชื่อมต่อ", - "createGroup": "สร้างกลุ่ม", - "selectSourcePlaceholder": "เลือกแหล่งที่มา...", - "selectTargetPlaceholder": "เลือกเป้าหมาย...", - "invalidFile": "ไฟล์ไม่ถูกต้อง", - "hostAlreadyExists": "โฮสต์อยู่ในโทโพโลยีแล้ว", - "connectionExists": "การเชื่อมต่อมีอยู่แล้ว", - "unknown": "ไม่ทราบ", - "name": "ชื่อ", - "ip": "ไอพี", - "status": "สถานะ", - "failedToAddNode": "ไม่สามารถเพิ่มโหนดได้", - "sourceDifferentFromTarget": "แหล่งที่มาและเป้าหมายต้องแตกต่างกัน", - "exportJSON": "ส่งออก JSON", - "importJSON": "นำเข้า JSON", - "terminal": "เทอร์มินัล", - "fileManager": "ตัวจัดการไฟล์", - "tunnel": "อุโมงค์", - "docker": "ด็อกเกอร์", - "serverStats": "สถิติเซิร์ฟเวอร์", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "ยังไม่มีโหนด" }, "docker": { - "notEnabled": "Docker ไม่ได้เปิดใช้งานสำหรับโฮสต์นี้", - "validating": "กำลังตรวจสอบความถูกต้องของ Docker...", - "connecting": "กำลังเชื่อมต่อ...", - "error": "ข้อผิดพลาด", - "version": "ด็อกเกอร์ {{version}}", - "connectionFailed": "ไม่สามารถเชื่อมต่อกับ Docker ได้", - "containerStarted": "คอนเทนเนอร์ {{name}} เริ่มทำงานแล้ว", - "failedToStartContainer": "ไม่สามารถเริ่มต้นคอนเทนเนอร์ได้ {{name}}", - "containerStopped": "คอนเทนเนอร์ {{name}} หยุดทำงานแล้ว", - "failedToStopContainer": "ไม่สามารถหยุดคอนเทนเนอร์ได้ {{name}}", - "containerRestarted": "คอนเทนเนอร์ {{name}} รีสตาร์ทแล้ว", - "failedToRestartContainer": "ไม่สามารถรีสตาร์ทคอนเทนเนอร์ได้ {{name}}", - "containerPaused": "คอนเทนเนอร์ {{name}} หยุดชั่วคราว", - "containerUnpaused": "คอนเทนเนอร์ {{name}} ยกเลิกการหยุดชั่วคราว", - "failedToTogglePauseContainer": "ไม่สามารถสลับสถานะหยุดชั่วคราวสำหรับคอนเทนเนอร์ {{name}} ได้", - "containerRemoved": "คอนเทนเนอร์ {{name}} ถูกลบออกแล้ว", - "failedToRemoveContainer": "ไม่สามารถลบคอนเทนเนอร์ {{name}} ได้", - "image": "ภาพ", - "ports": "ท่าเรือ", - "noPorts": "ไม่มีพอร์ต", - "start": "เริ่ม", - "confirmRemoveContainer": "คุณแน่ใจหรือไม่ว่าต้องการลบคอนเทนเนอร์ '{{name}}'? การกระทำนี้ไม่สามารถย้อนกลับได้", - "runningContainerWarning": "คำเตือน: ขณะนี้คอนเทนเนอร์นี้กำลังทำงานอยู่ การลบคอนเทนเนอร์นี้จะหยุดการทำงานของคอนเทนเนอร์ก่อน", - "loadingContainers": "กำลังขนถ่ายตู้คอนเทนเนอร์...", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "ตัวจัดการ Docker", - "autoRefresh": "รีเฟรชอัตโนมัติ", + "autoRefresh": "Auto Refresh", "timestamps": "ไทม์สแตมป์", "lines": "เส้น", - "filterLogs": "กรองบันทึก...", - "refresh": "รีเฟรช", - "download": "ดาวน์โหลด", - "clear": "ชัดเจน", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "ดาวน์โหลดบันทึกข้อมูลสำเร็จแล้ว", "last50": "50 ครั้งสุดท้าย", "last100": "100 ปีที่แล้ว", "last500": "500 ครั้งสุดท้าย", "last1000": "1000 ครั้งสุดท้าย", "allLogs": "บันทึกทั้งหมด", - "noLogsMatching": "ไม่พบบันทึกใดที่ตรงกับ \"{{query}}\"", - "noLogsAvailable": "ไม่มีบันทึกข้อมูล", - "noContainersFound": "ไม่พบภาชนะบรรจุใดๆ", - "noContainersFoundHint": "ไม่มีคอนเทนเนอร์ Docker ให้บริการบนโฮสต์นี้", - "searchPlaceholder": "ค้นหาตู้คอนเทนเนอร์...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "สถานะทั้งหมด", - "stateRunning": "วิ่ง", + "stateRunning": "Running", "statePaused": "หยุดชั่วคราว", "stateExited": "ออกแล้ว", "stateRestarting": "เริ่มใหม่", - "noContainersMatchFilters": "ไม่มีภาชนะใดตรงกับตัวกรองของคุณ", - "noContainersMatchFiltersHint": "ลองปรับเกณฑ์การค้นหาหรือตัวกรองของคุณดู", - "failedToFetchStats": "ไม่สามารถดึงข้อมูลสถิติของคอนเทนเนอร์ได้", - "containerNotRunning": "คอนเทนเนอร์ไม่ทำงาน", - "startContainerToViewStats": "เริ่มคอนเทนเนอร์เพื่อดูสถิติ", - "loadingStats": "กำลังโหลดสถิติ...", - "errorLoadingStats": "ข้อผิดพลาดในการโหลดสถิติ", - "noStatsAvailable": "ไม่มีสถิติให้ดู", - "cpuUsage": "การใช้งาน CPU", - "current": "ปัจจุบัน", - "memoryUsage": "การใช้งานหน่วยความจำ", - "networkIo": "อินพุต/เอาต์พุตเครือข่าย", - "input": "ป้อนข้อมูล", - "output": "เอาต์พุต", - "blockIo": "บล็อก I/O", - "read": "อ่าน", - "write": "เขียน", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "ข้อมูลเกี่ยวกับตู้คอนเทนเนอร์", - "name": "ชื่อ", - "id": "รหัสประจำตัว", - "state": "สถานะ", - "containerMustBeRunning": "ต้องเปิดใช้งานคอนเทนเนอร์ก่อนจึงจะสามารถเข้าถึงคอนโซลได้", - "verificationCodePrompt": "ป้อนรหัสยืนยัน", - "totpVerificationFailed": "การตรวจสอบ TOTP ล้มเหลว โปรดลองอีกครั้ง", - "warpgateVerificationFailed": "การตรวจสอบสิทธิ์ผ่านวาร์ปไม่สำเร็จ โปรดลองอีกครั้ง", - "connectedTo": "เชื่อมต่อกับ {{containerName}}", - "disconnected": "ตัดการเชื่อมต่อ", - "consoleError": "ข้อผิดพลาดของคอนโซล", - "errorMessage": "ข้อผิดพลาด: {{message}}", - "failedToConnect": "ไม่สามารถเชื่อมต่อกับคอนเทนเนอร์ได้", - "console": "คอนโซล", - "selectShell": "เลือกเปลือกหอย", - "bash": "ทุบตี", - "sh": "ช", - "ash": "เถ้า", - "connect": "เชื่อมต่อ", - "disconnect": "ตัดการเชื่อมต่อ", - "notConnected": "ไม่ได้เชื่อมต่อ", - "clickToConnect": "คลิกเชื่อมต่อเพื่อเริ่มเซสชันเชลล์", - "connectingTo": "กำลังเชื่อมต่อกับ {{containerName}}...", - "containerNotFound": "ไม่พบคอนเทนเนอร์", - "backToList": "กลับสู่รายการ", - "logs": "บันทึก", - "stats": "สถิติ", - "consoleTab": "คอนโซล", - "startContainerToAccess": "เริ่มคอนเทนเนอร์เพื่อเข้าถึงคอนโซล" + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "ทั่วไป", - "sectionOidc": "โอไอดีซี", - "sectionUsers": "ผู้ใช้", + "sectionGeneral": "General", + "sectionOidc": "OIDC", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "การประชุม", - "sectionRoles": "บทบาท", - "sectionDatabase": "ฐานข้อมูล", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "คีย์ API", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "ล้างตัวกรอง", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "ทั้งหมด", "allowRegistration": "อนุญาตให้ผู้ใช้ลงทะเบียน", - "allowRegistrationDesc": "อนุญาตให้ผู้ใช้ใหม่ลงทะเบียนด้วยตนเอง", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "อนุญาตให้เข้าสู่ระบบด้วยรหัสผ่าน", "allowPasswordLoginDesc": "เข้าสู่ระบบด้วยชื่อผู้ใช้/รหัสผ่าน", "oidcAutoProvision": "การจัดเตรียมอัตโนมัติของ OIDC", - "oidcAutoProvisionDesc": "สร้างบัญชีผู้ใช้ OIDC โดยอัตโนมัติ แม้ว่าจะปิดใช้งานการลงทะเบียนไว้ก็ตาม", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "อนุญาตให้รีเซ็ตรหัสผ่าน", "allowPasswordResetDesc": "รีเซ็ตโค้ดผ่านบันทึก Docker", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "หมดเวลาเซสชัน", - "hours": "ชั่วโมง", + "hours": "hours", "sessionTimeoutRange": "ขั้นต่ำ 1 ชั่วโมง · ขั้นสูงสุด 720 ชั่วโมง", - "monitoringDefaults": "การตรวจสอบค่าเริ่มต้น", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "ตรวจสอบสถานะ", - "metrics": "ตัวชี้วัด", + "metrics": "Metrics", "sec": "วินาที", "logLevel": "ระดับบันทึก", "enableGuacamole": "เปิดใช้งาน Guacamole", "enableGuacamoleDesc": "การเข้าถึงเดสก์ท็อประยะไกลผ่าน RDP/VNC", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "URL guacd", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "ตั้งค่า OpenID Connect สำหรับ SSO ช่องที่มีเครื่องหมาย * กำกับไว้เป็นช่องที่ต้องกรอก", - "oidcClientId": "รหัสลูกค้า", - "oidcClientSecret": "ความลับของลูกค้า", - "oidcAuthUrl": "URL การอนุญาต", - "oidcIssuerUrl": "URL ของผู้ออก", - "oidcTokenUrl": "URL โทเค็น", - "oidcUserIdentifier": "เส้นทางตัวระบุผู้ใช้", - "oidcDisplayName": "ชื่อที่แสดง เส้นทาง", - "oidcScopes": "กล้องส่องทางไกล", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "แทนที่ URL ข้อมูลผู้ใช้", - "oidcAllowedUsers": "ผู้ใช้ที่ได้รับอนุญาต", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "อีเมลหนึ่งฉบับต่อหนึ่งบรรทัด หากเว้นว่างไว้จะอนุญาตให้ใช้ทั้งหมด", - "removeOidc": "ลบ", - "usersCount": "ผู้ใช้ {{count}} คน", - "createUser": "สร้าง", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "บทบาทใหม่", - "roleName": "ชื่อ", - "roleDisplayName": "ชื่อที่แสดง", - "roleDescription": "คำอธิบาย", - "rolesCount": "{{count}} บทบาท", - "createRole": "สร้าง", - "creating": "กำลังสร้าง...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "ส่งออกฐานข้อมูล", "exportDatabaseDesc": "ดาวน์โหลดไฟล์สำรองข้อมูลของโฮสต์ ข้อมูลประจำตัว และการตั้งค่าทั้งหมด", - "export": "ส่งออก", - "exporting": "กำลังส่งออก...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "นำเข้าฐานข้อมูล", "importDatabaseDesc": "กู้คืนจากไฟล์สำรองข้อมูล .sqlite", - "importDatabaseSelected": "เลือกแล้ว: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "เลือกไฟล์", - "changeFile": "เปลี่ยน", - "import": "นำเข้า", - "importing": "กำลังนำเข้า...", - "apiKeysCount": "{{count}} คีย์", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "คีย์ API ใหม่", "apiKeyCreatedWarning": "สร้างรหัสแล้ว - คัดลอกรหัสนี้ไว้ จะไม่แสดงอีกต่อไป", - "apiKeyName": "ชื่อ", - "apiKeyUser": "ผู้ใช้", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "เลือกผู้ใช้...", - "apiKeyExpiresAt": "หมดอายุเวลา", + "apiKeyExpiresAt": "Expires At", "createKey": "สร้างคีย์", "apiKeyNoExpiry": "ไม่มีวันหมดอายุ", "revokedBadge": "เพิกถอน", - "authTypeDual": "การตรวจสอบสิทธิ์แบบคู่", - "authTypeOidc": "โอไอดีซี", - "authTypeLocal": "ท้องถิ่น", - "adminStatusAdministrator": "ผู้ดูแลระบบ", - "adminStatusRegularUser": "ผู้ใช้ทั่วไป", + "authTypeDual": "Dual Auth", + "authTypeOidc": "OIDC", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "ผู้ดูแลระบบ", "systemBadge": "ระบบ", "customBadge": "กำหนดเอง", "youBadge": "คุณ", - "sessionsActive": "{{count}} ใช้งานอยู่", - "sessionActive": "ใช้งานอยู่: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "ทั้งหมด", "revokeAllSessionsSuccess": "เซสชันทั้งหมดสำหรับผู้ใช้ถูกยกเลิกแล้ว", - "revokeAllSessionsFailed": "ไม่สามารถยกเลิกเซสชันได้", - "revokeSessionFailed": "ไม่สามารถยกเลิกเซสชันได้", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "เพิ่มบทบาท", "noCustomRoles": "ไม่มีการกำหนดบทบาทที่กำหนดเอง", - "removeRoleFailed": "ไม่สามารถลบบทบาทได้", - "assignRoleFailed": "ไม่สามารถกำหนดบทบาทได้", - "deleteRoleFailed": "ไม่สามารถลบบทบาทได้", - "userAdminAccess": "ผู้ดูแลระบบ", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "เข้าถึงการตั้งค่าผู้ดูแลระบบทั้งหมดได้อย่างเต็มที่", - "userRoles": "บทบาท", - "revokeAllUserSessions": "ยกเลิกเซสชันทั้งหมด", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "บังคับล็อกอินใหม่บนอุปกรณ์ทุกเครื่อง", - "revoke": "ถอน", + "revoke": "Revoke", "deleteUserWarning": "การลบผู้ใช้นี้เป็นการลบถาวร", - "deleteUser": "ลบ {{username}}", - "deleting": "กำลังลบ...", - "deleteUserFailed": "ไม่สามารถลบผู้ใช้ได้", - "deleteUserSuccess": "ผู้ใช้ \"{{username}}\" ถูกลบ", - "deleteRoleSuccess": "บทบาท \"{{name}}\" ถูกลบ", - "revokeKeySuccess": "คีย์ \"{{name}}\" ถูกยกเลิก", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "ไม่สามารถยกเลิกคีย์ได้", - "copiedToClipboard": "คัดลอกไปยังคลิปบอร์ดแล้ว", + "copiedToClipboard": "Copied to clipboard", "done": "เสร็จแล้ว", - "createUserTitle": "สร้างผู้ใช้", + "createUserTitle": "Create User", "createUserDesc": "สร้างบัญชีผู้ใช้ภายในเครื่องใหม่", - "createUserUsername": "ชื่อผู้ใช้", - "createUserPassword": "รหัสผ่าน", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "อย่างน้อย 6 ตัวอักษร", - "createUserEnterUsername": "ป้อนชื่อผู้ใช้", - "createUserEnterPassword": "ป้อนรหัสผ่าน", - "createUserSubmit": "สร้างผู้ใช้", - "editUserTitle": "จัดการผู้ใช้: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "แก้ไขบทบาท สถานะผู้ดูแลระบบ เซสชัน และการตั้งค่าบัญชี", - "editUserUsername": "ชื่อผู้ใช้", + "editUserUsername": "Username", "editUserAuthType": "ประเภทการตรวจสอบสิทธิ์", - "editUserAdminStatus": "สถานะผู้ดูแลระบบ", - "editUserUserId": "รหัสผู้ใช้", - "linkAccountTitle": "เชื่อมโยง OIDC กับบัญชีรหัสผ่าน", - "linkAccountDesc": "ผสานบัญชี OIDC {{username}} กับบัญชีโลคัลที่มีอยู่แล้ว", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "สิ่งนี้จะ:", "linkAccountEffect1": "ลบบัญชีที่ใช้เฉพาะ OIDC", "linkAccountEffect2": "เพิ่มการเข้าสู่ระบบ OIDC ไปยังบัญชีเป้าหมาย", "linkAccountEffect3": "อนุญาตให้เข้าสู่ระบบทั้งด้วย OIDC และรหัสผ่าน", - "linkAccountTargetUsername": "ชื่อผู้ใช้เป้าหมาย", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "ป้อนชื่อผู้ใช้บัญชีท้องถิ่นเพื่อเชื่อมโยง", - "linkAccounts": "เชื่อมโยงบัญชี", - "linkAccountSuccess": "บัญชี OIDC เชื่อมโยงกับ \"{{username}}\"", - "linkAccountFailed": "ไม่สามารถเชื่อมโยงบัญชี OIDC ได้", - "linkAccountInProgress": "กำลังเชื่อมโยง...", - "saving": "ประหยัด...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "ไม่สามารถอัปเดตการตั้งค่าการลงทะเบียนได้", "updatePasswordLoginFailed": "ไม่สามารถอัปเดตการตั้งค่าการเข้าสู่ระบบด้วยรหัสผ่านได้", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "ไม่สามารถอัปเดตการตั้งค่าการจัดเตรียมอัตโนมัติของ OIDC ได้", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "ไม่สามารถอัปเดตการตั้งค่าการรีเซ็ตรหัสผ่านได้", "sessionTimeoutRange2": "เวลาหมดอายุของเซสชันต้องอยู่ระหว่าง 1 ถึง 720 ชั่วโมง", "sessionTimeoutSaved": "บันทึกการหมดเวลาของเซสชันแล้ว", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "ค่าช่วงเวลาไม่ถูกต้อง", "monitoringSaved": "บันทึกการตั้งค่าการตรวจสอบแล้ว", "monitoringSaveFailed": "ไม่สามารถบันทึกการตั้งค่าการตรวจสอบได้", - "guacamoleSaved": "บันทึกการตั้งค่า Guacamole แล้ว", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "ไม่สามารถบันทึกการตั้งค่า Guacamole ได้", "guacamoleUpdateFailed": "ไม่สามารถอัปเดตการตั้งค่า Guacamole ได้", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "ไม่สามารถอัปเดตระดับการบันทึกได้", "oidcSaved": "บันทึกการตั้งค่า OIDC แล้ว", "oidcSaveFailed": "ไม่สามารถบันทึกการตั้งค่า OIDC ได้", "oidcRemoved": "การกำหนดค่า OIDC ถูกลบออกแล้ว", "oidcRemoveFailed": "ไม่สามารถลบการตั้งค่า OIDC ได้", "createUserRequired": "จำเป็นต้องระบุชื่อผู้ใช้และรหัสผ่าน", - "createUserPasswordTooShort": "รหัสผ่านต้องมีความยาวอย่างน้อย 6 ตัวอักษร", - "createUserSuccess": "ผู้ใช้ \"{{username}}\" สร้าง", - "createUserFailed": "ไม่สามารถสร้างผู้ใช้ได้", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "ไม่สามารถอัปเดตสถานะผู้ดูแลระบบได้", "allSessionsRevoked": "เซสชันทั้งหมดถูกยกเลิก", - "revokeSessionsFailed": "ไม่สามารถยกเลิกเซสชันได้", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "ต้องระบุชื่อและชื่อที่แสดง", - "createRoleSuccess": "บทบาท \"{{name}}\" ถูกสร้างขึ้น", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "ไม่สามารถสร้างบทบาทได้", "apiKeyNameRequired": "จำเป็นต้องระบุชื่อคีย์", "apiKeyUserRequired": "ต้องระบุรหัสผู้ใช้", - "apiKeyCreatedSuccess": "สร้างคีย์ API \"{{name}}\" แล้ว", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "ไม่สามารถสร้างคีย์ API ได้", "exportSuccess": "การส่งออกฐานข้อมูลสำเร็จแล้ว", "exportFailed": "การส่งออกฐานข้อมูลล้มเหลว", "importSelectFile": "โปรดเลือกไฟล์ก่อน", - "importCompleted": "การนำเข้าเสร็จสมบูรณ์: นำเข้า {{total}} รายการ ข้าม {{skipped}} รายการ", - "importFailed": "การนำเข้าล้มเหลว: {{error}}", - "importError": "การนำเข้าฐานข้อมูลล้มเหลว" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "การนำเข้าฐานข้อมูลล้มเหลว", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "เจ้าภาพ", - "hostPlaceholder": "192.168.1.1 หรือ example.com", - "portLabel": "ท่าเรือ", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "ชื่อผู้ใช้", - "usernamePlaceholder": "ชื่อผู้ใช้", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "การตรวจสอบสิทธิ์", - "passwordLabel": "รหัสผ่าน", - "passwordPlaceholder": "รหัสผ่าน", - "privateKeyLabel": "กุญแจส่วนตัว", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "วางรหัสส่วนตัว...", - "credentialLabel": "ใบรับรอง", + "credentialLabel": "Credential", "credentialPlaceholder": "เลือกข้อมูลรับรองที่บันทึกไว้", - "connectToTerminal": "เชื่อมต่อกับเทอร์มินัล", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "เชื่อมต่อกับไฟล์" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "ล้างทั้งหมด", "noHistoryEntries": "ไม่มีรายการประวัติ", "trackingDisabled": "การติดตามประวัติถูกปิดใช้งานแล้ว", - "trackingDisabledHint": "เปิดใช้งานการบันทึกคำสั่งในตั้งค่าโปรไฟล์ของคุณ" + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "การบันทึกคีย์", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "บันทึกไปยังเทอร์มินัล", "selectAll": "ทั้งหมด", - "selectNone": "ไม่มี", + "selectNone": "None", "noTerminalTabsOpen": "ไม่มีแท็บเทอร์มินัลเปิดอยู่", "selectTerminalsAbove": "เลือกเทอร์มินัลด้านบน", "broadcastInputPlaceholder": "พิมพ์ที่นี่เพื่อถ่ายทอดการกดแป้นพิมพ์...", "stopRecording": "หยุดบันทึก", "startRecording": "เริ่มบันทึก", - "settingsTitle": "การตั้งค่า", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "เปิดใช้งานการคัดลอก/วางโดยคลิกขวา" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "ลากแท็บลงในบานหน้าต่างด้านบน หรือใช้ฟังก์ชันกำหนดด่วน", "dropHere": "ปล่อยตรงนี้", "emptyPane": "ว่างเปล่า", - "dashboard": "แดชบอร์ด", + "dashboard": "Dashboard", "clearSplitScreen": "ล้างหน้าจอแยก", "quickAssign": "มอบหมายอย่างรวดเร็ว", - "alreadyAssigned": "บานหน้าต่าง {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "แท็บแยก", "addToSplit": "เพิ่มลงในการแบ่ง", "removeFromSplit": "ลบออกจากการแบ่ง", - "assignToPane": "กำหนดให้กับบานหน้าต่าง" + "assignToPane": "กำหนดให้กับบานหน้าต่าง", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "สร้างโค้ดสั้น", - "createSnippetDescription": "สร้างส่วนย่อยคำสั่งใหม่เพื่อเรียกใช้งานอย่างรวดเร็ว", - "nameLabel": "ชื่อ", - "namePlaceholder": "เช่น รีสตาร์ท Nginx", - "descriptionLabel": "คำอธิบาย", - "descriptionPlaceholder": "คำอธิบายเพิ่มเติม (ไม่บังคับ)", - "optional": "ไม่จำเป็น", - "folderLabel": "โฟลเดอร์", - "noFolder": "ไม่มีโฟลเดอร์ (ไม่ได้จัดหมวดหมู่)", - "commandLabel": "สั่งการ", - "commandPlaceholder": "เช่น sudo systemctl restart nginx", - "cancel": "ยกเลิก", - "createSnippetButton": "สร้างโค้ดสั้น", - "createFolderTitle": "สร้างโฟลเดอร์", - "createFolderDescription": "จัดระเบียบข้อความย่อของคุณลงในโฟลเดอร์", - "folderNameLabel": "ชื่อโฟลเดอร์", - "folderNamePlaceholder": "เช่น คำสั่งระบบ, สคริปต์ Docker", - "folderColorLabel": "สีของโฟลเดอร์", - "folderIconLabel": "ไอคอนโฟลเดอร์", - "previewLabel": "ตัวอย่าง", - "folderNameFallback": "ชื่อโฟลเดอร์", - "createFolderButton": "สร้างโฟลเดอร์", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "เทอร์มินัลเป้าหมาย", "selectAll": "ทั้งหมด", - "selectNone": "ไม่มี", + "selectNone": "None", "noTerminalTabsOpen": "ไม่มีแท็บเทอร์มินัลเปิดอยู่", - "searchPlaceholder": "ตัวอย่างการค้นหา...", - "newSnippet": "โค้ดตัวอย่างใหม่", - "newFolder": "โฟลเดอร์ใหม่", - "run": "วิ่ง", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "ไม่มีไฟล์ตัวอย่างในโฟลเดอร์นี้", - "uncategorized": "ไม่มีหมวดหมู่", - "editSnippetTitle": "แก้ไขส่วนย่อย", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "อัปเดตส่วนคำสั่งนี้", "saveSnippetButton": "บันทึกการเปลี่ยนแปลง", - "createSuccess": "สร้างโค้ดตัวอย่างสำเร็จแล้ว", - "createFailed": "ไม่สามารถสร้างโค้ดตัวอย่างได้", - "updateSuccess": "อัปเดตข้อมูลตัวอย่างสำเร็จแล้ว", - "updateFailed": "ไม่สามารถอัปเดตโค้ดตัวอย่างได้", - "deleteFailed": "ไม่สามารถลบส่วนย่อยได้", - "folderCreateSuccess": "สร้างโฟลเดอร์สำเร็จแล้ว", - "folderCreateFailed": "ไม่สามารถสร้างโฟลเดอร์ได้", - "editFolderTitle": "แก้ไขโฟลเดอร์", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "เปลี่ยนชื่อหรือเปลี่ยนลักษณะของโฟลเดอร์นี้", "saveFolderButton": "บันทึกการเปลี่ยนแปลง", "editFolder": "แก้ไขโฟลเดอร์", "deleteFolder": "ลบโฟลเดอร์", - "folderDeleteSuccess": "โฟลเดอร์ \"{{name}}\" ถูกลบแล้ว", - "folderDeleteFailed": "ไม่สามารถลบโฟลเดอร์ได้", - "folderEditSuccess": "อัปเดตโฟลเดอร์สำเร็จแล้ว", - "folderEditFailed": "ไม่สามารถอัปเดตโฟลเดอร์ได้", - "confirmRunMessage": "เรียกใช้ \"{{name}}\"?", - "confirmRunButton": "วิ่ง", - "runSuccess": "Ran \"{{name}}\" ในเทอร์มินัล {{count}} เครื่อง", - "copySuccess": "คัดลอก \"{{name}}\" ไปยังคลิปบอร์ด", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "แชร์ตัวอย่าง", - "shareUser": "ผู้ใช้", - "shareRole": "บทบาท", + "shareUser": "User", + "shareRole": "Role", "selectUser": "เลือกผู้ใช้...", "selectRole": "เลือกบทบาท...", "shareSuccess": "แชร์โค้ดตัวอย่างสำเร็จแล้ว", "shareFailed": "ไม่สามารถแชร์ส่วนย่อยได้", "revokeSuccess": "สิทธิ์การเข้าถึงถูกเพิกถอน", - "revokeFailed": "ไม่สามารถเพิกถอนสิทธิ์การเข้าถึงได้", - "currentAccess": "การเข้าถึงปัจจุบัน", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "ไม่สามารถโหลดข้อมูลการแชร์ได้", - "loading": "กำลังโหลด...", - "close": "ปิด", - "reorderFailed": "ไม่สามารถบันทึกลำดับของโค้ดตัวอย่างได้" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "ไม่สามารถบันทึกลำดับของโค้ดตัวอย่างได้", + "importExport": "นำเข้า/ส่งออก", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "ไม่มีการกำหนดค่าโฮสต์", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "บัญชี", - "sectionAppearance": "รูปร่าง", - "sectionSecurity": "ความปลอดภัย", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "คีย์ API", "sectionC2sTunnels": "อุโมงค์ C2S", - "usernameLabel": "ชื่อผู้ใช้", - "roleLabel": "บทบาท", - "roleAdministrator": "ผู้ดูแลระบบ", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "วิธีการตรวจสอบสิทธิ์", - "authMethodLocal": "ท้องถิ่น", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "บน", "twoFaOff": "ปิด", - "versionLabel": "เวอร์ชั่น", - "deleteAccount": "ลบบัญชีผู้ใช้", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "ลบบัญชีของคุณอย่างถาวร", - "deleteButton": "ลบ", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "การกระทำนี้เป็นการกระทำถาวรและไม่สามารถยกเลิกได้", "deleteAccountWarning": "เซสชัน โฮสต์ ข้อมูลประจำตัว และการตั้งค่าทั้งหมดจะถูกลบอย่างถาวร", - "confirmPasswordDeletePlaceholder": "ป้อนรหัสผ่านของคุณเพื่อยืนยัน", - "languageLabel": "ภาษา", - "themeLabel": "ธีม", - "fontSizeLabel": "ขนาดตัวอักษร", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "สีเน้น", - "settingsTerminal": "เทอร์มินัล", - "commandAutocomplete": "การเติมคำสั่งอัตโนมัติ", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "แสดงคำแนะนำอัตโนมัติขณะพิมพ์", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "การติดตามประวัติ", "historyTrackingDesc": "ติดตามคำสั่งเทอร์มินัล", - "syntaxHighlighting": "การเน้นไวยากรณ์", - "syntaxHighlightingDesc": "เน้นเอาต์พุตเทอร์มินัล", "commandPalette": "พาเลทคำสั่ง", "commandPaletteDesc": "เปิดใช้งานปุ่มลัดแป้นพิมพ์", "reopenTabsOnLogin": "เปิดแท็บใหม่เมื่อเข้าสู่ระบบ", "reopenTabsOnLoginDesc": "กู้คืนแท็บที่เปิดอยู่ของคุณเมื่อคุณเข้าสู่ระบบหรือรีเฟรชหน้าเว็บ แม้กระทั่งจากอุปกรณ์อื่น", "confirmTabClose": "ยืนยันการปิดแท็บ", "confirmTabCloseDesc": "ถามก่อนปิดแท็บเทอร์มินัล", - "settingsSidebar": "แถบด้านข้าง", - "showHostTags": "แสดงแท็กโฮสต์", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "แสดงแท็กในรายการโฮสต์", "hostTrayOnClick": "คลิกเพื่อขยายการดำเนินการของโฮสต์", "hostTrayOnClickDesc": "แสดงปุ่มเชื่อมต่อเสมอ คลิกเพื่อขยายตัวเลือกการจัดการแทนการวางเมาส์เหนือปุ่ม", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "พินแอปเรล", "pinAppRailDesc": "ควรตั้งค่าให้แถบด้านข้างซ้ายของแอปแสดงอยู่ตลอดเวลาโดยไม่ต้องขยายเมื่อวางเมาส์เหนือแถบ", - "settingsSnippets": "เศษเสี้ยว", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "โฟลเดอร์ถูกยุบ", "foldersCollapsedDesc": "ยุบโฟลเดอร์โดยค่าเริ่มต้น", "confirmExecution": "ยืนยันการดำเนินการ", "confirmExecutionDesc": "ยืนยันก่อนเรียกใช้โค้ดตัวอย่าง", - "settingsUpdates": "การอัปเดต", + "settingsUpdates": "Updates", "disableUpdateChecks": "ปิดใช้งานการตรวจสอบการอัปเดต", "disableUpdateChecksDesc": "หยุดตรวจสอบการอัปเดต", "totpAuthenticator": "ตัวตรวจสอบสิทธิ์ TOTP", @@ -2109,68 +2612,68 @@ "qrCode": "รหัส QR", "totpInstructions": "สแกนคิวอาร์โค้ดหรือป้อนรหัสลับในแอปยืนยันตัวตนของคุณ จากนั้นป้อนรหัส 6 หลัก", "totpCodePlaceholder": "000000", - "verify": "ตรวจสอบ", - "changePassword": "เปลี่ยนรหัสผ่าน", - "currentPasswordLabel": "รหัสผ่านปัจจุบัน", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "รหัสผ่านปัจจุบัน", - "newPasswordLabel": "รหัสผ่านใหม่", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "รหัสผ่านใหม่", "confirmPasswordLabel": "ยืนยันรหัสผ่านใหม่", "confirmPasswordPlaceholder": "ยืนยันรหัสผ่านใหม่", "updatePassword": "อัปเดตรหัสผ่าน", "createApiKeyTitle": "สร้างคีย์ API", "createApiKeyDescription": "สร้างคีย์ API ใหม่สำหรับการเข้าถึงแบบโปรแกรม", - "apiKeyNameLabel": "ชื่อ", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "เช่น CI Pipeline", "expiryDateLabel": "วันหมดอายุ", "optional": "ไม่จำเป็น", - "cancel": "ยกเลิก", + "cancel": "Cancel", "createKey": "สร้างคีย์", - "apiKeyCount": "{{count}} คีย์", + "apiKeyCount": "{{count}} keys", "newKey": "กุญแจใหม่", "noApiKeys": "ยังไม่มีคีย์ API ในขณะนี้", - "apiKeyActive": "คล่องแคล่ว", + "apiKeyActive": "Active", "apiKeyUsageHint": "ใส่กุญแจของคุณลงไปด้วย", "apiKeyUsageHintHeader": "ส่วนหัว", "apiKeyPermissionsHint": "คีย์จะได้รับสิทธิ์การใช้งานจากผู้ใช้ที่สร้างคีย์นั้นขึ้นมา", - "roleUser": "ผู้ใช้", - "authMethodDual": "การตรวจสอบสิทธิ์แบบคู่", - "authMethodOidc": "โอไอดีซี", - "totpSetupFailed": "ไม่สามารถเริ่มการตั้งค่า TOTP ได้", + "roleUser": "User", + "authMethodDual": "Dual Auth", + "authMethodOidc": "OIDC", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "ป้อนรหัส 6 หลัก", "totpEnabledSuccess": "เปิดใช้งานการตรวจสอบสิทธิ์แบบสองขั้นตอน", "totpInvalidCode": "รหัสไม่ถูกต้อง โปรดลองอีกครั้ง", "totpDisableInputRequired": "ป้อนรหัส TOTP หรือรหัสผ่านของคุณ", - "totpDisabledSuccess": "ปิดใช้งานการตรวจสอบสิทธิ์แบบสองขั้นตอน", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "ไม่สามารถปิดใช้งาน 2FA ได้", - "totpDisableTitle": "ปิดใช้งาน 2FA", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "ป้อนรหัส TOTP หรือรหัสผ่าน", - "totpDisableConfirm": "ปิดใช้งาน 2FA", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "ดำเนินการตรวจสอบต่อไป", - "totpVerifyTitle": "ยืนยันรหัส", - "totpBackupTitle": "รหัสสำรอง", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "ดาวน์โหลดรหัสสำรอง", "done": "เสร็จแล้ว", "secretCopied": "คัดลอกข้อมูลลับไปยังคลิปบอร์ดแล้ว", "apiKeyNameRequired": "จำเป็นต้องระบุชื่อคีย์", - "apiKeyCreated": "สร้างคีย์ API \"{{name}}\" แล้ว", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "ไม่สามารถสร้างคีย์ API ได้", - "apiKeyUser": "ผู้ใช้", - "apiKeyExpires": "หมดอายุ", - "apiKeyRevoked": "คีย์ API \"{{name}}\" ถูกยกเลิกแล้ว", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "ไม่สามารถยกเลิกคีย์ API ได้", "passwordFieldsRequired": "จำเป็นต้องระบุรหัสผ่านปัจจุบันและรหัสผ่านใหม่", - "passwordMismatch": "รหัสผ่านไม่ตรงกัน", - "passwordTooShort": "รหัสผ่านต้องมีความยาวอย่างน้อย 6 ตัวอักษร", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "รหัสผ่านได้รับการอัปเดตเรียบร้อยแล้ว", "passwordUpdateFailed": "ไม่สามารถอัปเดตรหัสผ่านได้", "deletePasswordRequired": "ต้องใช้รหัสผ่านในการลบบัญชีของคุณ", - "deleteFailed": "ไม่สามารถลบบัญชีได้", - "deleting": "กำลังลบ...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "เปิดตัวเลือกสี", - "themeSystem": "ระบบ", - "themeLight": "แสงสว่าง", - "themeDark": "มืด", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "แดรกคิวลา", "themeCatppuccin": "แคทปุชชิน", "themeNord": "นอร์ด", @@ -2180,5 +2683,105 @@ "themeGruvbox": "กรูฟบ็อกซ์" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "เมื่อสักครู่นี้เอง", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "แท็บ", + "backTab": "⇥", + "arrowUp": "ลูกศรขึ้น", + "arrowDown": "ลูกศรลง", + "arrowLeft": "ลูกศรซ้าย", + "arrowRight": "ลูกศรขวา", + "home": "Home", + "end": "จบ", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "เสร็จแล้ว" } } diff --git a/src/ui/locales/translated/tr_TR.json b/src/ui/locales/translated/tr_TR.json index 5b583001..8a2eb180 100644 --- a/src/ui/locales/translated/tr_TR.json +++ b/src/ui/locales/translated/tr_TR.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Klasörler", - "folder": "Dosya", - "password": "Şifre", - "key": "Anahtar", - "sshPrivateKey": "SSH Özel Anahtarı", - "upload": "Yüklemek", - "keyPassword": "Anahtar Parolası", - "sshKey": "SSH Anahtarı", - "uploadPrivateKeyFile": "Özel Anahtar Dosyasını Yükle", - "searchCredentials": "Arama kimlik bilgileri...", - "addCredential": "Kimlik Bilgisi Ekle", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "CA Sertifikası (-cert.pub)", "caCertificateDescription": "İsteğe bağlı: CA tarafından imzalanmış sertifika dosyasını yükleyin veya yapıştırın (örneğin id_ed25519-cert.pub). SSH sunucunuz sertifika tabanlı yetkilendirme kullanıyorsa gereklidir.", "uploadCertFile": "Yükle -cert.pub Dosyası", - "clearCert": "Temizlemek", + "clearCert": "Clear", "certLoaded": "Sertifika yüklendi", "certPublicKeyLabel": "CA Sertifikası", "certTypeLabel": "Sertifika türü", "pasteOrUploadCert": "-cert.pub sertifikasını yapıştırın veya yükleyin...", "hasCaCert": "Kaliforniya Sertifikasına sahip.", - "noCaCert": "CA Sertifikası Yok" + "noCaCert": "CA Sertifikası Yok", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Varsayılan Sipariş", + "sortNameAsc": "İsim (A → Z)", + "sortNameDesc": "İsim (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Filtreleri Temizle", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Uyarılar yüklenemedi.", - "failedToDismissAlert": "Uyarıyı kapatma başarısız oldu." + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Sunucu Yapılandırması", - "description": "Termix sunucu URL'sini arka uç servislerinize bağlanacak şekilde yapılandırın.", - "serverUrl": "Sunucu URL'si", - "enterServerUrl": "Lütfen bir sunucu URL'si girin.", - "saveFailed": "Yapılandırma kaydedilemedi.", - "saveError": "Yapılandırma kaydedilirken hata oluştu.", - "saving": "Tasarruf...", - "saveConfig": "Yapılandırmayı Kaydet", - "helpText": "Termix sunucunuzun çalıştığı URL adresini girin (örneğin, http://localhost:30001 veya https://your-server.com).", - "changeServer": "Sunucuyu Değiştir", - "mustIncludeProtocol": "Sunucu URL'si http:// veya https:// ile başlamalıdır.", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Geçersiz sertifikaya izin ver", "allowInvalidCertificateDesc": "Yalnızca kendinden imzalı veya IP adresi sertifikalarına sahip, güvenilir, kendi sunucunuzda barındırdığınız sunucular için kullanın.", - "useEmbedded": "Yerel Sunucuyu Kullanın", - "embeddedDesc": "Termix'i yerleşik yerel sunucu ile çalıştırın (uzaktan sunucuya gerek yok).", - "embeddedConnecting": "Yerel sunucuya bağlanılıyor...", - "embeddedNotReady": "Yerel sunucu henüz hazır değil. Lütfen bir süre bekleyin ve tekrar deneyin.", - "localServer": "Yerel Sunucu" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Yerel Sunucu", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Sürüm Kontrol Hatası", - "checkFailed": "Güncellemeleri kontrol etme başarısız oldu.", - "upToDate": "Uygulama güncel.", - "currentVersion": "Şu anda {{version}} sürümünü çalıştırıyorsunuz.", - "updateAvailable": "Güncelleme Mevcut", - "newVersionAvailable": "Yeni bir sürüm mevcut! Şu anda {{current}}sürümünü çalıştırıyorsunuz, ancak {{latest}} sürümü mevcut.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Beta Sürümü", - "betaVersionDesc": "Şu anda çalıştırdığınız sürüm {{current}}, en son kararlı sürüm olan {{latest}}'den daha yenidir.", - "releasedOn": "{{date}} tarihinde yayınlandı", - "downloadUpdate": "Güncellemeyi İndir", - "checking": "Güncellemeler kontrol ediliyor...", - "checkUpdates": "Güncellemeleri kontrol edin", - "checkingUpdates": "Güncellemeler kontrol ediliyor...", - "updateRequired": "Güncelleme Gerekli" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Kapalı", - "minimize": "En aza indirge", - "online": "Çevrimiçi", - "offline": "Çevrimdışı", - "continue": "Devam etmek", - "maintenance": "Bakım", - "degraded": "Bozulmuş", - "error": "Hata", - "warning": "Uyarı", - "unsavedChanges": "Kaydedilmemiş değişiklikler", - "dismiss": "Azletmek", - "loading": "Yükleniyor...", - "optional": "İsteğe bağlı", - "connect": "Bağlamak", - "copied": "Kopyalandı", - "connecting": "Bağlanıyor...", - "updateAvailable": "Güncelleme Mevcut", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Yeni sekmede aç", - "noReleases": "Yayın Yok", - "updatesAndReleases": "Güncellemeler ve Yayınlar", - "newVersionAvailable": "Yeni bir sürüm ({{version}}) mevcuttur.", - "failedToFetchUpdateInfo": "Güncelleme bilgilerini alma işlemi başarısız oldu.", - "preRelease": "Ön yayın", - "noReleasesFound": "Yayınlanmış hiçbir dosya bulunamadı.", - "cancel": "İptal etmek", - "username": "Kullanıcı adı", - "login": "Giriş yapmak", - "register": "Kayıt olmak", - "password": "Şifre", - "confirmPassword": "Şifreyi Onayla", - "back": "Geri", - "save": "Kaydetmek", - "saving": "Tasarruf...", - "delete": "Silmek", - "rename": "Yeniden isimlendirmek", - "edit": "Düzenlemek", - "add": "Eklemek", - "confirm": "Onaylamak", - "no": "HAYIR", - "or": "VEYA", - "next": "Sonraki", - "previous": "Öncesi", - "refresh": "Yenile", - "language": "Dil", - "checking": "Kontrol ediliyor...", - "checkingDatabase": "Veritabanı bağlantısı kontrol ediliyor...", - "checkingAuthentication": "Kimlik doğrulama kontrol ediliyor...", - "backendReconnected": "Sunucu bağlantısı yeniden kuruldu", - "connectionDegraded": "Sunucu bağlantısı kesildi, kurtarılıyor…", - "reload": "Yeniden yükle", - "remove": "Kaldırmak", - "create": "Yaratmak", - "update": "Güncelleme", - "copy": "Kopyala", - "copyFailed": "Panoya kopyalama başarısız oldu.", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maksimize et", "restore": "Eski haline getirmek", - "of": "ile ilgili" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Ev", - "terminal": "terminal", - "docker": "Liman işçisi", - "tunnels": "Tüneller", - "fileManager": "Dosya Yöneticisi", - "serverStats": "Sunucu İstatistikleri", - "admin": "Yönetici", - "userProfile": "Kullanıcı Profili", - "splitScreen": "Bölünmüş Ekran", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Bu aktif oturumu kapatmak ister misiniz?", - "close": "Kapalı", - "cancel": "İptal etmek", - "sshManager": "SSH Yöneticisi", - "cannotSplitTab": "Bu sekmeyi bölemezsiniz.", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Şifreyi Kopyala", - "copySudoPassword": "Sudo Parolasını Kopyala", - "passwordCopied": "Parola panoya kopyalandı", - "noPasswordAvailable": "Şifre mevcut değil.", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "Parola kopyalama başarısız oldu.", "refreshTab": "Bağlantıyı yenile", - "openFileManager": "Dosya Yöneticisini Açın", - "dashboard": "Kontrol Paneli", - "networkGraph": "Ağ Grafiği", - "quickConnect": "Hızlı Bağlantı", - "sshTools": "SSH Araçları", - "history": "Tarih", - "hosts": "Ev sahipleri", - "snippets": "Kısa bölümler", - "hostManager": "Sunucu Yöneticisi", - "credentials": "Kimlik Bilgileri", - "connections": "Bağlantılar", - "roleAdministrator": "Yönetici", - "roleUser": "Kullanıcı" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Ev sahipleri", - "noHosts": "SSH Sunucusu Yok", - "retry": "Tekrar dene", - "refresh": "Yenile", - "optional": "İsteğe bağlı", - "downloadSample": "Örnek İndir", - "failedToDeleteHost": "{{name}} silinemedi", - "importSkipExisting": "İçe aktar (mevcut olanı atla)", - "connectionDetails": "Bağlantı Ayrıntıları", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Uzaktan Masaüstü", - "port": "Liman", - "username": "Kullanıcı adı", - "folder": "Dosya", - "tags": "Etiketler", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", "pin": "Pin", - "addHost": "Sunucu Ekle", - "editHost": "Sunucuyu Düzenle", - "cloneHost": "Klon Ana Bilgisayar", - "enableTerminal": "Terminali Etkinleştir", - "enableTunnel": "Tüneli Etkinleştir", - "enableFileManager": "Dosya Yöneticisini Etkinleştir", - "enableDocker": "Docker'ı etkinleştirin", - "defaultPath": "Varsayılan Yol", - "connection": "Bağlantı", - "upload": "Yüklemek", - "authentication": "Kimlik doğrulama", - "password": "Şifre", - "key": "Anahtar", - "credential": "Kimlik belgesi", - "none": "Hiçbiri", - "sshPrivateKey": "SSH Özel Anahtarı", - "keyType": "Anahtar Türü", - "uploadFile": "Dosya Yükle", - "tabGeneral": "Genel", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Tüneller", - "tabDocker": "Liman işçisi", + "tabTunnels": "Tunnels", + "tabDocker": "Docker", "tabFiles": "Dosyalar", - "tabStats": "İstatistikler", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Paylaşım", - "tabAuthentication": "Kimlik doğrulama", - "terminal": "terminal", - "tunnel": "Tünel", - "fileManager": "Dosya Yöneticisi", - "serverStats": "Sunucu İstatistikleri", - "status": "Durum", - "folderRenamed": "\"{{oldName}}\" klasörü \"{{newName}}\" olarak başarıyla yeniden adlandırıldı.", - "failedToRenameFolder": "Klasörü yeniden adlandırma başarısız oldu.", - "movedToFolder": "\"{{folder}} \" adresine taşındı", - "editHostTooltip": "Sunucuyu düzenle", - "statusChecks": "Durum Kontrolleri", - "metricsCollection": "Metriklerin Toplanması", - "metricsInterval": "Ölçüm Toplama Aralığı", - "metricsIntervalDesc": "Sunucu istatistikleri ne sıklıkla toplanmalı (5 saniye - 1 saat)?", - "behavior": "Davranış", - "themePreview": "Tema Önizlemesi", - "theme": "Tema", - "fontFamily": "Yazı Tipi Ailesi", - "fontSize": "Yazı Tipi Boyutu", - "letterSpacing": "Harf Aralığı", - "lineHeight": "Çizgi Yüksekliği", - "cursorStyle": "İmleç Stili", - "cursorBlink": "İmleç Yanıp Sönmesi", - "scrollbackBuffer": "Geri Kaydırma Tamponu", - "bellStyle": "Çan Stili", - "rightClickSelectsWord": "Sağ Tıklama Word Seçer", - "fastScrollModifier": "Hızlı Kaydırma Değiştirici", - "fastScrollSensitivity": "Hızlı Kaydırma Hassasiyeti", - "sshAgentForwarding": "SSH Aracısı Yönlendirmesi", - "backspaceMode": "Geri Silme Modu", - "startupSnippet": "Başlangıç Kodu Parçası", - "selectSnippet": "Kod parçasını seçin", - "forceKeyboardInteractive": "Klavyeyle Etkileşimi Zorla", - "overrideCredentialUsername": "Kimlik Bilgisi Kullanıcı Adını Geçersiz Kıl", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Kimlik bilgilerinin kullanıcı adı yerine yukarıda belirtilen kullanıcı adını kullanın.", - "jumpHostChain": "Ana Bilgisayar Zincirini Atla", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Liman Vuruşu", "addKnock": "Bağlantı Noktası Ekle", "addProxyNode": "Düğüm Ekle", - "proxyNode": "Proxy Düğümü", - "proxyType": "Vekil Türü", - "quickActions": "Hızlı İşlemler", - "sudoPasswordAutoFill": "Sudo Parolası Otomatik Doldurma", - "sudoPassword": "Sudo Parolası", - "keepaliveInterval": "Bağlantıyı Sürdürme Aralığı (ms)", - "moshCommand": "MOSH Komutu", - "environmentVariables": "Çevresel Değişkenler", - "addVariable": "Değişken Ekle", - "docker": "Liman işçisi", - "copyTerminalUrl": "Terminal URL'sini Kopyala", - "copyFileManagerUrl": "Dosya Yöneticisi URL'sini Kopyala", - "copyRemoteDesktopUrl": "Uzak Masaüstü URL'sini Kopyala", - "failedToConnect": "Konsola bağlanılamadı.", - "connect": "Bağlamak", - "disconnect": "Bağlantıyı kes", - "start": "Başlangıç", - "enableStatusCheck": "Durum Kontrolünü Etkinleştir", - "enableMetrics": "Ölçümleri Etkinleştir", - "bulkUpdateFailed": "Toplu güncelleme başarısız oldu", - "selectAll": "Tümünü Seç", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Tümünü Seçimi Kaldır", "protocols": "Protokoller", "secureShell": "Güvenli Kabuk", @@ -272,6 +303,9 @@ "unencryptedShell": "Şifrelenmemiş kabuk", "addressIp": "Adres / IP", "friendlyName": "Dostça İsim", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Klasör ve Gelişmiş", "privateNotes": "Özel Notlar", "privateNotesPlaceholder": "Bu sunucuyla ilgili detaylar...", @@ -281,18 +315,18 @@ "addKnockBtn": "Vurma Ekle", "noPortKnocking": "Herhangi bir port vuruşu yapılandırılmadı.", "knockPort": "Knock Limanı", - "protocol": "Protokol", + "protocol": "Protocol", "delayAfterMs": "Gecikme Sonrası (ms)", "useSocks5Proxy": "SOCKS5 Proxy kullanın", "useSocks5ProxyDesc": "Bağlantıyı bir proxy sunucusu üzerinden yönlendirin.", - "proxyHost": "Proxy Sunucusu", + "proxyHost": "Proxy Host", "proxyPort": "Proxy Port", - "proxyUsername": "Proxy Kullanıcı Adı", - "proxyPassword": "Proxy Parolası", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Tek Vekil", - "proxyChainMode": "Proxy Zinciri", + "proxyChainMode": "Proxy Chain", "you": "Sen", - "jumpHostChainLabel": "Ana Bilgisayar Zincirini Atla", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Atlama Ekle", "noJumpHosts": "Hiçbir atlama sunucusu yapılandırılmamış.", "selectAServer": "Bir sunucu seçin...", @@ -300,10 +334,10 @@ "authMethod": "Kimlik Doğrulama Yöntemi", "storedCredential": "Kaydedilmiş Kimlik Bilgileri", "selectACredential": "Bir yeterlilik belgesi seçin...", - "keyTypeLabel": "Anahtar Türü", - "keyTypeAuto": "Otomatik Algılama", - "keyPasteTab": "Yapıştır", - "keyUploadTab": "Yüklemek", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Anahtar dosyası yüklendi", "keyUploadClick": ".pem / .key / .ppk dosyalarını yüklemek için tıklayın.", "clearKey": "Anahtarı temizle", @@ -311,59 +345,105 @@ "keyReplaceNotice": "Eski anahtarı değiştirmek için aşağıya yeni bir anahtar yapıştırın.", "keyPassphraseSaved": "Parola kaydedildi, değiştirmek için girin.", "replaceKey": "Anahtarı değiştirin", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Klavye Etkileşimini Zorla", "forceKeyboardInteractiveShortDesc": "Tuşlar mevcut olsa bile manuel parola girişini zorunlu kıl", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Terminal Görünüm", "colorTheme": "Renk Teması", - "fontFamilyLabel": "Yazı Tipi Ailesi", - "fontSizeLabel": "Yazı Tipi Boyutu", - "cursorStyleLabel": "İmleç Stili", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Harf Aralığı (px)", - "lineHeightLabel": "Çizgi Yüksekliği", - "bellStyleLabel": "Çan Stili", - "backspaceModeLabel": "Geri Silme Modu", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "İmleç Yanıp Sönüyor", "cursorBlinkingDesc": "Terminal imleci için yanıp sönme animasyonunu etkinleştirin.", "rightClickSelectsWordLabel": "Sağ tıklama Word'ü seçer", "rightClickSelectsWordShortDesc": "İmlecin altındaki kelimeyi sağ tıklayarak seçin.", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Sözdizimi Vurgulama", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Zaman damgaları", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Davranış ve İleri Düzey", - "scrollbackBufferLabel": "Geri Kaydırma Tamponu", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Tarihte saklanacak maksimum satır sayısı", - "sshAgentForwardingLabel": "SSH Aracısı Yönlendirmesi", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Yerel SSH anahtarlarınızı bu sunucuya iletin.", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Otomatik Mosh'u Etkinleştir", "enableAutoMoshDesc": "Mümkünse SSH yerine Mosh'u tercih edin.", "enableAutoTmux": "Otomatik Tmux'ı etkinleştirin", "enableAutoTmuxDesc": "Tmux oturumunu otomatik olarak başlat veya ona bağlan", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Sudo Parolası Otomatik Doldurma", "sudoPasswordAutoFillShortDesc": "İstendiğinde otomatik olarak sudo parolasını girin.", - "sudoPasswordLabel": "Sudo Parolası", - "environmentVariablesLabel": "Çevresel Değişkenler", - "addVariableBtn": "Değişken Ekle", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Hiçbir ortam değişkeni yapılandırılmamış.", - "fastScrollModifierLabel": "Hızlı Kaydırma Değiştirici", - "fastScrollSensitivityLabel": "Hızlı Kaydırma Hassasiyeti", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Mosh Komutanlığı", - "startupSnippetLabel": "Başlangıç Kodu Parçası", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Keepalive Aralığı (saniye)", "maxKeepaliveMisses": "Max Keepalive'ı kaçırdı", "tunnelSettings": "Tünel Ayarları", "enableTunneling": "Tünelleme özelliğini etkinleştirin", "enableTunnelingDesc": "Bu sunucu için SSH tüneli işlevini etkinleştirin.", "serverTunnelsSection": "Sunucu Tünelleri", - "addTunnelBtn": "Tünel Ekle", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Hiçbir tünel yapılandırılmamış.", - "tunnelLabel": "Tünel {{number}}", - "tunnelType": "Tünel Tipi", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Yerel bir portu, uzak sunucudaki (veya ondan erişilebilen bir ana bilgisayardaki) bir porta yönlendirin.", "tunnelModeRemoteDesc": "Uzak sunucudaki bir portu, kendi bilgisayarınızdaki yerel bir porta yönlendirin.", "tunnelModeDynamicDesc": "Dinamik port yönlendirmesi için yerel bir portta SOCKS5 proxy'si oluşturun.", "sameHost": "Bu sunucu (doğrudan tünel)", "endpointHost": "Uç Nokta Sunucusu", - "endpointPort": "Uç Nokta Bağlantı Noktası", + "endpointPort": "Endpoint Port", "bindHost": "Ana Bilgisayarı Bağla", - "sourcePort": "Kaynak Bağlantı Noktası", - "maxRetries": "Maksimum Yeniden Deneme Sayısı", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Tekrar Deneme Aralığı (s)", "autoStartLabel": "Otomatik başlatma", "autoStartDesc": "Sunucu yüklendiğinde bu tüneli otomatik olarak bağla.", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Bağlantı kurulamadı.", "failedToDisconnectTunnel": "Bağlantı kesilemedi", "dockerIntegration": "Docker Entegrasyonu", - "enableDockerMonitor": "Docker'ı etkinleştirin", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Bu sunucudaki konteynerleri Docker aracılığıyla izleyin ve yönetin.", - "enableFileManagerMonitor": "Dosya Yöneticisini Etkinleştir", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Bu sunucudaki dosyaları SFTP üzerinden tarayın ve yönetin.", - "defaultPathLabel": "Varsayılan Yol", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "Bu sunucu için dosya yöneticisi başlatıldığında açılacak dizin.", - "statusChecksLabel": "Durum Kontrolleri", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Durum Kontrollerini Etkinleştir", "enableStatusChecksDesc": "Kullanılabilirliğini doğrulamak için periyodik olarak bu sunucuya ping gönderin.", "useGlobalInterval": "Küresel Aralığı Kullanın", "useGlobalIntervalDesc": "Sunucu genelindeki durum kontrol aralığıyla geçersiz kılın.", "checkIntervalS": "Kontrol Aralığı(ları)", "checkIntervalDesc": "Her bağlantı pingi arasındaki saniye sayısı", - "metricsCollectionLabel": "Metriklerin Toplanması", - "enableMetricsLabel": "Ölçümleri Etkinleştir", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Bu sunucudan CPU, RAM, disk ve ağ kullanımını toplayın.", "useGlobalMetrics": "Küresel Aralığı Kullanın", "useGlobalMetricsDesc": "Sunucu genelindeki ölçüm aralığıyla geçersiz kılın.", "metricsIntervalS": "Ölçüm Aralığı(ları)", "metricsIntervalDesc2": "Metrik anlık görüntüler arasındaki saniyeler", "visibleWidgets": "Görünür Widget'lar", - "cpuUsageLabel": "CPU Kullanımı", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "CPU yüzdesi, yük ortalamaları, mini grafik", - "memoryLabel": "Bellek Kullanımı", + "memoryLabel": "Memory Usage", "memoryDesc": "RAM kullanımı, takas alanı, önbelleğe alınmış bellek", - "storageLabel": "Disk Kullanımı", + "storageLabel": "Disk Usage", "storageDesc": "Bağlantı noktası başına disk kullanımı", - "networkLabel": "Ağ Arayüzleri", + "networkLabel": "Network Interfaces", "networkDesc": "Arayüz listesi ve bant genişliği", - "uptimeLabel": "Çalışma süresi", + "uptimeLabel": "Uptime", "uptimeDesc": "Sistem çalışma süresi ve önyükleme süresi", "systemInfoLabel": "Sistem Bilgileri", "systemInfoDesc": "İşletim sistemi, çekirdek, ana bilgisayar adı, mimari", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Başarılı ve başarısız giriş olayları", "topProcessesLabel": "En İyi Süreçler", "topProcessesDesc": "PID, CPU%, MEM%, komut", - "listeningPortsLabel": "Dinleme Portları", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "İşlem ve durum ile açık portlar", - "firewallLabel": "Güvenlik Duvarı", + "firewallLabel": "Firewall", "firewallDesc": "Güvenlik duvarı, AppArmor, SELinux durumu", - "quickActionsLabel": "Hızlı İşlemler", - "quickActionsToolbar": "Hızlı işlemler, tek tıklamayla komut yürütme için Sunucu İstatistikleri araç çubuğunda düğmeler olarak görünür.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Henüz hızlı bir işlem yapılmadı.", "buttonLabel": "Düğme etiketi", "selectSnippetPlaceholder": "Kod parçasını seçin...", "addActionBtn": "Eylem Ekle", "hostSharedSuccessfully": "Sunucu başarıyla paylaşıldı.", - "failedToShareHost": "Sunucuyu paylaşma başarısız oldu.", + "failedToShareHost": "Failed to share host", "accessRevoked": "Erişim iptal edildi", - "failedToRevokeAccess": "Erişimi iptal etme başarısız oldu.", - "cancelBtn": "İptal etmek", - "savingBtn": "Tasarruf...", - "addHostBtn": "Sunucu Ekle", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Sunucu güncellendi", "hostCreated": "Sunucu oluşturuldu", "failedToSave": "Sunucuyu kaydetme başarısız oldu.", "credentialUpdated": "Kimlik bilgileri güncellendi", "credentialCreated": "Kimlik bilgisi oluşturuldu", - "failedToSaveCredential": "Kimlik bilgilerini kaydetme başarısız oldu.", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Ev sahiplerine geri dön", "backToCredentials": "Kimlik bilgilerine geri dön", - "pinned": "Sabitlendi", - "noHostsFound": "Hiçbir sunucu bulunamadı.", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Farklı bir terim deneyin.", "addFirstHost": "Başlamak için ilk sunucunuzu ekleyin.", "noCredentialsFound": "Kimlik bilgisi bulunamadı.", - "addCredentialBtn": "Kimlik Bilgisi Ekle", - "updateCredentialBtn": "Kimlik Bilgilerini Güncelle", - "features": "Özellikler", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Klasör yok)", - "deleteSelected": "Silmek", + "deleteSelected": "Delete", "exitSelection": "Çıkış seçimi", - "importSkip": "İçe aktar (mevcut olanı atla)", + "importSkip": "Import (skip existing)", "importOverwrite": "İçe aktar (üzerine yaz)", "collapseBtn": "Yıkılmak", "importExportBtn": "İthalat / İhracat", "hostStatusesRefreshed": "Sunucu durumları güncellendi", "failedToRefreshHosts": "Sunucuları yenileme başarısız oldu.", - "movedHostTo": "{{host}} \"{{folder}} \" konumuna taşındı", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Sunucuyu taşıma başarısız oldu.", - "folderRenamedTo": "Klasörün adı \"{{name}} \" olarak değiştirildi.", - "deletedFolder": "Silinen klasör \"{{name}}\"", - "failedToDeleteFolder": "Klasör silme işlemi başarısız oldu.", - "deleteAllInFolder": "\"{{name}}\" içindeki tüm sunucuları silmek mi istiyorsunuz? Bu işlem geri alınamaz.", - "deletedHost": "Silindi {{name}}", - "copiedToClipboard": "Panoya kopyalandı", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Klasörü düzenle", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Klasörü düzenle", + "deleteFolder": "Klasörü sil", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Sunucuları taşıma başarısız oldu.", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "Terminal URL'si kopyalandı", "fileManagerUrlCopied": "Dosya Yöneticisi URL'si kopyalandı", "tunnelUrlCopied": "Tünel URL'si kopyalandı", "dockerUrlCopied": "Docker URL'si kopyalandı", - "serverStatsUrlCopied": "Sunucu İstatistikleri URL'si kopyalandı", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "RDP URL'si kopyalandı", "vncUrlCopied": "VNC URL'si kopyalandı", "telnetUrlCopied": "Telnet URL'si kopyalandı", @@ -471,109 +633,112 @@ "expandActions": "Eylemleri genişlet", "collapseActions": "İşlemleri daralt", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "{{name}} adresine sihirli paket gönderildi.", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Sihirli paket gönderilemedi.", - "cloneHostAction": "Klon Ana Bilgisayar", + "cloneHostAction": "Clone Host", "copyAddress": "Adresi Kopyala", "copyLink": "Bağlantıyı Kopyala", - "copyTerminalUrlAction": "Terminal URL'sini Kopyala", - "copyFileManagerUrlAction": "Dosya Yöneticisi URL'sini Kopyala", - "copyTunnelUrlAction": "Tünel URL'sini Kopyala", - "copyDockerUrlAction": "Docker URL'sini kopyala", - "copyServerStatsUrlAction": "Sunucu İstatistikleri URL'sini Kopyala", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "RDP URL'sini kopyala", "copyVncUrlAction": "VNC URL'sini kopyala", "copyTelnetUrlAction": "Telnet URL'sini kopyala", - "copyRemoteDesktopUrlAction": "Uzak Masaüstü URL'sini Kopyala", - "deleteCredentialConfirm": "Kimlik bilgilerini sil \"{{name}}\"?", - "deletedCredential": "Silindi {{name}}", - "deploySSHKeyTitle": "SSH Anahtarını Dağıt", - "deployingBtn": "Dağıtıma başlanıyor...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Dağıt", "failedToDeployKey": "Anahtar dağıtımı başarısız oldu.", - "deleteHostsConfirm": "{{count}} ana bilgisayarını{{plural}}silmek mi? Bu işlem geri alınamaz.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Kök dizine taşındı", - "failedToMoveHosts": "Sunucuları taşıma başarısız oldu.", - "enableTerminalFeature": "Terminali Etkinleştir", - "disableTerminalFeature": "Terminali Devre Dışı Bırak", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Dosyaları Etkinleştir", "disableFilesFeature": "Dosyaları Devre Dışı Bırak", "enableTunnelsFeature": "Tünelleri Etkinleştir", "disableTunnelsFeature": "Tünelleri Devre Dışı Bırak", - "enableDockerFeature": "Docker'ı etkinleştirin", - "disableDockerFeature": "Docker'ı devre dışı bırak", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Etiket ekle...", "authDetails": "Kimlik Doğrulama Ayrıntıları", - "credType": "Tip", + "credType": "Type", "generateKeyPairDesc": "Yeni bir anahtar çifti oluşturun; hem özel hem de genel anahtarlar otomatik olarak doldurulacaktır.", "generatingKey": "Oluşturuluyor...", - "generateLabel": "{{label}} oluştur", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Dosya yükle", "keyPassphraseOptional": "Ana Parola (İsteğe bağlı)", "sshPublicKeyOptional": "SSH Genel Anahtarı (İsteğe bağlı)", "publicKeyGenerated": "Oluşturulan açık anahtar", "failedToGeneratePublicKey": "Açık anahtar türetilemedi.", "publicKeyCopied": "Genel anahtar kopyalandı", - "keyPairGenerated": "{{label}} anahtar çifti oluşturuldu", - "failedToGenerateKeyPair": "Anahtar çifti oluşturulamadı.", - "searchHostsPlaceholder": "Sunucuları, adresleri, etiketleri ara…", - "searchCredentialsPlaceholder": "Arama kimlik bilgileri…", - "refreshBtn": "Yenile", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Etiket ekle...", - "deleteConfirmBtn": "Silmek", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH sunucusunda /etc/ssh/sshd_config dosyasında GatewayPorts yes, AllowTcpForwarding yes ve PermitRootLogin yes ayarlarının yapılmış olması gerekir.", - "deleteHostConfirm": "\"{{name}} \" silinecek mi?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Kimlik doğrulama ve bağlantı ayarlarını yapılandırmak için yukarıdaki protokollerden en az birini etkinleştirin.", - "keyPassphrase": "Anahtar Parola", - "connectBtn": "Bağlamak", - "disconnectBtn": "Bağlantıyı kes", - "basicInformation": "Temel Bilgiler", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Kimlik Doğrulama Ayrıntıları", - "credTypeLabel": "Tip", - "hostsTab": "Ev sahipleri", - "credentialsTab": "Kimlik Bilgileri", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Birden fazla seçenek seçin", "selectHosts": "Sunucuları seçin", - "connectionLabel": "Bağlantı", - "authenticationLabel": "Kimlik doğrulama", - "generateKeyPairTitle": "Anahtar Çifti Oluştur", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Yeni bir anahtar çifti oluşturun; hem özel hem de genel anahtarlar otomatik olarak doldurulacaktır.", - "generateFromPrivateKey": "Özel Anahtardan Oluştur", - "refreshBtn2": "Yenile", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Çıkış seçimi", "exportAll": "Tümünü Dışa Aktar", - "addHostBtn2": "Sunucu Ekle", - "addCredentialBtn2": "Kimlik Bilgisi Ekle", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Sunucu durumları kontrol ediliyor...", - "pinnedSection": "Sabitlendi", + "pinnedSection": "Pinned", "hostsExported": "Sunucular başarıyla dışa aktarıldı.", "exportFailed": "Ana bilgisayarları dışa aktarma başarısız oldu.", "sampleDownloaded": "Örnek dosya indirildi.", - "failedToDeleteCredential2": "Kimlik bilgilerini silme işlemi başarısız oldu.", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Klasör yok)", - "nSelected": "{{count}} seçildi", - "featuresMenu": "Özellikler", - "moveMenu": "Taşınmak", - "cancelSelection": "İptal etmek", - "deployDialogDesc": "{{name}} öğesini bir sunucunun authorized_keys'ine dağıtın.", - "targetHostLabel": "Hedef Sunucu", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Bir sunucu seçin...", "keyDeployedSuccess": "Anahtar başarıyla yerleştirildi.", "failedToDeployKey2": "Anahtar dağıtımı başarısız oldu.", - "deletedCount": "Silinen {{count}} sunucular", - "failedToDeleteCount": "{{count}} ana bilgisayarı silme işlemi başarısız oldu.", - "duplicatedHost": "\"{{name}} \" kopyalandı", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Sunucu çoğaltılamadı.", - "updatedCount": "Güncellenen {{count}} sunucular", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Dostça İsim", - "descriptionLabel": "Tanım", + "descriptionLabel": "Description", "loadingHost": "Sunucu yükleniyor...", - "loadingHosts": "Sunucular yükleniyor...", - "loadingCredentials": "Kimlik bilgileri yükleniyor...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Henüz ev sahibi yok.", - "noHostsMatchSearch": "Arama kriterlerinize uyan ev sahibi bulunamadı.", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Sunucu bulunamadı.", - "searchHosts": "Sunucu ara...", + "searchHosts": "Search hosts...", "sortHosts": "Sunucuları Sırala", "sortDefault": "Varsayılan Sipariş", "sortNameAsc": "İsim (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "İlk olarak sabitlendi", "filterHosts": "Sunucuları Filtrele", "filterClearAll": "Filtreleri Temizle", - "filterStatusGroup": "Durum", - "filterOnline": "Çevrimiçi", - "filterOffline": "Çevrimdışı", - "filterPinned": "Sabitlendi", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "Kimlik Doğrulama Türü", - "filterAuthPassword": "Şifre", - "filterAuthKey": "SSH Anahtarı", - "filterAuthCredential": "Kimlik belgesi", - "filterAuthNone": "Hiçbiri", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "Protokol", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "Özellikler", - "filterFeatureTerminal": "terminal", - "filterFeatureFileManager": "Dosya Yöneticisi", - "filterFeatureTunnel": "Tünel", - "filterFeatureDocker": "Liman işçisi", - "filterTagsGroup": "Etiketler", - "shareHost": "Paylaşımlı Sunucu", - "shareHostTitle": "Paylaş: {{name}}", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", + "filterFeatureDocker": "Docker", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Bu sunucunun paylaşımı etkinleştirmek için bir kimlik bilgisi kullanması gerekir. Öncelikle sunucuyu düzenleyin ve bir kimlik bilgisi atayın." }, "guac": { - "connection": "Bağlantı", - "authentication": "Kimlik doğrulama", - "connectionSettings": "Bağlantı Ayarları", - "displaySettings": "Ekran Ayarları", - "audioSettings": "Ses Ayarları", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Kaydedilmiş Kimlik Bilgileri", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Kimlik Doğrulama Yöntemi", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Bir yeterlilik belgesi seçin...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "RDP Performansı", - "deviceRedirection": "Cihaz Yönlendirmesi", - "session": "Oturum", - "gateway": "Geçit", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Panoya", + "clipboard": "Clipboard", "sessionRecording": "Oturum Kaydı", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "VNC Ayarları", - "terminalSettings": "Terminal Ayarları", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "RDP Bağlantı Noktası", - "username": "Kullanıcı adı", - "password": "Şifre", - "domain": "İhtisas", - "securityMode": "Güvenlik Modu", - "colorDepth": "Renk Derinliği", - "width": "Genişlik", - "height": "Yükseklik", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Yeniden Boyutlandırma Yöntemi", - "clientName": "Müşteri Adı", - "initialProgram": "Başlangıç Programı", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Sunucu Düzeni", - "timezone": "Saat dilimi", - "gatewayHostname": "Ağ Geçidi Ana Bilgisayar Adı", - "gatewayPort": "Ağ Geçidi Bağlantı Noktası", - "gatewayUsername": "Ağ Geçidi Kullanıcı Adı", - "gatewayPassword": "Ağ Geçidi Şifresi", - "gatewayDomain": "Ağ Geçidi Alanı", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "RemoteApp Programı", "workingDirectory": "Çalışma Dizini", "arguments": "Tartışmalar", "normalizeLineEndings": "Satır Sonlarını Normalleştir", - "recordingPath": "Kayıt Yolu", - "recordingName": "Kayıt Adı", - "macAddress": "MAC Adresi", - "broadcastAddress": "Yayın Adresi", - "udpPort": "UDP Bağlantı Noktası", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Bekleme Süresi(leri)", - "driveName": "Sürücü Adı", - "drivePath": "Sürüş Yolu", - "ignoreCertificate": "Sertifikayı Yok Say", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Kendinden imzalı sertifikalara sahip sunuculara bağlantılara izin ver.", - "forceLossless": "Kuvvet Kayıpsız", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Kayıpsız görüntü kodlamayı zorla (daha yüksek kalite, daha fazla bant genişliği)", - "disableAudio": "Sesi Devre Dışı Bırak", + "disableAudio": "Disable Audio", "disableAudioDesc": "Uzaktan oturumdaki tüm sesleri kapatın.", "enableAudioInput": "Ses Girişini (Mikrofon) Etkinleştir", "enableAudioInputDesc": "Yerel mikrofonu uzaktaki oturuma ilet", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Aero cam efektlerini etkinleştirin", "menuAnimations": "Menü Animasyonları", "menuAnimationsDesc": "Menü geçiş ve kaydırma animasyonlarını etkinleştirin", - "disableBitmapCaching": "Bitmap önbelleklemesini devre dışı bırak", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Bitmap önbelleğini kapatın (bu, aksaklıkları gidermeye yardımcı olabilir).", - "disableOffscreenCaching": "Ekran Dışı Önbellekleme'yi Devre Dışı Bırak", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Ekran dışı önbelleği devre dışı bırakın.", - "disableGlyphCaching": "Glif Önbelleklemesini Devre Dışı Bırak", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Glif önbelleğini kapatın.", - "enableGfx": "GFX'i etkinleştirin", + "enableGfx": "Enable GFX", "enableGfxDesc": "RemoteFX grafik işlem hattını kullanın.", - "enablePrinting": "Yazdırmayı Etkinleştir", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Yerel yazıcıları uzak oturuma yönlendirin.", - "enableDriveRedirection": "Sürücü Yönlendirmesini Etkinleştir", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Yerel bir klasörü uzak oturumda sürücü olarak eşleştirin.", - "createDrivePath": "Sürüş Yolu Oluştur", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Klasör mevcut değilse otomatik olarak oluştur.", - "disableDownload": "İndirmeyi Devre Dışı Bırak", + "disableDownload": "Disable Download", "disableDownloadDesc": "Uzak oturumdan dosya indirilmesini engelleyin.", - "disableUpload": "Yüklemeyi Devre Dışı Bırak", + "disableUpload": "Disable Upload", "disableUploadDesc": "Uzak oturuma dosya yüklenmesini engelleyin.", - "enableTouch": "Dokunmatik özelliği etkinleştirin", + "enableTouch": "Enable Touch", "enableTouchDesc": "Dokunmatik giriş yönlendirmesini etkinleştirin", - "consoleSession": "Konsol Oturumu", + "consoleSession": "Console Session", "consoleSessionDesc": "Yeni bir oturum açmak yerine konsola (oturum 0) bağlanın.", "sendWolPacket": "WOL Paketini Gönder", "sendWolPacketDesc": "Bağlantı kurmadan önce bu sunucuyu uyandırmak için sihirli bir paket gönderin.", - "disableCopy": "Kopyalamayı Devre Dışı Bırak", + "disableCopy": "Disable Copy", "disableCopyDesc": "Uzak oturumdan metin kopyalamayı engelleyin.", - "disablePaste": "Yapıştırmayı Devre Dışı Bırak", + "disablePaste": "Disable Paste", "disablePasteDesc": "Uzak oturuma metin yapıştırmayı engelleyin.", "createPathIfMissing": "Eksikse Yol Oluştur", "createPathIfMissingDesc": "Kayıt dizinini otomatik olarak oluştur", - "excludeOutput": "Çıktıyı Hariç Tut", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Ekran çıktısını kaydetmeyin (yalnızca meta veriler).", - "excludeMouse": "Fareyi Hariç Tut", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Fare hareketlerini kaydetmeyin.", "includeKeystrokes": "Tuş vuruşlarını dahil et", "includeKeystrokesDesc": "Ekran çıktısına ek olarak ham tuş vuruşlarını da kaydedin.", @@ -718,102 +896,105 @@ "vncPassword": "VNC Şifresi", "vncUsernameOptional": "Kullanıcı adı (isteğe bağlı)", "vncLeaveBlank": "Gerekli değilse boş bırakın.", - "cursorMode": "İmleç Modu", - "swapRedBlue": "Kırmızı/Maviyi Değiştir", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Kırmızı ve mavi renk kanallarının yerini değiştirin (bazı renk sorunlarını düzeltir).", "readOnly": "salt okunur", "readOnlyDesc": "Herhangi bir giriş göndermeden uzaktaki ekranı görüntüleyin.", "telnetPort": "Telnet Port", - "terminalType": "Terminal Tipi", - "fontName": "Yazı Tipi Adı", - "fontSize": "Yazı Tipi Boyutu", - "colorScheme": "Renk Şeması", - "backspaceKey": "Geri tuşu", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Önce sunucuyu kurtarın.", "sharingOptionsAfterSave": "Sunucu kaydedildikten sonra paylaşım seçenekleri kullanılabilir hale gelir.", "sharingLoadError": "Paylaşım verileri yüklenemedi. Bağlantınızı kontrol edin ve tekrar deneyin.", - "shareHostSection": "Paylaşımlı Sunucu", - "shareWithUser": "Kullanıcıyla paylaş", - "shareWithRole": "Rol ile paylaş", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Kullanıcı Seç", - "selectRole": "Rol Seçin", + "selectRole": "Select Role", "selectUserOption": "Bir kullanıcı seçin...", "selectRoleOption": "Bir rol seçin...", - "permissionLevel": "İzin Seviyesi", + "permissionLevel": "Permission Level", "expiresInHours": "(Saat) içinde sona eriyor", "noExpiryPlaceholder": "Son kullanma tarihi olmaması için boş bırakın.", - "shareBtn": "Paylaşmak", - "currentAccess": "Mevcut Erişim", - "typeHeader": "Tip", - "targetHeader": "Hedef", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "İzin", - "grantedByHeader": "Veren", - "expiresHeader": "Süresi doluyor", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Henüz erişim kaydı yok.", - "expiredLabel": "Günü geçmiş", - "neverLabel": "Asla", - "revokeBtn": "Geri çekmek", - "cancelBtn": "İptal etmek", - "savingBtn": "Tasarruf...", - "updateHostBtn": "Sunucuyu Güncelle", - "addHostBtn": "Sunucu Ekle" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Sunucuları, komutları veya ayarları arayın...", - "quickActions": "Hızlı İşlemler", - "hostManager": "Sunucu Yöneticisi", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Sunucuları yönetin, ekleyin veya düzenleyin.", "addNewHost": "Yeni Sunucu Ekle", "addNewHostDesc": "Yeni bir ev sahibi kaydedin", - "adminSettings": "Yönetici Ayarları", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Sistem tercihlerini ve kullanıcıları yapılandırın.", - "userProfile": "Kullanıcı Profili", + "userProfile": "User Profile", "userProfileDesc": "Hesabınızı ve tercihlerinizi yönetin", - "addCredential": "Kimlik Bilgisi Ekle", + "addCredential": "Add Credential", "addCredentialDesc": "SSH anahtarlarını veya şifrelerini saklayın.", - "recentActivity": "Son Aktiviteler", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Sunucular ve Hostlar", - "noHostsFound": "\"{{search}} \" ile eşleşen hiçbir sunucu bulunamadı.", - "links": "Bağlantılar", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Gezinti", - "select": "Seçme", + "select": "Select", "toggleWith": "ile değiştir" }, "splitScreen": { - "paneEmpty": "Bölme {{index}} - boş", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Hiçbir sekme atanmadı.", "focusedPane": "Aktif bölme" }, "connections": { "noConnections": "Bağlantı yok.", "noConnectionsDesc": "Buradaki bağlantıları görmek için bir terminal, dosya yöneticisi veya uzak masaüstü açın.", - "connectedFor": "{{duration}} için bağlantı kuruldu.", - "connected": "Bağlı", - "disconnected": "Bağlantı kesildi", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Sekmeyi kapat", "closeConnection": "Yakın bağlantı", "forgetTab": "Unutmak", - "removeBackground": "Kaldırmak", - "reconnect": "Yeniden bağlan", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Yeniden açın", "sectionOpen": "Açık", "sectionBackground": "Arka plan", "backgroundDesc": "Bağlantı kesildikten sonra oturumlar 30 dakika boyunca devam eder ve yeniden bağlanabilir.", "persisted": "Arka planda devam etti", - "expiresIn": "{{duration}} içinde sona eriyor", + "expiresIn": "Expires in {{duration}}", "search": "Arama bağlantıları...", - "noSearchResults": "Arama kriterlerinize uyan bağlantı bulunamadı." + "noSearchResults": "Arama kriterlerinize uyan bağlantı bulunamadı.", + "rename": "Rename session" }, "guacamole": { - "connecting": "{{type}} oturumuna bağlanılıyor...", - "connectionError": "Bağlantı hatası", - "connectionFailed": "Bağlantı başarısız oldu.", - "failedToConnect": "Bağlantı belirteci alınamadı.", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Sunucu bulunamadı.", - "noHostSelected": "Sunucu seçilmedi.", - "reconnect": "Yeniden bağlan", - "retry": "Tekrar dene", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "Uzak masaüstü hizmeti (guacd) kullanılamıyor. Lütfen guacd'nin çalıştığından, erişilebilir olduğundan ve yönetici ayarlarında doğru şekilde yapılandırıldığından emin olun.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "Win+L (Kilit Ekranı)", "winKey": "Windows Anahtarı", "ctrl": "Ctrl", - "alt": "Alternatif", - "shift": "Vardiya", + "alt": "Alt", + "shift": "Shift", "win": "Kazanç", - "stickyActive": "{{key}} (kilitli - serbest bırakmak için tıklayın)", - "stickyInactive": "{{key}} (kilitlemek için tıklayın)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Kaçmak", "tab": "Sekme", - "home": "Ev", + "home": "Home", "end": "Son", "pageUp": "Sayfa Yukarı", "pageDown": "Sayfa Aşağı", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Sunucuya bağlan", - "clear": "Temizlemek", - "paste": "Yapıştır", - "reconnect": "Yeniden bağlan", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Bağlantı kesildi", - "connected": "Bağlı", - "clipboardWriteFailed": "Kopyalama işlemi panoya yapılamadı. Sayfanın HTTPS veya localhost üzerinden sunulduğundan emin olun.", - "clipboardReadFailed": "Panodan okuma işlemi başarısız oldu. Lütfen pano izinlerinin verildiğinden emin olun.", - "clipboardHttpWarning": "Yapıştırma işlemi HTTPS gerektirir. Ctrl+Shift+V tuşlarını kullanın veya Termix'i HTTPS üzerinden sunun.", - "unknownError": "Bilinmeyen bir hata oluştu.", - "websocketError": "WebSocket bağlantı hatası", - "connecting": "Bağlanıyor...", - "noHostSelected": "Sunucu seçilmedi.", - "reconnecting": "Yeniden bağlanılıyor... ({{attempt}}/{{max}})", - "reconnected": "Bağlantı başarıyla yeniden kuruldu.", - "tmuxSessionCreated": "tmux oturumu oluşturuldu: {{name}}", - "tmuxSessionAttached": "tmux oturumu eklendi: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "Uzak sunucuda tmux kurulu değil, standart kabuğa geri dönülüyor.", "tmuxSessionPickerTitle": "tmux Oturumları", "tmuxSessionPickerDesc": "Bu sunucuda mevcut tmux oturumları bulundu. Yeniden bağlanmak veya yeni bir oturum oluşturmak için birini seçin.", "tmuxWindows": "Windows", - "tmuxWindowCount": "{{count}} pencere", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Ekli müşteriler", - "tmuxAttachedCount": "{{count}} eklendi", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Son aktivite", "tmuxTimeJustNow": "Şu anda", - "tmuxTimeMinutes": "{{count}}m önce", - "tmuxTimeHours": "{{count}}saat önce", - "tmuxTimeDays": "{{count}}gün önce", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Yeni oturum başlat", "tmuxCopyHint": "Seçimi ayarlayın ve panoya kopyalamak için Enter tuşuna basın.", "tmuxDetach": "Tmux oturumundan ayrıl", "tmuxDetached": "Tmux oturumundan ayrıldı", - "maxReconnectAttemptsReached": "Maksimum yeniden bağlantı deneme sayısına ulaşıldı.", - "closeTab": "Kapalı", - "connectionTimeout": "Bağlantı zaman aşımı", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Çalıştırılıyor {{command}} - {{host}}", - "totpRequired": "İki Faktörlü Kimlik Doğrulama Gerekli", - "totpCodeLabel": "Doğrulama Kodu", - "totpVerify": "Doğrulamak", - "warpgateAuthRequired": "Warpgate Kimlik Doğrulaması Gerekli", - "warpgateSecurityKey": "Güvenlik Anahtarı", - "warpgateAuthUrl": "Kimlik Doğrulama URL'si", - "warpgateOpenBrowser": "Tarayıcıda aç", - "warpgateContinue": "Kimlik doğrulama işlemini tamamladım.", - "opksshAuthRequired": "OPKSSH Kimlik Doğrulaması Gerekli", - "opksshAuthDescription": "Devam etmek için tarayıcınızda kimlik doğrulama işlemini tamamlayın. Bu oturum 24 saat boyunca geçerli olacaktır.", - "opksshOpenBrowser": "Kimlik doğrulaması için tarayıcıyı açın.", - "opksshWaitingForAuth": "Tarayıcıda kimlik doğrulaması bekleniyor...", - "opksshAuthenticating": "Kimlik doğrulama işlemi gerçekleştiriliyor...", - "opksshTimeout": "Kimlik doğrulama işlemi zaman aşımına uğradı. Lütfen tekrar deneyin.", - "opksshAuthFailed": "Kimlik doğrulama başarısız oldu. Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin.", - "opksshSignInWith": "{{provider}} ile giriş yapın", - "sudoPasswordPopupTitle": "Şifrenizi girin?", - "websocketAbnormalClose": "Bağlantı beklenmedik şekilde kapatıldı. Bu durum, ters proxy veya SSL yapılandırma sorunundan kaynaklanıyor olabilir. Lütfen sunucu günlüklerini kontrol edin.", - "connectionLogTitle": "Bağlantı Günlüğü", - "connectionLogCopy": "Günlükleri panoya kopyala", - "connectionLogEmpty": "Henüz bağlantı günlükleri yok.", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Açık", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Bağlantı günlükleri bekleniyor...", - "connectionLogCopied": "Bağlantı günlükleri panoya kopyalandı", - "connectionLogCopyFailed": "Günlük kayıtlarını panoya kopyalama başarısız oldu.", - "connectionRejected": "Sunucu bağlantıyı reddetti. Lütfen kimlik doğrulama ve ağ yapılandırmanızı kontrol edin.", - "hostKeyRejected": "SSH sunucu anahtarı doğrulama işlemi reddedildi. Bağlantı iptal edildi.", - "sessionTakenOver": "Oturum başka bir sekmede açıldı. Yeniden bağlanılıyor..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Bölünmüş Sekme", + "addToSplit": "Bölünmüş bölüme ekle", + "removeFromSplit": "Bölünmüş halden çıkarın" + } }, "fileManager": { - "noHostSelected": "Sunucu seçilmedi.", + "noHostSelected": "No host selected", "initializingEditor": "Editör başlatılıyor...", - "file": "Dosya", - "folder": "Dosya", - "uploadFile": "Dosya Yükle", - "downloadFile": "İndirmek", - "extractArchive": "Arşivden Çıkarma", - "extractingArchive": "{{name}} çıkarılıyor...", - "archiveExtractedSuccessfully": "{{name}} başarıyla çıkarıldı", - "extractFailed": "Çıkarma işlemi başarısız oldu.", - "compressFile": "Dosyayı Sıkıştır", - "compressFiles": "Dosyaları Sıkıştır", - "compressFilesDesc": "{{count}} öğeyi bir arşive sıkıştırın", - "archiveName": "Arşiv Adı", - "enterArchiveName": "Arşiv adını girin...", - "compressionFormat": "Sıkıştırma Formatı", - "selectedFiles": "Seçilen dosyalar", - "andMoreFiles": "ve {{count}} daha fazlası...", - "compress": "Kompres", - "compressingFiles": "{{count}} öğeyi {{name}} öğeye sıkıştırılıyor...", - "filesCompressedSuccessfully": "{{name}} başarıyla oluşturuldu", - "compressFailed": "Sıkıştırma başarısız oldu", - "edit": "Düzenlemek", - "preview": "Önizleme", - "previous": "Öncesi", - "next": "Sonraki", - "pageXOfY": "Sayfa {{current}} / {{total}}", - "zoomOut": "Uzaklaştır", - "zoomIn": "Yakınlaştır", - "newFile": "Yeni Dosya", - "newFolder": "Yeni Klasör", - "rename": "Yeniden isimlendirmek", - "uploading": "Yükleniyor...", - "uploadingFile": "{{name}} yükleniyor...", - "fileName": "Dosya adı", - "folderName": "Klasör Adı", - "fileUploadedSuccessfully": "\"{{name}}\" dosyası başarıyla yüklendi", - "failedToUploadFile": "Dosya yükleme başarısız oldu.", - "fileDownloadedSuccessfully": "\"{{name}}\" dosyası başarıyla indirildi", - "failedToDownloadFile": "Dosya indirme başarısız oldu.", - "fileCreatedSuccessfully": "\"{{name}}\" dosyası başarıyla oluşturuldu", - "folderCreatedSuccessfully": "\"{{name}}\" klasörü başarıyla oluşturuldu", - "failedToCreateItem": "Öğe oluşturulamadı.", - "operationFailed": "{{operation}} işlemi {{name}}için başarısız oldu: {{error}}", - "failedToResolveSymlink": "Sembolik bağlantı çözümlenemedi.", - "itemsDeletedSuccessfully": "{{count}} öğe başarıyla silindi", - "failedToDeleteItems": "Öğeleri silme işlemi başarısız oldu.", - "sudoPasswordRequired": "Yönetici Parolası Gerekli", - "enterSudoPassword": "Bu işleme devam etmek için sudo parolasını girin.", - "sudoPassword": "Sudo şifresi", - "sudoOperationFailed": "Sudo işlemi başarısız oldu", - "sudoAuthFailed": "Sudo kimlik doğrulaması başarısız oldu", - "dragFilesToUpload": "Yüklemek için dosyaları buraya sürükleyin.", - "emptyFolder": "Bu klasör boş.", - "searchFiles": "Dosyaları ara...", - "upload": "Yüklemek", - "selectHostToStart": "Dosya yönetimini başlatmak için bir sunucu seçin.", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "Dosya yöneticisi SSH gerektiriyor. Bu sunucuda SSH etkinleştirilmemiş.", - "failedToConnect": "SSH bağlantısı kurulamadı.", - "failedToLoadDirectory": "Dizin yüklenemedi.", - "noSSHConnection": "SSH bağlantısı mevcut değil.", - "copy": "Kopyala", - "cut": "Kesmek", - "paste": "Yapıştır", - "copyPath": "Kopyala Yolu", - "copyPaths": "Kopyala Yolları", - "delete": "Silmek", - "properties": "Özellikler", - "refresh": "Yenile", - "downloadFiles": "{{count}} dosyayı Tarayıcıya İndir", - "copyFiles": "{{count}} öğeyi kopyala", - "cutFiles": "{{count}} öğeyi kes", - "deleteFiles": "{{count}} öğeyi sil", - "filesCopiedToClipboard": "{{count}} öğe panoya kopyalandı", - "filesCutToClipboard": "{{count}} öğe panoya kopyalandı", - "pathCopiedToClipboard": "Yol panoya kopyalandı", - "pathsCopiedToClipboard": "{{count}} yollar panoya kopyalandı", - "failedToCopyPath": "Yol kopyalanıp panoya aktarılamadı.", - "movedItems": "{{count}} öğe taşındı", - "failedToDeleteItem": "Öğeyi silme işlemi başarısız oldu.", - "itemRenamedSuccessfully": "{{type}} başarıyla yeniden adlandırıldı", - "failedToRenameItem": "Öğeyi yeniden adlandırma başarısız oldu.", - "download": "İndirmek", - "permissions": "İzinler", - "size": "Boyut", - "modified": "Değiştirildi", - "path": "Yol", - "confirmDelete": "{{name}} öğesini silmek istediğinizden emin misiniz?", - "permissionDenied": "İzin reddedildi", - "serverError": "Sunucu Hatası", - "fileSavedSuccessfully": "Dosya başarıyla kaydedildi.", - "failedToSaveFile": "Dosya kaydedilemedi.", - "confirmDeleteSingleItem": "\"{{name}} \" öğesini kalıcı olarak silmek istediğinizden emin misiniz?", - "confirmDeleteMultipleItems": "{{count}} öğeyi kalıcı olarak silmek istediğinizden emin misiniz?", - "confirmDeleteMultipleItemsWithFolders": "{{count}} öğeyi kalıcı olarak silmek istediğinizden emin misiniz? Bu, klasörleri ve içeriklerini de içerir.", - "confirmDeleteFolder": "\"{{name}}\" klasörünü ve tüm içeriğini kalıcı olarak silmek istediğinizden emin misiniz?", - "permanentDeleteWarning": "Bu işlem geri alınamaz. Öğeler sunucudan kalıcı olarak silinecektir.", - "recent": "Son", - "pinned": "Sabitlendi", - "folderShortcuts": "Klasör Kısayolları", - "failedToReconnectSSH": "SSH oturumu yeniden bağlanamadı.", - "openTerminalHere": "Terminali buradan açın.", - "run": "Koşmak", - "openTerminalInFolder": "Bu klasörde terminali açın.", - "openTerminalInFileLocation": "Dosya konumunda terminali açın.", - "runningFile": "Koşuyor - {{file}}", - "onlyRunExecutableFiles": "Yalnızca çalıştırılabilir dosyaları çalıştırabilir.", - "directories": "Dizinler", - "removedFromRecentFiles": "Son dosyalardan \"{{name}}\" kaldırıldı.", - "removeFailed": "Kaldırma işlemi başarısız oldu.", - "unpinnedSuccessfully": "\"{{name}}\" başarıyla sabitlenmiş özelliğini kaldırdı.", - "unpinFailed": "Sabitlemeyi kaldırma başarısız oldu", - "removedShortcut": "\"{{name}} \" kısayolu kaldırıldı.", - "removeShortcutFailed": "Kısayol kaldırma işlemi başarısız oldu.", - "clearedAllRecentFiles": "Son kullanılan tüm dosyalar silindi.", - "clearFailed": "Temizleme işlemi başarısız oldu.", - "removeFromRecentFiles": "Son kullanılan dosyalardan kaldır", - "clearAllRecentFiles": "Son kullanılan tüm dosyaları temizle", - "unpinFile": "Dosyanın sabitlemesini kaldır", - "removeShortcut": "Kısayolu kaldır", - "pinFile": "Pin dosyası", - "addToShortcuts": "Kısayollara ekle", - "pasteFailed": "Yapıştırma işlemi başarısız oldu.", - "noUndoableActions": "Geri alınamaz işlem yok.", - "undoCopySuccess": "Kopyalama işlemi geri alındı: Kopyalanan {{count}} dosya silindi.", - "undoCopyFailedDelete": "Geri alma başarısız oldu: Kopyalanan dosyaların hiçbiri silinemedi.", - "undoCopyFailedNoInfo": "Geri alma başarısız oldu: Kopyalanan dosya bilgileri bulunamadı.", - "undoMoveSuccess": "Taşıma işlemi geri alındı: {{count}} dosya orijinal konumuna geri taşındı.", - "undoMoveFailedMove": "Geri alma başarısız oldu: Hiçbir dosya geri taşınamadı.", - "undoMoveFailedNoInfo": "Geri alma başarısız oldu: Taşınan dosya bilgisi bulunamadı.", - "undoDeleteNotSupported": "Silme işlemi geri alınamaz: Dosyalar sunucudan kalıcı olarak silindi.", - "undoTypeNotSupported": "Desteklenmeyen geri alma işlemi türü", - "undoOperationFailed": "Geri alma işlemi başarısız oldu", - "unknownError": "Bilinmeyen hata", - "confirm": "Onaylamak", - "find": "Bulmak...", - "replace": "Yer değiştirmek", - "downloadInstead": "Bunun yerine indirin", - "keyboardShortcuts": "Klavye Kısayolları", - "searchAndReplace": "Arama ve Değiştirme", - "editing": "Düzenleme", - "search": "Aramak", - "findNext": "Sonrakini Bul", - "findPrevious": "Öncekini Bul", - "save": "Kaydetmek", - "selectAll": "Tümünü Seç", - "undo": "Geri al", - "redo": "Tekrarla", - "moveLineUp": "Hareket Sıralaması", - "moveLineDown": "Satırı Aşağı Taşı", - "toggleComment": "Yorumu Aç/Kapat", - "autoComplete": "Otomatik Tamamlama", - "imageLoadError": "Görüntü yüklenemedi.", - "startTyping": "Yazmaya başlayın...", - "unknownSize": "Boyutu bilinmiyor", - "fileIsEmpty": "Dosya boş.", - "largeFileWarning": "Büyük Dosya Uyarısı", - "largeFileWarningDesc": "Bu dosya {{size}} boyutundadır ve metin olarak açıldığında performans sorunlarına neden olabilir.", - "fileNotFoundAndRemoved": "\"{{name}}\" dosyası bulunamadı ve son/sabitlenmiş dosyalar listesinden kaldırıldı.", - "failedToLoadFile": "Dosya yüklenemedi: {{error}}", - "serverErrorOccurred": "Sunucu hatası oluştu. Lütfen daha sonra tekrar deneyin.", - "autoSaveFailed": "Otomatik kaydetme başarısız oldu.", - "fileAutoSaved": "Dosya otomatik olarak kaydedildi", - "moveFileFailed": "{{name}} taşınamadı", - "moveOperationFailed": "Taşıma işlemi başarısız oldu", - "canOnlyCompareFiles": "Yalnızca iki dosya karşılaştırılabilir.", - "comparingFiles": "Dosyalar karşılaştırılıyor: {{file1}} ve {{file2}}", - "dragFailed": "Sürükleme işlemi başarısız oldu", - "filePinnedSuccessfully": "\"{{name}}\" dosyası başarıyla sabitlendi", - "pinFileFailed": "Dosyayı sabitleme başarısız oldu.", - "fileUnpinnedSuccessfully": "\"{{name}}\" dosyasının sabitlemesi başarıyla kaldırıldı.", - "unpinFileFailed": "Dosyanın sabitlemesi kaldırılamadı.", - "shortcutAddedSuccessfully": "Klasör kısayolu \"{{name}}\" başarıyla eklendi", - "addShortcutFailed": "Kısayol ekleme başarısız oldu.", - "operationCompletedSuccessfully": "{{operation}} {{count}} öğe başarıyla", - "operationCompleted": "{{operation}} {{count}} öğeler", - "downloadFileSuccess": "{{name}} dosyası başarıyla indirildi.", - "downloadFileFailed": "İndirme başarısız oldu", - "moveTo": "{{name}} adresine geçin", - "diffCompareWith": "{{name}} ile karşılaştırın", - "dragOutsideToDownload": "İndirmek için pencerenin dışına sürükleyin ({{count}} dosya)", - "newFolderDefault": "YeniKlasör", - "newFileDefault": "YeniDosya.txt", - "successfullyMovedItems": "{{count}} öğe başarıyla {{target}} konumuna taşındı.", - "move": "Taşınmak", - "searchInFile": "Dosyada arama yap (Ctrl+F)", - "showKeyboardShortcuts": "Klavye kısayollarını göster", - "startWritingMarkdown": "Markdown içeriğinizi yazmaya başlayın...", - "loadingFileComparison": "Dosya karşılaştırması yükleniyor...", - "reload": "Yeniden yükle", - "compare": "Karşılaştırmak", - "sideBySide": "Yan yana", - "inline": "Çizgide", - "fileComparison": "Dosya Karşılaştırması: {{file1}} ile {{file2}}", - "fileTooLarge": "Dosya çok büyük: {{error}}", - "sshConnectionFailed": "SSH bağlantısı başarısız oldu. Lütfen {{name}} ({{ip}}:{{port}} ) ile olan bağlantınızı kontrol edin.", - "loadFileFailed": "Dosya yüklenemedi: {{error}}", - "connecting": "Bağlanıyor...", - "connectedSuccessfully": "Bağlantı başarıyla kuruldu.", - "totpVerificationFailed": "TOTP doğrulaması başarısız oldu", - "warpgateVerificationFailed": "Warpgate kimlik doğrulaması başarısız oldu", - "authenticationFailed": "Kimlik doğrulama başarısız oldu", - "verificationCodePrompt": "Doğrulama kodu:", - "changePermissions": "İzinleri Değiştir", - "currentPermissions": "Mevcut İzinler", - "owner": "Mal sahibi", - "group": "Grup", - "others": "Diğerleri", - "read": "Okumak", - "write": "Yazmak", - "execute": "Uygulamak", - "permissionsChangedSuccessfully": "İzinler başarıyla değiştirildi.", - "failedToChangePermissions": "İzinleri değiştirme işlemi başarısız oldu.", - "name": "İsim", - "sortByName": "İsim", - "sortByDate": "Değiştirilme Tarihi", - "sortBySize": "Boyut", - "ascending": "Yükselen", - "descending": "İnen", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Kök", "new": "Yeni", "sortBy": "Göre sırala", @@ -1140,19 +1336,19 @@ "octal": "Sekizli", "storage": "Depolamak", "disk": "Disk", - "used": "Kullanılmış", - "of": "ile ilgili", - "toggleSidebar": "Kenar Çubuğunu Aç/Kapat", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "PDF yüklenemiyor.", "pdfLoadError": "Bu PDF dosyasını yüklerken bir hata oluştu.", "loadingPdf": "PDF yükleniyor...", "loadingPage": "Sayfa yükleniyor..." }, "transfer": { - "copyToHost": "Sunucuya kopyala…", - "moveToHost": "Ana bilgisayara geç…", - "copyItemsToHost": "{{count}} öğeyi… sunucuya kopyala", - "moveItemsToHost": "{{count}} öğeyi… ana bilgisayara taşı", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Başka dosya yöneticisi sunucusu mevcut değil.", "noHostsConnectedHint": "Host Manager'da Dosya Yöneticisi etkinleştirilmiş başka bir SSH sunucusu ekleyin.", "selectDestinationHost": "Hedef sunucuyu seçin", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Son gidilen yerleri genişlet", "browseFolders": "Hedef klasörlere göz atın", "browseDestination": "Yola göz atın veya yolu girin", - "confirmCopy": "Kopyala", - "confirmMove": "Taşınmak", - "transferring": "… aktarılıyor", - "compressing": "… sıkıştırılıyor", - "extracting": "… çıkarılıyor", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Transfer tamamlandı", "transferError": "Aktarım başarısız oldu", - "transferPartial": "Transfer {{count}} hatayla tamamlandı", - "transferPartialHint": "Aktarım başarısız oldu: {{paths}}", - "itemsSummary": "{{count}} öğe", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Çoklu öğe transferleri için hedef bir dizin olmalıdır.", "selectThisFolder": "Bu klasörü seçin", "browsePathWillBeCreated": "Bu klasör henüz mevcut değil. Aktarım başladığında oluşturulacaktır.", "browsePathError": "Hedef sunucuda bu yolu açamadım.", "goUp": "Yukarı çık", - "copyFolderToHost": "Klasörü sunucuya kopyala…", - "moveFolderToHost": "Klasörü sunucuya taşı…", - "hostReady": "Hazır", - "hostConnecting": "… Bağlanıyor", - "hostDisconnected": "Bağlı değil", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Kimlik doğrulaması gerekiyor — önce bu sunucuda Dosya Yöneticisini açın.", - "hostConnectionFailed": "Bağlantı başarısız oldu.", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Aktarma zamanlamaları", - "metricsPrepare": "Hedefi hazırlayın: {{duration}}", - "metricsCompress": "Kaynak kodda sıkıştır: {{duration}}", - "metricsHopSourceRead": "Kaynak → sunucu: {{throughput}}", - "metricsHopDestSftpWrite": "Sunucu → hedef (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Sunucu → hedef (yerel): {{throughput}}", - "metricsTransfer": "Uçtan uca: {{throughput}} ({{duration}})", - "metricsExtract": "Hedefe çıkar: {{duration}}", - "metricsSourceDelete": "Kaynaktan kaldır: {{duration}}", - "metricsTotal": "Toplam: {{duration}}", - "progressCompressing": "Kaynak sunucuda sıkıştırma işlemi…", - "progressExtracting": "Hedefe çıkarılıyor…", - "progressTransferring": "Veri aktarılıyor…", - "progressReconnecting": "Yeniden Bağlanıyor…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Paralel aktarma şeritleri", - "parallelSegmentsOption": "{{count}} şeritler", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Büyük dosyalar 256 MB'lık parçalara bölünür. Çoklu şeritler, daha yüksek toplam verim için ayrı bağlantılar kullanır (birkaç aktarım başlatmak gibi).", - "progressTotalSpeed": "{{speed}} toplam ({{lanes}} şerit)", - "progressTransferringItems": "Dosyalar aktarılıyor ({{current}} / {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} dosyaları", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Kaynak dosyalar saklandı (kısmi aktarım)", "jumpHostLimitation": "Her iki sunucuya da Termix sunucusundan erişilebilmelidir. Doğrudan sunucular arası yönlendirme desteklenmemektedir.", - "cancel": "İptal etmek", + "cancel": "Cancel", "methodLabel": "Aktarım yöntemi", "methodAuto": "Otomatik", "methodTar": "Tar arşivi", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Dosya sayısına, boyutuna ve sıkıştırılabilirliğine bağlı olarak tar veya dosya bazlı SFTP'yi seçer. Tek dosyalar her zaman akışlı SFTP kullanır.", "methodTarHint": "Kaynakta sıkıştır, tek bir arşiv olarak aktar, hedefte çıkar. Her iki Unix sunucusunda da tar programı gereklidir.", "methodItemSftpHint": "Her dosyayı SFTP üzerinden ayrı ayrı aktarın. Windows dahil tüm işletim sistemlerinde çalışır.", - "methodPreviewLoading": "Aktarım yöntemini hesaplama…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Aktarım yönteminin önizlemesi yapılamadı. Sunucu, siz başlattığınızda yine de bir yöntem seçecektir.", "methodPreviewWillUseTar": "Kullanılacak dosya: Tar arşivi", "methodPreviewWillUseItemSftp": "Kullanılacak yöntem: Dosya başına SFTP", - "methodPreviewScanSummary": "{{fileCount}} dosya, {{totalSize}} toplam (kaynak sunucuda tarandı).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Her dosya, tek bir dosya kopyası gibi aynı SFTP akışını kullanır ve bu işlem art arda gerçekleşir. İlerleme tüm dosyalarda birleştirilir, bu nedenle büyük dosyalarda ilerleme çubuğu yavaş hareket eder.", "methodReason": { "user_item_sftp": "Dosya bazlı SFTP'yi seçtiniz.", "user_tar": "Tar arşivini seçtiniz.", "tar_unavailable": "Tar, sunuculardan birinde veya her ikisinde de mevcut değil; bunun yerine dosya başına SFTP kullanılacaktır.", "windows_host": "Windows işletim sistemli bir sunucu söz konusu; tar kullanılmıyor.", - "auto_multi_large": "Otomatik: Sıkıştırılabilir veriler içeren büyük bir dosya ({{largestSize}}) dahil olmak üzere birden fazla dosya — tar, dosyaları tek bir aktarımda birleştirir.", - "auto_single_large_in_archive": "Otomatik: Bu kümede bir büyük dosya ({{largestSize}}) — dosya başına SFTP.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Otomatik: çoğunlukla sıkıştırılamayan veriler — dosya başına SFTP.", - "auto_many_files": "Otomatik: birçok dosya ({{fileCount}}) — tar, dosya başına ek yükü azaltır.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Otomatik: Bu set için dosya başına SFTP." }, - "progressCancel": "İptal etmek", - "progressCancelling": "… iptal ediliyor", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Durakladı", "resumedHint": "Başka bir pencerede başlatılan aktif bir aktarıma yeniden bağlandı.", "transferCancelled": "Transfer iptal edildi.", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Bazı kısmi dosyalar silinemedi.", "cleanupDestFilesNothing": "Varış noktasında temizlenecek bir şey yok.", "cleanupDestFilesError": "Temizleme işlemi başarısız oldu", - "retryTransfer": "Tekrar dene", + "retryTransfer": "Retry", "retryTransferError": "Yeniden deneme başarısız oldu.", "transferFailedRetryHint": "Hedef cihazda kısmi veriler saklandı. Bağlantı yeniden kurulduğunda yeniden deneme işlemi devam edecektir." }, "tunnels": { - "noSshTunnels": "SSH Tüneli Yok", - "createFirstTunnelMessage": "Henüz hiçbir SSH tüneli oluşturmadınız. Başlamak için Ana Bilgisayar Yöneticisi'nde tünel bağlantılarını yapılandırın.", - "connected": "Bağlı", - "disconnected": "Bağlantı kesildi", - "connecting": "Bağlanıyor...", - "error": "Hata", - "canceling": "İptal...", - "connect": "Bağlamak", - "disconnect": "Bağlantıyı kes", - "cancel": "İptal etmek", - "port": "Liman", - "localPort": "Yerel Liman", - "remotePort": "Uzak Liman", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Geçerli Ana Bilgisayar Bağlantı Noktası", - "endpointPort": "Uç Nokta Bağlantı Noktası", + "endpointPort": "Endpoint Port", "bindIp": "Yerel IP", - "endpointSshConfig": "Uç Nokta SSH Yapılandırması", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Uç Nokta SSH Sunucusu", "endpointSshHostPlaceholder": "Yapılandırılmış bir ana bilgisayar seçin", "endpointSshHostRequired": "Her istemci tüneli için bir uç nokta SSH sunucusu seçin.", - "attempt": "{{max}}'in {{current}} denemesi", - "nextRetryIn": "Sonraki deneme {{seconds}} saniye sonra", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "İstemci Tünelleri", "clientTunnel": "İstemci Tüneli", "addClientTunnel": "İstemci Tüneli Ekle", "noClientTunnels": "Bu masaüstünde yapılandırılmış istemci tüneli yok.", - "tunnelName": "Tünel Adı", - "remoteHost": "Uzak Sunucu", - "autoStart": "Otomatik Başlatma", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Bu masaüstü istemcisi açıldığında başlar ve bağlantı sürekli devam eder.", "clientManualStartDesc": "Başlat ve Durdur düğmelerini bu satırdan kullanın. Termix bunu otomatik olarak açmayacaktır.", "clientRemoteServerNote": "Uzak yönlendirme, uç nokta SSH sunucusunda AllowTcpForwarding ve GatewayPorts ayarlarının etkinleştirilmesini gerektirebilir. Bu masaüstü bağlantısı kesildiğinde uzak port kapanır.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "Uzak port numarası 1 ile 65535 arasında olmalıdır.", "invalidLocalTargetPort": "Yerel hedef port numarası 1 ile 65535 arasında olmalıdır.", "invalidEndpointPort": "Uç nokta bağlantı noktası 1 ile 65535 arasında olmalıdır.", - "duplicateAutoStartBind": "Yalnızca bir otomatik başlatma istemci tüneli {{bind}} kullanabilir.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Tünel durumunu güncelleme başarısız oldu.", - "active": "Aktif", - "start": "Başlangıç", - "stop": "Durmak", + "active": "Active", + "start": "Start", + "stop": "Stop", "test": "Test", - "type": "Tünel Tipi", - "typeLocal": "Yerel (-L)", - "typeRemote": "Uzaktan (-R)", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Dinamik (-D)", "typeServerLocalDesc": "Mevcut sunucudan uç noktaya.", "typeServerRemoteDesc": "Uç nokta mevcut sunucuya geri dönüyor.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Uç nokta yerel bilgisayara geri döndü.", "typeClientDynamicDesc": "Yerel bilgisayarda SOCKS.", "typeDynamicDesc": "SOCKS5 CONNECT trafiğini SSH üzerinden ilet", - "forwardDescriptionServerLocal": "Geçerli sunucu {{sourcePort}} → uç nokta {{endpointPort}}.", - "forwardDescriptionServerRemote": "Uç nokta {{endpointPort}} → geçerli sunucu {{sourcePort}}.", - "forwardDescriptionServerDynamic": "Mevcut sunucuda SOCKS {{sourcePort}}.", - "forwardDescriptionClientLocal": "Yerel {{sourcePort}} → uzak {{endpointPort}}.", - "forwardDescriptionClientRemote": "Uzak {{sourcePort}} → yerel {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS yerel portta {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → Çoraplar {{endpoint}} aracılığıyla", - "autoNameClientLocal": "Yerel {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → yerel {{localPort}}", - "autoNameClientDynamic": "ÇORAPLAR {{localPort}} aracılığıyla {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Rota:", "lastStarted": "Son başlangıç", "lastTested": "Son test tarihi:", "lastError": "Son hata", - "maxRetries": "Maksimum Yeniden Deneme Sayısı", + "maxRetries": "Max Retries", "maxRetriesDescription": "Maksimum yeniden deneme sayısı.", - "retryInterval": "Tekrar Deneme Aralığı (saniye)", - "retryIntervalDescription": "Yeniden deneme girişimleri arasında beklenecek süre.", - "local": "Yerel", - "remote": "Uzak", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Varış noktası", "host": "Ev sahibi", "mode": "Mod", - "noHostSelected": "Sunucu seçilmedi.", + "noHostSelected": "No host selected", "working": "Çalışma..." }, - "serverStats": { - "cpu": "İşlemci", - "memory": "Hafıza", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", "disk": "Disk", - "network": "Ağ", - "uptime": "Çalışma süresi", - "processes": "Süreçler", - "available": "Mevcut", - "free": "Özgür", - "connecting": "Bağlanıyor...", - "connectionFailed": "Sunucuya bağlanılamadı.", - "naCpus": "N/A CPU(lar)", - "cpuCores_one": "{{count}} Çekirdek", - "cpuCores_other": "{{count}} Çekirdekler", - "cpuUsage": "CPU Kullanımı", - "memoryUsage": "Bellek Kullanımı", - "diskUsage": "Disk Kullanımı", - "failedToFetchHostConfig": "Ana bilgisayar yapılandırması alınamadı.", - "serverOffline": "Sunucu Çevrimdışı", - "cannotFetchMetrics": "Çevrimdışı sunucudan ölçümler alınamıyor.", - "totpFailed": "TOTP doğrulaması başarısız oldu", - "noneAuthNotSupported": "Sunucu İstatistikleri 'none' kimlik doğrulama türünü desteklemiyor.", - "load": "Yük", - "systemInfo": "Sistem Bilgileri", - "hostname": "Ana bilgisayar adı", - "operatingSystem": "İşletim Sistemi", - "kernel": "Çekirdek", - "seconds": "saniyeler", - "networkInterfaces": "Ağ Arayüzleri", - "noInterfacesFound": "Ağ arayüzü bulunamadı.", - "noProcessesFound": "Hiçbir işlem bulunamadı.", - "loginStats": "SSH Giriş İstatistikleri", - "noRecentLoginData": "Son oturum açma verisi yok.", - "executingQuickAction": "{{name}} yürütülüyor...", - "quickActionSuccess": "{{name}} başarıyla tamamlandı", - "quickActionFailed": "{{name}} başarısız oldu", - "quickActionError": "{{name}} yürütülemedi", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Dinleme Portları", - "protocol": "Protokol", - "port": "Liman", - "address": "Adres", - "process": "İşlem", - "noData": "Dinleme portlarına ait veri yok." + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Tüm", + "noData": "No listening ports data" }, "firewall": { - "title": "Güvenlik Duvarı", - "inactive": "Etkin değil", - "policy": "Politika", - "rules": "tüzük", - "noData": "Güvenlik duvarı verisi mevcut değil.", - "action": "Aksiyon", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Liman", - "source": "Kaynak", - "anywhere": "Herhangi bir yer" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Yük Ortalaması", "swap": "Takas", "architecture": "Mimari", - "refresh": "Yenile", - "retry": "Tekrar dene" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Çalışma...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Kendi sunucunuzda barındırılan SSH ve uzaktan masaüstü yönetimi", - "loginTitle": "Termix'e giriş yapın", - "registerTitle": "Hesap oluşturmak", - "forgotPassword": "Parolanızı mı unuttunuz?", - "rememberMe": "Cihazı 30 Gün Boyunca Hatırlayın (TOTP Dahil)", - "noAccount": "Hesabınız yok mu?", - "hasAccount": "Zaten hesabınız var mı?", - "twoFactorAuth": "İki Faktörlü Kimlik Doğrulama", - "enterCode": "Doğrulama kodunu girin", - "backupCode": "Veya yedek kod kullanın.", - "verifyCode": "Kodu Doğrula", - "redirectingToApp": "Uygulamaya yönlendiriliyor...", - "sshAuthenticationRequired": "SSH Kimlik Doğrulaması Gerekli", - "sshNoKeyboardInteractive": "Klavye Etkileşimli Kimlik Doğrulama Kullanılamıyor", - "sshAuthenticationFailed": "Kimlik doğrulama başarısız oldu.", - "sshAuthenticationTimeout": "Kimlik Doğrulama Zaman Aşımı", - "sshNoKeyboardInteractiveDescription": "Sunucu, klavye etkileşimli kimlik doğrulamasını desteklemiyor. Lütfen parolanızı veya SSH anahtarınızı girin.", - "sshAuthFailedDescription": "Girdiğiniz kimlik bilgileri hatalıydı. Lütfen geçerli kimlik bilgileriyle tekrar deneyin.", - "sshTimeoutDescription": "Kimlik doğrulama denemesi zaman aşımına uğradı. Lütfen tekrar deneyin.", - "sshProvideCredentialsDescription": "Lütfen bu sunucuya bağlanmak için SSH kimlik bilgilerinizi girin.", - "sshPasswordDescription": "Bu SSH bağlantısı için şifreyi girin.", - "sshKeyPasswordDescription": "SSH anahtarınız şifrelenmişse, parolayı buraya girin.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Parola Gerekli", "passphraseRequiredDescription": "SSH anahtarı şifrelenmiştir. Lütfen kilidi açmak için parola girin.", - "back": "Geri", - "firstUser": "İlk Kullanıcı", - "firstUserMessage": "İlk kullanıcı sizsiniz ve yönetici olarak atanacaksınız. Yönetici ayarlarını yan menüdeki kullanıcı açılır menüsünden görüntüleyebilirsiniz. Bunun bir hata olduğunu düşünüyorsanız, Docker günlüklerini kontrol edin veya GitHub'da bir sorun bildirin.", - "external": "Harici", - "loginWithExternal": "Harici Sağlayıcı ile Giriş Yap", - "loginWithExternalDesc": "Yapılandırdığınız harici kimlik sağlayıcınızı kullanarak giriş yapın.", - "externalNotSupportedInElectron": "Electron uygulamasında harici kimlik doğrulama henüz desteklenmemektedir. OIDC girişi için lütfen web sürümünü kullanın.", - "resetPasswordButton": "Şifreyi Sıfırla", - "sendResetCode": "Sıfırlama kodunu gönder", - "resetCodeDesc": "Parola sıfırlama kodu almak için kullanıcı adınızı girin. Kod, Docker konteyner günlüklerine kaydedilecektir.", - "resetCode": "Sıfırlama Kodu", - "verifyCodeButton": "Kodu Doğrula", - "enterResetCode": "Kullanıcıya ait Docker konteyner günlüklerinden 6 haneli kodu girin:", - "newPassword": "Yeni Şifre", - "confirmNewPassword": "Şifreyi Onayla", - "enterNewPassword": "Kullanıcı için yeni şifrenizi girin:", - "signUp": "Üye olmak", - "desktopApp": "Masaüstü Uygulaması", - "loggingInToDesktopApp": "Masaüstü uygulamasına giriş yapılıyor.", - "loadingServer": "Sunucu yükleniyor...", - "dataLossWarning": "Parolanızı bu şekilde sıfırlamak, kaydedilmiş tüm SSH sunucularınızı, kimlik bilgilerinizi ve diğer şifrelenmiş verilerinizi silecektir. Bu işlem geri alınamaz. Bunu yalnızca parolanızı unuttuysanız ve oturum açmadıysanız kullanın.", - "authenticationDisabled": "Kimlik Doğrulama Devre Dışı Bırakıldı", - "authenticationDisabledDesc": "Tüm kimlik doğrulama yöntemleri şu anda devre dışı bırakılmıştır. Lütfen yöneticinizle iletişime geçin.", - "attemptsRemaining": "{{count}} deneme kaldı" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "SSH Ana Bilgisayar Anahtarını Doğrulayın", - "keyChangedWarning": "SSH Ana Bilgisayar Anahtarı Değiştirildi", - "firstConnectionTitle": "Bu sunucuya ilk kez bağlanıyorum.", - "firstConnectionDescription": "Bu sunucunun kimliği doğrulanamamıştır. Parmak izinin beklediğinizle eşleştiğini doğrulayın.", - "keyChangedDescription": "Bu sunucunun anahtar kodu son bağlantınızdan bu yana değişti. Bu bir güvenlik sorununa işaret edebilir.", - "previousKey": "Önceki Anahtar", - "newFingerprint": "Yeni Parmak İzi", - "fingerprint": "Parmak izi", - "verifyInstructions": "Bu sunucuya güveniyorsanız, devam etmek ve bu parmak izini gelecekteki bağlantılar için kaydetmek üzere Kabul Et'e tıklayın.", - "securityWarning": "Güvenlik Uyarısı", - "acceptAndContinue": "Kabul Et ve Devam Et", - "acceptNewKey": "Yeni Anahtarı Kabul Et ve Devam Et" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Veritabanına bağlanılamadı.", - "unknownError": "Bilinmeyen hata", - "loginFailed": "giriş başarısız oldu", - "failedPasswordReset": "Parola sıfırlama işlemi başlatılamadı.", - "failedVerifyCode": "Sıfırlama kodunu doğrulama başarısız oldu.", - "failedCompleteReset": "Parola sıfırlama işlemi tamamlanamadı.", - "invalidTotpCode": "Geçersiz TOTP kodu", - "failedOidcLogin": "OIDC oturum açma işlemi başlatılamadı.", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Sessiz oturum açma isteği yapıldı, ancak OIDC oturum açma seçeneği mevcut değil.", "failedUserInfo": "Giriş yaptıktan sonra kullanıcı bilgilerini alma işlemi başarısız oldu.", - "oidcAuthFailed": "OIDC kimlik doğrulaması başarısız oldu", - "invalidAuthUrl": "Arka uçtan geçersiz yetkilendirme URL'si alındı.", - "requiredField": "Bu alan zorunludur.", - "minLength": "Minimum uzunluk {{min}}", - "passwordMismatch": "Şifreler eşleşmiyor.", - "passwordLoginDisabled": "Kullanıcı adı/şifre ile giriş şu anda devre dışı bırakılmıştır.", - "sessionExpired": "Oturumunuzun süresi doldu - lütfen tekrar giriş yapın.", - "totpRateLimited": "Hız sınırlaması: Çok fazla TOTP doğrulama denemesi yapıldı. Lütfen daha sonra tekrar deneyin.", - "totpRateLimitedWithTime": "Hız sınırlaması: Çok fazla TOTP doğrulama denemesi yapıldı. Lütfen tekrar denemeden önce {{time}} saniye bekleyin.", - "resetCodeRateLimited": "Hız sınırlaması: Çok fazla doğrulama denemesi yapıldı. Lütfen daha sonra tekrar deneyin.", - "resetCodeRateLimitedWithTime": "Hız sınırlaması: Çok fazla doğrulama denemesi yapıldı. Lütfen tekrar denemeden önce {{time}} saniye bekleyin.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Kimlik doğrulama belirteci kaydedilemedi.", "failedToLoadServer": "Sunucu yüklenemedi." }, "messages": { - "registrationDisabled": "Yeni hesap kaydı şu anda bir yönetici tarafından devre dışı bırakılmıştır. Lütfen giriş yapın veya bir yöneticiyle iletişime geçin.", - "userNotAllowed": "Hesabınızın kayıt yetkisi bulunmamaktadır. Lütfen bir yöneticiyle iletişime geçin.", - "databaseConnectionFailed": "Veritabanı sunucusuna bağlanılamadı.", - "resetCodeSent": "Docker günlüklerine sıfırlama kodu gönderildi.", - "codeVerified": "Kod başarıyla doğrulandı.", - "passwordResetSuccess": "Parola sıfırlama işlemi başarıyla tamamlandı.", - "loginSuccess": "Giriş başarılı", - "registrationSuccess": "Kayıt işlemi başarılı." + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Yapılandırılmış SSH sunucularını hedefleyen yerel masaüstü tünelleri.", "c2sTunnelPresets": "İstemci Tüneli Ön Ayarları", "c2sTunnelPresetsDesc": "Bu masaüstü istemcisinin yerel tünel listesini adlandırılmış bir sunucu ön ayarı olarak kaydedin veya bu istemciye bir ön ayar yükleyin.", "c2sTunnelPresetsUnavailable": "İstemci tüneli ön ayarları yalnızca masaüstü istemcisinde mevcuttur.", - "c2sPresetName": "Ön Ayar Adı", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Müşteri ön ayar adı", "c2sPresetToLoad": "Yüklemek için ön ayar", "c2sNoPresetSelected": "Önceden seçilmiş bir seçenek yok.", "c2sNoPresets": "Kaydedilmiş ön ayar yok.", - "c2sLoadPreset": "Yük", - "c2sCurrentLocalConfig": "Bu masaüstünde yapılandırılmış {{count}} yerel istemci tüneli.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Ön ayarlar, açıkça belirtilmiş anlık görüntülerdir; bunlardan birini yüklemek, bu masaüstü istemcisinin yerel istemci tünel listesini değiştirir.", "c2sPresetSaved": "İstemci tüneli ön ayarı kaydedildi", "c2sPresetLoaded": "İstemci tüneli ön ayarı yerel olarak yüklendi.", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Dil", - "keyPassword": "anahtar şifresi", - "pastePrivateKey": "Özel anahtarınızı buraya yapıştırın...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (yerel olarak dinleyin)", "localTargetHost": "127.0.0.1 (bu bilgisayardaki hedef)", "socksListenerHost": "127.0.0.1 (Çorap dinleyicisi)", - "enterPassword": "Şifrenizi girin", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Kontrol Paneli", - "loading": "Kontrol paneli yükleniyor...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Destek", + "support": "Support", "discord": "Discord", - "serverOverview": "Sunucuya Genel Bakış", - "version": "Sürüm", - "upToDate": "Güncel", - "updateAvailable": "Güncelleme Mevcut", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "Çalışma süresi", - "database": "Veritabanı", - "healthy": "Sağlıklı", - "error": "Hata", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "Toplam Ev Sahibi Sayısı", - "totalTunnels": "Toplam Tüneller", - "totalCredentials": "Toplam Kimlik Bilgileri", - "recentActivity": "Son Aktiviteler", - "reset": "Sıfırla", - "loadingRecentActivity": "Son etkinlikler yükleniyor...", - "noRecentActivity": "Son zamanlarda herhangi bir aktivite yok.", - "quickActions": "Hızlı İşlemler", - "addHost": "Sunucu Ekle", - "addCredential": "Kimlik Bilgisi Ekle", - "adminSettings": "Yönetici Ayarları", - "userProfile": "Kullanıcı Profili", - "serverStats": "Sunucu İstatistikleri", - "loadingServerStats": "Sunucu istatistikleri yükleniyor...", - "noServerData": "Sunucu verisi mevcut değil.", - "cpu": "İşlemci", - "ram": "Veri deposu", - "customizeLayout": "Kontrol Panelini Özelleştir", - "dashboardSettings": "Kontrol Paneli Ayarları", - "enableDisableCards": "Kartları Etkinleştir/Devre Dışı Bırak", - "resetLayout": "Varsayılan ayarlara sıfırla", - "serverOverviewCard": "Sunucuya Genel Bakış", - "recentActivityCard": "Son Aktiviteler", - "networkGraphCard": "Ağ Grafiği", - "networkGraph": "Ağ Grafiği", - "quickActionsCard": "Hızlı İşlemler", - "serverStatsCard": "Sunucu İstatistikleri", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Ana", "panelSide": "Taraf", - "justNow": "Şu anda" + "justNow": "Şu anda", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "STABİL", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "Yapılandırılmış sunucu yok", "online": "ÇEVRİMİÇİ", "offline": "ÇEVRİMDIŞI", - "onlineLower": "Çevrimiçi", - "nodes": "{{count}} düğümler", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Eklemek:", "commandPalette": "Komut Paleti", "done": "Tamamlamak", "editModeInstructions": "Kartları sürükleyerek yeniden sıralayın · Sütun ayırıcıyı sürükleyerek sütunların boyutunu değiştirin · Bir kartın alt kenarını sürükleyerek yüksekliğini değiştirin · Çöp kutusuna taşıyarak silin", "empty": "Boş", - "clear": "Temizlemek" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Sunucu Ekle", - "addGroup": "Grup Ekle", - "addLink": "Bağlantı Ekle", - "zoomIn": "Yakınlaştır", - "zoomOut": "Uzaklaştır", - "resetView": "Görünümü Sıfırla", - "selectHost": "Sunucu Seçin", - "chooseHost": "Bir ev sahibi seçin...", - "parentGroup": "Ebeveyn Grubu", - "noGroup": "Grup Yok", - "groupName": "Grup Adı", - "color": "Renk", - "source": "Kaynak", - "target": "Hedef", - "moveToGroup": "Gruba Taşı", - "selectGroup": "Grup seçin...", - "addConnection": "Bağlantı Ekle", - "hostDetails": "Ev Sahibi Bilgileri", - "removeFromGroup": "Gruptan Kaldır", - "addHostHere": "Sunucu Ekle", - "editGroup": "Grup Düzenleme", - "delete": "Silmek", - "add": "Eklemek", - "create": "Yaratmak", - "move": "Taşınmak", - "connect": "Bağlamak", - "createGroup": "Grup Oluştur", - "selectSourcePlaceholder": "Kaynak Seçin...", - "selectTargetPlaceholder": "Hedefi Seç...", - "invalidFile": "Geçersiz Dosya", - "hostAlreadyExists": "Sunucu zaten topolojide yer alıyor.", - "connectionExists": "Bağlantı zaten mevcut.", - "unknown": "Bilinmiyor", - "name": "İsim", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "Durum", - "failedToAddNode": "Düğüm ekleme başarısız oldu.", - "sourceDifferentFromTarget": "Kaynak ve hedef farklı olmalıdır.", - "exportJSON": "JSON'u Dışa Aktar", - "importJSON": "JSON'u içe aktar", - "terminal": "terminal", - "fileManager": "Dosya Yöneticisi", - "tunnel": "Tünel", - "docker": "Liman işçisi", - "serverStats": "Sunucu İstatistikleri", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Henüz düğüm yok." }, "docker": { - "notEnabled": "Bu sunucu için Docker etkinleştirilmemiş.", - "validating": "Docker doğrulaması yapılıyor...", - "connecting": "Bağlanıyor...", - "error": "Hata", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Docker'a bağlanılamadı.", - "containerStarted": "Konteyner {{name}} başlatıldı", - "failedToStartContainer": "{{name}} kapsayıcısı başlatılamadı.", - "containerStopped": "Konteyner {{name}} durduruldu", - "failedToStopContainer": "{{name}} kapsayıcısını durdurma başarısız oldu.", - "containerRestarted": "Konteyner {{name}} yeniden başlatıldı", - "failedToRestartContainer": "Kapsayıcıyı yeniden başlatma başarısız oldu {{name}}", - "containerPaused": "Konteyner {{name}} duraklatıldı", - "containerUnpaused": "Konteyner {{name}} duraklatılmamış", - "failedToTogglePauseContainer": "{{name}} kapsayıcısı için duraklatma durumunu değiştirme başarısız oldu.", - "containerRemoved": "Konteyner {{name}} kaldırıldı", - "failedToRemoveContainer": "{{name}} kapsayıcısını kaldırma işlemi başarısız oldu.", - "image": "Görüntü", - "ports": "Limanlar", - "noPorts": "Liman yok", - "start": "Başlangıç", - "confirmRemoveContainer": "'{{name}}' kapsayıcısını kaldırmak istediğinizden emin misiniz? Bu işlem geri alınamaz.", - "runningContainerWarning": "Uyarı: Bu konteyner şu anda çalışıyor. Kaldırılması durumunda konteyner önce durdurulacaktır.", - "loadingContainers": "Konteynerler yükleniyor...", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker Yöneticisi", - "autoRefresh": "Otomatik Yenileme", + "autoRefresh": "Auto Refresh", "timestamps": "Zaman damgaları", "lines": "Çizgiler", - "filterLogs": "Günlükleri filtrele...", - "refresh": "Yenile", - "download": "İndirmek", - "clear": "Temizlemek", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Günlük dosyaları başarıyla indirildi.", "last50": "Son 50", "last100": "Son 100", "last500": "Son 500", "last1000": "Son 1000", "allLogs": "Tüm Kayıtlar", - "noLogsMatching": "\"{{query}} \" ile eşleşen hiçbir günlük bulunamadı.", - "noLogsAvailable": "Kayıt bulunamadı.", - "noContainersFound": "Hiçbir konteyner bulunamadı.", - "noContainersFoundHint": "Bu sunucuda hiçbir Docker kapsayıcısı mevcut değil.", - "searchPlaceholder": "Konteynerleri ara...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Tüm Durumlar", - "stateRunning": "Koşma", + "stateRunning": "Running", "statePaused": "Duraklatıldı", "stateExited": "Çıkış yapıldı", "stateRestarting": "Yeniden Başlatılıyor", - "noContainersMatchFilters": "Filtrelerinizle eşleşen kap bulunamadı.", - "noContainersMatchFiltersHint": "Arama veya filtreleme kriterlerinizi değiştirmeyi deneyin.", - "failedToFetchStats": "Konteyner istatistikleri alınamadı.", - "containerNotRunning": "Konteyner çalışmıyor.", - "startContainerToViewStats": "İstatistikleri görüntülemek için konteyneri başlatın.", - "loadingStats": "İstatistikler yükleniyor...", - "errorLoadingStats": "İstatistikler yüklenirken hata oluştu.", - "noStatsAvailable": "İstatistik bilgisi mevcut değil.", - "cpuUsage": "CPU Kullanımı", - "current": "Akım", - "memoryUsage": "Bellek Kullanımı", - "networkIo": "Ağ G/Ç", - "input": "Giriş", - "output": "Çıktı", - "blockIo": "Blok G/Ç", - "read": "Okumak", - "write": "Yazmak", - "pids": "PID'ler", - "containerInformation": "Konteyner Bilgileri", - "name": "İsim", - "id": "İD", - "state": "Durum", - "containerMustBeRunning": "Konsola erişmek için konteynerin çalışır durumda olması gerekir.", - "verificationCodePrompt": "Doğrulama kodunu girin", - "totpVerificationFailed": "TOTP doğrulaması başarısız oldu. Lütfen tekrar deneyin.", - "warpgateVerificationFailed": "Warpgate kimlik doğrulaması başarısız oldu. Lütfen tekrar deneyin.", - "connectedTo": "{{containerName}} ile bağlantılı", - "disconnected": "Bağlantı kesildi", - "consoleError": "Konsol hatası", - "errorMessage": "Hata: {{message}}", - "failedToConnect": "Konteynere bağlanılamadı.", - "console": "Konsol", - "selectShell": "Kabuk seçin", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", - "sh": "ş", - "ash": "kül", - "connect": "Bağlamak", - "disconnect": "Bağlantıyı kes", - "notConnected": "Bağlı değil", - "clickToConnect": "Kabuk oturumu başlatmak için bağlan'a tıklayın.", - "connectingTo": "{{containerName}} ile bağlantı kuruluyor...", - "containerNotFound": "Konteyner bulunamadı.", - "backToList": "Listeye geri dön", - "logs": "Günlükler", - "stats": "İstatistikler", - "consoleTab": "Konsol", - "startContainerToAccess": "Konsola erişmek için konteyneri başlatın." + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Genel", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Kullanıcılar", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Oturumlar", - "sectionRoles": "Roller", - "sectionDatabase": "Veritabanı", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API Anahtarları", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Filtreleri Temizle", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Tüm", "allowRegistration": "Kullanıcı Kaydına İzin Ver", - "allowRegistrationDesc": "Yeni kullanıcıların kendi kendilerine kayıt olmalarına izin verin.", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Şifreyle Girişe İzin Ver", "allowPasswordLoginDesc": "Kullanıcı adı/şifre ile giriş yapın", "oidcAutoProvision": "OIDC Otomatik Sağlama", - "oidcAutoProvisionDesc": "Kayıt devre dışı bırakılmış olsa bile OIDC kullanıcıları için otomatik olarak hesap oluşturun.", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Parola Sıfırlamaya İzin Ver", "allowPasswordResetDesc": "Docker günlükleri aracılığıyla kodu sıfırla", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Oturum Zaman Aşımı", - "hours": "saat", + "hours": "hours", "sessionTimeoutRange": "Minimum 1 saat · Maksimum 720 saat", - "monitoringDefaults": "Varsayılan Ayarları İzleme", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Durum Kontrolü", - "metrics": "Metrikler", + "metrics": "Metrics", "sec": "saniye", "logLevel": "Günlük Seviyesi", "enableGuacamole": "Guacamole'yi etkinleştirin", "enableGuacamoleDesc": "RDP/VNC uzaktan masaüstü", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "OpenID Connect'i SSO için yapılandırın. * ile işaretlenmiş alanlar zorunludur.", - "oidcClientId": "Müşteri Kimliği", - "oidcClientSecret": "Müşteri Gizli Bilgileri", - "oidcAuthUrl": "Yetkilendirme URL'si", - "oidcIssuerUrl": "Yayıncı URL'si", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", "oidcTokenUrl": "Token URL", - "oidcUserIdentifier": "Kullanıcı Tanımlayıcı Yolu", - "oidcDisplayName": "Görüntü Adı Yolu", - "oidcScopes": "Kapsamlar", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Kullanıcı bilgisi URL'sini geçersiz kıl", - "oidcAllowedUsers": "İzin Verilen Kullanıcılar", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Her satıra bir e-posta adresi yazın. Tüm e-posta adreslerinin görünmesi için boş bırakın.", - "removeOidc": "Kaldırmak", - "usersCount": "{{count}} kullanıcılar", - "createUser": "Yaratmak", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Yeni Rol", - "roleName": "İsim", - "roleDisplayName": "Ekran adı", - "roleDescription": "Tanım", - "rolesCount": "{{count}} roller", - "createRole": "Yaratmak", - "creating": "Oluşturuluyor...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Veritabanını Dışa Aktar", "exportDatabaseDesc": "Tüm sunucuların, kimlik bilgilerinin ve ayarların yedek kopyasını indirin.", - "export": "İhracat", - "exporting": "İhracat...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Veritabanını İçe Aktar", "importDatabaseDesc": ".sqlite yedekleme dosyasından geri yükleme", - "importDatabaseSelected": "Seçilen: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Dosya Seç", - "changeFile": "Değiştirmek", - "import": "İçe aktarmak", - "importing": "İçe aktarılıyor...", - "apiKeysCount": "{{count}} anahtarlar", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Yeni API Anahtarı", "apiKeyCreatedWarning": "Anahtar oluşturuldu - şimdi kopyalayın, bir daha gösterilmeyecek.", - "apiKeyName": "İsim", - "apiKeyUser": "Kullanıcı", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Bir kullanıcı seçin...", - "apiKeyExpiresAt": "Son Geçerlilik Tarihi", + "apiKeyExpiresAt": "Expires At", "createKey": "Anahtar Oluştur", "apiKeyNoExpiry": "Son kullanma tarihi yok", "revokedBadge": "İPTAL EDİLDİ", - "authTypeDual": "Çift Kimlik Doğrulama", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Yerel", - "adminStatusAdministrator": "Yönetici", - "adminStatusRegularUser": "Düzenli Kullanıcı", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "YÖNETİCİ", "systemBadge": "SYS", "customBadge": "GELENEK", "youBadge": "SEN", - "sessionsActive": "{{count}} aktif", - "sessionActive": "Aktif: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "Tüm", "revokeAllSessionsSuccess": "Kullanıcıya ait tüm oturumlar iptal edildi.", - "revokeAllSessionsFailed": "Oturumları iptal etme başarısız oldu.", - "revokeSessionFailed": "Oturumu iptal etme başarısız oldu.", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Rol ekle", "noCustomRoles": "Tanımlanmış özel rol yok.", - "removeRoleFailed": "Rolü kaldırma işlemi başarısız oldu.", - "assignRoleFailed": "Rol atama işlemi başarısız oldu.", - "deleteRoleFailed": "Rol silme işlemi başarısız oldu.", - "userAdminAccess": "Yönetici", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Tüm yönetici ayarlarına tam erişim", - "userRoles": "Roller", - "revokeAllUserSessions": "Tüm Oturumları İptal Et", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Tüm cihazlarda yeniden oturum açmayı zorunlu kılın", - "revoke": "Geri çekmek", + "revoke": "Revoke", "deleteUserWarning": "Bu kullanıcının silinmesi kalıcıdır.", - "deleteUser": "{{username}} silin", - "deleting": "Siliniyor...", - "deleteUserFailed": "Kullanıcı silme işlemi başarısız oldu.", - "deleteUserSuccess": "Kullanıcı \"{{username}}\" silindi", - "deleteRoleSuccess": "\"{{name}}\" rolü silindi", - "revokeKeySuccess": "\"{{name}}\" anahtarı iptal edildi", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Anahtarı iptal etme başarısız oldu.", - "copiedToClipboard": "Panoya kopyalandı", + "copiedToClipboard": "Copied to clipboard", "done": "Tamamlamak", - "createUserTitle": "Kullanıcı Oluştur", + "createUserTitle": "Create User", "createUserDesc": "Yeni bir yerel hesap oluşturun.", - "createUserUsername": "Kullanıcı adı", - "createUserPassword": "Şifre", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "En az 6 karakter.", - "createUserEnterUsername": "Kullanıcı adınızı girin", - "createUserEnterPassword": "Şifrenizi girin", - "createUserSubmit": "Kullanıcı Oluştur", - "editUserTitle": "Kullanıcıyı Yönet: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Rolleri, yönetici durumunu, oturumları ve hesap ayarlarını düzenleyin.", - "editUserUsername": "Kullanıcı adı", + "editUserUsername": "Username", "editUserAuthType": "Kimlik Doğrulama Türü", - "editUserAdminStatus": "Yönetici Durumu", - "editUserUserId": "Kullanıcı kimliği", - "linkAccountTitle": "OIDC'yi Parola Hesabına Bağla", - "linkAccountDesc": "OIDC hesabını {{username}} mevcut bir yerel hesapla birleştirin.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Bu şunları sağlayacak:", "linkAccountEffect1": "Yalnızca OIDC'ye özel hesabı silin.", "linkAccountEffect2": "Hedef hesaba OIDC oturum açma işlemini ekleyin.", "linkAccountEffect3": "Hem OIDC hem de parola ile giriş yapılmasına izin verin.", - "linkAccountTargetUsername": "Hedef Kullanıcı Adı", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Bağlantı kurmak istediğiniz yerel hesap kullanıcı adını girin.", - "linkAccounts": "Hesapları Bağla", - "linkAccountSuccess": "\"{{username}} \" ile bağlantılı OIDC hesabı", - "linkAccountFailed": "OIDC hesabının bağlanması başarısız oldu.", - "linkAccountInProgress": "Bağlantı kuruluyor...", - "saving": "Tasarruf...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Kayıt ayarlarını güncelleme başarısız oldu.", "updatePasswordLoginFailed": "Parola giriş ayarlarını güncelleme başarısız oldu.", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "OIDC otomatik sağlama ayarı güncellenemedi.", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Parola sıfırlama ayarı güncellenemedi.", "sessionTimeoutRange2": "Oturum zaman aşımı 1 ile 720 saat arasında olmalıdır.", "sessionTimeoutSaved": "Oturum zaman aşımı kaydedildi", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Geçersiz aralık değerleri", "monitoringSaved": "İzleme ayarları kaydedildi.", "monitoringSaveFailed": "İzleme ayarları kaydedilemedi.", - "guacamoleSaved": "Guacamole ayarları kaydedildi.", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Guacamole ayarları kaydedilemedi.", "guacamoleUpdateFailed": "Guacamole ayarlarını güncelleme başarısız oldu.", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Günlük düzeyi güncellenemedi.", "oidcSaved": "OIDC yapılandırması kaydedildi", "oidcSaveFailed": "OIDC yapılandırması kaydedilemedi.", "oidcRemoved": "OIDC yapılandırması kaldırıldı", "oidcRemoveFailed": "OIDC yapılandırmasını kaldırma başarısız oldu.", "createUserRequired": "Kullanıcı adı ve şifre gereklidir.", - "createUserPasswordTooShort": "Parola en az 6 karakter uzunluğunda olmalıdır.", - "createUserSuccess": "Kullanıcı \"{{username}}\" oluşturdu", - "createUserFailed": "Kullanıcı oluşturulamadı.", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Yönetici durumunu güncelleme başarısız oldu.", "allSessionsRevoked": "Tüm oturumlar iptal edildi.", - "revokeSessionsFailed": "Oturumları iptal etme başarısız oldu.", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Ad ve görünen ad zorunludur.", - "createRoleSuccess": "\"{{name}}\" rolü oluşturuldu", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Rol oluşturulamadı.", "apiKeyNameRequired": "Anahtar adı gereklidir.", "apiKeyUserRequired": "Kullanıcı kimliği gereklidir.", - "apiKeyCreatedSuccess": "API anahtarı \"{{name}}\" oluşturuldu", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "API anahtarı oluşturulamadı.", "exportSuccess": "Veritabanı başarıyla dışa aktarıldı.", "exportFailed": "Veritabanı dışa aktarma işlemi başarısız oldu.", "importSelectFile": "Lütfen önce bir dosya seçin.", - "importCompleted": "İçe aktarma tamamlandı: {{total}} öğe içe aktarıldı, {{skipped}} öğe atlandı", - "importFailed": "İçe aktarma başarısız oldu: {{error}}", - "importError": "Veritabanı içe aktarma işlemi başarısız oldu." + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Veritabanı içe aktarma işlemi başarısız oldu.", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Ev sahibi", - "hostPlaceholder": "192.168.1.1 veya example.com", - "portLabel": "Liman", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Kullanıcı adı", - "usernamePlaceholder": "kullanıcı adı", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Yetki", - "passwordLabel": "Şifre", - "passwordPlaceholder": "şifre", - "privateKeyLabel": "Özel Anahtar", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Özel anahtarı yapıştırın...", - "credentialLabel": "Kimlik belgesi", + "credentialLabel": "Credential", "credentialPlaceholder": "Kaydedilmiş bir kimlik bilgisi seçin.", - "connectToTerminal": "Terminale bağlanın", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Dosyalara bağlan" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Tümünü Temizle", "noHistoryEntries": "Geçmiş kaydı yok.", "trackingDisabled": "Geçmiş izleme devre dışı bırakıldı", - "trackingDisabledHint": "Komutları kaydetmek için profil ayarlarınızda bu özelliği etkinleştirin." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Anahtar Kaydı", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Terminallere kayıt yapın", "selectAll": "Tüm", - "selectNone": "Hiçbiri", + "selectNone": "None", "noTerminalTabsOpen": "Açık terminal sekmesi yok.", "selectTerminalsAbove": "Yukarıdaki terminalleri seçin", "broadcastInputPlaceholder": "Tuş vuruşlarını yayınlamak için buraya yazın...", "stopRecording": "Kaydı Durdur", "startRecording": "Kaydı Başlat", - "settingsTitle": "Ayarlar", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Sağ tıklama ile kopyala/yapıştır özelliğini etkinleştirin." }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "Sekmeleri yukarıdaki bölmelere sürükleyin veya Hızlı Atama özelliğini kullanın.", "dropHere": "Buraya bırakın", "emptyPane": "Boş", - "dashboard": "Kontrol Paneli", + "dashboard": "Dashboard", "clearSplitScreen": "Ekranı Bölünmüş Hale Getir", "quickAssign": "Hızlı Atama", - "alreadyAssigned": "Bölme {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Bölünmüş Sekme", "addToSplit": "Bölünmüş bölüme ekle", "removeFromSplit": "Bölünmüş halden çıkarın", - "assignToPane": "Bölmeye ata" + "assignToPane": "Bölmeye ata", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Kod Parçası Oluştur", - "createSnippetDescription": "Hızlı çalıştırma için yeni bir komut parçacığı oluşturun.", - "nameLabel": "İsim", - "namePlaceholder": "Örneğin, Nginx'i yeniden başlatın.", - "descriptionLabel": "Tanım", - "descriptionPlaceholder": "İsteğe bağlı açıklama", - "optional": "İsteğe bağlı", - "folderLabel": "Dosya", - "noFolder": "Klasör yok (Kategorilenmemiş)", - "commandLabel": "Emretmek", - "commandPlaceholder": "Örneğin, sudo systemctl restart nginx", - "cancel": "İptal etmek", - "createSnippetButton": "Kod Parçası Oluştur", - "createFolderTitle": "Klasör Oluştur", - "createFolderDescription": "Kod parçacıklarınızı klasörler halinde düzenleyin.", - "folderNameLabel": "Klasör Adı", - "folderNamePlaceholder": "Örneğin, Sistem Komutları, Docker Betikleri", - "folderColorLabel": "Klasör Rengi", - "folderIconLabel": "Klasör Simgesi", - "previewLabel": "Önizleme", - "folderNameFallback": "Klasör Adı", - "createFolderButton": "Klasör Oluştur", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Hedef Terminaller", "selectAll": "Tüm", - "selectNone": "Hiçbiri", + "selectNone": "None", "noTerminalTabsOpen": "Açık terminal sekmesi yok.", - "searchPlaceholder": "Arama sonuçları...", - "newSnippet": "Yeni Parça", - "newFolder": "Yeni Klasör", - "run": "Koşmak", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Bu klasörde kod parçacığı yok.", - "uncategorized": "Kategorilendirilmemiş", - "editSnippetTitle": "Kod Parçasını Düzenle", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Bu komut parçasını güncelleyin.", "saveSnippetButton": "Değişiklikleri Kaydet", - "createSuccess": "Kod parçası başarıyla oluşturuldu.", - "createFailed": "Kod parçacığı oluşturulamadı.", - "updateSuccess": "Kod parçası başarıyla güncellendi.", - "updateFailed": "Kod parçasını güncelleme başarısız oldu.", - "deleteFailed": "Kod parçasını silme işlemi başarısız oldu.", - "folderCreateSuccess": "Klasör başarıyla oluşturuldu.", - "folderCreateFailed": "Klasör oluşturulamadı.", - "editFolderTitle": "Klasörü Düzenle", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Bu klasörün adını değiştirin veya görünümünü düzenleyin.", "saveFolderButton": "Değişiklikleri Kaydet", "editFolder": "Klasörü düzenle", "deleteFolder": "Klasörü sil", - "folderDeleteSuccess": "Klasör \"{{name}}\" silindi", - "folderDeleteFailed": "Klasör silme işlemi başarısız oldu.", - "folderEditSuccess": "Klasör başarıyla güncellendi.", - "folderEditFailed": "Klasör güncellemesi başarısız oldu.", - "confirmRunMessage": "\"{{name}} \" çalıştır?", - "confirmRunButton": "Koşmak", - "runSuccess": "\"{{name}}\" ifadesi {{count}} terminal(ler)inde çalıştırıldı", - "copySuccess": "\"{{name}}\" panoya kopyalandı", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Paylaşılan Parça", - "shareUser": "Kullanıcı", - "shareRole": "Rol", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Bir kullanıcı seçin...", "selectRole": "Bir rol seçin...", "shareSuccess": "Kod parçası başarıyla paylaşıldı.", "shareFailed": "Kod parçasını paylaşma başarısız oldu.", "revokeSuccess": "Erişim iptal edildi", - "revokeFailed": "Erişimi iptal etme başarısız oldu.", - "currentAccess": "Mevcut Erişim", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Paylaşılan veriler yüklenemedi.", - "loading": "Yükleniyor...", - "close": "Kapalı", - "reorderFailed": "Kod parçacığının sırasını kaydetme başarısız oldu." + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Kod parçacığının sırasını kaydetme başarısız oldu.", + "importExport": "İthalat / İhracat", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Yapılandırılmış sunucu yok", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Hesap", - "sectionAppearance": "Dış görünüş", - "sectionSecurity": "Güvenlik", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API Anahtarları", "sectionC2sTunnels": "C2S Tünelleri", - "usernameLabel": "Kullanıcı adı", - "roleLabel": "Rol", - "roleAdministrator": "Yönetici", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Kimlik Doğrulama Yöntemi", - "authMethodLocal": "Yerel", + "authMethodLocal": "Local", "twoFaLabel": "2FA", "twoFaOn": "Açık", "twoFaOff": "Kapalı", - "versionLabel": "Sürüm", - "deleteAccount": "Hesabı Sil", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Hesabınızı kalıcı olarak silin.", - "deleteButton": "Silmek", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Bu işlem kalıcıdır ve geri alınamaz.", "deleteAccountWarning": "Tüm oturumlar, sunucular, kimlik bilgileri ve ayarlar kalıcı olarak silinecektir.", - "confirmPasswordDeletePlaceholder": "Onaylamak için şifrenizi girin.", - "languageLabel": "Dil", - "themeLabel": "Tema", - "fontSizeLabel": "Yazı Tipi Boyutu", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Vurgu Rengi", - "settingsTerminal": "terminal", - "commandAutocomplete": "Komut Otomatik Tamamlama", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Yazarken otomatik tamamlama özelliğini göster", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Geçmiş Takibi", "historyTrackingDesc": "Terminal komutlarını izle", - "syntaxHighlighting": "Sözdizimi Vurgulama", - "syntaxHighlightingDesc": "Terminal çıktısını vurgula", "commandPalette": "Komut Paleti", "commandPaletteDesc": "Klavye kısayolunu etkinleştir", "reopenTabsOnLogin": "Giriş yaptıktan sonra sekmeleri yeniden açın", "reopenTabsOnLoginDesc": "Başka bir cihazdan giriş yapsanız bile, oturum açtığınızda veya sayfayı yenilediğinizde açık sekmelerinizi geri yükleyin.", "confirmTabClose": "Sekmeyi Kapatmayı Onayla", "confirmTabCloseDesc": "Terminal sekmelerini kapatmadan önce izin isteyin.", - "settingsSidebar": "Kenar Çubuğu", - "showHostTags": "Sunucu Etiketlerini Göster", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Ana bilgisayar listesinde etiketleri görüntüle", "hostTrayOnClick": "Sunucu İşlemlerini Genişletmek için Tıklayın", "hostTrayOnClickDesc": "Bağlantı düğmelerini her zaman göster; yönetim seçeneklerini genişletmek için fareyi üzerine getirmek yerine tıklayın.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin Uygulama Rayını", "pinAppRailDesc": "Sol kenar çubuğundaki uygulama çubuğunu fareyle üzerine gelindiğinde genişletmek yerine her zaman açık tutun.", - "settingsSnippets": "Kısa bölümler", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Klasörler Daraltıldı", "foldersCollapsedDesc": "Klasörleri varsayılan olarak daralt", "confirmExecution": "Yürütmeyi Onayla", "confirmExecutionDesc": "Kod parçacıklarını çalıştırmadan önce onaylayın.", - "settingsUpdates": "Güncellemeler", + "settingsUpdates": "Updates", "disableUpdateChecks": "Güncelleme Kontrollerini Devre Dışı Bırak", "disableUpdateChecksDesc": "Güncellemeleri kontrol etmeyi bırakın.", "totpAuthenticator": "TOTP Kimlik Doğrulayıcı", @@ -2109,68 +2612,68 @@ "qrCode": "QR Kodu", "totpInstructions": "QR kodunu tarayın veya kimlik doğrulama uygulamanızda gizli anahtarı girin, ardından 6 haneli kodu girin.", "totpCodePlaceholder": "000000", - "verify": "Doğrulamak", - "changePassword": "Şifre değiştir", - "currentPasswordLabel": "Mevcut Şifre", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Mevcut Şifre", - "newPasswordLabel": "Yeni Şifre", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Yeni Şifre", "confirmPasswordLabel": "Yeni Şifreyi Onayla", "confirmPasswordPlaceholder": "Yeni şifreyi onaylayın", "updatePassword": "Şifreyi Güncelle", "createApiKeyTitle": "API Anahtarı Oluştur", "createApiKeyDescription": "Programatik erişim için yeni bir API anahtarı oluşturun.", - "apiKeyNameLabel": "İsim", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "Örneğin CI İşlem Hattı", "expiryDateLabel": "Son kullanma tarihi", "optional": "isteğe bağlı", - "cancel": "İptal etmek", + "cancel": "Cancel", "createKey": "Anahtar Oluştur", - "apiKeyCount": "{{count}} anahtarlar", + "apiKeyCount": "{{count}} keys", "newKey": "Yeni Anahtar", "noApiKeys": "Henüz API anahtarları yok.", - "apiKeyActive": "Aktif", + "apiKeyActive": "Active", "apiKeyUsageHint": "Anahtarınızı içine koyun.", "apiKeyUsageHintHeader": "başlık.", "apiKeyPermissionsHint": "Anahtarlar, oluşturan kullanıcının izinlerini devralır.", - "roleUser": "Kullanıcı", - "authMethodDual": "Çift Kimlik Doğrulama", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "TOTP kurulumu başlatılamadı.", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "6 haneli bir kod girin", "totpEnabledSuccess": "İki faktörlü kimlik doğrulama etkinleştirildi", "totpInvalidCode": "Geçersiz kod, lütfen tekrar deneyin.", "totpDisableInputRequired": "TOTP kodunuzu veya şifrenizi girin.", - "totpDisabledSuccess": "İki faktörlü kimlik doğrulama devre dışı bırakıldı", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "İki faktörlü kimlik doğrulama devre dışı bırakılamadı.", - "totpDisableTitle": "İki faktörlü kimlik doğrulamayı devre dışı bırakın", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "TOTP kodunu veya şifreyi girin.", - "totpDisableConfirm": "İki faktörlü kimlik doğrulamayı devre dışı bırakın", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Doğrulamaya Devam Edin", - "totpVerifyTitle": "Kodu Doğrula", - "totpBackupTitle": "Yedekleme Kodları", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Yedekleme Kodlarını İndir", "done": "Tamamlamak", "secretCopied": "Gizli bilgi panoya kopyalandı", "apiKeyNameRequired": "Anahtar adı gereklidir.", - "apiKeyCreated": "API anahtarı \"{{name}}\" oluşturuldu", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "API anahtarı oluşturulamadı.", - "apiKeyUser": "Kullanıcı", - "apiKeyExpires": "Süresi doluyor", - "apiKeyRevoked": "API anahtarı \"{{name}}\" iptal edildi", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "API anahtarını iptal etme işlemi başarısız oldu.", "passwordFieldsRequired": "Mevcut ve yeni şifreler gereklidir.", - "passwordMismatch": "Şifreler eşleşmiyor.", - "passwordTooShort": "Parola en az 6 karakter uzunluğunda olmalıdır.", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Parola başarıyla güncellendi.", "passwordUpdateFailed": "Parola güncelleme başarısız oldu.", "deletePasswordRequired": "Hesabınızı silmek için şifre gereklidir.", - "deleteFailed": "Hesap silme işlemi başarısız oldu.", - "deleting": "Siliniyor...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Renk seçiciyi açın", - "themeSystem": "Sistem", - "themeLight": "Işık", - "themeDark": "Karanlık", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Drakula", "themeCatppuccin": "Catppuccin", "themeNord": "Kuzey", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "Şu anda", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Sekme", + "backTab": "⇥", + "arrowUp": "Yukarı Ok", + "arrowDown": "Aşağı Ok", + "arrowLeft": "Ok Sol", + "arrowRight": "Sağ Ok", + "home": "Home", + "end": "Son", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Tamamlamak" } } diff --git a/src/ui/locales/translated/uk_UA.json b/src/ui/locales/translated/uk_UA.json index 9de64ba8..efcd3638 100644 --- a/src/ui/locales/translated/uk_UA.json +++ b/src/ui/locales/translated/uk_UA.json @@ -1,579 +1,744 @@ { "credentials": { - "folders": "Папки", - "folder": "Тека", + "folders": "Folders", + "folder": "Folder", "password": "Пароль", - "key": "Ключ", - "sshPrivateKey": "Приватний ключ SSH", - "upload": "Вивантажити", - "keyPassword": "Пароль ключа", - "sshKey": "SSH ключ", - "uploadPrivateKeyFile": "Завантажити файл приватного ключа", - "searchCredentials": "Пошук облікових даних...", - "addCredential": "Додати", - "caCertificate": "Сертифікат CA (-cert.pub)", - "caCertificateDescription": "Необов'язково: Завантажте або вставте файл підписаного клієнта сертифіката (наприклад, id_ed25519-cert.pub). Потрібно, коли ваш SSH сервер використовує авторизацію на основі сертифікатів.", - "uploadCertFile": "Завантажте -cert.pub файл", - "clearCert": "Очистити", - "certLoaded": "Сертифікат завантажений", - "certPublicKeyLabel": "Сертифікат центру сертифікації", - "certTypeLabel": "Тип сертифіката", - "pasteOrUploadCert": "Вставити або відвантажити -cert.pub сертифікат...", - "hasCaCert": "Має сертифікат центру сертифікації", - "noCaCert": "Немає сертифікату центру сертифікації" + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH-ключ", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.", + "uploadCertFile": "Upload -cert.pub File", + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "Paste or upload a -cert.pub certificate...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Порядок за замовчуванням", + "sortNameAsc": "Ім'я (А → Я)", + "sortNameDesc": "Ім'я (Я → А)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Очистити фільтри", + "filterTypeGroup": "Type", + "filterTypePassword": "Пароль", + "filterTypeKey": "SSH-ключ", + "filterTagsGroup": "Теги" }, "homepage": { - "failedToLoadAlerts": "Не вдалося завантажити сповіщення", - "failedToDismissAlert": "Не вдалося відхилити попередження" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Конфігурація сервера", - "description": "Налаштуйте URL сервера Termix для підключення до ваших сервісів backend", - "serverUrl": "URL-адреса сервера", - "enterServerUrl": "Будь ласка, введіть URL-адресу сервера", - "saveFailed": "Не вдалося зберегти конфігурацію", - "saveError": "Помилка під час збереження налаштувань", - "saving": "Збереження...", - "saveConfig": "Зберегти конфігурацію", - "helpText": "Введіть URL, на якому працює ваш Термікс сервер (e.g., http://localhost:30001 або https://your-server.com)", - "changeServer": "Змінити сервер", - "mustIncludeProtocol": "Адреса сервера має починатися з http:// або https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Дозволити недійсний сертифікат", "allowInvalidCertificateDesc": "Використовуйте лише для довірених серверів із власним хостингом та самопідписаними сертифікатами або сертифікатами IP-адреси.", - "useEmbedded": "Використовувати локальний сервер", - "embeddedDesc": "Запустити Termix з вбудованим локальним сервером (немає потреби віддаленого сервера)", - "embeddedConnecting": "Підключення до локального сервера...", - "embeddedNotReady": "Локальний сервер ще не готовий. Будь ласка, зачекайте трохи і спробуйте ще раз.", - "localServer": "Локальний сервер" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Видалити" }, "versionCheck": { - "error": "Помилка перевірки версії", - "checkFailed": "Не вдалося перевірити наявність оновлень", - "upToDate": "Додаток оновлено до дати", - "currentVersion": "Ваша версія {{version}}", - "updateAvailable": "Доступне оновлення", - "newVersionAvailable": "Доступна нова версія! Ви використовуєте {{current}}, але {{latest}} доступна.", - "betaVersion": "Бета версія", - "betaVersionDesc": "Ви використовуєте {{current}}, який є новішим, ніж останній стабільний реліз {{latest}}.", - "releasedOn": "Випущена на {{date}}", - "downloadUpdate": "Завантажити оновлення", - "checking": "Перевірка оновлень...", - "checkUpdates": "Перевірити наявність оновлень", - "checkingUpdates": "Перевірка оновлень...", - "updateRequired": "Необхідне оновлення" + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", + "betaVersion": "Beta Version", + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Закрити", + "close": "Close", "minimize": "Minimize", "online": "Онлайн", - "offline": "В автономному режимі", - "continue": "Продовжити", - "maintenance": "Ремонт", - "degraded": "Погіршення", - "error": "Помилка", - "warning": "Застереження", - "unsavedChanges": "Незбережені зміни", - "dismiss": "Відхилити", - "loading": "Завантажується...", - "optional": "За бажанням", - "connect": "Підключитися", - "copied": "Скопійовано", - "connecting": "З’єднання...", - "updateAvailable": "Доступне оновлення", - "appName": "Термі", - "openInNewTab": "Відкрити у новій вкладці", - "noReleases": "Немає релізів", - "updatesAndReleases": "Оновлення та релізи", - "newVersionAvailable": "Доступна нова версія ({{version}}).", - "failedToFetchUpdateInfo": "Неможливо отримати інформацію оновлення", - "preRelease": "Пре-реліз", - "noReleasesFound": "Не знайдено жодного релізу.", + "offline": "Офлайн", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", "cancel": "Скасувати", - "username": "Ім'я користувача", - "login": "Логін", - "register": "Зареєструватися", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", "password": "Пароль", - "confirmPassword": "Підтвердити пароль", - "back": "Відмінити", - "save": "Зберегти", - "saving": "Збереження...", - "delete": "Видалити", - "rename": "Перейменувати", - "edit": "Редагувати", - "add": "Додати", - "confirm": "Підтвердити", - "no": "Ні", - "or": "АБО", - "next": "Уперед", - "previous": "Попереднє", - "refresh": "Оновити", - "language": "Мова:", - "checking": "Перевірка...", - "checkingDatabase": "Перевірка підключення до бази даних...", - "checkingAuthentication": "Перевірка автентифікації...", - "backendReconnected": "З'єднання з сервером відновлено", - "connectionDegraded": "З'єднання з сервером втрачено, відновлення…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", "remove": "Видалити", - "create": "Створити", - "update": "Оновити", - "copy": "Копія", - "copyFailed": "Не вдалося скопіювати в буфер обміну", + "create": "Create", + "update": "Update", + "copy": "Копіювати", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "Відновити", - "of": "з" + "restore": "Restore", + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Домашній екран", + "home": "Home", "terminal": "Термінал", "docker": "Докер", - "tunnels": "Тунельс", + "tunnels": "Tunnels", "fileManager": "Файловий менеджер", - "serverStats": "Статистика на сервері", - "admin": "Адмін", - "userProfile": "Профіль користувача", - "splitScreen": "Розділений екран", - "confirmClose": "Закрити цю активну сесію?", - "close": "Закрити", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", "cancel": "Скасувати", - "sshManager": "SSH менеджер", - "cannotSplitTab": "Неможливо розділити цю вкладку", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Копіювати пароль", - "copySudoPassword": "Копіювати пароль судо", - "passwordCopied": "Пароль скопійовано до буфера обміну", - "noPasswordAvailable": "Немає доступного пароля", - "failedToCopyPassword": "Не вдалося скопіювати пароль", - "refreshTab": "Оновити", - "openFileManager": "Відкрити файловий менеджер", - "dashboard": "Приладна дошка", - "networkGraph": "Графік мережі", - "quickConnect": "Швидке підключення", - "sshTools": "Інструменти SSH", - "history": "Історія", - "hosts": "Хости", - "snippets": "Сніпети", - "hostManager": "Менеджер хостів", - "credentials": "Дані доступу", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "З'єднання", - "roleAdministrator": "Адміністратор", - "roleUser": "Користувач" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Хости", - "noHosts": "Немає SSH хостів", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", "retry": "Повторити спробу", - "refresh": "Оновити", - "optional": "За бажанням", - "downloadSample": "Завантажити приклад", - "failedToDeleteHost": "Не вдалося видалити {{name}}", - "importSkipExisting": "Імпорт (пропустити існує)", - "connectionDetails": "Відомості про підключення", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", - "telnet": "Telnet", - "remoteDesktop": "Віддалений робочий стіл", - "port": "Порт", - "username": "Ім'я користувача", - "folder": "Тека", - "tags": "Мітки", - "pin": "Закріплення повідомлень", - "addHost": "Додати хост", - "editHost": "Редагувати хост", - "cloneHost": "Клонувати хост", - "enableTerminal": "Увімкнути термінал", - "enableTunnel": "Увімкнути тунель", - "enableFileManager": "Увімкнути файловий менеджер", - "enableDocker": "Увімкнути Docker", - "defaultPath": "Типовий шлях", - "connection": "З'єднання", - "upload": "Вивантажити", - "authentication": "Автентифікація", + "telnet": "Телнет", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Теги", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", "password": "Пароль", - "key": "Ключ", - "credential": "Облікові дані", - "none": "Без ефекту", - "sshPrivateKey": "Приватний ключ SSH", - "keyType": "Тип ключа", - "uploadFile": "Завантажити файл", - "tabGeneral": "Загальні налаштування", + "key": "Key", + "credential": "Посвідчення", + "none": "Жоден", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", - "tabRdp": "RDP", - "tabVnc": "ВНС", - "tabTunnels": "Тунельс", + "tabTerminal": "Термінал", + "tabRdp": "ПРП", + "tabVnc": "VNC", + "tabTunnels": "Tunnels", "tabDocker": "Докер", - "tabFiles": "Файли", - "tabStats": "Статистика", - "tabTelnet": "Telnet", - "tabSharing": "Спільне використання", - "tabAuthentication": "Автентифікація", + "tabFiles": "Files", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", + "tabTelnet": "Телнет", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", "terminal": "Термінал", "tunnel": "Тунель", "fileManager": "Файловий менеджер", - "serverStats": "Статистика на сервері", + "serverStats": "Host Metrics", "status": "Статус", - "folderRenamed": "Тека \"{{oldName}}\" перейменовано в \"{{newName}}\" успішно", - "failedToRenameFolder": "Не вдалося перейменувати теку", - "movedToFolder": "Переміщено до \"{{folder}}\"", - "editHostTooltip": "Редагувати хост", - "statusChecks": "Перевірка стану", - "metricsCollection": "Колекція метрик", - "metricsInterval": "Інтервал збору метрик", - "metricsIntervalDesc": "Як часто збирати статистику серверу (5 с - 1 год)", - "behavior": "Поведінка", - "themePreview": "Попередній перегляд теми", - "theme": "Тема", - "fontFamily": "Шрифт", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "Font Size", - "letterSpacing": "Відстань між буквами", - "lineHeight": "Висота лінії", - "cursorStyle": "Стиль курсора", - "cursorBlink": "Блимання курсору", - "scrollbackBuffer": "Буфер прокручування", - "bellStyle": "Стиль Bell", - "rightClickSelectsWord": "Вибір правої кнопки миші слів", - "fastScrollModifier": "Швидкий модифікатор прокрутки", - "fastScrollSensitivity": "Чутливість швидкого прокручування", - "sshAgentForwarding": "Пересилання SSH Agent", - "backspaceMode": "Режим Backspace", - "startupSnippet": "Сніпет запуску", - "selectSnippet": "Виберіть сніпет", - "forceKeyboardInteractive": "Примусова інтерактивна клавіатура", - "overrideCredentialUsername": "Перевизначити ім'я користувача", - "overrideCredentialUsernameDesc": "Використовуйте ім'я користувача, зазначене вище замість імені користувача облікові дані", - "jumpHostChain": "Перейти до комп'ютера", - "portKnocking": "Порт-Нокінг", - "addKnock": "Додати порт", - "addProxyNode": "Добавити вузол", - "proxyNode": "Вузол проксі", - "proxyType": "Тип проксі", - "quickActions": "Швидкі дії", - "sudoPasswordAutoFill": "Автозаповнення судо-пароля", - "sudoPassword": "Пароль судо", - "keepaliveInterval": "Інтервал оновлення Keepalive (мс)", - "moshCommand": "Команда MOSH", - "environmentVariables": "Змінні середовища", - "addVariable": "Додати змінну", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", + "portKnocking": "Port Knocking", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Докер", - "copyTerminalUrl": "Скопіювати URL терміналу", - "copyFileManagerUrl": "Копіювати URL менеджер файлів", - "copyRemoteDesktopUrl": "Копіювати URL-адреси віддаленого робочого столу", - "failedToConnect": "Не вдалося підключитися до консолі", - "connect": "Підключитися", - "disconnect": "Від'єднатись", - "start": "Старт", - "enableStatusCheck": "Увімкнути перевірку стану", - "enableMetrics": "Увімкнути метрики", - "bulkUpdateFailed": "Не вдалося оновити основну копію", - "selectAll": "Виділити все", - "deselectAll": "Відмінити все", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", "protocols": "Protocols", - "secureShell": "Захищена оболонка", - "virtualNetwork": "Віртуальна мережа", - "unencryptedShell": "Незашифрована оболонка", - "addressIp": "Адреса / IP", - "friendlyName": "Зручна назва", - "folderAndAdvanced": "Папка та розширені налаштування", - "privateNotes": "Приватні нотатки", - "privateNotesPlaceholder": "Докладніше про цей сервер...", - "pinToTop": "Закріпити на початку", - "pinToTopDesc": "Завжди показувати цей хост у верхній частині списку", - "portKnockingSequence": "Порт-Нокінг Послідовність", - "addKnockBtn": "Добавити копію", - "noPortKnocking": "Порт не налаштовано.", - "knockPort": "Стук-Порт", - "protocol": "Protocol", - "delayAfterMs": "Затримка після (мс)", - "useSocks5Proxy": "Використовувати проксі SOCKS5", - "useSocks5ProxyDesc": "Переставити з'єднання через проксі-сервер", - "proxyHost": "Вузол проксі", - "proxyPort": "Порт проксі-сервера", - "proxyUsername": "Ім'я користувача проксі-сервера", - "proxyPassword": "Пароль проксі-сервера", - "proxySingleMode": "Одиночний проксі", - "proxyChainMode": "Ланцюг Проксі", - "you": "Ви", - "jumpHostChainLabel": "Перейти до комп'ютера", - "addJumpBtn": "Додати стрибок", - "noJumpHosts": "Не налаштовано стрибаючих хостів.", - "selectAServer": "Виберіть сервер...", - "sshPort": "SSH порт", - "authMethod": "Метод автентифікації", - "storedCredential": "Збережені облікові дані", - "selectACredential": "Виберіть облікові дані...", - "keyTypeLabel": "Тип ключа", - "keyTypeAuto": "Автоматичне визначення", - "keyPasteTab": "Вставити", - "keyUploadTab": "Вивантажити", - "keyFileLoaded": "Ключовий файл завантажено", - "keyUploadClick": "Натисніть для завантаження .pem / .key / .ppk", - "clearKey": "Очистити ключ", - "keySaved": "SSH ключ збережено", - "keyReplaceNotice": "вставте новий ключ нижче, щоб замінити його", - "keyPassphraseSaved": "Пароль збережено, введіть для зміни", - "replaceKey": "Замінити ключ", - "forceKeyboardInteractiveLabel": "Примусова інтерактивна клавіатура", - "forceKeyboardInteractiveShortDesc": "Примусово використовувати ручний пароль навіть якщо ключі присутні", - "terminalAppearance": "Зовнішній вигляд терміналу", - "colorTheme": "Колір теми", - "fontFamilyLabel": "Шрифт", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "Folder & Advanced", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "Port Knocking Sequence", + "addKnockBtn": "Add Knock", + "noPortKnocking": "No port knocking configured.", + "knockPort": "Knock Port", + "protocol": "Протокол", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "Jump Host Chain", + "addJumpBtn": "Add Jump", + "noJumpHosts": "No jump hosts configured.", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "ОПКШ", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", "fontSizeLabel": "Font Size", - "cursorStyleLabel": "Стиль курсора", - "letterSpacingPx": "Відстань між символами (px)", - "lineHeightLabel": "Висота лінії", - "bellStyleLabel": "Стиль Bell", - "backspaceModeLabel": "Режим Backspace", - "cursorBlinking": "Курсор Блимання", - "cursorBlinkingDesc": "Увімкнути анімацію спливання для курсору", - "rightClickSelectsWordLabel": "Вибір правої кнопки миші вибирає слово", - "rightClickSelectsWordShortDesc": "Виберіть слово під курсором в правому натисканні", - "behaviorAndAdvanced": "Поведінка та розширені функції", - "scrollbackBufferLabel": "Буфер прокручування", - "scrollbackMaxLines": "Максимальна кількість рядків, що зберігаються в історії", - "sshAgentForwardingLabel": "Пересилання SSH Agent", - "sshAgentForwardingShortDesc": "Передавати свої локальні ключі SSH цьому хосту", - "enableAutoMosh": "Увімкнути авто-Mosh", - "enableAutoMoshDesc": "Віддавати перевагу Мосху над SSH якщо доступно", - "enableAutoTmux": "Увімкнути авто-твікс", - "enableAutoTmuxDesc": "Автоматично запускати або прикріплювати до сеансу", - "sudoPasswordAutoFillLabel": "Автозаповнення судо-пароля", - "sudoPasswordAutoFillShortDesc": "Автоматично надавати судо-пароль по запиті", - "sudoPasswordLabel": "Пароль судо", - "environmentVariablesLabel": "Змінні середовища", - "addVariableBtn": "Додати змінну", - "noEnvVars": "Змінні середовища не налаштовані.", - "fastScrollModifierLabel": "Швидкий модифікатор прокрутки", - "fastScrollSensitivityLabel": "Чутливість швидкого прокручування", - "moshCommandLabel": "Командування Мосха", - "startupSnippetLabel": "Сніпет запуску", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Інтервал підтримки активності (секунди)", - "maxKeepaliveMisses": "Максимальна кількість пропусків Keepalive", - "tunnelSettings": "Налаштування тунелю", - "enableTunneling": "Увімкнути тунелювання", - "enableTunnelingDesc": "Увімкнути функцію SSH тунелю для цього хосту", - "serverTunnelsSection": "Налаштування сервера", - "addTunnelBtn": "Додати тунель", - "noTunnelsConfigured": "Тунелі не налаштовано.", - "tunnelLabel": "Тунель {{number}}", - "tunnelType": "Тип тунелю", - "tunnelModeLocalDesc": "Переслати локальний порт в порт на віддаленому сервері (або хост доступний з нього).", - "tunnelModeRemoteDesc": "Переслати порт на віддалений сервер назад до локального порту на вашому комп’ютері.", - "tunnelModeDynamicDesc": "Створіть проксі SOCKS5 на локальному порту для динамічного пересилання портів.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "Server Tunnels", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "Цей хост (прямий тунель)", - "endpointHost": "Підключення хоста", - "endpointPort": "Порт кінцевої точки", - "bindHost": "Прив'язати хост", - "sourcePort": "Вихідний порт", - "maxRetries": "Кількість спроб", - "retryIntervalS": "Інтервал повтору", - "autoStartLabel": "Автозапуск", - "autoStartDesc": "Автоматично підключати цей тунель, коли хост завантажений", - "tunnelConnecting": "Тунель підключення...", - "tunnelDisconnected": "Тунель від’єднано", - "failedToConnectTunnel": "Не вдалося підключитися", - "failedToDisconnectTunnel": "Не вдалося від’єднати", - "dockerIntegration": "Docker інтеграція", - "enableDockerMonitor": "Увімкнути Docker", - "enableDockerMonitorDesc": "Монітор і керування контейнерами на цьому хості через Docker", - "enableFileManagerMonitor": "Увімкнути файловий менеджер", - "enableFileManagerMonitorDesc": "Перегляд та керування файлами на цьому хості через SFTP", - "defaultPathLabel": "Типовий шлях", - "fileManagerPathHint": "Каталог який відкривається, коли файловий менеджер запускається для цього хоста.", - "statusChecksLabel": "Перевірка стану", - "enableStatusChecks": "Увімкнути перевірки статусу", - "enableStatusChecksDesc": "Періодично наведення цього хоста для перевірки доступності", - "useGlobalInterval": "Використовувати глобальний інтервал", - "useGlobalIntervalDesc": "Перевизначити інтервал перевірки статусу сервера", - "checkIntervalS": "Інтервал перевірки (ів)", - "checkIntervalDesc": "Секунди між кожним підключенням", - "metricsCollectionLabel": "Колекція метрик", - "enableMetricsLabel": "Увімкнути метрики", - "enableMetricsDesc": "Збирайте використання ЦП, RAM, диска та мережевого використання на цьому хості", - "useGlobalMetrics": "Використовувати глобальний інтервал", - "useGlobalMetricsDesc": "Перевизначити інтервал загальної метрики сервера", - "metricsIntervalS": "Інтервал метрики(ів)", - "metricsIntervalDesc2": "Секунд між метричними знімками", - "visibleWidgets": "Видимі віджети", - "cpuUsageLabel": "Використання ЦП", - "cpuUsageDesc": "Відсоток ЦП, завантажує середні розміри, графік проживання", - "memoryLabel": "Використання пам'яті", - "memoryDesc": "Використання оперативної пам'яті, болота, кешовані", - "storageLabel": "Використання диску", - "storageDesc": "Диск використання за точку монтування", - "networkLabel": "Мережеві інтерфейси", - "networkDesc": "Інтерфейс списку і пропускна здатність", - "uptimeLabel": "Час роботи", - "uptimeDesc": "Системний час і час завантаження", - "systemInfoLabel": "Системна інформація", - "systemInfoDesc": "OS, ядро, хост, архітектура", - "recentLoginsLabel": "Останні входи", - "recentLoginsDesc": "Успішні та невдалі події входу", - "topProcessesLabel": "ТОП процесів", - "topProcessesDesc": "Команду PID, CPU%, MEM%, команду", - "listeningPortsLabel": "Прослуховування портів", - "listeningPortsDesc": "Відкрити порти з процесом і станом", - "firewallLabel": "Брандмауер", - "firewallDesc": "Firewall, AppArmor, статус SELinux", - "quickActionsLabel": "Швидкі дії", - "quickActionsToolbar": "Швидкі дії з'являються як кнопки в панелі інструментів інструментів сервера для виконання команд одним натисканням.", - "noQuickActions": "Швидких дій поки немає.", - "buttonLabel": "Мітка кнопки", - "selectSnippetPlaceholder": "Виберіть сніпет...", - "addActionBtn": "Додати дію", - "hostSharedSuccessfully": "Хост успішно відкрито", - "failedToShareHost": "Не вдалося поділитися хостом", - "accessRevoked": "Доступ відкликаний", - "failedToRevokeAccess": "Не вдалося відкликати доступ", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Пароль", + "authTypeKey": "SSH-ключ", + "authTypeCredential": "Посвідчення", + "authTypeOpkssh": "ОПКШ", + "authTypeNone": "Жоден", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "Select snippet...", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", "cancelBtn": "Скасувати", - "savingBtn": "Збереження...", - "addHostBtn": "Додати хост", - "hostUpdated": "Хост оновлено", - "hostCreated": "Хост створено", - "failedToSave": "Не вдалося зберегти хост", - "credentialUpdated": "Облікові дані оновлено", - "credentialCreated": "Обліковку створено", - "failedToSaveCredential": "Не вдалося зберегти облікові дані", - "backToHosts": "Назад до хостів", - "backToCredentials": "Назад до облікових даних", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", "pinned": "Закріплено", - "noHostsFound": "Не знайдено хостів", - "tryDifferentTerm": "Спробуйте інший вираз", - "addFirstHost": "Додайте свій перший хост щоб почати", - "noCredentialsFound": "Облікові дані не знайдені", - "addCredentialBtn": "Додати", - "updateCredentialBtn": "Оновити облікові дані", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", "features": "Особливості", - "noFolder": "(Немає теки)", - "deleteSelected": "Видалити", - "exitSelection": "Вийти з вибору", - "importSkip": "Імпорт (пропустити існує)", - "importOverwrite": "Імпорт (перезапис)", - "collapseBtn": "Згорнути", - "importExportBtn": "Імпорт / експорт", - "hostStatusesRefreshed": "Статуси хостів оновлено", - "failedToRefreshHosts": "Не вдалося оновити хости", - "movedHostTo": "Переміщено {{host}} до \"{{folder}}\"", - "failedToMoveHost": "Не вдалося перемістити хост", - "folderRenamedTo": "Папку перейменовано на \"{{name}}\"", - "deletedFolder": "Видалена папка \"{{name}}\"", - "failedToDeleteFolder": "Не вдалося вилучити теку", - "deleteAllInFolder": "Видалити всі хости в \"{{name}}? Це неможливо скасувати.", - "deletedHost": "Видалено {{name}}", - "copiedToClipboard": "Скопійовано до буферу обміну", - "terminalUrlCopied": "Кінцева URL-адреса скопійована", - "fileManagerUrlCopied": "URL файлового менеджера скопійовано", - "tunnelUrlCopied": "URL тунелю скопійовано", - "dockerUrlCopied": "Docker URL скопійовано", - "serverStatsUrlCopied": "Статистику сервера скопійовано", - "rdpUrlCopied": "RDP URL скопійовано", - "vncUrlCopied": "VNC URL скопійовано", - "telnetUrlCopied": "URL Telnet скопійовано", - "remoteDesktopUrlCopied": "URL віддаленого робочого столу скопійовано", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Скасувати", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Статус", + "GroupByProtocol": "Протокол", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "Розгорнути дії", "collapseActions": "Згорнути дії", "wakeOnLanAction": "Пробудження по локальній мережі", - "wakeOnLanSuccess": "Чарівний пакет надіслано на {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Не вдалося надіслати магічний пакет", - "cloneHostAction": "Клонувати хост", - "copyAddress": "Копіювати адресу", - "copyLink": "Копіювати посилання", - "copyTerminalUrlAction": "Скопіювати URL терміналу", - "copyFileManagerUrlAction": "Копіювати URL менеджер файлів", - "copyTunnelUrlAction": "Копіювати URL тунелю", - "copyDockerUrlAction": "Копіювати Docker URL", - "copyServerStatsUrlAction": "Скопіювати URL-адресу статистики сервера", - "copyRdpUrlAction": "Копіювати URL-адресу RDP", - "copyVncUrlAction": "Копіювати URL-АДРЕСА", - "copyTelnetUrlAction": "Копіювати URL Telnet", - "copyRemoteDesktopUrlAction": "Копіювати URL-адреси віддаленого робочого столу", - "deleteCredentialConfirm": "Видалити облікові дані \"{{name}}\"?", - "deletedCredential": "Видалено {{name}}", - "deploySSHKeyTitle": "Розгортати SSH ключ", - "deployingBtn": "Розгортання...", - "deployBtn": "Розгортання", - "failedToDeployKey": "Не вдалося розгорнути ключ", - "deleteHostsConfirm": "Видалити хост {{count}}{{plural}}? Цю дію не можна скасувати.", - "movedToRoot": "Переміщено в корінь", - "failedToMoveHosts": "Не вдалося перемістити хости", - "enableTerminalFeature": "Увімкнути термінал", - "disableTerminalFeature": "Вимкнути термінал", - "enableFilesFeature": "Увімкнути файли", - "disableFilesFeature": "Вимкнути файли", - "enableTunnelsFeature": "Увімкнути тунелі", - "disableTunnelsFeature": "Вимкнути тунелі", - "enableDockerFeature": "Увімкнути Docker", - "disableDockerFeature": "Вимкнути Docker", - "addTagsPlaceholder": "Додати теги...", - "authDetails": "Деталі автентифікації", - "credType": "Тип", - "generateKeyPairDesc": "Згенерувати нову ключову пару, як приватну, так і публічні ключі будуть заповнені автоматично.", - "generatingKey": "Створення...", - "generateLabel": "Згенерувати {{label}}", - "uploadFileBtn": "Завантажити файл", - "keyPassphraseOptional": "Ключова парольна фраза (необов'язково)", - "sshPublicKeyOptional": "Відкритий SSH ключ (необов'язково)", - "publicKeyGenerated": "Згенеровано відкритий ключ", - "failedToGeneratePublicKey": "Не вдалося отримати відкритий ключ", - "publicKeyCopied": "Скопійовано відкритий ключ", - "keyPairGenerated": "Створено пару ключів {{label}}", - "failedToGenerateKeyPair": "Не вдалося згенерувати пару ключів", - "searchHostsPlaceholder": "Пошук хостів, адрес, теґи…", - "searchCredentialsPlaceholder": "Пошук облікових даних…", - "refreshBtn": "Оновити", - "addTag": "Додати теги...", - "deleteConfirmBtn": "Видалити", - "tunnelRequirementsText": "SSH сервер повинен мати так, дозволені TcpForwarding так, а PermittLogin \"yes\" встановлених в /etc/ssh/sshd_config.", - "deleteHostConfirm": "Видалити \"{{name}}\"?", - "enableAtLeastOneProtocol": "Увімкніть принаймні один протокол для налаштування автентифікації та параметрів підключення.", - "keyPassphrase": "Ключова фраза", - "connectBtn": "Підключитися", - "disconnectBtn": "Від'єднатись", - "basicInformation": "Основна інформція", - "authDetailsSection": "Деталі автентифікації", - "credTypeLabel": "Тип", - "hostsTab": "Хости", - "credentialsTab": "Дані доступу", - "selectMultiple": "Вибрати кілька", - "selectHosts": "Виберіть хости", - "connectionLabel": "З'єднання", - "authenticationLabel": "Автентифікація", - "generateKeyPairTitle": "Згенерувати ключову пару", - "generateKeyPairDescription": "Згенерувати нову ключову пару, як приватну, так і публічні ключі будуть заповнені автоматично.", - "generateFromPrivateKey": "Генерувати з закритого ключа", - "refreshBtn2": "Оновити", - "exitSelectionTitle": "Вийти з вибору", - "exportAll": "Експортувати всі", - "addHostBtn2": "Додати хост", - "addCredentialBtn2": "Додати", - "checkingHostStatuses": "Перевірка статусів хоста...", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "Enable Tunnels", + "disableTunnelsFeature": "Disable Tunnels", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", "pinnedSection": "Закріплено", - "hostsExported": "Хости успішно експортовано", + "hostsExported": "Hosts exported successfully", "exportFailed": "Не вдалося експортувати хости", - "sampleDownloaded": "Приклад файлу завантажено", - "failedToDeleteCredential2": "Не вдалося видалити облікові дані", - "noFolderOption": "(Немає теки)", - "nSelected": "Вибрано {{count}}", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", "featuresMenu": "Особливості", - "moveMenu": "Пересунути", + "moveMenu": "Перемістити", + "connectSelected": "Connect", "cancelSelection": "Скасувати", - "deployDialogDesc": "Розгортати {{name}} на авторизовані ключі хоста.", - "targetHostLabel": "Цільовий хост", - "selectHostOption": "Виберіть хост...", - "keyDeployedSuccess": "Ключ успішно розгорнуто", - "failedToDeployKey2": "Не вдалося розгорнути ключ", - "deletedCount": "Видалено {{count}} хостів", - "failedToDeleteCount": "Не вдалося видалити {{count}} хостів", - "duplicatedHost": "Дубльовані \"{{name}}\"", - "failedToDuplicateHost": "Не вдалося дублювати хост", - "updatedCount": "Оновлено {{count}} хостів", - "friendlyNameLabel": "Зручна назва", - "descriptionLabel": "Опис", - "loadingHost": "Завантаження хоста...", - "loadingHosts": "Завантаження хості...", - "loadingCredentials": "Завантаження облікових даних...", - "noHostsYet": "Немає хостів", - "noHostsMatchSearch": "Немає хостів, які відповідають вашому пошуку", - "hostNotFound": "Хост не знайдено", - "searchHosts": "Шукати...", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", + "descriptionLabel": "Description", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "Сортувати хости", "sortDefault": "Порядок за замовчуванням", "sortNameAsc": "Ім'я (А → Я)", @@ -606,189 +771,204 @@ "filterFeatureTunnel": "Тунель", "filterFeatureDocker": "Докер", "filterTagsGroup": "Теги", - "shareHost": "Поділитися хостом", - "shareHostTitle": "Поділитися: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "Цей хост повинен використовувати облікові дані. Спочатку відредагуйте хост і призначте облікові дані." + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "З'єднання", - "authentication": "Автентифікація", - "connectionSettings": "Параметри підключення", - "displaySettings": "Налаштування відображення", - "audioSettings": "Налаштування звуку", - "rdpPerformance": "Продуктивність RDP", - "deviceRedirection": "Перенаправлення пристрою", - "session": "Сесія", - "gateway": "Шлюз", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "Посвідчення", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "Буфер обміну", - "sessionRecording": "Запис сесії", - "wakeOnLan": "Вак-он-ЛАН", - "vncSettings": "Параметри VNC", - "terminalSettings": "Параметри терміналу", - "rdpPort": "RDP-порт", - "username": "Ім'я користувача", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", + "username": "Username", "password": "Пароль", - "domain": "Домен", - "securityMode": "Режим безпеки", - "colorDepth": "Глибина кольору", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "Висота", - "dpi": "Точок на дюйм", - "resizeMethod": "Змінити розмір", - "clientName": "Ім'я клієнта", - "initialProgram": "Початкова програма", - "serverLayout": "Макет серверу", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "Порт шлюзу", - "gatewayUsername": "Ім'я користувача шлюзу", - "gatewayPassword": "Пароль шлюзу", - "gatewayDomain": "Домен шлюзу", - "remoteAppProgram": "Програма RemoteApp", - "workingDirectory": "Робочий каталог", - "arguments": "Аргументи", - "normalizeLineEndings": "Початки ліній Нормалізації", - "recordingPath": "Шлях до запису", - "recordingName": "Назва запису", - "macAddress": "MAC-адреса", - "broadcastAddress": "Адреса трансляції", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "Очікування часу(ів)", - "driveName": "Ім'я диску", - "drivePath": "Шлях", - "ignoreCertificate": "Ігнорувати сертифікат", - "ignoreCertificateDesc": "Дозволити підключення до хостів з самостійно підписаними сертифікатами", - "forceLossless": "Без втрат сили", - "forceLosslessDesc": "Примусово використовувати кодування без втрат зображень (вища якість, більша пропускна здатність)", - "disableAudio": "Вимкнути аудіо", - "disableAudioDesc": "Вимкнути звук для віддаленого сеансу", - "enableAudioInput": "Увімкнути введення звуку (мікрофон)", - "enableAudioInputDesc": "Переслати локальний мікрофон на віддалену сесію", - "wallpaper": "Шпалери", - "wallpaperDesc": "Показувати шпалери робочого столу (вимкнення підвищує продуктивність)", - "theming": "Теми", - "themingDesc": "Увімкнути візуальні теми і стилі", - "fontSmoothing": "Згладжування шрифту", - "fontSmoothingDesc": "Увімкнути рендеринг шрифту ClearType", - "fullWindowDrag": "Перетягування всього вікна", - "fullWindowDragDesc": "Показати вміст вікна під час перетягування", - "desktopComposition": "Склад робочого столу", - "desktopCompositionDesc": "Увімкнути ефекти скла в аеро", - "menuAnimations": "Анімація меню", - "menuAnimationsDesc": "Увімкнути затухання меню та анімацію слайду", - "disableBitmapCaching": "Вимкнути кешування растрових карт", - "disableBitmapCachingDesc": "Вимкнути растровий кеш (може допомогти із glitches)", - "disableOffscreenCaching": "Вимкнути кешування без екрану", - "disableOffscreenCachingDesc": "Вимкнути кеш в автономному режимі", - "disableGlyphCaching": "Вимкнути кешування гліфів", - "disableGlyphCachingDesc": "Вимкнути кеш гліфів", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "Використовувати графічний конвеєр RemoteFX", - "enablePrinting": "Увімкнути друк", - "enablePrintingDesc": "Перенаправити локальні принтери на віддалену сесію", - "enableDriveRedirection": "Включити перенаправлення диску", - "enableDriveRedirectionDesc": "Зв’язати локальну папку як диск у віддаленій сесії", - "createDrivePath": "Створити шлях до диску", - "createDrivePathDesc": "Автоматично створювати теку, якщо вона не існує", - "disableDownload": "Вимкнути завантаження", - "disableDownloadDesc": "Не дозволяти завантажувати файли з віддаленої сесії", - "disableUpload": "Заборонити вивантаження", - "disableUploadDesc": "Заборонити завантаження файлів на віддалену сесію", - "enableTouch": "Увімкнути дотик", - "enableTouchDesc": "Увімкнути переадресацію сенсорного вводу", - "consoleSession": "Консольна сесія", - "consoleSessionDesc": "Підключення до консолі (сеанс 0) замість нової сесії", - "sendWolPacket": "Надіслати WOL Packet", - "sendWolPacketDesc": "Надіслати магічний пакет для розбудови цього хосту перед підключенням", - "disableCopy": "Вимкнути копіювання", - "disableCopyDesc": "Заборонити копіювання тексту з віддаленої сесії", - "disablePaste": "Вимкнути вставку", - "disablePasteDesc": "Запобігає вставці тексту у віддалену сесію", - "createPathIfMissing": "Створити шлях, якщо відсутній", - "createPathIfMissingDesc": "Автоматично створювати каталог для запису", - "excludeOutput": "Виключити вихід", - "excludeOutputDesc": "Не записувати вилучень екрану (лише метаданні)", - "excludeMouse": "Виключити миші", - "excludeMouseDesc": "Не записуйте рухи миші", - "includeKeystrokes": "Включити клавіши", - "includeKeystrokesDesc": "Запис сирих натискань клавіш на додаток до виводу екрану", - "vncPort": "VNC-порт", - "vncPassword": "VNC пароль", - "vncUsernameOptional": "Ім'я користувача (не обов'язково)", - "vncLeaveBlank": "Залиште пустим, якщо не обов'язково", - "cursorMode": "Режим курсору", - "swapRedBlue": "Поміняти червоний/синій", - "swapRedBlueDesc": "Поміняти червоні та сині кольорові канали (виправити деякі проблеми з кольором)", - "readOnly": "Тільки для перегляду", - "readOnlyDesc": "Перегляд віддаленого екрану без відправлення жодного вводу", - "telnetPort": "Тельне Порт", - "terminalType": "Тип терміналу", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", "fontSize": "Font Size", - "colorScheme": "Колірна схема", - "backspaceKey": "Ключ Backspace", - "saveHostFirst": "Спочатку збережіть хост.", - "sharingOptionsAfterSave": "Параметри спільного використання доступні після збереження хоста.", - "sharingLoadError": "Не вдалося завантажити передачу даних. Перевірте ваше з'єднання і спробуйте ще раз.", - "shareHostSection": "Поділитися хостом", - "shareWithUser": "Поділитися з користувачем", - "shareWithRole": "Поділитися із роллю", - "selectUser": "Вибрати користувача", - "selectRole": "Вибрати роль", - "selectUserOption": "Виберіть користувача...", - "selectRoleOption": "Виберіть роль...", - "permissionLevel": "Рівень дозволів", - "expiresInHours": "Закінчується через (години)", - "noExpiryPlaceholder": "Не заповнюйте, якщо немає терміну дії", - "shareBtn": "Поділитись", - "currentAccess": "Поточний доступ", - "typeHeader": "Тип", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "Дозвіл", - "grantedByHeader": "Надано", - "expiresHeader": "Закінчується", - "noAccessEntries": "Записи доступу поки немає.", - "expiredLabel": "Термін дії закінчився", - "neverLabel": "Ніколи", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", "cancelBtn": "Скасувати", - "savingBtn": "Збереження...", - "updateHostBtn": "Оновити хост", - "addHostBtn": "Додати хост" + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "Пошук вузлів, команд або налаштувань...", - "quickActions": "Швидкі дії", - "hostManager": "Менеджер хостів", - "hostManagerDesc": "Налаштування вручну, додавання чи редагування хостів", - "addNewHost": "Додати новий хост", - "addNewHostDesc": "Реєстрація нового хоста", - "adminSettings": "Адміністративні налаштування", - "adminSettingsDesc": "Налаштування системних налаштувань і користувачів", - "userProfile": "Профіль користувача", - "userProfileDesc": "Керуйте вашим акаунтом і налаштуваннями", - "addCredential": "Додати", - "addCredentialDesc": "Зберігати SSH ключі або паролі", - "recentActivity": "Остання активність", - "serversAndHosts": "Сервери та хости", - "noHostsFound": "Не знайдено хостів відповідного \"{{search}}\"", - "links": "Посилання", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "User Profile", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "Вибрати", - "toggleWith": "Розпочати з" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "Жодної вкладки не призначено", + "noTabAssigned": "No tab assigned", "focusedPane": "Активна панель" }, "connections": { "noConnections": "Немає з'єднань", "noConnectionsDesc": "Відкрийте термінал, файловий менеджер або віддалений робочий стіл, щоб побачити підключення тут", - "connectedFor": "Підключено для {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "Підключено", "disconnected": "Відключено", "closeTab": "Закрити вкладку", @@ -801,358 +981,374 @@ "sectionBackground": "Передісторія", "backgroundDesc": "Сеанси тривають 30 хвилин після відключення та можуть бути підключені знову.", "persisted": "Зберігається у фоновому режимі", - "expiresIn": "Термін дії закінчується через {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Пошук з'єднань...", - "noSearchResults": "Немає з'єднань, що відповідають вашому пошуку" + "noSearchResults": "Немає з'єднань, що відповідають вашому пошуку", + "rename": "Rename session" }, "guacamole": { - "connecting": "Підключення до сеансу {{type}}...", - "connectionError": "Помилка підключення", - "connectionFailed": "Не вдалося встановити з'єднання", - "failedToConnect": "Не вдалося отримати токен для підключення", - "hostNotFound": "Хост не знайдено", - "noHostSelected": "Не вибрано жодного хосту", - "reconnect": "Перепід'єднатись", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Помилка підключення", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", + "reconnect": "Знову підключитися", "retry": "Повторити спробу", - "guacdUnavailable": "Віддалена служба стільниці (guacd) недоступна. Переконайтеся, що гадоїд працює і налаштований належним чином в налаштуваннях адміністратора.", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "Win+L (Заблокувати екран)", - "winKey": "Вікно", - "ctrl": "Сtrl", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", + "ctrl": "Ctrl", "alt": "Alt", - "shift": "Зсув", - "win": "Перемога", - "stickyActive": "{{key}} (затримується - натисніть, щоб оновити)", - "stickyInactive": "{{key}} (натисніть, щоб зачинати)", - "esc": "Екранування", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "Домашній екран", - "end": "Кінець", - "pageUp": "Сторінка вгору", - "pageDown": "Сторінка вниз", - "arrowUp": "Стрілка вгору", - "arrowDown": "Стрілка вниз", - "arrowLeft": "Стрілка вліво", - "arrowRight": "Стрілка праворуч", - "fnToggle": "Функціональні кнопки", - "reconnect": "Перепідключити сесію", - "collapse": "Згорнути панель інструментів", - "expand": "Розгорнути панель інструментів", - "dragHandle": "Перетягніть для перестановки" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "З'єднатися з хостом", - "clear": "Очистити", - "paste": "Вставити", - "reconnect": "Перепід'єднатись", - "connectionLost": "З'єднання втрачено", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Знову підключитися", + "connectionLost": "Connection lost", "connected": "Підключено", - "clipboardWriteFailed": "Не вдалося скопіювати до буфера обміну. Переконайтеся, що сторінка подається через HTTPS або localhost.", - "clipboardReadFailed": "Не вдалося прочитати з буфера обміну. Переконайтеся, що дозволи доступу до буфера обміну надані.", - "clipboardHttpWarning": "Вставити HTTPS. Використовуйте Ctrl+Shift+V або службового терміналу по HTTPS.", - "unknownError": "Сталася невідома помилка", - "websocketError": "Помилка з'єднання WebSocket", - "connecting": "З’єднання...", - "noHostSelected": "Не вибрано жодного хосту", - "reconnecting": "Повторне підключення... ({{attempt}}/{{max}})", - "reconnected": "Перепід'єднано успішно", - "tmuxSessionCreated": "Створено сеанс tmux: {{name}}", - "tmuxSessionAttached": "tmux сесія: {{name}}", - "tmuxUnavailable": "tmux не встановлено на віддаленому хості, повертаючись до стандартної оболонки", - "tmuxSessionPickerTitle": "тмукс Сешнс", - "tmuxSessionPickerDesc": "Існуючі сесії виявлено на цьому хості. Виберіть одну для повторного приєднання або створення нового сесії.", - "tmuxWindows": "Вікна", - "tmuxWindowCount": "вікно {{count}}", - "tmuxAttached": "Прикріплені клієнти", - "tmuxAttachedCount": "{{count}} додається", - "tmuxLastActivity": "Остання активність", - "tmuxTimeJustNow": "прямо зараз", - "tmuxTimeMinutes": "{{count}}хв тому", - "tmuxTimeHours": "{{count}}год тому", - "tmuxTimeDays": "{{count}}d тому", - "tmuxCreateNew": "Почати нову сесію", - "tmuxCopyHint": "Відрегулюйте вибір і натисніть Enter для копіювання до буфера обміну", - "tmuxDetach": "Від'єднати від сесії tmux", - "tmuxDetached": "Від’єднано від звичайної сесії", - "maxReconnectAttemptsReached": "Досягнуто максимальної кількості спроб повторного з'єднання", - "closeTab": "Закрити", - "connectionTimeout": "Час очікування з'єднання", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", "terminalTitle": "Terminal - {{host}}", - "terminalWithPath": "Термінал - {{host}}:{{path}}", - "runTitle": "Запуск {{command}} — {{host}}", - "totpRequired": "Необхідна двофакторна аутентифікація", - "totpCodeLabel": "Код підтвердження", - "totpVerify": "Перевірити", - "warpgateAuthRequired": "Потрібен warpgate авторизація", - "warpgateSecurityKey": "Ключ безпеки", - "warpgateAuthUrl": "URL автентифікації", - "warpgateOpenBrowser": "Відкрити у браузері", - "warpgateContinue": "Я вже завершив автентифікацію", - "opksshAuthRequired": "Необхідна автентифікація OPKSSH", - "opksshAuthDescription": "Завершіть автентифікацію в вашому браузері, щоб продовжити. Ця сесія залишиться дійсною протягом 24 годин.", - "opksshOpenBrowser": "Відкрити браузер для аутентифікації", - "opksshWaitingForAuth": "Очікування аутентифікації в браузері...", - "opksshAuthenticating": "Обробка автентифікації...", - "opksshTimeout": "Час аутентифікації минув. Будь ласка, спробуйте ще раз.", - "opksshAuthFailed": "Помилка авторизації. Будь ласка, перевірте свої облікові дані та спробуйте ще раз.", - "opksshSignInWith": "Увійти за допомогою {{provider}}", - "sudoPasswordPopupTitle": "Введіть пароль?", - "websocketAbnormalClose": "Помилка підключення скінчилося. Можливо це через незворотню проблему конфігурації проксі-сервера чи SSL. Будь ласка, перевірте журнали серверів.", - "connectionLogTitle": "Журнал з’єднання", - "connectionLogCopy": "Скопіювати логи в буфер обміну", - "connectionLogEmpty": "Журнал підключень поки немає", - "connectionLogWaiting": "Очікування логів підключення...", - "connectionLogCopied": "Журнал підключень скопійовано до буфера обміну", - "connectionLogCopyFailed": "Не вдалося скопіювати логи до буферу обміну", - "connectionRejected": "З'єднання відхилено сервером. Будь ласка, перевірте налаштування аутентифікації та мережі.", - "hostKeyRejected": "SSH-ключ хоста відхилено. Підключення скасовано.", - "sessionTakenOver": "Сесію було відкрито на іншій вкладці. Перепід'єднання..." + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "ВІДЧИНЕНО", + "linkDialogCopy": "Копіювати", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Розділити вкладку", + "addToSplit": "Додати до Спліта", + "removeFromSplit": "Видалити зі Спліта" + } }, "fileManager": { - "noHostSelected": "Не вибрано жодного хосту", - "initializingEditor": "Ініціалізація редактора...", - "file": "Файл", - "folder": "Тека", - "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": "Перейменувати", - "uploading": "Відвантаження...", - "uploadingFile": "Завантаження {{name}}...", - "fileName": "Назва файлу", - "folderName": "Ім'я папки", - "fileUploadedSuccessfully": "Файл \"{{name}}\" успішно завантажено", - "failedToUploadFile": "Не вдалося завантажити файл", - "fileDownloadedSuccessfully": "Файл \"{{name}}\" успішно завантажено", - "failedToDownloadFile": "Не вдалося завантажити файл", - "fileCreatedSuccessfully": "Файл \"{{name}}\" успішно створено", - "folderCreatedSuccessfully": "Теку \"{{name}}\" успішно створено", - "failedToCreateItem": "Не вдалося створити елемент", - "operationFailed": "Не вдалося виконати операцію {{operation}} для {{name}}: {{error}}", - "failedToResolveSymlink": "Не вдалося відкрити символічне посилання", - "itemsDeletedSuccessfully": "{{count}} елементів успішно видалено", - "failedToDeleteItems": "Не вдалося видалити елементи", - "sudoPasswordRequired": "Необхідно ввести пароль адміністратора", - "enterSudoPassword": "Введіть пароль sudo для продовження цієї операції", - "sudoPassword": "Пароль судо", - "sudoOperationFailed": "Не вдалося виконати операцію", - "sudoAuthFailed": "Помилка автентифікації Sudo", - "dragFilesToUpload": "Для завантаження перетягніть файли", - "emptyFolder": "Ця папка порожня", - "searchFiles": "Пошук файлів...", - "upload": "Вивантажити", - "selectHostToStart": "Виберіть хост для запуску керування файлами", - "sshRequiredForFileManager": "Файловий менеджер вимагає SSH. Цей хост не має включеного SSH.", - "failedToConnect": "Не вдалося підключитися до SSH", - "failedToLoadDirectory": "Не вдалося завантажити каталог", - "noSSHConnection": "Немає підключення до SSH", - "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}}?", - "permissionDenied": "Відмовлено у доступі", - "serverError": "Помилка сервера", - "fileSavedSuccessfully": "Файл успішно збережений", - "failedToSaveFile": "Не вдалося зберегти файл", - "confirmDeleteSingleItem": "Ви впевнені, що хочете остаточно видалити \"{{name}}\"?", - "confirmDeleteMultipleItems": "Ви впевнені, що хочете остаточно видалити {{count}} елементів?", - "confirmDeleteMultipleItemsWithFolders": "Ви дійсно бажаєте остаточно видалити {{count}} елементів? Це включає в себе теки та їх вміст.", - "confirmDeleteFolder": "Ви дійсно бажаєте остаточно видалити теку \"{{name}}\" і весь зміст?", - "permanentDeleteWarning": "Цю дію скасувати не можна. Будуть видалені з сервера.", - "recent": "Недавні", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Копіювати", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "Закріплено", - "folderShortcuts": "Скорочення для теки", - "failedToReconnectSSH": "Не вдалося повторно підключити SSH сесію", - "openTerminalHere": "Відкрити термінал тут", - "run": "Ран", - "openTerminalInFolder": "Відкрити термінал в цій теці", - "openTerminalInFileLocation": "Відкривати термінал в місці файлу", - "runningFile": "Працює - {{file}}", - "onlyRunExecutableFiles": "Можна запускати лише виконувані файли", - "directories": "Каталоги", - "removedFromRecentFiles": "Видалено \"{{name}}\" з останніх файлів", - "removeFailed": "Помилка видалення", - "unpinnedSuccessfully": "Відкріплений{{name}}\" успішно", - "unpinFailed": "Відкріпити не вдалося", - "removedShortcut": "Вилучено ярлик\"{{name}}\"", - "removeShortcutFailed": "Не вдалося видалити ярлик", - "clearedAllRecentFiles": "Видалені всі останні файли", - "clearFailed": "Очистити невдалі", - "removeFromRecentFiles": "Видалити з останніх файлів", - "clearAllRecentFiles": "Очистити всі нещодавні файли", - "unpinFile": "Відкріпити файл", - "removeShortcut": "Видалити ярлик", - "pinFile": "Закріпити файл", - "addToShortcuts": "Додати до ярликів", - "pasteFailed": "Вставити не вдалося", - "noUndoableActions": "Непридатні для дії", - "undoCopySuccess": "Операція видалення: Видалено скопійовані файли {{count}}", - "undoCopyFailedDelete": "Не вдалося скасувати. Не вдалося видалити скопійовані файли", - "undoCopyFailedNoInfo": "Не вдалося: Не вдалося знайти інформацію про скопійовані файли", - "undoMoveSuccess": "Скасовано операцію переміщення: Переміщено {{count}} файлів назад у початкове розташування", - "undoMoveFailedMove": "Помилка при скасуванні: Не вдалося перемістити файли назад", - "undoMoveFailedNoInfo": "Помилка скидання: Не вдалося знайти інформацію про переміщений файл", - "undoDeleteNotSupported": "Операція видалення не може бути скасована: файли були остаточно видалені з сервера", - "undoTypeNotSupported": "Непідтримуваний тип операції скасування", - "undoOperationFailed": "Не вдалося виконати операцію відміни", - "unknownError": "Невідома помилка", - "confirm": "Підтвердити", - "find": "Знайти...", - "replace": "Заміняти", - "downloadInstead": "Завантажити натомість", - "keyboardShortcuts": "Комбінації клавіш", - "searchAndReplace": "Пошук і заміна", - "editing": "Редагування", - "search": "Пошук", - "findNext": "Знайти наступне", - "findPrevious": "Знайти попереднє", - "save": "Зберегти", - "selectAll": "Виділити все", - "undo": "Скасувати", - "redo": "Повторити дію", - "moveLineUp": "Перемістити рядок вгору", - "moveLineDown": "Перемістити рядок вниз", - "toggleComment": "Перемкнути коментар", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Бігти", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", "autoComplete": "Auto Complete", - "imageLoadError": "Не вдалося завантажити зображення", - "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": "Створити файл", - "successfullyMovedItems": "Записи успішно переміщено {{count}} на {{target}}", - "move": "Пересунути", - "searchInFile": "Пошук у файлі (Ctrl+F)", - "showKeyboardShortcuts": "Показувати комбінації клавіш", - "startWritingMarkdown": "Почніть записувати вміст markdown...", - "loadingFileComparison": "Завантаження порівняння файлів...", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Перемістити", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", "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": "Змінити дозволи для додатку", - "currentPermissions": "Наявні дозволи", - "owner": "Власник", - "group": "Група", - "others": "Інші", - "read": "Прочитано", - "write": "Записати", - "execute": "Виконати", - "permissionsChangedSuccessfully": "Дозволи успішно змінено", - "failedToChangePermissions": "Не вдалося змінити дозволи", - "name": "Ім'я", - "sortByName": "Ім'я", - "sortByDate": "Дата зміни", - "sortBySize": "Розмір", - "ascending": "За зростанням", - "descending": "За спаданням", - "root": "Корінь", - "new": "Новий", - "sortBy": "Сортувати за", - "items": "Елементи", - "selected": "Вибрано", - "editor": "Редактор", - "octal": "Окталь", - "storage": "Сховище", - "disk": "Диск", - "used": "Використано", - "of": "з", - "toggleSidebar": "Перемикач бічної панелі", - "cannotLoadPdf": "Не вдалося завантажити PDF", - "pdfLoadError": "При завантаженні цього PDF-файлу сталася помилка.", - "loadingPdf": "Завантаження PDF...", - "loadingPage": "Завантаження сторінки..." + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", + "new": "New", + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "Копіювати на хост…", - "moveToHost": "Перемістити на хост…", - "copyItemsToHost": "Копіювати елементи {{count}} для розміщення…", - "moveItemsToHost": "Перемістити {{count}} елементів на хост…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Інших хостів файлових менеджерів немає.", "noHostsConnectedHint": "Додайте ще один SSH-хост з увімкненим файловим менеджером у Host Manager.", "selectDestinationHost": "Виберіть хост призначення", @@ -1164,48 +1360,48 @@ "browseDestination": "Переглянути або ввести шлях", "confirmCopy": "Копіювати", "confirmMove": "Перемістити", - "transferring": "Перенесення…", - "compressing": "Стиснення…", - "extracting": "Видобування…", - "transferringItems": "Перенесення {{current}} з {{total}} елементів…", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Перенесення завершено", "transferError": "Передача не вдалася", - "transferPartial": "Перенесення завершено з {{count}} помилками", - "transferPartialHint": "Не вдалося перенести: {{paths}}", - "itemsSummary": "{{count}} елементів", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Для перенесення кількох елементів місцем призначення має бути каталог", "selectThisFolder": "Виберіть цю папку", "browsePathWillBeCreated": "Цієї папки ще не існує. Вона буде створена, коли розпочнеться передача.", "browsePathError": "Не вдалося відкрити цей шлях на хості призначення.", "goUp": "Піднімися", - "copyFolderToHost": "Копіювати папку на хост…", - "moveFolderToHost": "Перемістити папку на хост…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "Готовий", - "hostConnecting": "Підключення…", + "hostConnecting": "Connecting…", "hostDisconnected": "Не підключено", "hostAuthRequired": "Потрібна автентифікація — спочатку відкрийте Файловий менеджер на цьому хості", "hostConnectionFailed": "Помилка підключення", "metricsTitle": "Час пересадки", - "metricsPrepare": "Підготувати пункт призначення: {{duration}}", - "metricsCompress": "Стиснути у вихідному коді: {{duration}}", - "metricsHopSourceRead": "Джерело → сервер: {{throughput}}", - "metricsHopDestSftpWrite": "Сервер → призначення (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Сервер → призначення (локальний): {{throughput}}", - "metricsTransfer": "Від кінця до кінця: {{throughput}} ({{duration}})", - "metricsExtract": "Вилучити в місці призначення: {{duration}}", - "metricsSourceDelete": "Видалити з джерела: {{duration}}", - "metricsTotal": "Всього: {{duration}}", - "progressCompressing": "Стиснення на вихідному хості…", - "progressExtracting": "Видобування в місці призначення…", - "progressTransferring": "Передача даних…", - "progressReconnecting": "Повторне підключення…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Паралельні пересадочні смуги", - "parallelSegmentsOption": "{{count}} смуги", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Великі файли розділяються на фрагменти по 256 МБ. Кілька ліній використовують окремі з’єднання (наприклад, запуск кількох передач) для підвищення загальної пропускної здатності.", - "progressTotalSpeed": "{{speed}} всього ({{lanes}} смуг)", - "progressTransferringItems": "Передача файлів ({{current}} з {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} файли", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Вихідні файли збережено (часткове перенесення)", "jumpHostLimitation": "Обидва хости мають бути доступні з сервера Termix. Пряма маршрутизація між хостами не підтримується.", "cancel": "Скасувати", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Вибирає tar-файл або SFTP для кожного файлу на основі кількості файлів, розміру та стискальності. Окремі файли завжди використовують потоковий SFTP.", "methodTarHint": "Стиснення у вихідному коді, перенесення одного архіву, розпакування у кінцевому. Потрібен tar-архів на обох хостах Unix.", "methodItemSftpHint": "Передавайте кожен файл окремо через SFTP. Працює на всіх хостах, включаючи Windows.", - "methodPreviewLoading": "Розрахунок методу переказу…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Не вдалося переглянути метод передачі. Сервер все одно вибере метод під час запуску.", "methodPreviewWillUseTar": "Буде використано: архів Tar", "methodPreviewWillUseItemSftp": "Буде використовуватися: SFTP для кожного файлу", - "methodPreviewScanSummary": "{{fileCount}} файлів, {{totalSize}} всього (проскановано на вихідному хості).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Кожен файл використовує той самий потік SFTP, що й копія окремого файлу, послідовно. Прогрес об'єднується для всіх файлів, тому шкала рухається повільно під час роботи з великими файлами.", "methodReason": { "user_item_sftp": "Ви обрали SFTP для кожного файлу.", "user_tar": "Ви обрали tar-архів.", "tar_unavailable": "Архів TAR недоступний на одному або обох хостах — замість нього використовуватиметься SFTP для кожного файлу.", "windows_host": "Задіяний хост Windows — tar не використовується.", - "auto_multi_large": "Авто: кілька файлів, включаючи великий файл ({{largestSize}}) зі стисливими даними — tar-пакети об'єднуються в одну передачу.", - "auto_single_large_in_archive": "Авто: один великий файл ({{largestSize}}) у цьому наборі — SFTP для кожного файлу.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Авто: переважно нестисливі дані — SFTP для кожного файлу.", - "auto_many_files": "Авто: багато файлів ({{fileCount}}) — tar зменшує навантаження на кожен файл.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Авто: SFTP для кожного файлу для цього набору." }, "progressCancel": "Скасувати", - "progressCancelling": "Скасування…", + "progressCancelling": "Cancelling…", "progressStalled": "Зупинився", "resumedHint": "Повторне підключення до активної передачі, розпочатої в іншому вікні.", "transferCancelled": "Переказ скасовано", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "На місці призначення збережено частку даних. Повторна спроба відновиться після відновлення з’єднання." }, "tunnels": { - "noSshTunnels": "Немає SSH тунелів", - "createFirstTunnelMessage": "Ви ще не створили жодних тунелів SSH. Налаштуйте тунельні з'єднання в хості менеджері.", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "Підключено", - "disconnected": "Від’єднано", - "connecting": "З’єднання...", - "error": "Помилка", - "canceling": "Скасування...", - "connect": "Підключитися", - "disconnect": "Від'єднатись", + "disconnected": "Відключено", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", "cancel": "Скасувати", - "port": "Порт", - "localPort": "Локальний порт", - "remotePort": "Віддалений порт", - "currentHostPort": "Поточний порт хоста", - "endpointPort": "Порт кінцевої точки", - "bindIp": "Локальний IP", - "endpointSshConfig": "Налаштування SSH кінцевої точки", - "endpointSshHost": "SSH хост кінцевої точки", - "endpointSshHostPlaceholder": "Оберіть налаштований хост", - "endpointSshHostRequired": "Вибрати SSH кінцевої точки для кожного клієнтського тунелю.", - "attempt": "Спроба {{current}} від {{max}}", - "nextRetryIn": "Наступна спроба через {{seconds}} секунд", - "clientTunnels": "Тунелі клієнта", - "clientTunnel": "Тунель клієнта", - "addClientTunnel": "Додати тунель клієнта", - "noClientTunnels": "Немає клієнтських тунелів, налаштованих на цьому робочому столі.", - "tunnelName": "Назва тунелю", - "remoteHost": "Віддалений хост", - "autoStart": "Авто старт", - "clientAutoStartDesc": "Починається коли цей настільний клієнт відкривається і залишається підключеним.", - "clientManualStartDesc": "Використовуйте старт і зупинку для цього рядка. Термікс не відкриє його автоматично.", - "clientRemoteServerNote": "Віддалене пересилання може вимагати обмеження TcpForwarding і GatewayPorts на кінцевому сервері SSH. Віддалений порт закриється, коли цей комп'ютер відключається.", - "clientTunnelStarted": "Тунель клієнта запущено", - "clientTunnelStopped": "Тунель клієнта зупинено", - "tunnelTestSucceeded": "Тунельний тест пройшов успішно", - "tunnelTestFailed": "Помилка тесту Тунелю", - "localSaved": "Тунелі клієнта збережено", - "localSaveError": "Не вдалося зберегти локальні тунелі клієнта", - "invalidBindIp": "Локальний IP повинен бути дійсною адресою IPv4.", - "invalidLocalTargetIp": "Локальний цільовий IP повинен бути дійсною адресою IPv4.", - "invalidLocalPort": "Локальний порт має бути від 1 до 65535.", - "invalidRemotePort": "Віддалений порт має бути від 1 до 65535.", - "invalidLocalTargetPort": "Локальний цільовий порт має бути від 1 до 65535.", - "invalidEndpointPort": "Порт кінцевої точки має бути від 1 до 65535.", - "duplicateAutoStartBind": "Лише один автостарт тунель може використовувати {{bind}}.", - "manualControlError": "Не вдалося оновити стан тунелю.", - "active": "Активний", - "start": "Старт", - "stop": "Зупинити", - "test": "Тест", - "type": "Тип тунелю", - "typeLocal": "Локальний (-L)", - "typeRemote": "Віддалений (-R)", - "typeDynamic": "Динамічний (-D)", - "typeServerLocalDesc": "Поточний хост до кінцевої точки.", - "typeServerRemoteDesc": "Повернення до поточного хосту.", - "typeClientLocalDesc": "Локальний комп'ютер для кінцевої точки.", - "typeClientRemoteDesc": "Повернення вихідної точки до локального комп'ютера.", - "typeClientDynamicDesc": "SOCKS на локальному комп'ютері.", - "typeDynamicDesc": "Forward SOCKS5 підключити трафік через SSH", - "forwardDescriptionServerLocal": "Поточний хост {{sourcePort}} → кінцеву точку {{endpointPort}}.", - "forwardDescriptionServerRemote": "Кінцева точка {{endpointPort}} → поточний хост {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS на цьому хості {{sourcePort}}.", - "forwardDescriptionClientLocal": "Локальний {{sourcePort}} → віддалене {{endpointPort}}.", - "forwardDescriptionClientRemote": "Віддалене {{sourcePort}} → локальне {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS на локальному порту {{sourcePort}}.", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "Add Client Tunnel", + "noClientTunnels": "No client tunnels configured on this desktop.", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS через {{endpoint}}", - "autoNameClientLocal": "Локальний {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → локальна {{localPort}}", - "autoNameClientDynamic": "SOCKS {{localPort}} через {{endpoint}}", - "route": "Рейс:", - "lastStarted": "Останній початок", - "lastTested": "Останнє тестування", - "lastError": "Остання помилка", - "maxRetries": "Кількість спроб", - "maxRetriesDescription": "Максимальна кількість спроб повторної спроби.", - "retryInterval": "Інтервал повтору (секунди)", - "retryIntervalDescription": "Час очікування між спробами повторити спробу.", - "local": "Місцевий", - "remote": "Пульт", - "destination": "Пункт призначення", - "host": "Хост", - "mode": "Режим", - "noHostSelected": "Не вибрано жодного хосту", - "working": "Працює..." + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { - "cpu": "ЦП", - "memory": "Пам'ять", - "disk": "Диск", - "network": "Мережа", - "uptime": "Час роботи", - "processes": "Процеси", - "available": "Доступно", - "free": "Безкоштовно", - "connecting": "З’єднання...", - "connectionFailed": "Не вдалося підключитися до сервера", - "naCpus": "N/A ЦП", - "cpuCores_one": "{{count}} Ядро", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "Використання ЦП", - "memoryUsage": "Використання пам'яті", - "diskUsage": "Використання диску", - "failedToFetchHostConfig": "Не вдалося отримати налаштування хосту", - "serverOffline": "Сервер не в мережі", - "cannotFetchMetrics": "Не вдається отримати метрики з сервера офлайн", - "totpFailed": "Збій верифікації TOTP", - "noneAuthNotSupported": "Статистика сервера не підтримує тип аутентифікації.", - "load": "Загрузити", - "systemInfo": "Інформація про систему", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", "hostname": "Hostname", - "operatingSystem": "Операційна система", - "kernel": "Ядро", - "seconds": "секунди", - "networkInterfaces": "Мережеві інтерфейси", - "noInterfacesFound": "Не знайдено інтерфейсів мережі", - "noProcessesFound": "Процесів не знайдено", - "loginStats": "Статистика входу SSH", - "noRecentLoginData": "Немає останніх даних для входу", - "executingQuickAction": "Виконання {{name}}...", - "quickActionSuccess": "{{name}} успішно завершено", - "quickActionFailed": "{{name}} не вдалося", - "quickActionError": "Не вдалося виконати {{name}}", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Прослуховування портів", - "protocol": "Protocol", - "port": "Порт", - "address": "Адреса", - "process": "Процес", - "noData": "Немає прослуховування портів" + "title": "Listening Ports", + "protocol": "Протокол", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "Брандмауер", - "inactive": "Неактивний", - "policy": "Політика", - "rules": "правила", - "noData": "Дані брандмауера відсутні", - "action": "Дія", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "Порт", - "source": "Джерело", - "anywhere": "Будь-де" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "Завантажити Avg", - "swap": "Поміняти", - "architecture": "Архітектура", - "refresh": "Оновити", - "retry": "Повторити спробу" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "Повторити спробу", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Бігти", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Власне керування SSH та віддаленим робочим столом", - "loginTitle": "Увійти до Termix", - "registerTitle": "Створити обл. запис", - "forgotPassword": "Забули пароль?", - "rememberMe": "Запам'ятати пристрій за 30 днів (включає TOTP)", - "noAccount": "Ще не зареєстровані?", - "hasAccount": "Вже маєте обліковий запис?", - "twoFactorAuth": "Двофакторна автентифікація", - "enterCode": "Введіть код підтвердження", - "backupCode": "Або використайте резервний код", - "verifyCode": "Код перевірки", - "redirectingToApp": "Перенаправлення до програми...", - "sshAuthenticationRequired": "Необхідна SSH-аутентифікація", - "sshNoKeyboardInteractive": "Ключова інтерактивна автентифікація не доступна", - "sshAuthenticationFailed": "Помилка аутентифікації", - "sshAuthenticationTimeout": "Таймаут автентифікації", - "sshNoKeyboardInteractiveDescription": "Сервер не підтримує автентифікацію за допомогою клавіатури. Введіть свій пароль чи SSH ключ.", - "sshAuthFailedDescription": "Надані облікові дані були невірні. Будь ласка, спробуйте ще раз із дійсними обліковими даними.", - "sshTimeoutDescription": "Час входу минув. Будь ласка, спробуйте ще раз.", - "sshProvideCredentialsDescription": "Будь ласка, надайте свої дані SSH для підключення до цього сервера.", - "sshPasswordDescription": "Введіть пароль для цього SSH підключення.", - "sshKeyPasswordDescription": "Якщо ваш SSH ключ зашифровано, введіть кодову фразу тут.", - "passphraseRequired": "Потрібна кодова фраза", - "passphraseRequiredDescription": "Ключ SSH зашифровано. Введіть секретну фразу, щоб розблокувати його.", - "back": "Відмінити", - "firstUser": "Перший користувач", - "firstUserMessage": "Ви перший користувач і буде створений адміністратором. Ви можете переглянути налаштування адміністратора в випадаючому списку для бічної панелі. Якщо ви думаєте, що це помилка, перевірте журнал докерів, або створіть проблему на GitHub.", - "external": "Зовнішній", - "loginWithExternal": "Увійти за допомогою зовнішнього постачальника", - "loginWithExternalDesc": "Увійдіть, використовуючи налаштованого постачальника зовнішньої ідентифікації", - "externalNotSupportedInElectron": "В даний час зовнішня аутентифікація не підтримується цією програмою. Використовуйте веб-версію для входу на OIDC.", - "resetPasswordButton": "Скидання пароля", - "sendResetCode": "Надіслати код скидання", - "resetCodeDesc": "Введіть ваше ім'я користувача, щоб отримати код скидання пароля. Код буде входити в журнали контейнерів докера.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", "resetCode": "Reset Code", - "verifyCodeButton": "Код перевірки", - "enterResetCode": "Введіть 6-значний код із логів контейнерів для користувача:", - "newPassword": "Новий пароль", - "confirmNewPassword": "Підтвердити пароль", - "enterNewPassword": "Введіть новий пароль для користувача:", - "signUp": "Зареєструватися", - "desktopApp": "Стільничний додаток", - "loggingInToDesktopApp": "Вхід до настільної програми", - "loadingServer": "Завантаження сервера...", - "dataLossWarning": "Скидання пароля таким чином видалить всі збережені хости SSH, облікові дані та інші зашифровані дані. Цю дію не можна скасувати. Використовуйте цю дію, якщо ви забули свій пароль і не ввійшли.", - "authenticationDisabled": "Автентифікація відключена", - "authenticationDisabledDesc": "Усі методи автентифікації зараз вимкнено. Будь ласка, зверніться до адміністратора.", - "attemptsRemaining": "Залишилося спроб {{count}}" + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Перевірити SSH ключ хоста", - "keyChangedWarning": "SSH ключ хоста змінено", - "firstConnectionTitle": "вперше при підключенні до цього хосту", - "firstConnectionDescription": "Неможливо встановити автентифікацію цього хоста. Перевірте, чи збігається ваш запит.", - "keyChangedDescription": "Ключ хоста для цього сервера було змінено після вашого останнього підключення. Це може означати проблему безпеки.", - "previousKey": "Попередній ключ", - "newFingerprint": "Новий відбиток пальця", - "fingerprint": "Відбиток пальця", - "verifyInstructions": "Щоб продовжити і зберегти цей відбиток для майбутніх з'єднань, натисніть кнопку \"Прийняти\".", - "securityWarning": "Попередження системи безпеки", - "acceptAndContinue": "Прийняти та продовжити", - "acceptNewKey": "Прийняти новий ключ і продовжити" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Не вдалося підключитися до бази даних", - "unknownError": "Невідома помилка", - "loginFailed": "Помилка входу в систему", - "failedPasswordReset": "Не вдалося ініціювати скидання пароля", - "failedVerifyCode": "Не вдалося перевірити код скидання", - "failedCompleteReset": "Не вдалося виконати скидання пароля", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", "invalidTotpCode": "Invalid TOTP code", - "failedOidcLogin": "Не вдалося запустити OIDC логін", - "silentSigninOidcUnavailable": "Вхід без звуку, було запитано, але логін OIDC недоступний.", - "failedUserInfo": "Не вдалося отримати дані користувача після входу", - "oidcAuthFailed": "Помилка автентифікації OIDC", - "invalidAuthUrl": "Неприпустима URL-адреса авторизації, отримана від backend", - "requiredField": "Це поле обов'язкове для заповнення", - "minLength": "Мінімальна довжина {{min}}", - "passwordMismatch": "Паролі не збігаються", - "passwordLoginDisabled": "Ім'я користувача/пароль в даний час відключені", - "sessionExpired": "Сесія минула - будь ласка, увійдіть знову", - "totpRateLimited": "Обмеження частоти: занадто багато спроб перевірки TOTP. Будь ласка, спробуйте ще раз пізніше.", - "totpRateLimitedWithTime": "Обмеження частоти пошуку. Занадто багато спроб перевірки TOTP. Будь ласка, зачекайте {{time}} секунд перед повторною спробою.", - "resetCodeRateLimited": "Обмеження частоти підтвердження. Будь ласка, спробуйте ще раз пізніше.", - "resetCodeRateLimitedWithTime": "Обмеження частоти: занадто багато спроб підтвердження. Будь ласка, зачекайте {{time}} секунд, перш ніж повторювати спробу.", - "authTokenSaveFailed": "Не вдалося зберегти маркер автентифікації", - "failedToLoadServer": "Не вдалося завантажити сервер" + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "Адміністратор вимкнув реєстрацію нового облікового запису. Будь ласка, увійдіть або зверніться до адміністратора.", - "userNotAllowed": "Ваш обліковий запис не дозволено реєструватися. Будь ласка, зверніться до адміністратора.", - "databaseConnectionFailed": "Не вдалося підключитися до сервера бази даних", - "resetCodeSent": "Код скидання надіслано до логів Docker", - "codeVerified": "Код успішно перевірено", - "passwordResetSuccess": "Пароль успішно скинуто", - "loginSuccess": "Вхід вдало виконано", - "registrationSuccess": "Реєстрація пройшла успішно" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "Тунелі локального комп'ютера налаштовані SSH хости.", - "c2sTunnelPresets": "Пресети тунелів клієнта", - "c2sTunnelPresetsDesc": "Збережіть локальний список тунелів для цього комп'ютера в якості пресету сервера або завантажте пресет назад до цього клієнта.", - "c2sTunnelPresetsUnavailable": "Шаблони клієнтського тунелю доступні лише в стільничному клієнті.", - "c2sPresetName": "Назва заданого параметра", - "c2sPresetNamePlaceholder": "Ім'я пресету клієнта", - "c2sPresetToLoad": "Пресет для завантаження", - "c2sNoPresetSelected": "Шаблони не вибрані", - "c2sNoPresets": "Немає збережених попередніх налаштувань", - "c2sLoadPreset": "Загрузити", - "c2sCurrentLocalConfig": "{{count}} локальний клієнт тунелі налаштований на цьому робочому столі.", - "c2sPresetSyncNote": "Пресети явні знімки; завантаження один замінює локальний список тунелів для клієнта.", - "c2sPresetSaved": "Налаштування клієнтського тунелю збережено", - "c2sPresetLoaded": "Налаштування клієнтського тунелю завантажені локально", - "c2sPresetRenamed": "Налаштування клієнтського тунелю перейменовано", - "c2sPresetDeleted": "Налаштування клієнтського тунелю видалено", - "c2sPresetLoadError": "Не вдалося завантажити налаштування тунелю для клієнта" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "Client tunnel preset renamed", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Мова:", - "keyPassword": "пароль ключа", - "pastePrivateKey": "Вставте свій приватний ключ тут...", - "localListenerHost": "127.0.1 (послухати локально)", - "localTargetHost": "127.0.0.1 (ціль на цьому комп'ютері)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "Введіть пароль", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Приладна дошка", - "loading": "Завантаження панелі...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Підтримка", + "support": "Support", "discord": "Discord", - "serverOverview": "Огляд сервера", - "version": "Версія", - "upToDate": "Теперішня версія", - "updateAvailable": "Доступне оновлення", - "beta": "Бета", - "uptime": "Час роботи", - "database": "База даних", - "healthy": "Здоровий", - "error": "Помилка", - "totalHosts": "Всього хостів", - "totalTunnels": "Всього тунелів", - "totalCredentials": "Загальна кількість облікових даних", - "recentActivity": "Остання активність", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", "reset": "Reset", - "loadingRecentActivity": "Завантаження недавньої діяльності...", - "noRecentActivity": "Нема недавньої активності", - "quickActions": "Швидкі дії", - "addHost": "Додати хост", - "addCredential": "Додати", - "adminSettings": "Адміністративні налаштування", - "userProfile": "Профіль користувача", - "serverStats": "Статистика на сервері", - "loadingServerStats": "Завантаження статистики сервера...", - "noServerData": "Немає даних про сервер", - "cpu": "ЦП", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", "ram": "RAM", - "customizeLayout": "Налаштування панелі", - "dashboardSettings": "Налаштування панелі", - "enableDisableCards": "Увімкнути/Вимкнути картки", - "resetLayout": "Відновити за замовчуванням", - "serverOverviewCard": "Огляд сервера", - "recentActivityCard": "Остання активність", - "networkGraphCard": "Графік мережі", - "networkGraph": "Графік мережі", - "quickActionsCard": "Швидкі дії", - "serverStatsCard": "Статистика на сервері", - "panelMain": "Основне", - "panelSide": "Сторона", - "justNow": "прямо зараз" + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "ВИМКНУТИ", - "hostsOnline": "Хости онлайн", - "activeTunnels": "Активні тунелі", - "registerNewServer": "Реєстрація нового сервера", - "storeSshKeysOrPasswords": "Зберігати SSH ключі або паролі", - "manageUsersAndRoles": "Управління користувачами і ролями", - "manageYourAccount": "Керувати вашим профілем", - "hostStatus": "Статус хоста", - "noHostsConfigured": "Не налаштовано хостів", - "online": "У режимі онлайн", - "offline": "ЗАЛИШИТИ", + "stable": "STABLE", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", "onlineLower": "Онлайн", "nodes": "{{count}} nodes", - "add": "Додати:", - "commandPalette": "Командна палітра", - "done": "Виконано", - "editModeInstructions": "Перетягніть картки для зміни порядку · Перетягніть розділювач стовпців для зміни розмірів · Перетягніть нижній край картки для зміни розміру в їх висоту · Смітник для видалення", - "empty": "Порожньо", - "clear": "Очистити" + "add": "Add:", + "commandPalette": "Command Palette", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Копіювати", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Додати хост", - "addGroup": "Додати групу", - "addLink": "Додати посилання", - "zoomIn": "Збільшити масштаб", - "zoomOut": "Зменшити масштаб", - "resetView": "Скинути вигляд", - "selectHost": "Виберіть хост", - "chooseHost": "Виберіть хост...", - "parentGroup": "Батьківська група", - "noGroup": "Немає групи", - "groupName": "Назва групи", - "color": "Колір", - "source": "Джерело", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "Перемістити до групи", - "selectGroup": "Виберіть групу...", - "addConnection": "Додати контакти", - "hostDetails": "Деталі хоста", - "removeFromGroup": "Видалити з групи", - "addHostHere": "Додати хост сюди", - "editGroup": "Редагувати групу", - "delete": "Видалити", - "add": "Додати", - "create": "Створити", - "move": "Пересунути", - "connect": "Підключитися", - "createGroup": "Нова група", - "selectSourcePlaceholder": "Вибрати джерело...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Перемістити", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "Неприпустимий файл", - "hostAlreadyExists": "Хост вже в топології", - "connectionExists": "З'єднання вже існує", - "unknown": "Не вказано", - "name": "Ім'я", - "ip": "Адреса IP", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", "status": "Статус", - "failedToAddNode": "Не вдалося додати вузол", - "sourceDifferentFromTarget": "Джерело і ціль повинні бути різними", - "exportJSON": "Експортувати JSON", - "importJSON": "Імпорт JSON", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", "terminal": "Термінал", "fileManager": "Файловий менеджер", "tunnel": "Тунель", "docker": "Докер", - "serverStats": "Статистика на сервері", - "noNodes": "Вузли ще немає" + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "Docker вимкнений для цього хосту", - "validating": "Перевірка Docker...", - "connecting": "З’єднання...", - "error": "Помилка", - "version": "Докер {{version}}", - "connectionFailed": "Не вдалося підключитися до Docker", - "containerStarted": "Контейнер {{name}} запущено", - "failedToStartContainer": "Не вдалося почати контейнер {{name}}", - "containerStopped": "Контейнер {{name}} зупинено", - "failedToStopContainer": "Не вдалося зупинити контейнер {{name}}", - "containerRestarted": "Контейнер {{name}} перезапущено", - "failedToRestartContainer": "Не вдалося перезапустити контейнер {{name}}", - "containerPaused": "Контейнер {{name}} призупинено", - "containerUnpaused": "Контейнер {{name}} не призупинено", - "failedToTogglePauseContainer": "Не вдалося перемкнути режим паузи для контейнера {{name}}", - "containerRemoved": "Видалено контейнер {{name}}", - "failedToRemoveContainer": "Не вдалося видалити контейнер {{name}}", - "image": "Зображення", - "ports": "Порти", - "noPorts": "Немає портів", - "start": "Старт", - "confirmRemoveContainer": "Ви впевнені, що хочете видалити контейнер '{{name}}'? Цю дію неможливо скасувати.", - "runningContainerWarning": "Увага: цей контейнер зараз запущений. Видаляння його призведе до зупинки контейнера.", - "loadingContainers": "Завантаження контейнерів...", - "manager": "Менеджер Docker", - "autoRefresh": "Автоматичне оновлення", - "timestamps": "Відмітки часу", - "lines": "Лінії", - "filterLogs": "Фільтрувати журнали...", - "refresh": "Оновити", - "download": "Звантажити", - "clear": "Очистити", - "logsDownloaded": "Журнали успішно завантажено", - "last50": "Останні 50", - "last100": "Останні 100", - "last500": "Останні 500", - "last1000": "Останні 1000", - "allLogs": "Всі логи", - "noLogsMatching": "Немає журналів, що відповідають \"{{query}}\"", - "noLogsAvailable": "Немає записів у журналі", - "noContainersFound": "Контейнери не знайдено", - "noContainersFoundHint": "Немає Docker контейнерів для цього хосту", - "searchPlaceholder": "Пошук контейнерів...", - "allStatuses": "Всі статуси", - "stateRunning": "Біг", - "statePaused": "Призупинено", - "stateExited": "Вихід", - "stateRestarting": "Перезавантаження", - "noContainersMatchFilters": "Не знайдено контейнерів з вашими фільтрами", - "noContainersMatchFiltersHint": "Спробуйте налаштувати умови пошуку або фільтра", - "failedToFetchStats": "Не вдалося отримати статистику контейнерів", - "containerNotRunning": "Контейнер не запущений", - "startContainerToViewStats": "Запустити контейнер для перегляду статистики", - "loadingStats": "Завантаження статистики...", - "errorLoadingStats": "Помилка при завантаженні статистики", - "noStatsAvailable": "Немає статистичних даних", - "cpuUsage": "Використання ЦП", - "current": "Поточна версія", - "memoryUsage": "Використання пам'яті", - "networkIo": "Мережевий ввід/вивід", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", + "version": "Docker {{version}}", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", "input": "Input", - "output": "Вихід", - "blockIo": "Заблокувати вводу-виводу", - "read": "Прочитано", - "write": "Записати", - "pids": "PID", - "containerInformation": "Інформація про контейнер", - "name": "Ім'я", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "Держава", - "containerMustBeRunning": "Контейнер повинен виконуватися для доступу до консолі", - "verificationCodePrompt": "Введіть код підтвердження", - "totpVerificationFailed": "TOTP підтвердження не вдалося. Будь ласка, спробуйте ще раз.", - "warpgateVerificationFailed": "Спроба розпізнавання warpgate не вдалася. Будь ласка, спробуйте ще раз.", - "connectedTo": "Підключено до {{containerName}}", - "disconnected": "Від’єднано", - "consoleError": "Консольна помилка", - "errorMessage": "Помилка: {{message}}", - "failedToConnect": "Не вдалося підключитися до контейнера", - "console": "Консоль", - "selectShell": "Виберіть оболонку", - "bash": "Баш", - "sh": "висока", - "ash": "попіл", - "connect": "Підключитися", - "disconnect": "Від'єднатись", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Відключено", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", + "bash": "Bash", + "sh": "sh", + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "Не підключено", - "clickToConnect": "Натисніть \"З'єднатися\" для запуску сеансу оболонки", - "connectingTo": "Підключення до {{containerName}}...", - "containerNotFound": "Контейнер не знайдено", - "backToList": "Назад до списку", - "logs": "Логи", - "stats": "Статистика", - "consoleTab": "Консоль", - "startContainerToAccess": "Запустити контейнер для доступу до консолі" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Загальні налаштування", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Спільноти", - "sectionSessions": "Сеанси", - "sectionRoles": "Ролі", - "sectionDatabase": "База даних", - "sectionApiKeys": "Ключі API", - "allowRegistration": "Дозволити реєстрацію нових користувачів", - "allowRegistrationDesc": "Дозволити власноруч реєструватися новим користувачам", - "allowPasswordLogin": "Дозволити введення пароля", - "allowPasswordLoginDesc": "Ім'я користувача/пароль", - "oidcAutoProvision": "Автоматичне забезпечення OIDC", - "oidcAutoProvisionDesc": "Автостворення облікових записів для користувачів OIDC, навіть при відключенні реєстрації", - "allowPasswordReset": "Дозволити скидання пароля", - "allowPasswordResetDesc": "Скинути код через журнали Docker", - "sessionTimeout": "Таймаут сеансу", - "hours": "годин", - "sessionTimeoutRange": "Мін 1 год · Максимум 720Н", - "monitoringDefaults": "Моніторинг за замовчуванням", - "statusCheck": "Перевірка стану", - "metrics": "Метрика", - "sec": "сек", - "logLevel": "Рівень журналювання", - "enableGuacamole": "Увімкнути Guacamole", - "enableGuacamoleDesc": "RDP/VNC віддалений робочий стіл", - "guacdUrl": "посилання на гуакд", - "oidcDescription": "Налаштувати OpenID Connect для SSO. Поля позначені * обов'язкові для SSO.", - "oidcClientId": "ID клієнта", - "oidcClientSecret": "Секретний ключ", - "oidcAuthUrl": "URL авторизації", - "oidcIssuerUrl": "Адреса емітента", - "oidcTokenUrl": "URL токену", - "oidcUserIdentifier": "Ідентифікатор користувача", - "oidcDisplayName": "Відображення шляху до імені", - "oidcScopes": "Області використання", - "oidcUserinfoUrl": "Змінити URL інформації користувача", - "oidcAllowedUsers": "Дозволені користувачі", - "oidcAllowedUsersDesc": "Один лист на рядок. Залиште порожнім, щоб дозволити всіх.", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "Sessions", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Очистити фільтри", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Статус", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC Auto-Provision", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", + "allowPasswordResetDesc": "Reset code via Docker logs", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", + "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", "removeOidc": "Видалити", - "usersCount": "Користувач {{count}}", - "createUser": "Створити", - "newRole": "Нова роль", - "roleName": "Ім'я", - "roleDisplayName": "Ім'я для відображення", - "roleDescription": "Опис", - "rolesCount": "Ролі {{count}}", - "createRole": "Створити", - "creating": "Створюю...", - "exportDatabase": "Експорт бази даних", - "exportDatabaseDesc": "Завантажити резервну копію всіх вузлів, облікових даних та налаштувань", - "export": "Експорт", - "exporting": "Експорт...", - "importDatabase": "Імпорт бази даних", - "importDatabaseDesc": "Відновити з файлу резервної копії .sqlite", - "importDatabaseSelected": "Вибрано: {{name}}", - "selectFile": "Виберіть файл", - "changeFile": "Змінити", - "import": "Імпорт", - "importing": "Імпорт...", - "apiKeysCount": "Клавіші {{count}}", - "newApiKey": "Новий API ключ", - "apiKeyCreatedWarning": "Ключ створено - скопіюйте його зараз, його не буде показано знову.", - "apiKeyName": "Ім'я", - "apiKeyUser": "Користувач", - "apiKeySelectUser": "Виберіть користувача...", - "apiKeyExpiresAt": "Завершується в", - "createKey": "Виготовити ключ", - "apiKeyNoExpiry": "Немає терміну дії", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "Name", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "Подвійна Авторизація", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Місцевий", - "adminStatusAdministrator": "Адміністратор", - "adminStatusRegularUser": "Звичайний користувач", - "adminBadge": "АДМІНА", - "systemBadge": "СИС", - "customBadge": "КОРИСТУВАЦЬКА", - "youBadge": "ВИ", - "sessionsActive": "Активний {{count}}", - "sessionActive": "Активний: {{time}}", - "sessionExpires": "Термін дії: {{time}}", - "revokeAll": "Всі", - "revokeAllSessionsSuccess": "Всі сеанси для користувача відкликано", - "revokeAllSessionsFailed": "Не вдалося скасувати сеанси", - "revokeSessionFailed": "Не вдалося видалити сесію", - "addRole": "Додати роль", - "noCustomRoles": "Користувацькі ролі не визначені", - "removeRoleFailed": "Не вдалося видалити роль", - "assignRoleFailed": "Не вдалося призначити роль", - "deleteRoleFailed": "Не вдалося видалити роль", - "userAdminAccess": "Адміністратор", - "userAdminAccessDesc": "Повний доступ до всіх налаштувань адміністратора", - "userRoles": "Ролі", - "revokeAllUserSessions": "Скасувати всі сеанси", - "revokeAllUserSessionsDesc": "Примусовий повторний вхід на всіх пристроях", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", + "adminBadge": "ADMIN", + "systemBadge": "SYS", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", + "sessionExpires": "Exp: {{time}}", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "Видалення цього користувача є незворотнім.", - "deleteUser": "Видалити {{username}}", - "deleting": "Видалення...", - "deleteUserFailed": "Не вдалося вилучити користувача", - "deleteUserSuccess": "Користувача \"{{username}}\" видалено", - "deleteRoleSuccess": "Роль \"{{name}}\" видалена", - "revokeKeySuccess": "Ключ \"{{name}}відкликано", - "revokeKeyFailed": "Не вдалося відкликати ключ", - "copiedToClipboard": "Скопійовано до буферу обміну", - "done": "Виконано", - "createUserTitle": "Створити користувача", - "createUserDesc": "Створити новий локальний обліковий запис.", - "createUserUsername": "Ім'я користувача", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", + "createUserDesc": "Create a new local account.", + "createUserUsername": "Username", "createUserPassword": "Пароль", - "createUserPasswordHint": "Мінімум 6 символів.", - "createUserEnterUsername": "Введіть ім'я користувача", - "createUserEnterPassword": "Уведіть пароль", - "createUserSubmit": "Створити користувача", - "editUserTitle": "Керування користувачем: {{username}}", - "editUserDesc": "Редагування ролей, статус, сесій та налаштувань облікового запису.", - "editUserUsername": "Ім'я користувача", + "createUserPasswordHint": "Minimum 6 characters.", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", + "editUserUsername": "Username", "editUserAuthType": "Тип автентифікації", - "editUserAdminStatus": "Статус адміністратора", - "editUserUserId": "ID користувача", - "linkAccountTitle": "Посилання OIDC до облікового запису пароля", - "linkAccountDesc": "Об’єднайте обліковий запис OIDC {{username}} з існуючим локальним обліковим записом.", - "linkAccountWarningTitle": "Це приведе до:", - "linkAccountEffect1": "Видалити обліковий запис тільки в OIDC-", - "linkAccountEffect2": "Додати OIDC логін до цільового облікового запису", - "linkAccountEffect3": "Дозволити логування OIDC та пароль", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "Введіть локальне ім'я користувача облікового запису, щоб прив'язати його до", - "linkAccounts": "Пов’язати облікові записи", - "linkAccountSuccess": "Обліковий запис OIDC, пов’язаний з «{{username}}»", - "linkAccountFailed": "Не вдалося підключити обліковий запис OIDC", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "Зв'язування...", - "saving": "Збереження...", - "updateRegistrationFailed": "Не вдалося оновити налаштування реєстрації", - "updatePasswordLoginFailed": "Не вдалося оновити параметри входу в гасло", - "updateOidcAutoProvisionFailed": "Не вдалося оновити параметр автозабезпечення OIDC", - "updatePasswordResetFailed": "Не вдалося оновити налаштування пароля", - "sessionTimeoutRange2": "Таймаут сесії має бути від 1 до 720 годин", - "sessionTimeoutSaved": "Тайм-аут сесії збережено", - "sessionTimeoutSaveFailed": "Не вдалося зберегти тайм-аут сесії", - "monitoringIntervalInvalid": "Невірне значення інтервалу", - "monitoringSaved": "Спостерігати за налаштуваннями збережено", - "monitoringSaveFailed": "Не вдалося зберегти налаштування моніторингу", - "guacamoleSaved": "Налаштування Guacamole збережено", - "guacamoleSaveFailed": "Не вдалося зберегти настройки Guacamole", - "guacamoleUpdateFailed": "Не вдалося оновити налаштування Guacamole", - "logLevelUpdateFailed": "Не вдалося оновити рівень журналу", - "oidcSaved": "Налаштування OIDC збережено", - "oidcSaveFailed": "Не вдалося зберегти конфігурацію OIDC", - "oidcRemoved": "Налаштування OIDC видалено", - "oidcRemoveFailed": "Не вдалося видалити конфігурацію OIDC", - "createUserRequired": "Ім'я користувача і пароль обов'язкові для заповнення", - "createUserPasswordTooShort": "Пароль повинен містити щонайменше 6 символів", - "createUserSuccess": "Користувача \"{{username}}\" створено", - "createUserFailed": "Не вдалося створити користувача", - "updateAdminStatusFailed": "Не вдалося оновити статус адміністратора", - "allSessionsRevoked": "Всі сесії відкликано", - "revokeSessionsFailed": "Не вдалося скасувати сеанси", - "createRoleRequired": "Ім'я та відображуване ім'я обов'язкові", - "createRoleSuccess": "Роль \" створена{{name}}\"", - "createRoleFailed": "Не вдалося створити роль", - "apiKeyNameRequired": "Потрібне ім'я ключа", - "apiKeyUserRequired": "Необхідний ID користувача", - "apiKeyCreatedSuccess": "Створено ключ API \"{{name}}\"", - "apiKeyCreateFailed": "Не вдалося створити ключ API", - "exportSuccess": "Базу даних успішно експортовано", - "exportFailed": "Не вдалося експортувати базу даних", - "importSelectFile": "Будь ласка, спочатку виберіть файл", - "importCompleted": "Імпорт завершено: імпортовано {{total}} елементів, пропущено {{skipped}}", - "importFailed": "Помилка імпорту: {{error}}", - "importError": "Не вдалося імпортувати базу даних" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Термінал", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "Хост", - "hostPlaceholder": "192.168.1.1 або приклад.com", - "portLabel": "Порт", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Ім'я користувача", - "usernamePlaceholder": "ім'я користувача", - "authLabel": "Авторизація", + "usernameLabel": "Username", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "Пароль", - "passwordPlaceholder": "пароль", - "privateKeyLabel": "Приватний ключ", - "privateKeyPlaceholder": "Вставити приватний ключ...", - "credentialLabel": "Облікові дані", - "credentialPlaceholder": "Оберіть збережені облікові дані", - "connectToTerminal": "Підключення до терміналу", - "connectToFiles": "Підключення до файлів" + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", + "privateKeyPlaceholder": "Paste private key...", + "credentialLabel": "Посвідчення", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", + "connectToFiles": "Connect to Files" }, "history": { - "noTerminalSelected": "Термінал не вибраний", - "noTerminalSelectedHint": "Відкрийте SSH термінал вкладки для перегляду історії команд", - "searchPlaceholder": "Пошук в історії...", - "clearAll": "Очистити все", - "noHistoryEntries": "Немає історії", - "trackingDisabled": "Відстеження історії вимкнено", - "trackingDisabledHint": "Увімкніть це в налаштуваннях вашого профілю для запису команд." + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "History tracking is disabled", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Кей запис", - "recordToTerminals": "Запис у термінали", - "selectAll": "Всі", - "selectNone": "Без ефекту", - "noTerminalTabsOpen": "Відсутні відкриті відкриті термінальні вкладки", - "selectTerminalsAbove": "Виберіть термінали вище", - "broadcastInputPlaceholder": "Введіть тут, щоб транслювати клавіші зі значками...", - "stopRecording": "Зупинити запис", - "startRecording": "Розпочати запис", - "settingsTitle": "Налаштування", - "enableRightClickCopyPaste": "Увімкнути копіювання/вставку правою кнопкою миші" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "Жоден", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "Макет", - "selectLayoutAbove": "Виберіть макет вище", - "selectLayoutHint": "Виберіть кількість панелей для відображення", - "panesTitle": "Панелі", - "openTabsTitle": "Відкрити вкладки", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "Перетягніть вкладки на панелі вище або скористайтеся функцією швидкого призначення", - "dropHere": "Перетягніть сюди", - "emptyPane": "Порожньо", - "dashboard": "Приладна дошка", - "clearSplitScreen": "Очистити розділений екран", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "Швидке призначення", - "alreadyAssigned": "Панель {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "Розділити вкладку", "addToSplit": "Додати до Спліта", "removeFromSplit": "Видалити зі Спліта", - "assignToPane": "Призначити панелі" + "assignToPane": "Призначити панелі", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Створити сніпет", - "createSnippetDescription": "Створити новий сніпет команди для швидкого виконання", - "nameLabel": "Ім'я", - "namePlaceholder": "наприклад, перезавантажити Нгінкс", - "descriptionLabel": "Опис", - "descriptionPlaceholder": "Необов'язковий опис", - "optional": "За бажанням", - "folderLabel": "Тека", - "noFolder": "Без теки (без категорії)", - "commandLabel": "Команда", - "commandPlaceholder": "наприклад, sudo systemctl restart nginx", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", "cancel": "Скасувати", - "createSnippetButton": "Створити сніпет", - "createFolderTitle": "Створити теку", - "createFolderDescription": "Організуйте ваші сніпети у папки", - "folderNameLabel": "Ім'я папки", - "folderNamePlaceholder": "наприклад, Системні Команди, Скрипти Docker", - "folderColorLabel": "Колір теки", - "folderIconLabel": "Іконка папки", - "previewLabel": "Прев'ю", - "folderNameFallback": "Ім'я папки", - "createFolderButton": "Створити теку", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Target Terminals", - "selectAll": "Всі", - "selectNone": "Без ефекту", - "noTerminalTabsOpen": "Відсутні відкриті відкриті термінальні вкладки", - "searchPlaceholder": "Пошук сніпетів...", - "newSnippet": "Новий сніпет", - "newFolder": "Нова папка", - "run": "Ран", - "noSnippetsInFolder": "Немає сніпетів у цій папці", - "uncategorized": "Без категорії", - "editSnippetTitle": "Редагувати сніпет", - "editSnippetDescription": "Оновити цей сніпет команди", - "saveSnippetButton": "Зберегти зміни", - "createSuccess": "Сніпет успішно створений", - "createFailed": "Не вдалося створити сніпет", - "updateSuccess": "Сніпет успішно оновлено", - "updateFailed": "Не вдалося оновити сніпет", - "deleteFailed": "Не вдалося видалити сніпет", - "folderCreateSuccess": "Теку успішно створено", - "folderCreateFailed": "Не вдалося створити теку", - "editFolderTitle": "Змінити теку", - "editFolderDescription": "Перейменувати або змінити вигляд цієї папки", - "saveFolderButton": "Зберегти зміни", - "editFolder": "Редагувати теку", - "deleteFolder": "Видалити папку", - "folderDeleteSuccess": "Теку \"{{name}}\" видалено", - "folderDeleteFailed": "Не вдалося вилучити теку", - "folderEditSuccess": "Папка успішно змінена", - "folderEditFailed": "Не вдалося оновити теку", - "confirmRunMessage": "Виконати \"{{name}}\"?", + "selectAll": "All", + "selectNone": "Жоден", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Бігти", + "noSnippetsInFolder": "No snippets in this folder", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "Бігти", - "runSuccess": "Виконано \"{{name}}\" у {{count}} терміналі(ах)", - "copySuccess": "Скопійовано \"{{name}}\" в буфер обміну", - "shareTitle": "Поділитися сніпетом", - "shareUser": "Користувач", - "shareRole": "Роль", - "selectUser": "Виберіть користувача...", - "selectRole": "Виберіть роль...", - "shareSuccess": "Сніпет успішно поділився", - "shareFailed": "Не вдалося поділитись сніпетом", - "revokeSuccess": "Доступ відкликаний", - "revokeFailed": "Не вдалося відкликати доступ", - "currentAccess": "Поточний доступ", - "shareLoadError": "Не вдалося завантажити дані обміну", - "loading": "Завантажується...", - "close": "Закрити", - "reorderFailed": "Не вдалося зберегти порядок фрагментів" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Не вдалося зберегти порядок фрагментів", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Обліковий запис", - "sectionAppearance": "Зовнішній вигляд", - "sectionSecurity": "Безпека", - "sectionApiKeys": "Ключі API", - "sectionC2sTunnels": "Налаштування C2S", - "usernameLabel": "Ім'я користувача", - "roleLabel": "Роль", - "roleAdministrator": "Адміністратор", - "authMethodLabel": "Метод автентифікації", - "authMethodLocal": "Місцевий", - "twoFaLabel": "двофакторна аутентифікація", - "twoFaOn": "Увімк", - "twoFaOff": "Вимкнено", - "versionLabel": "Версія", - "deleteAccount": "Видалити обліковий запис", - "deleteAccountDescription": "Остаточно видалити ваш обліковий запис", - "deleteButton": "Видалити", - "deleteAccountPermanent": "Ця дія постійна і її неможливо скасувати.", - "deleteAccountWarning": "Усі сеанси, хости, облікові дані та налаштування буде остаточно видалено.", - "confirmPasswordDeletePlaceholder": "Введіть пароль для підтвердження", - "languageLabel": "Мова:", - "themeLabel": "Тема", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S Tunnels", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "Local", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", "fontSizeLabel": "Font Size", - "accentColorLabel": "Колір акценту", + "accentColorLabel": "Accent Color", "settingsTerminal": "Термінал", - "commandAutocomplete": "Команду Автозаповнення", - "commandAutocompleteDesc": "Показати автодоповнення під час введення тексту", - "historyTracking": "Історія відстеження", - "historyTrackingDesc": "Відстежувати команди терміналу", - "syntaxHighlighting": "Підсвічування синтаксису", - "syntaxHighlightingDesc": "Видобуток терміналу", - "commandPalette": "Командна палітра", - "commandPaletteDesc": "Увімкнути гарячі клавіші", + "commandAutocomplete": "Command Autocomplete", + "commandAutocompleteDesc": "Show autocomplete while typing", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "Command Palette", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "Повторно відкривати вкладки після входу", "reopenTabsOnLoginDesc": "Відновлюйте відкриті вкладки після входу в систему або оновлення сторінки, навіть з іншого пристрою", - "confirmTabClose": "Підтвердити закриття вкладки", - "confirmTabCloseDesc": "Запитувати перед закриттям вкладок терміналу", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "Показати теги хостів", - "showHostTagsDesc": "Відображення тегів у списку хостів", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "Натисніть, щоб розгорнути дії хоста", "hostTrayOnClickDesc": "Завжди показувати кнопки підключення; натисніть, щоб розгорнути параметри керування, замість того, щоб наводити курсор на них.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Закріпити рейку додатків", "pinAppRailDesc": "Залишати ліву бічну панель програм завжди розгорнутою, а не при наведенні курсора", - "settingsSnippets": "Сніпети", - "foldersCollapsed": "Теки вилучені", - "foldersCollapsedDesc": "Згорнути теки за замовчуванням", - "confirmExecution": "Підтвердити виконання", - "confirmExecutionDesc": "Підтвердити перед запуском сніпетів", - "settingsUpdates": "Оновлення", - "disableUpdateChecks": "Вимкнути перевірку оновлень", - "disableUpdateChecksDesc": "Зупинити перевірку оновлень", - "totpAuthenticator": "Генератор TOTP", - "totpEnabled": "2FA увімкнена", - "totpDisabled": "Додати додатковий захист для входу", - "disable": "Вимкнено", - "enable": "Увімкнено", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "Скануйте QR-код або введіть секрет у вашому додатку для автентифікації, а потім введіть 6-значний код", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "Перевірити", - "changePassword": "Зміна пароля", - "currentPasswordLabel": "Поточний пароль", - "currentPasswordPlaceholder": "Поточний пароль", - "newPasswordLabel": "Новий пароль", - "newPasswordPlaceholder": "Новий пароль", - "confirmPasswordLabel": "Підтвердіть новий пароль", - "confirmPasswordPlaceholder": "Підвердіть новий пароль", - "updatePassword": "Оновити пароль", - "createApiKeyTitle": "Створити ключ API", - "createApiKeyDescription": "Створити новий ключ API для програмічного доступу.", - "apiKeyNameLabel": "Ім'я", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "необов'язково", + "optional": "optional", "cancel": "Скасувати", - "createKey": "Виготовити ключ", - "apiKeyCount": "Клавіші {{count}}", - "newKey": "Новий ключ", - "noApiKeys": "Немає API ключів.", - "apiKeyActive": "Активний", - "apiKeyUsageHint": "Додайте ключ до", - "apiKeyUsageHintHeader": "заголовок.", - "apiKeyPermissionsHint": "Ключі успадковують дозволи для створення користувача.", - "roleUser": "Користувач", - "authMethodDual": "Подвійна Авторизація", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Не вдалося запустити налаштування TOTP", - "totpEnter6Digits": "Введіть 6-значний код", - "totpEnabledSuccess": "Двофакторна аутентифікація увімкнена", - "totpInvalidCode": "Неприпустимий код, будь ласка, спробуйте ще раз", - "totpDisableInputRequired": "Введіть свій код TOTP або пароль", - "totpDisabledSuccess": "Двофакторна аутентифікація вимкнена", - "totpDisableFailed": "Не вдалося вимкнути 2FA", - "totpDisableTitle": "Вимкнути 2FA", - "totpDisablePlaceholder": "Введіть код TOTP або пароль", - "totpDisableConfirm": "Вимкнути 2FA", - "totpContinueVerify": "Продовжити перевірку", - "totpVerifyTitle": "Код перевірки", - "totpBackupTitle": "Резервні коди", - "totpDownloadBackup": "Завантажити резервні коди", - "done": "Виконано", - "secretCopied": "Секрет скопійовано до буферу обміну", - "apiKeyNameRequired": "Потрібне ім'я ключа", - "apiKeyCreated": "Створено ключ API \"{{name}}\"", - "apiKeyCreateFailed": "Не вдалося створити ключ API", - "apiKeyUser": "Користувач", - "apiKeyExpires": "Закінчується", - "apiKeyRevoked": "Ключ API \"{{name}}\" відкликано", - "apiKeyRevokeFailed": "Не вдалося відкликати ключ API", - "passwordFieldsRequired": "Необхідні поточні та нові паролі", - "passwordMismatch": "Паролі не збігаються", - "passwordTooShort": "Пароль повинен містити щонайменше 6 символів", - "passwordUpdated": "Пароль успішно оновлено", - "passwordUpdateFailed": "Не вдалося оновити пароль", - "deletePasswordRequired": "Потрібен пароль для видалення вашого облікового запису", - "deleteFailed": "Не вдалося вилучити обліковий запис", - "deleting": "Видалення...", - "colorPickerTooltip": "Вибір кольору", - "themeSystem": "Система", - "themeLight": "Світла", - "themeDark": "Темна", - "themeDracula": "Дракула", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "Соляризований", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "Одна темна", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Теги", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Повторити спробу", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Видалити", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/vi_VN.json b/src/ui/locales/translated/vi_VN.json index 9b34fb1c..b18b2be5 100644 --- a/src/ui/locales/translated/vi_VN.json +++ b/src/ui/locales/translated/vi_VN.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "Thư mục", - "folder": "Thư mục", - "password": "Mật khẩu", - "key": "Chìa khóa", - "sshPrivateKey": "Khóa riêng SSH", - "upload": "Tải lên", - "keyPassword": "Mật khẩu khóa", - "sshKey": "Khóa SSH", - "uploadPrivateKeyFile": "Tải lên tệp khóa riêng tư", - "searchCredentials": "Tìm kiếm thông tin đăng nhập...", - "addCredential": "Thêm thông tin đăng nhập", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "Chứng chỉ CA (-cert.pub)", "caCertificateDescription": "Tùy chọn: Tải lên hoặc dán tệp chứng chỉ được CA ký (ví dụ: id_ed25519-cert.pub). Bắt buộc khi máy chủ SSH của bạn sử dụng xác thực dựa trên chứng chỉ.", "uploadCertFile": "Tải lên tệp -cert.pub", - "clearCert": "Thông thoáng", + "clearCert": "Clear", "certLoaded": "Chứng chỉ đã được tải", "certPublicKeyLabel": "Chứng chỉ CA", "certTypeLabel": "Loại chứng chỉ", "pasteOrUploadCert": "Dán hoặc tải lên chứng chỉ -cert.pub...", "hasCaCert": "Có chứng chỉ CA", - "noCaCert": "Không có chứng chỉ CA" + "noCaCert": "Không có chứng chỉ CA", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "Thứ tự mặc định", + "sortNameAsc": "Tên (A → Z)", + "sortNameDesc": "Tên (Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "Xóa bộ lọc", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "Không thể tải cảnh báo", - "failedToDismissAlert": "Không thể tắt cảnh báo" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "Cấu hình máy chủ", - "description": "Cấu hình URL máy chủ Termix để kết nối với các dịch vụ phụ trợ của bạn.", - "serverUrl": "URL máy chủ", - "enterServerUrl": "Vui lòng nhập URL máy chủ", - "saveFailed": "Không thể lưu cấu hình", - "saveError": "Lỗi khi lưu cấu hình", - "saving": "Đang lưu...", - "saveConfig": "Lưu cấu hình", - "helpText": "Nhập URL nơi máy chủ Termix của bạn đang chạy (ví dụ: http://localhost:30001 hoặc https://your-server.com)", - "changeServer": "Thay đổi máy chủ", - "mustIncludeProtocol": "URL máy chủ phải bắt đầu bằng http:// hoặc https://", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "Cho phép chứng chỉ không hợp lệ", "allowInvalidCertificateDesc": "Chỉ sử dụng cho các máy chủ tự lưu trữ đáng tin cậy có chứng chỉ tự ký hoặc chứng chỉ địa chỉ IP.", - "useEmbedded": "Sử dụng máy chủ cục bộ", - "embeddedDesc": "Chạy Termix với máy chủ cục bộ tích hợp sẵn (không cần máy chủ từ xa).", - "embeddedConnecting": "Đang kết nối đến máy chủ cục bộ...", - "embeddedNotReady": "Máy chủ cục bộ chưa sẵn sàng. Vui lòng đợi một lát và thử lại.", - "localServer": "Máy chủ cục bộ" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Máy chủ cục bộ", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "Lỗi kiểm tra phiên bản", - "checkFailed": "Không thể kiểm tra cập nhật", - "upToDate": "Ứng dụng đã được cập nhật.", - "currentVersion": "Bạn đang sử dụng phiên bản {{version}}", - "updateAvailable": "Đã có bản cập nhật", - "newVersionAvailable": "Phiên bản mới đã có sẵn! Bạn đang sử dụng {{current}}, nhưng {{latest}} đã có sẵn.", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "Phiên bản Beta", - "betaVersionDesc": "Bạn đang sử dụng {{current}}, phiên bản này mới hơn bản phát hành ổn định mới nhất {{latest}}.", - "releasedOn": "Phát hành vào {{date}}", - "downloadUpdate": "Tải xuống bản cập nhật", - "checking": "Đang kiểm tra cập nhật...", - "checkUpdates": "Kiểm tra cập nhật", - "checkingUpdates": "Đang kiểm tra cập nhật...", - "updateRequired": "Cần cập nhật" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "Đóng", - "minimize": "Giảm thiểu", - "online": "Trực tuyến", - "offline": "Ngoại tuyến", - "continue": "Tiếp tục", - "maintenance": "BẢO TRÌ", - "degraded": "bị xuống cấp", - "error": "Lỗi", - "warning": "Cảnh báo", - "unsavedChanges": "Thay đổi chưa được lưu", - "dismiss": "Miễn nhiệm", - "loading": "Đang tải...", - "optional": "Không bắt buộc", - "connect": "Kết nối", - "copied": "Đã sao chép", - "connecting": "Đang kết nối...", - "updateAvailable": "Đã có bản cập nhật", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "Mở trong tab mới", - "noReleases": "Không có bản phát hành nào", - "updatesAndReleases": "Cập nhật & Phát hành", - "newVersionAvailable": "Phiên bản mới ({{version}}) đã có sẵn.", - "failedToFetchUpdateInfo": "Không thể tải thông tin cập nhật.", - "preRelease": "Bản phát hành trước", - "noReleasesFound": "Không tìm thấy bản phát hành nào.", - "cancel": "Hủy bỏ", - "username": "Tên người dùng", - "login": "Đăng nhập", - "register": "Đăng ký", - "password": "Mật khẩu", - "confirmPassword": "Xác nhận mật khẩu", - "back": "Mặt sau", - "save": "Cứu", - "saving": "Đang lưu...", - "delete": "Xóa bỏ", - "rename": "Đổi tên", - "edit": "Biên tập", - "add": "Thêm vào", - "confirm": "Xác nhận", - "no": "KHÔNG", - "or": "HOẶC", - "next": "Kế tiếp", - "previous": "Trước", - "refresh": "Làm cho khỏe lại", - "language": "Ngôn ngữ", - "checking": "Đang kiểm tra...", - "checkingDatabase": "Kiểm tra kết nối cơ sở dữ liệu...", - "checkingAuthentication": "Đang kiểm tra xác thực...", - "backendReconnected": "Kết nối máy chủ đã được khôi phục.", - "connectionDegraded": "Mất kết nối máy chủ, đang khôi phục…", - "reload": "Tải lại", - "remove": "Di dời", - "create": "Tạo nên", - "update": "Cập nhật", - "copy": "Sao chép", - "copyFailed": "Không thể sao chép vào clipboard", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "Tối đa hóa", "restore": "Khôi phục", - "of": "của" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "Trang chủ", - "terminal": "Phần cuối", + "home": "Home", + "terminal": "Terminal", "docker": "Docker", - "tunnels": "Đường hầm", - "fileManager": "Trình quản lý tập tin", - "serverStats": "Thống kê máy chủ", - "admin": "Quản trị viên", - "userProfile": "Hồ sơ người dùng", - "splitScreen": "Chia màn hình", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "Đóng phiên làm việc hiện tại này?", - "close": "Đóng", - "cancel": "Hủy bỏ", - "sshManager": "Trình quản lý SSH", - "cannotSplitTab": "Không thể chia tab này", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "Sao chép mật khẩu", - "copySudoPassword": "Sao chép mật khẩu Sudo", - "passwordCopied": "Mật khẩu đã được sao chép vào clipboard", - "noPasswordAvailable": "Không có mật khẩu nào khả dụng", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "Không thể sao chép mật khẩu", "refreshTab": "Làm mới kết nối", - "openFileManager": "Mở Trình quản lý tệp", - "dashboard": "Bảng điều khiển", - "networkGraph": "Đồ thị mạng", - "quickConnect": "Kết nối nhanh", - "sshTools": "Công cụ SSH", - "history": "Lịch sử", - "hosts": "Người dẫn chương trình", - "snippets": "Những đoạn trích", - "hostManager": "Quản lý máy chủ", - "credentials": "Thông tin xác thực", - "connections": "Kết nối", - "roleAdministrator": "Quản trị viên", - "roleUser": "Người dùng" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "Người dẫn chương trình", - "noHosts": "Không có máy chủ SSH", - "retry": "Thử lại", - "refresh": "Làm cho khỏe lại", - "optional": "Không bắt buộc", - "downloadSample": "Tải xuống mẫu", - "failedToDeleteHost": "Không thể xóa {{name}}", - "importSkipExisting": "Nhập khẩu (bỏ qua mục hiện có)", - "connectionDetails": "Chi tiết kết nối", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "Máy tính từ xa", - "port": "Cảng", - "username": "Tên người dùng", - "folder": "Thư mục", - "tags": "Thẻ", - "pin": "Ghim", - "addHost": "Thêm máy chủ", - "editHost": "Chỉnh sửa máy chủ", - "cloneHost": "Máy chủ nhân bản", - "enableTerminal": "Bật thiết bị đầu cuối", - "enableTunnel": "Kích hoạt đường hầm", - "enableFileManager": "Kích hoạt Trình quản lý tệp", - "enableDocker": "Bật Docker", - "defaultPath": "Đường dẫn mặc định", - "connection": "Sự liên quan", - "upload": "Tải lên", - "authentication": "Xác thực", - "password": "Mật khẩu", - "key": "Chìa khóa", - "credential": "Chứng chỉ", - "none": "Không có", - "sshPrivateKey": "Khóa riêng SSH", - "keyType": "Loại khóa", - "uploadFile": "Tải lên tệp", - "tabGeneral": "Tổng quan", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "Đường hầm", + "tabTunnels": "Tunnels", "tabDocker": "Docker", "tabFiles": "Tệp", - "tabStats": "Thống kê", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "Chia sẻ", - "tabAuthentication": "Xác thực", - "terminal": "Phần cuối", - "tunnel": "Đường hầm", - "fileManager": "Trình quản lý tập tin", - "serverStats": "Thống kê máy chủ", - "status": "Trạng thái", - "folderRenamed": "Thư mục \"{{oldName}}\" đã được đổi tên thành \"{{newName}}\" thành công", - "failedToRenameFolder": "Không thể đổi tên thư mục.", - "movedToFolder": "Đã chuyển đến \"{{folder}}\"", - "editHostTooltip": "Chỉnh sửa máy chủ", - "statusChecks": "Kiểm tra trạng thái", - "metricsCollection": "Thu thập số liệu", - "metricsInterval": "Khoảng thời gian thu thập số liệu", - "metricsIntervalDesc": "Tần suất thu thập số liệu thống kê máy chủ (5 giây - 1 giờ)", - "behavior": "Hành vi", - "themePreview": "Xem trước giao diện", - "theme": "Chủ đề", - "fontFamily": "Họ phông chữ", - "fontSize": "Kích thước phông chữ", - "letterSpacing": "Khoảng cách giữa các chữ", - "lineHeight": "Chiều cao dòng", - "cursorStyle": "Kiểu con trỏ", - "cursorBlink": "Con trỏ nhấp nháy", - "scrollbackBuffer": "Bộ đệm cuộn ngược", - "bellStyle": "Kiểu chuông", - "rightClickSelectsWord": "Nhấp chuột phải chọn Word", - "fastScrollModifier": "Bộ điều chỉnh cuộn nhanh", - "fastScrollSensitivity": "Độ nhạy cuộn nhanh", - "sshAgentForwarding": "Chuyển tiếp tác nhân SSH", - "backspaceMode": "Chế độ xóa lùi", - "startupSnippet": "Đoạn mã khởi nghiệp", - "selectSnippet": "Chọn đoạn trích", - "forceKeyboardInteractive": "Buộc tương tác bàn phím", - "overrideCredentialUsername": "Ghi đè tên người dùng xác thực", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "Hãy sử dụng tên người dùng được chỉ định ở trên thay vì tên người dùng của thông tin đăng nhập.", - "jumpHostChain": "Chuỗi máy chủ nhảy", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "Tiếng gõ cửa cảng", "addKnock": "Thêm cổng", "addProxyNode": "Thêm nút", - "proxyNode": "Nút ủy quyền", - "proxyType": "Loại Proxy", - "quickActions": "Thao tác nhanh", - "sudoPasswordAutoFill": "Tự động điền mật khẩu Sudo", - "sudoPassword": "Mật khẩu Sudo", - "keepaliveInterval": "Khoảng thời gian duy trì kết nối (ms)", - "moshCommand": "Bộ chỉ huy MOSH", - "environmentVariables": "Biến môi trường", - "addVariable": "Thêm biến", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "Sao chép URL thiết bị đầu cuối", - "copyFileManagerUrl": "Sao chép URL Trình quản lý tập tin", - "copyRemoteDesktopUrl": "Sao chép URL máy tính từ xa", - "failedToConnect": "Không thể kết nối với bảng điều khiển.", - "connect": "Kết nối", - "disconnect": "Ngắt kết nối", - "start": "Bắt đầu", - "enableStatusCheck": "Bật kiểm tra trạng thái", - "enableMetrics": "Kích hoạt số liệu", - "bulkUpdateFailed": "Cập nhật hàng loạt thất bại", - "selectAll": "Chọn tất cả", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "Bỏ chọn tất cả", "protocols": "Giao thức", "secureShell": "Vỏ bảo mật", @@ -272,6 +303,9 @@ "unencryptedShell": "Vỏ không mã hóa", "addressIp": "Địa chỉ / IP", "friendlyName": "Tên thân thiện", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "Thư mục & Nâng cao", "privateNotes": "Ghi chú riêng", "privateNotesPlaceholder": "Thông tin chi tiết về máy chủ này...", @@ -281,18 +315,18 @@ "addKnockBtn": "Thêm Knock", "noPortKnocking": "Không có cấu hình nào cho việc gõ cổng.", "knockPort": "Cổng gõ", - "protocol": "Giao thức", + "protocol": "Protocol", "delayAfterMs": "Độ trễ sau (ms)", "useSocks5Proxy": "Sử dụng proxy SOCKS5", "useSocks5ProxyDesc": "Định tuyến kết nối thông qua máy chủ proxy", - "proxyHost": "Máy chủ Proxy", - "proxyPort": "Cổng Proxy", - "proxyUsername": "Tên người dùng ủy quyền", - "proxyPassword": "Mật khẩu Proxy", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "Máy chủ proxy đơn", - "proxyChainMode": "Chuỗi ủy quyền", + "proxyChainMode": "Proxy Chain", "you": "Bạn", - "jumpHostChainLabel": "Chuỗi máy chủ nhảy", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "Thêm Nhảy", "noJumpHosts": "Chưa cấu hình máy chủ trung gian nào.", "selectAServer": "Chọn máy chủ...", @@ -300,10 +334,10 @@ "authMethod": "Phương thức xác thực", "storedCredential": "Thông tin đăng nhập đã lưu", "selectACredential": "Chọn thông tin xác thực...", - "keyTypeLabel": "Loại khóa", - "keyTypeAuto": "Tự động phát hiện", - "keyPasteTab": "Dán", - "keyUploadTab": "Tải lên", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "Tệp khóa đã được tải", "keyUploadClick": "Nhấp vào đây để tải lên tệp .pem / .key / .ppk", "clearKey": "Xóa khóa", @@ -311,59 +345,105 @@ "keyReplaceNotice": "Dán khóa mới bên dưới để thay thế khóa cũ.", "keyPassphraseSaved": "Mật khẩu đã được lưu, nhập để thay đổi", "replaceKey": "Thay thế chìa khóa", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "Tương tác bàn phím cưỡng chế", "forceKeyboardInteractiveShortDesc": "Buộc nhập mật khẩu thủ công ngay cả khi đã có chìa khóa.", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "Hình thức đầu cuối", "colorTheme": "Chủ đề màu sắc", - "fontFamilyLabel": "Họ phông chữ", - "fontSizeLabel": "Kích thước phông chữ", - "cursorStyleLabel": "Kiểu con trỏ", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "Khoảng cách giữa các chữ cái (px)", - "lineHeightLabel": "Chiều cao dòng", - "bellStyleLabel": "Kiểu chuông", - "backspaceModeLabel": "Chế độ xóa lùi", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "Con trỏ nhấp nháy", "cursorBlinkingDesc": "Bật hiệu ứng nhấp nháy cho con trỏ trong cửa sổ dòng lệnh.", "rightClickSelectsWordLabel": "Nhấp chuột phải Chọn Word", "rightClickSelectsWordShortDesc": "Chọn từ nằm dưới con trỏ chuột bằng cách nhấp chuột phải.", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Tô sáng cú pháp", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Dấu thời gian", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "Hành vi & Nâng cao", - "scrollbackBufferLabel": "Bộ đệm cuộn ngược", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "Số dòng tối đa được lưu trữ trong lịch sử", - "sshAgentForwardingLabel": "Chuyển tiếp tác nhân SSH", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "Hãy chuyển khóa SSH cục bộ của bạn cho máy chủ này.", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "Bật Auto-Mosh", "enableAutoMoshDesc": "Nên ưu tiên sử dụng Mosh hơn SSH nếu có sẵn.", "enableAutoTmux": "Bật Auto-Tmux", "enableAutoTmuxDesc": "Tự động khởi chạy hoặc kết nối với phiên tmux.", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Tự động điền mật khẩu Sudo", "sudoPasswordAutoFillShortDesc": "Tự động cung cấp mật khẩu sudo khi được yêu cầu.", - "sudoPasswordLabel": "Mật khẩu Sudo", - "environmentVariablesLabel": "Biến môi trường", - "addVariableBtn": "Thêm biến", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "Chưa có biến môi trường nào được cấu hình.", - "fastScrollModifierLabel": "Bộ điều chỉnh cuộn nhanh", - "fastScrollSensitivityLabel": "Độ nhạy cuộn nhanh", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Bộ chỉ huy Mosh", - "startupSnippetLabel": "Đoạn mã khởi nghiệp", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "Khoảng thời gian duy trì kết nối (giây)", "maxKeepaliveMisses": "Max Keepalive Misses", "tunnelSettings": "Cài đặt đường hầm", "enableTunneling": "Bật tính năng tạo đường hầm", "enableTunnelingDesc": "Kích hoạt chức năng đường hầm SSH cho máy chủ này.", "serverTunnelsSection": "Đường hầm máy chủ", - "addTunnelBtn": "Thêm đường hầm", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "Chưa có đường hầm nào được cấu hình.", - "tunnelLabel": "Đường hầm {{number}}", - "tunnelType": "Loại đường hầm", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "Chuyển tiếp cổng cục bộ đến một cổng trên máy chủ từ xa (hoặc một máy chủ có thể truy cập được từ đó).", "tunnelModeRemoteDesc": "Chuyển tiếp cổng trên máy chủ từ xa về cổng cục bộ trên máy tính của bạn.", "tunnelModeDynamicDesc": "Tạo một máy chủ proxy SOCKS5 trên một cổng cục bộ để chuyển tiếp cổng động.", "sameHost": "Máy chủ này (đường hầm trực tiếp)", "endpointHost": "Máy chủ điểm cuối", - "endpointPort": "Cổng điểm cuối", + "endpointPort": "Endpoint Port", "bindHost": "Liên kết máy chủ", - "sourcePort": "Cổng nguồn", - "maxRetries": "Số lần thử lại tối đa", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "Khoảng thời gian thử lại (giây)", "autoStartLabel": "Tự động khởi động", "autoStartDesc": "Tự động kết nối đường hầm này khi máy chủ được tải.", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "Không thể kết nối", "failedToDisconnectTunnel": "Không thể ngắt kết nối", "dockerIntegration": "Tích hợp Docker", - "enableDockerMonitor": "Bật Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "Theo dõi và quản lý các container trên máy chủ này thông qua Docker.", - "enableFileManagerMonitor": "Kích hoạt Trình quản lý tệp", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "Duyệt và quản lý các tập tin trên máy chủ này qua SFTP.", - "defaultPathLabel": "Đường dẫn mặc định", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "Thư mục cần mở khi trình quản lý tập tin khởi chạy cho máy chủ này.", - "statusChecksLabel": "Kiểm tra trạng thái", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "Bật kiểm tra trạng thái", "enableStatusChecksDesc": "Thường xuyên kiểm tra trạng thái hoạt động của máy chủ này bằng lệnh ping.", "useGlobalInterval": "Sử dụng khoảng thời gian toàn cầu", "useGlobalIntervalDesc": "Ghi đè bằng khoảng thời gian kiểm tra trạng thái toàn máy chủ", "checkIntervalS": "Khoảng thời gian kiểm tra", "checkIntervalDesc": "Khoảng thời gian (giây) giữa mỗi lần ping kết nối", - "metricsCollectionLabel": "Thu thập số liệu", - "enableMetricsLabel": "Kích hoạt số liệu", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "Thu thập thông tin về mức sử dụng CPU, RAM, ổ đĩa và mạng từ máy chủ này.", "useGlobalMetrics": "Sử dụng khoảng thời gian toàn cầu", "useGlobalMetricsDesc": "Ghi đè bằng khoảng thời gian đo lường toàn máy chủ", "metricsIntervalS": "Khoảng thời gian đo lường (s)", "metricsIntervalDesc2": "Khoảng thời gian (giây) giữa các lần chụp ảnh chỉ số.", "visibleWidgets": "Các tiện ích hiển thị", - "cpuUsageLabel": "Mức sử dụng CPU", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "Phần trăm CPU, mức tải trung bình, biểu đồ sparkline", - "memoryLabel": "Mức sử dụng bộ nhớ", + "memoryLabel": "Memory Usage", "memoryDesc": "Mức sử dụng RAM, bộ nhớ ảo, bộ nhớ đệm", - "storageLabel": "Mức sử dụng ổ đĩa", + "storageLabel": "Disk Usage", "storageDesc": "Mức sử dụng ổ đĩa trên mỗi điểm gắn kết", - "networkLabel": "Giao diện mạng", + "networkLabel": "Network Interfaces", "networkDesc": "Danh sách giao diện và băng thông", - "uptimeLabel": "Thời gian hoạt động", + "uptimeLabel": "Uptime", "uptimeDesc": "thời gian hoạt động của hệ thống và thời gian khởi động", "systemInfoLabel": "Thông tin hệ thống", "systemInfoDesc": "Hệ điều hành, nhân hệ điều hành, tên máy chủ, kiến trúc", @@ -409,61 +532,100 @@ "recentLoginsDesc": "Sự kiện đăng nhập thành công và thất bại", "topProcessesLabel": "Các quy trình hàng đầu", "topProcessesDesc": "PID, CPU%, MEM%, lệnh", - "listeningPortsLabel": "Cổng nghe", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "Mở các cổng với quy trình và trạng thái", - "firewallLabel": "Tường lửa", + "firewallLabel": "Firewall", "firewallDesc": "Trạng thái tường lửa, AppArmor, SELinux", - "quickActionsLabel": "Thao tác nhanh", - "quickActionsToolbar": "Các thao tác nhanh được hiển thị dưới dạng nút trên thanh công cụ Thống kê máy chủ để thực thi lệnh chỉ bằng một cú nhấp chuột.", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "Chưa có hành động nhanh chóng nào.", "buttonLabel": "Nhãn nút", "selectSnippetPlaceholder": "Chọn đoạn mã...", "addActionBtn": "Thêm hành động", "hostSharedSuccessfully": "Máy chủ đã chia sẻ thành công", - "failedToShareHost": "Không thể chia sẻ máy chủ", + "failedToShareHost": "Failed to share host", "accessRevoked": "Quyền truy cập đã bị thu hồi", - "failedToRevokeAccess": "Không thể thu hồi quyền truy cập", - "cancelBtn": "Hủy bỏ", - "savingBtn": "Đang lưu...", - "addHostBtn": "Thêm máy chủ", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "Máy chủ đã cập nhật", "hostCreated": "Máy chủ đã được tạo", "failedToSave": "Không thể lưu máy chủ", "credentialUpdated": "Thông tin xác thực đã được cập nhật", "credentialCreated": "Thông tin xác thực đã được tạo", - "failedToSaveCredential": "Không thể lưu thông tin đăng nhập", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "Trở lại trang Chủ nhà", "backToCredentials": "Trở lại trang Thông tin đăng nhập", - "pinned": "Đã ghim", - "noHostsFound": "Không tìm thấy máy chủ nào", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "Hãy thử một thuật ngữ khác.", "addFirstHost": "Thêm máy chủ đầu tiên của bạn để bắt đầu", "noCredentialsFound": "Không tìm thấy thông tin đăng nhập.", - "addCredentialBtn": "Thêm thông tin đăng nhập", - "updateCredentialBtn": "Cập nhật thông tin đăng nhập", - "features": "Đặc trưng", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(Không có thư mục)", - "deleteSelected": "Xóa bỏ", + "deleteSelected": "Delete", "exitSelection": "Lựa chọn thoát", - "importSkip": "Nhập khẩu (bỏ qua mục hiện có)", + "importSkip": "Import (skip existing)", "importOverwrite": "Nhập (ghi đè)", "collapseBtn": "Sụp đổ", "importExportBtn": "Nhập khẩu / Xuất khẩu", "hostStatusesRefreshed": "Trạng thái máy chủ đã được cập nhật", "failedToRefreshHosts": "Không thể làm mới máy chủ", - "movedHostTo": "Đã chuyển {{host}} sang \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "Không thể di chuyển máy chủ", - "folderRenamedTo": "Thư mục được đổi tên thành \"{{name}}\"", - "deletedFolder": "Đã xóa thư mục \"{{name}}\"", - "failedToDeleteFolder": "Không thể xóa thư mục", - "deleteAllInFolder": "Xóa tất cả máy chủ trong \"{{name}}\"? Thao tác này không thể hoàn tác.", - "deletedHost": "Đã xóa {{name}}", - "copiedToClipboard": "Đã sao chép vào clipboard", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Chỉnh sửa thư mục", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Chỉnh sửa thư mục", + "deleteFolder": "Xóa thư mục", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Không thể di chuyển máy chủ", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "URL thiết bị đầu cuối đã được sao chép", "fileManagerUrlCopied": "URL Trình quản lý tệp đã được sao chép", "tunnelUrlCopied": "URL đường hầm đã được sao chép", "dockerUrlCopied": "URL Docker đã được sao chép", - "serverStatsUrlCopied": "URL Thống kê máy chủ đã được sao chép", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "URL RDP đã được sao chép", "vncUrlCopied": "URL VNC đã được sao chép", "telnetUrlCopied": "URL Telnet đã được sao chép", @@ -471,109 +633,112 @@ "expandActions": "Mở rộng hành động", "collapseActions": "Hành động thu gọn", "wakeOnLanAction": "Wake on LAN", - "wakeOnLanSuccess": "Gói ma thuật đã được gửi đến {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "Không thể gửi gói tin ma thuật.", - "cloneHostAction": "Máy chủ nhân bản", + "cloneHostAction": "Clone Host", "copyAddress": "Sao chép địa chỉ", "copyLink": "Sao chép liên kết", - "copyTerminalUrlAction": "Sao chép URL thiết bị đầu cuối", - "copyFileManagerUrlAction": "Sao chép URL Trình quản lý tập tin", - "copyTunnelUrlAction": "Sao chép URL đường hầm", - "copyDockerUrlAction": "Sao chép URL Docker", - "copyServerStatsUrlAction": "Sao chép URL Thống kê Máy chủ", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "Sao chép URL RDP", "copyVncUrlAction": "Sao chép URL VNC", "copyTelnetUrlAction": "Sao chép URL Telnet", - "copyRemoteDesktopUrlAction": "Sao chép URL máy tính từ xa", - "deleteCredentialConfirm": "Xóa thông tin xác thực \"{{name}}\"?", - "deletedCredential": "Đã xóa {{name}}", - "deploySSHKeyTitle": "Triển khai khóa SSH", - "deployingBtn": "Đang triển khai...", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "Triển khai", "failedToDeployKey": "Không thể triển khai khóa.", - "deleteHostsConfirm": "Xóa {{count}} máy chủ{{plural}}? Thao tác này không thể hoàn tác.", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "Đã chuyển đến thư mục gốc", - "failedToMoveHosts": "Không thể di chuyển máy chủ", - "enableTerminalFeature": "Bật thiết bị đầu cuối", - "disableTerminalFeature": "Vô hiệu hóa thiết bị đầu cuối", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "Cho phép tệp", "disableFilesFeature": "Vô hiệu hóa các tệp", "enableTunnelsFeature": "Kích hoạt đường hầm", "disableTunnelsFeature": "Vô hiệu hóa đường hầm", - "enableDockerFeature": "Bật Docker", - "disableDockerFeature": "Vô hiệu hóa Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "Thêm thẻ...", "authDetails": "Thông tin xác thực", - "credType": "Kiểu", + "credType": "Type", "generateKeyPairDesc": "Tạo một cặp khóa mới, cả khóa riêng tư và khóa công khai sẽ được điền tự động.", "generatingKey": "Đang tạo...", - "generateLabel": "Tạo {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "Tải lên tệp", "keyPassphraseOptional": "Mật khẩu khóa (Tùy chọn)", "sshPublicKeyOptional": "Khóa công khai SSH (Tùy chọn)", "publicKeyGenerated": "Khóa công khai được tạo", "failedToGeneratePublicKey": "Không thể lấy được khóa công khai", "publicKeyCopied": "Khóa công khai đã được sao chép", - "keyPairGenerated": "{{label}} cặp khóa được tạo", - "failedToGenerateKeyPair": "Không thể tạo cặp khóa", - "searchHostsPlaceholder": "Tìm kiếm máy chủ, địa chỉ, thẻ…", - "searchCredentialsPlaceholder": "Thông tin đăng nhập tìm kiếm…", - "refreshBtn": "Làm cho khỏe lại", + "keyPairGenerated": "{{label}} key pair generated", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "Thêm thẻ...", - "deleteConfirmBtn": "Xóa bỏ", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "Máy chủ SSH phải có các thiết lập GatewayPorts yes, AllowTcpForwarding yes và PermitRootLogin yes trong tệp /etc/ssh/sshd_config.", - "deleteHostConfirm": "Xóa \"{{name}}\"?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "Hãy bật ít nhất một giao thức ở trên để cấu hình cài đặt xác thực và kết nối.", - "keyPassphrase": "Mật khẩu chính", - "connectBtn": "Kết nối", - "disconnectBtn": "Ngắt kết nối", - "basicInformation": "Thông tin cơ bản", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "Thông tin xác thực", - "credTypeLabel": "Kiểu", - "hostsTab": "Người dẫn chương trình", - "credentialsTab": "Thông tin xác thực", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "Chọn nhiều", "selectHosts": "Chọn máy chủ", - "connectionLabel": "Sự liên quan", - "authenticationLabel": "Xác thực", - "generateKeyPairTitle": "Tạo cặp khóa", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "Tạo một cặp khóa mới, cả khóa riêng tư và khóa công khai sẽ được điền tự động.", - "generateFromPrivateKey": "Tạo từ khóa riêng", - "refreshBtn2": "Làm cho khỏe lại", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "Lựa chọn thoát", "exportAll": "Xuất tất cả", - "addHostBtn2": "Thêm máy chủ", - "addCredentialBtn2": "Thêm thông tin đăng nhập", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "Kiểm tra trạng thái máy chủ...", - "pinnedSection": "Đã ghim", + "pinnedSection": "Pinned", "hostsExported": "Máy chủ đã được xuất khẩu thành công", "exportFailed": "Không thể xuất máy chủ", "sampleDownloaded": "Tệp mẫu đã được tải xuống", - "failedToDeleteCredential2": "Không thể xóa thông tin đăng nhập", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(Không có thư mục)", - "nSelected": "{{count}} đã chọn", - "featuresMenu": "Đặc trưng", - "moveMenu": "Di chuyển", - "cancelSelection": "Hủy bỏ", - "deployDialogDesc": "Triển khai {{name}} vào authorized_keys của máy chủ.", - "targetHostLabel": "Máy chủ mục tiêu", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "Chọn máy chủ...", "keyDeployedSuccess": "Khóa đã được triển khai thành công", "failedToDeployKey2": "Không thể triển khai khóa.", - "deletedCount": "Đã xóa {{count}} máy chủ", - "failedToDeleteCount": "Không thể xóa {{count}} máy chủ", - "duplicatedHost": "Đã sao chép \"{{name}}\"", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "Không thể sao chép máy chủ", - "updatedCount": "Đã cập nhật {{count}} máy chủ", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "Tên thân thiện", - "descriptionLabel": "Sự miêu tả", + "descriptionLabel": "Description", "loadingHost": "Đang tải máy chủ...", - "loadingHosts": "Đang tải máy chủ...", - "loadingCredentials": "Đang tải thông tin đăng nhập...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "Chưa có máy chủ nào", - "noHostsMatchSearch": "Không có máy chủ nào phù hợp với tìm kiếm của bạn", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "Không tìm thấy máy chủ", - "searchHosts": "Tìm kiếm máy chủ...", + "searchHosts": "Search hosts...", "sortHosts": "Sắp xếp máy chủ", "sortDefault": "Thứ tự mặc định", "sortNameAsc": "Tên (A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "Được ghim đầu tiên", "filterHosts": "Lọc máy chủ", "filterClearAll": "Xóa bộ lọc", - "filterStatusGroup": "Trạng thái", - "filterOnline": "Trực tuyến", - "filterOffline": "Ngoại tuyến", - "filterPinned": "Đã ghim", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "Loại xác thực", - "filterAuthPassword": "Mật khẩu", - "filterAuthKey": "Khóa SSH", - "filterAuthCredential": "Chứng chỉ", - "filterAuthNone": "Không có", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "Giao thức", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "Đặc trưng", - "filterFeatureTerminal": "Phần cuối", - "filterFeatureFileManager": "Trình quản lý tập tin", - "filterFeatureTunnel": "Đường hầm", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", - "filterTagsGroup": "Thẻ", - "shareHost": "Chia sẻ máy chủ", - "shareHostTitle": "Chia sẻ: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "Máy chủ này phải sử dụng thông tin xác thực để cho phép chia sẻ. Hãy chỉnh sửa máy chủ và gán thông tin xác thực trước." }, "guac": { - "connection": "Sự liên quan", - "authentication": "Xác thực", - "connectionSettings": "Cài đặt kết nối", - "displaySettings": "Cài đặt hiển thị", - "audioSettings": "Cài đặt âm thanh", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Thông tin đăng nhập đã lưu", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Phương thức xác thực", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "Chọn thông tin xác thực...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "Hiệu suất RDP", - "deviceRedirection": "Chuyển hướng thiết bị", - "session": "Phiên họp", - "gateway": "Cổng", - "remoteApp": "Ứng dụng từ xa", - "clipboard": "Bảng kẹp giấy", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", "sessionRecording": "Ghi âm buổi ghi âm", "wakeOnLan": "Wake-on-LAN", - "vncSettings": "Cài đặt VNC", - "terminalSettings": "Cài đặt thiết bị đầu cuối", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "Cảng RDP", - "username": "Tên người dùng", - "password": "Mật khẩu", - "domain": "Lãnh địa", - "securityMode": "Chế độ bảo mật", - "colorDepth": "Độ sâu màu", - "width": "Chiều rộng", - "height": "Chiều cao", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", "dpi": "DPI", - "resizeMethod": "Phương pháp thay đổi kích thước", - "clientName": "Tên khách hàng", - "initialProgram": "Chương trình ban đầu", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "Bố cục máy chủ", - "timezone": "Múi giờ", - "gatewayHostname": "Tên máy chủ cổng", - "gatewayPort": "Cổng Cổng", - "gatewayUsername": "Tên người dùng cổng", - "gatewayPassword": "Mật khẩu cổng", - "gatewayDomain": "Tên miền cổng", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "Chương trình RemoteApp", "workingDirectory": "Thư mục làm việc", "arguments": "Lập luận", "normalizeLineEndings": "Chuẩn hóa ký tự xuống dòng", - "recordingPath": "Đường dẫn ghi", - "recordingName": "Tên bản ghi", - "macAddress": "Địa chỉ MAC", - "broadcastAddress": "Địa chỉ phát sóng", - "udpPort": "Cổng UDP", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "Thời gian chờ (giây)", - "driveName": "Tên ổ đĩa", - "drivePath": "Đường lái xe", - "ignoreCertificate": "Bỏ qua chứng chỉ", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "Cho phép kết nối đến các máy chủ có chứng chỉ tự ký.", - "forceLossless": "Lực không mất mát", + "forceLossless": "Force Lossless", "forceLosslessDesc": "Buộc mã hóa hình ảnh không mất dữ liệu (chất lượng cao hơn, băng thông lớn hơn)", - "disableAudio": "Tắt âm thanh", + "disableAudio": "Disable Audio", "disableAudioDesc": "Tắt tiếng toàn bộ âm thanh từ phiên làm việc từ xa.", "enableAudioInput": "Bật đầu vào âm thanh (Microphone)", "enableAudioInputDesc": "Chuyển tiếp micro cục bộ đến phiên làm việc từ xa", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "Kích hoạt hiệu ứng kính Aero", "menuAnimations": "Hoạt ảnh menu", "menuAnimationsDesc": "Bật hiệu ứng chuyển động mờ dần và trượt của menu", - "disableBitmapCaching": "Tắt tính năng lưu trữ bộ nhớ đệm ảnh bitmap", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "Tắt bộ nhớ đệm bitmap (có thể giúp khắc phục lỗi)", - "disableOffscreenCaching": "Tắt tính năng lưu bộ nhớ đệm khi tắt màn hình", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "Tắt bộ nhớ đệm ngoại tuyến", - "disableGlyphCaching": "Tắt tính năng lưu trữ ký tự", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "Tắt bộ nhớ đệm biểu tượng", - "enableGfx": "Bật GFX", + "enableGfx": "Enable GFX", "enableGfxDesc": "Sử dụng quy trình xử lý đồ họa RemoteFX", - "enablePrinting": "Bật tính năng in", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "Chuyển hướng máy in cục bộ sang phiên làm việc từ xa.", - "enableDriveRedirection": "Bật tính năng chuyển hướng ổ đĩa", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "Ánh xạ thư mục cục bộ thành ổ đĩa trong phiên làm việc từ xa.", - "createDrivePath": "Tạo đường dẫn ổ đĩa", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "Tự động tạo thư mục nếu thư mục đó chưa tồn tại.", - "disableDownload": "Vô hiệu hóa Tải xuống", + "disableDownload": "Disable Download", "disableDownloadDesc": "Ngăn chặn việc tải xuống tập tin từ phiên làm việc từ xa", - "disableUpload": "Tắt tính năng tải lên", + "disableUpload": "Disable Upload", "disableUploadDesc": "Ngăn chặn việc tải tệp lên phiên làm việc từ xa", - "enableTouch": "Bật cảm ứng", + "enableTouch": "Enable Touch", "enableTouchDesc": "Bật tính năng chuyển tiếp dữ liệu cảm ứng", - "consoleSession": "Phiên điều khiển", + "consoleSession": "Console Session", "consoleSessionDesc": "Kết nối với bảng điều khiển (phiên 0) thay vì tạo một phiên mới.", "sendWolPacket": "Gửi gói WOL", "sendWolPacketDesc": "Gửi gói tin đặc biệt để đánh thức máy chủ này trước khi kết nối.", - "disableCopy": "Vô hiệu hóa sao chép", + "disableCopy": "Disable Copy", "disableCopyDesc": "Ngăn chặn việc sao chép văn bản từ phiên làm việc từ xa.", - "disablePaste": "Vô hiệu hóa Paste", + "disablePaste": "Disable Paste", "disablePasteDesc": "Ngăn chặn việc dán văn bản vào phiên làm việc từ xa.", "createPathIfMissing": "Tạo đường dẫn nếu chưa có", "createPathIfMissingDesc": "Tự động tạo thư mục ghi âm", - "excludeOutput": "Loại trừ đầu ra", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "Không ghi lại nội dung hiển thị trên màn hình (chỉ ghi lại siêu dữ liệu).", - "excludeMouse": "Loại trừ chuột", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "Không ghi lại chuyển động chuột", "includeKeystrokes": "Bao gồm các lần nhấn phím", "includeKeystrokesDesc": "Ghi lại cả các thao tác gõ phím thô cùng với thông tin hiển thị trên màn hình.", @@ -718,117 +896,120 @@ "vncPassword": "Mật khẩu VNC", "vncUsernameOptional": "Tên người dùng (tùy chọn)", "vncLeaveBlank": "Để trống nếu không cần thiết.", - "cursorMode": "Chế độ con trỏ", - "swapRedBlue": "Đổi màu Đỏ/Xanh", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "Hoán đổi kênh màu đỏ và xanh lam (khắc phục một số vấn đề về màu sắc)", "readOnly": "Chỉ đọc", "readOnlyDesc": "Xem màn hình từ xa mà không cần gửi bất kỳ tín hiệu đầu vào nào.", "telnetPort": "Cổng Telnet", - "terminalType": "Loại thiết bị đầu cuối", - "fontName": "Tên phông chữ", - "fontSize": "Kích thước phông chữ", - "colorScheme": "Bảng màu", - "backspaceKey": "Phím xóa", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "Hãy lưu máy chủ trước.", "sharingOptionsAfterSave": "Các tùy chọn chia sẻ sẽ khả dụng sau khi máy chủ đã được lưu.", "sharingLoadError": "Không thể tải dữ liệu chia sẻ. Vui lòng kiểm tra kết nối và thử lại.", - "shareHostSection": "Chia sẻ máy chủ", - "shareWithUser": "Chia sẻ với người dùng", - "shareWithRole": "Chia sẻ với vai trò", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "Chọn người dùng", - "selectRole": "Chọn vai trò", + "selectRole": "Select Role", "selectUserOption": "Chọn người dùng...", "selectRoleOption": "Chọn một vai trò...", - "permissionLevel": "Cấp độ quyền hạn", + "permissionLevel": "Permission Level", "expiresInHours": "Hết hạn sau (giờ)", "noExpiryPlaceholder": "Để trống cho đến khi hết hạn sử dụng.", - "shareBtn": "Chia sẻ", - "currentAccess": "Truy cập hiện tại", - "typeHeader": "Kiểu", - "targetHeader": "Mục tiêu", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "Sự cho phép", - "grantedByHeader": "Được cấp bởi", - "expiresHeader": "Hết hạn", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "Chưa có thông tin đăng nhập nào.", - "expiredLabel": "Hết hạn", - "neverLabel": "Không bao giờ", - "revokeBtn": "Thu hồi", - "cancelBtn": "Hủy bỏ", - "savingBtn": "Đang lưu...", - "updateHostBtn": "Cập nhật máy chủ", - "addHostBtn": "Thêm máy chủ" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "Tìm kiếm máy chủ, lệnh hoặc cài đặt...", - "quickActions": "Thao tác nhanh", - "hostManager": "Quản lý máy chủ", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "Quản lý, thêm hoặc chỉnh sửa máy chủ", "addNewHost": "Thêm máy chủ mới", "addNewHostDesc": "Đăng ký máy chủ mới", - "adminSettings": "Cài đặt quản trị", + "adminSettings": "Admin Settings", "adminSettingsDesc": "Cấu hình tùy chọn hệ thống và người dùng", - "userProfile": "Hồ sơ người dùng", + "userProfile": "User Profile", "userProfileDesc": "Quản lý tài khoản và tùy chọn của bạn", - "addCredential": "Thêm thông tin đăng nhập", + "addCredential": "Add Credential", "addCredentialDesc": "Lưu trữ khóa SSH hoặc mật khẩu", - "recentActivity": "Hoạt động gần đây", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "Máy chủ & Máy chủ lưu trữ", - "noHostsFound": "Không tìm thấy máy chủ nào phù hợp với \"{{search}}\"", - "links": "Liên kết", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Điều hướng", - "select": "Lựa chọn", + "select": "Select", "toggleWith": "Chuyển đổi với" }, "splitScreen": { - "paneEmpty": "Pane {{index}} - trống", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "Không có tab nào được chỉ định", "focusedPane": "Khung đang hoạt động" }, "connections": { "noConnections": "Không có kết nối", "noConnectionsDesc": "Mở cửa sổ dòng lệnh, trình quản lý tập tin hoặc máy tính từ xa để xem các kết nối tại đây.", - "connectedFor": "Đã kết nối cho {{duration}}", - "connected": "Đã kết nối", - "disconnected": "Đã ngắt kết nối", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "Đóng tab", "closeConnection": "Mối liên hệ mật thiết", "forgetTab": "Quên", - "removeBackground": "Di dời", - "reconnect": "Kết nối lại", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "Mở cửa trở lại", "sectionOpen": "Mở", "sectionBackground": "Lý lịch", "backgroundDesc": "Phiên làm việc sẽ vẫn duy trì trong 30 phút sau khi ngắt kết nối và có thể được kết nối lại.", "persisted": "Vẫn tồn tại ở chế độ nền", - "expiresIn": "Hết hạn sau {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "Tìm kiếm các kết nối...", - "noSearchResults": "Không có kết nối nào phù hợp với tìm kiếm của bạn." + "noSearchResults": "Không có kết nối nào phù hợp với tìm kiếm của bạn.", + "rename": "Rename session" }, "guacamole": { - "connecting": "Đang kết nối đến phiên {{type}}...", - "connectionError": "Lỗi kết nối", - "connectionFailed": "Kết nối thất bại", - "failedToConnect": "Không thể lấy mã thông báo kết nối", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "Không tìm thấy máy chủ", - "noHostSelected": "Chưa chọn máy chủ nào", - "reconnect": "Kết nối lại", - "retry": "Thử lại", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "Dịch vụ máy tính từ xa (guacd) hiện không khả dụng. Vui lòng đảm bảo guacd đang chạy, có thể truy cập và được cấu hình đúng cách trong cài đặt quản trị.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", "winL": "Tổ hợp phím Win+L (Khóa màn hình)", "winKey": "Phím Windows", - "ctrl": "Điều khiển", + "ctrl": "Ctrl", "alt": "Alt", - "shift": "Sự thay đổi", + "shift": "Shift", "win": "Thắng", - "stickyActive": "{{key}} (đã khóa - nhấp để mở)", - "stickyInactive": "{{key}} (nhấp để khóa)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "Bỏ trốn", "tab": "Tab", - "home": "Trang chủ", + "home": "Home", "end": "Kết thúc", "pageUp": "Trang lên", "pageDown": "Trang xuống", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "Kết nối với máy chủ", - "clear": "Thông thoáng", - "paste": "Dán", - "reconnect": "Kết nối lại", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "Mất kết nối", - "connected": "Đã kết nối", - "clipboardWriteFailed": "Không thể sao chép vào clipboard. Hãy đảm bảo trang được phục vụ qua HTTPS hoặc localhost.", - "clipboardReadFailed": "Không thể đọc dữ liệu từ clipboard. Hãy đảm bảo rằng bạn đã cấp quyền truy cập clipboard.", - "clipboardHttpWarning": "Ứng dụng Paste yêu cầu HTTPS. Hãy sử dụng tổ hợp phím Ctrl+Shift+V hoặc chạy Termix qua HTTPS.", - "unknownError": "Lỗi không xác định đã xảy ra", - "websocketError": "Lỗi kết nối WebSocket", - "connecting": "Đang kết nối...", - "noHostSelected": "Chưa chọn máy chủ nào", - "reconnecting": "Đang kết nối lại... ({{attempt}}/{{max}})", - "reconnected": "Đã kết nối lại thành công", - "tmuxSessionCreated": "Phiên tmux đã được tạo: {{name}}", - "tmuxSessionAttached": "Phiên tmux đã được đính kèm: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "tmux không được cài đặt trên máy chủ từ xa, do đó hệ thống sẽ sử dụng shell tiêu chuẩn thay thế.", "tmuxSessionPickerTitle": "Phiên tmux", "tmuxSessionPickerDesc": "Đã tìm thấy các phiên tmux hiện có trên máy chủ này. Chọn một phiên để kết nối lại hoặc tạo phiên mới.", "tmuxWindows": "Windows", - "tmuxWindowCount": "{{count}} cửa sổ", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "Khách hàng đính kèm", - "tmuxAttachedCount": "{{count}} đính kèm", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "Hoạt động cuối cùng", "tmuxTimeJustNow": "vừa nãy", - "tmuxTimeMinutes": "{{count}}m trước", - "tmuxTimeHours": "{{count}}giờ trước", - "tmuxTimeDays": "{{count}}ngày trước", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "Bắt đầu phiên mới", "tmuxCopyHint": "Điều chỉnh vùng chọn và nhấn Enter để sao chép vào clipboard", "tmuxDetach": "Tách khỏi phiên tmux", "tmuxDetached": "Đã tách khỏi phiên tmux", - "maxReconnectAttemptsReached": "Đã đạt số lần thử kết nối lại tối đa.", - "closeTab": "Đóng", - "connectionTimeout": "Hết thời gian chờ kết nối", - "terminalTitle": "Thiết bị đầu cuối - {{host}}", - "terminalWithPath": "Thiết bị đầu cuối - {{host}}:{{path}}", - "runTitle": "Đang chạy {{command}} - {{host}}", - "totpRequired": "Yêu cầu xác thực hai yếu tố", - "totpCodeLabel": "Mã xác minh", - "totpVerify": "Xác minh", - "warpgateAuthRequired": "Cần xác thực Warpgate", - "warpgateSecurityKey": "Khóa bảo mật", - "warpgateAuthUrl": "URL xác thực", - "warpgateOpenBrowser": "Mở trong trình duyệt", - "warpgateContinue": "Tôi đã hoàn tất xác thực.", - "opksshAuthRequired": "Yêu cầu xác thực OPKSSH", - "opksshAuthDescription": "Hoàn tất xác thực trên trình duyệt của bạn để tiếp tục. Phiên này sẽ có hiệu lực trong 24 giờ.", - "opksshOpenBrowser": "Mở trình duyệt để xác thực.", - "opksshWaitingForAuth": "Đang chờ xác thực trên trình duyệt...", - "opksshAuthenticating": "Đang xử lý xác thực...", - "opksshTimeout": "Quá trình xác thực đã hết hạn. Vui lòng thử lại.", - "opksshAuthFailed": "Xác thực không thành công. Vui lòng kiểm tra lại thông tin đăng nhập của bạn và thử lại.", - "opksshSignInWith": "Đăng nhập bằng {{provider}}", - "sudoPasswordPopupTitle": "Nhập mật khẩu?", - "websocketAbnormalClose": "Kết nối bị ngắt đột ngột. Điều này có thể do sự cố cấu hình proxy ngược hoặc SSL. Vui lòng kiểm tra nhật ký máy chủ.", - "connectionLogTitle": "Nhật ký kết nối", - "connectionLogCopy": "Sao chép nhật ký vào clipboard", - "connectionLogEmpty": "Chưa có nhật ký kết nối nào.", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "Mở", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "Đang chờ nhật ký kết nối...", - "connectionLogCopied": "Nhật ký kết nối đã được sao chép vào clipboard", - "connectionLogCopyFailed": "Không thể sao chép nhật ký vào clipboard", - "connectionRejected": "Kết nối bị máy chủ từ chối. Vui lòng kiểm tra cấu hình xác thực và mạng của bạn.", - "hostKeyRejected": "Xác thực khóa máy chủ SSH bị từ chối. Kết nối bị hủy.", - "sessionTakenOver": "Phiên làm việc đã được mở trong một tab khác. Đang kết nối lại..." + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "Chia tab", + "addToSplit": "Thêm vào phần chia", + "removeFromSplit": "Xóa khỏi phần Chia" + } }, "fileManager": { - "noHostSelected": "Chưa chọn máy chủ nào", + "noHostSelected": "No host selected", "initializingEditor": "Đang khởi tạo trình soạn thảo...", - "file": "Tài liệu", - "folder": "Thư mục", - "uploadFile": "Tải lên tệp", - "downloadFile": "Tải xuống", - "extractArchive": "Trích xuất tệp lưu trữ", - "extractingArchive": "Đang trích xuất {{name}}...", - "archiveExtractedSuccessfully": "{{name}} đã trích xuất thành công", - "extractFailed": "Trích xuất thất bại", - "compressFile": "Nén tệp", - "compressFiles": "Nén tệp", - "compressFilesDesc": "Nén {{count}} mục vào một kho lưu trữ", - "archiveName": "Tên kho lưu trữ", - "enterArchiveName": "Nhập tên kho lưu trữ...", - "compressionFormat": "Định dạng nén", - "selectedFiles": "Các tệp đã chọn", - "andMoreFiles": "và {{count}} nhiều hơn nữa...", - "compress": "Nén", - "compressingFiles": "Nén {{count}} mục thành {{name}}...", - "filesCompressedSuccessfully": "{{name}} đã được tạo thành công", - "compressFailed": "Quá trình nén thất bại", - "edit": "Biên tập", - "preview": "Xem trước", - "previous": "Trước", - "next": "Kế tiếp", - "pageXOfY": "Trang {{current}} trên {{total}}", - "zoomOut": "Thu nhỏ", - "zoomIn": "Phóng to", - "newFile": "Tệp mới", - "newFolder": "Thư mục mới", - "rename": "Đổi tên", - "uploading": "Đang tải lên...", - "uploadingFile": "Đang tải lên {{name}}...", - "fileName": "Tên tệp", - "folderName": "Tên thư mục", - "fileUploadedSuccessfully": "Tệp \"{{name}}\" đã được tải lên thành công", - "failedToUploadFile": "Không thể tải tệp lên.", - "fileDownloadedSuccessfully": "Tệp \"{{name}}\" đã được tải xuống thành công", - "failedToDownloadFile": "Không thể tải xuống tệp.", - "fileCreatedSuccessfully": "Tệp \"{{name}}\" đã được tạo thành công", - "folderCreatedSuccessfully": "Thư mục \"{{name}}\" đã được tạo thành công", - "failedToCreateItem": "Không thể tạo mục", - "operationFailed": "Thao tác {{operation}} đã thất bại đối với {{name}}: {{error}}", - "failedToResolveSymlink": "Không thể giải quyết liên kết tượng trưng", - "itemsDeletedSuccessfully": "{{count}} mục đã được xóa thành công", - "failedToDeleteItems": "Không thể xóa các mục", - "sudoPasswordRequired": "Cần có mật khẩu quản trị viên.", - "enterSudoPassword": "Nhập mật khẩu sudo để tiếp tục thao tác này.", - "sudoPassword": "Mật khẩu Sudo", - "sudoOperationFailed": "Thao tác Sudo thất bại", - "sudoAuthFailed": "Xác thực Sudo thất bại", - "dragFilesToUpload": "Kéo thả tệp vào đây để tải lên", - "emptyFolder": "Thư mục này trống", - "searchFiles": "Tìm kiếm tập tin...", - "upload": "Tải lên", - "selectHostToStart": "Chọn máy chủ để bắt đầu quản lý tập tin", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "Trình quản lý tập tin yêu cầu SSH. Máy chủ này chưa bật SSH.", - "failedToConnect": "Không thể kết nối SSH.", - "failedToLoadDirectory": "Không thể tải thư mục", - "noSSHConnection": "Không có kết nối SSH nào khả dụng", - "copy": "Sao chép", - "cut": "Cắt", - "paste": "Dán", - "copyPath": "Sao chép đường dẫn", - "copyPaths": "Sao chép đường dẫn", - "delete": "Xóa bỏ", - "properties": "Của cải", - "refresh": "Làm cho khỏe lại", - "downloadFiles": "Tải xuống {{count}} tập tin vào Trình duyệt", - "copyFiles": "Sao chép các mục {{count}}", - "cutFiles": "Cắt các mục {{count}}", - "deleteFiles": "Xóa {{count}} mục", - "filesCopiedToClipboard": "{{count}} mục đã được sao chép vào clipboard", - "filesCutToClipboard": "{{count}} các mục đã được cắt vào clipboard", - "pathCopiedToClipboard": "Đường dẫn đã được sao chép vào clipboard", - "pathsCopiedToClipboard": "{{count}} đường dẫn đã được sao chép vào clipboard", - "failedToCopyPath": "Không thể sao chép đường dẫn vào clipboard", - "movedItems": "Đã di chuyển {{count}} mục", - "failedToDeleteItem": "Không thể xóa mục", - "itemRenamedSuccessfully": "{{type}} đã đổi tên thành công", - "failedToRenameItem": "Không thể đổi tên mục", - "download": "Tải xuống", - "permissions": "Quyền hạn", - "size": "Kích cỡ", - "modified": "Đã sửa đổi", - "path": "Con đường", - "confirmDelete": "Bạn có chắc chắn muốn xóa {{name}} không?", - "permissionDenied": "Quyền truy cập bị từ chối", - "serverError": "Lỗi máy chủ", - "fileSavedSuccessfully": "Tệp đã được lưu thành công", - "failedToSaveFile": "Không thể lưu tệp", - "confirmDeleteSingleItem": "Bạn có chắc chắn muốn xóa vĩnh viễn \"{{name}} \" không?", - "confirmDeleteMultipleItems": "Bạn có chắc chắn muốn xóa vĩnh viễn {{count}} mục không?", - "confirmDeleteMultipleItemsWithFolders": "Bạn có chắc chắn muốn xóa vĩnh viễn {{count}} mục không? Việc này bao gồm cả thư mục và nội dung bên trong chúng.", - "confirmDeleteFolder": "Bạn có chắc chắn muốn xóa vĩnh viễn thư mục \"{{name}}\" và tất cả nội dung bên trong không?", - "permanentDeleteWarning": "Thao tác này không thể hoàn tác. Mục (các mục) sẽ bị xóa vĩnh viễn khỏi máy chủ.", - "recent": "Gần đây", - "pinned": "Đã ghim", - "folderShortcuts": "Phím tắt thư mục", - "failedToReconnectSSH": "Không thể kết nối lại phiên SSH.", - "openTerminalHere": "Mở cửa sổ dòng lệnh tại đây", - "run": "Chạy", - "openTerminalInFolder": "Mở cửa sổ dòng lệnh trong thư mục này", - "openTerminalInFileLocation": "Mở cửa sổ dòng lệnh tại vị trí tệp", - "runningFile": "Đang chạy - {{file}}", - "onlyRunExecutableFiles": "Chỉ có thể chạy các tệp thực thi.", - "directories": "Danh mục", - "removedFromRecentFiles": "Đã xóa \"{{name}}\" khỏi các tệp gần đây", - "removeFailed": "Xóa không thành công", - "unpinnedSuccessfully": "Đã gỡ ghim \"{{name}}\" thành công", - "unpinFailed": "Gỡ ghim không thành công", - "removedShortcut": "Đã xóa lối tắt \"{{name}}\"", - "removeShortcutFailed": "Xóa lối tắt không thành công", - "clearedAllRecentFiles": "Đã xóa tất cả các tệp gần đây", - "clearFailed": "Xóa thất bại", - "removeFromRecentFiles": "Xóa khỏi tệp gần đây", - "clearAllRecentFiles": "Xóa tất cả các tệp gần đây", - "unpinFile": "Gỡ ghim tệp", - "removeShortcut": "Xóa lối tắt", - "pinFile": "Tệp ghim", - "addToShortcuts": "Thêm vào lối tắt", - "pasteFailed": "Dán thất bại", - "noUndoableActions": "Không có hành động nào có thể hoàn tác", - "undoCopySuccess": "Hoàn tác thao tác sao chép: Đã xóa {{count}} tệp đã sao chép", - "undoCopyFailedDelete": "Hoàn tác thất bại: Không thể xóa bất kỳ tệp nào đã sao chép.", - "undoCopyFailedNoInfo": "Hoàn tác thất bại: Không tìm thấy thông tin tệp đã sao chép.", - "undoMoveSuccess": "Hoàn tác thao tác di chuyển: Đã di chuyển {{count}} tập tin trở lại vị trí ban đầu", - "undoMoveFailedMove": "Hoàn tác thất bại: Không thể khôi phục bất kỳ tệp nào.", - "undoMoveFailedNoInfo": "Hoàn tác thất bại: Không tìm thấy thông tin tệp đã di chuyển.", - "undoDeleteNotSupported": "Không thể hoàn tác thao tác xóa: Các tệp đã bị xóa vĩnh viễn khỏi máy chủ.", - "undoTypeNotSupported": "Loại thao tác hoàn tác không được hỗ trợ", - "undoOperationFailed": "Thao tác hoàn tác thất bại", - "unknownError": "Lỗi không xác định", - "confirm": "Xác nhận", - "find": "Tìm thấy...", - "replace": "Thay thế", - "downloadInstead": "Tải xuống thay vì", - "keyboardShortcuts": "Phím tắt", - "searchAndReplace": "Tìm kiếm và thay thế", - "editing": "Chỉnh sửa", - "search": "Tìm kiếm", - "findNext": "Tìm tiếp theo", - "findPrevious": "Tìm kiếm trước đó", - "save": "Cứu", - "selectAll": "Chọn tất cả", - "undo": "Hoàn tác", - "redo": "Làm lại", - "moveLineUp": "Di chuyển hàng", - "moveLineDown": "Di chuyển dòng xuống", - "toggleComment": "Ẩn/Hiện bình luận", - "autoComplete": "Tự động hoàn thành", - "imageLoadError": "Không thể tải hình ảnh", - "startTyping": "Bắt đầu gõ...", - "unknownSize": "Kích thước không xác định", - "fileIsEmpty": "Tệp tin trống", - "largeFileWarning": "Cảnh báo về tệp tin lớn", - "largeFileWarningDesc": "Tệp này có kích thước {{size}} , có thể gây ra sự cố về hiệu năng khi mở dưới dạng văn bản.", - "fileNotFoundAndRemoved": "Tệp \"{{name}}\" không được tìm thấy và đã bị xóa khỏi các tệp gần đây/được ghim.", - "failedToLoadFile": "Không thể tải tệp: {{error}}", - "serverErrorOccurred": "Đã xảy ra lỗi máy chủ. Vui lòng thử lại sau.", - "autoSaveFailed": "Lưu tự động thất bại", - "fileAutoSaved": "Tệp đã được tự động lưu", - "moveFileFailed": "Không thể di chuyển {{name}}", - "moveOperationFailed": "Thao tác di chuyển thất bại", - "canOnlyCompareFiles": "Chỉ có thể so sánh hai tệp", - "comparingFiles": "So sánh các tập tin: {{file1}} và {{file2}}", - "dragFailed": "Thao tác kéo thả thất bại", - "filePinnedSuccessfully": "Tệp \"{{name}}\" đã được ghim thành công", - "pinFileFailed": "Không thể ghim tệp", - "fileUnpinnedSuccessfully": "Tệp \"{{name}}\" đã được gỡ ghim thành công", - "unpinFileFailed": "Không thể bỏ ghim tệp.", - "shortcutAddedSuccessfully": "Thêm lối tắt thư mục \"{{name}}\" thành công", - "addShortcutFailed": "Không thể thêm lối tắt", - "operationCompletedSuccessfully": "{{operation}} {{count}} mục thành công", - "operationCompleted": "{{operation}} {{count}} mục", - "downloadFileSuccess": "Tệp {{name}} đã được tải xuống thành công", - "downloadFileFailed": "Tải xuống thất bại", - "moveTo": "Di chuyển đến {{name}}", - "diffCompareWith": "So sánh khác biệt với {{name}}", - "dragOutsideToDownload": "Kéo chuột ra ngoài cửa sổ để tải xuống ({{count}} tập tin)", - "newFolderDefault": "Thư mục mới", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "Đã chuyển thành công {{count}} mục đến {{target}}", - "move": "Di chuyển", - "searchInFile": "Tìm kiếm trong tệp (Ctrl+F)", - "showKeyboardShortcuts": "Hiển thị các phím tắt", - "startWritingMarkdown": "Hãy bắt đầu viết nội dung bằng định dạng Markdown...", - "loadingFileComparison": "Đang tải so sánh tệp...", - "reload": "Tải lại", - "compare": "So sánh", - "sideBySide": "Cạnh nhau", - "inline": "Nội tuyến", - "fileComparison": "So sánh tập tin: {{file1}} so với {{file2}}", - "fileTooLarge": "Tệp quá lớn: {{error}}", - "sshConnectionFailed": "Kết nối SSH thất bại. Vui lòng kiểm tra kết nối của bạn tới {{name}} ({{ip}}:{{port}})", - "loadFileFailed": "Không thể tải tệp: {{error}}", - "connecting": "Đang kết nối...", - "connectedSuccessfully": "Kết nối thành công", - "totpVerificationFailed": "Xác thực TOTP thất bại", - "warpgateVerificationFailed": "Xác thực Warpgate thất bại", - "authenticationFailed": "Xác thực thất bại", - "verificationCodePrompt": "Mã xác minh:", - "changePermissions": "Thay đổi quyền", - "currentPermissions": "Quyền hiện tại", - "owner": "Người sở hữu", - "group": "Nhóm", - "others": "Người khác", - "read": "Đọc", - "write": "Viết", - "execute": "Thực thi", - "permissionsChangedSuccessfully": "Quyền truy cập đã được thay đổi thành công.", - "failedToChangePermissions": "Không thể thay đổi quyền truy cập", - "name": "Tên", - "sortByName": "Tên", - "sortByDate": "Ngày sửa đổi", - "sortBySize": "Kích cỡ", - "ascending": "Đi lên", - "descending": "Đi xuống", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "Rễ", "new": "Mới", "sortBy": "Sắp xếp theo", @@ -1139,20 +1335,20 @@ "editor": "Biên tập viên", "octal": "bát phân", "storage": "Kho", - "disk": "Đĩa", - "used": "Đã sử dụng", - "of": "của", - "toggleSidebar": "Ẩn/Hiện thanh bên", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "Không thể tải PDF", "pdfLoadError": "Đã xảy ra lỗi khi tải tệp PDF này.", "loadingPdf": "Đang tải PDF...", "loadingPage": "Đang tải trang..." }, "transfer": { - "copyToHost": "Sao chép vào máy chủ…", - "moveToHost": "Di chuyển đến máy chủ…", - "copyItemsToHost": "Sao chép {{count}} mục vào máy chủ…", - "moveItemsToHost": "Di chuyển {{count}} vật phẩm đến máy chủ…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "Không có máy chủ quản lý tập tin nào khác khả dụng.", "noHostsConnectedHint": "Thêm một máy chủ SSH khác có bật Trình quản lý tệp trong Trình quản lý máy chủ.", "selectDestinationHost": "Chọn máy chủ đích", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "Mở rộng các điểm đến gần đây", "browseFolders": "Duyệt các thư mục đích", "browseDestination": "Duyệt hoặc nhập đường dẫn", - "confirmCopy": "Sao chép", - "confirmMove": "Di chuyển", - "transferring": "Đang chuyển…", - "compressing": "Nén…", - "extracting": "Đang trích xuất…", - "transferringItems": "Đang chuyển {{current}} trong số {{total}} mục…", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "Giao dịch hoàn tất", "transferError": "Giao dịch chuyển khoản thất bại", - "transferPartial": "Quá trình chuyển giao hoàn tất với {{count}} lỗi", - "transferPartialHint": "Không thể chuyển khoản: {{paths}}", - "itemsSummary": "{{count}} mục", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "Thư mục đích phải là thư mục dùng cho việc chuyển nhiều mục.", "selectThisFolder": "Chọn thư mục này", "browsePathWillBeCreated": "Thư mục này chưa tồn tại. Nó sẽ được tạo khi quá trình chuyển dữ liệu bắt đầu.", "browsePathError": "Không thể mở đường dẫn này trên máy chủ đích.", "goUp": "Đi lên", - "copyFolderToHost": "Sao chép thư mục vào máy chủ…", - "moveFolderToHost": "Di chuyển thư mục đến máy chủ…", - "hostReady": "Sẵn sàng", - "hostConnecting": "Đang kết nối…", - "hostDisconnected": "Không kết nối", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "Cần xác thực — trước tiên hãy mở Trình quản lý tập tin trên máy chủ này.", - "hostConnectionFailed": "Kết nối thất bại", + "hostConnectionFailed": "Connection failed", "metricsTitle": "Thời gian chuyển khoản", - "metricsPrepare": "Chuẩn bị điểm đến: {{duration}}", - "metricsCompress": "Nén tại nguồn: {{duration}}", - "metricsHopSourceRead": "Nguồn → máy chủ: {{throughput}}", - "metricsHopDestSftpWrite": "Máy chủ → đích (SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "Máy chủ → đích (cục bộ): {{throughput}}", - "metricsTransfer": "Từ đầu đến cuối: {{throughput}} ({{duration}})", - "metricsExtract": "Trích xuất tại đích đến: {{duration}}", - "metricsSourceDelete": "Xóa khỏi nguồn: {{duration}}", - "metricsTotal": "Tổng cộng: {{duration}}", - "progressCompressing": "Nén trên máy chủ nguồn…", - "progressExtracting": "Đang trích xuất tại đích đến…", - "progressTransferring": "Đang truyền dữ liệu…", - "progressReconnecting": "Đang kết nối lại…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "Các làn chuyển tiếp song song", - "parallelSegmentsOption": "{{count}} làn đường", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "Các tệp lớn được chia thành các đoạn 256 MB. Nhiều làn truyền dữ liệu sử dụng các kết nối riêng biệt (giống như bắt đầu nhiều lần truyền) để đạt được thông lượng tổng thể cao hơn.", - "progressTotalSpeed": "{{speed}} tổng ({{lanes}} làn đường)", - "progressTransferringItems": "Đang chuyển các tập tin ({{current}} của {{total}})…", + "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} tập tin", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "Các tập tin nguồn được giữ lại (chuyển giao một phần)", "jumpHostLimitation": "Cả hai máy chủ phải có thể truy cập được từ máy chủ Termix. Định tuyến trực tiếp giữa các máy chủ không được hỗ trợ.", - "cancel": "Hủy bỏ", + "cancel": "Cancel", "methodLabel": "Phương thức chuyển giao", "methodAuto": "Tự động", "methodTar": "Tệp lưu trữ Tar", @@ -1216,25 +1412,25 @@ "methodAutoHint": "Hệ thống sẽ chọn phương thức nén tar hoặc SFTP cho từng tập tin dựa trên số lượng, kích thước và khả năng nén của tập tin. Các tập tin đơn lẻ luôn sử dụng SFTP truyền phát trực tuyến.", "methodTarHint": "Nén dữ liệu trên nguồn, chuyển một tệp lưu trữ duy nhất, giải nén trên đích. Yêu cầu cài đặt tar trên cả hai máy chủ Unix.", "methodItemSftpHint": "Chuyển từng tập tin riêng lẻ qua SFTP. Hoạt động trên mọi hệ điều hành, bao gồm cả Windows.", - "methodPreviewLoading": "Tính toán phương pháp chuyển đổi…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "Không thể xem trước phương thức chuyển khoản. Máy chủ vẫn sẽ chọn phương thức khi bạn bắt đầu.", "methodPreviewWillUseTar": "Sẽ sử dụng: Tệp lưu trữ Tar", "methodPreviewWillUseItemSftp": "Sẽ sử dụng: SFTP cho từng tệp", - "methodPreviewScanSummary": "{{fileCount}} tập tin, {{totalSize}} tổng số (đã quét trên máy chủ nguồn).", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "Mỗi tập tin sử dụng cùng một luồng SFTP như khi sao chép từng tập tin riêng lẻ. Tiến trình được tính gộp cho tất cả các tập tin, vì vậy thanh tiến trình di chuyển chậm hơn đối với các tập tin lớn.", "methodReason": { "user_item_sftp": "Bạn đã chọn SFTP cho từng tập tin.", "user_tar": "Bạn đã chọn định dạng lưu trữ tar.", "tar_unavailable": "Tar không khả dụng trên một hoặc cả hai máy chủ — thay vào đó, SFTP sẽ được sử dụng cho từng tệp.", "windows_host": "Quá trình này sử dụng máy chủ Windows — không dùng lệnh tar.", - "auto_multi_large": "Tự động: nhiều tệp bao gồm một tệp lớn ({{largestSize}}) với dữ liệu có thể nén — các gói tar được chuyển thành một lần.", - "auto_single_large_in_archive": "Tự động: một tập tin lớn ({{largestSize}}) trong bộ này — SFTP cho mỗi tập tin.", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "Tự động: dữ liệu chủ yếu không thể nén được — SFTP theo từng tệp.", - "auto_many_files": "Tự động: nhiều tệp ({{fileCount}}) — tar giảm chi phí xử lý trên mỗi tệp.", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "Tự động: SFTP cho từng tệp trong bộ này." }, - "progressCancel": "Hủy bỏ", - "progressCancelling": "Đang hủy…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "Bị kẹt", "resumedHint": "Đã kết nối lại với quá trình truyền tải đang hoạt động được bắt đầu trong cửa sổ khác.", "transferCancelled": "Giao dịch bị hủy", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "Một số tập tin chưa hoàn chỉnh không thể được xóa.", "cleanupDestFilesNothing": "Không cần phải dọn dẹp gì ở điểm đến", "cleanupDestFilesError": "Quá trình dọn dẹp thất bại", - "retryTransfer": "Thử lại", + "retryTransfer": "Retry", "retryTransferError": "Thử lại không thành công", "transferFailedRetryHint": "Một phần dữ liệu đã được lưu trữ tại đích đến. Quá trình thử lại sẽ tiếp tục khi kết nối được khôi phục." }, "tunnels": { - "noSshTunnels": "Không có đường hầm SSH", - "createFirstTunnelMessage": "Bạn chưa tạo bất kỳ đường hầm SSH nào. Hãy cấu hình kết nối đường hầm trong Trình quản lý máy chủ để bắt đầu.", - "connected": "Đã kết nối", - "disconnected": "Đã ngắt kết nối", - "connecting": "Đang kết nối...", - "error": "Lỗi", - "canceling": "Đang hủy...", - "connect": "Kết nối", - "disconnect": "Ngắt kết nối", - "cancel": "Hủy bỏ", - "port": "Cảng", - "localPort": "Cảng địa phương", - "remotePort": "Cổng từ xa", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "Cổng máy chủ hiện tại", - "endpointPort": "Cổng điểm cuối", + "endpointPort": "Endpoint Port", "bindIp": "Địa chỉ IP cục bộ", - "endpointSshConfig": "Cấu hình SSH điểm cuối", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "Máy chủ SSH điểm cuối", "endpointSshHostPlaceholder": "Chọn một máy chủ đã được cấu hình", "endpointSshHostRequired": "Chọn một máy chủ SSH điểm cuối cho mỗi đường hầm SSH của máy khách.", - "attempt": "Lần thử {{current}} của {{max}}", - "nextRetryIn": "Lần thử lại tiếp theo sau {{seconds}} giây", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "Đường hầm máy khách", "clientTunnel": "Đường hầm máy khách", "addClientTunnel": "Thêm đường hầm máy khách", "noClientTunnels": "Hiện chưa có đường hầm máy khách nào được cấu hình trên máy tính để bàn này.", - "tunnelName": "Tên đường hầm", - "remoteHost": "Máy chủ từ xa", - "autoStart": "Tự động khởi động", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "Bắt đầu khi ứng dụng khách trên máy tính để bàn này được mở và duy trì kết nối.", "clientManualStartDesc": "Sử dụng nút Bắt đầu và Dừng từ hàng này. Termix sẽ không tự động mở nó.", "clientRemoteServerNote": "Việc chuyển tiếp từ xa có thể yêu cầu thiết lập AllowTcpForwarding và GatewayPorts trên máy chủ SSH của điểm cuối. Cổng từ xa sẽ đóng khi máy tính để bàn này ngắt kết nối.", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "Cổng từ xa phải nằm trong khoảng từ 1 đến 65535.", "invalidLocalTargetPort": "Cổng đích cục bộ phải nằm trong khoảng từ 1 đến 65535.", "invalidEndpointPort": "Cổng điểm cuối phải nằm trong khoảng từ 1 đến 65535.", - "duplicateAutoStartBind": "Chỉ một đường hầm máy khách tự khởi động có thể sử dụng {{bind}}.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "Không thể cập nhật trạng thái đường hầm.", - "active": "Tích cực", - "start": "Bắt đầu", - "stop": "Dừng lại", - "test": "Bài kiểm tra", - "type": "Loại đường hầm", - "typeLocal": "Địa phương (-L)", - "typeRemote": "Điều khiển từ xa (-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "Động lực (-D)", "typeServerLocalDesc": "Máy chủ hiện tại đến điểm cuối.", "typeServerRemoteDesc": "Điểm cuối quay trở lại máy chủ hiện tại.", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "Điểm cuối quay trở lại máy tính cục bộ.", "typeClientDynamicDesc": "SOCKS trên máy tính cục bộ.", "typeDynamicDesc": "Chuyển tiếp lưu lượng SOCKS5 CONNECT thông qua SSH", - "forwardDescriptionServerLocal": "Máy chủ hiện tại {{sourcePort}} → điểm cuối {{endpointPort}}.", - "forwardDescriptionServerRemote": "Điểm cuối {{endpointPort}} → máy chủ hiện tại {{sourcePort}}.", - "forwardDescriptionServerDynamic": "SOCKS trên máy chủ hiện tại {{sourcePort}}.", - "forwardDescriptionClientLocal": "Cục bộ {{sourcePort}} → từ xa {{endpointPort}}.", - "forwardDescriptionClientRemote": "Từ xa {{sourcePort}} → cục bộ {{endpointPort}}.", - "forwardDescriptionClientDynamic": "SOCKS trên cổng cục bộ {{sourcePort}}.", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → TẤT QUA {{endpoint}}", - "autoNameClientLocal": "Cục bộ {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → cục bộ {{localPort}}", - "autoNameClientDynamic": "TẤT {{localPort}} qua {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "Tuyến đường:", "lastStarted": "Lần cuối bắt đầu", "lastTested": "Lần kiểm tra cuối cùng", "lastError": "Lỗi cuối cùng", - "maxRetries": "Số lần thử lại tối đa", + "maxRetries": "Max Retries", "maxRetriesDescription": "Số lần thử lại tối đa.", - "retryInterval": "Khoảng thời gian thử lại (giây)", - "retryIntervalDescription": "Thời gian chờ giữa các lần thử lại.", - "local": "Địa phương", - "remote": "Xa", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "Điểm đến", "host": "Chủ nhà", "mode": "Cách thức", - "noHostSelected": "Chưa chọn máy chủ nào", + "noHostSelected": "No host selected", "working": "Đang làm việc..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "Ký ức", - "disk": "Đĩa", - "network": "Mạng", - "uptime": "Thời gian hoạt động", - "processes": "Quy trình", - "available": "Có sẵn", - "free": "Miễn phí", - "connecting": "Đang kết nối...", - "connectionFailed": "Không thể kết nối đến máy chủ.", - "naCpus": "Không áp dụng CPU", - "cpuCores_one": "{{count}} Lõi", - "cpuCores_other": "{{count}} Lõi", - "cpuUsage": "Mức sử dụng CPU", - "memoryUsage": "Mức sử dụng bộ nhớ", - "diskUsage": "Mức sử dụng ổ đĩa", - "failedToFetchHostConfig": "Không thể tải cấu hình máy chủ", - "serverOffline": "Máy chủ ngoại tuyến", - "cannotFetchMetrics": "Không thể lấy số liệu từ máy chủ ngoại tuyến.", - "totpFailed": "Xác thực TOTP thất bại", - "noneAuthNotSupported": "Server Stats không hỗ trợ loại xác thực 'non'.", - "load": "Trọng tải", - "systemInfo": "Thông tin hệ thống", - "hostname": "Tên máy chủ", - "operatingSystem": "Hệ điều hành", - "kernel": "Hạt nhân", - "seconds": "giây", - "networkInterfaces": "Giao diện mạng", - "noInterfacesFound": "Không tìm thấy giao diện mạng nào.", - "noProcessesFound": "Không tìm thấy tiến trình nào.", - "loginStats": "Thống kê đăng nhập SSH", - "noRecentLoginData": "Không có dữ liệu đăng nhập gần đây", - "executingQuickAction": "Đang thực thi {{name}}...", - "quickActionSuccess": "{{name}} đã hoàn thành thành công", - "quickActionFailed": "{{name}} thất bại", - "quickActionError": "Không thể thực thi {{name}}", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "Cổng nghe", - "protocol": "Giao thức", - "port": "Cảng", - "address": "Địa chỉ", - "process": "Quá trình", - "noData": "Không có dữ liệu cổng lắng nghe" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "Tất cả", + "noData": "No listening ports data" }, "firewall": { - "title": "Tường lửa", - "inactive": "Không hoạt động", - "policy": "Chính sách", - "rules": "quy tắc", - "noData": "Không có dữ liệu tường lửa nào.", - "action": "Hoạt động", - "protocol": "Nguyên mẫu", - "port": "Cảng", - "source": "Nguồn", - "anywhere": "Bất cứ nơi nào" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "Tải trung bình", "swap": "Tráo đổi", "architecture": "Ngành kiến trúc", - "refresh": "Làm cho khỏe lại", - "retry": "Thử lại" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Đang làm việc...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "Quản lý SSH và máy tính từ xa tự lưu trữ", - "loginTitle": "Đăng nhập vào Termix", - "registerTitle": "Tạo tài khoản", - "forgotPassword": "Quên mật khẩu?", - "rememberMe": "Lưu mã xác thực thiết bị trong 30 ngày (bao gồm cả mã TOTP)", - "noAccount": "Bạn chưa có tài khoản?", - "hasAccount": "Bạn đã có tài khoản chưa?", - "twoFactorAuth": "Xác thực hai yếu tố", - "enterCode": "Nhập mã xác minh", - "backupCode": "Hoặc sử dụng mã dự phòng", - "verifyCode": "Xác minh mã", - "redirectingToApp": "Đang chuyển hướng đến ứng dụng...", - "sshAuthenticationRequired": "Yêu cầu xác thực SSH", - "sshNoKeyboardInteractive": "Xác thực tương tác bàn phím không khả dụng", - "sshAuthenticationFailed": "Xác thực không thành công", - "sshAuthenticationTimeout": "Hết thời gian xác thực", - "sshNoKeyboardInteractiveDescription": "Máy chủ không hỗ trợ xác thực bằng bàn phím. Vui lòng cung cấp mật khẩu hoặc khóa SSH của bạn.", - "sshAuthFailedDescription": "Thông tin đăng nhập bạn cung cấp không chính xác. Vui lòng thử lại với thông tin đăng nhập hợp lệ.", - "sshTimeoutDescription": "Quá trình xác thực đã hết thời gian chờ. Vui lòng thử lại.", - "sshProvideCredentialsDescription": "Vui lòng cung cấp thông tin đăng nhập SSH của bạn để kết nối với máy chủ này.", - "sshPasswordDescription": "Nhập mật khẩu cho kết nối SSH này.", - "sshKeyPasswordDescription": "Nếu khóa SSH của bạn được mã hóa, hãy nhập mật khẩu vào đây.", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "Cần có mật khẩu", "passphraseRequiredDescription": "Khóa SSH đã được mã hóa. Vui lòng nhập mật khẩu để mở khóa.", - "back": "Mặt sau", - "firstUser": "Người dùng đầu tiên", - "firstUserMessage": "Bạn là người dùng đầu tiên và sẽ được chỉ định làm quản trị viên. Bạn có thể xem cài đặt quản trị viên trong menu thả xuống người dùng ở thanh bên. Nếu bạn cho rằng đây là lỗi, hãy kiểm tra nhật ký Docker hoặc tạo sự cố trên GitHub.", - "external": "Bên ngoài", - "loginWithExternal": "Đăng nhập bằng tài khoản nhà cung cấp bên ngoài", - "loginWithExternalDesc": "Đăng nhập bằng nhà cung cấp danh tính bên ngoài đã được cấu hình của bạn", - "externalNotSupportedInElectron": "Hiện tại, ứng dụng Electron chưa hỗ trợ xác thực bên ngoài. Vui lòng sử dụng phiên bản web để đăng nhập bằng OIDC.", - "resetPasswordButton": "Đặt lại mật khẩu", - "sendResetCode": "Gửi mã đặt lại", - "resetCodeDesc": "Nhập tên người dùng của bạn để nhận mã đặt lại mật khẩu. Mã này sẽ được ghi lại trong nhật ký của container Docker.", - "resetCode": "Mã đặt lại", - "verifyCodeButton": "Xác minh mã", - "enterResetCode": "Nhập mã 6 chữ số từ nhật ký container Docker cho người dùng:", - "newPassword": "Mật khẩu mới", - "confirmNewPassword": "Xác nhận mật khẩu", - "enterNewPassword": "Nhập mật khẩu mới của bạn cho người dùng:", - "signUp": "Đăng ký", - "desktopApp": "Ứng dụng máy tính để bàn", - "loggingInToDesktopApp": "Đăng nhập vào ứng dụng máy tính để bàn", - "loadingServer": "Đang tải máy chủ...", - "dataLossWarning": "Việc đặt lại mật khẩu theo cách này sẽ xóa tất cả các máy chủ SSH đã lưu, thông tin đăng nhập và dữ liệu được mã hóa khác của bạn. Hành động này không thể hoàn tác. Chỉ sử dụng cách này nếu bạn đã quên mật khẩu và chưa đăng nhập.", - "authenticationDisabled": "Xác thực bị vô hiệu hóa", - "authenticationDisabledDesc": "Tất cả các phương thức xác thực hiện đang bị vô hiệu hóa. Vui lòng liên hệ với quản trị viên của bạn.", - "attemptsRemaining": "{{count}} lần thử còn lại" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "Xác minh khóa máy chủ SSH", - "keyChangedWarning": "Khóa máy chủ SSH đã thay đổi", - "firstConnectionTitle": "Lần đầu tiên kết nối với máy chủ này.", - "firstConnectionDescription": "Không thể xác minh tính xác thực của máy chủ này. Hãy kiểm tra xem dấu vân tay có khớp với những gì bạn mong đợi hay không.", - "keyChangedDescription": "Khóa máy chủ (host key) của máy chủ này đã thay đổi kể từ lần kết nối cuối cùng của bạn. Điều này có thể cho thấy một vấn đề về bảo mật.", - "previousKey": "Phím trước đó", - "newFingerprint": "Dấu vân tay mới", - "fingerprint": "Dấu vân tay", - "verifyInstructions": "Nếu bạn tin tưởng máy chủ này, hãy nhấp vào Chấp nhận để tiếp tục và lưu dấu vân tay này cho các kết nối trong tương lai.", - "securityWarning": "Cảnh báo an ninh", - "acceptAndContinue": "Chấp nhận và tiếp tục", - "acceptNewKey": "Chấp nhận khóa mới và tiếp tục" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "Không thể kết nối với cơ sở dữ liệu", - "unknownError": "Lỗi không xác định", - "loginFailed": "Đăng nhập thất bại", - "failedPasswordReset": "Không thể bắt đầu quá trình đặt lại mật khẩu.", - "failedVerifyCode": "Không thể xác minh mã đặt lại.", - "failedCompleteReset": "Không thể hoàn tất quá trình đặt lại mật khẩu.", - "invalidTotpCode": "Mã TOTP không hợp lệ", - "failedOidcLogin": "Không thể bắt đầu đăng nhập OIDC.", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "Đã yêu cầu đăng nhập im lặng, nhưng tính năng đăng nhập OIDC không khả dụng.", "failedUserInfo": "Không thể lấy thông tin người dùng sau khi đăng nhập.", - "oidcAuthFailed": "Xác thực OIDC thất bại", - "invalidAuthUrl": "URL xác thực không hợp lệ được nhận từ máy chủ phụ trợ.", - "requiredField": "Trường này là bắt buộc", - "minLength": "Độ dài tối thiểu là {{min}}", - "passwordMismatch": "Mật khẩu không khớp", - "passwordLoginDisabled": "Chức năng đăng nhập bằng tên người dùng/mật khẩu hiện đang bị vô hiệu hóa.", - "sessionExpired": "Phiên đăng nhập đã hết hạn - vui lòng đăng nhập lại.", - "totpRateLimited": "Tốc độ xác thực bị giới hạn: Quá nhiều lần thử xác thực TOTP. Vui lòng thử lại sau.", - "totpRateLimitedWithTime": "Tốc độ bị giới hạn: Quá nhiều lần thử xác thực TOTP. Vui lòng đợi {{time}} giây trước khi thử lại.", - "resetCodeRateLimited": "Tốc độ xác thực bị hạn chế: Quá nhiều lần xác thực. Vui lòng thử lại sau.", - "resetCodeRateLimitedWithTime": "Tốc độ xác thực bị giới hạn: Quá nhiều lần xác thực. Vui lòng đợi {{time}} giây trước khi thử lại.", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "Không thể lưu mã xác thực.", "failedToLoadServer": "Không thể tải máy chủ" }, "messages": { - "registrationDisabled": "Hiện tại, việc đăng ký tài khoản mới đã bị quản trị viên vô hiệu hóa. Vui lòng đăng nhập hoặc liên hệ với quản trị viên.", - "userNotAllowed": "Tài khoản của bạn không được phép đăng ký. Vui lòng liên hệ với quản trị viên.", - "databaseConnectionFailed": "Không thể kết nối đến máy chủ cơ sở dữ liệu.", - "resetCodeSent": "Mã đặt lại đã được gửi đến nhật ký Docker.", - "codeVerified": "Mã đã được xác minh thành công.", - "passwordResetSuccess": "Đặt lại mật khẩu thành công", - "loginSuccess": "Đăng nhập thành công", - "registrationSuccess": "Đăng ký thành công" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "Các đường hầm SSH cục bộ trên máy tính để bàn hướng đến các máy chủ SSH đã được cấu hình.", "c2sTunnelPresets": "Cài đặt sẵn đường hầm máy khách", "c2sTunnelPresetsDesc": "Lưu danh sách đường hầm cục bộ của ứng dụng máy tính để bàn này dưới dạng thiết lập máy chủ có tên, hoặc tải lại thiết lập đó vào ứng dụng này.", "c2sTunnelPresetsUnavailable": "Các thiết lập đường hầm dành cho máy khách chỉ khả dụng trong ứng dụng dành cho máy tính để bàn.", - "c2sPresetName": "Tên cài đặt sẵn", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "Tên cài đặt sẵn của khách hàng", "c2sPresetToLoad": "Cài đặt sẵn để tải", "c2sNoPresetSelected": "Chưa có cài đặt sẵn nào được chọn.", "c2sNoPresets": "Không có thiết lập nào được lưu.", - "c2sLoadPreset": "Trọng tải", - "c2sCurrentLocalConfig": "{{count}} Đường hầm máy khách cục bộ được cấu hình trên máy tính để bàn này.", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "Các thiết lập sẵn là các ảnh chụp nhanh cụ thể; việc tải một thiết lập sẽ thay thế danh sách đường hầm máy khách cục bộ của ứng dụng máy tính để bàn này.", "c2sPresetSaved": "Đã lưu cài đặt đường hầm máy khách", "c2sPresetLoaded": "Cài đặt đường hầm máy khách được tải cục bộ", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "Ngôn ngữ", - "keyPassword": "mật khẩu khóa", - "pastePrivateKey": "Dán khóa riêng tư của bạn vào đây...", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1 (nghe cục bộ)", "localTargetHost": "127.0.0.1 (địa chỉ IP mục tiêu trên máy tính này)", "socksListenerHost": "127.0.0.1 (Trình lắng nghe SOCKS)", - "enterPassword": "Nhập mật khẩu của bạn", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "Bảng điều khiển", - "loading": "Đang tải bảng điều khiển...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "Ủng hộ", + "support": "Support", "discord": "Discord", - "serverOverview": "Tổng quan về máy chủ", - "version": "Phiên bản", - "upToDate": "Đã cập nhật", - "updateAvailable": "Đã có bản cập nhật", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Phiên bản Beta", - "uptime": "Thời gian hoạt động", - "database": "Cơ sở dữ liệu", - "healthy": "Khỏe mạnh", - "error": "Lỗi", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "Tổng số máy chủ", - "totalTunnels": "Tổng số đường hầm", - "totalCredentials": "Tổng số chứng chỉ", - "recentActivity": "Hoạt động gần đây", - "reset": "Cài lại", - "loadingRecentActivity": "Đang tải hoạt động gần đây...", - "noRecentActivity": "Không có hoạt động gần đây", - "quickActions": "Thao tác nhanh", - "addHost": "Thêm máy chủ", - "addCredential": "Thêm thông tin đăng nhập", - "adminSettings": "Cài đặt quản trị", - "userProfile": "Hồ sơ người dùng", - "serverStats": "Thống kê máy chủ", - "loadingServerStats": "Đang tải thống kê máy chủ...", - "noServerData": "Không có dữ liệu máy chủ nào khả dụng", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", - "ram": "ĐẬP", - "customizeLayout": "Tùy chỉnh bảng điều khiển", - "dashboardSettings": "Cài đặt bảng điều khiển", - "enableDisableCards": "Kích hoạt/Vô hiệu hóa thẻ", - "resetLayout": "Khôi phục về mặc định", - "serverOverviewCard": "Tổng quan về máy chủ", - "recentActivityCard": "Hoạt động gần đây", - "networkGraphCard": "Đồ thị mạng", - "networkGraph": "Đồ thị mạng", - "quickActionsCard": "Thao tác nhanh", - "serverStatsCard": "Thống kê máy chủ", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "Chủ yếu", "panelSide": "Bên", - "justNow": "vừa nãy" + "justNow": "vừa nãy", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "ỔN ĐỊNH", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "Không có máy chủ nào được cấu hình", "online": "TRỰC TUYẾN", "offline": "NGOẠI TUYẾN", - "onlineLower": "Trực tuyến", - "nodes": "{{count}} nút", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "Thêm vào:", "commandPalette": "Bảng lệnh", "done": "Xong", "editModeInstructions": "Kéo các thẻ để sắp xếp lại thứ tự · Kéo đường phân cách cột để thay đổi kích thước cột · Kéo cạnh dưới của thẻ để thay đổi chiều cao · Biểu tượng thùng rác để xóa", "empty": "Trống", - "clear": "Thông thoáng" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "Thêm máy chủ", - "addGroup": "Thêm nhóm", - "addLink": "Thêm liên kết", - "zoomIn": "Phóng to", - "zoomOut": "Thu nhỏ", - "resetView": "Đặt lại chế độ xem", - "selectHost": "Chọn máy chủ", - "chooseHost": "Chọn một máy chủ...", - "parentGroup": "Nhóm phụ huynh", - "noGroup": "Không có nhóm", - "groupName": "Tên nhóm", - "color": "Màu sắc", - "source": "Nguồn", - "target": "Mục tiêu", - "moveToGroup": "Chuyển sang Nhóm", - "selectGroup": "Chọn nhóm...", - "addConnection": "Thêm kết nối", - "hostDetails": "Thông tin chủ nhà", - "removeFromGroup": "Xóa khỏi nhóm", - "addHostHere": "Thêm máy chủ tại đây", - "editGroup": "Chỉnh sửa nhóm", - "delete": "Xóa bỏ", - "add": "Thêm vào", - "create": "Tạo nên", - "move": "Di chuyển", - "connect": "Kết nối", - "createGroup": "Tạo nhóm", - "selectSourcePlaceholder": "Chọn nguồn...", - "selectTargetPlaceholder": "Chọn mục tiêu...", - "invalidFile": "Tệp không hợp lệ", - "hostAlreadyExists": "Máy chủ đã có trong sơ đồ mạng.", - "connectionExists": "Kết nối đã tồn tại", - "unknown": "Không rõ", - "name": "Tên", - "ip": "Địa chỉ IP", - "status": "Trạng thái", - "failedToAddNode": "Thêm nút không thành công", - "sourceDifferentFromTarget": "Nguồn và đích phải khác nhau", - "exportJSON": "Xuất JSON", - "importJSON": "Nhập JSON", - "terminal": "Phần cuối", - "fileManager": "Trình quản lý tập tin", - "tunnel": "Đường hầm", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", + "ip": "IP", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "Thống kê máy chủ", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "Chưa có nút nào" }, "docker": { - "notEnabled": "Docker chưa được kích hoạt trên máy chủ này.", - "validating": "Đang xác thực Docker...", - "connecting": "Đang kết nối...", - "error": "Lỗi", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "Không thể kết nối với Docker.", - "containerStarted": "Container {{name}} đã khởi động", - "failedToStartContainer": "Không thể khởi động container {{name}}", - "containerStopped": "Container {{name}} đã dừng", - "failedToStopContainer": "Không thể dừng container {{name}}", - "containerRestarted": "Container {{name}} đã khởi động lại", - "failedToRestartContainer": "Không thể khởi động lại container {{name}}", - "containerPaused": "Container {{name}} tạm dừng", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", "containerUnpaused": "Container {{name}} unpaused", - "failedToTogglePauseContainer": "Không thể chuyển đổi trạng thái tạm dừng cho vùng chứa {{name}}", - "containerRemoved": "Container {{name}} đã bị xóa", - "failedToRemoveContainer": "Không thể xóa container {{name}}", - "image": "Hình ảnh", - "ports": "Cảng", - "noPorts": "Không có cổng", - "start": "Bắt đầu", - "confirmRemoveContainer": "Bạn có chắc chắn muốn xóa vùng chứa '{{name}}' không? Hành động này không thể hoàn tác.", - "runningContainerWarning": "Cảnh báo: Container này hiện đang chạy. Việc xóa container này sẽ dừng container trước khi thực thi.", - "loadingContainers": "Đang xếp hàng vào container...", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Trình quản lý Docker", - "autoRefresh": "Tự động làm mới", + "autoRefresh": "Auto Refresh", "timestamps": "Dấu thời gian", "lines": "Dòng", - "filterLogs": "Lọc nhật ký...", - "refresh": "Làm cho khỏe lại", - "download": "Tải xuống", - "clear": "Thông thoáng", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "Nhật ký đã được tải xuống thành công", "last50": "50 cuối cùng", "last100": "100 cuối cùng", "last500": "500 cuối cùng", "last1000": "1000 cuối cùng", "allLogs": "Tất cả nhật ký", - "noLogsMatching": "Không tìm thấy nhật ký nào khớp với \"{{query}}\"", - "noLogsAvailable": "Không có nhật ký nào.", - "noContainersFound": "Không tìm thấy thùng chứa nào", - "noContainersFoundHint": "Hiện không có container Docker nào khả dụng trên máy chủ này.", - "searchPlaceholder": "Tìm kiếm container...", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "Tất cả trạng thái", - "stateRunning": "Đang chạy", + "stateRunning": "Running", "statePaused": "Tạm dừng", "stateExited": "Đã thoát", "stateRestarting": "Khởi động lại", - "noContainersMatchFilters": "Không có hộp đựng nào phù hợp với bộ lọc của bạn.", - "noContainersMatchFiltersHint": "Hãy thử điều chỉnh tiêu chí tìm kiếm hoặc lọc của bạn.", - "failedToFetchStats": "Không thể lấy số liệu thống kê vùng chứa", - "containerNotRunning": "Container không chạy", - "startContainerToViewStats": "Khởi động container để xem số liệu thống kê.", - "loadingStats": "Đang tải số liệu thống kê...", - "errorLoadingStats": "Lỗi khi tải số liệu thống kê", - "noStatsAvailable": "Không có số liệu thống kê nào.", - "cpuUsage": "Mức sử dụng CPU", - "current": "Hiện hành", - "memoryUsage": "Mức sử dụng bộ nhớ", - "networkIo": "I/O mạng", - "input": "Đầu vào", - "output": "Đầu ra", - "blockIo": "Nhập/Xuất khối", - "read": "Đọc", - "write": "Viết", - "pids": "PID", - "containerInformation": "Thông tin container", - "name": "Tên", - "id": "NHẬN DẠNG", - "state": "Tình trạng", - "containerMustBeRunning": "Container phải đang chạy để truy cập bảng điều khiển.", - "verificationCodePrompt": "Nhập mã xác minh", - "totpVerificationFailed": "Xác thực TOTP không thành công. Vui lòng thử lại.", - "warpgateVerificationFailed": "Xác thực Warpgate thất bại. Vui lòng thử lại.", - "connectedTo": "Đã kết nối với {{containerName}}", - "disconnected": "Đã ngắt kết nối", - "consoleError": "Lỗi bảng điều khiển", - "errorMessage": "Lỗi: {{message}}", - "failedToConnect": "Không thể kết nối với container", - "console": "Bảng điều khiển", - "selectShell": "Chọn vỏ", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", + "id": "ID", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", - "ash": "tro", - "connect": "Kết nối", - "disconnect": "Ngắt kết nối", - "notConnected": "Không kết nối", - "clickToConnect": "Nhấp vào \"Kết nối\" để bắt đầu phiên shell.", - "connectingTo": "Đang kết nối với {{containerName}}...", - "containerNotFound": "Không tìm thấy container", - "backToList": "Trở lại danh sách", - "logs": "Nhật ký", - "stats": "Thống kê", - "consoleTab": "Bảng điều khiển", - "startContainerToAccess": "Khởi động container để truy cập bảng điều khiển." + "ash": "ash", + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "Tổng quan", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "Người dùng", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "Phiên họp", - "sectionRoles": "Vai trò", - "sectionDatabase": "Cơ sở dữ liệu", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "Khóa API", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "Xóa bộ lọc", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "Tất cả", "allowRegistration": "Cho phép đăng ký người dùng", - "allowRegistrationDesc": "Cho phép người dùng mới tự đăng ký", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "Cho phép đăng nhập bằng mật khẩu", "allowPasswordLoginDesc": "Đăng nhập bằng tên người dùng/mật khẩu", "oidcAutoProvision": "Tự động cung cấp OIDC", - "oidcAutoProvisionDesc": "Tự động tạo tài khoản cho người dùng OIDC ngay cả khi tính năng đăng ký bị vô hiệu hóa.", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "Cho phép đặt lại mật khẩu", "allowPasswordResetDesc": "Đặt lại mã thông qua nhật ký Docker", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "Hết thời gian phiên", - "hours": "giờ", + "hours": "hours", "sessionTimeoutRange": "Tối thiểu 1 giờ · Tối đa 720 giờ", - "monitoringDefaults": "Giám sát các thiết lập mặc định", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "Kiểm tra trạng thái", - "metrics": "Số liệu", + "metrics": "Metrics", "sec": "giây", "logLevel": "Mức độ ghi nhật ký", "enableGuacamole": "Bật Guacamole", "enableGuacamoleDesc": "Máy tính từ xa RDP/VNC", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "URL guacd", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "Cấu hình OpenID Connect cho SSO. Các trường được đánh dấu * là bắt buộc.", - "oidcClientId": "Mã khách hàng", - "oidcClientSecret": "Bí mật khách hàng", - "oidcAuthUrl": "URL ủy quyền", - "oidcIssuerUrl": "URL của tổ chức phát hành", - "oidcTokenUrl": "URL mã thông báo", - "oidcUserIdentifier": "Đường dẫn định danh người dùng", - "oidcDisplayName": "Đường dẫn tên hiển thị", - "oidcScopes": "Phạm vi", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "Ghi đè URL thông tin người dùng", - "oidcAllowedUsers": "Người dùng được phép", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "Một địa chỉ email trên mỗi dòng. Để trống nếu muốn hiển thị tất cả.", - "removeOidc": "Di dời", - "usersCount": "{{count}} người dùng", - "createUser": "Tạo nên", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "Vai trò mới", - "roleName": "Tên", - "roleDisplayName": "Tên hiển thị", - "roleDescription": "Sự miêu tả", - "rolesCount": "{{count}} vai trò", - "createRole": "Tạo nên", - "creating": "Đang tạo...", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "Xuất cơ sở dữ liệu", "exportDatabaseDesc": "Tải xuống bản sao lưu tất cả máy chủ, thông tin đăng nhập và cài đặt.", - "export": "Xuất khẩu", - "exporting": "Đang xuất khẩu...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "Nhập cơ sở dữ liệu", "importDatabaseDesc": "Khôi phục từ tệp sao lưu .sqlite", - "importDatabaseSelected": "Đã chọn: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "Chọn tệp", - "changeFile": "Thay đổi", - "import": "Nhập khẩu", - "importing": "Đang nhập khẩu...", - "apiKeysCount": "{{count}} phím", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "Khóa API mới", "apiKeyCreatedWarning": "Mã khóa đã được tạo - hãy sao chép ngay, mã này sẽ không hiển thị lại nữa.", - "apiKeyName": "Tên", - "apiKeyUser": "Người dùng", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "Chọn người dùng...", - "apiKeyExpiresAt": "Hết hạn vào lúc", + "apiKeyExpiresAt": "Expires At", "createKey": "Tạo khóa", "apiKeyNoExpiry": "Không hết hạn", "revokedBadge": "ĐÃ THU HỒI", - "authTypeDual": "Xác thực kép", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "Địa phương", - "adminStatusAdministrator": "Quản trị viên", - "adminStatusRegularUser": "Người dùng thông thường", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "QUẢN TRỊ VIÊN", "systemBadge": "HỆ THỐNG", "customBadge": "PHONG TỤC", "youBadge": "BẠN", - "sessionsActive": "{{count}} đang hoạt động", - "sessionActive": "Đang hoạt động: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "Tất cả", "revokeAllSessionsSuccess": "Tất cả các phiên đăng nhập của người dùng đã bị thu hồi.", - "revokeAllSessionsFailed": "Không thể hủy bỏ các phiên", - "revokeSessionFailed": "Không thể hủy phiên", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "Thêm vai trò", "noCustomRoles": "Không có vai trò tùy chỉnh nào được định nghĩa.", - "removeRoleFailed": "Không thể xóa vai trò", - "assignRoleFailed": "Không thể gán vai trò", - "deleteRoleFailed": "Không thể xóa vai trò", - "userAdminAccess": "Quản trị viên", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "Toàn quyền truy cập vào tất cả các thiết lập quản trị.", - "userRoles": "Vai trò", - "revokeAllUserSessions": "Hủy bỏ tất cả các phiên", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "Buộc đăng nhập lại trên tất cả các thiết bị.", - "revoke": "Thu hồi", + "revoke": "Revoke", "deleteUserWarning": "Việc xóa người dùng này là vĩnh viễn.", - "deleteUser": "Xóa {{username}}", - "deleting": "Đang xóa...", - "deleteUserFailed": "Không thể xóa người dùng.", - "deleteUserSuccess": "Người dùng \"{{username}}\" đã bị xóa", - "deleteRoleSuccess": "Vai trò \"{{name}}\" đã bị xóa", - "revokeKeySuccess": "Khóa \"{{name}}\" đã bị thu hồi", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "Không thể thu hồi khóa.", - "copiedToClipboard": "Đã sao chép vào clipboard", + "copiedToClipboard": "Copied to clipboard", "done": "Xong", - "createUserTitle": "Tạo người dùng", + "createUserTitle": "Create User", "createUserDesc": "Tạo tài khoản cục bộ mới.", - "createUserUsername": "Tên người dùng", - "createUserPassword": "Mật khẩu", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "Tối thiểu 6 ký tự.", - "createUserEnterUsername": "Nhập tên người dùng", - "createUserEnterPassword": "Nhập mật khẩu", - "createUserSubmit": "Tạo người dùng", - "editUserTitle": "Quản lý người dùng: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "Chỉnh sửa vai trò, trạng thái quản trị viên, phiên làm việc và cài đặt tài khoản.", - "editUserUsername": "Tên người dùng", + "editUserUsername": "Username", "editUserAuthType": "Loại xác thực", - "editUserAdminStatus": "Trạng thái quản trị viên", - "editUserUserId": "ID người dùng", - "linkAccountTitle": "Liên kết OIDC với tài khoản mật khẩu", - "linkAccountDesc": "Hợp nhất tài khoản OIDC {{username}} với tài khoản cục bộ hiện có.", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "Điều này sẽ:", "linkAccountEffect1": "Xóa tài khoản chỉ dành cho OIDC", "linkAccountEffect2": "Thêm thông tin đăng nhập OIDC vào tài khoản mục tiêu.", "linkAccountEffect3": "Cho phép cả đăng nhập bằng OIDC và mật khẩu.", - "linkAccountTargetUsername": "Tên người dùng mục tiêu", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "Nhập tên người dùng tài khoản cục bộ cần liên kết.", - "linkAccounts": "Liên kết tài khoản", - "linkAccountSuccess": "Tài khoản OIDC được liên kết với \"{{username}}\"", - "linkAccountFailed": "Không thể liên kết tài khoản OIDC.", - "linkAccountInProgress": "Đang liên kết...", - "saving": "Đang lưu...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "Không thể cập nhật cài đặt đăng ký.", "updatePasswordLoginFailed": "Không thể cập nhật cài đặt mật khẩu đăng nhập.", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "Không thể cập nhật cài đặt tự động cấp phép OIDC.", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "Không thể cập nhật cài đặt đặt lại mật khẩu.", "sessionTimeoutRange2": "Thời gian chờ phiên phải nằm trong khoảng từ 1 đến 720 giờ.", "sessionTimeoutSaved": "Thời gian chờ phiên đã được lưu", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "Giá trị khoảng thời gian không hợp lệ", "monitoringSaved": "Cài đặt giám sát đã được lưu", "monitoringSaveFailed": "Không thể lưu cài đặt giám sát.", - "guacamoleSaved": "Cài đặt guacamole đã được lưu", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "Không thể lưu cài đặt Guacamole.", "guacamoleUpdateFailed": "Không thể cập nhật cài đặt Guacamole.", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "Không thể cập nhật mức độ ghi nhật ký", "oidcSaved": "Cấu hình OIDC đã được lưu.", "oidcSaveFailed": "Không thể lưu cấu hình OIDC.", "oidcRemoved": "Cấu hình OIDC đã bị xóa", "oidcRemoveFailed": "Không thể xóa cấu hình OIDC.", "createUserRequired": "Tên người dùng và mật khẩu là bắt buộc.", - "createUserPasswordTooShort": "Mật khẩu phải có ít nhất 6 ký tự.", - "createUserSuccess": "Người dùng \"{{username}}\" đã tạo", - "createUserFailed": "Không thể tạo người dùng.", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "Không thể cập nhật trạng thái quản trị viên.", "allSessionsRevoked": "Tất cả các phiên đã bị hủy bỏ", - "revokeSessionsFailed": "Không thể hủy bỏ các phiên", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "Tên và tên hiển thị là bắt buộc", - "createRoleSuccess": "Vai trò \"{{name}}\" đã được tạo", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "Không thể tạo vai trò", "apiKeyNameRequired": "Tên khóa là bắt buộc", "apiKeyUserRequired": "Cần có ID người dùng.", - "apiKeyCreatedSuccess": "Khóa API \"{{name}}\" đã được tạo", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Không thể tạo khóa API", "exportSuccess": "Cơ sở dữ liệu đã được xuất thành công.", "exportFailed": "Xuất cơ sở dữ liệu thất bại", "importSelectFile": "Vui lòng chọn tệp trước", - "importCompleted": "Quá trình nhập khẩu hoàn tất: {{total}} mục đã được nhập, {{skipped}} mục bị bỏ qua", - "importFailed": "Nhập khẩu thất bại: {{error}}", - "importError": "Nhập dữ liệu cơ sở dữ liệu thất bại" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Nhập dữ liệu cơ sở dữ liệu thất bại", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "Chủ nhà", - "hostPlaceholder": "192.168.1.1 hoặc example.com", - "portLabel": "Cảng", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "Tên người dùng", - "usernamePlaceholder": "tên người dùng", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "Xác thực", - "passwordLabel": "Mật khẩu", - "passwordPlaceholder": "mật khẩu", - "privateKeyLabel": "Khóa riêng tư", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "Dán khóa riêng tư...", - "credentialLabel": "Chứng chỉ", + "credentialLabel": "Credential", "credentialPlaceholder": "Chọn thông tin đăng nhập đã lưu", - "connectToTerminal": "Kết nối với thiết bị đầu cuối", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "Kết nối với các tệp" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "Xóa tất cả", "noHistoryEntries": "Không có mục lịch sử nào", "trackingDisabled": "Tính năng theo dõi lịch sử đã bị vô hiệu hóa.", - "trackingDisabledHint": "Hãy bật tính năng này trong cài đặt hồ sơ của bạn để ghi lại các lệnh." + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "Ghi âm chính", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "Ghi vào thiết bị đầu cuối", "selectAll": "Tất cả", - "selectNone": "Không có", + "selectNone": "None", "noTerminalTabsOpen": "Không có tab terminal nào đang mở.", "selectTerminalsAbove": "Chọn các thiết bị đầu cuối ở trên", "broadcastInputPlaceholder": "Nhập vào đây để phát sóng các thao tác gõ phím...", "stopRecording": "Dừng ghi âm", "startRecording": "Bắt đầu ghi âm", - "settingsTitle": "Cài đặt", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "Cho phép sao chép/dán bằng chuột phải." }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "Kéo các tab vào các khung phía trên hoặc sử dụng chức năng Gán nhanh.", "dropHere": "Thả xuống đây", "emptyPane": "Trống", - "dashboard": "Bảng điều khiển", + "dashboard": "Dashboard", "clearSplitScreen": "Xóa màn hình chia đôi", "quickAssign": "Phân công nhanh", "alreadyAssigned": "Pane {{index}}", "splitTab": "Chia tab", "addToSplit": "Thêm vào phần chia", "removeFromSplit": "Xóa khỏi phần Chia", - "assignToPane": "Gán vào ngăn" + "assignToPane": "Gán vào ngăn", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "Tạo đoạn mã", - "createSnippetDescription": "Tạo một đoạn mã lệnh mới để thực thi nhanh.", - "nameLabel": "Tên", - "namePlaceholder": "Ví dụ: Khởi động lại Nginx", - "descriptionLabel": "Sự miêu tả", - "descriptionPlaceholder": "Mô tả tùy chọn", - "optional": "Không bắt buộc", - "folderLabel": "Thư mục", - "noFolder": "Không có thư mục (Chưa được phân loại)", - "commandLabel": "Yêu cầu", - "commandPlaceholder": "Ví dụ: sudo systemctl restart nginx", - "cancel": "Hủy bỏ", - "createSnippetButton": "Tạo đoạn mã", - "createFolderTitle": "Tạo thư mục", - "createFolderDescription": "Sắp xếp các đoạn văn bản của bạn vào các thư mục.", - "folderNameLabel": "Tên thư mục", - "folderNamePlaceholder": "Ví dụ: Lệnh hệ thống, tập lệnh Docker", - "folderColorLabel": "Màu thư mục", - "folderIconLabel": "Biểu tượng thư mục", - "previewLabel": "Xem trước", - "folderNameFallback": "Tên thư mục", - "createFolderButton": "Tạo thư mục", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "Các thiết bị đầu cuối mục tiêu", "selectAll": "Tất cả", - "selectNone": "Không có", + "selectNone": "None", "noTerminalTabsOpen": "Không có tab terminal nào đang mở.", - "searchPlaceholder": "Đoạn trích kết quả tìm kiếm...", - "newSnippet": "Đoạn mã mới", - "newFolder": "Thư mục mới", - "run": "Chạy", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "Không có đoạn mã nào trong thư mục này.", - "uncategorized": "Chưa được phân loại", - "editSnippetTitle": "Chỉnh sửa đoạn mã", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "Cập nhật đoạn mã lệnh này", "saveSnippetButton": "Lưu thay đổi", - "createSuccess": "Đoạn mã đã được tạo thành công", - "createFailed": "Không thể tạo đoạn mã", - "updateSuccess": "Đoạn mã đã được cập nhật thành công.", - "updateFailed": "Không thể cập nhật đoạn mã", - "deleteFailed": "Không thể xóa đoạn mã", - "folderCreateSuccess": "Thư mục đã được tạo thành công", - "folderCreateFailed": "Không thể tạo thư mục", - "editFolderTitle": "Chỉnh sửa thư mục", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "Đổi tên hoặc thay đổi giao diện của thư mục này.", "saveFolderButton": "Lưu thay đổi", "editFolder": "Chỉnh sửa thư mục", "deleteFolder": "Xóa thư mục", - "folderDeleteSuccess": "Thư mục \"{{name}}\" đã bị xóa", - "folderDeleteFailed": "Không thể xóa thư mục", - "folderEditSuccess": "Thư mục đã được cập nhật thành công.", - "folderEditFailed": "Không thể cập nhật thư mục.", - "confirmRunMessage": "Chạy \"{{name}}\"?", - "confirmRunButton": "Chạy", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", - "copySuccess": "Đã sao chép \"{{name}}\" vào clipboard", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "Chia sẻ đoạn trích", - "shareUser": "Người dùng", - "shareRole": "Vai trò", + "shareUser": "User", + "shareRole": "Role", "selectUser": "Chọn người dùng...", "selectRole": "Chọn một vai trò...", "shareSuccess": "Đoạn mã đã được chia sẻ thành công", "shareFailed": "Không thể chia sẻ đoạn trích", "revokeSuccess": "Quyền truy cập đã bị thu hồi", - "revokeFailed": "Không thể thu hồi quyền truy cập", - "currentAccess": "Truy cập hiện tại", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "Không thể tải dữ liệu chia sẻ", - "loading": "Đang tải...", - "close": "Đóng", - "reorderFailed": "Không thể lưu thứ tự đoạn mã." + "loading": "Loading...", + "close": "Close", + "reorderFailed": "Không thể lưu thứ tự đoạn mã.", + "importExport": "Nhập khẩu / Xuất khẩu", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "Không có máy chủ nào được cấu hình", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "Tài khoản", - "sectionAppearance": "Vẻ bề ngoài", - "sectionSecurity": "Bảo vệ", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "Khóa API", "sectionC2sTunnels": "Đường hầm C2S", - "usernameLabel": "Tên người dùng", - "roleLabel": "Vai trò", - "roleAdministrator": "Quản trị viên", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "Phương thức xác thực", - "authMethodLocal": "Địa phương", + "authMethodLocal": "Local", "twoFaLabel": "Xác thực hai yếu tố", "twoFaOn": "TRÊN", "twoFaOff": "Tắt", - "versionLabel": "Phiên bản", - "deleteAccount": "Xóa tài khoản", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "Xóa vĩnh viễn tài khoản của bạn", - "deleteButton": "Xóa bỏ", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "Hành động này là vĩnh viễn và không thể đảo ngược.", "deleteAccountWarning": "Tất cả các phiên, máy chủ, thông tin đăng nhập và cài đặt sẽ bị xóa vĩnh viễn.", - "confirmPasswordDeletePlaceholder": "Nhập mật khẩu của bạn để xác nhận", - "languageLabel": "Ngôn ngữ", - "themeLabel": "Chủ đề", - "fontSizeLabel": "Kích thước phông chữ", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "Màu nhấn", - "settingsTerminal": "Phần cuối", - "commandAutocomplete": "Tự động hoàn thành lệnh", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "Hiển thị tính năng tự động hoàn thành khi đang gõ", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "Theo dõi lịch sử", "historyTrackingDesc": "Theo dõi lệnh đầu cuối", - "syntaxHighlighting": "Tô sáng cú pháp", - "syntaxHighlightingDesc": "Đánh dấu đầu ra thiết bị đầu cuối", "commandPalette": "Bảng lệnh", "commandPaletteDesc": "Bật phím tắt", "reopenTabsOnLogin": "Mở lại các tab khi đăng nhập", "reopenTabsOnLoginDesc": "Khôi phục các tab đang mở khi bạn đăng nhập hoặc làm mới trang, ngay cả khi bạn đang sử dụng thiết bị khác.", "confirmTabClose": "Xác nhận đóng tab", "confirmTabCloseDesc": "Hãy hỏi trước khi đóng các tab cửa sổ terminal.", - "settingsSidebar": "Thanh bên", - "showHostTags": "Thẻ người dẫn chương trình", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "Hiển thị thẻ trong danh sách máy chủ", "hostTrayOnClick": "Nhấp chuột để mở rộng các hành động của máy chủ", "hostTrayOnClickDesc": "Luôn hiển thị các nút kết nối; nhấp chuột để mở rộng các tùy chọn quản lý thay vì di chuột.", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Ghim ứng dụng Rail", "pinAppRailDesc": "Giữ cho thanh bên trái của ứng dụng luôn mở rộng thay vì chỉ mở rộng khi di chuột.", - "settingsSnippets": "Những đoạn trích", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "Các thư mục đã được thu gọn", "foldersCollapsedDesc": "Thu gọn thư mục theo mặc định", "confirmExecution": "Xác nhận thực thi", "confirmExecutionDesc": "Xác nhận trước khi chạy các đoạn mã.", - "settingsUpdates": "Cập nhật", + "settingsUpdates": "Updates", "disableUpdateChecks": "Tắt kiểm tra cập nhật", "disableUpdateChecksDesc": "Hãy ngừng kiểm tra cập nhật.", "totpAuthenticator": "Bộ xác thực TOTP", @@ -2109,68 +2612,68 @@ "qrCode": "Mã QR", "totpInstructions": "Quét mã QR hoặc nhập mã bí mật vào ứng dụng xác thực của bạn, sau đó nhập mã 6 chữ số.", "totpCodePlaceholder": "000000", - "verify": "Xác minh", - "changePassword": "Thay đổi mật khẩu", - "currentPasswordLabel": "Mật khẩu hiện tại", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "Mật khẩu hiện tại", - "newPasswordLabel": "Mật khẩu mới", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "Mật khẩu mới", "confirmPasswordLabel": "Xác nhận mật khẩu mới", "confirmPasswordPlaceholder": "Xác nhận mật khẩu mới", "updatePassword": "Cập nhật mật khẩu", "createApiKeyTitle": "Tạo khóa API", "createApiKeyDescription": "Tạo khóa API mới để truy cập lập trình.", - "apiKeyNameLabel": "Tên", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "ví dụ CI Pipeline", "expiryDateLabel": "Ngày hết hạn", "optional": "không bắt buộc", - "cancel": "Hủy bỏ", + "cancel": "Cancel", "createKey": "Tạo khóa", - "apiKeyCount": "{{count}} phím", + "apiKeyCount": "{{count}} keys", "newKey": "Khóa mới", "noApiKeys": "Chưa có khóa API.", - "apiKeyActive": "Tích cực", + "apiKeyActive": "Active", "apiKeyUsageHint": "Bao gồm cả chìa khóa của bạn trong", "apiKeyUsageHintHeader": "tiêu đề.", "apiKeyPermissionsHint": "Các khóa kế thừa quyền hạn của người dùng tạo ra chúng.", - "roleUser": "Người dùng", - "authMethodDual": "Xác thực kép", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "Không thể bắt đầu thiết lập TOTP.", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "Nhập mã 6 chữ số", "totpEnabledSuccess": "Đã bật xác thực hai yếu tố", "totpInvalidCode": "Mã không hợp lệ, vui lòng thử lại.", "totpDisableInputRequired": "Nhập mã TOTP hoặc mật khẩu của bạn", - "totpDisabledSuccess": "Xác thực hai yếu tố đã bị vô hiệu hóa", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "Không thể tắt xác thực hai yếu tố (2FA).", - "totpDisableTitle": "Vô hiệu hóa xác thực hai yếu tố (2FA).", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "Nhập mã TOTP hoặc mật khẩu", - "totpDisableConfirm": "Vô hiệu hóa xác thực hai yếu tố (2FA).", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "Tiếp tục xác minh", - "totpVerifyTitle": "Xác minh mã", - "totpBackupTitle": "Mã dự phòng", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "Tải xuống mã sao lưu", "done": "Xong", "secretCopied": "Bí mật đã được sao chép vào clipboard", "apiKeyNameRequired": "Tên khóa là bắt buộc", - "apiKeyCreated": "Khóa API \"{{name}}\" đã được tạo", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "Không thể tạo khóa API", - "apiKeyUser": "Người dùng", - "apiKeyExpires": "Hết hạn", - "apiKeyRevoked": "Khóa API \"{{name}}\" đã bị thu hồi", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "Không thể thu hồi khóa API.", "passwordFieldsRequired": "Cần có mật khẩu hiện tại và mật khẩu mới.", - "passwordMismatch": "Mật khẩu không khớp", - "passwordTooShort": "Mật khẩu phải có ít nhất 6 ký tự.", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "Mật khẩu đã được cập nhật thành công.", "passwordUpdateFailed": "Không thể cập nhật mật khẩu.", "deletePasswordRequired": "Bạn cần nhập mật khẩu để xóa tài khoản của mình.", - "deleteFailed": "Không thể xóa tài khoản", - "deleting": "Đang xóa...", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "Mở công cụ chọn màu", - "themeSystem": "Hệ thống", - "themeLight": "Ánh sáng", - "themeDark": "Tối tăm", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Bắc", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "vừa nãy", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Mũi tên lên", + "arrowDown": "Mũi tên xuống", + "arrowLeft": "Mũi tên sang trái", + "arrowRight": "Mũi tên sang phải", + "home": "Home", + "end": "Kết thúc", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Xong" } } diff --git a/src/ui/locales/translated/zh_CN.json b/src/ui/locales/translated/zh_CN.json index db15fa4f..8ec7ee78 100644 --- a/src/ui/locales/translated/zh_CN.json +++ b/src/ui/locales/translated/zh_CN.json @@ -3,577 +3,742 @@ "folders": "文件夹", "folder": "文件夹", "password": "密码", - "key": "密钥", + "key": "钥匙", "sshPrivateKey": "SSH 私钥", "upload": "上传", - "keyPassword": "密钥密码", + "keyPassword": "Key Password", "sshKey": "SSH密钥", - "uploadPrivateKeyFile": "上传私钥文件", - "searchCredentials": "搜索凭证...", - "addCredential": "添加凭证", - "caCertificate": "CA证书 (-cert.pub)", - "caCertificateDescription": "可选:上传或粘贴CA签名的证书文件(例如id_ed25519-cert.pub)。当您的 SSH 服务器使用基于证书的授权时是必需的。", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "搜索凭据...", + "addCredential": "Add Credential", + "caCertificate": "CA Certificate (-cert.pub)", + "caCertificateDescription": "可选:上传或粘贴 CA 签名的证书文件(例如 id_ed25519-cert.pub)。如果您的 SSH 服务器使用基于证书的授权,则此步骤为必需。", "uploadCertFile": "上传 -cert.pub 文件", - "clearCert": "清空", - "certLoaded": "证书已加载", - "certPublicKeyLabel": "CA 证书", - "certTypeLabel": "证书类型", - "pasteOrUploadCert": "粘贴或上传一个 -cert.pub 证书...", - "hasCaCert": "有CA证书", - "noCaCert": "无CA证书" + "clearCert": "Clear", + "certLoaded": "Certificate loaded", + "certPublicKeyLabel": "CA Certificate", + "certTypeLabel": "Certificate type", + "pasteOrUploadCert": "粘贴或上传 -cert.pub 证书...", + "hasCaCert": "Has CA Certificate", + "noCaCert": "No CA Certificate", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "默认订单", + "sortNameAsc": "姓名(A → Z)", + "sortNameDesc": "姓名(Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "清除筛选条件", + "filterTypeGroup": "Type", + "filterTypePassword": "密码", + "filterTypeKey": "SSH密钥", + "filterTagsGroup": "标签" }, "homepage": { - "failedToLoadAlerts": "警报加载失败", - "failedToDismissAlert": "未能关闭警报" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "服务器配置", - "description": "配置 Termix 服务器 URL 以连接到您的后端服务", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", "serverUrl": "服务器 URL", - "enterServerUrl": "请输入服务器URL", - "saveFailed": "配置保存失败", - "saveError": "保存配置时出错", - "saving": "保存中...", - "saveConfig": "保存配置", - "helpText": "输入您的 Termix 服务器运行所对应的 URL(例如,http://localhost:30001 或 https://your-server.com)", - "changeServer": "变更服务器", - "mustIncludeProtocol": "服务器 URL 必须以 http:// 或 https:// 开头。", + "enterServerUrl": "请输入服务器网址", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "允许无效证书", "allowInvalidCertificateDesc": "仅适用于具有自签名证书或 IP 地址证书的受信任的自托管服务器。", - "useEmbedded": "使用本地服务器", - "embeddedDesc": "使用内置的本地服务器运行 Termixed (不需要远程服务器)", + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", "embeddedConnecting": "正在连接本地服务器...", - "embeddedNotReady": "本地服务器尚未准备就绪。请稍等,然后重试。", - "localServer": "本地服务器" + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "Local Server", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "版本检查错误", - "checkFailed": "检查更新失败", - "upToDate": "应用已更新至最新版本", - "currentVersion": "您正在运行版本 {{version}}", - "updateAvailable": "更新可用", - "newVersionAvailable": "新版本已发布!您当前运行的是 {{current}} 版本,但 {{latest}} 版本可用。", - "betaVersion": "测试版", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "新版本可用!您正在运行 {{current}},但 {{latest}} 可用。", + "betaVersion": "Beta Version", "betaVersionDesc": "您正在运行 {{current}},它比最新的稳定版本 {{latest}} 更新。", - "releasedOn": "发布日期:{{date}}", + "releasedOn": "Released on {{date}}", "downloadUpdate": "下载更新", - "checking": "正在检查更新...", - "checkUpdates": "检查更新", - "checkingUpdates": "正在检查更新...", - "updateRequired": "需要更新" + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "关闭", - "minimize": "最小化", - "online": "在线", + "close": "Close", + "minimize": "Minimize", + "online": "在线的", "offline": "离线", - "continue": "继续", - "maintenance": "维护", - "degraded": "降级", - "error": "错误", - "warning": "警告", - "unsavedChanges": "未保存的更改", - "dismiss": "关闭", - "loading": "加载中...", - "optional": "选修的", - "connect": "连接", - "copied": "已复制", - "connecting": "正在连接...", - "updateAvailable": "更新可用", - "appName": "Termixe", - "openInNewTab": "在新标签中打开", - "noReleases": "无发布", - "updatesAndReleases": "更新与发布", - "newVersionAvailable": "新版本({{version}})可用。", - "failedToFetchUpdateInfo": "获取更新信息失败", - "preRelease": "预发布", - "noReleasesFound": "未找到任何版本。", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", + "appName": "Termix", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", "cancel": "取消", "username": "用户名", "login": "登录", - "register": "注册", + "logout": "Logout", + "register": "Register", "password": "密码", - "confirmPassword": "确认密码", - "back": "返回", - "save": "保存", - "saving": "保存中...", - "delete": "删除", - "rename": "重命名:", - "edit": "编辑", - "add": "添加", - "confirm": "确认", - "no": "否", - "or": "或", - "next": "下一个", - "previous": "上一个", - "refresh": "刷新", - "language": "语言", - "checking": "检查...", - "checkingDatabase": "正在检查数据库连接...", - "checkingAuthentication": "正在检查认证...", - "backendReconnected": "服务器连接已恢复", - "connectionDegraded": "服务器连接丢失,正在恢复…", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", "reload": "Reload", - "remove": "移除", - "create": "创建", - "update": "更新", + "remove": "Remove", + "create": "Create", + "update": "Update", "copy": "复制", - "copyFailed": "复制到剪贴板失败", + "copyFailed": "Failed to copy to clipboard", "maximize": "Maximize", - "restore": "恢复", - "of": "共" + "restore": "Restore", + "of": "的", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "首页", - "terminal": "终端", - "docker": "停靠栏", + "home": "Home", + "terminal": "Terminal", + "docker": "Docker", "tunnels": "隧道", "fileManager": "文件管理器", - "serverStats": "服务器统计信息", - "admin": "admin", - "userProfile": "用户配置", - "splitScreen": "分屏", - "confirmClose": "关闭此活动会话?", - "close": "关闭", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "用户个人资料", + "splitScreen": "Split Screen", + "confirmClose": "Close this active session?", + "close": "Close", "cancel": "取消", - "sshManager": "SSH 管理器", - "cannotSplitTab": "无法拆分此选项卡", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "复制密码", - "copySudoPassword": "复制Sudo密码", - "passwordCopied": "密码已复制到剪贴板", - "noPasswordAvailable": "没有可用密码", - "failedToCopyPassword": "无法复制密码", - "refreshTab": "刷新连接", - "openFileManager": "打开文件管理器", - "dashboard": "仪表板", - "networkGraph": "网络图", - "quickConnect": "快速连接", - "sshTools": "SSH 工具", - "history": "历史记录", - "hosts": "主机", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", + "failedToCopyPassword": "Failed to copy password", + "refreshTab": "Refresh connection", + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", "snippets": "片段", - "hostManager": "主机管理器", - "credentials": "凭证", + "hostManager": "Host Manager", + "credentials": "Credentials", "connections": "连接", - "roleAdministrator": "管理员", - "roleUser": "用户" + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "主机", - "noHosts": "无 SSH 主机", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", "retry": "重试", - "refresh": "刷新", - "optional": "可选的", - "downloadSample": "下载示例", - "failedToDeleteHost": "删除失败 {{name}}", - "importSkipExisting": "导入(跳过存在)", - "connectionDetails": "连接详情", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "远程桌面", - "port": "端口", + "remoteDesktop": "Remote Desktop", + "port": "Port", "username": "用户名", "folder": "文件夹", "tags": "标签", - "pin": "置顶", - "addHost": "添加主机", - "editHost": "编辑主机", - "cloneHost": "克隆主机", - "enableTerminal": "启用终端", - "enableTunnel": "启用隧道", - "enableFileManager": "启用文件管理器", - "enableDocker": "启用 Docker", - "defaultPath": "默认路径", - "connection": "连接", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", "upload": "上传", - "authentication": "验证", + "authentication": "Authentication", "password": "密码", - "key": "密钥", - "credential": "凭证", - "none": "无", + "key": "钥匙", + "credential": "凭据", + "none": "没有任何", "sshPrivateKey": "SSH 私钥", - "keyType": "密钥类型", - "uploadFile": "上传文件", - "tabGeneral": "A. 概况", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "一般的", "tabSsh": "SSH", - "tabRdp": "RDP", + "tabTerminal": "Terminal", + "tabRdp": "远程桌面协议", "tabVnc": "VNC", - "tabTunnels": "隧道设置", - "tabDocker": "停靠栏", + "tabTunnels": "隧道", + "tabDocker": "Docker", "tabFiles": "文件", - "tabStats": "统计信息", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "分享", - "tabAuthentication": "认证", - "terminal": "终端", - "tunnel": "隧道", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", "fileManager": "文件管理器", - "serverStats": "服务器统计信息", - "status": "状态", - "folderRenamed": "文件夹“{{oldName}}”已成功重命名为“{{newName}}”。", - "failedToRenameFolder": "重命名文件夹失败", - "movedToFolder": "已移至“{{folder}}”", - "editHostTooltip": "编辑主机", - "statusChecks": "状态检查", - "metricsCollection": "计量收藏", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", "metricsInterval": "指标收集间隔", - "metricsIntervalDesc": "服务器统计信息收集频率(5秒-1小时)", - "behavior": "行为", - "themePreview": "主题预览", - "theme": "主题", - "fontFamily": "字体系列", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", "fontSize": "字体大小", - "letterSpacing": "字母间距", - "lineHeight": "行高", - "cursorStyle": "光标样式", - "cursorBlink": "光标闪烁", - "scrollbackBuffer": "回滚缓冲区", - "bellStyle": "提示音样式", - "rightClickSelectsWord": "右键单击选中单词", - "fastScrollModifier": "快速滚动修饰键", - "fastScrollSensitivity": "快速滚动灵敏度", - "sshAgentForwarding": "SSH代理转发", - "backspaceMode": "退格键模式", - "startupSnippet": "启动代码片段", - "selectSnippet": "选择代码片段", - "forceKeyboardInteractive": "强制键盘交互", - "overrideCredentialUsername": "覆盖凭证用户名", - "overrideCredentialUsernameDesc": "使用上面指定的用户名而不是凭据的用户名", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "启动片段", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", + "overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", "jumpHostChain": "跳转宿主链", - "portKnocking": "端口敲击中", - "addKnock": "添加端口", - "addProxyNode": "添加节点", - "proxyNode": "代理节点", - "proxyType": "代理类型", - "quickActions": "快速操作", + "portKnocking": "敲击", + "addKnock": "Add Port", + "addProxyNode": "Add Node", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", "sudoPasswordAutoFill": "Sudo 密码自动填充", - "sudoPassword": "Sudo 密码", - "keepaliveInterval": "保持活动间隔 (毫秒)", - "moshCommand": "MOSH 命令", - "environmentVariables": "环境变量", - "addVariable": "添加变量", - "docker": "停靠栏", - "copyTerminalUrl": "复制终端 URL", - "copyFileManagerUrl": "复制文件管理器 URL", - "copyRemoteDesktopUrl": "复制远程桌面 URL", - "failedToConnect": "连接控制台失败", - "connect": "连接", - "disconnect": "断开", - "start": "开始", - "enableStatusCheck": "启用状态检查", - "enableMetrics": "启用指标", - "bulkUpdateFailed": "批量更新失败", - "selectAll": "选择所有", - "deselectAll": "取消全选", - "protocols": "Protocols", - "secureShell": "安全的 Shell", - "virtualNetwork": "虚拟网络", - "unencryptedShell": "未加密的 shell", - "addressIp": "地址 / IP", - "friendlyName": "友好名称", - "folderAndAdvanced": "文件夹和高级版", - "privateNotes": "私人笔记", - "privateNotesPlaceholder": "关于此服务器的详细信息...", - "pinToTop": "固定到顶端", - "pinToTopDesc": "总是在列表顶部显示此主机", - "portKnockingSequence": "端口撞击序列", - "addKnockBtn": "添加垃圾箱", - "noPortKnocking": "未配置端口跟踪。", - "knockPort": "敲击端口", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", + "docker": "Docker", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "protocols": "协议", + "secureShell": "Secure Shell", + "virtualNetwork": "Virtual Network", + "unencryptedShell": "Unencrypted shell", + "addressIp": "Address / IP", + "friendlyName": "Friendly Name", + "macAddress": "MAC地址", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", + "folderAndAdvanced": "文件夹和高级功能", + "privateNotes": "Private Notes", + "privateNotesPlaceholder": "Details about this server...", + "pinToTop": "Pin to Top", + "pinToTopDesc": "Always show this host at the top of the list", + "portKnockingSequence": "端口敲击顺序", + "addKnockBtn": "添加敲击", + "noPortKnocking": "未配置端口敲门。", + "knockPort": "敲击港", "protocol": "Protocol", - "delayAfterMs": "延迟(毫秒)", - "useSocks5Proxy": "使用 SOCKS5 代理", - "useSocks5ProxyDesc": "通过代理服务器路由连接", - "proxyHost": "代理主机", - "proxyPort": "代理端口", - "proxyUsername": "代理用户名", - "proxyPassword": "代理密码", - "proxySingleMode": "单个代理", - "proxyChainMode": "代理链接", - "you": "你", - "jumpHostChainLabel": "跳转主机链接", + "delayAfterMs": "Delay After (ms)", + "useSocks5Proxy": "Use SOCKS5 Proxy", + "useSocks5ProxyDesc": "Route connection through a proxy server", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", + "proxySingleMode": "Single Proxy", + "proxyChainMode": "Proxy Chain", + "you": "You", + "jumpHostChainLabel": "跳转宿主链", "addJumpBtn": "添加跳转", - "noJumpHosts": "未配置跳跃主机.", - "selectAServer": "选择服务器...", - "sshPort": "SSH 端口", - "authMethod": "认证方法", - "storedCredential": "保存的凭据", - "selectACredential": "选择凭据...", - "keyTypeLabel": "密钥类型", - "keyTypeAuto": "自动检测", - "keyPasteTab": "粘贴", + "noJumpHosts": "未配置跳转主机。", + "selectAServer": "Select a server...", + "sshPort": "SSH Port", + "authMethod": "Auth Method", + "storedCredential": "Stored Credential", + "selectACredential": "Select a credential...", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", "keyUploadTab": "上传", - "keyFileLoaded": "已加载密钥文件", - "keyUploadClick": "点击上传.pem / .key / .ppk", - "clearKey": "清除密钥", - "keySaved": "SSH 密钥已保存", - "keyReplaceNotice": "粘贴下面的新密钥以替换它", - "keyPassphraseSaved": "密码短语已保存,要更改的类型", - "replaceKey": "替换密钥", - "forceKeyboardInteractiveLabel": "强制键盘互动", - "forceKeyboardInteractiveShortDesc": "强制手动输入密码,即使密钥存在", - "terminalAppearance": "终端外观", - "colorTheme": "颜色主题", - "fontFamilyLabel": "字体类", - "fontSizeLabel": "Font Size", - "cursorStyleLabel": "光标样式", - "letterSpacingPx": "字母间距 (px)", - "lineHeightLabel": "行高度", - "bellStyleLabel": "铃声样式", - "backspaceModeLabel": "背空模式", - "cursorBlinking": "光标闪烁", - "cursorBlinkingDesc": "启用终端光标闪烁动画", - "rightClickSelectsWordLabel": "右键选择单词", - "rightClickSelectsWordShortDesc": "右键点击光标下的单词", - "behaviorAndAdvanced": "行为和高级操作", - "scrollbackBufferLabel": "回滚缓存", - "scrollbackMaxLines": "在历史记录中保留的最大行数", - "sshAgentForwardingLabel": "SSH 代理转发中", - "sshAgentForwardingShortDesc": "将您的本地 SSH 密钥传递到此主机", - "enableAutoMosh": "启用自动Mosh", - "enableAutoMoshDesc": "如果可用,优先使用 Mosh。", - "enableAutoTmux": "启用自动Tmux", - "enableAutoTmuxDesc": "自动启动或附加到 tmux 会话", - "sudoPasswordAutoFillLabel": "Sudo 密码自动填充", - "sudoPasswordAutoFillShortDesc": "提示时自动提供确认密码", - "sudoPasswordLabel": "Sudo 密码", - "environmentVariablesLabel": "环境变量", - "addVariableBtn": "添加变量", - "noEnvVars": "未配置环境变量。", - "fastScrollModifierLabel": "快速滚动修饰符", - "fastScrollSensitivityLabel": "快速滚动灵敏度", - "moshCommandLabel": "Mosh 命令", - "startupSnippetLabel": "启动代码片段", + "keyFileLoaded": "Key file loaded", + "keyUploadClick": "Click to upload .pem / .key / .ppk", + "clearKey": "Clear key", + "keySaved": "SSH key saved", + "keyReplaceNotice": "paste a new key below to replace it", + "keyPassphraseSaved": "Passphrase saved, type to change", + "replaceKey": "Replace key", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", + "forceKeyboardInteractiveLabel": "Force Keyboard Interactive", + "forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", + "terminalAppearance": "Terminal Appearance", + "colorTheme": "Color Theme", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "字体大小", + "cursorStyleLabel": "Cursor Style", + "letterSpacingPx": "Letter Spacing (px)", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", + "cursorBlinking": "Cursor Blinking", + "cursorBlinkingDesc": "Enable blinking animation for the terminal cursor", + "rightClickSelectsWordLabel": "Right-click Selects Word", + "rightClickSelectsWordShortDesc": "Select the word under cursor on right-click", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "Syntax Highlighting", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "Timestamps", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", + "behaviorAndAdvanced": "Behavior & Advanced", + "scrollbackBufferLabel": "Scrollback Buffer", + "scrollbackMaxLines": "Maximum number of lines kept in history", + "sshAgentForwardingLabel": "SSH Agent Forwarding", + "sshAgentForwardingShortDesc": "Pass your local SSH keys to this host", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", + "enableAutoMosh": "Enable Auto-Mosh", + "enableAutoMoshDesc": "Prefer Mosh over SSH if available", + "enableAutoTmux": "Enable Auto-Tmux", + "enableAutoTmuxDesc": "Automatically launch or attach to tmux session", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", + "sudoPasswordAutoFillLabel": "Sudo Password Auto-fill", + "sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", + "noEnvVars": "No environment variables configured.", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", + "moshCommandLabel": "Mosh Command", + "startupSnippetLabel": "启动片段", "keepaliveIntervalLabel": "保持连接间隔(秒)", - "maxKeepaliveMisses": "最大保留生命失败", - "tunnelSettings": "隧道设置", - "enableTunneling": "启用 Tunneling", - "enableTunnelingDesc": "为此主机启用 SSH 隧道功能", - "serverTunnelsSection": "服务器Tunnels", - "addTunnelBtn": "添加Tunnel", - "noTunnelsConfigured": "未配置隧道。", - "tunnelLabel": "隧道 {{number}}", - "tunnelType": "隧道类型", - "tunnelModeLocalDesc": "将本地端口转发到远程服务器上的端口(或其主机可访问)。", - "tunnelModeRemoteDesc": "将远程服务器上的端口转回您机器上的本地端口。", - "tunnelModeDynamicDesc": "在本地端口上创建一个 SOCKS5 代理, 用于动态端口转发.", + "maxKeepaliveMisses": "Max Keepalive Misses", + "tunnelSettings": "Tunnel Settings", + "enableTunneling": "Enable Tunneling", + "enableTunnelingDesc": "Enable SSH tunnel functionality for this host", + "serverTunnelsSection": "服务器隧道", + "addTunnelBtn": "Add Tunnel", + "noTunnelsConfigured": "No tunnels configured.", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", + "tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).", + "tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.", + "tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.", "sameHost": "此主机(直接隧道)", - "endpointHost": "端点主机", - "endpointPort": "端点端口", - "bindHost": "绑定主机", - "sourcePort": "源端口", - "maxRetries": "最大重试次数", - "retryIntervalS": "重试间隔(s)", - "autoStartLabel": "自动启动", - "autoStartDesc": "主机加载时自动连接这个隧道。", - "tunnelConnecting": "正在连接隧道...", - "tunnelDisconnected": "隧道断开连接", - "failedToConnectTunnel": "连接失败", - "failedToDisconnectTunnel": "断开连接失败", - "dockerIntegration": "停靠集成", - "enableDockerMonitor": "启用停靠栏", - "enableDockerMonitorDesc": "通过 Docker 监视和管理此主机上的容器", - "enableFileManagerMonitor": "启用文件管理器", - "enableFileManagerMonitorDesc": "通过 SFTP 浏览和管理主机上的文件", - "defaultPathLabel": "默认路径", - "fileManagerPathHint": "当文件管理器启动此主机时要打开的目录。", - "statusChecksLabel": "状态检查", - "enableStatusChecks": "启用状态检查", - "enableStatusChecksDesc": "定期打扰此主机以验证可用性", - "useGlobalInterval": "使用全局间隔", - "useGlobalIntervalDesc": "重写服务器范围状态检查间隔", - "checkIntervalS": "检查间隔(s)", - "checkIntervalDesc": "每个连接之间的秒数", - "metricsCollectionLabel": "计量收藏", - "enableMetricsLabel": "启用指标", - "enableMetricsDesc": "从此主机收集CPU、RAM、磁盘和网络使用情况", - "useGlobalMetrics": "使用全局间隔", - "useGlobalMetricsDesc": "重写服务器范围内的计量间隔", - "metricsIntervalS": "计量间隔 (秒)", - "metricsIntervalDesc2": "公尺快照之间的秒数", - "visibleWidgets": "可见部件", - "cpuUsageLabel": "CPU 使用", - "cpuUsageDesc": "CPU 百分比,负载平均值和闪光线图", - "memoryLabel": "内存使用", - "memoryDesc": "RAM 用法,交换,缓存", - "storageLabel": "磁盘使用", - "storageDesc": "每个挂载点的磁盘使用", - "networkLabel": "网络接口", - "networkDesc": "接口列表和带宽", - "uptimeLabel": "运行时间", - "uptimeDesc": "系统启动时间和启动时间", - "systemInfoLabel": "系统信息", - "systemInfoDesc": "操作、 内核、 主机名、 架构", - "recentLoginsLabel": "最近登录", - "recentLoginsDesc": "登录活动成功或失败", - "topProcessesLabel": "热门进程", - "topProcessesDesc": "PID, CPU%,MEM%,命令", - "listeningPortsLabel": "监听端口", - "listeningPortsDesc": "打开带流程和状态的端口", - "firewallLabel": "防火墙", - "firewallDesc": "防火墙,AppArmor,SELinux 状态", - "quickActionsLabel": "快速操作", - "quickActionsToolbar": "快速动作在服务器统计工具栏中显示为单击命令执行按钮。", - "noQuickActions": "暂无快速操作。", - "buttonLabel": "按钮标签", - "selectSnippetPlaceholder": "选择代码片断...", - "addActionBtn": "添加操作", - "hostSharedSuccessfully": "主机共享成功", - "failedToShareHost": "共享主机失败", - "accessRevoked": "访问已取消", - "failedToRevokeAccess": "吊销访问失败", + "endpointHost": "Endpoint Host", + "endpointPort": "Endpoint Port", + "bindHost": "Bind Host", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", + "retryIntervalS": "Retry Interval (s)", + "autoStartLabel": "Auto-start", + "autoStartDesc": "Automatically connect this tunnel when the host is loaded", + "tunnelConnecting": "Tunnel connecting...", + "tunnelDisconnected": "Tunnel disconnected", + "failedToConnectTunnel": "Failed to connect", + "failedToDisconnectTunnel": "Failed to disconnect", + "dockerIntegration": "Docker Integration", + "enableDockerMonitor": "Enable Docker", + "enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "密码", + "authTypeKey": "SSH密钥", + "authTypeCredential": "凭据", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "没有任何", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", + "enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", + "fileManagerPathHint": "The directory to open when the file manager launches for this host.", + "statusChecksLabel": "Status Checks", + "enableStatusChecks": "Enable Status Checks", + "enableStatusChecksDesc": "Periodically ping this host to verify availability", + "useGlobalInterval": "Use Global Interval", + "useGlobalIntervalDesc": "Override with the server-wide status check interval", + "checkIntervalS": "Check Interval (s)", + "checkIntervalDesc": "Seconds between each connectivity ping", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", + "enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host", + "useGlobalMetrics": "Use Global Interval", + "useGlobalMetricsDesc": "Override with the server-wide metrics interval", + "metricsIntervalS": "Metrics Interval (s)", + "metricsIntervalDesc2": "Seconds between metric snapshots", + "visibleWidgets": "Visible Widgets", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", + "cpuUsageDesc": "CPU percent, load averages, sparkline graph", + "memoryLabel": "Memory Usage", + "memoryDesc": "RAM usage, swap, cached", + "storageLabel": "Disk Usage", + "storageDesc": "Disk usage per mount point", + "networkLabel": "Network Interfaces", + "networkDesc": "Interface list and bandwidth", + "uptimeLabel": "Uptime", + "uptimeDesc": "System uptime and boot time", + "systemInfoLabel": "System Info", + "systemInfoDesc": "OS, kernel, hostname, architecture", + "recentLoginsLabel": "Recent Logins", + "recentLoginsDesc": "Successful and failed login events", + "topProcessesLabel": "Top Processes", + "topProcessesDesc": "PID, CPU%, MEM%, command", + "listeningPortsLabel": "Listening Ports", + "listeningPortsDesc": "Open ports with process and state", + "firewallLabel": "Firewall", + "firewallDesc": "Firewall, AppArmor, SELinux status", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", + "noQuickActions": "No quick actions yet.", + "buttonLabel": "Button label", + "selectSnippetPlaceholder": "选择片段……", + "addActionBtn": "Add Action", + "hostSharedSuccessfully": "Host shared successfully", + "failedToShareHost": "Failed to share host", + "accessRevoked": "Access revoked", + "failedToRevokeAccess": "Failed to revoke access", "cancelBtn": "取消", - "savingBtn": "保存中...", - "addHostBtn": "添加主机", - "hostUpdated": "主机已更新", - "hostCreated": "主机已创建", - "failedToSave": "保存主机失败", - "credentialUpdated": "凭据已更新", - "credentialCreated": "凭据已创建", - "failedToSaveCredential": "保存凭据失败", - "backToHosts": "返回主机", - "backToCredentials": "回到凭据", - "pinned": "固定的", - "noHostsFound": "未找到主机", - "tryDifferentTerm": "尝试一个不同的术语", - "addFirstHost": "添加您的第一个主机以开始", - "noCredentialsFound": "未找到凭据", - "addCredentialBtn": "添加凭据", - "updateCredentialBtn": "更新凭据", - "features": "功能", - "noFolder": "(无文件夹)", - "deleteSelected": "删除", - "exitSelection": "退出选择", - "importSkip": "导入(跳过存在)", - "importOverwrite": "导入(覆盖)", - "collapseBtn": "收起", - "importExportBtn": "导入/导出", - "hostStatusesRefreshed": "主机状态已刷新", - "failedToRefreshHosts": "刷新主机失败", - "movedHostTo": "将 {{host}} 移动到 \"{{folder}}\"", - "failedToMoveHost": "移动主机失败", - "folderRenamedTo": "文件夹已重命名为“{{name}}”", - "deletedFolder": "已删除文件夹“{{name}}”", - "failedToDeleteFolder": "删除文件夹失败", - "deleteAllInFolder": "删除“{{name}}”中的所有主机?此操作无法撤销。", - "deletedHost": "已删除 {{name}}", - "copiedToClipboard": "复制到剪贴板", - "terminalUrlCopied": "终端链接已复制", - "fileManagerUrlCopied": "文件管理器 URL 已复制", - "tunnelUrlCopied": "已复制隧道网址", - "dockerUrlCopied": "Docker URL 已复制", - "serverStatsUrlCopied": "服务器统计URL已复制", - "rdpUrlCopied": "已复制 RDP URL", - "vncUrlCopied": "已复制 VNC URL", - "telnetUrlCopied": "已复制Telnet URL", - "remoteDesktopUrlCopied": "已复制远程桌面 URL", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", + "hostUpdated": "Host updated", + "hostCreated": "Host created", + "failedToSave": "Failed to save host", + "credentialUpdated": "Credential updated", + "credentialCreated": "Credential created", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", + "backToHosts": "Back to Hosts", + "backToCredentials": "Back to Credentials", + "pinned": "置顶", + "noHostsFound": "No hosts found", + "tryDifferentTerm": "Try a different term", + "addFirstHost": "Add your first host to get started", + "noCredentialsFound": "No credentials found", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "特征", + "noFolder": "(No folder)", + "deleteSelected": "Delete", + "exitSelection": "Exit selection", + "importSkip": "Import (skip existing)", + "importOverwrite": "Import (overwrite)", + "collapseBtn": "Collapse", + "importExportBtn": "Import / Export", + "hostStatusesRefreshed": "Host statuses refreshed", + "failedToRefreshHosts": "Failed to refresh hosts", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", + "failedToMoveHost": "Failed to move host", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "Edit folder", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "取消", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "Failed to move hosts", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "文件夹", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", + "terminalUrlCopied": "Terminal URL copied", + "fileManagerUrlCopied": "File Manager URL copied", + "tunnelUrlCopied": "Tunnel URL copied", + "dockerUrlCopied": "Docker URL copied", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", + "rdpUrlCopied": "RDP URL copied", + "vncUrlCopied": "VNC URL copied", + "telnetUrlCopied": "Telnet URL copied", + "remoteDesktopUrlCopied": "Remote Desktop URL copied", "expandActions": "展开操作", "collapseActions": "坍塌动作", "wakeOnLanAction": "局域网唤醒", - "wakeOnLanSuccess": "魔法数据包已发送至 {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "发送魔术包失败", - "cloneHostAction": "复制主机", - "copyAddress": "复制地址", - "copyLink": "复制链接", - "copyTerminalUrlAction": "复制终端 URL", - "copyFileManagerUrlAction": "复制文件管理器 URL", - "copyTunnelUrlAction": "复制隧道网址", - "copyDockerUrlAction": "复制 Docker 网址", - "copyServerStatsUrlAction": "复制服务器统计URL", - "copyRdpUrlAction": "复制 RDP URL", - "copyVncUrlAction": "复制 VNC URL", - "copyTelnetUrlAction": "复制 Telnet URL", - "copyRemoteDesktopUrlAction": "复制远程桌面 URL", - "deleteCredentialConfirm": "删除凭据“{{name}}”?", - "deletedCredential": "已删除 {{name}}", - "deploySSHKeyTitle": "部署 SSH 密钥", - "deployingBtn": "正在部署...", - "deployBtn": "部署", - "failedToDeployKey": "部署密钥失败", - "deleteHostsConfirm": "删除 {{count}} 主机{{plural}}?此操作无法撤销。", - "movedToRoot": "移动到root", - "failedToMoveHosts": "移动主机失败", - "enableTerminalFeature": "启用终端", - "disableTerminalFeature": "禁用终端", - "enableFilesFeature": "启用文件", - "disableFilesFeature": "禁用文件", - "enableTunnelsFeature": "启用Tunnels", - "disableTunnelsFeature": "禁用Tunnels", - "enableDockerFeature": "启用停靠栏", - "disableDockerFeature": "禁用停靠栏", - "addTagsPlaceholder": "添加标签...", - "authDetails": "身份验证详情", - "credType": "类型", - "generateKeyPairDesc": "生成一个新的密钥对,私钥和公钥将自动填充。", - "generatingKey": "正在生成...", - "generateLabel": "生成 {{label}}", - "uploadFileBtn": "上传文件", - "keyPassphraseOptional": "密钥密码(可选)", - "sshPublicKeyOptional": "SSH 公钥(可选)", - "publicKeyGenerated": "公钥已生成", - "failedToGeneratePublicKey": "获取公钥失败", - "publicKeyCopied": "公钥已复制", + "cloneHostAction": "Clone Host", + "copyAddress": "Copy Address", + "copyLink": "Copy Link", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", + "copyRdpUrlAction": "Copy RDP URL", + "copyVncUrlAction": "Copy VNC URL", + "copyTelnetUrlAction": "Copy Telnet URL", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", + "deployBtn": "Deploy", + "failedToDeployKey": "Failed to deploy key", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", + "movedToRoot": "Moved to root", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", + "enableFilesFeature": "Enable Files", + "disableFilesFeature": "Disable Files", + "enableTunnelsFeature": "启用隧道", + "disableTunnelsFeature": "禁用隧道", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", + "addTagsPlaceholder": "Add tags...", + "authDetails": "Authentication Details", + "credType": "Type", + "generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.", + "generatingKey": "Generating...", + "generateLabel": "Generate {{label}}", + "uploadFileBtn": "Upload file", + "keyPassphraseOptional": "Key Passphrase (Optional)", + "sshPublicKeyOptional": "SSH Public Key (Optional)", + "publicKeyGenerated": "Public key generated", + "failedToGeneratePublicKey": "Failed to derive public key", + "publicKeyCopied": "Public key copied", "keyPairGenerated": "{{label}} key pair generated", - "failedToGenerateKeyPair": "生成密钥对失败", - "searchHostsPlaceholder": "搜索主机,地址,标签…", - "searchCredentialsPlaceholder": "搜索凭证…", - "refreshBtn": "刷新", - "addTag": "添加标签...", - "deleteConfirmBtn": "删除", - "tunnelRequirementsText": "SSH 服务器必须有 GatewayPorts 是的,allowTcpForwarding y,PermitRoot登录yes 设置为 /etc/ssh/sshd_config。", - "deleteHostConfirm": "删除“{{name}}”?", - "enableAtLeastOneProtocol": "启用以上至少一个协议来配置身份验证和连接设置。", - "keyPassphrase": "密钥密码", - "connectBtn": "连接", - "disconnectBtn": "断开连接", - "basicInformation": "基本信息", - "authDetailsSection": "身份验证详情", - "credTypeLabel": "类型", - "hostsTab": "主机", - "credentialsTab": "全权证书", - "selectMultiple": "选择多个选项", - "selectHosts": "选择主机", - "connectionLabel": "连接", - "authenticationLabel": "认证", + "failedToGenerateKeyPair": "密钥对生成失败", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", + "addTag": "Add tags...", + "deleteConfirmBtn": "Delete", + "tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.", + "deleteHostConfirm": "Delete \"{{name}}\"?", + "enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", + "authDetailsSection": "Authentication Details", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", + "selectMultiple": "Select multiple", + "selectHosts": "Select hosts", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", "generateKeyPairTitle": "生成密钥对", - "generateKeyPairDescription": "生成一个新的密钥对,私钥和公钥将自动填充。", - "generateFromPrivateKey": "从私钥生成", - "refreshBtn2": "刷新", - "exitSelectionTitle": "退出选择", - "exportAll": "全部导出", - "addHostBtn2": "添加主机", - "addCredentialBtn2": "添加凭据", - "checkingHostStatuses": "正在检查主机状态...", - "pinnedSection": "固定的", - "hostsExported": "成功导出主机", + "generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", + "exitSelectionTitle": "Exit selection", + "exportAll": "Export All", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", + "checkingHostStatuses": "Checking host statuses...", + "pinnedSection": "置顶", + "hostsExported": "Hosts exported successfully", "exportFailed": "导出主机失败", - "sampleDownloaded": "已下载示例文件", - "failedToDeleteCredential2": "删除凭证失败", - "noFolderOption": "(无文件夹)", - "nSelected": "{{count}} 已选择", - "featuresMenu": "功能", - "moveMenu": "移动", + "sampleDownloaded": "Sample file downloaded", + "failedToDeleteCredential2": "Failed to delete credential", + "noFolderOption": "(No folder)", + "nSelected": "{{count}} selected", + "featuresMenu": "特征", + "moveMenu": "Move", + "connectSelected": "Connect", "cancelSelection": "取消", - "deployDialogDesc": "将 {{name}} 部署到主机的 authorized_keys 中。", - "targetHostLabel": "目标主机", - "selectHostOption": "选择主机...", - "keyDeployedSuccess": "密钥部署成功", - "failedToDeployKey2": "部署密钥失败", - "deletedCount": "已删除 {{count}} 主机", - "failedToDeleteCount": "删除 {{count}} 主机失败", - "duplicatedHost": "重复的“{{name}}”", - "failedToDuplicateHost": "复制主机失败", - "updatedCount": "已更新 {{count}} 主机", - "friendlyNameLabel": "友好名称", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", + "selectHostOption": "Select a host...", + "keyDeployedSuccess": "Key deployed successfully", + "failedToDeployKey2": "Failed to deploy key", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", + "failedToDuplicateHost": "Failed to duplicate host", + "updatedCount": "Updated {{count}} hosts", + "friendlyNameLabel": "Friendly Name", "descriptionLabel": "描述", - "loadingHost": "正在加载主机...", - "loadingHosts": "正在加载主机...", - "loadingCredentials": "正在加载凭据...", - "noHostsYet": "尚无主机", - "noHostsMatchSearch": "没有符合您搜索条件的主机", - "hostNotFound": "找不到主机", - "searchHosts": "搜索主机...", + "loadingHost": "Loading host...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", + "noHostsYet": "No hosts yet", + "noHostsMatchSearch": "No hosts match your search", + "hostNotFound": "Host not found", + "searchHosts": "Search hosts...", "sortHosts": "排序主机", "sortDefault": "默认订单", "sortNameAsc": "姓名(A → Z)", @@ -585,7 +750,7 @@ "sortPinnedFirst": "置顶", "filterHosts": "过滤主机", "filterClearAll": "清除筛选条件", - "filterStatusGroup": "地位", + "filterStatusGroup": "Status", "filterOnline": "在线的", "filterOffline": "离线", "filterPinned": "置顶", @@ -595,564 +760,595 @@ "filterAuthCredential": "凭据", "filterAuthNone": "没有任何", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "协议", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", "filterProtocolRdp": "远程桌面协议", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", "filterFeaturesGroup": "特征", - "filterFeatureTerminal": "终端", + "filterFeatureTerminal": "Terminal", "filterFeatureFileManager": "文件管理器", - "filterFeatureTunnel": "隧道", + "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", "filterTagsGroup": "标签", - "shareHost": "共享主机", - "shareHostTitle": "分享: {{name}}", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { - "requiresCredential": "此主机必须使用凭据来启用共享。首先编辑主机并分配凭证。" + "requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first." }, "guac": { - "connection": "连接", - "authentication": "认证", - "connectionSettings": "连接设置", - "displaySettings": "显示设置", - "audioSettings": "音频设置", - "rdpPerformance": "RDP 性能", - "deviceRedirection": "设备重定向", - "session": "会议", - "gateway": "网关", - "remoteApp": "移除应用", - "clipboard": "剪切板", - "sessionRecording": "会话录音", - "wakeOnLan": "在局域网上唤醒", - "vncSettings": "VNC 设置", - "terminalSettings": "终端设置", - "rdpPort": "RDP 端口", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "Stored Credential", + "noCredential": "No credential (direct credentials below)", + "authMethod": "Auth Method", + "authTypeDirect": "Direct", + "authTypeCredential": "凭据", + "selectCredential": "Select a credential...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", + "rdpPerformance": "RDP Performance", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", + "remoteApp": "RemoteApp", + "clipboard": "Clipboard", + "sessionRecording": "Session Recording", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", + "rdpPort": "RDP Port", "username": "用户名", "password": "密码", - "domain": "域", - "securityMode": "安全模式", - "colorDepth": "颜色深度", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", "width": "Width", - "height": "高度", + "height": "Height", "dpi": "DPI", - "resizeMethod": "调整大小方法", - "clientName": "客户端名称", - "initialProgram": "初始程序", - "serverLayout": "服务器布局", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", + "serverLayout": "Server Layout", "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", "gatewayHostname": "Gateway Hostname", - "gatewayPort": "网关端口", - "gatewayUsername": "网关用户名", - "gatewayPassword": "网关密码", - "gatewayDomain": "网关域", - "remoteAppProgram": "RemoteApp程序", - "workingDirectory": "工作目录", - "arguments": "参数", - "normalizeLineEndings": "规范化线条结尾", - "recordingPath": "录制路径", - "recordingName": "录制名称", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", + "remoteAppProgram": "RemoteApp Program", + "workingDirectory": "Working Directory", + "arguments": "Arguments", + "normalizeLineEndings": "Normalize Line Endings", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", "macAddress": "MAC地址", - "broadcastAddress": "广播地址", + "broadcastAddress": "Broadcast Address", "udpPort": "UDP Port", - "waitTimeS": "等待时间 (s)", - "driveName": "驱动器名称", - "drivePath": "驱动器路径", - "ignoreCertificate": "忽略证书", - "ignoreCertificateDesc": "允许连接到有自签名证书的主机", - "forceLossless": "强制无损失", - "forceLosslessDesc": "强制使用无损图像编码 (更高质量、更多带宽)", - "disableAudio": "禁用音频", - "disableAudioDesc": "静音远程会话中的所有音频", - "enableAudioInput": "启用音频输入 (Microphone)", - "enableAudioInputDesc": "转发本地麦克风到远程会话", - "wallpaper": "壁纸", - "wallpaperDesc": "显示桌面壁纸 (禁用改善性能)", - "theming": "主题", - "themingDesc": "启用视觉主题和样式", - "fontSmoothing": "字体平移", - "fontSmoothingDesc": "启用清除类型字体渲染功能", - "fullWindowDrag": "全窗口拖动", - "fullWindowDragDesc": "拖动时显示窗口内容", - "desktopComposition": "桌面组成", - "desktopCompositionDesc": "启用Aero 玻璃效果", - "menuAnimations": "菜单动画", - "menuAnimationsDesc": "启用菜单淡出和幻灯片动画", - "disableBitmapCaching": "禁用位图缓存", - "disableBitmapCachingDesc": "关闭位图缓存 (可能帮助玻璃)", - "disableOffscreenCaching": "禁用屏幕外缓存", - "disableOffscreenCachingDesc": "关闭屏幕缓存", - "disableGlyphCaching": "禁用粒子缓存", - "disableGlyphCachingDesc": "关闭 glyph 缓存", + "waitTimeS": "Wait Time (s)", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", + "ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates", + "forceLossless": "Force Lossless", + "forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)", + "disableAudio": "Disable Audio", + "disableAudioDesc": "Mute all audio from the remote session", + "enableAudioInput": "Enable Audio Input (Microphone)", + "enableAudioInputDesc": "Forward local microphone to the remote session", + "wallpaper": "Wallpaper", + "wallpaperDesc": "Show desktop wallpaper (disabling improves performance)", + "theming": "Theming", + "themingDesc": "Enable visual themes and styles", + "fontSmoothing": "Font Smoothing", + "fontSmoothingDesc": "Enable ClearType font rendering", + "fullWindowDrag": "Full Window Drag", + "fullWindowDragDesc": "Show window contents while dragging", + "desktopComposition": "Desktop Composition", + "desktopCompositionDesc": "Enable Aero glass effects", + "menuAnimations": "Menu Animations", + "menuAnimationsDesc": "Enable menu fade and slide animations", + "disableBitmapCaching": "Disable Bitmap Caching", + "disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)", + "disableOffscreenCaching": "Disable Offscreen Caching", + "disableOffscreenCachingDesc": "Turn off offscreen cache", + "disableGlyphCaching": "Disable Glyph Caching", + "disableGlyphCachingDesc": "Turn off glyph cache", "enableGfx": "Enable GFX", - "enableGfxDesc": "使用 RemoteFX 图形管道", - "enablePrinting": "启用打印", - "enablePrintingDesc": "将本地打印机重定向到远程会话", - "enableDriveRedirection": "启用驱动器重定向", - "enableDriveRedirectionDesc": "将本地文件夹映射为远程会话中的驱动器", - "createDrivePath": "创建驱动器路径", - "createDrivePathDesc": "如果不存在自动创建文件夹", - "disableDownload": "禁用下载", - "disableDownloadDesc": "防止从远程会话中下载文件", - "disableUpload": "禁用上传", - "disableUploadDesc": "防止上传文件到远程会话", - "enableTouch": "启用 Touch", - "enableTouchDesc": "启用触摸输入转发功能", - "consoleSession": "控制台会话", - "consoleSessionDesc": "连接到控制台(会话 0) 而不是新会话", - "sendWolPacket": "发送 WOL包", - "sendWolPacketDesc": "在连接之前发送一个魔法包来唤醒这个主机", - "disableCopy": "禁用复制", - "disableCopyDesc": "禁止从远程会话复制文本", - "disablePaste": "禁用粘贴", - "disablePasteDesc": "防止将文本粘贴到远程会话", - "createPathIfMissing": "如果缺少则创建路径", - "createPathIfMissingDesc": "自动创建录制目录", - "excludeOutput": "排除输出", - "excludeOutputDesc": "不录制屏幕输出 (仅限元数据)", - "excludeMouse": "排除鼠标显示", - "excludeMouseDesc": "不记录鼠标移动", - "includeKeystrokes": "包含关键字", - "includeKeystrokesDesc": "除屏幕输出外录制原始按键描边", - "vncPort": "VNC 端口", - "vncPassword": "VNC 密码", - "vncUsernameOptional": "用户名(可选)", - "vncLeaveBlank": "如果不需要则留空", - "cursorMode": "光标模式", - "swapRedBlue": "交换红/蓝图", - "swapRedBlueDesc": "交换红色和蓝色通道(修复一些颜色问题)", - "readOnly": "只读", - "readOnlyDesc": "在不发送任何输入的情况下查看远程屏幕", - "telnetPort": "Telnet 端口", - "terminalType": "终端类型", + "enableGfxDesc": "Use RemoteFX graphics pipeline", + "enablePrinting": "Enable Printing", + "enablePrintingDesc": "Redirect local printers to the remote session", + "enableDriveRedirection": "Enable Drive Redirection", + "enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session", + "createDrivePath": "Create Drive Path", + "createDrivePathDesc": "Automatically create the folder if it does not exist", + "disableDownload": "Disable Download", + "disableDownloadDesc": "Prevent downloading files from the remote session", + "disableUpload": "Disable Upload", + "disableUploadDesc": "Prevent uploading files to the remote session", + "enableTouch": "Enable Touch", + "enableTouchDesc": "Enable touch input forwarding", + "consoleSession": "Console Session", + "consoleSessionDesc": "Connect to the console (session 0) instead of a new session", + "sendWolPacket": "Send WOL Packet", + "sendWolPacketDesc": "Send a magic packet to wake this host before connecting", + "disableCopy": "Disable Copy", + "disableCopyDesc": "Prevent copying text from the remote session", + "disablePaste": "Disable Paste", + "disablePasteDesc": "Prevent pasting text into the remote session", + "createPathIfMissing": "Create Path if Missing", + "createPathIfMissingDesc": "Automatically create the recording directory", + "excludeOutput": "Exclude Output", + "excludeOutputDesc": "Do not record screen output (metadata only)", + "excludeMouse": "Exclude Mouse", + "excludeMouseDesc": "Do not record mouse movements", + "includeKeystrokes": "Include Keystrokes", + "includeKeystrokesDesc": "Record raw keystrokes in addition to screen output", + "vncPort": "VNC Port", + "vncPassword": "VNC Password", + "vncUsernameOptional": "Username (optional)", + "vncLeaveBlank": "Leave blank if not required", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", + "swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)", + "readOnly": "Read-only", + "readOnlyDesc": "View the remote screen without sending any input", + "telnetPort": "Telnet Port", + "terminalType": "Terminal Type", "fontName": "Font Name", - "fontSize": "Font Size", - "colorScheme": "配色方案", - "backspaceKey": "背空键", - "saveHostFirst": "先保存主机。", - "sharingOptionsAfterSave": "主机保存后共享选项可用。", - "sharingLoadError": "无法加载共享数据。请检查您的连接,然后重试。", - "shareHostSection": "共享主机", - "shareWithUser": "与用户分享", - "shareWithRole": "与角色分享", - "selectUser": "选择用户", - "selectRole": "选择角色", - "selectUserOption": "选择一个用户...", - "selectRoleOption": "选择角色...", - "permissionLevel": "权限级别", - "expiresInHours": "过期时间(小时)", - "noExpiryPlaceholder": "留空为无过期时间", - "shareBtn": "分享", - "currentAccess": "当前访问", - "typeHeader": "类型", + "fontSize": "字体大小", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", + "saveHostFirst": "Save the host first.", + "sharingOptionsAfterSave": "Sharing options are available after the host has been saved.", + "sharingLoadError": "Failed to load sharing data. Check your connection and try again.", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", + "selectUser": "Select User", + "selectRole": "Select Role", + "selectUserOption": "Select a user...", + "selectRoleOption": "Select a role...", + "permissionLevel": "Permission Level", + "expiresInHours": "Expires in (hours)", + "noExpiryPlaceholder": "Leave empty for no expiry", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", "targetHeader": "Target", - "permissionHeader": "权限", - "grantedByHeader": "授予者", - "expiresHeader": "过期时间", - "noAccessEntries": "尚无访问条目。", - "expiredLabel": "已过期", - "neverLabel": "从不使用", + "permissionHeader": "Permission", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", + "noAccessEntries": "No access entries yet.", + "expiredLabel": "Expired", + "neverLabel": "Never", "revokeBtn": "Revoke", "cancelBtn": "取消", - "savingBtn": "保存中...", - "updateHostBtn": "更新主机", - "addHostBtn": "添加主机" + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { - "searchPlaceholder": "搜索主机、 命令或设置...", - "quickActions": "快速操作", - "hostManager": "主机管理器", - "hostManagerDesc": "管理、 添加或编辑主机", - "addNewHost": "添加新主机", - "addNewHostDesc": "注册新主机", - "adminSettings": "管理员设置", - "adminSettingsDesc": "配置系统首选项和用户", - "userProfile": "用户资料", - "userProfileDesc": "管理您的帐户和首选项", - "addCredential": "添加凭证", - "addCredentialDesc": "存储 SSH 密钥或密码", - "recentActivity": "近期活动", - "serversAndHosts": "服务器和主机", - "noHostsFound": "未找到与“{{search}}”匹配的主机", - "links": "相关链接", + "searchPlaceholder": "Search hosts, commands, or settings...", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", + "hostManagerDesc": "Manage, add, or edit hosts", + "addNewHost": "Add New Host", + "addNewHostDesc": "Register a new host", + "adminSettings": "Admin Settings", + "adminSettingsDesc": "Configure system preferences and users", + "userProfile": "用户个人资料", + "userProfileDesc": "Manage your account and preferences", + "addCredential": "Add Credential", + "addCredentialDesc": "Store SSH keys or passwords", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", + "serversAndHosts": "Servers & Hosts", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "Navigate", - "select": "选择", - "toggleWith": "切换为" + "select": "Select", + "toggleWith": "Toggle with" }, "splitScreen": { "paneEmpty": "Pane {{index}} - empty", - "noTabAssigned": "未分配标签", + "noTabAssigned": "No tab assigned", "focusedPane": "活动窗格" }, "connections": { "noConnections": "没有连接", "noConnectionsDesc": "打开终端、文件管理器或远程桌面即可在此处查看连接。", - "connectedFor": "已连接 {{duration}}", + "connectedFor": "Connected for {{duration}}", "connected": "已连接", "disconnected": "断开连接", "closeTab": "关闭标签页", "closeConnection": "紧密联系", "forgetTab": "忘记", - "removeBackground": "消除", + "removeBackground": "Remove", "reconnect": "重新连接", "reopenTab": "重新开放", "sectionOpen": "打开", "sectionBackground": "背景", "backgroundDesc": "断开连接后,会话仍会保持 30 分钟,并且可以重新连接。", "persisted": "在后台持续运行", - "expiresIn": "有效期至 {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "搜索关联...", - "noSearchResults": "没有找到与您的搜索匹配的结果。" + "noSearchResults": "没有找到与您的搜索匹配的结果。", + "rename": "Rename session" }, "guacamole": { - "connecting": "正在连接到 {{type}} 会话...", - "connectionError": "连接错误", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", "connectionFailed": "连接失败", - "failedToConnect": "获取连接令牌失败", - "hostNotFound": "找不到主机", - "noHostSelected": "没有选择主机", + "failedToConnect": "Failed to get connection token", + "hostNotFound": "Host not found", + "noHostSelected": "No host selected", "reconnect": "重新连接", "retry": "重试", - "guacdUnavailable": "远程桌面服务 (guacd) 不可用。请确认 guacd 正在运行并且可以在管理设置中进行正确配置。", + "guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { "ctrlAltDel": "Ctrl+Alt+Del", - "winL": "胜利+L (锁屏)", - "winKey": "Windows 密钥", + "winL": "Win+L (Lock Screen)", + "winKey": "Windows Key", "ctrl": "Ctrl", "alt": "Alt", - "shift": "偏移", - "win": "胜利", - "stickyActive": "{{key}} (已锁定 - 单击释放)", - "stickyInactive": "{{key}} (点击锁定)", - "esc": "逃逸的", + "shift": "Shift", + "win": "Win", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", + "esc": "Escape", "tab": "Tab", - "home": "首页", - "end": "结束", - "pageUp": "向上页面", - "pageDown": "向下页面", - "arrowUp": "向上箭头", - "arrowDown": "向下箭头", - "arrowLeft": "左箭头", - "arrowRight": "右箭头", - "fnToggle": "函数键", - "reconnect": "重新连接会话", - "collapse": "折叠工具栏", - "expand": "展开工具栏", - "dragHandle": "拖动以重新定位" + "home": "Home", + "end": "End", + "pageUp": "Page Up", + "pageDown": "Page Down", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "fnToggle": "Function Keys", + "reconnect": "Reconnect Session", + "collapse": "Collapse toolbar", + "expand": "Expand toolbar", + "dragHandle": "Drag to reposition" } }, "terminal": { - "connect": "连接到主机", - "clear": "清空", - "paste": "粘贴", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", "reconnect": "重新连接", - "connectionLost": "连接丢失", + "connectionLost": "Connection lost", "connected": "已连接", - "clipboardWriteFailed": "复制到剪贴板失败。请确认页面是通过 HTTPS 或本地主机服务的。", - "clipboardReadFailed": "从剪贴板读取失败。请确保已授予剪贴板权限。", - "clipboardHttpWarning": "粘贴需要 HTTPS。使用 Ctrl+Shift+V 或通过 HTTPS 提供Termixed 服务。", - "unknownError": "发生未知错误", - "websocketError": "WebSocket 连接错误", - "connecting": "正在连接...", - "noHostSelected": "没有选择主机", - "reconnecting": "正在重新连接... ({{attempt}}/{{max}})", - "reconnected": "已成功重新连接", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", "tmuxSessionCreated": "tmux 会话已创建: {{name}}", - "tmuxSessionAttached": "tmux 会话已连接: {{name}}", - "tmuxUnavailable": "tmux 未安装在远程主机上,返回到标准的 shell", - "tmuxSessionPickerTitle": "tmux 会话", - "tmuxSessionPickerDesc": "在此主机上找到现有的 tmux 会话。选择一个来重新附加或创建一个新会话。", - "tmuxWindows": "窗口", - "tmuxWindowCount": "{{count}} 窗口", - "tmuxAttached": "附加客户端", - "tmuxAttachedCount": "{{count}} 已连接", - "tmuxLastActivity": "上次活动", - "tmuxTimeJustNow": "就在这里", - "tmuxTimeMinutes": "{{count}}几分钟前", - "tmuxTimeHours": "{{count}}小时前", - "tmuxTimeDays": "{{count}}天前", - "tmuxCreateNew": "开始新会话", - "tmuxCopyHint": "调整选区并按回车键复制到剪贴板", - "tmuxDetach": "从 tmux 会话移除", - "tmuxDetached": "从 tmux 会话断开", - "maxReconnectAttemptsReached": "已达到最大重连尝试次数", - "closeTab": "关闭", - "connectionTimeout": "连接超时", - "terminalTitle": "终端 - {{host}}", - "terminalWithPath": "终端 - {{host}}:{{path}}", - "runTitle": "运行 {{command}} - {{host}}", - "totpRequired": "需要双因素身份验证", - "totpCodeLabel": "验证码", - "totpVerify": "验证", - "warpgateAuthRequired": "需要Warpgate 身份验证", - "warpgateSecurityKey": "安全密钥", - "warpgateAuthUrl": "身份验证URL", - "warpgateOpenBrowser": "在浏览器中打开", - "warpgateContinue": "我已完成身份验证", - "opksshAuthRequired": "需要OPKSSH 身份验证", - "opksshAuthDescription": "在您的浏览器中完成身份验证以继续。此会话将持续24小时有效。", - "opksshOpenBrowser": "打开浏览器进行身份验证", - "opksshWaitingForAuth": "正在等待浏览器的身份验证...", - "opksshAuthenticating": "正在处理身份验证...", - "opksshTimeout": "认证超时。请重试。", - "opksshAuthFailed": "认证失败。请检查您的凭据,然后重试。", - "opksshSignInWith": "使用 {{provider}} 登录", - "sudoPasswordPopupTitle": "输入密码?", - "websocketAbnormalClose": "连接意外关闭。这可能是由于反向代理或SSL配置出现问题。请检查服务器日志。", - "connectionLogTitle": "连接日志", - "connectionLogCopy": "复制日志到剪贴板", - "connectionLogEmpty": "尚无连接日志", - "connectionLogWaiting": "正在等待连接日志...", - "connectionLogCopied": "连接日志已复制到剪贴板", - "connectionLogCopyFailed": "复制日志到剪贴板失败", - "connectionRejected": "连接被服务器拒绝。请检查您的身份验证和网络配置。", - "hostKeyRejected": "SSH 主机验证被拒绝。连接已取消。", - "sessionTakenOver": "会话已在另一个标签页打开。正在重新连接..." + "tmuxSessionAttached": "tmux session attached: {{name}}", + "tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell", + "tmuxSessionPickerTitle": "tmux Sessions", + "tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", + "tmuxAttached": "Attached clients", + "tmuxAttachedCount": "{{count}} attached", + "tmuxLastActivity": "Last activity", + "tmuxTimeJustNow": "just now", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", + "tmuxCreateNew": "Start new session", + "tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard", + "tmuxDetach": "Detach from tmux session", + "tmuxDetached": "Detached from tmux session", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "打开", + "linkDialogCopy": "复制", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", + "connectionLogWaiting": "Waiting for connection logs...", + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "分页标签", + "addToSplit": "添加到拆分", + "removeFromSplit": "从拆分中移除" + } }, "fileManager": { - "noHostSelected": "未选择主机", - "initializingEditor": "正在初始化编辑器...", - "file": "文件", + "noHostSelected": "No host selected", + "initializingEditor": "Initializing editor...", + "file": "File", "folder": "文件夹", - "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": "重命名", - "uploading": "正在上传...", - "uploadingFile": "正在上传 {{name}}...", - "fileName": "文件名", - "folderName": "文件夹名称", - "fileUploadedSuccessfully": "文件“{{name}}”已成功上传", - "failedToUploadFile": "文件上传失败", - "fileDownloadedSuccessfully": "文件“{{name}}”已成功下载", - "failedToDownloadFile": "文件下载失败", - "fileCreatedSuccessfully": "文件“{{name}}”创建成功", - "folderCreatedSuccessfully": "文件夹“{{name}}”已成功创建", - "failedToCreateItem": "创建项目失败", - "operationFailed": "{{operation}} {{name}} 操作失败,: {{error}}", - "failedToResolveSymlink": "解析符号链接失败", - "itemsDeletedSuccessfully": "已成功删除 {{count}} 个项目", - "failedToDeleteItems": "删除项目失败", - "sudoPasswordRequired": "需要管理员密码", - "enterSudoPassword": "输入保证密码以继续此操作", - "sudoPassword": "Sudo 密码", - "sudoOperationFailed": "Sudo 操作失败", - "sudoAuthFailed": "Sudo 身份验证失败", - "dragFilesToUpload": "文件拖放到这里即可上传", - "emptyFolder": "此文件夹为空。", - "searchFiles": "搜索文件...", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", "upload": "上传", - "selectHostToStart": "选择主机以启动文件管理", - "sshRequiredForFileManager": "文件管理器需要 SSH。此主机未启用 SSH 。", - "failedToConnect": "SSH连接失败。", - "failedToLoadDirectory": "加载目录失败", - "noSSHConnection": "没有可用的 SSH 连接", + "selectHostToStart": "Select a host to start file management", + "sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", "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}} 吗?", - "permissionDenied": "没有权限", - "serverError": "服务器错误", - "fileSavedSuccessfully": "文件已成功保存", - "failedToSaveFile": "文件保存失败", - "confirmDeleteSingleItem": "您确定要永久删除“{{name}}”吗?", - "confirmDeleteMultipleItems": "您确定要永久删除 {{count}} 个项目吗?", - "confirmDeleteMultipleItemsWithFolders": "您确定要永久删除 {{count}} 个项目吗?这包括文件夹及其内容。", - "confirmDeleteFolder": "您确定要永久删除文件夹“{{name}}”及其所有内容吗?", - "permanentDeleteWarning": "此操作不可撤销,相关项目将从服务器中被永久删除。", - "recent": "最近", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", "pinned": "置顶", - "folderShortcuts": "文件夹快捷方式", - "failedToReconnectSSH": "SSH 会话重新连接失败", - "openTerminalHere": "在此处打开终端", - "run": "运行", - "openTerminalInFolder": "在此文件夹中打开终端", - "openTerminalInFileLocation": "打开终端,指向文件位置", - "runningFile": "运行 - {{file}}", - "onlyRunExecutableFiles": "只能运行可执行文件", - "directories": "目录", - "removedFromRecentFiles": "已将“{{name}}”从最近文件中移除", - "removeFailed": "移除失败", - "unpinnedSuccessfully": "已成功取消置顶“{{name}}”", - "unpinFailed": "取消置顶失败", - "removedShortcut": "已移除快捷方式“{{name}}”", - "removeShortcutFailed": "移除快捷方式失败", - "clearedAllRecentFiles": "已清除所有最近文件", - "clearFailed": "清除失败", - "removeFromRecentFiles": "从最近文件中删除", - "clearAllRecentFiles": "清除所有最近文件", - "unpinFile": "取消置顶文件", - "removeShortcut": "移除快捷方式", - "pinFile": "置顶文件", - "addToShortcuts": "添加到快捷方式", - "pasteFailed": "粘贴失败", - "noUndoableActions": "没有可撤销的操作", - "undoCopySuccess": "撤销复制操作:已删除 {{count}} 个已复制的文件", - "undoCopyFailedDelete": "撤销失败:无法删除任何已复制的文件", - "undoCopyFailedNoInfo": "撤销失败:找不到已复制的文件信息", - "undoMoveSuccess": "撤销移动操作:已将 {{count}} 个文件移回原始位置", - "undoMoveFailedMove": "撤销失败:无法将任何文件移回。", - "undoMoveFailedNoInfo": "撤销失败:找不到已移动的文件信息", - "undoDeleteNotSupported": "删除操作无法撤销:文件已从服务器永久删除。", - "undoTypeNotSupported": "不支持的撤销操作类型", - "undoOperationFailed": "撤销操作失败", - "unknownError": "未知错误", - "confirm": "确认", - "find": "查找...", - "replace": "替换", - "downloadInstead": "下载", - "keyboardShortcuts": "快捷键", - "searchAndReplace": "查找与替换", - "editing": "编辑", - "search": "搜索", - "findNext": "查找下一个", - "findPrevious": "查找上一个", - "save": "保存", - "selectAll": "全选", - "undo": "撤销", - "redo": "重做", - "moveLineUp": "上移行", - "moveLineDown": "下移行", - "toggleComment": "切换注释", - "autoComplete": "自动补全", - "imageLoadError": "图片加载失败", - "startTyping": "开始输入……", - "unknownSize": "尺寸未知", - "fileIsEmpty": "文件为空", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "跑步", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", "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": "新建文件 txt", - "successfullyMovedItems": "已成功将 {{count}} 个项目移动到 {{target}}", - "move": "移动", - "searchInFile": "在文件中搜索(Ctrl+F)", - "showKeyboardShortcuts": "显示快捷键", - "startWritingMarkdown": "开始编写你的 Markdown 内容……", - "loadingFileComparison": "正在加载文件比较...", - "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": "更改权限", - "currentPermissions": "当前权限", - "owner": "所有者", - "group": "用户组", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", + "newFileDefault": "NewFile.txt", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", "others": "其他的", - "read": "读", - "write": "写", - "execute": "执行", - "permissionsChangedSuccessfully": "权限已成功更改", - "failedToChangePermissions": "更改权限失败", - "name": "名称", - "sortByName": "名称", - "sortByDate": "修改日期", - "sortBySize": "大小", - "ascending": "升序", - "descending": "降序", - "root": "根目录", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "姓名", + "sortByName": "姓名", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", + "root": "Root", "new": "新的", - "sortBy": "排序方式", - "items": "项目", - "selected": "已选择", - "editor": "编辑器", - "octal": "八月", - "storage": "存储", - "disk": "磁盘", - "used": "已使用", - "of": "共", - "toggleSidebar": "切换侧边栏", - "cannotLoadPdf": "无法加载 PDF", - "pdfLoadError": "加载此 PDF 文件时出错。", - "loadingPdf": "正在加载 PDF...", - "loadingPage": "加载页面..." + "sortBy": "Sort By", + "items": "Items", + "selected": "Selected", + "editor": "Editor", + "octal": "Octal", + "storage": "Storage", + "disk": "Disk", + "used": "用过的", + "of": "的", + "toggleSidebar": "Toggle Sidebar", + "cannotLoadPdf": "Cannot load PDF", + "pdfLoadError": "There was an error loading this PDF file.", + "loadingPdf": "Loading PDF...", + "loadingPage": "Loading page..." }, "transfer": { - "copyToHost": "复制到主机…", - "moveToHost": "移至主机…", - "copyItemsToHost": "将 {{count}} 项复制到主机…", - "moveItemsToHost": "将 {{count}} 个物品移至主机…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "没有其他文件管理器主机可用。", "noHostsConnectedHint": "在主机管理器中添加另一台启用了文件管理器的 SSH 主机。", "selectDestinationHost": "选择目标主机", @@ -1163,49 +1359,49 @@ "browseFolders": "浏览目标文件夹", "browseDestination": "浏览或输入路径", "confirmCopy": "复制", - "confirmMove": "移动", - "transferring": "转移…", - "compressing": "正在压缩…", - "extracting": "提取…", - "transferringItems": "转移 {{current}} 个物品中的 {{total}} 个物品…", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "转账完成", "transferError": "转账失败", - "transferPartial": "转账完成,但出现 {{count}} 个错误", - "transferPartialHint": "转账失败: {{paths}}", - "itemsSummary": "{{count}} 项目", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "对于多项传输,目标位置必须是目录。", "selectThisFolder": "选择此文件夹", "browsePathWillBeCreated": "此文件夹尚不存在。传输开始时将创建此文件夹。", "browsePathError": "无法在目标主机上打开此路径。", "goUp": "上", - "copyFolderToHost": "将文件夹复制到主机…", - "moveFolderToHost": "将文件夹移动到主机…", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", "hostReady": "准备好", - "hostConnecting": "正在连接…", + "hostConnecting": "Connecting…", "hostDisconnected": "未连接", "hostAuthRequired": "需要身份验证——请先在此主机上打开文件管理器。", "hostConnectionFailed": "连接失败", "metricsTitle": "转账时间", - "metricsPrepare": "准备目的地: {{duration}}", - "metricsCompress": "压缩源文件: {{duration}}", - "metricsHopSourceRead": "来源 → 服务器: {{throughput}}", - "metricsHopDestSftpWrite": "服务器 → 目标(SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "服务器 → 目标(本地): {{throughput}}", - "metricsTransfer": "端到端: {{throughput}} ({{duration}})", - "metricsExtract": "提取到目标位置: {{duration}}", - "metricsSourceDelete": "从源中移除: {{duration}}", - "metricsTotal": "总计: {{duration}}", - "progressCompressing": "在源主机上进行压缩…", - "progressExtracting": "正在从目标位置… 提取", - "progressTransferring": "正在传输数据…", - "progressReconnecting": "正在重新连接…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "平行换乘车道", "parallelSegmentsOption": "{{count}} 车道", "parallelSegmentsHint": "大文件会被分割成 256 MB 的数据块。多通道使用独立的连接(类似于同时启动多个传输)以提高总吞吐量。", "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", - "progressTransferringItems": "正在传输文件({{current}} 中的 {{total}})…", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} 文件", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "保留源文件(部分传输)", "jumpHostLimitation": "两台主机都必须能从Termix服务器访问。不支持主机之间的直接路由。", "cancel": "取消", @@ -1216,25 +1412,25 @@ "methodAutoHint": "根据文件数量、大小和压缩率选择 tar 协议或按文件 SFTP 协议。单个文件始终使用流式 SFTP 协议。", "methodTarHint": "在源端压缩,传输单个压缩包,在目标端解压。两个 Unix 主机都需要 tar 命令。", "methodItemSftpHint": "通过 SFTP 逐个传输文件。支持所有主机,包括 Windows 系统。", - "methodPreviewLoading": "计算转移方法…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "无法预览传输方式。服务器将在您启动时选择一种传输方式。", "methodPreviewWillUseTar": "将使用:Tar 归档", "methodPreviewWillUseItemSftp": "将使用:按文件 SFTP", - "methodPreviewScanSummary": "{{fileCount}} 个文件, {{totalSize}} 总计(在源主机上扫描)。", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "每个文件都使用同一个 SFTP 流,以单文件复制的方式依次进行。所有文件的进度是合并计算的,因此在处理大文件时进度条移动较慢。", "methodReason": { "user_item_sftp": "您选择了按文件SFTP传输。", "user_tar": "您选择了tar归档。", "tar_unavailable": "Tar 在一台或两台主机上不可用——将改用按文件 SFTP。", "windows_host": "涉及 Windows 主机——未使用 tar。", - "auto_multi_large": "自动:多个文件,包括一个大文件({{largestSize}}),其中包含可压缩数据——tar 打包成一个传输。", - "auto_single_large_in_archive": "自动:此集合中有一个大文件({{largestSize}})—按文件 SFTP。", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "自动:主要为不可压缩数据——按文件 SFTP。", - "auto_many_files": "自动:多个文件({{fileCount}})— tar 减少每个文件的开销。", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "自动:此数据集的每个文件都使用 SFTP 进行管理。" }, "progressCancel": "取消", - "progressCancelling": "取消…", + "progressCancelling": "Cancelling…", "progressStalled": "停滞", "resumedHint": "已重新连接到在另一个窗口中启动的活动传输。", "transferCancelled": "转账已取消", @@ -1250,935 +1446,1342 @@ "transferFailedRetryHint": "目标端保留了部分数据。连接恢复后,系统将恢复重试。" }, "tunnels": { - "noSshTunnels": "没有 SSH 隧道", - "createFirstTunnelMessage": "您尚未创建任何 SSH 隧道。请在主机管理器中配置隧道连接以开始操作。", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", "connected": "已连接", "disconnected": "断开连接", - "connecting": "正在连接...", - "error": "错误", - "canceling": "正在取消……", - "connect": "连接", - "disconnect": "断开", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", "cancel": "取消", - "port": "港口", - "localPort": "本地端口", - "remotePort": "远程端口", - "currentHostPort": "当前主机端口", - "endpointPort": "端点端口", - "bindIp": "本地IP", - "endpointSshConfig": "端点SSH 配置", - "endpointSshHost": "端点SSH 主机", - "endpointSshHostPlaceholder": "选择一个配置的主机", - "endpointSshHostRequired": "为每个客户端隧道选择一个端点 SSH 主机。", - "attempt": "尝试 {{current}} 次,共 {{max}} 次", - "nextRetryIn": "下次重试时间为 {{seconds}} 秒", - "clientTunnels": "客户端Tunnels", - "clientTunnel": "客户端隧道", - "addClientTunnel": "添加客户端Tunnel", - "noClientTunnels": "在此桌面上没有配置客户端隧道。", - "tunnelName": "隧道名称", - "remoteHost": "远程主机", - "autoStart": "自动启动", - "clientAutoStartDesc": "当此桌面客户端打开并保持连接时开始。", - "clientManualStartDesc": "使用启动和停止此行。混合函数不会自动打开。", - "clientRemoteServerNote": "远程转发可能需要 allowTcpForwarding 和 GatewayPorts 在端点 SSH 服务器上。当此桌面断开连接时,远程端口将关闭。", - "clientTunnelStarted": "客户端隧道已启动", - "clientTunnelStopped": "客户端隧道已停止", - "tunnelTestSucceeded": "隧道测试成功", - "tunnelTestFailed": "隧道测试失败", - "localSaved": "客户端隧道已保存", - "localSaveError": "保存本地客户端隧道失败", - "invalidBindIp": "本地IP必须是有效的IPv4地址。", - "invalidLocalTargetIp": "本地目标IP必须是有效的IPv4地址。", - "invalidLocalPort": "本地端口必须介于 1 到 65535 之间。", - "invalidRemotePort": "远程端口必须介于 1 到 65535 之间。", - "invalidLocalTargetPort": "本地目标端口必须介于 1 到 65535 之间。", - "invalidEndpointPort": "端点端口必须介于 1 到 65535 之间。", - "duplicateAutoStartBind": "只能有一个自动启动客户端隧道使用 {{bind}}。", - "manualControlError": "更新隧道状态失败。", - "active": "已激活", - "start": "开始", - "stop": "停止", - "test": "测试", - "type": "隧道类型", - "typeLocal": "本地(-L)", - "typeRemote": "远程 (-R)", - "typeDynamic": "动态 (-D)", - "typeServerLocalDesc": "当前端点的主机。", - "typeServerRemoteDesc": "返回到当前主机的终点。", - "typeClientLocalDesc": "本地计算机到端点。", - "typeClientRemoteDesc": "返回本地计算机的端点。", - "typeClientDynamicDesc": "本地计算机上的SOCKS。", - "typeDynamicDesc": "通过 SSH 转发SOCKS5 连接", - "forwardDescriptionServerLocal": "当前主机 {{sourcePort}} → 端点 {{endpointPort}}。", - "forwardDescriptionServerRemote": "端点 {{endpointPort}} → 当前主机 {{sourcePort}}。", - "forwardDescriptionServerDynamic": "当前主机上的 SOCKS {{sourcePort}}。", - "forwardDescriptionClientLocal": "本地 {{sourcePort}} → 远程 {{endpointPort}}。", - "forwardDescriptionClientRemote": "远程 {{sourcePort}} → 本地 {{endpointPort}}。", - "forwardDescriptionClientDynamic": "本地端口上的 SOCKS {{sourcePort}}。", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", + "currentHostPort": "Current Host Port", + "endpointPort": "Endpoint Port", + "bindIp": "Local IP", + "endpointSshConfig": "Endpoint SSH Configuration", + "endpointSshHost": "Endpoint SSH Host", + "endpointSshHostPlaceholder": "Select a configured host", + "endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", + "clientTunnels": "Client Tunnels", + "clientTunnel": "Client Tunnel", + "addClientTunnel": "添加客户端隧道", + "noClientTunnels": "此桌面未配置客户端隧道。", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", + "clientAutoStartDesc": "Starts when this desktop client opens and stays connected.", + "clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.", + "clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.", + "clientTunnelStarted": "Client tunnel started", + "clientTunnelStopped": "Client tunnel stopped", + "tunnelTestSucceeded": "Tunnel test succeeded", + "tunnelTestFailed": "Tunnel test failed", + "localSaved": "Client tunnels saved", + "localSaveError": "Failed to save local client tunnels", + "invalidBindIp": "Local IP must be a valid IPv4 address.", + "invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.", + "invalidLocalPort": "Local port must be between 1 and 65535.", + "invalidRemotePort": "Remote port must be between 1 and 65535.", + "invalidLocalTargetPort": "Local target port must be between 1 and 65535.", + "invalidEndpointPort": "Endpoint port must be between 1 and 65535.", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", + "manualControlError": "Failed to update tunnel state.", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", + "typeDynamic": "Dynamic (-D)", + "typeServerLocalDesc": "Current host to endpoint.", + "typeServerRemoteDesc": "Endpoint back to current host.", + "typeClientLocalDesc": "Local computer to endpoint.", + "typeClientRemoteDesc": "Endpoint back to local computer.", + "typeClientDynamicDesc": "SOCKS on local computer.", + "typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS 通过 {{endpoint}}", - "autoNameClientLocal": "本地 {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → 本地 {{localPort}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", "autoNameClientDynamic": "袜子 {{localPort}} 通过 {{endpoint}}", - "route": "路由:", - "lastStarted": "上次启动", - "lastTested": "上次测试", - "lastError": "最后一个错误", - "maxRetries": "最大重试次数", - "maxRetriesDescription": "最大重试次数.", - "retryInterval": "重试间隔 (秒)", - "retryIntervalDescription": "重试之间等待的时间。", - "local": "本地", - "remote": "远程", - "destination": "目标", - "host": "主机", - "mode": "模式", - "noHostSelected": "没有选择主机", - "working": "工作中..." + "route": "Route:", + "lastStarted": "Last started", + "lastTested": "Last tested", + "lastError": "Last error", + "maxRetries": "Max Retries", + "maxRetriesDescription": "Maximum amount of retry attempts.", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "当地的", + "remote": "Remote", + "destination": "Destination", + "host": "Host", + "mode": "Mode", + "noHostSelected": "No host selected", + "working": "Working..." }, - "serverStats": { + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { "cpu": "CPU", - "memory": "内存", - "disk": "磁盘", - "network": "网络", - "uptime": "运行时长", - "processes": "进程数", - "available": "可用", - "free": "空闲", - "connecting": "正在连接...", - "connectionFailed": "无法连接到服务器", - "naCpus": "CPU 信息未获取", - "cpuCores_one": "{{count}} 核心", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", "cpuCores_other": "{{count}} Cores", - "cpuUsage": "CPU 使用率", - "memoryUsage": "内存使用率", - "diskUsage": "磁盘使用率", - "failedToFetchHostConfig": "获取主机配置失败", - "serverOffline": "服务器离线", - "cannotFetchMetrics": "无法从离线服务器获取指标", - "totpFailed": "TOTP验证失败", - "noneAuthNotSupported": "服务器统计信息不支持“无”身份验证类型。", - "load": "加载", - "systemInfo": "系统信息", - "hostname": "主机名", - "operatingSystem": "操作系统", - "kernel": "核心", - "seconds": "秒", - "networkInterfaces": "网络接口", - "noInterfacesFound": "未找到网络接口", - "noProcessesFound": "未找到任何进程", - "loginStats": "SSH 登录统计信息", - "noRecentLoginData": "暂无最近登录数据", - "executingQuickAction": "正在执行 {{name}}...", - "quickActionSuccess": "{{name}} 已成功完成", - "quickActionFailed": "{{name}} 失败", - "quickActionError": "执行 {{name}} 失败", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "监听端口", + "title": "Listening Ports", "protocol": "Protocol", - "port": "端口", - "address": "地址", - "process": "进程", - "noData": "没有监听端口数据" + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "All", + "noData": "No listening ports data" }, "firewall": { - "title": "防火墙", - "inactive": "未激活", - "policy": "政策", - "rules": "规则", - "noData": "无可用防火墙数据", - "action": "行 动", + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", "protocol": "Proto", - "port": "端口", - "source": "来源", - "anywhere": "任意地方" + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, - "loadAvg": "装入平均值", - "swap": "切换", - "architecture": "结构", - "refresh": "刷新", - "retry": "重试" + "loadAvg": "Load Avg", + "swap": "Swap", + "architecture": "Architecture", + "refresh": "Refresh", + "retry": "重试", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "Working...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "跑步", + "healthName": "姓名", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "自托管 SSH 和远程桌面管理", - "loginTitle": "登录 Termix", - "registerTitle": "创建账户", - "forgotPassword": "忘记密码?", - "rememberMe": "记住设备30天 (包括TOTP)", - "noAccount": "还没有账号?", - "hasAccount": "已有账号?", - "twoFactorAuth": "双因素身份验证", - "enterCode": "请输入验证码", - "backupCode": "或者使用备用代码", - "verifyCode": "验证码", - "redirectingToApp": "正在重定向到应用程序...", - "sshAuthenticationRequired": "需要 SSH 身份验证", - "sshNoKeyboardInteractive": "键盘交互认证不可用", - "sshAuthenticationFailed": "身份验证失败", - "sshAuthenticationTimeout": "身份验证超时", - "sshNoKeyboardInteractiveDescription": "服务器不支持键盘交互认证。请提供你的密码或 SSH 密钥。", - "sshAuthFailedDescription": "提供的凭证无效。请使用有效的凭证重试。", - "sshTimeoutDescription": "身份验证尝试超时,请重试。", - "sshProvideCredentialsDescription": "请提供您的 SSH 凭证以连接到此服务器。", - "sshPasswordDescription": "请输入此SSH连接的密码。", - "sshKeyPasswordDescription": "如果您的 SSH 密钥已加密,请在此处输入密码。", - "passphraseRequired": "需要密码", - "passphraseRequiredDescription": "SSH 密钥已加密。请输入密码以解锁它。", - "back": "返回", - "firstUser": "首位用户", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", + "passphraseRequired": "Passphrase Required", + "passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.", + "back": "Back", + "firstUser": "First User", "firstUserMessage": "您是第一个用户,将被授予管理员权限。您可以在侧边栏用户下拉菜单中查看管理员设置。如果您认为这是一个错误,请查看 Docker 日志或在 GitHub 上创建一个 issue。", - "external": "第三方", - "loginWithExternal": "通过第三方账号登录", - "loginWithExternalDesc": "使用你配置的第三方身份提供商登录", - "externalNotSupportedInElectron": "Electron 应用暂不支持第三方认证。请使用网页版进行 OIDC 登录。", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "Electron 应用目前尚不支持外部身份验证。请使用网页版进行 OIDC 登录。", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", "resetPasswordButton": "重置密码", - "sendResetCode": "发送重置码", - "resetCodeDesc": "输入你的用户名以接收密码重置码。该码将记录在 docker 容器日志中。", - "resetCode": "重置码", - "verifyCodeButton": "验证码", + "sendResetCode": "发送重置代码", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", "enterResetCode": "请输入 Docker 容器日志中该用户的 6 位代码:", - "newPassword": "新密码", - "confirmNewPassword": "确认密码", - "enterNewPassword": "请输入用户的新密码:", - "signUp": "注册", - "desktopApp": "桌面应用程序", - "loggingInToDesktopApp": "正在登录桌面应用", - "loadingServer": "正在加载服务器...", - "dataLossWarning": "使用此方法重置密码将删除您保存的所有 SSH 主机、凭证和其他加密数据。此操作无法撤销。仅当您忘记密码且未登录时才使用此方法。", - "authenticationDisabled": "身份验证已禁用", - "authenticationDisabledDesc": "所有身份验证方式目前均已禁用。请联系您的管理员。", - "attemptsRemaining": "{{count}} 剩余尝试次数" + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "验证 SSH 主机密钥", - "keyChangedWarning": "SSH 主机密钥已更改", - "firstConnectionTitle": "第一次连接到此主机", - "firstConnectionDescription": "此主机的真实性无法确认。请验证指纹符合您的期望。", - "keyChangedDescription": "此服务器的主机密钥自您上次连接以来已经改变。这可能会显示一个安全问题。", - "previousKey": "上一键", - "newFingerprint": "新建指纹", - "fingerprint": "指纹", - "verifyInstructions": "如果您信任此主机,请单击接受以继续保存此指纹以备将来的连接。", - "securityWarning": "安全警告", - "acceptAndContinue": "接受并继续", - "acceptNewKey": "接受新密钥并继续" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "无法连接到数据库", - "unknownError": "未知错误", - "loginFailed": "登录失败", - "failedPasswordReset": "密码重置失败", - "failedVerifyCode": "重置代码验证失败", - "failedCompleteReset": "密码重置失败", - "invalidTotpCode": "无效的 TOTP 代码", - "failedOidcLogin": "OIDC 登录启动失败", - "silentSigninOidcUnavailable": "请求静音登录,但OIDC 登录不可用。", - "failedUserInfo": "登录后无法获取用户信息", - "oidcAuthFailed": "OIDC 身份验证失败", - "invalidAuthUrl": "从后端收到的授权 URL 无效", - "requiredField": "此字段是必需的", - "minLength": "最短长度为 {{min}}", - "passwordMismatch": "密码不匹配", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", + "silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.", + "failedUserInfo": "Failed to get user info after login", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", "passwordLoginDisabled": "目前已禁用用户名/密码登录。", - "sessionExpired": "会话已过期 - 请重新登录", - "totpRateLimited": "率限制:太多TOTP 验证尝试。请稍后再试。", - "totpRateLimitedWithTime": "速率限制:TOTP 验证尝试次数过多。请稍等 {{time}} 秒后再试。", - "resetCodeRateLimited": "率限制:验证尝试次数太多。请稍后再试。", - "resetCodeRateLimitedWithTime": "验证次数过多,请稍等 {{time}} 秒后再试。", - "authTokenSaveFailed": "保存身份验证令牌失败", - "failedToLoadServer": "加载服务器失败" + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", + "authTokenSaveFailed": "Failed to save authentication token", + "failedToLoadServer": "Failed to load server" }, "messages": { - "registrationDisabled": "管理员已禁用新账号注册功能。请登录或联系管理员。", - "userNotAllowed": "您的帐户未被授权注册。请与管理员联系。", - "databaseConnectionFailed": "连接数据库服务器失败", - "resetCodeSent": "重置码已发送到 Docker 日志", - "codeVerified": "验证码验证成功", + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "重置代码已发送到 Docker 日志", + "codeVerified": "Code verified successfully", "passwordResetSuccess": "密码重置成功", - "loginSuccess": "登录成功", - "registrationSuccess": "注册成功" + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { - "c2sTunnelConfigDesc": "针对已配置的 SSH 主机的本地桌面隧道。", - "c2sTunnelPresets": "客户端隧道预设", - "c2sTunnelPresetsDesc": "将此桌面客户端的本地隧道列表保存为服务器预设,或将预设加载到此客户端。", - "c2sTunnelPresetsUnavailable": "客户端隧道预设仅在桌面客户端可用。", - "c2sPresetName": "预设名称", - "c2sPresetNamePlaceholder": "客户端预设名称", - "c2sPresetToLoad": "预设负载", - "c2sNoPresetSelected": "未选择预设", - "c2sNoPresets": "未保存预设", - "c2sLoadPreset": "负载", - "c2sCurrentLocalConfig": "{{count}} 此桌面上配置了本地客户端隧道。", - "c2sPresetSyncNote": "预设是显式的快照;正在加载一个以替换此桌面客户端本地隧道列表。", - "c2sPresetSaved": "客户端隧道预设保存", - "c2sPresetLoaded": "客户端隧道预设本地加载", - "c2sPresetRenamed": "客户端隧道预设重命名", - "c2sPresetDeleted": "客户端隧道预设已删除", - "c2sPresetLoadError": "加载客户端隧道预设失败" + "c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.", + "c2sTunnelPresets": "Client Tunnel Presets", + "c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.", + "c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.", + "c2sPresetName": "Preset Name", + "c2sPresetNamePlaceholder": "Client preset name", + "c2sPresetToLoad": "Preset To Load", + "c2sNoPresetSelected": "No preset selected", + "c2sNoPresets": "No presets saved", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", + "c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.", + "c2sPresetSaved": "Client tunnel preset saved", + "c2sPresetLoaded": "Client tunnel preset loaded locally", + "c2sPresetRenamed": "客户端隧道预设已重命名", + "c2sPresetDeleted": "Client tunnel preset deleted", + "c2sPresetLoadError": "Failed to load client tunnel presets" }, "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "语言", - "keyPassword": "密钥密码", - "pastePrivateKey": "把你的私钥粘贴到这里……", - "localListenerHost": "127.0.0.1 (本地监听)", - "localTargetHost": "127.0.0.1 (此计算机上的目标)", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", + "localListenerHost": "127.0.0.1 (listen locally)", + "localTargetHost": "127.0.0.1 (target on this computer)", "socksListenerHost": "127.0.0.1 (SOCKS listener)", - "enterPassword": "请输入您的密码", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "仪表盘", - "loading": "正在加载仪表板...", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "支持", + "support": "Support", "discord": "Discord", - "serverOverview": "服务器概览", - "version": "版本", - "upToDate": "最新", - "updateAvailable": "更新可用", - "beta": "测试版", - "uptime": "运行时长", - "database": "数据库", - "healthy": "健康", - "error": "错误", - "totalHosts": "主机总数", - "totalTunnels": "隧道总数", - "totalCredentials": "凭证总数", - "recentActivity": "最近活动", - "reset": "重置", - "loadingRecentActivity": "加载最近活动...", - "noRecentActivity": "暂无最近活动", - "quickActions": "快捷操作", - "addHost": "添加主机", - "addCredential": "添加凭证", - "adminSettings": "管理员设置", - "userProfile": "用户资料", - "serverStats": "服务器统计信息", - "loadingServerStats": "加载服务器统计信息...", - "noServerData": "暂无服务器数据", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", + "beta": "Beta", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", + "totalHosts": "Total Hosts", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "用户个人资料", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", "cpu": "CPU", - "ram": "内存", - "customizeLayout": "自定义仪表板", - "dashboardSettings": "仪表盘设置", - "enableDisableCards": "启用/禁用卡片", - "resetLayout": "重置为默认值", - "serverOverviewCard": "服务器概述", - "recentActivityCard": "最近活动", - "networkGraphCard": "网络图", - "networkGraph": "网络图", - "quickActionsCard": "快速操作", - "serverStatsCard": "服务器统计", - "panelMain": "主要的", - "panelSide": "侧面", - "justNow": "就在这里" + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", + "panelMain": "Main", + "panelSide": "Side", + "justNow": "just now", + "serviceLinks": "Service Links" }, "dashboardTab": { - "stable": "已开始", - "hostsOnline": "在线主机", - "activeTunnels": "活动Tunnels", - "registerNewServer": "注册一个新服务器", - "storeSshKeysOrPasswords": "存储 SSH 密钥或密码", - "manageUsersAndRoles": "管理用户和角色", - "manageYourAccount": "管理您的帐户", - "hostStatus": "主机状态", - "noHostsConfigured": "未配置主机", - "online": "在线用户", - "offline": "关闭", - "onlineLower": "在线", + "stable": "稳定的", + "hostsOnline": "Hosts Online", + "activeTunnels": "Active Tunnels", + "registerNewServer": "Register a new server", + "storeSshKeysOrPasswords": "Store SSH keys or passwords", + "manageUsersAndRoles": "Manage users and roles", + "manageYourAccount": "Manage your account", + "hostStatus": "Host Status", + "noHostsConfigured": "No hosts configured", + "online": "ONLINE", + "offline": "OFFLINE", + "onlineLower": "在线的", "nodes": "{{count}} nodes", - "add": "添加:", - "commandPalette": "命令调色板", - "done": "完成", - "editModeInstructions": "拖动卡片以重新排序 · 拖动列分隔符以调整列的大小 · 拖动卡的底部边缘以调整卡的高度 · 回收站以移除。", - "empty": "空的", - "clear": "清空" + "add": "Add:", + "commandPalette": "命令面板", + "done": "Done", + "editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove", + "empty": "Empty", + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "复制", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "添加主机", - "addGroup": "添加群组", - "addLink": "添加链接", - "zoomIn": "放大区域", - "zoomOut": "缩放", - "resetView": "重置视图", - "selectHost": "选择主机", - "chooseHost": "选择主机...", - "parentGroup": "上级分组", - "noGroup": "没有群组", - "groupName": "群组名称", - "color": "颜色", - "source": "来源", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", "target": "Target", - "moveToGroup": "移动到组", - "selectGroup": "选择组...", - "addConnection": "添加连接", - "hostDetails": "主机详细信息", - "removeFromGroup": "从群组中删除", - "addHostHere": "在此处添加主机", - "editGroup": "编辑分组", - "delete": "删除", - "add": "添加", - "create": "创建", - "move": "移动", - "connect": "连接", - "createGroup": "创建分组", - "selectSourcePlaceholder": "选择源...", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", "selectTargetPlaceholder": "Select Target...", - "invalidFile": "无效的文件", - "hostAlreadyExists": "主机已经在地形中", - "connectionExists": "连接已存在", - "unknown": "未知的", - "name": "名称", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "姓名", "ip": "IP", - "status": "状态", - "failedToAddNode": "添加节点失败", - "sourceDifferentFromTarget": "来源和目标必须是不同的", - "exportJSON": "导出 JSON", - "importJSON": "导入 JSON", - "terminal": "终端", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", "fileManager": "文件管理器", - "tunnel": "隧道:", - "docker": "停靠栏", - "serverStats": "服务器统计", - "noNodes": "尚无节点" + "tunnel": "Tunnel", + "docker": "Docker", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "noNodes": "No nodes yet" }, "docker": { - "notEnabled": "此主机未启用 Docker", - "validating": "正在验证 Docker......", - "connecting": "正在连接......", - "error": "错误", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "无法连接到 Docker", - "containerStarted": "容器 {{name}} 已启动", - "failedToStartContainer": "启动容器 {{name}} 失败", - "containerStopped": "容器 {{name}} 已停止", - "failedToStopContainer": "停止容器 {{name}} 失败", - "containerRestarted": "容器 {{name}} 已重启", - "failedToRestartContainer": "重启容器 {{name}} 失败", - "containerPaused": "容器 {{name}} 已暂停", - "containerUnpaused": "容器 {{name}} 已取消暂停", - "failedToTogglePauseContainer": "切换容器 {{name}} 暂停状态失败", - "containerRemoved": "容器 {{name}} 已移除", - "failedToRemoveContainer": "移除容器 {{name}} 失败", - "image": "镜像", - "ports": "端口", - "noPorts": "无端口", - "start": "启动", - "confirmRemoveContainer": "您确定要移除容器“{{name}}”吗?此操作无法撤销。", - "runningContainerWarning": "警告:此容器当前正在运行,请先停止后再移除。", - "loadingContainers": "加载容器列表......", - "manager": "停靠管理器", - "autoRefresh": "自动刷新", - "timestamps": "时间戳", - "lines": "直线", - "filterLogs": "过滤日志...", - "refresh": "刷新", - "download": "下载", - "clear": "清空", - "logsDownloaded": "日志下载成功", - "last50": "最近50", - "last100": "最近100", - "last500": "最后500", - "last1000": "最近 1000 个", - "allLogs": "所有日志", - "noLogsMatching": "没有与“{{query}}”匹配的日志", - "noLogsAvailable": "无可用日志", - "noContainersFound": "未找到容器", - "noContainersFoundHint": "此主机上没有可用的 Docker 容器", - "searchPlaceholder": "搜索容器……", - "allStatuses": "所有状态", - "stateRunning": "正在运行", - "statePaused": "已暂停", - "stateExited": "退出", - "stateRestarting": "重启中", - "noContainersMatchFilters": "没有容器符合您的筛选条件", - "noContainersMatchFiltersHint": "尝试调整搜索关键词或筛选条件", - "failedToFetchStats": "获取容器统计信息失败", - "containerNotRunning": "容器未运行", - "startContainerToViewStats": "启动容器以查看统计信息", - "loadingStats": "正在加载统计信息……", - "errorLoadingStats": "加载统计信息时出错", - "noStatsAvailable": "暂无统计数据", - "cpuUsage": "CPU 使用率", - "current": "当前值", - "memoryUsage": "内存使用率", - "networkIo": "网络 I/O", - "input": "流入", - "output": "流出", - "blockIo": "块 I/O", - "read": "读取", - "write": "写入", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", + "manager": "Docker Manager", + "autoRefresh": "Auto Refresh", + "timestamps": "Timestamps", + "lines": "Lines", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", + "logsDownloaded": "Logs downloaded successfully", + "last50": "Last 50", + "last100": "Last 100", + "last500": "Last 500", + "last1000": "Last 1000", + "allLogs": "All Logs", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", + "allStatuses": "All Statuses", + "stateRunning": "Running", + "statePaused": "Paused", + "stateExited": "Exited", + "stateRestarting": "Restarting", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", "pids": "PIDs", - "containerInformation": "容器信息", - "name": "名称", + "containerInformation": "Container Information", + "name": "姓名", "id": "ID", - "state": "状态", - "containerMustBeRunning": "容器必须正在运行才能访问控制台", - "verificationCodePrompt": "请输入验证码", - "totpVerificationFailed": "TOTP验证失败,请重试。", - "warpgateVerificationFailed": "Warpgate 身份验证失败。请重试。", - "connectedTo": "已连接到 {{containerName}}", - "disconnected": "已断开", - "consoleError": "控制台错误", - "errorMessage": "错误:{{message}}", - "failedToConnect": "连接容器失败", - "console": "控制台", - "selectShell": "选择 Shell", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "断开连接", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", "ash": "ash", - "connect": "连接", - "disconnect": "断开连接", + "connect": "Connect", + "disconnect": "Disconnect", "notConnected": "未连接", - "clickToConnect": "单击“连接”以启动 shell 会话", - "connectingTo": "正在连接到 {{containerName}}......", - "containerNotFound": "未找到容器", - "backToList": "返回列表", - "logs": "日志", - "stats": "统计信息", - "consoleTab": "控制台", - "startContainerToAccess": "启动容器以访问控制台" + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "A. 概况", + "sectionGeneral": "一般的", "sectionOidc": "OIDC", - "sectionUsers": "用户", - "sectionSessions": "二. 会议", - "sectionRoles": "角色", - "sectionDatabase": "数据库", - "sectionApiKeys": "API 密钥", - "allowRegistration": "允许用户注册", - "allowRegistrationDesc": "允许新用户自注册", - "allowPasswordLogin": "允许密码登录", - "allowPasswordLoginDesc": "用户名/密码登录", - "oidcAutoProvision": "OIDC 自动提供", - "oidcAutoProvisionDesc": "即使注册被禁用,也自动为OIDC用户创建帐户", - "allowPasswordReset": "允许重置密码", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", + "sectionSessions": "会议", + "sectionRoles": "Roles", + "sectionDatabase": "Database", + "sectionApiKeys": "API Keys", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "清除筛选条件", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "All", + "allowRegistration": "Allow User Registration", + "allowRegistrationDesc": "Let new users self-register with a username and password", + "allowPasswordLogin": "Allow Password Login", + "allowPasswordLoginDesc": "Username/password login", + "oidcAutoProvision": "OIDC自动配置", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", + "allowPasswordReset": "Allow Password Reset", "allowPasswordResetDesc": "通过 Docker 日志重置代码", - "sessionTimeout": "会话超时", - "hours": "小时", - "sessionTimeoutRange": "最小1小时 · 最大720小时", - "monitoringDefaults": "监控默认值", - "statusCheck": "状态检查", - "metrics": "指标", - "sec": "秒", - "logLevel": "日志级别", - "enableGuacamole": "启用 Guacamole", - "enableGuacamoleDesc": "RDP/VNC 远程桌面", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", + "sessionTimeout": "Session Timeout", + "hours": "hours", + "sessionTimeoutRange": "Min 1h · Max 720h", + "monitoringDefaults": "Monitoring Defaults", + "statusCheck": "Status Check", + "metrics": "Metrics", + "sec": "sec", + "logLevel": "Log Level", + "enableGuacamole": "Enable Guacamole", + "enableGuacamoleDesc": "RDP/VNC remote desktop", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", - "oidcDescription": "配置 OpenID Connect for SSO。需要填写字段*", - "oidcClientId": "客户端ID", - "oidcClientSecret": "客户端密钥", - "oidcAuthUrl": "授权 URL", - "oidcIssuerUrl": "发行者网址", - "oidcTokenUrl": "令牌网址", - "oidcUserIdentifier": "用户标识路径", - "oidcDisplayName": "显示名称路径", - "oidcScopes": "范围", - "oidcUserinfoUrl": "覆盖用户信息URL", - "oidcAllowedUsers": "允许的用户", - "oidcAllowedUsersDesc": "每行一封电子邮件。留空以允许所有电子邮件。", - "removeOidc": "删除", - "usersCount": "{{count}} 用户", - "createUser": "创建", - "newRole": "新建角色", - "roleName": "名称", - "roleDisplayName": "显示名称", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", + "oidcDescription": "配置 OpenID Connect 以实现单点登录。标有 * 的字段为必填项。", + "oidcDocsLink": "View docs", + "oidcClientId": "客户ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", + "oidcUserinfoUrl": "Override Userinfo URL", + "oidcAllowedUsers": "Allowed Users", + "oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", + "newRole": "New Role", + "roleName": "姓名", + "roleDisplayName": "Display Name", "roleDescription": "描述", - "rolesCount": "{{count}} 角色", - "createRole": "创建", - "creating": "创建中...", - "exportDatabase": "导出数据库", - "exportDatabaseDesc": "下载所有主机、 凭据和设置的备份", - "export": "导出", - "exporting": "导出中...", - "importDatabase": "导入数据库", - "importDatabaseDesc": "从.sqlite备份文件恢复", - "importDatabaseSelected": "已选择: {{name}}", - "selectFile": "选择文件", - "changeFile": "更改", - "import": "导入", - "importing": "输入...", - "apiKeysCount": "{{count}} 键", - "newApiKey": "新 API 密钥", - "apiKeyCreatedWarning": "密钥已创建 - 现在复制,将不会再显示。", - "apiKeyName": "名称", - "apiKeyUser": "用户", - "apiKeySelectUser": "选择一个用户...", - "apiKeyExpiresAt": "到期于", - "createKey": "创建密钥", - "apiKeyNoExpiry": "无过期", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", + "exportDatabase": "Export Database", + "exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings", + "export": "Export", + "exporting": "Exporting...", + "importDatabase": "Import Database", + "importDatabaseDesc": "Restore from a .sqlite backup file", + "importDatabaseSelected": "Selected: {{name}}", + "selectFile": "Select File", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", + "newApiKey": "New API Key", + "apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.", + "apiKeyName": "姓名", + "apiKeyUser": "User", + "apiKeySelectUser": "Select a user...", + "apiKeyExpiresAt": "Expires At", + "createKey": "Create Key", + "apiKeyNoExpiry": "No expiry", "revokedBadge": "REVOKED", - "authTypeDual": "双重认证", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "本地的", - "adminStatusAdministrator": "管理员", - "adminStatusRegularUser": "普通用户", - "adminBadge": "管理员信息", + "authTypeLocal": "当地的", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", + "adminBadge": "ADMIN", "systemBadge": "SYS", - "customBadge": "抄送", - "youBadge": "您的", - "sessionsActive": "{{count}} 活跃", - "sessionActive": "当前状态: {{time}}", + "customBadge": "CUSTOM", + "youBadge": "YOU", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", - "revokeAll": "所有的", - "revokeAllSessionsSuccess": "所有用户会话已被吊销了", - "revokeAllSessionsFailed": "取消会话失败", - "revokeSessionFailed": "取消会话失败", - "addRole": "添加角色", - "noCustomRoles": "未定义自定义角色", - "removeRoleFailed": "删除角色失败", - "assignRoleFailed": "分配角色失败", - "deleteRoleFailed": "删除角色失败", - "userAdminAccess": "管理员", - "userAdminAccessDesc": "完全访问所有管理员设置", - "userRoles": "角色", - "revokeAllUserSessions": "撤销所有会话", - "revokeAllUserSessionsDesc": "强制重新登录所有设备", + "revokeAll": "All", + "revokeAllSessionsSuccess": "All sessions for user revoked", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", + "addRole": "Add role", + "noCustomRoles": "No custom roles defined", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", + "userAdminAccessDesc": "Full access to all admin settings", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", + "revokeAllUserSessionsDesc": "Force re-login on all devices", "revoke": "Revoke", - "deleteUserWarning": "永久删除此用户。", - "deleteUser": "删除 {{username}}", - "deleting": "正在删除……", - "deleteUserFailed": "删除用户失败", - "deleteUserSuccess": "用户“{{username}}”已删除", - "deleteRoleSuccess": "角色“{{name}}”已删除", - "revokeKeySuccess": "密钥“{{name}}”已撤销", - "revokeKeyFailed": "吊销密钥失败", - "copiedToClipboard": "复制到剪贴板", - "done": "完成", - "createUserTitle": "创建用户", + "deleteUserWarning": "Deleting this user is permanent.", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", + "revokeKeyFailed": "Failed to revoke key", + "copiedToClipboard": "Copied to clipboard", + "done": "Done", + "createUserTitle": "Create User", "createUserDesc": "创建一个新的本地帐户。", "createUserUsername": "用户名", "createUserPassword": "密码", - "createUserPasswordHint": "至少 6 个字符。", - "createUserEnterUsername": "输入用户名", - "createUserEnterPassword": "输入密码", - "createUserSubmit": "创建用户", - "editUserTitle": "管理用户: {{username}}", - "editUserDesc": "编辑角色、管理状态、会话和账户设置。", + "createUserPasswordHint": "至少6个字符。", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", + "editUserDesc": "Edit roles, admin status, sessions, and account settings.", "editUserUsername": "用户名", - "editUserAuthType": "认证类型", - "editUserAdminStatus": "管理员状态", - "editUserUserId": "用户 ID", - "linkAccountTitle": "将 OIDC 链接到密码帐户", - "linkAccountDesc": "将 OIDC 帐户 {{username}} 与现有本地帐户合并。", - "linkAccountWarningTitle": "这将:", - "linkAccountEffect1": "删除仅限OIDC账户", - "linkAccountEffect2": "添加OIDC登录到目标账户", - "linkAccountEffect3": "允许同时登录 OIDC 和密码", - "linkAccountTargetUsername": "Target Username", - "linkAccountTargetPlaceholder": "输入本地帐户用户名链接到", - "linkAccounts": "链接账户", - "linkAccountSuccess": "OIDC 账户关联到“{{username}}”", - "linkAccountFailed": "OIDC账户关联失败", + "editUserAuthType": "身份验证类型", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", + "linkAccountWarningTitle": "This will:", + "linkAccountEffect1": "Delete the OIDC-only account", + "linkAccountEffect2": "Add OIDC login to the target account", + "linkAccountEffect3": "Allow both OIDC and password login", + "linkAccountTargetUsername": "Local Account Username", + "linkAccountTargetPlaceholder": "Enter the local account username to link to", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", "linkAccountInProgress": "正在连接……", - "saving": "保存中...", - "updateRegistrationFailed": "更新注册设置失败", - "updatePasswordLoginFailed": "更新密码登录设置失败", - "updateOidcAutoProvisionFailed": "更新OIDC自动提供设置失败", - "updatePasswordResetFailed": "更新密码重置设置失败", - "sessionTimeoutRange2": "会话超时必须介于 1 到 720 小时", - "sessionTimeoutSaved": "会话超时保存", - "sessionTimeoutSaveFailed": "保存会话超时", - "monitoringIntervalInvalid": "无效的间隔值", - "monitoringSaved": "监测设置已保存", - "monitoringSaveFailed": "保存监测设置失败", - "guacamoleSaved": "已保存关岛设置", - "guacamoleSaveFailed": "无法保存 Guacamole 设置", - "guacamoleUpdateFailed": "更新关卡莫尔设置失败", - "logLevelUpdateFailed": "更新日志级别失败", - "oidcSaved": "OIDC 配置已保存", - "oidcSaveFailed": "保存 OIDC 配置失败", - "oidcRemoved": "OIDC 配置已删除", - "oidcRemoveFailed": "删除 OIDC 配置失败", - "createUserRequired": "用户名和密码是必需的", - "createUserPasswordTooShort": "密码必须至少 6 个字符", - "createUserSuccess": "用户“{{username}}”创建", - "createUserFailed": "创建用户失败", - "updateAdminStatusFailed": "更新管理状态失败", - "allSessionsRevoked": "所有会话已取消", - "revokeSessionsFailed": "取消会话失败", - "createRoleRequired": "名称和显示名称是必填项", - "createRoleSuccess": "角色“{{name}}”已创建", - "createRoleFailed": "创建角色失败", - "apiKeyNameRequired": "密钥名称是必需的", - "apiKeyUserRequired": "必须填写用户 ID", - "apiKeyCreatedSuccess": "API 密钥“{{name}}”已创建", - "apiKeyCreateFailed": "创建 API 密钥失败", - "exportSuccess": "数据库导出成功", - "exportFailed": "数据库导出失败", - "importSelectFile": "请先选择一个文件", - "importCompleted": "导入完成:已导入 {{total}} 项,跳过 {{skipped}} 项", - "importFailed": "导入失败: {{error}}", - "importError": "数据库导入失败" + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", + "updateRegistrationFailed": "Failed to update registration setting", + "updatePasswordLoginFailed": "Failed to update password login setting", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", + "updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", + "updatePasswordResetFailed": "Failed to update password reset setting", + "sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours", + "sessionTimeoutSaved": "Session timeout saved", + "sessionTimeoutSaveFailed": "Failed to save session timeout", + "monitoringIntervalInvalid": "Invalid interval values", + "monitoringSaved": "Monitoring settings saved", + "monitoringSaveFailed": "Failed to save monitoring settings", + "guacamoleSaved": "Guacamole settings saved", + "guacamoleSaveFailed": "Failed to save Guacamole settings", + "guacamoleUpdateFailed": "Failed to update Guacamole setting", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", + "logLevelUpdateFailed": "Failed to update log level", + "oidcSaved": "OIDC configuration saved", + "oidcSaveFailed": "Failed to save OIDC config", + "oidcRemoved": "OIDC configuration removed", + "oidcRemoveFailed": "Failed to remove OIDC config", + "createUserRequired": "Username and password are required", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", + "updateAdminStatusFailed": "Failed to update admin status", + "allSessionsRevoked": "All sessions revoked", + "revokeSessionsFailed": "Failed to revoke sessions", + "createRoleRequired": "Name and display name are required", + "createRoleSuccess": "Role \"{{name}}\" created", + "createRoleFailed": "Failed to create role", + "apiKeyNameRequired": "Key name is required", + "apiKeyUserRequired": "User ID is required", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "exportSuccess": "Database exported successfully", + "exportFailed": "Database export failed", + "importSelectFile": "Please select a file first", + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "Database import failed", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { - "hostLabel": "主机", - "hostPlaceholder": "192.168.1.1 或 example.com", - "portLabel": "端口", + "hostLabel": "Host", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", "usernameLabel": "用户名", - "usernamePlaceholder": "用户名", - "authLabel": "认证", + "usernamePlaceholder": "username", + "authLabel": "Auth", "passwordLabel": "密码", - "passwordPlaceholder": "密碼", + "passwordPlaceholder": "密码", "privateKeyLabel": "私钥", - "privateKeyPlaceholder": "粘贴私钥...", + "privateKeyPlaceholder": "Paste private key...", "credentialLabel": "凭据", - "credentialPlaceholder": "选择保存的凭据", - "connectToTerminal": "连接到终端", + "credentialPlaceholder": "Select a saved credential", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "连接到文件" }, "history": { - "noTerminalSelected": "未选择终端", - "noTerminalSelectedHint": "打开一个 SSH 终端标签来查看其命令历史", - "searchPlaceholder": "搜索历史...", - "clearAll": "全部清除", - "noHistoryEntries": "没有历史记录", - "trackingDisabled": "历史跟踪已禁用", - "trackingDisabledHint": "在您的个人资料设置中启用它来录制命令。" + "noTerminalSelected": "No terminal selected", + "noTerminalSelectedHint": "Open an SSH terminal tab to view its command history", + "searchPlaceholder": "Search history...", + "clearAll": "Clear All", + "noHistoryEntries": "No history entries", + "trackingDisabled": "历史记录跟踪已禁用", + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "按键录制", - "recordToTerminals": "录制到终端", - "selectAll": "所有的", - "selectNone": "无", - "noTerminalTabsOpen": "未打开终端标签", - "selectTerminalsAbove": "选择上面的终端", - "broadcastInputPlaceholder": "在这里输入广播关键字...", - "stopRecording": "停止录制", - "startRecording": "开始录制", - "settingsTitle": "设置", - "enableRightClickCopyPaste": "启用右击复制/粘贴" + "keyRecordingTitle": "Key Recording", + "recordToTerminals": "Record to terminals", + "selectAll": "All", + "selectNone": "没有任何", + "noTerminalTabsOpen": "No terminal tabs open", + "selectTerminalsAbove": "Select terminals above", + "broadcastInputPlaceholder": "Type here to broadcast keystrokes...", + "stopRecording": "Stop Recording", + "startRecording": "Start Recording", + "settingsTitle": "Settings", + "enableRightClickCopyPaste": "Enable right-click copy/paste" }, "splitScreen": { - "layoutTitle": "布局", - "selectLayoutAbove": "选择上面的布局", - "selectLayoutHint": "选择要显示多少窗格", - "panesTitle": "面包", - "openTabsTitle": "打开标签", + "layoutTitle": "Layout", + "selectLayoutAbove": "Select a layout above", + "selectLayoutHint": "Choose how many panes to display", + "panesTitle": "Panes", + "openTabsTitle": "Open Tabs", "dragTabsHint": "将标签拖入上方窗格,或使用快速分配功能。", - "dropHere": "拖放到这里", - "emptyPane": "空的", - "dashboard": "仪表板", - "clearSplitScreen": "清除分屏", + "dropHere": "Drop here", + "emptyPane": "Empty", + "dashboard": "Dashboard", + "clearSplitScreen": "Clear Split Screen", "quickAssign": "快速分配", - "alreadyAssigned": "窗格 {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "分页标签", "addToSplit": "添加到拆分", "removeFromSplit": "从拆分中移除", - "assignToPane": "分配到窗格" + "assignToPane": "分配到窗格", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { + "title": "片段", "createSnippetTitle": "创建代码片段", - "createSnippetDescription": "创建一个新的命令代码片段以便快速执行", - "nameLabel": "名称", + "createSnippetDescription": "创建一个新的命令片段以便快速执行", + "nameLabel": "姓名", "namePlaceholder": "例如,重启 Nginx", "descriptionLabel": "描述", "descriptionPlaceholder": "可选描述", - "optional": "可选的", + "optional": "Optional", "folderLabel": "文件夹", - "noFolder": "没有文件夹(未分类)", - "commandLabel": "命令", - "commandPlaceholder": "例如: sudo systemctl 重启 nginx", + "noFolder": "无文件夹(未分类)", + "commandLabel": "Command", + "commandPlaceholder": "例如,sudo systemctl restart nginx", "cancel": "取消", "createSnippetButton": "创建代码片段", - "createFolderTitle": "创建文件夹", - "createFolderDescription": "将你的代码片段整理到文件夹", - "folderNameLabel": "文件夹名称", - "folderNamePlaceholder": "例如: 系统命令, Docker 脚本", - "folderColorLabel": "文件夹颜色", - "folderIconLabel": "文件夹图标", - "previewLabel": "预览", - "folderNameFallback": "文件夹名称", - "createFolderButton": "创建文件夹", - "targetTerminals": "Target Terminals", - "selectAll": "所有的", - "selectNone": "无", - "noTerminalTabsOpen": "未打开终端标签", - "searchPlaceholder": "搜索代码片段...", - "newSnippet": "新片段", - "newFolder": "新建文件夹", - "run": "运行", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", + "targetTerminals": "目标终端", + "selectAll": "All", + "selectNone": "没有任何", + "noTerminalTabsOpen": "No terminal tabs open", + "searchPlaceholder": "搜索摘要……", + "newSnippet": "新代码片段", + "newFolder": "New Folder", + "run": "跑步", "noSnippetsInFolder": "此文件夹中没有代码片段", - "uncategorized": "未分类", - "editSnippetTitle": "编辑代码片段", - "editSnippetDescription": "更新此命令片段", - "saveSnippetButton": "保存更改", - "createSuccess": "代码片段创建成功", - "createFailed": "创建代码片段失败", - "updateSuccess": "代码片段更新成功", - "updateFailed": "更新代码片段失败", - "deleteFailed": "删除代码片段失败", - "folderCreateSuccess": "文件夹创建成功", - "folderCreateFailed": "创建文件夹失败", - "editFolderTitle": "编辑文件夹", - "editFolderDescription": "重命名或更改此文件夹的外观", - "saveFolderButton": "保存更改", - "editFolder": "编辑文件夹", - "deleteFolder": "删除文件夹", - "folderDeleteSuccess": "文件夹“{{name}}”已删除", - "folderDeleteFailed": "删除文件夹失败", - "folderEditSuccess": "文件夹更新成功", - "folderEditFailed": "更新文件夹失败", - "confirmRunMessage": "运行“{{name}}”?", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", + "editSnippetDescription": "Update this command snippet", + "saveSnippetButton": "Save Changes", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", + "editFolderDescription": "Rename or change the appearance of this folder", + "saveFolderButton": "Save Changes", + "editFolder": "Edit folder", + "deleteFolder": "Delete folder", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", "confirmRunButton": "跑步", - "runSuccess": "在 {{count}} 终端中运行“{{name}}”", - "copySuccess": "已将“{{name}}”复制到剪贴板", - "shareTitle": "共享代码片段", - "shareUser": "用户", - "shareRole": "作用", - "selectUser": "选择一个用户...", - "selectRole": "选择角色...", - "shareSuccess": "代码片段共享成功", - "shareFailed": "共享代码片段失败", - "revokeSuccess": "访问已取消", - "revokeFailed": "吊销访问失败", - "currentAccess": "当前访问", - "shareLoadError": "加载共享数据失败", - "loading": "加载中...", - "close": "关闭", - "reorderFailed": "保存代码片段顺序失败" + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", + "shareTitle": "Share Snippet", + "shareUser": "User", + "shareRole": "Role", + "selectUser": "Select a user...", + "selectRole": "Select a role...", + "shareSuccess": "Snippet shared successfully", + "shareFailed": "Failed to share snippet", + "revokeSuccess": "Access revoked", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", + "shareLoadError": "Failed to load share data", + "loading": "Loading...", + "close": "Close", + "reorderFailed": "保存代码片段顺序失败", + "importExport": "Import / Export", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "No hosts configured", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "账户", - "sectionAppearance": "外观", - "sectionSecurity": "安全", - "sectionApiKeys": "API 密钥", - "sectionC2sTunnels": "C2S Tunnels", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", + "sectionApiKeys": "API Keys", + "sectionC2sTunnels": "C2S隧道", "usernameLabel": "用户名", - "roleLabel": "作用", - "roleAdministrator": "管理员", - "authMethodLabel": "认证方法", - "authMethodLocal": "本地的", - "twoFaLabel": "两步验证", - "twoFaOn": "开启", - "twoFaOff": "关闭", - "versionLabel": "版本", - "deleteAccount": "删除帐户", - "deleteAccountDescription": "永久删除您的帐户", - "deleteButton": "删除", - "deleteAccountPermanent": "此操作是永久性的,无法撤销。", - "deleteAccountWarning": "所有会话、主机、 凭据和设置将被永久删除。", - "confirmPasswordDeletePlaceholder": "输入您的密码以确认", - "languageLabel": "语言", - "themeLabel": "主题", - "fontSizeLabel": "Font Size", - "accentColorLabel": "亮度颜色", - "settingsTerminal": "终端", + "roleLabel": "Role", + "roleAdministrator": "Administrator", + "authMethodLabel": "Auth Method", + "authMethodLocal": "当地的", + "twoFaLabel": "2FA", + "twoFaOn": "On", + "twoFaOff": "Off", + "versionLabel": "Version", + "deleteAccount": "Delete Account", + "deleteAccountDescription": "Permanently delete your account", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", + "deleteAccountPermanent": "This action is permanent and cannot be undone.", + "deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "字体大小", + "accentColorLabel": "Accent Color", + "settingsTerminal": "Terminal", "commandAutocomplete": "命令自动完成", - "commandAutocompleteDesc": "输入时显示自动完成", - "historyTracking": "历史跟踪", - "historyTrackingDesc": "跟踪终端命令", - "syntaxHighlighting": "语法加亮", - "syntaxHighlightingDesc": "高亮终端输出", - "commandPalette": "命令调色板", - "commandPaletteDesc": "启用键盘快捷键", + "commandAutocompleteDesc": "输入时显示自动完成功能", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", + "historyTracking": "History Tracking", + "historyTrackingDesc": "Track terminal commands", + "commandPalette": "命令面板", + "commandPaletteDesc": "Enable keyboard shortcut", "reopenTabsOnLogin": "登录后重新打开标签页", "reopenTabsOnLoginDesc": "即使从其他设备登录或刷新页面,也能恢复您打开的标签页。", - "confirmTabClose": "确认关闭标签", - "confirmTabCloseDesc": "关闭终端标签前询问", + "confirmTabClose": "Confirm Tab Close", + "confirmTabCloseDesc": "Ask before closing terminal tabs", "settingsSidebar": "Sidebar", - "showHostTags": "显示主机标签", - "showHostTagsDesc": "在主机列表中显示标签", + "showHostTags": "Show Host Tags", + "showHostTagsDesc": "Display tags in host list", "hostTrayOnClick": "点击展开主机操作", "hostTrayOnClickDesc": "始终显示连接按钮;点击展开管理选项,而不是悬停。", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "保持左侧边栏应用导轨始终展开,而不是鼠标悬停时才展开。", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", "settingsSnippets": "片段", - "foldersCollapsed": "折叠文件夹", - "foldersCollapsedDesc": "默认折叠文件夹", - "confirmExecution": "确认执行", - "confirmExecutionDesc": "在运行代码片段前确认", - "settingsUpdates": "更新", - "disableUpdateChecks": "禁用更新检查", - "disableUpdateChecksDesc": "停止检查更新", - "totpAuthenticator": "TOTP 身份验证器", - "totpEnabled": "2FA 已启用", - "totpDisabled": "添加额外的登录安全", - "disable": "禁用", - "enable": "启用", + "foldersCollapsed": "Folders Collapsed", + "foldersCollapsedDesc": "Collapse folders by default", + "confirmExecution": "Confirm Execution", + "confirmExecutionDesc": "Confirm before running snippets", + "settingsUpdates": "Updates", + "disableUpdateChecks": "Disable Update Checks", + "disableUpdateChecksDesc": "Stop checking for updates", + "totpAuthenticator": "TOTP Authenticator", + "totpEnabled": "2FA is enabled", + "totpDisabled": "Add extra login security", + "disable": "Disable", + "enable": "Enable", "setupTotp": "Setup TOTP", "qrCode": "QR Code", - "totpInstructions": "扫描二维码或在您的身份验证程序中输入秘密,然后输入6位数字", + "totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code", "totpCodePlaceholder": "000000", - "verify": "验证", - "changePassword": "更改密码", - "currentPasswordLabel": "当前密码", - "currentPasswordPlaceholder": "当前密码", - "newPasswordLabel": "新密码", - "newPasswordPlaceholder": "新密码", - "confirmPasswordLabel": "确认新密码", - "confirmPasswordPlaceholder": "确认新密码", - "updatePassword": "更新密码", - "createApiKeyTitle": "创建 API 密钥", - "createApiKeyDescription": "生成一个新的 API 密钥用于程序访问。", - "apiKeyNameLabel": "名称", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", + "currentPasswordPlaceholder": "Current password", + "newPasswordLabel": "New Password", + "newPasswordPlaceholder": "New password", + "confirmPasswordLabel": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "updatePassword": "Update Password", + "createApiKeyTitle": "Create API Key", + "createApiKeyDescription": "Generate a new API key for programmatic access.", + "apiKeyNameLabel": "姓名", "apiKeyNamePlaceholder": "e.g. CI Pipeline", "expiryDateLabel": "Expiry Date", - "optional": "可选的", + "optional": "optional", "cancel": "取消", - "createKey": "创建密钥", - "apiKeyCount": "{{count}} 键", - "newKey": "新建密钥", - "noApiKeys": "暂无API密钥。", - "apiKeyActive": "已启用", - "apiKeyUsageHint": "包括您的密钥在", - "apiKeyUsageHintHeader": "标题。", - "apiKeyPermissionsHint": "密钥继承创建用户的权限。", - "roleUser": "用户", - "authMethodDual": "双重认证", + "createKey": "Create Key", + "apiKeyCount": "{{count}} keys", + "newKey": "New Key", + "noApiKeys": "No API keys yet.", + "apiKeyActive": "Active", + "apiKeyUsageHint": "Include your key in the", + "apiKeyUsageHintHeader": "header.", + "apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "启动TOTP 设置失败", - "totpEnter6Digits": "输入一个6位数字代码", - "totpEnabledSuccess": "两步验证已启用", - "totpInvalidCode": "无效的代码,请重试", - "totpDisableInputRequired": "输入您的 TOTP 代码或密码", - "totpDisabledSuccess": "两步验证已禁用", - "totpDisableFailed": "禁用两步验证失败", - "totpDisableTitle": "禁用两步验证", - "totpDisablePlaceholder": "输入TOTP 代码或密码", - "totpDisableConfirm": "禁用两步验证", - "totpContinueVerify": "继续验证", - "totpVerifyTitle": "验证代码", - "totpBackupTitle": "备份代码", - "totpDownloadBackup": "下载备份代码", - "done": "完成", - "secretCopied": "机密已复制到剪贴板", - "apiKeyNameRequired": "密钥名称是必需的", - "apiKeyCreated": "API 密钥“{{name}}”已创建", - "apiKeyCreateFailed": "创建 API 密钥失败", - "apiKeyUser": "用户", - "apiKeyExpires": "过期时间", - "apiKeyRevoked": "API密钥“{{name}}”已撤销", - "apiKeyRevokeFailed": "吊销API密钥失败", - "passwordFieldsRequired": "需要当前密码和新密码", - "passwordMismatch": "密码不匹配", - "passwordTooShort": "密码必须至少 6 个字符", - "passwordUpdated": "密码更新成功", - "passwordUpdateFailed": "更新密码失败", - "deletePasswordRequired": "需要密码才能删除您的帐户", - "deleteFailed": "删除帐户失败", - "deleting": "正在删除...", - "colorPickerTooltip": "打开颜色选择器", - "themeSystem": "系统", - "themeLight": "亮色的", - "themeDark": "深色", - "themeDracula": "德拉库拉", + "totpSetupFailed": "Failed to start TOTP setup", + "totpEnter6Digits": "Enter a 6-digit code", + "totpEnabledSuccess": "Two-factor authentication enabled", + "totpInvalidCode": "Invalid code, please try again", + "totpDisableInputRequired": "Enter your TOTP code or password", + "totpDisabledSuccess": "Two-factor authentication disabled", + "totpDisableFailed": "Failed to disable 2FA", + "totpDisableTitle": "Disable 2FA", + "totpDisablePlaceholder": "Enter TOTP code or password", + "totpDisableConfirm": "Disable 2FA", + "totpContinueVerify": "Continue to Verify", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", + "totpDownloadBackup": "Download Backup Codes", + "done": "Done", + "secretCopied": "Secret copied to clipboard", + "apiKeyNameRequired": "Key name is required", + "apiKeyCreated": "API key \"{{name}}\" created", + "apiKeyCreateFailed": "Failed to create API key", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", + "apiKeyRevokeFailed": "Failed to revoke API key", + "passwordFieldsRequired": "Current and new passwords are required", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", + "passwordUpdated": "Password updated successfully", + "passwordUpdateFailed": "Failed to update password", + "deletePasswordRequired": "Password is required to delete your account", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", + "colorPickerTooltip": "Open color picker", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", + "themeDracula": "Dracula", "themeCatppuccin": "Catppuccin", "themeNord": "Nord", - "themeSolarized": "已解决的", + "themeSolarized": "Solarized", "themeTokyoNight": "Tokyo Night", - "themeOneDark": "一个深色", + "themeOneDark": "One Dark", "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "标签", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "重试", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "just now", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "Tab", + "backTab": "⇥", + "arrowUp": "Arrow Up", + "arrowDown": "Arrow Down", + "arrowLeft": "Arrow Left", + "arrowRight": "Arrow Right", + "home": "Home", + "end": "End", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "Done" } } diff --git a/src/ui/locales/translated/zh_TW.json b/src/ui/locales/translated/zh_TW.json index d269a26d..12c31a39 100644 --- a/src/ui/locales/translated/zh_TW.json +++ b/src/ui/locales/translated/zh_TW.json @@ -1,270 +1,301 @@ { "credentials": { - "folders": "資料夾", - "folder": "資料夾", - "password": "密碼", - "key": "金鑰", - "sshPrivateKey": "SSH 私鑰", - "upload": "上傳", - "keyPassword": "密鑰密碼", - "sshKey": "SSH 金鑰", - "uploadPrivateKeyFile": "上傳私鑰檔案", - "searchCredentials": "搜尋憑證...", - "addCredential": "新增憑證", + "folders": "Folders", + "folder": "Folder", + "password": "Password", + "key": "Key", + "sshPrivateKey": "SSH Private Key", + "upload": "Upload", + "keyPassword": "Key Password", + "sshKey": "SSH Key", + "uploadPrivateKeyFile": "Upload Private Key File", + "searchCredentials": "Search credentials...", + "addCredential": "Add Credential", "caCertificate": "CA 憑證(-cert.pub)", "caCertificateDescription": "可選:上傳或貼上 CA 簽署的憑證檔案(例如 id_ed25519-cert.pub)。如果您的 SSH 伺服器使用基於憑證的授權,則此步驟為必要。", "uploadCertFile": "上傳 -cert.pub 文件", - "clearCert": "清除", + "clearCert": "Clear", "certLoaded": "證書已載入", "certPublicKeyLabel": "CA憑證", "certTypeLabel": "證書類型", "pasteOrUploadCert": "貼上或上傳 -cert.pub 憑證...", "hasCaCert": "擁有CA證書", - "noCaCert": "無加州證書" + "noCaCert": "無加州證書", + "noPublicKeyAvailable": "No public key available. Open the credential editor first.", + "deployCommandCopied": "Deploy command copied", + "sortCredentials": "Sort Credentials", + "sortDefault": "預設訂單", + "sortNameAsc": "姓名(A → Z)", + "sortNameDesc": "姓名(Z → A)", + "sortUsernameAsc": "Username (A → Z)", + "sortUsernameDesc": "Username (Z → A)", + "filterCredentials": "Filter Credentials", + "filterClearAll": "清除篩選條件", + "filterTypeGroup": "Type", + "filterTypePassword": "Password", + "filterTypeKey": "SSH Key", + "filterTagsGroup": "Tags" }, "homepage": { - "failedToLoadAlerts": "警示載入失敗", - "failedToDismissAlert": "未能關閉警示" + "failedToLoadAlerts": "Failed to load alerts", + "failedToDismissAlert": "Failed to dismiss alert" }, "serverConfig": { - "title": "伺服器配置", - "description": "設定 Termix 伺服器 URL 以連接到您的後端服務", - "serverUrl": "伺服器 URL", - "enterServerUrl": "請輸入伺服器網址", - "saveFailed": "配置儲存失敗", - "saveError": "儲存配置時發生錯誤", - "saving": "儲存...", - "saveConfig": "儲存配置", - "helpText": "輸入您的 Termix 伺服器運作所在的 URL(例如,http://localhost:30001 或 https://your-server.com)", - "changeServer": "變更伺服器", - "mustIncludeProtocol": "伺服器 URL 必須以 http:// 或 https:// 開頭。", + "title": "Server Configuration", + "description": "Configure the Termix server URL to connect to your backend services", + "serverUrl": "Server URL", + "enterServerUrl": "Please enter a server URL", + "saveFailed": "Failed to save configuration", + "saveError": "Error saving configuration", + "saving": "Saving...", + "saveConfig": "Save Configuration", + "helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)", + "changeServer": "Change Server", + "mustIncludeProtocol": "Server URL must start with http:// or https://", "allowInvalidCertificate": "允許無效證書", "allowInvalidCertificateDesc": "僅適用於具有自簽名憑證或 IP 位址憑證的受信任的自託管伺服器。", - "useEmbedded": "使用本地伺服器", - "embeddedDesc": "使用內建的本機伺服器運行Termix(無需遠端伺服器)", - "embeddedConnecting": "正在連接本地伺服器...", - "embeddedNotReady": "本地伺服器尚未準備就緒,請稍等片刻後再試。", - "localServer": "本地伺服器" + "useEmbedded": "Use Local Server", + "embeddedDesc": "Run Termix with the built-in local server (no remote server needed)", + "embeddedConnecting": "Connecting to local server...", + "embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.", + "localServer": "本地伺服器", + "savedServers": "Saved Servers", + "noSavedServers": "No saved servers", + "removeServer": "Remove" }, "versionCheck": { - "error": "版本檢查錯誤", - "checkFailed": "檢查更新失敗", - "upToDate": "應用程式已更新至最新版本", - "currentVersion": "您正在執行版本 {{version}}", - "updateAvailable": "更新可用", - "newVersionAvailable": "新版本可用!您正在執行 {{current}},但 {{latest}} 可用。", + "error": "Version Check Error", + "checkFailed": "Failed to check for updates", + "upToDate": "App is Up to Date", + "currentVersion": "You are running version {{version}}", + "updateAvailable": "Update Available", + "newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.", "betaVersion": "測試版", - "betaVersionDesc": "您正在運行 {{current}},它比最新的穩定版本 {{latest}} 更新。", - "releasedOn": "發佈日期: {{date}}", - "downloadUpdate": "下載更新", - "checking": "正在檢查更新...", - "checkUpdates": "檢查更新", - "checkingUpdates": "正在檢查更新...", - "updateRequired": "需要更新" + "betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.", + "releasedOn": "Released on {{date}}", + "downloadUpdate": "Download Update", + "checking": "Checking for updates...", + "checkUpdates": "Check for Updates", + "checkingUpdates": "Checking for updates...", + "updateRequired": "Update Required" }, "common": { - "close": "關閉", - "minimize": "最小化", - "online": "在線的", - "offline": "離線", - "continue": "繼續", - "maintenance": "維護", - "degraded": "降級", - "error": "錯誤", - "warning": "警告", - "unsavedChanges": "未儲存的更改", - "dismiss": "解僱", - "loading": "載入中...", - "optional": "選擇性", - "connect": "連接", - "copied": "已複製", - "connecting": "正在連接...", - "updateAvailable": "更新可用", + "close": "Close", + "minimize": "Minimize", + "online": "Online", + "offline": "Offline", + "continue": "Continue", + "maintenance": "Maintenance", + "degraded": "Degraded", + "error": "Error", + "warning": "Warning", + "unsavedChanges": "Unsaved changes", + "dismiss": "Dismiss", + "loading": "Loading...", + "optional": "Optional", + "connect": "Connect", + "copied": "Copied", + "connecting": "Connecting...", + "updateAvailable": "Update Available", "appName": "Termix", - "openInNewTab": "在新分頁中開啟", - "noReleases": "無發布", - "updatesAndReleases": "更新與發布", - "newVersionAvailable": "新版本({{version}})可用。", - "failedToFetchUpdateInfo": "取得更新資訊失敗", - "preRelease": "預發布", - "noReleasesFound": "未找到任何版本。", - "cancel": "取消", - "username": "使用者名稱", - "login": "登入", - "register": "登記", - "password": "密碼", - "confirmPassword": "確認密碼", - "back": "後退", - "save": "儲存", - "saving": "儲存...", - "delete": "刪除", - "rename": "重新命名", - "edit": "編輯", - "add": "添加", - "confirm": "確認", - "no": "不", - "or": "或者", - "next": "下一個", - "previous": "以前的", - "refresh": "重新整理", - "language": "語言", - "checking": "檢查...", - "checkingDatabase": "正在檢查資料庫連線...", - "checkingAuthentication": "正在檢查身份驗證...", - "backendReconnected": "伺服器連線已恢復", - "connectionDegraded": "伺服器連線遺失,正在恢復…", - "reload": "重新載入", - "remove": "消除", - "create": "建立", - "update": "更新", - "copy": "複製", - "copyFailed": "複製到剪貼簿失敗", + "openInNewTab": "Open in New Tab", + "noReleases": "No Releases", + "updatesAndReleases": "Updates & Releases", + "newVersionAvailable": "A new version ({{version}}) is available.", + "failedToFetchUpdateInfo": "Failed to fetch update information", + "preRelease": "Pre-release", + "noReleasesFound": "No releases found.", + "cancel": "Cancel", + "username": "Username", + "login": "Login", + "logout": "Logout", + "register": "Register", + "password": "Password", + "confirmPassword": "Confirm Password", + "back": "Back", + "save": "Save", + "saving": "Saving...", + "delete": "Delete", + "rename": "Rename", + "edit": "Edit", + "add": "Add", + "confirm": "Confirm", + "no": "No", + "or": "OR", + "next": "Next", + "previous": "Previous", + "refresh": "Refresh", + "language": "Language", + "checking": "Checking...", + "checkingDatabase": "Checking database connection...", + "checkingAuthentication": "Checking authentication...", + "backendReconnected": "Server connection restored", + "connectionDegraded": "Server connection lost, recovering…", + "reload": "Reload", + "remove": "Remove", + "create": "Create", + "update": "Update", + "copy": "Copy", + "copyFailed": "Failed to copy to clipboard", "maximize": "最大化", "restore": "恢復", - "of": "的" + "of": "of", + "saved": "Saved", + "deleted": "Deleted", + "deleteFailed": "Failed to delete", + "saveFailed": "Failed to save", + "required": "Required" }, "nav": { - "home": "家", - "terminal": "終端機", + "home": "Home", + "terminal": "Terminal", "docker": "Docker", - "tunnels": "隧道", - "fileManager": "檔案管理器", - "serverStats": "伺服器統計訊息", - "admin": "管理員", - "userProfile": "用戶個人資料", - "splitScreen": "分割畫面", + "tunnels": "Tunnels", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", + "admin": "Admin", + "userProfile": "User Profile", + "splitScreen": "Split Screen", "confirmClose": "關閉此會話?", - "close": "關閉", - "cancel": "取消", - "sshManager": "SSH 管理器", - "cannotSplitTab": "無法拆分此標籤頁", + "close": "Close", + "cancel": "Cancel", + "sshManager": "SSH Manager", + "cannotSplitTab": "Cannot split this tab", "hostTabTitle": "{{username}}@{{ip}}:{{port}}", - "copyPassword": "複製密碼", - "copySudoPassword": "複製 sudo 密碼", - "passwordCopied": "密碼已複製到剪貼簿", - "noPasswordAvailable": "沒有可用密碼", + "copyPassword": "Copy Password", + "copySudoPassword": "Copy Sudo Password", + "passwordCopied": "Password copied to clipboard", + "noPasswordAvailable": "No password available", "failedToCopyPassword": "複製密碼失敗", "refreshTab": "刷新連接", - "openFileManager": "開啟文件管理器", - "dashboard": "儀表板", - "networkGraph": "網路圖", - "quickConnect": "快速連接", - "sshTools": "SSH 工具", - "history": "歷史", - "hosts": "主持人", - "snippets": "片段", - "hostManager": "主機管理器", - "credentials": "證書", - "connections": "連接", - "roleAdministrator": "行政人員", - "roleUser": "使用者" + "renameTab": "Rename tab", + "openFileManager": "Open File Manager", + "dashboard": "Dashboard", + "networkGraph": "Network Graph", + "tmuxMonitor": "Tmux Monitor", + "quickConnect": "Quick Connect", + "sshTools": "SSH Tools", + "history": "History", + "sessionLogs": "Session Logs", + "hosts": "Hosts", + "snippets": "Snippets", + "hostManager": "Host Manager", + "credentials": "Credentials", + "connections": "Connections", + "roleAdministrator": "Administrator", + "roleUser": "User" }, "hosts": { - "hosts": "主持人", - "noHosts": "無 SSH 主機", - "retry": "重試", - "refresh": "重新整理", - "optional": "選擇性", - "downloadSample": "下載範例", - "failedToDeleteHost": "刪除失敗 {{name}}", - "importSkipExisting": "導入(跳過現有)", - "connectionDetails": "連線詳情", + "hosts": "Hosts", + "noHosts": "No SSH Hosts", + "retry": "Retry", + "refresh": "Refresh", + "optional": "Optional", + "downloadSample": "Download Sample", + "failedToDeleteHost": "Failed to delete {{name}}", + "importSkipExisting": "Import (skip existing)", + "importSSHConfig": "Import from SSH config", + "connectionDetails": "Connection Details", "ssh": "SSH", "telnet": "Telnet", - "remoteDesktop": "遠端桌面", - "port": "連接埠", - "username": "使用者名稱", - "folder": "資料夾", - "tags": "標籤", - "pin": "置頂", - "addHost": "新增主機", - "editHost": "編輯主機", - "cloneHost": "複製主機", - "enableTerminal": "啟用終端機", - "enableTunnel": "啟用隧道", - "enableFileManager": "啟用檔案管理器", - "enableDocker": "啟用 Docker", - "defaultPath": "預設路徑", - "connection": "聯繫", - "upload": "上傳", - "authentication": "驗證", - "password": "密碼", - "key": "金鑰", - "credential": "憑證", - "none": "沒有", - "sshPrivateKey": "SSH 私鑰", - "keyType": "金鑰類型", - "uploadFile": "上傳檔案", - "tabGeneral": "一般的", + "remoteDesktop": "Remote Desktop", + "port": "Port", + "username": "Username", + "folder": "Folder", + "tags": "Tags", + "pin": "Pin", + "addHost": "Add Host", + "editHost": "Edit Host", + "cloneHost": "Clone Host", + "enableTerminal": "Enable Terminal", + "enableTunnel": "Enable Tunnel", + "enableFileManager": "Enable File Manager", + "enableDocker": "Enable Docker", + "defaultPath": "Default Path", + "connection": "Connection", + "upload": "Upload", + "authentication": "Authentication", + "password": "Password", + "key": "Key", + "credential": "Credential", + "none": "None", + "sshPrivateKey": "SSH Private Key", + "keyType": "Key Type", + "uploadFile": "Upload File", + "tabGeneral": "General", "tabSsh": "SSH", + "tabTerminal": "Terminal", "tabRdp": "RDP", "tabVnc": "VNC", - "tabTunnels": "隧道", + "tabTunnels": "Tunnels", "tabDocker": "Docker", "tabFiles": "文件", - "tabStats": "統計數據", + "tabStats": "Host Metrics", + "tabHostMetrics": "Host Metrics", "tabTelnet": "Telnet", - "tabSharing": "分享", - "tabAuthentication": "驗證", - "terminal": "終端機", - "tunnel": "隧道", - "fileManager": "檔案管理器", - "serverStats": "伺服器統計訊息", - "status": "地位", - "folderRenamed": "資料夾「{{oldName}}」已成功重新命名為「{{newName}}」。", - "failedToRenameFolder": "重新命名資料夾失敗", - "movedToFolder": "已移至“{{folder}}”", - "editHostTooltip": "編輯主機", - "statusChecks": "狀態檢查", - "metricsCollection": "指標收集", - "metricsInterval": "指標收集間隔", - "metricsIntervalDesc": "伺服器統計資訊收集頻率(5秒-1小時)", - "behavior": "行為", - "themePreview": "主題預覽", - "theme": "主題", - "fontFamily": "字體系列", - "fontSize": "字體大小", - "letterSpacing": "字母間距", - "lineHeight": "行高", - "cursorStyle": "游標樣式", - "cursorBlink": "游標閃爍", - "scrollbackBuffer": "回滾緩衝區", - "bellStyle": "響聲樣式", - "rightClickSelectsWord": "右鍵選擇 Word", - "fastScrollModifier": "快速滾動特殊鍵", - "fastScrollSensitivity": "快速滾動靈敏度", - "sshAgentForwarding": "SSH 代理轉發", - "backspaceMode": "後退鍵模式", - "startupSnippet": "啟動片段", - "selectSnippet": "選擇片段", - "forceKeyboardInteractive": "強制鍵盤交互", - "overrideCredentialUsername": "覆蓋憑證使用者名稱", + "tabSharing": "Sharing", + "tabAuthentication": "Authentication", + "terminal": "Terminal", + "tunnel": "Tunnel", + "fileManager": "File Manager", + "serverStats": "Host Metrics", + "status": "Status", + "folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully", + "failedToRenameFolder": "Failed to rename folder", + "movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"", + "editHostTooltip": "Edit host", + "statusChecks": "Status Checks", + "metricsCollection": "Metrics Collection", + "metricsInterval": "Metrics Collection Interval", + "metricsIntervalDesc": "How often to collect server statistics (5s - 1h)", + "behavior": "Behavior", + "themePreview": "Theme Preview", + "theme": "Theme", + "fontFamily": "Font Family", + "fontSize": "Font Size", + "letterSpacing": "Letter Spacing", + "lineHeight": "Line Height", + "cursorStyle": "Cursor Style", + "cursorBlink": "Cursor Blink", + "scrollbackBuffer": "Scrollback Buffer", + "bellStyle": "Bell Style", + "rightClickSelectsWord": "Right Click Selects Word", + "fastScrollModifier": "Fast Scroll Modifier", + "fastScrollSensitivity": "Fast Scroll Sensitivity", + "sshAgentForwarding": "SSH Agent Forwarding", + "backspaceMode": "Backspace Mode", + "startupSnippet": "Startup Snippet", + "selectSnippet": "Select snippet", + "forceKeyboardInteractive": "Force Keyboard-Interactive", + "overrideCredentialUsername": "Override Credential Username", "overrideCredentialUsernameDesc": "請使用上面指定的用戶名,而不是憑證中的用戶名。", - "jumpHostChain": "跳轉宿主鏈", + "oidcUsernameHint": "Use $oidc.preferred_username to substitute your OIDC login name.", + "jumpHostChain": "Jump Host Chain", "portKnocking": "敲擊", "addKnock": "新增連接埠", "addProxyNode": "新增節點", - "proxyNode": "代理節點", - "proxyType": "代理類型", - "quickActions": "快速操作", - "sudoPasswordAutoFill": "Sudo 密碼自動填充", - "sudoPassword": "Sudo 密碼", - "keepaliveInterval": "保持連線間隔(毫秒)", - "moshCommand": "MOSH 指令", - "environmentVariables": "環境變數", - "addVariable": "新增變數", + "proxyNode": "Proxy Node", + "proxyType": "Proxy Type", + "quickActions": "Quick Actions", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPassword": "Sudo Password", + "keepaliveInterval": "Keepalive Interval (ms)", + "moshCommand": "MOSH Command", + "environmentVariables": "Environment Variables", + "addVariable": "Add Variable", "docker": "Docker", - "copyTerminalUrl": "複製終端機 URL", - "copyFileManagerUrl": "複製檔案管理器 URL", - "copyRemoteDesktopUrl": "複製遠端桌面 URL", - "failedToConnect": "連線控制台失敗", - "connect": "連接", - "disconnect": "斷開", - "start": "開始", - "enableStatusCheck": "啟用狀態檢查", - "enableMetrics": "啟用指標", - "bulkUpdateFailed": "批量更新失敗", - "selectAll": "全選", + "copyTerminalUrl": "Copy Terminal URL", + "copyFileManagerUrl": "Copy File Manager URL", + "copyRemoteDesktopUrl": "Copy Remote Desktop URL", + "failedToConnect": "Failed to connect to console", + "connect": "Connect", + "disconnect": "Disconnect", + "start": "Start", + "enableStatusCheck": "Enable Status Check", + "enableMetrics": "Enable Metrics", + "bulkUpdateFailed": "Bulk update failed", + "selectAll": "Select All", "deselectAll": "取消選擇所有", "protocols": "協定", "secureShell": "安全外殼", @@ -272,6 +303,9 @@ "unencryptedShell": "未加密外殼", "addressIp": "位址/IP", "friendlyName": "友善名稱", + "macAddress": "MAC Address", + "wolBroadcastAddress": "WoL Broadcast Address", + "wolBroadcastAddressDesc": "Optional directed broadcast for Docker/routed networks (e.g. 192.168.1.255). Leave empty to use 255.255.255.255.", "folderAndAdvanced": "資料夾和進階功能", "privateNotes": "私人筆記", "privateNotesPlaceholder": "關於此伺服器的詳細資訊…", @@ -281,18 +315,18 @@ "addKnockBtn": "新增敲擊", "noPortKnocking": "未配置連接埠敲門。", "knockPort": "敲擊港", - "protocol": "協定", + "protocol": "Protocol", "delayAfterMs": "延遲時間(毫秒)", "useSocks5Proxy": "使用 SOCKS5 代理", "useSocks5ProxyDesc": "透過代理伺服器路由連接", - "proxyHost": "代理主機", - "proxyPort": "代理端口", - "proxyUsername": "代理用戶名", - "proxyPassword": "代理密碼", + "proxyHost": "Proxy Host", + "proxyPort": "Proxy Port", + "proxyUsername": "Proxy Username", + "proxyPassword": "Proxy Password", "proxySingleMode": "單代理", - "proxyChainMode": "代理鏈", + "proxyChainMode": "Proxy Chain", "you": "你", - "jumpHostChainLabel": "跳轉宿主鏈", + "jumpHostChainLabel": "Jump Host Chain", "addJumpBtn": "添加跳轉", "noJumpHosts": "未配置跳轉主機。", "selectAServer": "選擇伺服器...", @@ -300,10 +334,10 @@ "authMethod": "身份驗證方法", "storedCredential": "已儲存憑證", "selectACredential": "選擇憑證...", - "keyTypeLabel": "關鍵類型", - "keyTypeAuto": "自動偵測", - "keyPasteTab": "貼上", - "keyUploadTab": "上傳", + "keyTypeLabel": "Key Type", + "keyTypeAuto": "Auto Detect", + "keyPasteTab": "Paste", + "keyUploadTab": "Upload", "keyFileLoaded": "密鑰檔案已加載", "keyUploadClick": "點選上傳 .pem / .key / .ppk 文件", "clearKey": "清除密鑰", @@ -311,59 +345,105 @@ "keyReplaceNotice": "請在下方貼上新密鑰以替換它", "keyPassphraseSaved": "密碼已儲存,輸入即可更改", "replaceKey": "更換鑰匙", + "docsLink": "View docs", + "opksshLabel": "OPKSSH", + "opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.", + "warpgateLabel": "Warpgate Gateway", + "warpgateDesc": "This host connects through a Warpgate SSH proxy. Termix will handle the browser-based approval flow automatically after authenticating.", + "tailscaleDeviceSelect": "Select Tailscale device", + "tailscaleDeviceSelectPlaceholder": "Select a device...", + "tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.", + "tailscaleDocsLink": "View docs", + "tailscaleLoadingDevices": "Loading devices...", + "tailscaleNoDevices": "No devices found in your tailnet.", + "tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.", "forceKeyboardInteractiveLabel": "強制鍵盤交互", "forceKeyboardInteractiveShortDesc": "即使鑰匙在手,也強製手動輸入密碼。", + "allowLegacyAlgorithmsLabel": "Allow Legacy Algorithms", + "allowLegacyAlgorithmsDesc": "Enable deprecated SSH algorithms (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) for connections to old devices that cannot be upgraded.", + "insecure": "Insecure", "terminalAppearance": "終端外觀", "colorTheme": "顏色主題", - "fontFamilyLabel": "字體系列", - "fontSizeLabel": "字體大小", - "cursorStyleLabel": "遊標樣式", + "fontFamilyLabel": "Font Family", + "fontSizeLabel": "Font Size", + "cursorStyleLabel": "Cursor Style", "letterSpacingPx": "字母間距(像素)", - "lineHeightLabel": "行高", - "bellStyleLabel": "貝爾風格", - "backspaceModeLabel": "退格模式", + "lineHeightLabel": "Line Height", + "bellStyleLabel": "Bell Style", + "backspaceModeLabel": "Backspace Mode", "cursorBlinking": "遊標閃爍", "cursorBlinkingDesc": "啟用終端遊標閃爍動畫", "rightClickSelectsWordLabel": "右鍵選擇 Word", "rightClickSelectsWordShortDesc": "右鍵單擊,選擇遊標下的單字。", + "backgroundImageLabel": "Background Image URL", + "backgroundImageDesc": "Optional URL for a terminal background image", + "backgroundImageOpacityLabel": "Background Image Opacity", + "syntaxHighlightingLabel": "語法高亮", + "syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)", + "syntaxHighlightingCategories": "Highlight Categories", + "syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize", + "syntaxCategoryLogLevels": "Log Levels", + "syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal", + "syntaxCategoryPaths": "File Paths", + "syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt", + "syntaxCategoryTimestamps": "時間戳", + "syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15", + "syntaxCategoryIpAddresses": "IP Addresses", + "syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080", + "syntaxCategoryUrls": "URLs", + "syntaxCategoryUrlsDesc": "https://example.com", + "syntaxCategoryNumbers": "Labeled Numbers", + "syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404", "behaviorAndAdvanced": "行為與高階", - "scrollbackBufferLabel": "回滾緩衝區", + "scrollbackBufferLabel": "Scrollback Buffer", "scrollbackMaxLines": "歷史記錄中保留的最大行數", - "sshAgentForwardingLabel": "SSH代理轉發", + "sshAgentForwardingLabel": "SSH Agent Forwarding", "sshAgentForwardingShortDesc": "將您的本機 SSH 金鑰傳遞給此主機", + "useSSHTitleLabel": "Use SSH Window Title", + "useSSHTitleDesc": "Update the tab title from the shell's window title instead of the host name", "enableAutoMosh": "啟用自動 Mosh", "enableAutoMoshDesc": "如果可用,優先選擇 Mosh 而不是 SSH。", "enableAutoTmux": "啟用自動 Tmux", "enableAutoTmuxDesc": "自動啟動或連線到 tmux 會話", + "enableSessionLogging": "Session Logging", + "enableSessionLoggingDesc": "Record terminal session output for later review", + "enableCommandHistory": "Command History", + "enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete", + "linkClickBehaviorLabel": "Link Click Behavior", + "linkClickBehaviorDesc": "Controls what happens when you click a link in the terminal. Use 'Default' to follow the app-level setting.", + "linkClickBehaviorDefault": "Default (follow app setting)", + "linkClickBehaviorConfirm": "Show popup to open or copy", + "linkClickBehaviorDirect": "Open directly", "sudoPasswordAutoFillLabel": "Sudo 密碼自動填充", "sudoPasswordAutoFillShortDesc": "提示時自動提供 sudo 密碼", - "sudoPasswordLabel": "Sudo 密碼", - "environmentVariablesLabel": "環境變數", - "addVariableBtn": "新增變數", + "sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.", + "sudoPasswordLabel": "Sudo Password", + "environmentVariablesLabel": "Environment Variables", + "addVariableBtn": "Add Variable", "noEnvVars": "未配置任何環境變數。", - "fastScrollModifierLabel": "快速滾動修飾符", - "fastScrollSensitivityLabel": "快速滾動靈敏度", + "fastScrollModifierLabel": "Fast Scroll Modifier", + "fastScrollSensitivityLabel": "Fast Scroll Sensitivity", "moshCommandLabel": "Mosh Command", - "startupSnippetLabel": "啟動片段", + "startupSnippetLabel": "Startup Snippet", "keepaliveIntervalLabel": "保持連線間隔(秒)", "maxKeepaliveMisses": "最大保命失誤", "tunnelSettings": "隧道設定", "enableTunneling": "啟用隧道", "enableTunnelingDesc": "為此主機啟用 SSH 隧道功能", "serverTunnelsSection": "伺服器隧道", - "addTunnelBtn": "添加隧道", + "addTunnelBtn": "Add Tunnel", "noTunnelsConfigured": "未配置隧道。", - "tunnelLabel": "隧道 {{number}}", - "tunnelType": "隧道類型", + "tunnelLabel": "Tunnel {{number}}", + "tunnelType": "Tunnel Type", "tunnelModeLocalDesc": "將本機連接埠轉送到遠端伺服器(或可從遠端伺服器存取的主機)上的連接埠。", "tunnelModeRemoteDesc": "將遠端伺服器上的連接埠轉送到您電腦上的本機連接埠。", "tunnelModeDynamicDesc": "在本機連接埠上建立 SOCKS5 代理,用於動態連接埠轉送。", "sameHost": "此主機(直接隧道)", "endpointHost": "端點主機", - "endpointPort": "端點埠", + "endpointPort": "Endpoint Port", "bindHost": "綁定主機", - "sourcePort": "來源連接埠", - "maxRetries": "最大重試次數", + "sourcePort": "Source Port", + "maxRetries": "Max Retries", "retryIntervalS": "重試間隔(秒)", "autoStartLabel": "自動啟動", "autoStartDesc": "主機載入完畢後自動連線此隧道", @@ -372,36 +452,79 @@ "failedToConnectTunnel": "連線失敗", "failedToDisconnectTunnel": "斷開連線失敗", "dockerIntegration": "Docker 集成", - "enableDockerMonitor": "啟用 Docker", + "enableDockerMonitor": "Enable Docker", "enableDockerMonitorDesc": "透過 Docker 監控和管理此主機上的容器", - "enableFileManagerMonitor": "啟用文件管理器", + "enableTmuxMonitor": "Enable Tmux Monitor", + "enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar", + "tabProxmox": "Proxmox", + "proxmoxIntegration": "Proxmox Integration", + "enableProxmox": "Enable Proxmox", + "enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.", + "proxmoxDefaultAuthType": "Default Auth Type", + "proxmoxDefaultAuthTypeDesc": "Authentication method applied to imported guest hosts. Choose the auth type that matches how you connect to your guests.", + "authTypePassword": "Password", + "authTypeKey": "SSH Key", + "authTypeCredential": "Credential", + "authTypeOpkssh": "OPKSSH", + "authTypeNone": "None", + "proxmoxDefaultCredential": "Default Credential", + "proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts when auth type is set to Credential.", + "proxmoxWindowsDetection": "Windows / RDP detection", + "proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)", + "proxmoxDockerDetection": "Docker detection", + "proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests", + "proxmoxPreferredRanges": "Preferred IP ranges", + "proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces", + "proxmoxDiscoverAction": "Discover & import Proxmox guests", + "proxmoxImportTitle": "Import from Proxmox", + "proxmoxSelectHost": "Select a Proxmox host…", + "proxmoxDiscover": "Discover", + "proxmoxDiscovering": "Discovering…", + "proxmoxDiscoverGuests": "Discover guests", + "proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected", + "proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected", + "proxmoxSelectAll": "Select all", + "proxmoxDeselectAll": "Deselect all", + "proxmoxNoGuests": "No guests found on this Proxmox node.", + "proxmoxImportButton_one": "Import {{count}} host", + "proxmoxImportButton_other": "Import {{count}} hosts", + "proxmoxResultImported": "{{count}} imported", + "proxmoxResultUpdated": "{{count}} updated", + "proxmoxResultFailed": "{{count}} failed", + "proxmoxImportComplete": "Proxmox import complete: {{summary}}", + "proxmoxDiscoveryFailed": "Discovery failed", + "proxmoxImportFailed": "Import failed", + "enableFileManagerMonitor": "Enable File Manager", "enableFileManagerMonitorDesc": "透過 SFTP 瀏覽和管理此主機上的文件", - "defaultPathLabel": "預設路徑", + "scpLegacyLabel": "SCP Legacy Mode", + "scpLegacyDesc": "Use legacy file transfer for servers that do not support the SFTP subsystem (e.g. embedded or minimal SSH servers).", + "defaultPathLabel": "Default Path", "fileManagerPathHint": "當此主機上的檔案管理器啟動時要開啟的目錄。", - "statusChecksLabel": "狀態檢查", + "statusChecksLabel": "Status Checks", "enableStatusChecks": "啟用狀態檢查", "enableStatusChecksDesc": "定期 ping 此主機以驗證其可用性", "useGlobalInterval": "使用全域間隔", "useGlobalIntervalDesc": "使用伺服器範圍的狀態檢查間隔進行覆蓋", "checkIntervalS": "檢查間隔(秒)", "checkIntervalDesc": "每次連接 ping 之間的秒數", - "metricsCollectionLabel": "指標收集", - "enableMetricsLabel": "啟用指標", + "metricsCollectionLabel": "Metrics Collection", + "enableMetricsLabel": "Enable Metrics", "enableMetricsDesc": "收集此主機的 CPU、記憶體、磁碟和網路使用情況", "useGlobalMetrics": "使用全域間隔", "useGlobalMetricsDesc": "使用伺服器範圍的指標間隔進行覆蓋", "metricsIntervalS": "指標間隔(秒)", "metricsIntervalDesc2": "指標快照之間的秒數", "visibleWidgets": "可見小部件", - "cpuUsageLabel": "CPU 使用率", + "widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.", + "cpuUsageLabel": "CPU Usage", "cpuUsageDesc": "CPU 使用率、平均負載、迷你圖", - "memoryLabel": "記憶體使用情況", + "memoryLabel": "Memory Usage", "memoryDesc": "記憶體使用情況、交換空間、緩存", - "storageLabel": "磁碟使用情況", + "storageLabel": "Disk Usage", "storageDesc": "每個掛載點的磁碟使用情況", - "networkLabel": "網路介面", + "networkLabel": "Network Interfaces", "networkDesc": "介面列表和頻寬", - "uptimeLabel": "正常運作時間", + "uptimeLabel": "Uptime", "uptimeDesc": "系統運作時間和啟動時間", "systemInfoLabel": "系統資訊", "systemInfoDesc": "作業系統、核心、主機名稱、架構", @@ -409,61 +532,100 @@ "recentLoginsDesc": "登入成功和失敗事件", "topProcessesLabel": "頂級流程", "topProcessesDesc": "PID、CPU%、記憶體%、指令", - "listeningPortsLabel": "監聽埠", + "listeningPortsLabel": "Listening Ports", "listeningPortsDesc": "打開帶有進程和狀態的端口", - "firewallLabel": "防火牆", + "firewallLabel": "Firewall", "firewallDesc": "防火牆、AppArmor、SELinux 狀態", - "quickActionsLabel": "快速操作", - "quickActionsToolbar": "快速操作會以按鈕的形式顯示在伺服器統計工具列中,只需單擊即可執行命令。", + "quickActionsLabel": "Quick Actions", + "quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.", "noQuickActions": "目前暫無快速行動。", "buttonLabel": "按鈕標籤", "selectSnippetPlaceholder": "選擇片段…", "addActionBtn": "新增操作", "hostSharedSuccessfully": "主機共享成功", - "failedToShareHost": "共享主機失敗", + "failedToShareHost": "Failed to share host", "accessRevoked": "存取權限已撤銷", - "failedToRevokeAccess": "撤銷存取權限失敗", - "cancelBtn": "取消", - "savingBtn": "儲存...", - "addHostBtn": "新增主機", + "failedToRevokeAccess": "Failed to revoke access", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "addHostBtn": "Add Host", "hostUpdated": "主機已更新", "hostCreated": "主機已建立", "failedToSave": "儲存主機失敗", "credentialUpdated": "憑證已更新", "credentialCreated": "已建立憑證", - "failedToSaveCredential": "儲存憑證失敗", + "failedToSaveCredential": "Failed to save credential", + "credentialNameRequired": "Please enter a name for the credential", "backToHosts": "返回主持人", "backToCredentials": "返回憑證", - "pinned": "置頂", - "noHostsFound": "未找到主機", + "pinned": "Pinned", + "noHostsFound": "No hosts found", "tryDifferentTerm": "換個說法", "addFirstHost": "新增您的第一個主機即可開始", "noCredentialsFound": "未找到憑證", - "addCredentialBtn": "新增憑證", - "updateCredentialBtn": "更新憑證", - "features": "特徵", + "addCredentialBtn": "Add Credential", + "updateCredentialBtn": "Update Credential", + "features": "Features", "noFolder": "(無資料夾)", - "deleteSelected": "刪除", + "deleteSelected": "Delete", "exitSelection": "出口選擇", - "importSkip": "導入(跳過現有)", + "importSkip": "Import (skip existing)", "importOverwrite": "導入(覆蓋)", "collapseBtn": "坍塌", "importExportBtn": "進出口", "hostStatusesRefreshed": "主機狀態已刷新", "failedToRefreshHosts": "刷新主機失敗", - "movedHostTo": "將 {{host}} 移到 \"{{folder}}\"", + "movedHostTo": "Moved {{host}} to \"{{folder}}\"", "failedToMoveHost": "主機遷移失敗", - "folderRenamedTo": "資料夾已重新命名為“{{name}}”", - "deletedFolder": "已刪除資料夾“{{name}}”", - "failedToDeleteFolder": "刪除資料夾失敗", - "deleteAllInFolder": "刪除「{{name}}」中的所有主機?此操作無法撤銷。", - "deletedHost": "已刪除 {{name}}", - "copiedToClipboard": "已複製到剪貼簿", + "folderRenamedTo": "Folder renamed to \"{{name}}\"", + "deletedFolder": "Deleted folder \"{{name}}\"", + "failedToDeleteFolder": "Failed to delete folder", + "deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.", + "folderPickerPlaceholder": "No folder", + "folderPickerSearch": "Search or create (use / for subfolders)...", + "folderPickerNone": "No folder", + "folderPickerCreate": "Create \"{{path}}\"", + "folderPickerEmpty": "No matching folders", + "newFolder": "New folder", + "createFolderTitle": "Create folder", + "editFolderTitle": "編輯資料夾", + "folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.", + "folderNameLabel": "Folder name", + "folderNamePlaceholder": "e.g. Production/Web", + "folderNestingHint": "Use / to separate levels and create nested folders.", + "folderColor": "Color", + "folderIcon": "Icon", + "folderPreview": "Preview", + "folderNameFallback": "Untitled folder", + "createFolderButton": "Create folder", + "saveFolderButton": "Save folder", + "cancel": "Cancel", + "iconSearchPlaceholder": "Search icons...", + "editFolder": "編輯資料夾", + "deleteFolder": "刪除資料夾", + "folderSaved": "Folder saved", + "failedToSaveFolder": "Failed to save folder", + "folderDeleted": "Deleted folder \"{{name}}\"", + "deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.", + "failedToMoveHosts": "主機遷移失敗", + "expandAll": "Expand all folders", + "collapseAll": "Collapse all folders", + "moreActions": "More", + "groupBy": "Group by", + "GroupByFolder": "Folder", + "GroupByTag": "Tag", + "GroupByStatus": "Status", + "GroupByProtocol": "Protocol", + "GroupByAuth": "Auth type", + "groupUngrouped": "Ungrouped", + "deletedHost": "Deleted {{name}}", + "copiedToClipboard": "Copied to clipboard", "terminalUrlCopied": "已複製終端 URL", "fileManagerUrlCopied": "文件管理器 URL 已複製", "tunnelUrlCopied": "隧道 URL 已複製", "dockerUrlCopied": "Docker URL 已複製", - "serverStatsUrlCopied": "伺服器統計資料 URL 已複製", + "hostMetricsUrlCopied": "Host Metrics URL copied", + "tmuxMonitorUrlCopied": "Tmux Monitor URL copied", "rdpUrlCopied": "複製的 RDP URL", "vncUrlCopied": "VNC URL 已複製", "telnetUrlCopied": "Telnet URL 已複製", @@ -471,43 +633,45 @@ "expandActions": "展開操作", "collapseActions": "坍塌動作", "wakeOnLanAction": "區域網路喚醒", - "wakeOnLanSuccess": "魔法資料包已寄至 {{name}}", + "wakeOnLanSuccess": "Magic packet sent to {{name}}", "wakeOnLanError": "發送魔術包失敗", - "cloneHostAction": "複製主機", + "cloneHostAction": "Clone Host", "copyAddress": "副本地址", "copyLink": "複製連結", - "copyTerminalUrlAction": "複製終端 URL", - "copyFileManagerUrlAction": "複製文件管理器 URL", - "copyTunnelUrlAction": "複製隧道 URL", - "copyDockerUrlAction": "複製 Docker URL", - "copyServerStatsUrlAction": "複製伺服器統計資料 URL", + "copyTerminalUrlAction": "Copy Terminal URL", + "copyFileManagerUrlAction": "Copy File Manager URL", + "copyTunnelUrlAction": "Copy Tunnel URL", + "copyDockerUrlAction": "Copy Docker URL", + "copyHostMetricsUrlAction": "Copy Host Metrics URL", + "copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL", "copyRdpUrlAction": "複製 RDP URL", "copyVncUrlAction": "複製 VNC URL", "copyTelnetUrlAction": "複製 Telnet URL", - "copyRemoteDesktopUrlAction": "複製遠端桌面 URL", - "deleteCredentialConfirm": "刪除憑證「{{name}}」?", - "deletedCredential": "已刪除 {{name}}", - "deploySSHKeyTitle": "部署 SSH 金鑰", - "deployingBtn": "正在部署…", + "copyRemoteDesktopUrlAction": "Copy Remote Desktop URL", + "deleteCredentialConfirm": "Delete credential \"{{name}}\"?", + "deletedCredential": "Deleted {{name}}", + "deploySSHKeyTitle": "Deploy SSH Key", + "deployingBtn": "Deploying...", "deployBtn": "部署", "failedToDeployKey": "金鑰部署失敗", - "deleteHostsConfirm": "刪除 {{count}} 主機{{plural}}?此操作無法撤銷。", + "deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.", "movedToRoot": "已移至根目錄", - "failedToMoveHosts": "主機遷移失敗", - "enableTerminalFeature": "啟用終端", - "disableTerminalFeature": "禁用終端", + "enableTerminalFeature": "Enable Terminal", + "disableTerminalFeature": "Disable Terminal", "enableFilesFeature": "啟用文件", "disableFilesFeature": "停用檔案", "enableTunnelsFeature": "啟用隧道", "disableTunnelsFeature": "禁用隧道", - "enableDockerFeature": "啟用 Docker", - "disableDockerFeature": "禁用 Docker", + "enableDockerFeature": "Enable Docker", + "disableDockerFeature": "Disable Docker", + "enableProxmoxFeature": "Enable Proxmox", + "disableProxmoxFeature": "Disable Proxmox", "addTagsPlaceholder": "添加標籤…", "authDetails": "身份驗證詳情", - "credType": "類型", + "credType": "Type", "generateKeyPairDesc": "產生新的金鑰對,私鑰和公鑰將自動填入。", "generatingKey": "正在生成...", - "generateLabel": "生成 {{label}}", + "generateLabel": "Generate {{label}}", "uploadFileBtn": "上傳文件", "keyPassphraseOptional": "密鑰口令(可選)", "sshPublicKeyOptional": "SSH 公鑰(可選)", @@ -515,65 +679,66 @@ "failedToGeneratePublicKey": "無法匯出公鑰", "publicKeyCopied": "公鑰已複製", "keyPairGenerated": "{{label}} key pair generated", - "failedToGenerateKeyPair": "密鑰對產生失敗", - "searchHostsPlaceholder": "搜尋主機、位址、標籤…", - "searchCredentialsPlaceholder": "搜尋憑證…", - "refreshBtn": "重新整理", + "failedToGenerateKeyPair": "Failed to generate key pair", + "searchHostsPlaceholder": "Search hosts, addresses, tags…", + "searchCredentialsPlaceholder": "Search credentials…", + "refreshBtn": "Refresh", "addTag": "添加標籤…", - "deleteConfirmBtn": "刪除", + "deleteConfirmBtn": "Delete", "tunnelRequirementsText": "SSH 伺服器必須在 /etc/ssh/sshd_config 中設定 GatewayPorts yes、AllowTcpForwarding yes 和 PermitRootLogin yes。", - "deleteHostConfirm": "刪除“{{name}}”?", + "deleteHostConfirm": "Delete \"{{name}}\"?", "enableAtLeastOneProtocol": "啟用上述至少一種協定以配置身份驗證和連線設定。", - "keyPassphrase": "密鑰口令", - "connectBtn": "連接", - "disconnectBtn": "斷開", - "basicInformation": "基本訊息", + "keyPassphrase": "Key Passphrase", + "connectBtn": "Connect", + "disconnectBtn": "Disconnect", + "basicInformation": "Basic Information", "authDetailsSection": "身份驗證詳情", - "credTypeLabel": "類型", - "hostsTab": "主持人", - "credentialsTab": "證書", + "credTypeLabel": "Type", + "hostsTab": "Hosts", + "credentialsTab": "Credentials", "selectMultiple": "選擇多個", "selectHosts": "選擇主機", - "connectionLabel": "聯繫", - "authenticationLabel": "驗證", - "generateKeyPairTitle": "產生密鑰對", + "connectionLabel": "Connection", + "authenticationLabel": "Authentication", + "generateKeyPairTitle": "Generate Key Pair", "generateKeyPairDescription": "產生新的金鑰對,私鑰和公鑰將自動填入。", - "generateFromPrivateKey": "從私鑰生成", - "refreshBtn2": "重新整理", + "generateFromPrivateKey": "Generate from Private Key", + "refreshBtn2": "Refresh", "exitSelectionTitle": "出口選擇", "exportAll": "全部導出", - "addHostBtn2": "新增主機", - "addCredentialBtn2": "新增憑證", + "addHostBtn2": "Add Host", + "addCredentialBtn2": "Add Credential", "checkingHostStatuses": "正在檢查主機狀態...", - "pinnedSection": "置頂", + "pinnedSection": "Pinned", "hostsExported": "主機匯出成功", "exportFailed": "匯出主機失敗", "sampleDownloaded": "下載範例文件", - "failedToDeleteCredential2": "刪除憑證失敗", + "failedToDeleteCredential2": "Failed to delete credential", "noFolderOption": "(無資料夾)", - "nSelected": "{{count}} 已選擇", - "featuresMenu": "特徵", - "moveMenu": "移動", - "cancelSelection": "取消", - "deployDialogDesc": "將 {{name}} 部署到主機的 authorized_keys 中。", - "targetHostLabel": "目標主機", + "nSelected": "{{count}} selected", + "featuresMenu": "Features", + "moveMenu": "Move", + "connectSelected": "Connect", + "cancelSelection": "Cancel", + "deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.", + "targetHostLabel": "Target Host", "selectHostOption": "選擇主機...", "keyDeployedSuccess": "金鑰已成功部署", "failedToDeployKey2": "金鑰部署失敗", - "deletedCount": "已刪除 {{count}} 主機", - "failedToDeleteCount": "刪除 {{count}} 主機失敗", - "duplicatedHost": "重複的“{{name}}”", + "deletedCount": "Deleted {{count}} hosts", + "failedToDeleteCount": "Failed to delete {{count}} hosts", + "duplicatedHost": "Duplicated \"{{name}}\"", "failedToDuplicateHost": "複製主機失敗", - "updatedCount": "已更新 {{count}} 主機", + "updatedCount": "Updated {{count}} hosts", "friendlyNameLabel": "友善名稱", - "descriptionLabel": "描述", + "descriptionLabel": "Description", "loadingHost": "正在加載主機...", - "loadingHosts": "正在載入主機……", - "loadingCredentials": "正在加載憑證...", + "loadingHosts": "Loading hosts...", + "loadingCredentials": "Loading credentials...", "noHostsYet": "目前還沒有主持人", - "noHostsMatchSearch": "沒有符合您搜尋條件的主機", + "noHostsMatchSearch": "No hosts match your search", "hostNotFound": "未找到主機", - "searchHosts": "搜尋主機...", + "searchHosts": "Search hosts...", "sortHosts": "排序主機", "sortDefault": "預設訂單", "sortNameAsc": "姓名(A → Z)", @@ -585,84 +750,97 @@ "sortPinnedFirst": "置頂", "filterHosts": "過濾主機", "filterClearAll": "清除篩選條件", - "filterStatusGroup": "地位", - "filterOnline": "在線的", - "filterOffline": "離線", - "filterPinned": "置頂", + "filterStatusGroup": "Status", + "filterOnline": "Online", + "filterOffline": "Offline", + "filterPinned": "Pinned", "filterAuthGroup": "身份驗證類型", - "filterAuthPassword": "密碼", - "filterAuthKey": "SSH金鑰", - "filterAuthCredential": "憑證", - "filterAuthNone": "沒有任何", + "filterAuthPassword": "Password", + "filterAuthKey": "SSH Key", + "filterAuthCredential": "Credential", + "filterAuthNone": "None", "filterAuthOpkssh": "OPKSSH", - "filterProtocolGroup": "協定", + "filterProtocolGroup": "Protocol", "filterProtocolSsh": "SSH", - "filterProtocolRdp": "遠端桌面協定", + "filterProtocolRdp": "RDP", "filterProtocolVnc": "VNC", "filterProtocolTelnet": "Telnet", - "filterFeaturesGroup": "特徵", - "filterFeatureTerminal": "終端", - "filterFeatureFileManager": "文件管理器", - "filterFeatureTunnel": "隧道", + "filterFeaturesGroup": "Features", + "filterFeatureTerminal": "Terminal", + "filterFeatureFileManager": "File Manager", + "filterFeatureTunnel": "Tunnel", "filterFeatureDocker": "Docker", - "filterTagsGroup": "標籤", - "shareHost": "共享主機", - "shareHostTitle": "分享: {{name}}", + "filterTagsGroup": "Tags", + "shareHost": "Share Host", + "shareHostTitle": "Share: {{name}}", "sharing": { "requiresCredential": "此主機必須使用憑證才能啟用共用。請先編輯主機並指派憑證。" }, "guac": { - "connection": "聯繫", - "authentication": "驗證", - "connectionSettings": "連接設定", - "displaySettings": "顯示設定", - "audioSettings": "音訊設定", + "connection": "Connection", + "authentication": "Authentication", + "storedCredential": "已儲存憑證", + "noCredential": "No credential (direct credentials below)", + "authMethod": "身份驗證方法", + "authTypeDirect": "Direct", + "authTypeCredential": "Credential", + "selectCredential": "選擇憑證...", + "connectionSettings": "Connection Settings", + "displaySettings": "Display Settings", + "audioSettings": "Audio Settings", "rdpPerformance": "RDP性能", - "deviceRedirection": "裝置重定向", - "session": "會議", - "gateway": "閘道", + "deviceRedirection": "Device Redirection", + "session": "Session", + "gateway": "Gateway", "remoteApp": "RemoteApp", - "clipboard": "剪貼簿", + "clipboard": "Clipboard", "sessionRecording": "會話錄製", - "wakeOnLan": "區域網路喚醒", - "vncSettings": "VNC 設定", - "terminalSettings": "終端設定", + "wakeOnLan": "Wake-on-LAN", + "vncSettings": "VNC Settings", + "terminalSettings": "Terminal Settings", "rdpPort": "RDP埠", - "username": "使用者名稱", - "password": "密碼", - "domain": "領域", - "securityMode": "安全模式", - "colorDepth": "色彩深度", - "width": "寬度", - "height": "高度", - "dpi": "乾粉", - "resizeMethod": "調整大小方法", - "clientName": "客戶名稱", - "initialProgram": "初始計劃", + "username": "Username", + "password": "Password", + "domain": "Domain", + "securityMode": "Security Mode", + "colorDepth": "Color Depth", + "width": "Width", + "height": "Height", + "dpi": "DPI", + "resizeMethod": "Resize Method", + "clientName": "Client Name", + "initialProgram": "Initial Program", "serverLayout": "伺服器佈局", - "timezone": "時區", - "gatewayHostname": "網關主機名", - "gatewayPort": "網關連接埠", - "gatewayUsername": "網關用戶名", - "gatewayPassword": "網關密碼", - "gatewayDomain": "閘道", + "timezone": "Timezone", + "loadBalanceInfo": "Load Balance Info / Cookie", + "loadBalanceInfoDesc": "RD Connection Broker cookie for RDS farm load balancing (e.g. tsv://MS Terminal Services Plugin.1.CollectionName)", + "guacdProxy": "guacd Proxy", + "guacdHostname": "guacd Host", + "guacdHostnamePlaceholder": "Global default", + "guacdPort": "guacd Port", + "guacdProxyDesc": "Override the global guacd instance for this connection. Leave blank to use the globally configured guacd.", + "gatewayHostname": "Gateway Hostname", + "gatewayPort": "Gateway Port", + "gatewayUsername": "Gateway Username", + "gatewayPassword": "Gateway Password", + "gatewayDomain": "Gateway Domain", "remoteAppProgram": "RemoteApp 程式", "workingDirectory": "工作目錄", "arguments": "論點", "normalizeLineEndings": "標準化行尾", - "recordingPath": "錄影路徑", - "recordingName": "錄音名稱", - "macAddress": "MAC位址", - "broadcastAddress": "廣播位址", - "udpPort": "UDP埠", + "recordingPath": "Recording Path", + "recordingName": "Recording Name", + "macAddress": "MAC Address", + "broadcastAddress": "Broadcast Address", + "udpPort": "UDP Port", "waitTimeS": "等待時間(秒)", - "driveName": "磁碟機名稱", - "drivePath": "驅動路徑", - "ignoreCertificate": "忽略證書", + "driveName": "Drive Name", + "drivePath": "Drive Path", + "ignoreCertificate": "Ignore Certificate", "ignoreCertificateDesc": "允許連接到具有自簽名憑證的主機", - "forceLossless": "無損力", + "forceLossless": "Force Lossless", "forceLosslessDesc": "強制無損影像編碼(更高品質,更高頻寬)", - "disableAudio": "關閉音訊", + "disableAudio": "Disable Audio", "disableAudioDesc": "將遠端會話中的所有音訊靜音", "enableAudioInput": "啟用音訊輸入(麥克風)", "enableAudioInputDesc": "把本地麥克風轉送到遠端會話", @@ -678,39 +856,39 @@ "desktopCompositionDesc": "啟用 Aero 玻璃效果", "menuAnimations": "選單動畫", "menuAnimationsDesc": "啟用選單淡入淡出和滑動動畫", - "disableBitmapCaching": "禁用位圖緩存", + "disableBitmapCaching": "Disable Bitmap Caching", "disableBitmapCachingDesc": "關閉位圖快取(可能有助於解決故障)", - "disableOffscreenCaching": "禁用螢幕外緩存", + "disableOffscreenCaching": "Disable Offscreen Caching", "disableOffscreenCachingDesc": "關閉螢幕外緩存", - "disableGlyphCaching": "禁用字形快取", + "disableGlyphCaching": "Disable Glyph Caching", "disableGlyphCachingDesc": "關閉字形快取", - "enableGfx": "啟用圖形", + "enableGfx": "Enable GFX", "enableGfxDesc": "使用 RemoteFX 圖形管線", - "enablePrinting": "啟用列印", + "enablePrinting": "Enable Printing", "enablePrintingDesc": "將本機印表機重定向到遠端會話", - "enableDriveRedirection": "啟用驅動器重定向", + "enableDriveRedirection": "Enable Drive Redirection", "enableDriveRedirectionDesc": "將本機資料夾對應為遠端會話中的磁碟機", - "createDrivePath": "建立驅動器路徑", + "createDrivePath": "Create Drive Path", "createDrivePathDesc": "如果資料夾不存在,則自動建立該資料夾。", - "disableDownload": "停用下載", + "disableDownload": "Disable Download", "disableDownloadDesc": "阻止從遠端會話下載文件", - "disableUpload": "禁用上傳", + "disableUpload": "Disable Upload", "disableUploadDesc": "阻止向遠端會話上傳文件", - "enableTouch": "啟用觸控功能", + "enableTouch": "Enable Touch", "enableTouchDesc": "啟用觸控輸入轉發", - "consoleSession": "控制台會話", + "consoleSession": "Console Session", "consoleSessionDesc": "連接到控制台(會話 0),而不是新建會話。", "sendWolPacket": "發送 WOL 封包", "sendWolPacketDesc": "連線前發送喚醒包以喚醒此主機", - "disableCopy": "停用複製", + "disableCopy": "Disable Copy", "disableCopyDesc": "阻止從遠端會話複製文本", - "disablePaste": "停用貼上", + "disablePaste": "Disable Paste", "disablePasteDesc": "阻止將文字貼到遠端會話中", "createPathIfMissing": "如果路徑缺失,則建立路徑。", "createPathIfMissingDesc": "自動建立錄製目錄", - "excludeOutput": "排除輸出", + "excludeOutput": "Exclude Output", "excludeOutputDesc": "不要錄製螢幕輸出(僅錄製元資料)", - "excludeMouse": "排除滑鼠", + "excludeMouse": "Exclude Mouse", "excludeMouseDesc": "請勿記錄滑鼠移動", "includeKeystrokes": "包含按鍵操作", "includeKeystrokesDesc": "除了螢幕輸出外,還要記錄原始按鍵操作。", @@ -718,102 +896,105 @@ "vncPassword": "VNC密碼", "vncUsernameOptional": "使用者名稱(可選)", "vncLeaveBlank": "如不需要,請留空。", - "cursorMode": "遊標模式", - "swapRedBlue": "交換紅/藍", + "cursorMode": "Cursor Mode", + "swapRedBlue": "Swap Red/Blue", "swapRedBlueDesc": "交換紅色和藍色通道(修復一些顏色問題)", "readOnly": "只讀", "readOnlyDesc": "無需發送任何輸入即可查看遠端螢幕", "telnetPort": "Telnet 連接埠", - "terminalType": "終端類型", - "fontName": "字體名稱", - "fontSize": "字體大小", - "colorScheme": "配色方案", - "backspaceKey": "退格鍵", + "terminalType": "Terminal Type", + "fontName": "Font Name", + "fontSize": "Font Size", + "colorScheme": "Color Scheme", + "backspaceKey": "Backspace Key", "saveHostFirst": "先保存主機。", "sharingOptionsAfterSave": "儲存主機後即可使用分享選項。", "sharingLoadError": "共享資料加載失敗。請檢查您的網路連線並重試。", - "shareHostSection": "共享主機", - "shareWithUser": "與用戶分享", - "shareWithRole": "分享角色", + "shareHostSection": "Share Host", + "shareWithUser": "Share with User", + "shareWithRole": "Share with Role", "selectUser": "選擇用戶", - "selectRole": "選擇角色", + "selectRole": "Select Role", "selectUserOption": "選擇用戶...", "selectRoleOption": "選擇一個角色…", - "permissionLevel": "權限等級", + "permissionLevel": "Permission Level", "expiresInHours": "剩餘時間(小時)", "noExpiryPlaceholder": "留空即可,無有效期限限制。", - "shareBtn": "分享", - "currentAccess": "目前存取權限", - "typeHeader": "類型", - "targetHeader": "目標", + "shareBtn": "Share", + "currentAccess": "Current Access", + "typeHeader": "Type", + "targetHeader": "Target", "permissionHeader": "允許", - "grantedByHeader": "授予", - "expiresHeader": "過期", + "grantedByHeader": "Granted By", + "expiresHeader": "Expires", "noAccessEntries": "暫無訪問記錄。", - "expiredLabel": "已到期", - "neverLabel": "絕不", - "revokeBtn": "撤銷", - "cancelBtn": "取消", - "savingBtn": "儲存...", - "updateHostBtn": "更新主機", - "addHostBtn": "新增主機" + "expiredLabel": "Expired", + "neverLabel": "Never", + "revokeBtn": "Revoke", + "cancelBtn": "Cancel", + "savingBtn": "Saving...", + "updateHostBtn": "Update Host", + "addHostBtn": "Add Host" } }, "commandPalette": { "searchPlaceholder": "搜尋主機、指令或設定…", - "quickActions": "快速操作", - "hostManager": "主機管理器", + "quickActions": "Quick Actions", + "hostManager": "Host Manager", "hostManagerDesc": "管理、新增或編輯主機", "addNewHost": "新增主機", "addNewHostDesc": "註冊新主機", - "adminSettings": "管理員設定", + "adminSettings": "Admin Settings", "adminSettingsDesc": "配置系統首選項和用戶", - "userProfile": "用戶個人資料", + "userProfile": "User Profile", "userProfileDesc": "管理您的帳戶和偏好設定", - "addCredential": "新增憑證", + "addCredential": "Add Credential", "addCredentialDesc": "儲存 SSH 金鑰或密碼", - "recentActivity": "近期活動", + "tmuxMonitor": "Tmux Monitor", + "tmuxMonitorDesc": "Monitor tmux sessions across your hosts", + "recentActivity": "Recent Activity", "serversAndHosts": "伺服器和主機", - "noHostsFound": "找不到與「{{search}}」相符的主機", - "links": "連結", + "noHostsFound": "No hosts found matching \"{{search}}\"", + "links": "Links", "navigate": "導航", - "select": "選擇", + "select": "Select", "toggleWith": "切換" }, "splitScreen": { - "paneEmpty": "窗格 {{index}} - 空", + "paneEmpty": "Pane {{index}} - empty", "noTabAssigned": "未分配標籤頁", "focusedPane": "活動窗格" }, "connections": { "noConnections": "沒有連接", "noConnectionsDesc": "開啟終端機、檔案總管或遠端桌面即可在此處查看連線。", - "connectedFor": "已連線 {{duration}}", - "connected": "已連接", - "disconnected": "斷開連接", + "connectedFor": "Connected for {{duration}}", + "connected": "Connected", + "disconnected": "Disconnected", "closeTab": "關閉標籤頁", "closeConnection": "緊密聯繫", "forgetTab": "忘記", - "removeBackground": "消除", - "reconnect": "重新連接", + "removeBackground": "Remove", + "reconnect": "Reconnect", "reopenTab": "重新開放", "sectionOpen": "打開", "sectionBackground": "背景", "backgroundDesc": "斷開連線後,會話仍會保持 30 分鐘,並且可以重新連線。", "persisted": "在背景持續運行", - "expiresIn": "有效期限至 {{duration}}", + "expiresIn": "Expires in {{duration}}", "search": "搜尋關聯...", - "noSearchResults": "沒有找到與您的搜尋相符的結果。" + "noSearchResults": "沒有找到與您的搜尋相符的結果。", + "rename": "Rename session" }, "guacamole": { - "connecting": "正在連線到 {{type}} 會話...", - "connectionError": "連線錯誤", - "connectionFailed": "連線失敗", - "failedToConnect": "取得連線令牌失敗", + "connecting": "Connecting to {{type}} session...", + "connectionError": "Connection error", + "connectionFailed": "Connection failed", + "failedToConnect": "Failed to get connection token", "hostNotFound": "未找到主機", - "noHostSelected": "未選擇主機", - "reconnect": "重新連接", - "retry": "重試", + "noHostSelected": "No host selected", + "reconnect": "Reconnect", + "retry": "Retry", "guacdUnavailable": "遠端桌面服務 (guacd) 不可用。請確保 guacd 正在運行、可訪問,並且在管理設定中已正確配置。", "ctrlAltDel": "Ctrl+Alt+Del", "toolbar": { @@ -821,14 +1002,14 @@ "winL": "Win+L(鎖定畫面)", "winKey": "Windows 鍵", "ctrl": "Ctrl", - "alt": "另類", - "shift": "轉移", + "alt": "Alt", + "shift": "Shift", "win": "贏", - "stickyActive": "{{key}} (已鎖定 - 按一下釋放)", - "stickyInactive": "{{key}} (點選鎖定)", + "stickyActive": "{{key}} (latched - click to release)", + "stickyInactive": "{{key}} (click to latch)", "esc": "逃脫", "tab": "標籤頁", - "home": "家", + "home": "Home", "end": "結尾", "pageUp": "上一頁", "pageDown": "往下翻頁", @@ -844,293 +1025,308 @@ } }, "terminal": { - "connect": "連接到主機", - "clear": "清除", - "paste": "貼上", - "reconnect": "重新連接", + "connect": "Connect to Host", + "clear": "Clear", + "paste": "Paste", + "reconnect": "Reconnect", "connectionLost": "連線遺失", - "connected": "已連接", - "clipboardWriteFailed": "複製到剪貼簿失敗。請確保頁面是透過 HTTPS 或本地主機存取的。", - "clipboardReadFailed": "讀取剪貼簿內容失敗。請確保已授予剪貼簿權限。", - "clipboardHttpWarning": "貼上操作需要 HTTPS。請使用 Ctrl+Shift+V 或透過 HTTPS 提供 Termix 服務。", - "unknownError": "發生未知錯誤", - "websocketError": "WebSocket 連線錯誤", - "connecting": "正在連接...", - "noHostSelected": "未選擇主機", - "reconnecting": "正在重新連線... ({{attempt}}/{{max}})", - "reconnected": "已成功重新連接", - "tmuxSessionCreated": "tmux 會話已建立: {{name}}", - "tmuxSessionAttached": "tmux 會話已連線: {{name}}", + "connected": "Connected", + "clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.", + "clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.", + "clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.", + "unknownError": "Unknown error occurred", + "websocketError": "WebSocket connection error", + "connecting": "Connecting...", + "noHostSelected": "No host selected", + "reconnecting": "Reconnecting... ({{attempt}}/{{max}})", + "reconnected": "Reconnected successfully", + "tmuxSessionCreated": "tmux session created: {{name}}", + "tmuxSessionAttached": "tmux session attached: {{name}}", "tmuxUnavailable": "遠端主機上未安裝 tmux,回退到標準 shell", "tmuxSessionPickerTitle": "tmux 會話", "tmuxSessionPickerDesc": "此主機上已存在 tmux 會話。請選擇一個會話重新連線或建立新會話。", - "tmuxWindows": "視窗", - "tmuxWindowCount": "{{count}} 窗口", + "tmuxWindows": "Windows", + "tmuxWindowCount": "{{count}} window", "tmuxAttached": "附屬客戶", - "tmuxAttachedCount": "{{count}} 已連接", + "tmuxAttachedCount": "{{count}} attached", "tmuxLastActivity": "上次活動", "tmuxTimeJustNow": "現在", - "tmuxTimeMinutes": "{{count}}幾分鐘前", - "tmuxTimeHours": "{{count}}小時前", - "tmuxTimeDays": "{{count}}天前", + "tmuxTimeMinutes": "{{count}}m ago", + "tmuxTimeHours": "{{count}}h ago", + "tmuxTimeDays": "{{count}}d ago", "tmuxCreateNew": "開始新會話", "tmuxCopyHint": "調整選取範圍並按 Enter 鍵複製到剪貼簿", "tmuxDetach": "從 tmux 會話中分離", "tmuxDetached": "已從 tmux 會話中分離", - "maxReconnectAttemptsReached": "已達最大重連嘗試次數", - "closeTab": "關閉", - "connectionTimeout": "連線逾時", - "terminalTitle": "終端機 - {{host}}", - "terminalWithPath": "終端 - {{host}}:{{path}}", - "runTitle": "運行 {{command}} - {{host}}", - "totpRequired": "需要雙重認證", - "totpCodeLabel": "驗證碼", - "totpVerify": "核實", - "warpgateAuthRequired": "需要傳送門認證", - "warpgateSecurityKey": "安全金鑰", - "warpgateAuthUrl": "身份驗證 URL", - "warpgateOpenBrowser": "在瀏覽器中開啟", - "warpgateContinue": "我已經完成身份驗證", - "opksshAuthRequired": "需要 OPKSSH 驗證", - "opksshAuthDescription": "請在瀏覽器中完成身份驗證以繼續。此會話有效期限為 24 小時。", - "opksshOpenBrowser": "開啟瀏覽器進行身份驗證", - "opksshWaitingForAuth": "正在等待瀏覽器驗證...", - "opksshAuthenticating": "正在處理身份驗證...", - "opksshTimeout": "身份驗證超時,請重試。", - "opksshAuthFailed": "身份驗證失敗。請檢查您的憑證並重試。", - "opksshSignInWith": "使用 {{provider}} 登入", - "sudoPasswordPopupTitle": "輸入密碼?", - "websocketAbnormalClose": "連線意外關閉。這可能是由於反向代理或 SSL 配置問題導致的。請檢查伺服器日誌。", - "connectionLogTitle": "連線日誌", - "connectionLogCopy": "將日誌複製到剪貼簿", - "connectionLogEmpty": "暫無連線日誌", + "maxReconnectAttemptsReached": "Maximum reconnection attempts reached", + "closeTab": "Close", + "connectionTimeout": "Connection timeout", + "terminalTitle": "Terminal - {{host}}", + "terminalWithPath": "Terminal - {{host}}:{{path}}", + "runTitle": "Running {{command}} - {{host}}", + "totpRequired": "Two-Factor Authentication Required", + "totpCodeLabel": "Verification Code", + "totpVerify": "Verify", + "warpgateAuthRequired": "Warpgate Authentication Required", + "warpgateSecurityKey": "Security Key", + "warpgateAuthUrl": "Authentication URL", + "warpgateOpenBrowser": "Open in Browser", + "warpgateContinue": "I've Completed Authentication", + "opksshAuthRequired": "OPKSSH Authentication Required", + "opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.", + "opksshOpenBrowser": "Open Browser to Authenticate", + "opksshWaitingForAuth": "Waiting for authentication in browser...", + "opksshAuthenticating": "Processing authentication...", + "opksshTimeout": "Authentication timed out. Please try again.", + "opksshAuthFailed": "Authentication failed. Please check your credentials and try again.", + "opksshSignInWith": "Sign in with {{provider}}", + "sudoPasswordPopupTitle": "Insert Password?", + "linkDialogTitle": "Open Link", + "linkDialogOpen": "打開", + "linkDialogCopy": "Copy", + "websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.", + "connectionLogTitle": "Connection Log", + "connectionLogCopy": "Copy logs to clipboard", + "connectionLogEmpty": "No connection logs yet", "connectionLogWaiting": "正在等待連線日誌...", - "connectionLogCopied": "連線日誌已複製到剪貼簿", - "connectionLogCopyFailed": "無法將日誌複製到剪貼簿", - "connectionRejected": "伺服器拒絕連線。請檢查您的身份驗證和網路配置。", - "hostKeyRejected": "SSH主機金鑰驗證失敗。連線已取消。", - "sessionTakenOver": "會話已在另一個標籤頁中開啟。正在重新連線…" + "connectionLogCopied": "Connection logs copied to clipboard", + "connectionLogCopyFailed": "Failed to copy logs to clipboard", + "connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.", + "hostKeyRejected": "SSH host key verification rejected. Connection cancelled.", + "sessionTakenOver": "Session was opened in another tab. Reconnecting...", + "split": { + "splitTab": "分頁標籤", + "addToSplit": "添加到拆分", + "removeFromSplit": "從分割中移除" + } }, "fileManager": { - "noHostSelected": "未選擇主機", + "noHostSelected": "No host selected", "initializingEditor": "正在初始化編輯器...", - "file": "檔案", - "folder": "資料夾", - "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": "重新命名", - "uploading": "正在上傳...", - "uploadingFile": "正在上傳 {{name}}...", - "fileName": "檔案名稱", - "folderName": "資料夾名稱", - "fileUploadedSuccessfully": "檔案「{{name}}」已成功上傳", - "failedToUploadFile": "檔案上載失敗", - "fileDownloadedSuccessfully": "檔案「{{name}}」已成功下載", - "failedToDownloadFile": "檔案下載失敗", - "fileCreatedSuccessfully": "檔案“{{name}}”已成功建立", - "folderCreatedSuccessfully": "資料夾“{{name}}”已成功建立", - "failedToCreateItem": "建立專案失敗", - "operationFailed": "{{operation}} 操作對 {{name}}: {{error}} 失敗", - "failedToResolveSymlink": "解析符號連結失敗", - "itemsDeletedSuccessfully": "{{count}} 項目已成功刪除", - "failedToDeleteItems": "刪除項目失敗", - "sudoPasswordRequired": "需要管理員密碼", - "enterSudoPassword": "請輸入 sudo 密碼以繼續此操作", - "sudoPassword": "Sudo 密碼", - "sudoOperationFailed": "sudo 操作失敗", - "sudoAuthFailed": "sudo 驗證失敗", - "dragFilesToUpload": "將檔案拖曳至此處以上傳", - "emptyFolder": "此資料夾為空。", - "searchFiles": "搜尋檔案...", - "upload": "上傳", - "selectHostToStart": "選擇主機以啟動檔案管理", + "file": "File", + "folder": "Folder", + "uploadFile": "Upload File", + "downloadFile": "Download", + "extractArchive": "Extract Archive", + "extractingArchive": "Extracting {{name}}...", + "archiveExtractedSuccessfully": "{{name}} extracted successfully", + "extractFailed": "Extract failed", + "compressFile": "Compress File", + "compressFiles": "Compress Files", + "compressFilesDesc": "Compress {{count}} items into an archive", + "archiveName": "Archive Name", + "enterArchiveName": "Enter archive name...", + "compressionFormat": "Compression Format", + "selectedFiles": "Selected files", + "andMoreFiles": "and {{count}} more...", + "compress": "Compress", + "compressingFiles": "Compressing {{count}} items into {{name}}...", + "filesCompressedSuccessfully": "{{name}} created successfully", + "compressFailed": "Compression failed", + "edit": "Edit", + "preview": "Preview", + "previous": "Previous", + "next": "Next", + "pageXOfY": "Page {{current}} of {{total}}", + "zoomOut": "Zoom Out", + "zoomIn": "Zoom In", + "newFile": "New File", + "newFolder": "New Folder", + "rename": "Rename", + "uploading": "Uploading...", + "uploadingFile": "Uploading {{name}}...", + "fileName": "File Name", + "folderName": "Folder Name", + "fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully", + "failedToUploadFile": "Failed to upload file", + "fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully", + "failedToDownloadFile": "Failed to download file", + "fileCreatedSuccessfully": "File \"{{name}}\" created successfully", + "folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully", + "failedToCreateItem": "Failed to create item", + "operationFailed": "{{operation}} operation failed for {{name}}: {{error}}", + "failedToResolveSymlink": "Failed to resolve symlink", + "itemsDeletedSuccessfully": "{{count}} items deleted successfully", + "failedToDeleteItems": "Failed to delete items", + "sudoPasswordRequired": "Administrator Password Required", + "enterSudoPassword": "Enter sudo password to continue this operation", + "sudoPassword": "Sudo password", + "sudoOperationFailed": "Sudo operation failed", + "sudoAuthFailed": "Sudo authentication failed", + "dragFilesToUpload": "Drop files here to upload", + "emptyFolder": "This folder is empty", + "searchFiles": "Search files...", + "upload": "Upload", + "selectHostToStart": "Select a host to start file management", "sshRequiredForFileManager": "檔案管理器需要 SSH 連線。此主機未啟用 SSH 連線。", - "failedToConnect": "SSH 連線失敗", - "failedToLoadDirectory": "載入目錄失敗", - "noSSHConnection": "沒有可用的 SSH 連接", - "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}} 嗎?", - "permissionDenied": "權限被拒絕", - "serverError": "伺服器錯誤", - "fileSavedSuccessfully": "成功儲存檔案", - "failedToSaveFile": "儲存檔案失敗", - "confirmDeleteSingleItem": "您確定要永久刪除“{{name}}”嗎?", - "confirmDeleteMultipleItems": "您確定要永久刪除 {{count}} 項目嗎?", - "confirmDeleteMultipleItemsWithFolders": "您確定要永久刪除 {{count}} 項目嗎?這包括資料夾及其內容。", - "confirmDeleteFolder": "您確定要永久刪除資料夾「{{name}}」及其所有內容嗎?", - "permanentDeleteWarning": "此操作無法撤銷。物品將從伺服器永久刪除。", - "recent": "最近的", - "pinned": "置頂", - "folderShortcuts": "資料夾快捷方式", - "failedToReconnectSSH": "SSH 會話重新連線失敗", - "openTerminalHere": "在此處打開終端機", - "run": "執行", - "openTerminalInFolder": "在此資料夾中開啟終端機", - "openTerminalInFileLocation": "打開終端機,指向檔案位置", - "runningFile": "運行中 - {{file}}", - "onlyRunExecutableFiles": "只能運行可執行檔案", - "directories": "目錄", - "removedFromRecentFiles": "從最近檔案中移除“{{name}}”", - "removeFailed": "移除失敗", - "unpinnedSuccessfully": "已成功取消置頂“{{name}}”", - "unpinFailed": "解除鎖定失敗", - "removedShortcut": "已移除捷徑“{{name}}”", - "removeShortcutFailed": "移除快捷方式失敗", - "clearedAllRecentFiles": "已清除所有最近檔案", - "clearFailed": "清除失敗", - "removeFromRecentFiles": "從最近檔案中刪除", - "clearAllRecentFiles": "清除所有最近檔案", - "unpinFile": "解壓縮檔案", - "removeShortcut": "移除快捷方式", - "pinFile": "置頂檔案", - "addToShortcuts": "新增到快捷方式", - "pasteFailed": "貼上失敗", - "noUndoableActions": "沒有可撤銷的操作", - "undoCopySuccess": "撤銷複製操作:已刪除 {{count}} 個已複製的檔案", - "undoCopyFailedDelete": "撤銷失敗:無法刪除任何已複製的檔案", - "undoCopyFailedNoInfo": "撤銷失敗:找不到已複製的檔案訊息", - "undoMoveSuccess": "撤銷移動操作:已將 {{count}} 個檔案移回原始位置", - "undoMoveFailedMove": "撤銷失敗:無法將任何檔案移回。", - "undoMoveFailedNoInfo": "撤銷失敗:找不到已移動的檔案訊息", - "undoDeleteNotSupported": "刪除操作無法撤銷:檔案已從伺服器永久刪除。", - "undoTypeNotSupported": "不支援的撤銷操作類型", - "undoOperationFailed": "撤銷操作失敗", - "unknownError": "未知錯誤", - "confirm": "確認", - "find": "尋找...", - "replace": "代替", - "downloadInstead": "下載", - "keyboardShortcuts": "鍵盤快速鍵", - "searchAndReplace": "搜尋和替換", - "editing": "編輯", - "search": "搜尋", - "findNext": "尋找下一個", - "findPrevious": "找上一個", - "save": "儲存", - "selectAll": "全選", - "undo": "撤銷", - "redo": "重做", - "moveLineUp": "移動陣容", - "moveLineDown": "向下移動線路", - "toggleComment": "切換評論", - "autoComplete": "自動完成", - "imageLoadError": "圖片載入失敗", - "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": "新建資料夾", + "failedToConnect": "Failed to connect to SSH", + "failedToLoadDirectory": "Failed to load directory", + "noSSHConnection": "No SSH connection available", + "copy": "Copy", + "cut": "Cut", + "paste": "Paste", + "copyPath": "Copy Path", + "copyPaths": "Copy Paths", + "delete": "Delete", + "properties": "Properties", + "refresh": "Refresh", + "downloadFiles": "Download {{count}} files to Browser", + "copyFiles": "Copy {{count}} items", + "cutFiles": "Cut {{count}} items", + "deleteFiles": "Delete {{count}} items", + "filesCopiedToClipboard": "{{count}} items copied to clipboard", + "filesCutToClipboard": "{{count}} items cut to clipboard", + "pathCopiedToClipboard": "Path copied to clipboard", + "pathsCopiedToClipboard": "{{count}} paths copied to clipboard", + "failedToCopyPath": "Failed to copy path to clipboard", + "copyFolderLink": "Copy Link to Folder", + "copyCurrentFolderLink": "Copy Link to Current Folder", + "folderLinkCopied": "Folder link copied to clipboard", + "failedToCopyFolderLink": "Failed to copy folder link", + "movedItems": "Moved {{count}} items", + "failedToDeleteItem": "Failed to delete item", + "itemRenamedSuccessfully": "{{type}} renamed successfully", + "failedToRenameItem": "Failed to rename item", + "download": "Download", + "permissions": "Permissions", + "size": "Size", + "modified": "Modified", + "path": "Path", + "confirmDelete": "Are you sure you want to delete {{name}}?", + "permissionDenied": "Permission denied", + "serverError": "Server Error", + "fileSavedSuccessfully": "File saved successfully", + "failedToSaveFile": "Failed to save file", + "confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?", + "confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?", + "confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.", + "confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?", + "permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.", + "recent": "Recent", + "pinned": "Pinned", + "folderShortcuts": "Folder Shortcuts", + "failedToReconnectSSH": "Failed to reconnect SSH session", + "openTerminalHere": "Open Terminal Here", + "run": "Run", + "openTerminalInFolder": "Open Terminal in This Folder", + "openTerminalInFileLocation": "Open Terminal at File Location", + "runningFile": "Running - {{file}}", + "onlyRunExecutableFiles": "Can only run executable files", + "directories": "Directories", + "removedFromRecentFiles": "Removed \"{{name}}\" from recent files", + "removeFailed": "Remove failed", + "unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully", + "unpinFailed": "Unpin failed", + "removedShortcut": "Removed shortcut \"{{name}}\"", + "removeShortcutFailed": "Remove shortcut failed", + "clearedAllRecentFiles": "Cleared all recent files", + "clearFailed": "Clear failed", + "removeFromRecentFiles": "Remove from recent files", + "clearAllRecentFiles": "Clear all recent files", + "unpinFile": "Unpin file", + "removeShortcut": "Remove shortcut", + "pinFile": "Pin file", + "addToShortcuts": "Add to shortcuts", + "pasteFailed": "Paste failed", + "noUndoableActions": "No undoable actions", + "undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files", + "undoCopyFailedDelete": "Undo failed: Could not delete any copied files", + "undoCopyFailedNoInfo": "Undo failed: Could not find copied file information", + "undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location", + "undoMoveFailedMove": "Undo failed: Could not move any files back", + "undoMoveFailedNoInfo": "Undo failed: Could not find moved file information", + "undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server", + "undoTypeNotSupported": "Unsupported undo operation type", + "undoOperationFailed": "Undo operation failed", + "unknownError": "Unknown error", + "confirm": "Confirm", + "find": "Find...", + "replace": "Replace", + "downloadInstead": "Download Instead", + "keyboardShortcuts": "Keyboard Shortcuts", + "searchAndReplace": "Search & Replace", + "editing": "Editing", + "search": "Search", + "findNext": "Find Next", + "findPrevious": "Find Previous", + "save": "Save", + "selectAll": "Select All", + "undo": "Undo", + "redo": "Redo", + "moveLineUp": "Move Line Up", + "moveLineDown": "Move Line Down", + "toggleComment": "Toggle Comment", + "autoComplete": "Auto Complete", + "imageLoadError": "Failed to load image", + "startTyping": "Start typing...", + "unknownSize": "Unknown size", + "fileIsEmpty": "File is empty", + "largeFileWarning": "Large File Warning", + "largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.", + "fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files", + "failedToLoadFile": "Failed to load file: {{error}}", + "serverErrorOccurred": "Server error occurred. Please try again later.", + "autoSaveFailed": "Auto-save failed", + "fileAutoSaved": "File auto-saved", + "moveFileFailed": "Failed to move {{name}}", + "moveOperationFailed": "Move operation failed", + "canOnlyCompareFiles": "Can only compare two files", + "comparingFiles": "Comparing files: {{file1}} and {{file2}}", + "dragFailed": "Drag operation failed", + "filePinnedSuccessfully": "File \"{{name}}\" pinned successfully", + "pinFileFailed": "Failed to pin file", + "fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully", + "unpinFileFailed": "Failed to unpin file", + "shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully", + "addShortcutFailed": "Failed to add shortcut", + "operationCompletedSuccessfully": "{{operation}} {{count}} items successfully", + "operationCompleted": "{{operation}} {{count}} items", + "downloadFileSuccess": "File {{name}} downloaded successfully", + "downloadFileFailed": "Download failed", + "moveTo": "Move to {{name}}", + "diffCompareWith": "Diff compare with {{name}}", + "dragOutsideToDownload": "Drag outside window to download ({{count}} files)", + "newFolderDefault": "NewFolder", "newFileDefault": "NewFile.txt", - "successfullyMovedItems": "已成功將 {{count}} 個項目移至 {{target}}", - "move": "移動", - "searchInFile": "在檔案中搜尋(Ctrl+F)", - "showKeyboardShortcuts": "顯示鍵盤快速鍵", - "startWritingMarkdown": "開始寫你的 Markdown 內容…", - "loadingFileComparison": "正在載入檔案比較...", - "reload": "重新載入", - "compare": "比較", - "sideBySide": "並排", - "inline": "排隊", - "fileComparison": "檔案比較: {{file1}} vs {{file2}}", - "fileTooLarge": "檔案過大: {{error}}", - "sshConnectionFailed": "SSH 連線失敗。請檢查您與 {{name}} ({{ip}}:{{port}} ) 的連接。", - "loadFileFailed": "檔案載入失敗: {{error}}", - "connecting": "正在連接...", - "connectedSuccessfully": "連線成功", - "totpVerificationFailed": "TOTP驗證失敗", - "warpgateVerificationFailed": "Warpgate 身份驗證失敗", - "authenticationFailed": "身份驗證失敗", - "verificationCodePrompt": "驗證碼:", - "changePermissions": "更改權限", - "currentPermissions": "目前權限", - "owner": "擁有者", - "group": "群組", - "others": "其他的", - "read": "讀", - "write": "寫", - "execute": "執行", - "permissionsChangedSuccessfully": "權限已成功更改", - "failedToChangePermissions": "更改權限失敗", - "name": "姓名", - "sortByName": "姓名", - "sortByDate": "修改日期", - "sortBySize": "尺寸", - "ascending": "上升", - "descending": "下降", + "successfullyMovedItems": "Successfully moved {{count}} items to {{target}}", + "move": "Move", + "searchInFile": "Search in file (Ctrl+F)", + "showKeyboardShortcuts": "Show keyboard shortcuts", + "decreaseFontSize": "Decrease font size", + "increaseFontSize": "Increase font size", + "startWritingMarkdown": "Start writing your markdown content...", + "loadingFileComparison": "Loading file comparison...", + "reload": "Reload", + "compare": "Compare", + "sideBySide": "Side by Side", + "inline": "Inline", + "fileComparison": "File Comparison: {{file1}} vs {{file2}}", + "fileTooLarge": "File too large: {{error}}", + "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", + "loadFileFailed": "Failed to load file: {{error}}", + "connecting": "Connecting...", + "connectedSuccessfully": "Connected successfully", + "totpVerificationFailed": "TOTP verification failed", + "warpgateVerificationFailed": "Warpgate authentication failed", + "authenticationFailed": "Authentication failed", + "incorrectPassphrase": "Incorrect passphrase. Please try again.", + "verificationCodePrompt": "Verification code:", + "changePermissions": "Change Permissions", + "currentPermissions": "Current Permissions", + "owner": "Owner", + "group": "Group", + "others": "Others", + "read": "Read", + "write": "Write", + "execute": "Execute", + "permissionsChangedSuccessfully": "Permissions changed successfully", + "failedToChangePermissions": "Failed to change permissions", + "name": "Name", + "sortByName": "Name", + "sortByDate": "Date Modified", + "sortBySize": "Size", + "ascending": "Ascending", + "descending": "Descending", "root": "根", "new": "新的", "sortBy": "排序方式", @@ -1139,20 +1335,20 @@ "editor": "編輯", "octal": "八進位", "storage": "貯存", - "disk": "磁碟", - "used": "用過的", - "of": "的", - "toggleSidebar": "切換側邊欄", + "disk": "Disk", + "used": "Used", + "of": "of", + "toggleSidebar": "Toggle Sidebar", "cannotLoadPdf": "無法載入PDF", "pdfLoadError": "載入此PDF檔案時出錯。", "loadingPdf": "正在載入PDF文件...", "loadingPage": "頁面正在加載..." }, "transfer": { - "copyToHost": "複製到主機…", - "moveToHost": "移至主機…", - "copyItemsToHost": "將 {{count}} 項目複製到主機…", - "moveItemsToHost": "將 {{count}} 個物品移至主機…", + "copyToHost": "Copy to host…", + "moveToHost": "Move to host…", + "copyItemsToHost": "Copy {{count}} items to host…", + "moveItemsToHost": "Move {{count}} items to host…", "noHostsConnected": "沒有其他檔案總管主機可用。", "noHostsConnectedHint": "在主機管理員中新增另一台啟用了檔案管理器的 SSH 主機。", "selectDestinationHost": "選擇目標主機", @@ -1162,53 +1358,53 @@ "expandRecentDestinations": "展開最近目的地", "browseFolders": "瀏覽目標資料夾", "browseDestination": "瀏覽或輸入路徑", - "confirmCopy": "複製", - "confirmMove": "移動", - "transferring": "轉移…", - "compressing": "正在壓縮…", - "extracting": "提取…", - "transferringItems": "轉移 {{current}} 個物品,共 {{total}} 個物品,共… 個物品。", + "confirmCopy": "Copy", + "confirmMove": "Move", + "transferring": "Transferring…", + "compressing": "Compressing…", + "extracting": "Extracting…", + "transferringItems": "Transferring {{current}} of {{total}} items…", "transferSuccess": "轉帳完成", "transferError": "轉帳失敗", - "transferPartial": "轉帳完成,但出現 {{count}} 錯誤", - "transferPartialHint": "轉帳失敗: {{paths}}", - "itemsSummary": "{{count}} 項目", + "transferPartial": "Transfer completed with {{count}} errors", + "transferPartialHint": "Could not transfer: {{paths}}", + "itemsSummary": "{{count}} items", "destMustBeDirectory": "對於多項傳輸,目標位置必須是目錄。", "selectThisFolder": "選擇此資料夾", "browsePathWillBeCreated": "此資料夾尚不存在。傳輸開始時將建立此資料夾。", "browsePathError": "無法在目標主機上開啟此路徑。", "goUp": "上", - "copyFolderToHost": "將資料夾複製到主機…", - "moveFolderToHost": "將資料夾移至主機…", - "hostReady": "準備好", - "hostConnecting": "正在連接…", - "hostDisconnected": "未連接", + "copyFolderToHost": "Copy folder to host…", + "moveFolderToHost": "Move folder to host…", + "hostReady": "Ready", + "hostConnecting": "Connecting…", + "hostDisconnected": "Not connected", "hostAuthRequired": "需要身份驗證-請先在此主機上開啟檔案總管。", - "hostConnectionFailed": "連線失敗", + "hostConnectionFailed": "Connection failed", "metricsTitle": "轉帳時間", - "metricsPrepare": "準備目的地: {{duration}}", - "metricsCompress": "壓縮來源檔: {{duration}}", - "metricsHopSourceRead": "來源 → 伺服器: {{throughput}}", - "metricsHopDestSftpWrite": "伺服器 → 目標(SFTP): {{throughput}}", - "metricsHopDestLocalWrite": "伺服器 → 目標(本地): {{throughput}}", - "metricsTransfer": "端對端: {{throughput}} ({{duration}})", - "metricsExtract": "提取到目標位置: {{duration}}", - "metricsSourceDelete": "從來源移除: {{duration}}", - "metricsTotal": "總計: {{duration}}", - "progressCompressing": "在來源主機上進行壓縮…", - "progressExtracting": "正在從目標位置… 提取", - "progressTransferring": "正在傳輸資料…", - "progressReconnecting": "正在重新連線…", + "metricsPrepare": "Prepare destination: {{duration}}", + "metricsCompress": "Compress on source: {{duration}}", + "metricsHopSourceRead": "Source → server: {{throughput}}", + "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", + "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}", + "metricsTransfer": "End-to-end: {{throughput}} ({{duration}})", + "metricsExtract": "Extract on destination: {{duration}}", + "metricsSourceDelete": "Remove from source: {{duration}}", + "metricsTotal": "Total: {{duration}}", + "progressCompressing": "Compressing on source host…", + "progressExtracting": "Extracting on destination…", + "progressTransferring": "Transferring data…", + "progressReconnecting": "Reconnecting…", "parallelSegmentsLabel": "平行換乘車道", - "parallelSegmentsOption": "{{count}} 車道", + "parallelSegmentsOption": "{{count}} lanes", "parallelSegmentsHint": "大檔案會被分割成 256 MB 的資料塊。多通道使用獨立的連線(類似於同時啟動多個傳輸)以提高總吞吐量。", "progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)", - "progressTransferringItems": "正在傳輸檔案({{current}} 中的 {{total}})…", + "progressTransferringItems": "Transferring files ({{current}} of {{total}})…", "progressBytes": "{{transferred}} / {{total}}", - "progressItems": "{{current}} / {{total}} 文件", + "progressItems": "{{current}} / {{total}} files", "sourceNotDeletedPartial": "保留來源檔案(部分傳輸)", "jumpHostLimitation": "兩台主機都必須能從Termix伺服器存取。不支援主機之間的直接路由。", - "cancel": "取消", + "cancel": "Cancel", "methodLabel": "轉移方法", "methodAuto": "汽車", "methodTar": "Tar 歸檔", @@ -1216,25 +1412,25 @@ "methodAutoHint": "根據檔案數量、大小和壓縮率選擇 tar 協定或按檔案 SFTP 協定。單一檔案始終使用串流 SFTP 協定。", "methodTarHint": "在源端壓縮,傳輸單一壓縮包,在目標端解壓縮。兩個 Unix 主機都需要 tar 指令。", "methodItemSftpHint": "透過 SFTP 逐一傳輸檔案。支援所有主機,包括 Windows 系統。", - "methodPreviewLoading": "計算轉移方法…", + "methodPreviewLoading": "Calculating transfer method…", "methodPreviewError": "無法預覽傳輸方式。伺服器將在您啟動時選擇一種傳輸方式。", "methodPreviewWillUseTar": "將使用:Tar 歸檔", "methodPreviewWillUseItemSftp": "將使用:按檔案 SFTP", - "methodPreviewScanSummary": "{{fileCount}} 個文件, {{totalSize}} 總計(在來源主機上掃描)。", + "methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).", "methodItemSftpLimitation": "每個檔案都使用同一個 SFTP 流,以單一檔案複製的方式依序進行。所有檔案的進度是合併計算的,因此在處理大檔案時進度條移動較慢。", "methodReason": { "user_item_sftp": "您選擇了按檔案SFTP傳輸。", "user_tar": "您選擇了tar歸檔。", "tar_unavailable": "Tar 在一台或兩台主機上不可用-將改用按檔案 SFTP。", "windows_host": "涉及 Windows 主機-未使用 tar。", - "auto_multi_large": "自動:多個文件,包括一個大文件({{largestSize}}),其中包含可壓縮資料-tar 打包成一個傳輸。", - "auto_single_large_in_archive": "自動:此集合中有一個大檔案({{largestSize}})—按檔案 SFTP。", + "auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.", + "auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.", "auto_many_incompressible": "自動:主要為不可壓縮資料-按檔案 SFTP。", - "auto_many_files": "自動:多個檔案({{fileCount}})— tar 減少每個檔案的開銷。", + "auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.", "auto_default": "自動:此資料集的每個檔案都使用 SFTP 進行管理。" }, - "progressCancel": "取消", - "progressCancelling": "取消…", + "progressCancel": "Cancel", + "progressCancelling": "Cancelling…", "progressStalled": "停滯", "resumedHint": "已重新連線到在另一個視窗中啟動的活動傳輸。", "transferCancelled": "轉帳已取消", @@ -1245,40 +1441,40 @@ "cleanupDestFilesPartial": "部分檔案無法刪除。", "cleanupDestFilesNothing": "目的地無需清理", "cleanupDestFilesError": "清理失敗", - "retryTransfer": "重試", + "retryTransfer": "Retry", "retryTransferError": "重試失敗", "transferFailedRetryHint": "目標端保留了部分資料。連線恢復後,系統將恢復重試。" }, "tunnels": { - "noSshTunnels": "沒有 SSH 隧道", - "createFirstTunnelMessage": "您尚未建立任何 SSH 隧道。請在主機管理員中設定隧道連線以開始使用。", - "connected": "已連接", - "disconnected": "斷開連接", - "connecting": "正在連接...", - "error": "錯誤", - "canceling": "正在取消…", - "connect": "連接", - "disconnect": "斷開", - "cancel": "取消", - "port": "連接埠", - "localPort": "本地連接埠", - "remotePort": "遠端埠", + "noSshTunnels": "No SSH Tunnels", + "createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "error": "Error", + "canceling": "Canceling...", + "connect": "Connect", + "disconnect": "Disconnect", + "cancel": "Cancel", + "port": "Port", + "localPort": "Local Port", + "remotePort": "Remote Port", "currentHostPort": "目前主機連接埠", - "endpointPort": "端點埠", + "endpointPort": "Endpoint Port", "bindIp": "本地IP", - "endpointSshConfig": "端點 SSH 配置", + "endpointSshConfig": "Endpoint SSH Configuration", "endpointSshHost": "端點 SSH 主機", "endpointSshHostPlaceholder": "選擇已配置的主機", "endpointSshHostRequired": "為每個用戶端隧道選擇一個 SSH 端點主機。", - "attempt": "試 {{current}} 的 {{max}}", - "nextRetryIn": "下次重試時間為 {{seconds}} 秒", + "attempt": "Attempt {{current}} of {{max}}", + "nextRetryIn": "Next retry in {{seconds}} seconds", "clientTunnels": "用戶端隧道", "clientTunnel": "用戶端隧道", "addClientTunnel": "新增客戶端隧道", "noClientTunnels": "此桌面未配置客戶端隧道。", - "tunnelName": "隧道名稱", - "remoteHost": "遠端主機", - "autoStart": "自動啟動", + "tunnelName": "Tunnel Name", + "remoteHost": "Remote Host", + "autoStart": "Auto Start", "clientAutoStartDesc": "當此桌面用戶端開啟時開始,並保持連線。", "clientManualStartDesc": "使用此行中的“開始”和“停止”按鈕。 Termix 不會自動開啟它。", "clientRemoteServerNote": "遠端轉送可能需要在終端 SSH 伺服器上啟用 AllowTcpForwarding 和 GatewayPorts 選項。當此桌面斷開連線時,遠端連接埠將關閉。", @@ -1294,15 +1490,15 @@ "invalidRemotePort": "遠端連接埠必須介於 1 和 65535 之間。", "invalidLocalTargetPort": "本地目標連接埠必須介於 1 和 65535 之間。", "invalidEndpointPort": "端點連接埠必須介於 1 和 65535 之間。", - "duplicateAutoStartBind": "只能有一個自動啟動客戶端隧道使用 {{bind}}。", + "duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.", "manualControlError": "隧道狀態更新失敗。", - "active": "積極的", - "start": "開始", - "stop": "停止", - "test": "測試", - "type": "隧道類型", - "typeLocal": "本地(-L)", - "typeRemote": "遙控器(-R)", + "active": "Active", + "start": "Start", + "stop": "Stop", + "test": "Test", + "type": "Tunnel Type", + "typeLocal": "Local (-L)", + "typeRemote": "Remote (-R)", "typeDynamic": "動態(-D)", "typeServerLocalDesc": "目前主機到端點。", "typeServerRemoteDesc": "傳回目前主機的端點。", @@ -1310,208 +1506,310 @@ "typeClientRemoteDesc": "傳回本機的端點。", "typeClientDynamicDesc": "本機上的 SOCKS。", "typeDynamicDesc": "透過 SSH 轉送 SOCKS5 CONNECT 流量。", - "forwardDescriptionServerLocal": "目前主機 {{sourcePort}} → 端點 {{endpointPort}}。", - "forwardDescriptionServerRemote": "端點 {{endpointPort}} → 目前主機 {{sourcePort}}。", - "forwardDescriptionServerDynamic": "目前主機上的 SOCKS {{sourcePort}}。", - "forwardDescriptionClientLocal": "本地 {{sourcePort}} → 遠端 {{endpointPort}}。", - "forwardDescriptionClientRemote": "遠端 {{sourcePort}} → 本地 {{endpointPort}}。", - "forwardDescriptionClientDynamic": "本機連接埠上的 SOCKS {{sourcePort}}。", + "forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.", + "forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.", + "forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.", + "forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.", + "forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.", + "forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.", "summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}", "summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}", - "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS 透過 {{endpoint}}", - "autoNameClientLocal": "本地 {{localPort}} → {{endpoint}} {{remotePort}}", - "autoNameClientRemote": "{{endpoint}} {{remotePort}} → 本地 {{localPort}}", - "autoNameClientDynamic": "襪子 {{localPort}} 透過 {{endpoint}}", + "summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}", + "autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}", + "autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}", + "autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}", "route": "路線:", "lastStarted": "上次開始", "lastTested": "上次測試", "lastError": "最後錯誤", - "maxRetries": "最大重試次數", + "maxRetries": "Max Retries", "maxRetriesDescription": "最大重試次數。", - "retryInterval": "重試間隔(秒)", - "retryIntervalDescription": "重試之間需要等待一段時間。", - "local": "本地", - "remote": "偏僻的", + "retryInterval": "Retry Interval (seconds)", + "retryIntervalDescription": "Time to wait between retry attempts.", + "local": "Local", + "remote": "Remote", "destination": "目的地", "host": "主持人", "mode": "模式", - "noHostSelected": "未選擇主機", + "noHostSelected": "No host selected", "working": "在職的..." }, - "serverStats": { - "cpu": "中央處理器", - "memory": "記憶", - "disk": "磁碟", - "network": "網路", - "uptime": "正常運作時間", - "processes": "程序", - "available": "可用的", - "free": "自由的", - "connecting": "正在連接...", - "connectionFailed": "連線伺服器失敗", - "naCpus": "N/A CPU", - "cpuCores_one": "{{count}} 核心", - "cpuCores_other": "{{count}} 核心", - "cpuUsage": "CPU 使用率", - "memoryUsage": "記憶體使用情況", - "diskUsage": "磁碟使用情況", - "failedToFetchHostConfig": "取得主機配置失敗", - "serverOffline": "伺服器離線", - "cannotFetchMetrics": "無法從離線伺服器取得指標", - "totpFailed": "TOTP驗證失敗", - "noneAuthNotSupported": "伺服器統計資訊不支援「無」身份驗證類型。", - "load": "載入", - "systemInfo": "系統資訊", - "hostname": "主機名稱", - "operatingSystem": "作業系統", - "kernel": "核心", - "seconds": "秒", - "networkInterfaces": "網路介面", - "noInterfacesFound": "未找到網路介面", - "noProcessesFound": "未找到任何進程", - "loginStats": "SSH 登入統計訊息", - "noRecentLoginData": "沒有最近的登入數據", - "executingQuickAction": "正在執行 {{name}}...", - "quickActionSuccess": "{{name}} 已成功完成", - "quickActionFailed": "{{name}} 失敗", - "quickActionError": "執行 {{name}} 失敗", + "cardGrid": { + "dragToMove": "Drag to move", + "dragToResize": "Drag to resize", + "changeWidth": "Change width", + "removeCard": "Remove {{label}}", + "addCard": "Add", + "columns": "Columns", + "empty": "No cards. Use Add below to place cards." + }, + "hostMetrics": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "uptime": "Uptime", + "processes": "Processes", + "available": "Available", + "free": "Free", + "connecting": "Connecting...", + "connectionFailed": "Failed to connect to server", + "naCpus": "N/A CPU(s)", + "cpuCores_one": "{{count}} Core", + "cpuCores_other": "{{count}} Cores", + "cpuUsage": "CPU Usage", + "memoryUsage": "Memory Usage", + "diskUsage": "Disk Usage", + "failedToFetchHostConfig": "Failed to fetch host configuration", + "serverOffline": "Server Offline", + "cannotFetchMetrics": "Cannot fetch metrics from offline server", + "totpFailed": "TOTP verification failed", + "noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.", + "noHostSelected": "No host selected", + "load": "Load", + "systemInfo": "System Information", + "hostname": "Hostname", + "operatingSystem": "Operating System", + "kernel": "Kernel", + "seconds": "seconds", + "networkInterfaces": "Network Interfaces", + "noInterfacesFound": "No network interfaces found", + "noProcessesFound": "No processes found", + "processesTotal": "total", + "processesRunning": "running", + "loginStats": "SSH Login Statistics", + "noRecentLoginData": "No recent login data", + "executingQuickAction": "Executing {{name}}...", + "quickActionSuccess": "{{name}} completed successfully", + "quickActionFailed": "{{name}} failed", + "quickActionError": "Failed to execute {{name}}", "ports": { - "title": "監聽埠", - "protocol": "協定", - "port": "連接埠", - "address": "地址", - "process": "過程", - "noData": "無監聽埠數據" + "title": "Listening Ports", + "protocol": "Protocol", + "port": "Port", + "address": "Address", + "process": "Process", + "search": "Search ports...", + "allProtocols": "全部", + "noData": "No listening ports data" }, "firewall": { - "title": "防火牆", - "inactive": "非活躍狀態", - "policy": "政策", - "rules": "規則", - "noData": "沒有可用的防火牆數據", - "action": "行動", - "protocol": "原型", - "port": "連接埠", - "source": "來源", - "anywhere": "任何地方" + "title": "Firewall", + "inactive": "Inactive", + "policy": "Policy", + "rules": "rules", + "noRules": "No rules in this chain", + "noData": "No firewall data available", + "action": "Action", + "protocol": "Proto", + "port": "Port", + "source": "Source", + "anywhere": "Anywhere", + "chains": "chains" }, "loadAvg": "平均負載", "swap": "交換", "architecture": "建築學", - "refresh": "重新整理", - "retry": "重試" + "refresh": "Refresh", + "retry": "Retry", + "customize": "Customize layout", + "reset": "Reset", + "editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.", + "managers": { + "services": "Services", + "processInspector": "Process Inspector", + "logViewer": "Log Viewer", + "cron": "Cron Jobs", + "packages": "Packages", + "ssl": "SSL Certificates", + "firewall": "Firewall", + "users": "Users & Permissions", + "healthCheck": "Health Checks", + "diskBreakdown": "Disk Breakdown", + "systemdTimers": "Timers", + "topMemory": "Top by Memory", + "noData": "No data", + "sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.", + "filter": "Filter...", + "start": "Start", + "stop": "Stop", + "restart": "Restart", + "actionDone": "{{name}} updated", + "actionFailed": "Action failed", + "signalSent": "Signal sent to PID {{pid}}", + "killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).", + "working": "在職的...", + "update": "Update", + "upgradeAll": "Upgrade all", + "allUpToDate": "Everything is up to date", + "save": "Save", + "command": "Command", + "enabled": "Enabled", + "cronSaved": "Crontab updated", + "clients": "Clients", + "dryRun": "Dry run", + "renew": "Renew", + "noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.", + "addInputRule": "Add INPUT rule", + "firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.", + "ruleApplied": "Rule applied", + "invalidPort": "Enter a valid port (1-65535)", + "newUsername": "New username", + "addUser": "Add", + "deleteUser": "Delete user", + "noHealthChecks": "No health checks configured yet.", + "follow": "Follow", + "noLogData": "No log output.", + "tree": "Tree", + "enableDisable": "Enable / disable at boot", + "grantSudo": "Grant sudo", + "revokeSudo": "Revoke sudo", + "sslIssueCert": "Issue certificate", + "sslExpired": "Expired", + "sslInDays": "in {{days}}d", + "sslNeedDomain": "Enter at least one domain", + "sslIssued": "Certificate issued", + "sslDomainsPlaceholder": "example.com, www.example.com", + "sslHttpStandalone": "HTTP (standalone)", + "sslHttpWebroot": "HTTP (webroot)", + "sslDns": "DNS", + "sslDnsProvider": "DNS provider (e.g. cloudflare)", + "sslIssueHint": "DNS provider credentials must already be configured on the host.", + "sslRevoke": "Revoke certificate", + "sslRevoked": "Certificate revoked", + "sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.", + "healthRun": "Run", + "healthName": "Name", + "healthTarget": "Host / address", + "healthAddCheck": "Add check", + "healthSaved": "Health checks saved", + "healthMissingFields": "Each check needs a name and target", + "logFile": "File", + "logUnit": "Unit", + "logCustomPath": "Custom path under /var/log (optional)", + "logGrep": "Filter lines...", + "firewallPersist": "Persist rules", + "firewallPersisted": "Firewall rules persisted" + } }, "auth": { "tagline": "自託管 SSH 和遠端桌面管理", - "loginTitle": "登入 Termix", - "registerTitle": "建立帳戶", - "forgotPassword": "忘記密碼?", - "rememberMe": "記住設備30天(包含TOTP)", - "noAccount": "還沒有帳號?", - "hasAccount": "已有帳號?", - "twoFactorAuth": "雙重身份驗證", - "enterCode": "請輸入驗證碼", - "backupCode": "或使用備用代碼", - "verifyCode": "驗證碼", - "redirectingToApp": "正在重定向到應用程式...", - "sshAuthenticationRequired": "需要 SSH 驗證", - "sshNoKeyboardInteractive": "鍵盤互動式驗證不可用", - "sshAuthenticationFailed": "身份驗證失敗", - "sshAuthenticationTimeout": "身份驗證逾時", - "sshNoKeyboardInteractiveDescription": "伺服器不支援鍵盤互動式身份驗證。請提供您的密碼或SSH密鑰。", - "sshAuthFailedDescription": "您提供的憑證不正確。請使用有效的憑證重試。", - "sshTimeoutDescription": "身份驗證嘗試超時,請重試。", - "sshProvideCredentialsDescription": "請提供您的 SSH 憑證以連接到此伺服器。", - "sshPasswordDescription": "請輸入此 SSH 連線的密碼。", - "sshKeyPasswordDescription": "如果您的 SSH 金鑰已加密,請在此輸入密碼。", + "loginTitle": "Welcome back", + "registerTitle": "Create Account", + "forgotPassword": "Forgot Password?", + "rememberMe": "Remember Device for 30 Days (includes TOTP)", + "noAccount": "Don't have an account?", + "hasAccount": "Already have an account?", + "twoFactorAuth": "Two-Factor Authentication", + "enterCode": "Enter verification code", + "backupCode": "Or use backup code", + "verifyCode": "Verify Code", + "redirectingToApp": "Redirecting to app...", + "sshAuthenticationRequired": "SSH Authentication Required", + "sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable", + "sshAuthenticationFailed": "Authentication Failed", + "sshAuthenticationTimeout": "Authentication Timeout", + "sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.", + "sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.", + "sshTimeoutDescription": "The authentication attempt timed out. Please try again.", + "sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.", + "sshPasswordDescription": "Enter the password for this SSH connection.", + "sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.", "passphraseRequired": "需要密碼", "passphraseRequiredDescription": "SSH金鑰已加密。請輸入密碼短語進行解鎖。", - "back": "後退", - "firstUser": "第一位用戶", - "firstUserMessage": "您是第一個用戶,將被授予管理員權限。您可以在側邊欄使用者下拉式選單中查看管理員設定。如果您認為這是一個錯誤,請查看 Docker 日誌或在 GitHub 上建立一個 issue。", - "external": "外部的", - "loginWithExternal": "使用外部提供者登入", - "loginWithExternalDesc": "使用您設定的外部身分提供者登入", - "externalNotSupportedInElectron": "Electron 應用程式目前尚不支援外部身份驗證。請使用網頁版進行 OIDC 登入。", - "resetPasswordButton": "重設密碼", - "sendResetCode": "發送重置代碼", - "resetCodeDesc": "請輸入您的使用者名稱以取得密碼重設代碼。該程式碼將記錄在 Docker 容器日誌中。", - "resetCode": "重置程式碼", - "verifyCodeButton": "驗證碼", - "enterResetCode": "請輸入 Docker 容器日誌中該使用者的 6 位元代碼:", - "newPassword": "新密碼", - "confirmNewPassword": "確認密碼", - "enterNewPassword": "請輸入使用者的新密碼:", - "signUp": "報名", - "desktopApp": "桌面應用程式", - "loggingInToDesktopApp": "登入桌面應用程式", - "loadingServer": "伺服器正在載入...", - "dataLossWarning": "使用此方法重設密碼將刪除您所有已儲存的 SSH 主機、憑證和其他加密資料。此操作無法撤銷。僅當您忘記密碼且未登入時才使用此方法。", - "authenticationDisabled": "身份驗證已停用", - "authenticationDisabledDesc": "所有身份驗證方式目前均已停用。請聯絡您的管理員。", - "attemptsRemaining": "{{count}} 剩餘嘗試次數" + "back": "Back", + "firstUser": "First User", + "firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.", + "external": "External", + "loginWithExternal": "Login with External Provider", + "loginWithExternalDesc": "Login using your configured external identity provider", + "externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.", + "loginWithProvider": "Login with {{name}}", + "orContinueWith": "or continue with", + "ldapUsername": "LDAP Username", + "ldapPassword": "LDAP Password", + "ldapSignIn": "Sign In", + "ldapLoginFailed": "LDAP login failed", + "resetPasswordButton": "Reset Password", + "sendResetCode": "Send Reset Code", + "resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.", + "resetCode": "Reset Code", + "verifyCodeButton": "Verify Code", + "enterResetCode": "Enter the 6-digit code from the docker container logs for user:", + "newPassword": "New Password", + "confirmNewPassword": "Confirm Password", + "enterNewPassword": "Enter your new password for user:", + "signUp": "Sign Up", + "desktopApp": "Desktop App", + "loggingInToDesktopApp": "Logging in to the desktop app", + "loadingServer": "Loading server...", + "dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.", + "authenticationDisabled": "Authentication Disabled", + "authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.", + "passwordLoginDisabledDesc": "Password login is disabled. Please use an external authentication provider below.", + "attemptsRemaining": "{{count}} attempts remaining" }, "hostKey": { - "verifyNewHost": "驗證 SSH 主機金鑰", - "keyChangedWarning": "SSH主機金鑰已更改", - "firstConnectionTitle": "首次連線到此主機", - "firstConnectionDescription": "無法確認此主機的真實性。請驗證指紋是否符合預期。", - "keyChangedDescription": "此伺服器的主機金鑰自您上次連線以來已變更。這可能表示存在安全問題。", - "previousKey": "上一個密鑰", - "newFingerprint": "新指紋", - "fingerprint": "指紋", - "verifyInstructions": "如果您信任此主機,請按一下「接受」繼續並儲存此指紋以便將來連線。", - "securityWarning": "安全警告", - "acceptAndContinue": "接受並繼續", - "acceptNewKey": "接受新密鑰並繼續" + "verifyNewHost": "Verify SSH Host Key", + "keyChangedWarning": "SSH Host Key Changed", + "firstConnectionTitle": "First time connecting to this host", + "firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.", + "keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.", + "previousKey": "Previous Key", + "newFingerprint": "New Fingerprint", + "fingerprint": "Fingerprint", + "verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.", + "securityWarning": "Security Warning", + "acceptAndContinue": "Accept & Continue", + "acceptNewKey": "Accept New Key & Continue" }, "errors": { - "databaseConnection": "無法連線到資料庫", - "unknownError": "未知錯誤", - "loginFailed": "登入失敗", - "failedPasswordReset": "密碼重置失敗", - "failedVerifyCode": "重置程式碼驗證失敗", - "failedCompleteReset": "密碼重置失敗", - "invalidTotpCode": "無效的 TOTP 程式碼", - "failedOidcLogin": "OIDC 登入啟動失敗", + "databaseConnection": "Could not connect to the database", + "unknownError": "Unknown error", + "loginFailed": "Login failed", + "failedPasswordReset": "Failed to initiate password reset", + "failedVerifyCode": "Failed to verify reset code", + "failedCompleteReset": "Failed to complete password reset", + "invalidTotpCode": "Invalid TOTP code", + "failedOidcLogin": "Failed to start OIDC login", "silentSigninOidcUnavailable": "已請求靜默登錄,但 OIDC 登入不可用。", "failedUserInfo": "登入後取得使用者資訊失敗", - "oidcAuthFailed": "OIDC 驗證失敗", - "invalidAuthUrl": "從後端收到的授權 URL 無效", - "requiredField": "此欄位是必需的", - "minLength": "最小長度為 {{min}}", - "passwordMismatch": "密碼不匹配", - "passwordLoginDisabled": "目前已停用使用者名稱/密碼登入。", - "sessionExpired": "會話已過期 - 請重新登錄", - "totpRateLimited": "頻率限制:TOTP驗證嘗試次數過多。請稍後再試。", - "totpRateLimitedWithTime": "速率限制:TOTP 驗證嘗試次數過多。請稍候 {{time}} 秒後再試。", - "resetCodeRateLimited": "驗證次數過多,請稍後再試。", - "resetCodeRateLimitedWithTime": "驗證次數過多,請稍等 {{time}} 秒後再試。", + "oidcAuthFailed": "OIDC authentication failed", + "invalidAuthUrl": "Invalid authorization URL received from backend", + "requiredField": "This field is required", + "minLength": "Minimum length is {{min}}", + "passwordMismatch": "Passwords do not match", + "passwordLoginDisabled": "Username/password login is currently disabled", + "sessionExpired": "Session expired - please log in again", + "totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.", + "totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.", + "resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.", + "resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.", "authTokenSaveFailed": "保存身份驗證令牌失敗", "failedToLoadServer": "伺服器載入失敗" }, "messages": { - "registrationDisabled": "管理員已停用新帳號註冊功能。請登入或聯絡管理員。", - "userNotAllowed": "您的帳戶未獲得註冊授權。請聯絡管理員。", - "databaseConnectionFailed": "連線資料庫伺服器失敗", - "resetCodeSent": "重置代碼已傳送至 Docker 日誌", - "codeVerified": "程式碼驗證成功", - "passwordResetSuccess": "密碼重置成功", - "loginSuccess": "登入成功", - "registrationSuccess": "註冊成功" + "registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.", + "userNotAllowed": "Your account is not authorized to register. Please contact an administrator.", + "databaseConnectionFailed": "Failed to connect to the database server", + "resetCodeSent": "Reset code sent to Docker logs", + "codeVerified": "Code verified successfully", + "passwordResetSuccess": "Password reset successfully", + "loginSuccess": "Login successful", + "registrationSuccess": "Registration successful" }, "profile": { "c2sTunnelConfigDesc": "針對已設定 SSH 主機的本機桌面隧道。", "c2sTunnelPresets": "客戶端隧道預設", "c2sTunnelPresetsDesc": "將此桌面用戶端的本機隧道清單儲存為命名伺服器預設,或將預設載入回此用戶端。", "c2sTunnelPresetsUnavailable": "客戶端隧道預設僅在桌面用戶端中可用。", - "c2sPresetName": "預設名稱", + "c2sPresetName": "Preset Name", "c2sPresetNamePlaceholder": "客戶預設名稱", "c2sPresetToLoad": "預設載入", "c2sNoPresetSelected": "未選擇預設值", "c2sNoPresets": "未儲存任何預設。", - "c2sLoadPreset": "載入", - "c2sCurrentLocalConfig": "{{count}} 此桌面上配置了本機用戶端隧道。", + "c2sLoadPreset": "Load", + "c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.", "c2sPresetSyncNote": "預設是明確的快照;載入一個預設會取代此桌面用戶端的本機用戶端隧道清單。", "c2sPresetSaved": "客戶端隧道預設已儲存", "c2sPresetLoaded": "客戶端隧道預設已本地加載", @@ -1522,61 +1820,63 @@ "placeholders": { "maxRetries": "3", "retryInterval": "10", - "language": "語言", - "keyPassword": "密鑰密碼", - "pastePrivateKey": "把你的私鑰貼到這裡…", + "language": "Language", + "keyPassword": "key password", + "pastePrivateKey": "Paste your private key here...", "localListenerHost": "127.0.0.1(本地收聽)", "localTargetHost": "127.0.0.1(此計算機上的目標)", "socksListenerHost": "127.0.0.1(SOCKS 監聽器)", - "enterPassword": "請輸入您的密碼", + "enterPassword": "Enter your password", "defaultPort": "22", "defaultEndpointPort": "224" }, "dashboard": { - "title": "儀表板", - "loading": "正在載入儀錶板……", + "title": "Dashboard", + "loading": "Loading dashboard...", "github": "GitHub", - "support": "支援", + "support": "Support", "discord": "Discord", - "serverOverview": "伺服器概覽", - "version": "版本", - "upToDate": "最新", - "updateAvailable": "更新可用", + "docs": "Docs", + "serverOverview": "Server Overview", + "version": "Version", + "upToDate": "Up to Date", + "updateAvailable": "Update Available", "beta": "Beta", - "uptime": "正常運作時間", - "database": "資料庫", - "healthy": "健康", - "error": "錯誤", + "uptime": "Uptime", + "database": "Database", + "healthy": "Healthy", + "error": "Error", "totalHosts": "主持人總數", - "totalTunnels": "隧道總數", - "totalCredentials": "證書總數", - "recentActivity": "近期活動", - "reset": "重置", - "loadingRecentActivity": "正在載入最近的活動……", - "noRecentActivity": "近期無活動", - "quickActions": "快速操作", - "addHost": "新增主機", - "addCredential": "新增憑證", - "adminSettings": "管理員設定", - "userProfile": "用戶個人資料", - "serverStats": "伺服器統計訊息", - "loadingServerStats": "正在載入伺服器統計資料…", - "noServerData": "伺服器資料不可用", - "cpu": "中央處理器", - "ram": "記憶體", - "customizeLayout": "自訂儀錶板", - "dashboardSettings": "儀表板設定", - "enableDisableCards": "啟用/停用卡片", - "resetLayout": "重設為預設值", - "serverOverviewCard": "伺服器概覽", - "recentActivityCard": "近期活動", - "networkGraphCard": "網路圖", - "networkGraph": "網路圖", - "quickActionsCard": "快速操作", - "serverStatsCard": "伺服器統計訊息", + "totalTunnels": "Total Tunnels", + "totalCredentials": "Total Credentials", + "recentActivity": "Recent Activity", + "reset": "Reset", + "loadingRecentActivity": "Loading recent activity...", + "noRecentActivity": "No recent activity", + "quickActions": "Quick Actions", + "addHost": "Add Host", + "addCredential": "Add Credential", + "adminSettings": "Admin Settings", + "userProfile": "User Profile", + "serverStats": "Server Stats", + "loadingServerStats": "Loading server stats...", + "noServerData": "No server data available", + "cpu": "CPU", + "ram": "RAM", + "customizeLayout": "Customize Dashboard", + "dashboardSettings": "Dashboard Settings", + "enableDisableCards": "Enable/Disable Cards", + "resetLayout": "Reset to Default", + "serverOverviewCard": "Server Overview", + "recentActivityCard": "Recent Activity", + "networkGraphCard": "Network Graph", + "networkGraph": "Network Graph", + "quickActionsCard": "Quick Actions", + "serverStatsCard": "Server Stats", "panelMain": "主要的", "panelSide": "邊", - "justNow": "現在" + "justNow": "現在", + "serviceLinks": "Service Links" }, "dashboardTab": { "stable": "穩定的", @@ -1590,297 +1890,432 @@ "noHostsConfigured": "未配置任何主機", "online": "在線的", "offline": "離線", - "onlineLower": "在線的", - "nodes": "{{count}} 節點", + "onlineLower": "Online", + "nodes": "{{count}} nodes", "add": "添加:", "commandPalette": "命令面板", "done": "完畢", "editModeInstructions": "拖曳卡片重新排序 · 拖曳列分隔線調整列寬 · 拖曳卡片底部邊緣調整卡片高度 · 點選垃圾桶圖示刪除卡片", "empty": "空的", - "clear": "清除" + "clear": "Clear", + "serviceLinksTitle": "Service Links", + "serviceLinksEmpty": "No service links yet", + "serviceLinksAddLabel": "Label", + "serviceLinksAddUrl": "URL", + "serviceLinksAdd": "Add", + "serviceLinksLabelPlaceholder": "My Service", + "serviceLinksUrlPlaceholder": "http://192.168.1.10:8080", + "serviceLinksInvalidUrl": "Must be a valid http or https URL", + "disk": "Disk", + "viewServerDetails": "View server details" + }, + "sessionLogs": { + "title": "Session Logs", + "noLogs": "No session logs yet", + "noLogsDesc": "Enable session logging on a host to start recording", + "duration": "Duration", + "viewLog": "View log", + "downloadLog": "Download", + "deleteLog": "Delete", + "confirmDelete": "Delete this session log?", + "confirmDeleteDesc": "This action cannot be undone.", + "copyContent": "Copy", + "copied": "Copied!", + "loadError": "Failed to load session logs", + "deleteError": "Failed to delete session log", + "filterByHost": "Filter by host..." }, "networkGraph": { - "addHost": "新增主機", - "addGroup": "新增群組", - "addLink": "添加連結", - "zoomIn": "放大", - "zoomOut": "縮小", - "resetView": "重置視圖", - "selectHost": "選擇主機", - "chooseHost": "選擇主機…", - "parentGroup": "父群組", - "noGroup": "無組", - "groupName": "組名", - "color": "顏色", - "source": "來源", - "target": "目標", - "moveToGroup": "移至群組", - "selectGroup": "選擇群組...", - "addConnection": "新增連接", - "hostDetails": "主機詳情", - "removeFromGroup": "從群組移除", - "addHostHere": "在此新增主機", - "editGroup": "編輯群組", - "delete": "刪除", - "add": "添加", - "create": "建立", - "move": "移動", - "connect": "連接", - "createGroup": "建立群組", - "selectSourcePlaceholder": "選擇來源...", - "selectTargetPlaceholder": "選擇目標...", - "invalidFile": "無效檔案", - "hostAlreadyExists": "主機已在拓樸結構中", - "connectionExists": "連線已存在", - "unknown": "未知", - "name": "姓名", + "addHost": "Add Host", + "addGroup": "Add Group", + "addLink": "Add Link", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "resetView": "Reset View", + "selectHost": "Select Host", + "chooseHost": "Choose a host...", + "parentGroup": "Parent Group", + "noGroup": "No Group", + "groupName": "Group Name", + "color": "Color", + "source": "Source", + "target": "Target", + "moveToGroup": "Move to Group", + "selectGroup": "Select group...", + "addConnection": "Add Connection", + "hostDetails": "Host Details", + "removeFromGroup": "Remove from Group", + "addHostHere": "Add Host Here", + "editGroup": "Edit Group", + "delete": "Delete", + "add": "Add", + "create": "Create", + "move": "Move", + "connect": "Connect", + "createGroup": "Create Group", + "selectSourcePlaceholder": "Select Source...", + "selectTargetPlaceholder": "Select Target...", + "invalidFile": "Invalid File", + "hostAlreadyExists": "Host is already in the topology", + "connectionExists": "Connection already exists", + "unknown": "Unknown", + "name": "Name", "ip": "IP", - "status": "地位", - "failedToAddNode": "新增節點失敗", - "sourceDifferentFromTarget": "源和目標必須不同", - "exportJSON": "導出 JSON", - "importJSON": "導入 JSON", - "terminal": "終端機", - "fileManager": "檔案管理器", - "tunnel": "隧道", + "status": "Status", + "failedToAddNode": "Failed to add node", + "sourceDifferentFromTarget": "Source and target must be different", + "exportJSON": "Export JSON", + "importJSON": "Import JSON", + "terminal": "Terminal", + "fileManager": "File Manager", + "tunnel": "Tunnel", "docker": "Docker", - "serverStats": "伺服器統計訊息", + "serverStats": "Host Metrics", + "hostMetrics": "Host Metrics", "noNodes": "暫無節點" }, "docker": { - "notEnabled": "此主機未啟用 Docker", - "validating": "正在驗證 Docker...", - "connecting": "正在連接...", - "error": "錯誤", + "notEnabled": "Docker is not enabled for this host", + "validating": "Validating Docker...", + "connecting": "Connecting...", + "error": "Error", "version": "Docker {{version}}", - "connectionFailed": "連線 Docker 失敗", - "containerStarted": "容器 {{name}} 已啟動", - "failedToStartContainer": "啟動容器失敗 {{name}}", - "containerStopped": "容器 {{name}} 已停止", - "failedToStopContainer": "停止容器 {{name}} 失敗", - "containerRestarted": "容器 {{name}} 已重啟", - "failedToRestartContainer": "重啟容器失敗 {{name}}", - "containerPaused": "容器 {{name}} 已暫停", - "containerUnpaused": "容器 {{name}} 已解除暫停", - "failedToTogglePauseContainer": "切換容器 {{name}} 的暫停狀態失敗", - "containerRemoved": "容器 {{name}} 已移除", - "failedToRemoveContainer": "移除容器 {{name}} 失敗", - "image": "影像", - "ports": "連接埠", - "noPorts": "無連接埠", - "start": "開始", - "confirmRemoveContainer": "您確定要刪除容器「{{name}}」嗎?此操作無法撤銷。", - "runningContainerWarning": "警告:此容器目前正在運行。移除此容器會先停止其運作。", - "loadingContainers": "正在裝載貨櫃…", + "connectionFailed": "Failed to connect to Docker", + "containerStarted": "Container {{name}} started", + "failedToStartContainer": "Failed to start container {{name}}", + "containerStopped": "Container {{name}} stopped", + "failedToStopContainer": "Failed to stop container {{name}}", + "containerRestarted": "Container {{name}} restarted", + "failedToRestartContainer": "Failed to restart container {{name}}", + "containerPaused": "Container {{name}} paused", + "containerUnpaused": "Container {{name}} unpaused", + "failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}", + "containerRemoved": "Container {{name}} removed", + "failedToRemoveContainer": "Failed to remove container {{name}}", + "image": "Image", + "ports": "Ports", + "noPorts": "No ports", + "start": "Start", + "confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.", + "runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.", + "loadingContainers": "Loading containers...", "manager": "Docker 管理器", - "autoRefresh": "自動重新整理", + "autoRefresh": "Auto Refresh", "timestamps": "時間戳", "lines": "線條", - "filterLogs": "過濾日誌...", - "refresh": "重新整理", - "download": "下載", - "clear": "清除", + "filterLogs": "Filter logs...", + "refresh": "Refresh", + "download": "Download", + "clear": "Clear", "logsDownloaded": "日誌已成功下載", "last50": "最後50", "last100": "最近100", "last500": "最近500", "last1000": "最近的1000", "allLogs": "所有日誌", - "noLogsMatching": "沒有與「{{query}}」相符的日誌", - "noLogsAvailable": "沒有可用日誌", - "noContainersFound": "未找到容器", - "noContainersFoundHint": "此主機上沒有可用的 Docker 容器", - "searchPlaceholder": "搜尋容器…", + "noLogsMatching": "No logs matching \"{{query}}\"", + "noLogsAvailable": "No logs available", + "noContainersFound": "No containers found", + "noContainersFoundHint": "No Docker containers are available on this host", + "searchPlaceholder": "Search containers...", "allStatuses": "所有狀態", - "stateRunning": "跑步", + "stateRunning": "Running", "statePaused": "暫停", "stateExited": "已退出", "stateRestarting": "重新啟動", - "noContainersMatchFilters": "沒有容器符合您的篩選條件", - "noContainersMatchFiltersHint": "嘗試調整搜尋或篩選條件", - "failedToFetchStats": "取得容器統計資料失敗", - "containerNotRunning": "容器未運行", - "startContainerToViewStats": "啟動容器以查看統計信息", - "loadingStats": "正在載入統計資料…", - "errorLoadingStats": "載入統計資料時出錯", - "noStatsAvailable": "暫無統計數據", - "cpuUsage": "CPU 使用率", - "current": "目前的", - "memoryUsage": "記憶體使用情況", - "networkIo": "網路 I/O", - "input": "輸入", - "output": "輸出", - "blockIo": "塊 I/O", - "read": "讀", - "write": "寫", - "pids": "PID", - "containerInformation": "容器資訊", - "name": "姓名", + "noContainersMatchFilters": "No containers match your filters", + "noContainersMatchFiltersHint": "Try adjusting your search or filter criteria", + "failedToFetchStats": "Failed to fetch container statistics", + "containerNotRunning": "Container not running", + "startContainerToViewStats": "Start the container to view statistics", + "loadingStats": "Loading statistics...", + "errorLoadingStats": "Error loading statistics", + "noStatsAvailable": "No statistics available", + "cpuUsage": "CPU Usage", + "current": "Current", + "memoryUsage": "Memory Usage", + "networkIo": "Network I/O", + "input": "Input", + "output": "Output", + "blockIo": "Block I/O", + "read": "Read", + "write": "Write", + "pids": "PIDs", + "containerInformation": "Container Information", + "name": "Name", "id": "ID", - "state": "狀態", - "containerMustBeRunning": "容器必須正在運行才能存取控制台", - "verificationCodePrompt": "請輸入驗證碼", - "totpVerificationFailed": "TOTP驗證失敗,請重試。", - "warpgateVerificationFailed": "Warpgate身份驗證失敗,請重試。", - "connectedTo": "已連接至 {{containerName}}", - "disconnected": "斷開連接", - "consoleError": "控制台錯誤", - "errorMessage": "錯誤: {{message}}", - "failedToConnect": "連線容器失敗", - "console": "控制台", - "selectShell": "選擇 shell", + "state": "State", + "containerMustBeRunning": "Container must be running to access console", + "verificationCodePrompt": "Enter verification code", + "totpVerificationFailed": "TOTP verification failed. Please try again.", + "warpgateVerificationFailed": "Warpgate authentication failed. Please try again.", + "connectedTo": "Connected to {{containerName}}", + "disconnected": "Disconnected", + "consoleError": "Console error", + "errorMessage": "Error: {{message}}", + "failedToConnect": "Failed to connect to container", + "console": "Console", + "selectShell": "Select shell", "bash": "Bash", "sh": "sh", "ash": "ash", - "connect": "連接", - "disconnect": "斷開", - "notConnected": "未連接", - "clickToConnect": "按一下「連線」以啟動 shell 會話", - "connectingTo": "正在連接到 {{containerName}}...", - "containerNotFound": "未找到容器", - "backToList": "返回列表", - "logs": "紀錄", - "stats": "統計數據", - "consoleTab": "控制台", - "startContainerToAccess": "啟動容器以存取控制台" + "connect": "Connect", + "disconnect": "Disconnect", + "notConnected": "Not connected", + "clickToConnect": "Click connect to start a shell session", + "connectingTo": "Connecting to {{containerName}}...", + "containerNotFound": "Container not found", + "backToList": "Back to List", + "logs": "Logs", + "stats": "Stats", + "consoleTab": "Console", + "startContainerToAccess": "Start the container to access the console" }, "admin": { - "sectionGeneral": "一般的", + "sectionGeneral": "General", "sectionOidc": "OIDC", - "sectionUsers": "使用者", + "sectionSso": "SSO Providers", + "ssoAddProvider": "Add Provider", + "ssoDocsLink": "View docs", + "ssoProviderDocsLink": "View docs", + "ssoNoProviders": "No SSO providers configured.", + "ssoProviderName": "Display Name", + "ssoProviderType": "Provider Type", + "ssoDeleteProvider": "Delete Provider", + "ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.", + "ssoTypeOidc": "OIDC", + "ssoTypeLdap": "LDAP", + "ssoTypeGithub": "GitHub", + "ssoTypeGoogle": "Google", + "ssoEnabled": "Enabled", + "ssoDisabled": "Disabled", + "ssoSaveProvider": "Save Provider", + "ssoTestConnection": "Test Connection", + "ssoEditProvider": "Edit Provider", + "ldapHost": "LDAP Host", + "ldapPort": "Port", + "ldapUseTls": "Use TLS (LDAPS)", + "ldapBindDn": "Bind DN", + "ldapBindPassword": "Bind Password", + "ldapUserSearchBase": "User Search Base", + "ldapUserSearchFilter": "User Search Filter", + "ldapUsernameAttr": "Username Attribute", + "ldapDisplayNameAttr": "Display Name Attribute", + "ldapGroupSearchBase": "Group Search Base", + "ldapAdminGroup": "Admin Group", + "ldapAllowedUsers": "Allowed Users", + "sectionUsers": "Users", "sectionSessions": "會議", - "sectionRoles": "角色", - "sectionDatabase": "資料庫", + "sectionRoles": "Roles", + "sectionDatabase": "Database", "sectionApiKeys": "API金鑰", + "sectionAuditLog": "Audit Log", + "sectionSsl": "SSL / Let's Encrypt", + "sslDescription": "Automatically issue and renew a trusted SSL certificate from Let's Encrypt. Requires a public domain and port 80 or DNS access.", + "sslDocsLink": "View SSL docs", + "sslDomain": "Domain", + "sslDomainPlaceholder": "termix.example.com", + "sslDomainDesc": "The public domain name for the certificate.", + "sslEmail": "Email", + "sslEmailPlaceholder": "admin@example.com", + "sslEmailDesc": "Contact email for Let's Encrypt notifications and account.", + "sslChallengeType": "Challenge Type", + "sslChallengeTypeDesc": "How to prove domain ownership to Let's Encrypt.", + "sslChallengeHttp": "HTTP (webroot) - requires port 80 accessible from the internet", + "sslChallengeDns": "DNS (Cloudflare) - requires a Cloudflare API token", + "sslCloudflareToken": "Cloudflare API Token", + "sslCloudflareTokenPlaceholder": "Enter token...", + "sslCloudflareTokenDesc": "Scoped token with Zone:DNS:Edit permission for your domain.", + "sslCertStatus": "Certificate Status", + "sslCertStatusNone": "No certificate", + "sslCertStatusValid": "Valid", + "sslCertStatusExpiring": "Expiring soon", + "sslCertStatusExpired": "Expired", + "sslCertExpiresAt": "Expires {{date}}", + "sslLastIssued": "Last issued {{date}}", + "sslRequestCert": "Issue / Renew Certificate", + "sslRequestCertLoading": "Requesting certificate...", + "sslRequestCertSuccess": "Certificate issued and installed successfully", + "sslRequestCertFailed": "Certificate request failed", + "sslSave": "Save Settings", + "sslSaved": "SSL settings saved", + "sslSaveFailed": "Failed to save SSL settings", + "sslRequiresDomain": "Domain and email are required", + "sslInfoNote": "After issuing a certificate, enable SSL in your environment variables (ENABLE_SSL=true) and restart Termix.", + "auditLogTotal": "{{total}} total entries", + "auditLogEmpty": "No audit log entries found", + "auditLogSuccess": "Success", + "auditLogFailed": "Failed", + "auditLogClearFilters": "清除篩選條件", + "auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)", + "auditLogIp": "IP", + "auditLogResourceId": "Resource ID", + "auditLogFilterUser": "User", + "auditLogFilterAction": "Action", + "auditLogFilterResourceType": "Resource Type", + "auditLogFilterStatus": "Status", + "auditLogFilterFrom": "From", + "auditLogFilterTo": "To", + "auditLogFilterAll": "全部", "allowRegistration": "允許用戶註冊", - "allowRegistrationDesc": "允許新用戶自助註冊", + "allowRegistrationDesc": "Let new users self-register with a username and password", "allowPasswordLogin": "允許密碼登入", "allowPasswordLoginDesc": "使用者名稱/密碼登入", "oidcAutoProvision": "OIDC自動配置", - "oidcAutoProvisionDesc": "即使註冊功能已停用,也應自動為 OIDC 使用者建立帳戶。", + "oidcAutoProvisionDesc": "Auto-create accounts for OIDC/SSO users on first login (independent of the registration toggle)", + "oidcSilentLoginDefault": "Silent OIDC Login by Default", + "oidcSilentLoginDefaultDesc": "Automatically redirect to OIDC login on every visit, skipping the login form entirely", "allowPasswordReset": "允許重置密碼", "allowPasswordResetDesc": "透過 Docker 日誌重置程式碼", + "commandHistoryEnabled": "Command History", + "commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.", + "updateCommandHistoryFailed": "Failed to update command history setting", "sessionTimeout": "會話逾時", - "hours": "小時", + "hours": "hours", "sessionTimeoutRange": "最短 1 小時 · 最長 720 小時", - "monitoringDefaults": "監控預設設定", + "monitoringDefaults": "Monitoring Defaults", "statusCheck": "狀態檢查", - "metrics": "指標", + "metrics": "Metrics", "sec": "秒", "logLevel": "日誌等級", "enableGuacamole": "啟用酪梨醬", "enableGuacamoleDesc": "RDP/VNC遠端桌面", + "enableGuacamoleDocsLink": "View docs", "guacdUrl": "guacd URL", + "tailscaleApiKey": "Tailscale API Key", + "tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.", + "tailscaleApiKeyDocsLink": "View docs", "oidcDescription": "配置 OpenID Connect 以實現單一登入。標示 * 的欄位為必填項。", - "oidcClientId": "客戶ID", - "oidcClientSecret": "客戶機密", - "oidcAuthUrl": "授權 URL", - "oidcIssuerUrl": "發行者 URL", - "oidcTokenUrl": "令牌 URL", - "oidcUserIdentifier": "使用者標識符路徑", - "oidcDisplayName": "顯示名稱路徑", - "oidcScopes": "瞄準鏡", + "oidcDocsLink": "View docs", + "oidcClientId": "Client ID", + "oidcClientSecret": "Client Secret", + "oidcAuthUrl": "Authorization URL", + "oidcIssuerUrl": "Issuer URL", + "oidcTokenUrl": "Token URL", + "oidcUserIdentifier": "User Identifier Path", + "oidcDisplayName": "Display Name Path", + "oidcScopes": "Scopes", "oidcUserinfoUrl": "覆蓋使用者資訊 URL", - "oidcAllowedUsers": "允許的用戶", + "oidcAllowedUsers": "Allowed Users", "oidcAllowedUsersDesc": "每行一個電子郵件地址。留空則允許所有電子郵件地址。", - "removeOidc": "消除", - "usersCount": "{{count}} 用戶", - "createUser": "創造", + "oidcAdminGroup": "Admin Group", + "oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.", + "oidcGroupClaim": "Group Claim", + "oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).", + "oidcCaCert": "Custom CA Certificate", + "oidcCaCertDesc": "Optional. PEM-encoded CA certificate for OIDC providers using a private or self-signed CA. Leave empty to use the system trust store.", + "removeOidc": "Remove", + "usersCount": "{{count}} users", + "createUser": "Create", "newRole": "新角色", - "roleName": "姓名", - "roleDisplayName": "顯示名稱", - "roleDescription": "描述", - "rolesCount": "{{count}} 角色", - "createRole": "創造", - "creating": "正在創建…", + "roleName": "Name", + "roleDisplayName": "Display Name", + "roleDescription": "Description", + "rolesCount": "{{count}} roles", + "createRole": "Create", + "creating": "Creating...", "exportDatabase": "匯出資料庫", "exportDatabaseDesc": "下載所有主機、憑證和設定的備份", - "export": "出口", - "exporting": "出口...", + "export": "Export", + "exporting": "Exporting...", "importDatabase": "導入資料庫", "importDatabaseDesc": "從 .sqlite 備份檔案恢復", - "importDatabaseSelected": "已選擇: {{name}}", + "importDatabaseSelected": "Selected: {{name}}", "selectFile": "選擇文件", - "changeFile": "改變", - "import": "進口", - "importing": "輸入...", - "apiKeysCount": "{{count}} 鍵", + "changeFile": "Change", + "import": "Import", + "importing": "Importing...", + "apiKeysCount": "{{count}} keys", + "apiKeysDocsLink": "View docs", "newApiKey": "新 API 金鑰", "apiKeyCreatedWarning": "密鑰已建立 - 立即複製,之後不會再顯示。", - "apiKeyName": "姓名", - "apiKeyUser": "使用者", + "apiKeyName": "Name", + "apiKeyUser": "User", "apiKeySelectUser": "選擇用戶...", - "apiKeyExpiresAt": "到期時間", + "apiKeyExpiresAt": "Expires At", "createKey": "建立密鑰", "apiKeyNoExpiry": "無有效期限", "revokedBadge": "撤銷", - "authTypeDual": "雙重認證", + "authTypeDual": "Dual Auth", "authTypeOidc": "OIDC", - "authTypeLocal": "當地的", - "adminStatusAdministrator": "行政人員", - "adminStatusRegularUser": "普通用戶", + "authTypeLocal": "Local", + "adminStatusAdministrator": "Administrator", + "adminStatusRegularUser": "Regular User", "adminBadge": "行政", "systemBadge": "系統", "customBadge": "風俗", "youBadge": "你", - "sessionsActive": "{{count}} 活躍", - "sessionActive": "目前狀態: {{time}}", + "sessionsActive": "{{count}} active", + "sessionActive": "Active: {{time}}", "sessionExpires": "Exp: {{time}}", "revokeAll": "全部", "revokeAllSessionsSuccess": "該使用者的所有會話均已撤銷。", - "revokeAllSessionsFailed": "撤銷會話失敗", - "revokeSessionFailed": "撤銷會話失敗", + "revokeAllSessionsFailed": "Failed to revoke sessions", + "revokeSessionFailed": "Failed to revoke session", "addRole": "添加角色", "noCustomRoles": "未訂自訂角色", - "removeRoleFailed": "移除角色失敗", - "assignRoleFailed": "角色分配失敗", - "deleteRoleFailed": "刪除角色失敗", - "userAdminAccess": "行政人員", + "removeRoleFailed": "Failed to remove role", + "assignRoleFailed": "Failed to assign role", + "deleteRoleFailed": "Failed to delete role", + "userAdminAccess": "Administrator", "userAdminAccessDesc": "完全訪問所有管理員設置", - "userRoles": "角色", - "revokeAllUserSessions": "撤銷所有會話", + "userRoles": "Roles", + "revokeAllUserSessions": "Revoke All Sessions", "revokeAllUserSessionsDesc": "強制所有裝置重新登入", - "revoke": "撤銷", + "revoke": "Revoke", "deleteUserWarning": "刪除此用戶是永久性的。", - "deleteUser": "刪除 {{username}}", - "deleting": "正在刪除…", - "deleteUserFailed": "刪除用戶失敗", - "deleteUserSuccess": "使用者「{{username}}」已刪除", - "deleteRoleSuccess": "角色「{{name}}」已刪除", - "revokeKeySuccess": "金鑰「{{name}}」已撤銷", + "deleteUser": "Delete {{username}}", + "deleting": "Deleting...", + "deleteUserFailed": "Failed to delete user", + "deleteUserSuccess": "User \"{{username}}\" deleted", + "deleteRoleSuccess": "Role \"{{name}}\" deleted", + "revokeKeySuccess": "Key \"{{name}}\" revoked", "revokeKeyFailed": "撤銷金鑰失敗", - "copiedToClipboard": "已複製到剪貼簿", + "copiedToClipboard": "Copied to clipboard", "done": "完畢", - "createUserTitle": "創建用戶", + "createUserTitle": "Create User", "createUserDesc": "建立一個新的本機帳戶。", - "createUserUsername": "使用者名稱", - "createUserPassword": "密碼", + "createUserUsername": "Username", + "createUserPassword": "Password", "createUserPasswordHint": "至少6個字元。", - "createUserEnterUsername": "請輸入使用者名稱", - "createUserEnterPassword": "輸入密碼", - "createUserSubmit": "創建用戶", - "editUserTitle": "管理用戶: {{username}}", + "createUserEnterUsername": "Enter username", + "createUserEnterPassword": "Enter password", + "createUserSubmit": "Create User", + "editUserTitle": "Manage User: {{username}}", "editUserDesc": "編輯角色、管理員狀態、會話和帳戶設定。", - "editUserUsername": "使用者名稱", + "editUserUsername": "Username", "editUserAuthType": "身份驗證類型", - "editUserAdminStatus": "管理員狀態", - "editUserUserId": "使用者身分", - "linkAccountTitle": "將 OIDC 連結到密碼帳戶", - "linkAccountDesc": "將 OIDC 帳戶 {{username}} 與現有本地帳戶合併。", + "editUserAdminStatus": "Admin Status", + "editUserUserId": "User ID", + "linkAccountTitle": "Link Accounts", + "linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.", + "linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.", "linkAccountWarningTitle": "這將:", "linkAccountEffect1": "刪除僅包含 OIDC 的帳戶", "linkAccountEffect2": "將 OIDC 登入資訊新增至目標帳戶", "linkAccountEffect3": "允許同時使用 OIDC 和密碼登入", - "linkAccountTargetUsername": "目標使用者名稱", + "linkAccountTargetUsername": "Local Account Username", "linkAccountTargetPlaceholder": "輸入要關聯的本機帳戶使用者名稱", - "linkAccounts": "關聯帳戶", - "linkAccountSuccess": "OIDC 帳戶關聯到“{{username}}”", - "linkAccountFailed": "OIDC帳戶關聯失敗", - "linkAccountInProgress": "正在連接…", - "saving": "儲存...", + "linkAccountOidcUsername": "OIDC Account Username", + "linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in", + "linkAccountOidcNotFound": "No OIDC-only account found with that username", + "linkAccounts": "Link Accounts", + "linkAccountSuccess": "Accounts linked successfully", + "linkAccountFailed": "Failed to link accounts", + "linkAccountInProgress": "Linking...", + "unlinkAccountTitle": "Unlink OIDC", + "unlinkAccountDesc": "Remove OIDC authentication from {{username}}. They will only be able to log in with their password.", + "unlinkAccountWarning": "This will remove OIDC login from this account. The user must have a password set to continue logging in.", + "unlinkAccount": "Unlink OIDC", + "unlinkAccountInProgress": "Unlinking...", + "unlinkAccountSuccess": "OIDC unlinked successfully", + "unlinkAccountFailed": "Failed to unlink OIDC", + "saving": "Saving...", "updateRegistrationFailed": "註冊設定更新失敗", "updatePasswordLoginFailed": "更新密碼登入設定失敗", + "cannotDisablePasswordLoginWithTotp": "Cannot disable password login while 2FA is enabled for one or more users. Disable 2FA first.", "updateOidcAutoProvisionFailed": "更新 OIDC 自動配置設定失敗", + "updateOidcSilentLoginDefaultFailed": "Failed to update silent OIDC login setting", "updatePasswordResetFailed": "密碼重置設定更新失敗", "sessionTimeoutRange2": "會話逾時時間必須介於 1 小時到 720 小時之間。", "sessionTimeoutSaved": "會話逾時已儲存", @@ -1888,52 +2323,74 @@ "monitoringIntervalInvalid": "無效的區間值", "monitoringSaved": "已儲存的監控設定", "monitoringSaveFailed": "儲存監控設定失敗", - "guacamoleSaved": "酪梨醬設定已儲存", + "guacamoleSaved": "Guacamole settings saved", "guacamoleSaveFailed": "儲存 Guacamole 設定失敗", "guacamoleUpdateFailed": "更新 Guacamole 設定失敗", + "tailscaleSettingsSaved": "Tailscale settings saved", + "tailscaleSettingsSaveFailed": "Failed to save Tailscale settings", "logLevelUpdateFailed": "更新日誌等級失敗", "oidcSaved": "OIDC 配置已儲存", "oidcSaveFailed": "儲存 OIDC 配置失敗", "oidcRemoved": "已移除 OIDC 配置", "oidcRemoveFailed": "移除 OIDC 配置失敗", "createUserRequired": "需要使用者名稱和密碼。", - "createUserPasswordTooShort": "密碼長度必須至少為 6 個字符", - "createUserSuccess": "使用者「{{username}}」創建", - "createUserFailed": "建立使用者失敗", + "createUserPasswordTooShort": "Password must be at least 6 characters", + "createUserSuccess": "User \"{{username}}\" created", + "createUserFailed": "Failed to create user", "updateAdminStatusFailed": "更新管理員狀態失敗", "allSessionsRevoked": "所有會話均被撤銷", - "revokeSessionsFailed": "撤銷會話失敗", + "revokeSessionsFailed": "Failed to revoke sessions", "createRoleRequired": "姓名和顯示名稱是必填項。", - "createRoleSuccess": "角色“{{name}}”已創建", + "createRoleSuccess": "Role \"{{name}}\" created", "createRoleFailed": "創建角色失敗", "apiKeyNameRequired": "密鑰名稱為必填項", "apiKeyUserRequired": "需要使用者 ID", - "apiKeyCreatedSuccess": "API 金鑰「{{name}}」已建立", + "apiKeyCreatedSuccess": "API key \"{{name}}\" created", "apiKeyCreateFailed": "建立 API 金鑰失敗", "exportSuccess": "資料庫已成功匯出", "exportFailed": "資料庫匯出失敗", "importSelectFile": "請先選擇文件。", - "importCompleted": "匯入完成:已匯入 {{total}} 項,跳過 {{skipped}} 項", - "importFailed": "導入失敗: {{error}}", - "importError": "資料庫導入失敗" + "importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped", + "importFailed": "Import failed: {{error}}", + "importError": "資料庫導入失敗", + "sectionHostDefaults": "Host Defaults", + "hostDefaultsDesc": "Settings applied automatically when creating a new host. Individual hosts can still override these.", + "hostDefaultsSocks5": "SOCKS5 Proxy", + "hostDefaultsUseSocks5": "Enable SOCKS5 Proxy", + "hostDefaultsUseSocks5Desc": "Pre-fill SOCKS5 proxy on all new hosts", + "hostDefaultsSocks5Host": "Proxy Host / Port", + "hostDefaultsSocks5Username": "Proxy Username", + "hostDefaultsSocks5Password": "Proxy Password", + "hostDefaultsMetrics": "Host Metrics", + "hostDefaultsMetricsEnabled": "Enable Metrics", + "hostDefaultsMetricsEnabledDesc": "Collect CPU, memory, and other stats on new hosts by default", + "hostDefaultsStatusCheckEnabled": "Enable Status Check", + "hostDefaultsStatusCheckEnabledDesc": "Poll online/offline status on new hosts by default", + "hostDefaultsTerminal": "Terminal", + "hostDefaultsSessionLogging": "Session Logging", + "hostDefaultsSessionLoggingDesc": "Record terminal sessions on new hosts by default", + "hostDefaultsCommandHistory": "Command History", + "hostDefaultsCommandHistoryDesc": "Track command history on new hosts by default", + "hostDefaultsSaved": "Host defaults saved", + "hostDefaultsSaveFailed": "Failed to save host defaults" }, "newUi": { "sidebar": { "quickConnect": { "hostLabel": "主持人", - "hostPlaceholder": "192.168.1.1 或 example.com", - "portLabel": "港口", + "hostPlaceholder": "192.168.1.1 or example.com", + "portLabel": "Port", "portPlaceholder": "22", - "usernameLabel": "使用者名稱", - "usernamePlaceholder": "使用者名稱", + "usernameLabel": "Username", + "usernamePlaceholder": "username", "authLabel": "身份驗證", - "passwordLabel": "密碼", - "passwordPlaceholder": "密碼", - "privateKeyLabel": "私鑰", + "passwordLabel": "Password", + "passwordPlaceholder": "password", + "privateKeyLabel": "Private Key", "privateKeyPlaceholder": "貼上私鑰…", - "credentialLabel": "憑證", + "credentialLabel": "Credential", "credentialPlaceholder": "選擇已儲存的憑證", - "connectToTerminal": "連接到終端", + "connectToTerminal": "Connect to Terminal", "connectToFiles": "連接到文件" }, "history": { @@ -1943,19 +2400,19 @@ "clearAll": "全部清除", "noHistoryEntries": "無歷史記錄", "trackingDisabled": "歷史記錄追蹤已停用", - "trackingDisabledHint": "在個人資料設定中啟用此功能即可錄製指令。" + "trackingDisabledHint": "Enable it in the host's terminal settings." }, "sshTools": { - "keyRecordingTitle": "關鍵錄音", + "keyRecordingTitle": "Key Recording", "recordToTerminals": "記錄到終端", "selectAll": "全部", - "selectNone": "沒有任何", + "selectNone": "None", "noTerminalTabsOpen": "沒有打開任何終端標籤頁。", "selectTerminalsAbove": "選擇上方終端", "broadcastInputPlaceholder": "在此輸入以廣播按鍵操作…", "stopRecording": "停止錄製", "startRecording": "開始錄製", - "settingsTitle": "設定", + "settingsTitle": "Settings", "enableRightClickCopyPaste": "啟用右鍵複製/貼上" }, "splitScreen": { @@ -1967,137 +2424,183 @@ "dragTabsHint": "將標籤拖曳到上方窗格,或使用快速指派功能。", "dropHere": "落在這裡", "emptyPane": "空的", - "dashboard": "儀表板", + "dashboard": "Dashboard", "clearSplitScreen": "清晰的分割畫面", "quickAssign": "快速分配", - "alreadyAssigned": "窗格 {{index}}", + "alreadyAssigned": "Pane {{index}}", "splitTab": "分頁標籤", "addToSplit": "添加到拆分", "removeFromSplit": "從分割中移除", - "assignToPane": "指派到窗格" + "assignToPane": "指派到窗格", + "hotkeysTitle": "Keyboard Shortcuts", + "hotkeysSplitRight": "Toggle 2-way split", + "hotkeysSplitBelow": "Toggle 3-way split", + "hotkeysNavigatePane": "Navigate panes", + "hotkeysNextTab": "Next tab", + "hotkeysPrevTab": "Previous tab" }, "snippets": { - "createSnippetTitle": "建立程式碼片段", - "createSnippetDescription": "建立一個新的命令片段以便快速執行", - "nameLabel": "姓名", - "namePlaceholder": "例如,重啟 Nginx", - "descriptionLabel": "描述", - "descriptionPlaceholder": "選用描述", - "optional": "選修的", - "folderLabel": "資料夾", - "noFolder": "無資料夾(未分類)", - "commandLabel": "命令", - "commandPlaceholder": "例如,sudo systemctl restart nginx", - "cancel": "取消", - "createSnippetButton": "建立程式碼片段", - "createFolderTitle": "建立資料夾", - "createFolderDescription": "將你的程式碼片段整理到資料夾中", - "folderNameLabel": "資料夾名稱", - "folderNamePlaceholder": "例如:系統指令、Docker腳本", - "folderColorLabel": "資料夾顏色", - "folderIconLabel": "資料夾圖示", - "previewLabel": "預覽", - "folderNameFallback": "資料夾名稱", - "createFolderButton": "建立資料夾", + "title": "Snippets", + "createSnippetTitle": "Create Snippet", + "createSnippetDescription": "Create a new command snippet for quick execution", + "nameLabel": "Name", + "namePlaceholder": "e.g., Restart Nginx", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Optional description", + "optional": "Optional", + "folderLabel": "Folder", + "noFolder": "No folder (Uncategorized)", + "commandLabel": "Command", + "commandPlaceholder": "e.g., sudo systemctl restart nginx", + "cancel": "Cancel", + "createSnippetButton": "Create Snippet", + "createFolderTitle": "Create Folder", + "createFolderDescription": "Organize your snippets into folders", + "folderNameLabel": "Folder Name", + "folderNamePlaceholder": "e.g., System Commands, Docker Scripts", + "folderColorLabel": "Folder Color", + "folderIconLabel": "Folder Icon", + "previewLabel": "Preview", + "folderNameFallback": "Folder Name", + "createFolderButton": "Create Folder", "targetTerminals": "目標終端", "selectAll": "全部", - "selectNone": "沒有任何", + "selectNone": "None", "noTerminalTabsOpen": "沒有打開任何終端標籤頁。", - "searchPlaceholder": "搜尋摘要…", - "newSnippet": "新程式碼片段", - "newFolder": "新建資料夾", - "run": "跑步", + "searchPlaceholder": "Search snippets...", + "newSnippet": "New Snippet", + "newFolder": "New Folder", + "run": "Run", "noSnippetsInFolder": "此資料夾中沒有程式碼片段", - "uncategorized": "未分類", - "editSnippetTitle": "編輯片段", + "uncategorized": "Uncategorized", + "editSnippetTitle": "Edit Snippet", "editSnippetDescription": "更新此指令片段", "saveSnippetButton": "儲存變更", - "createSuccess": "程式碼片段創建成功", - "createFailed": "建立程式碼片段失敗", - "updateSuccess": "程式碼片段已成功更新", - "updateFailed": "更新程式碼片段失敗", - "deleteFailed": "刪除程式碼片段失敗", - "folderCreateSuccess": "資料夾建立成功", - "folderCreateFailed": "建立資料夾失敗", - "editFolderTitle": "編輯資料夾", + "createSuccess": "Snippet created successfully", + "createFailed": "Failed to create snippet", + "updateSuccess": "Snippet updated successfully", + "updateFailed": "Failed to update snippet", + "deleteFailed": "Failed to delete snippet", + "folderCreateSuccess": "Folder created successfully", + "folderCreateFailed": "Failed to create folder", + "editFolderTitle": "Edit Folder", "editFolderDescription": "重新命名或更改此資料夾的外觀", "saveFolderButton": "儲存變更", "editFolder": "編輯資料夾", "deleteFolder": "刪除資料夾", - "folderDeleteSuccess": "資料夾「{{name}}」已刪除", - "folderDeleteFailed": "刪除資料夾失敗", - "folderEditSuccess": "資料夾已成功更新", - "folderEditFailed": "更新資料夾失敗", - "confirmRunMessage": "運行“{{name}}”?", - "confirmRunButton": "跑步", - "runSuccess": "在 {{count}} 終端機中執行“{{name}}”", - "copySuccess": "已將「{{name}}」複製到剪貼簿", + "folderDeleteSuccess": "Folder \"{{name}}\" deleted", + "folderDeleteFailed": "Failed to delete folder", + "folderEditSuccess": "Folder updated successfully", + "folderEditFailed": "Failed to update folder", + "confirmRunMessage": "Run \"{{name}}\"?", + "confirmRunButton": "Run", + "runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)", + "copySuccess": "Copied \"{{name}}\" to clipboard", "shareTitle": "分享片段", - "shareUser": "使用者", - "shareRole": "角色", + "shareUser": "User", + "shareRole": "Role", "selectUser": "選擇用戶...", "selectRole": "選擇一個角色…", "shareSuccess": "程式碼片段已成功分享", "shareFailed": "分享片段失敗", "revokeSuccess": "存取權限已撤銷", - "revokeFailed": "撤銷存取權限失敗", - "currentAccess": "目前存取權限", + "revokeFailed": "Failed to revoke access", + "currentAccess": "Current Access", "shareLoadError": "共享資料載入失敗", - "loading": "載入中...", - "close": "關閉", - "reorderFailed": "儲存程式碼片段順序失敗" + "loading": "Loading...", + "close": "Close", + "reorderFailed": "儲存程式碼片段順序失敗", + "importExport": "進出口", + "exportBtn": "Export JSON", + "importBtn": "Import JSON", + "exportSuccess": "Snippets exported successfully", + "exportFailed": "Failed to export snippets", + "importTitle": "Import Snippets", + "importDescription": "Import snippets and folders from a JSON file exported by Termix", + "importDropOrClick": "Drop a JSON file here or click to browse", + "importSelectedFile": "Selected: {{name}}", + "importOverwrite": "Overwrite existing snippets with the same name and folder", + "importStartBtn": "Import", + "importSuccess": "Import complete: {{snippets}} snippet(s) added, {{updated}} updated, {{skipped}} skipped, {{folders}} folder(s) added", + "importFailed": "Failed to import snippets", + "importInvalidFile": "Invalid file: expected a JSON object with snippets or folders arrays", + "targetHostsLabel": "Target Hosts", + "targetHostsHint": "Assign hosts to run this snippet directly without an open terminal.", + "noHostsAvailable": "未配置任何主機", + "clearTargetHosts": "Clear all", + "hasTargetHosts": "Has target hosts", + "runOnTargets": "Run on Targets", + "directRunSuccess": "Ran \"{{name}}\" on {{count}} host(s)", + "directRunPartialFail": "\"{{name}}\" failed on one or more hosts", + "executionResultTitle": "Execution Results: {{name}}", + "executionResultDescription": "Output from running the snippet on each target host.", + "executionSuccess": "Success", + "executionFailed": "Failed" }, "userProfile": { - "sectionAccount": "帳戶", - "sectionAppearance": "外貌", - "sectionSecurity": "安全", + "storageModeLocal": "Browser", + "storageModeCloud": "Database", + "storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.", + "resetToDefaults": "Reset to Defaults", + "resetToDefaultsSuccess": "Settings reset to defaults.", + "storageModeSwitch": "Preference Storage", + "sectionAccount": "Account", + "sectionAppearance": "Appearance", + "sectionSecurity": "Security", "sectionApiKeys": "API金鑰", "sectionC2sTunnels": "C2S隧道", - "usernameLabel": "使用者名稱", - "roleLabel": "角色", - "roleAdministrator": "行政人員", + "usernameLabel": "Username", + "roleLabel": "Role", + "roleAdministrator": "Administrator", "authMethodLabel": "身份驗證方法", - "authMethodLocal": "當地的", + "authMethodLocal": "Local", "twoFaLabel": "雙因素認證", "twoFaOn": "在", "twoFaOff": "離開", - "versionLabel": "版本", - "deleteAccount": "刪除帳戶", + "versionLabel": "Version", + "deleteAccount": "Delete Account", "deleteAccountDescription": "永久刪除您的帳戶", - "deleteButton": "刪除", + "changeServerDescription": "Switch to a different Termix backend server", + "deleteButton": "Delete", "deleteAccountPermanent": "此操作不可逆轉,且無法撤銷。", "deleteAccountWarning": "所有會話、主機、憑證和設定都將永久刪除。", - "confirmPasswordDeletePlaceholder": "請輸入密碼以確認", - "languageLabel": "語言", - "themeLabel": "主題", - "fontSizeLabel": "字體大小", + "confirmPasswordDeletePlaceholder": "Enter your password to confirm", + "languageLabel": "Language", + "themeLabel": "Theme", + "fontSizeLabel": "Font Size", "accentColorLabel": "強調色", - "settingsTerminal": "終端", - "commandAutocomplete": "命令自動完成", + "settingsTerminal": "Terminal", + "commandAutocomplete": "Command Autocomplete", "commandAutocompleteDesc": "輸入時顯示自動完成功能", + "terminalLinkBehavior": "Terminal Link Click", + "terminalLinkBehaviorDesc": "Default behavior when clicking links in the terminal", "historyTracking": "歷史追蹤", "historyTrackingDesc": "追蹤終端命令", - "syntaxHighlighting": "語法高亮", - "syntaxHighlightingDesc": "高亮顯示終端輸出", "commandPalette": "命令面板", "commandPaletteDesc": "啟用鍵盤快速鍵", "reopenTabsOnLogin": "登入後重新開啟標籤頁", "reopenTabsOnLoginDesc": "即使從其他裝置登入或重新整理頁面,也能恢復您開啟的標籤頁。", "confirmTabClose": "確認關閉標籤頁", "confirmTabCloseDesc": "關閉終端標籤頁前請先詢問。", - "settingsSidebar": "側邊欄", - "showHostTags": "節目主持人標籤", + "settingsSidebar": "Sidebar", + "showHostTags": "Show Host Tags", "showHostTagsDesc": "在主機清單中顯示標籤", "hostTrayOnClick": "點選展開主機操作", "hostTrayOnClickDesc": "始終顯示連線按鈕;點擊展開管理選項,而不是懸停。", + "compactHostView": "Compact Host View", + "compactHostViewDesc": "Collapse each host to a single line showing only its name and address", + "statusColors": "Real Status Colors", + "statusColorsDesc": "Use green/red for online/offline status instead of the accent color", "pinAppRail": "Pin App Rail", "pinAppRailDesc": "保持左側邊欄應用導軌始終展開,而不是滑鼠懸停時才展開。", - "settingsSnippets": "片段", + "settingsNavigation": "Navigation", + "navigationTabsDesc": "Choose which tabs appear in the app rail", + "settingsSnippets": "Snippets", "foldersCollapsed": "資料夾已折疊", "foldersCollapsedDesc": "預設折疊資料夾", "confirmExecution": "確認執行", "confirmExecutionDesc": "運行程式碼片段前請確認", - "settingsUpdates": "更新", + "settingsUpdates": "Updates", "disableUpdateChecks": "禁用更新檢查", "disableUpdateChecksDesc": "停止檢查更新", "totpAuthenticator": "TOTP 驗證器", @@ -2109,68 +2612,68 @@ "qrCode": "QR 圖碼", "totpInstructions": "掃描二維碼或在驗證器應用程式中輸入金鑰,然後輸入 6 位數驗證碼", "totpCodePlaceholder": "000000", - "verify": "核實", - "changePassword": "更改密碼", - "currentPasswordLabel": "目前密碼", + "verify": "Verify", + "changePassword": "Change Password", + "currentPasswordLabel": "Current Password", "currentPasswordPlaceholder": "目前密碼", - "newPasswordLabel": "新密碼", + "newPasswordLabel": "New Password", "newPasswordPlaceholder": "新密碼", "confirmPasswordLabel": "確認新密碼", "confirmPasswordPlaceholder": "確認新密碼", "updatePassword": "更新密碼", "createApiKeyTitle": "建立 API 金鑰", "createApiKeyDescription": "產生用於程式化存取的新 API 金鑰。", - "apiKeyNameLabel": "姓名", + "apiKeyNameLabel": "Name", "apiKeyNamePlaceholder": "例如 CI 流水線", "expiryDateLabel": "到期日", "optional": "選修的", - "cancel": "取消", + "cancel": "Cancel", "createKey": "建立密鑰", - "apiKeyCount": "{{count}} 鍵", + "apiKeyCount": "{{count}} keys", "newKey": "新鑰匙", "noApiKeys": "暫無API金鑰。", - "apiKeyActive": "積極的", + "apiKeyActive": "Active", "apiKeyUsageHint": "請將鑰匙放在裡面。", "apiKeyUsageHintHeader": "標題。", "apiKeyPermissionsHint": "金鑰繼承建立使用者的權限。", - "roleUser": "使用者", - "authMethodDual": "雙重認證", + "roleUser": "User", + "authMethodDual": "Dual Auth", "authMethodOidc": "OIDC", - "totpSetupFailed": "TOTP 設定啟動失敗", + "totpSetupFailed": "Failed to start TOTP setup", "totpEnter6Digits": "請輸入6位代碼", "totpEnabledSuccess": "已啟用雙重認證", "totpInvalidCode": "驗證碼無效,請重試。", "totpDisableInputRequired": "請輸入您的 TOTP 驗證碼或密碼", - "totpDisabledSuccess": "雙重認證已停用", + "totpDisabledSuccess": "Two-factor authentication disabled", "totpDisableFailed": "禁用雙重驗證失敗", - "totpDisableTitle": "禁用雙重認證", + "totpDisableTitle": "Disable 2FA", "totpDisablePlaceholder": "輸入 TOTP 驗證碼或密碼", - "totpDisableConfirm": "禁用雙重認證", + "totpDisableConfirm": "Disable 2FA", "totpContinueVerify": "繼續驗證", - "totpVerifyTitle": "驗證碼", - "totpBackupTitle": "備用代碼", + "totpVerifyTitle": "Verify Code", + "totpBackupTitle": "Backup Codes", "totpDownloadBackup": "下載備份代碼", "done": "完畢", "secretCopied": "秘密已複製到剪貼簿", "apiKeyNameRequired": "密鑰名稱為必填項", - "apiKeyCreated": "API 金鑰「{{name}}」已建立", + "apiKeyCreated": "API key \"{{name}}\" created", "apiKeyCreateFailed": "建立 API 金鑰失敗", - "apiKeyUser": "使用者", - "apiKeyExpires": "過期", - "apiKeyRevoked": "API金鑰「{{name}}」已撤銷", + "apiKeyUser": "User", + "apiKeyExpires": "Expires", + "apiKeyRevoked": "API key \"{{name}}\" revoked", "apiKeyRevokeFailed": "撤銷 API 金鑰失敗", "passwordFieldsRequired": "需要當前密碼和新密碼。", - "passwordMismatch": "密碼不匹配", - "passwordTooShort": "密碼長度必須至少為 6 個字符", + "passwordMismatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters", "passwordUpdated": "密碼已成功更新", "passwordUpdateFailed": "密碼更新失敗", "deletePasswordRequired": "刪除帳戶需要密碼。", - "deleteFailed": "刪除帳戶失敗", - "deleting": "正在刪除…", + "deleteFailed": "Failed to delete account", + "deleting": "Deleting...", "colorPickerTooltip": "打開顏色選擇器", - "themeSystem": "系統", - "themeLight": "光", - "themeDark": "黑暗的", + "themeSystem": "System", + "themeLight": "Light", + "themeDark": "Dark", "themeDracula": "德古拉", "themeCatppuccin": "貓布奇寧", "themeNord": "諾德", @@ -2180,5 +2683,105 @@ "themeGruvbox": "Gruvbox" } } + }, + "tmuxMonitor": { + "title": "Tmux Monitor", + "failedToLoadHosts": "Failed to load hosts", + "failedToLoad": "Failed to load tmux sessions", + "tmuxUnavailable": "tmux is not installed on this host", + "noSessions": "No tmux sessions on this host", + "noHostSelected": "No host selected", + "attached": "Attached", + "detached": "Detached", + "attach": "Attach", + "editTags": "Edit tags", + "tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)", + "tagsSaved": "Tags saved", + "tagsSaveFailed": "Failed to save tags", + "searchPlaceholder": "Search output across sessions...", + "searchResults": "{{count}} matches", + "searchFailed": "Search failed", + "selectPaneHint": "Select a pane to preview its output", + "closePreview": "Close preview", + "newSession": "New session", + "newSessionHint": "Session name (letters, digits, _ @ % + = -)", + "newSessionPlaceholder": "my-session", + "create": "Create", + "sessionCreated": "Session \"{{name}}\" created", + "sessionCreateFailed": "Failed to create session", + "splitRight": "Split right", + "splitDown": "Split down", + "splitFailed": "Failed to split pane", + "newWindow": "New window", + "windowCreateFailed": "Failed to create window", + "attachSessionTooltip": "Attach to {{session}}", + "refresh": "Refresh", + "refreshFailed": "Failed to refresh sessions", + "collapseAll": "Collapse all", + "expandAll": "Expand all", + "moreActions": "More actions", + "sessionStats": "Session stats", + "renameSessionTitle": "Rename session \"{{name}}\"", + "rename": "Rename", + "sessionRenamed": "Session renamed to \"{{name}}\"", + "sessionRenameFailed": "Failed to rename session", + "editTagsTitle": "Edit tags for \"{{name}}\"", + "killPane": "Kill pane", + "resizeTree": "Drag to resize — double-click to reset", + "reattach": "Re-attach (fixes a garbled view)", + "killWindow": "Kill window", + "killWindowTitle": "Kill window {{index}} of \"{{session}}\"?", + "killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.", + "windowKillFailed": "Failed to kill window", + "statusActivity": "Activity", + "statusWindows": "Windows", + "statusPanes": "panes", + "statusTags": "Tags", + "killPaneTitle": "Kill pane {{id}}?", + "killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.", + "paneKillFailed": "Failed to kill pane", + "killSessionTitle": "Kill session \"{{name}}\"?", + "killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.", + "kill": "Kill", + "sessionKilled": "Session \"{{name}}\" killed", + "sessionKillFailed": "Failed to kill session", + "hostUnreachable": "Could not connect to the host. Check that it is online and reachable.", + "noServer": "No tmux server is running on this host.", + "searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.", + "closeSearchResults": "Close search results", + "retry": "Retry", + "noHosts": "No SSH hosts available", + "noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.", + "tmuxInstallHint": "Install it on the host with:", + "attachTooltip": "Open a terminal to {{host}}", + "attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}", + "timeJustNow": "現在", + "timeMinutes": "{{count}}m ago", + "timeHours": "{{count}}h ago", + "timeDays": "{{count}}d ago" + }, + "mobileKeyboard": { + "shift": "Shift", + "ctrl": "Ctrl", + "esc": "Esc", + "tab": "標籤頁", + "backTab": "⇥", + "arrowUp": "向上箭頭", + "arrowDown": "向下箭頭", + "arrowLeft": "左箭頭", + "arrowRight": "向右箭頭", + "home": "Home", + "end": "結尾", + "pageUp": "PgUp", + "pageDown": "PgDn", + "delete": "Del", + "editQuickKeys": "Edit quick keys", + "quickKeysTitle": "Quick Keys", + "quickKeysDesc": "Tap × to remove. Supports up to 8 characters.", + "quickKeyPlaceholder": "e.g. sudo ", + "addQuickKey": "Add", + "removeQuickKey": "Remove", + "resetDefaults": "Reset to defaults", + "done": "完畢" } } diff --git a/src/ui/main-axios.ts b/src/ui/main-axios.ts index 6b531fa5..a8ce37e5 100644 --- a/src/ui/main-axios.ts +++ b/src/ui/main-axios.ts @@ -1501,6 +1501,7 @@ export { updateSSHHost, wakeOnLan, bulkImportSSHHosts, + importSSHConfigHosts, discoverProxmoxGuests, bulkUpdateSSHHosts, deleteSSHHost, @@ -1637,6 +1638,21 @@ export async function registerUser( } } +export async function adminCreateUser( + username: string, + password: string, +): Promise> { + try { + const response = await authApi.post("/users/admin-create", { + username, + password, + }); + return response.data; + } catch (error) { + handleApiError(error, "admin create user"); + } +} + export async function loginUser( username: string, password: string, @@ -1914,6 +1930,8 @@ export { updateRegistrationAllowed, getOidcAutoProvision, updateOidcAutoProvision, + getOidcSilentLoginDefault, + updateOidcSilentLoginDefault, updatePasswordLoginAllowed, getPasswordResetAllowed, updatePasswordResetAllowed, @@ -1994,12 +2012,20 @@ export { } from "@/api/snippets-api"; // ============================================================================ -export type { UptimeInfo, RecentActivityItem } from "@/api/dashboard-api"; +export type { + UptimeInfo, + RecentActivityItem, + ServiceLink, +} from "@/api/dashboard-api"; export { getUptime, getRecentActivity, logActivity, resetRecentActivity, + getServiceLinks, + createServiceLink, + deleteServiceLink, + updateServiceLink, } from "@/api/dashboard-api"; // ============================================================================ diff --git a/src/ui/shell/TabBar.tsx b/src/ui/shell/TabBar.tsx index 18f32660..7f731eee 100644 --- a/src/ui/shell/TabBar.tsx +++ b/src/ui/shell/TabBar.tsx @@ -15,6 +15,7 @@ import { LayoutPanelLeft, Plus, Minus, + Pencil, } from "lucide-react"; import { tabIcon } from "@/shell/tabUtils"; import type { Tab, TabType, SplitMode } from "@/types/ui-types"; @@ -35,6 +36,7 @@ export function TabBar({ onSplitTab, onAddToSplit, onRemoveFromSplit, + onRenameTab, }: { tabs: Tab[]; activeTabId: string; @@ -48,6 +50,7 @@ export function TabBar({ onSplitTab: (tabId: string, mode: SplitMode) => void; onAddToSplit: (tabId: string) => void; onRemoveFromSplit: (tabId: string) => void; + onRenameTab?: (tabId: string, newLabel: string) => void; }) { const { t } = useTranslation(); const [open, setOpen] = useState(true); @@ -58,6 +61,9 @@ export function TabBar({ const [contextPos, setContextPos] = useState<{ x: number; y: number } | null>( null, ); + const [renamingTabId, setRenamingTabId] = useState(null); + const [renameValue, setRenameValue] = useState(""); + const renameInputRef = useRef(null); const tabBarRef = useRef(null); const tabEls = useRef>(new Map()); @@ -165,6 +171,19 @@ export function TabBar({ return () => window.removeEventListener("mousedown", onDown); }, [contextTabId]); + useEffect(() => { + if (renamingTabId) { + setTimeout(() => renameInputRef.current?.focus(), 0); + } + }, [renamingTabId]); + + function commitRename() { + if (!renamingTabId) return; + const trimmed = renameValue.trim(); + if (trimmed) onRenameTab?.(renamingTabId, trimmed); + setRenamingTabId(null); + } + const dragIdx = tabs.findIndex((t) => t.id === dragTabId); const target = dragTargetIndex ?? dragIdx; @@ -288,8 +307,25 @@ export function TabBar({ )} {tabIcon(tab.type)} - {tab.type !== "dashboard" && tab.label} - {tab.type !== "dashboard" && ( + {tab.type !== "dashboard" && renamingTabId === tab.id ? ( + setRenameValue(e.target.value)} + onBlur={commitRename} + onKeyDown={(e) => { + if (e.key === "Enter") commitRename(); + else if (e.key === "Escape") setRenamingTabId(null); + }} + onPointerDown={(e) => e.stopPropagation()} + onClick={(e) => e.stopPropagation()} + className="bg-transparent border-b border-accent-brand outline-none text-sm w-28 min-w-0" + style={{ fontWeight: "inherit" }} + /> + ) : ( + tab.type !== "dashboard" && tab.label + )} + {tab.type !== "dashboard" && renamingTabId !== tab.id && (
@@ -300,7 +336,7 @@ export function TabBar({ e.stopPropagation(); onRefreshTab(tab.id); }} - title="Refresh connection" + title={t("nav.refreshTab")} className="flex items-center justify-center size-5 md:size-4 rounded-sm transition-colors text-muted-foreground hover:text-foreground hover:bg-muted" > @@ -456,13 +492,25 @@ export function TabBar({ }} > - Refresh connection + {t("nav.refreshTab")} )} +
{/* Split submenu */}
- Split + {t("terminal.split.splitTab")}
{SPLIT_MODES.filter((m) => m.id !== "none").map((mode) => ( ) : hasEmptySlot ? ( ) : null} @@ -514,7 +562,7 @@ export function TabBar({ }} > - Close tab + {t("nav.closeTab")}
); diff --git a/src/ui/shell/tabUtils.tsx b/src/ui/shell/tabUtils.tsx index 8ac14fb5..b3d6c79b 100644 --- a/src/ui/shell/tabUtils.tsx +++ b/src/ui/shell/tabUtils.tsx @@ -20,6 +20,8 @@ import type { TerminalHandle, TerminalHostConfig, } from "@/features/terminal/Terminal"; +import { MobileTerminalKeyboard } from "@/features/terminal/MobileTerminalKeyboard"; +import { useIsMobile } from "@/hooks/use-mobile"; import { FileManager } from "@/features/file-manager/FileManager"; import { DockerManager } from "@/features/docker/DockerManager"; import { HostMetricsTab } from "@/features/host-metrics/HostMetricsTab"; @@ -127,33 +129,58 @@ function TerminalTabContent({ label, isVisible, onCloseTab, + onRenameTab, + onOpenFileInEditor, + onOpenFileManager, }: { tab: Tab; host: Host; label: string; isVisible: boolean; onCloseTab?: (id: string) => void; + onRenameTab?: (tabId: string, newLabel: string) => void; + onOpenFileInEditor?: (filePath: string) => void; + onOpenFileManager?: (path?: string) => void; }) { const { previewTerminalTheme } = useTabsSafe(); + const isMobile = useIsMobile(); return ( - } - hostConfig={ - { - ...hostToSSHHost(host), - sshPort: host.sshPort ?? host.port, - instanceId: tab.instanceId ?? tab.id, - restoredSessionId: tab.restoredSessionId ?? null, - } as TerminalHostConfig - } - isVisible={isVisible} - title={label} - showTitle={false} - splitScreen={false} - onClose={() => onCloseTab?.(tab.id)} - previewTheme={previewTerminalTheme} - /> +
+
+ } + hostConfig={ + { + ...hostToSSHHost(host), + sshPort: host.sshPort ?? host.port, + instanceId: tab.instanceId ?? tab.id, + restoredSessionId: tab.restoredSessionId ?? null, + } as TerminalHostConfig + } + isVisible={isVisible} + title={label} + showTitle={false} + splitScreen={false} + onClose={() => onCloseTab?.(tab.id)} + onTitleChange={ + onRenameTab && host.terminalConfig?.useSSHTitle + ? (title) => onRenameTab(tab.id, title) + : undefined + } + previewTheme={previewTerminalTheme} + onOpenFileInEditor={onOpenFileInEditor} + onOpenFileManager={onOpenFileManager} + /> +
+ {isMobile && ( + + } + /> + )} +
); } @@ -164,6 +191,9 @@ export function renderTabContent( onOpenTab?: (host: Host, type: TabType) => void, onCloseTab?: (id: string) => void, isVisible = true, + onOpenFileInEditor?: (host: Host, filePath: string) => void, + onOpenFileManager?: (host: Host, path?: string) => void, + onRenameTab?: (tabId: string, newLabel: string) => void, ) { const { host, label } = tab; @@ -191,6 +221,15 @@ export function renderTabContent( label={label} isVisible={isVisible} onCloseTab={onCloseTab} + onRenameTab={onRenameTab} + onOpenFileInEditor={ + onOpenFileInEditor + ? (fp) => onOpenFileInEditor(host, fp) + : undefined + } + onOpenFileManager={ + onOpenFileManager ? (p) => onOpenFileManager(host, p) : undefined + } /> ); @@ -202,7 +241,12 @@ export function renderTabContent( messageKey="fileManager.noHostSelected" /> ); - return ; + return ( + + ); case "docker": if (!host) diff --git a/src/ui/sidebar/AdminManagementSections.tsx b/src/ui/sidebar/AdminManagementSections.tsx index 3c862b85..e1b0e3d5 100644 --- a/src/ui/sidebar/AdminManagementSections.tsx +++ b/src/ui/sidebar/AdminManagementSections.tsx @@ -17,6 +17,7 @@ import { RefreshCw, Share2, Trash2, + Unlink, User, } from "lucide-react"; import { toast } from "sonner"; @@ -68,6 +69,10 @@ type UsersSectionProps = { SetStateAction<{ id: string; username: string; isOidc: boolean } | null> >; setLinkAccountOpen: Dispatch>; + setUnlinkAccountTarget: Dispatch< + SetStateAction<{ id: string; username: string } | null> + >; + setUnlinkAccountOpen: Dispatch>; }; export function AdminUsersSection({ @@ -81,6 +86,8 @@ export function AdminUsersSection({ setEditUserOpen, setLinkAccountTarget, setLinkAccountOpen, + setUnlinkAccountTarget, + setUnlinkAccountOpen, }: UsersSectionProps) { const { t } = useTranslation(); @@ -160,11 +167,28 @@ export function AdminUsersSection({ > - {!(user.isOidc && user.passwordHash) && ( + {user.isOidc && user.passwordHash ? ( + ) : ( +
); } diff --git a/src/ui/sidebar/AdminSettingsSections.tsx b/src/ui/sidebar/AdminSettingsSections.tsx index cae55cbe..5e9be46f 100644 --- a/src/ui/sidebar/AdminSettingsSections.tsx +++ b/src/ui/sidebar/AdminSettingsSections.tsx @@ -2,18 +2,30 @@ import type { Dispatch, SetStateAction } from "react"; import { useTranslation } from "react-i18next"; import { Button } from "@/components/button"; import { Input } from "@/components/input"; +import { PasswordInput } from "@/components/password-input"; import { SettingRow } from "@/components/section-card"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/select"; import { Database, + Lock, Pencil, Plus, RefreshCw, + Server, Settings, Shield, Trash2, } from "lucide-react"; import { AccordionSection, AdminToggle } from "./AdminSettingsShared"; import type { SSOProvider, SSOProviderType } from "@/types/index"; +import type { HostDefaults } from "@/api/settings-api"; +import type { AcmeSettings, AcmeChallengeType } from "@/api/acme-ssl-api"; type GeneralSettingsSectionProps = { open: boolean; @@ -24,6 +36,8 @@ type GeneralSettingsSectionProps = { handleTogglePasswordLogin: () => void; oidcAutoProvision: boolean; handleToggleOidcAutoProvision: () => void; + oidcSilentLoginDefault: boolean; + handleToggleOidcSilentLoginDefault: () => void; allowPasswordReset: boolean; handleTogglePasswordReset: () => void; commandHistoryEnabled: boolean; @@ -57,6 +71,8 @@ export function AdminGeneralSettingsSection({ handleTogglePasswordLogin, oidcAutoProvision, handleToggleOidcAutoProvision, + oidcSilentLoginDefault, + handleToggleOidcSilentLoginDefault, allowPasswordReset, handleTogglePasswordReset, commandHistoryEnabled, @@ -117,6 +133,15 @@ export function AdminGeneralSettingsSection({ onToggle={handleToggleOidcAutoProvision} /> + + + ); } + +type AdminHostDefaultsSectionProps = { + open: boolean; + onToggle: () => void; + defaults: HostDefaults; + setDefaults: Dispatch>; + handleSaveDefaults: () => void; +}; + +export function AdminHostDefaultsSection({ + open, + onToggle, + defaults, + setDefaults, + handleSaveDefaults, +}: AdminHostDefaultsSectionProps) { + const { t } = useTranslation(); + + return ( + } + open={open} + onToggle={onToggle} + > +
+ + {t("admin.hostDefaultsDesc")} + + +
+ + {t("admin.hostDefaultsSocks5")} + + + + setDefaults((p) => ({ ...p, useSocks5: !p.useSocks5 })) + } + /> + + {defaults.useSocks5 && ( +
+
+ +
+ + setDefaults((p) => ({ ...p, socks5Host: e.target.value })) + } + placeholder="127.0.0.1" + className="text-xs" + /> + + setDefaults((p) => ({ + ...p, + socks5Port: Number(e.target.value), + })) + } + placeholder="1080" + className="text-xs w-24 [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" + /> +
+
+
+ + + setDefaults((p) => ({ + ...p, + socks5Username: e.target.value, + })) + } + className="text-xs" + /> +
+
+ + + setDefaults((p) => ({ + ...p, + socks5Password: e.target.value, + })) + } + className="h-8 text-xs pr-8" + /> +
+
+ )} +
+ +
+ + {t("admin.hostDefaultsMetrics")} + + + + setDefaults((p) => ({ + ...p, + metricsEnabled: !(p.metricsEnabled ?? true), + })) + } + /> + + + + setDefaults((p) => ({ + ...p, + statusCheckEnabled: !(p.statusCheckEnabled ?? true), + })) + } + /> + +
+ +
+ + {t("admin.hostDefaultsTerminal")} + + + + setDefaults((p) => ({ + ...p, + enableSessionLogging: !(p.enableSessionLogging ?? true), + })) + } + /> + + + + setDefaults((p) => ({ + ...p, + enableCommandHistory: !(p.enableCommandHistory ?? true), + })) + } + /> + +
+ + +
+
+ ); +} + +const CERT_STATUS_STYLES: Record = { + none: "text-muted-foreground", + valid: "text-green-500", + expiring: "text-yellow-500", + expired: "text-destructive", +}; + +type AdminSSLSectionProps = { + open: boolean; + onToggle: () => void; + settings: AcmeSettings; + setSettings: Dispatch>; + cloudflareTokenDraft: string; + setCloudflareTokenDraft: Dispatch>; + requesting: boolean; + handleSave: () => void; + handleRequest: () => void; +}; + +export function AdminSSLSection({ + open, + onToggle, + settings, + setSettings, + cloudflareTokenDraft, + setCloudflareTokenDraft, + requesting, + handleSave, + handleRequest, +}: AdminSSLSectionProps) { + const { t } = useTranslation(); + + const certStatusLabel: Record = { + none: t("admin.sslCertStatusNone"), + valid: t("admin.sslCertStatusValid"), + expiring: t("admin.sslCertStatusExpiring"), + expired: t("admin.sslCertStatusExpired"), + }; + + return ( + } + open={open} + onToggle={onToggle} + > +
+ + {t("admin.sslDescription")}{" "} + + {t("admin.sslDocsLink")} + + + +
+
+ + {t("admin.sslCertStatus")} + + + {certStatusLabel[settings.certStatus]} + +
+ {settings.certExpiresAt && ( + + {t("admin.sslCertExpiresAt", { + date: new Date(settings.certExpiresAt).toLocaleDateString(), + })} + + )} + {settings.lastIssuedAt && ( + + {t("admin.sslLastIssued", { + date: new Date(settings.lastIssuedAt).toLocaleString(), + })} + + )} +
+ +
+ + + setSettings((p) => ({ ...p, domain: e.target.value })) + } + placeholder={t("admin.sslDomainPlaceholder")} + className="text-xs" + /> +
+ +
+ + + setSettings((p) => ({ ...p, email: e.target.value })) + } + placeholder={t("admin.sslEmailPlaceholder")} + className="text-xs" + /> +
+ +
+ + + + {t("admin.sslChallengeTypeDesc")} + +
+ + {settings.challengeType === "dns-cloudflare" && ( +
+ + setCloudflareTokenDraft(e.target.value)} + placeholder={ + settings.cloudflareToken || + t("admin.sslCloudflareTokenPlaceholder") + } + className="text-xs h-8 pr-8" + /> + + {t("admin.sslCloudflareTokenDesc")} + +
+ )} + + + {t("admin.sslInfoNote")} + + +
+ + +
+
+
+ ); +} diff --git a/src/ui/sidebar/AdminUserDialogs.tsx b/src/ui/sidebar/AdminUserDialogs.tsx index 765fdcab..3883d227 100644 --- a/src/ui/sidebar/AdminUserDialogs.tsx +++ b/src/ui/sidebar/AdminUserDialogs.tsx @@ -4,6 +4,7 @@ import { assignRoleToUser, linkOIDCToPasswordAccount, removeRoleFromUser, + unlinkOIDCFromPasswordAccount, } from "@/main-axios"; import type { Role, UserRole } from "@/main-axios"; import { Button } from "@/components/button"; @@ -391,6 +392,80 @@ export function AdminEditUserDialog({ ); } +type UnlinkAccountDialogProps = { + open: boolean; + onOpenChange: Dispatch>; + unlinkAccountTarget: { id: string; username: string } | null; + onSuccess: (userId: string) => void; +}; + +export function AdminUnlinkAccountDialog({ + open, + onOpenChange, + unlinkAccountTarget, + onSuccess, +}: UnlinkAccountDialogProps) { + const { t } = useTranslation(); + const [submitting, setSubmitting] = useState(false); + + const handleSubmit = async () => { + if (!unlinkAccountTarget) return; + setSubmitting(true); + try { + await unlinkOIDCFromPasswordAccount(unlinkAccountTarget.id); + toast.success(t("admin.unlinkAccountSuccess")); + onSuccess(unlinkAccountTarget.id); + onOpenChange(false); + } catch (error: unknown) { + toast.error(apiErrorMessage(error, t("admin.unlinkAccountFailed"))); + } finally { + setSubmitting(false); + } + }; + + return ( + + + + + {t("admin.unlinkAccountTitle")} + + + {t("admin.unlinkAccountDesc", { + username: unlinkAccountTarget?.username, + })} + + +
+ + + {t("admin.unlinkAccountWarning")} + +
+
+ + +
+
+
+ ); +} + type LinkAccountDialogProps = { open: boolean; onOpenChange: Dispatch>; diff --git a/src/ui/sidebar/AppRail.tsx b/src/ui/sidebar/AppRail.tsx index 331854e9..a24cfd1d 100644 --- a/src/ui/sidebar/AppRail.tsx +++ b/src/ui/sidebar/AppRail.tsx @@ -5,6 +5,7 @@ import { Hammer, KeyRound, LayoutPanelLeft, + LogOut, Network, Play, Plug, @@ -14,12 +15,6 @@ import { User, Zap, } from "lucide-react"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@/components/dropdown-menu"; import type { SplitMode, TabType, ToolsTab } from "@/types/ui-types"; export type RailView = @@ -131,8 +126,6 @@ export function AppRail({ splitMode, username, isAdmin, - profileDropdownOpen, - onProfileDropdownChange, onRailClick, onOpenTab, onLogout, @@ -142,8 +135,6 @@ export function AppRail({ splitMode: SplitMode; username: string; isAdmin: boolean; - profileDropdownOpen: boolean; - onProfileDropdownChange: (open: boolean) => void; onRailClick: (view: RailView) => void; onOpenTab?: (type: TabType) => void; onLogout: () => void; @@ -182,7 +173,7 @@ export function AppRail({ return () => window.removeEventListener("hiddenRailTabsChanged", handler); }, []); - const railExpanded = pinned || hovered || profileDropdownOpen; + const railExpanded = pinned || hovered; const railButtons = buildRailButtons(splitMode, t, hiddenTabs); return ( @@ -293,50 +284,50 @@ export function AppRail({
))} +
+
- - - - - - - - Logout - - - + {username.charAt(0).toUpperCase() || "U"} +
+
+ + {username || "User"} + + + {isAdmin ? t("nav.roleAdministrator") : t("nav.roleUser")} + +
+
); diff --git a/src/ui/sidebar/ConnectionsPanel.tsx b/src/ui/sidebar/ConnectionsPanel.tsx index b9c19079..78d10a1e 100644 --- a/src/ui/sidebar/ConnectionsPanel.tsx +++ b/src/ui/sidebar/ConnectionsPanel.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useRef, useCallback } from "react"; import { useTranslation } from "react-i18next"; -import { ExternalLink, Plug, Search, X } from "lucide-react"; +import { ExternalLink, Plug, Search, X, Pencil, Check } from "lucide-react"; import { getActiveSessions, deleteOpenTab, @@ -62,36 +62,65 @@ function ConnectionRow({ isLive, tabType, name, + hostName, subLabel, icon, onSwitch, onClose, switchTitle, faded, + onRename, + isDragging, }: { isActive?: boolean; isLive: boolean; tabType: string; name: string; + hostName?: string; subLabel: string; icon: React.ReactNode; onSwitch?: () => void; onClose: () => void; switchTitle?: string; faded?: boolean; + onRename?: (newLabel: string) => void; + isDragging?: boolean; }) { + const { t } = useTranslation(); + const [editing, setEditing] = useState(false); + const [editValue, setEditValue] = useState(name); + + function startEdit(e: React.MouseEvent) { + e.stopPropagation(); + setEditValue(name); + setEditing(true); + } + + function commitEdit() { + const trimmed = editValue.trim(); + if (trimmed && trimmed !== name && onRename) { + onRename(trimmed); + } + setEditing(false); + } + + function handleKeyDown(e: React.KeyboardEvent) { + if (e.key === "Enter") commitEdit(); + if (e.key === "Escape") setEditing(false); + } + return (
e.key === "Enter" && onSwitch?.()} + role={onSwitch && !editing ? "button" : undefined} + tabIndex={onSwitch && !editing ? 0 : undefined} + onClick={!editing ? onSwitch : undefined} + onKeyDown={(e) => !editing && e.key === "Enter" && onSwitch?.()} className={`group flex items-center gap-2.5 px-3 py-2.5 border-b border-border/40 transition-colors last:border-b-0 ${ faded ? "opacity-60" : "" - } ${ + } ${isDragging ? "opacity-30" : ""} ${ isActive ? "bg-accent-brand/8 cursor-pointer border-l-2 border-l-accent-brand" - : onSwitch + : onSwitch && !editing ? "hover:bg-muted/40 cursor-pointer" : "" }`} @@ -113,13 +142,26 @@ function ConnectionRow({ isLive ? "bg-green-500" : "bg-muted-foreground/30" }`} /> - - {name} - + {editing ? ( + setEditValue(e.target.value)} + onBlur={commitEdit} + onKeyDown={handleKeyDown} + onClick={(e) => e.stopPropagation()} + onPointerDown={(e) => e.stopPropagation()} + className="text-xs font-semibold flex-1 min-w-0 bg-transparent border-b border-accent-brand outline-none text-foreground" + autoFocus + /> + ) : ( + + {name} + + )}
+ {hostName && hostName !== name ? ( + + {hostName} ·{" "} + + ) : null} {subLabel}
- {switchTitle && onSwitch && ( + {editing ? ( + + ) : ( + onRename && ( + + + + + + {t("connections.rename")} + + + ) + )} + {switchTitle && onSwitch && !editing && ( + {!editing && ( + + )}
@@ -187,6 +264,8 @@ export function ConnectionsPanel({ onCloseTab, onReopenTab, onForgetBackground, + onRenameTab, + onReorderTabs, }: { tabs: Tab[]; activeTabId: string; @@ -199,6 +278,8 @@ export function ConnectionsPanel({ restoredSessionId: string | null, ) => void; onForgetBackground: (recordId: string) => void; + onRenameTab?: (tabId: string, newLabel: string) => void; + onReorderTabs?: (tabs: Tab[]) => void; }) { const { t } = useTranslation(); const [now, setNow] = useState(Date.now()); @@ -206,11 +287,17 @@ export function ConnectionsPanel({ const [search, setSearch] = useState(""); const pollTimerRef = useRef | null>(null); + // Drag-to-reorder state + const [dragTabId, setDragTabId] = useState(null); + const [dragOverTabId, setDragOverTabId] = useState(null); + const rowEls = useRef>(new Map()); + const dragStartY = useRef(0); + const didDragRef = useRef(false); + const openTabs = tabs.filter((tab) => CONNECTION_TAB_TYPES.includes(tab.type), ); - // Filter background records to only those not already open in the tab bar const openInstanceIds = new Set( tabs.map((t) => t.instanceId).filter(Boolean), ); @@ -220,9 +307,13 @@ export function ConnectionsPanel({ const q = search.trim().toLowerCase(); const filteredOpenTabs = q - ? openTabs.filter((tab) => - (tab.host?.name ?? tab.label).toLowerCase().includes(q), - ) + ? openTabs.filter((tab) => { + const displayName = tab.customLabel ?? tab.host?.name ?? tab.label; + return ( + displayName.toLowerCase().includes(q) || + (tab.host?.name ?? "").toLowerCase().includes(q) + ); + }) : openTabs; const filteredBackgroundTabs = q ? backgroundTabs.filter((r) => { @@ -257,6 +348,69 @@ export function ConnectionsPanel({ }; }, [refresh]); + // Global pointer listeners for drag reorder + useEffect(() => { + if (!dragTabId) return; + + function onPointerMove(e: PointerEvent) { + if (Math.abs(e.clientY - dragStartY.current) > 4) + didDragRef.current = true; + if (!didDragRef.current) return; + + // Find which row the pointer is over + let overTabId: string | null = null; + rowEls.current.forEach((el, id) => { + if (id === dragTabId) return; + const rect = el.getBoundingClientRect(); + if (e.clientY >= rect.top && e.clientY <= rect.bottom) { + overTabId = id; + } + }); + setDragOverTabId(overTabId); + } + + function onPointerUp(e: PointerEvent) { + if (didDragRef.current && dragTabId && onReorderTabs) { + // Find drop target + let targetTabId: string | null = null; + rowEls.current.forEach((el, id) => { + if (id === dragTabId) return; + const rect = el.getBoundingClientRect(); + if (e.clientY >= rect.top && e.clientY <= rect.bottom) { + targetTabId = id; + } + }); + + if (targetTabId) { + const fromIdx = openTabs.findIndex((t) => t.id === dragTabId); + const toIdx = openTabs.findIndex((t) => t.id === targetTabId); + if (fromIdx !== -1 && toIdx !== -1 && fromIdx !== toIdx) { + const reordered = [...openTabs]; + reordered.splice(toIdx, 0, reordered.splice(fromIdx, 1)[0]); + const connectionSet = new Set(CONNECTION_TAB_TYPES as string[]); + const nonConnectionTabs = tabs.filter( + (t) => !connectionSet.has(t.type), + ); + onReorderTabs([...nonConnectionTabs, ...reordered]); + } + } + } + + setDragTabId(null); + setDragOverTabId(null); + setTimeout(() => { + didDragRef.current = false; + }, 0); + } + + window.addEventListener("pointermove", onPointerMove); + window.addEventListener("pointerup", onPointerUp); + return () => { + window.removeEventListener("pointermove", onPointerMove); + window.removeEventListener("pointerup", onPointerUp); + }; + }, [dragTabId, openTabs, tabs, onReorderTabs]); + const sessionByInstanceId = new Map( activeSessions.map((s) => [s.tabInstanceId, s]), ); @@ -322,24 +476,59 @@ export function ConnectionsPanel({ ? formatDuration(now - liveSession.createdAt) : formatDuration(now - tab.openedAt); + const displayName = tab.customLabel ?? tab.host?.name ?? tab.label; + const hostName = tab.host?.name; + const isDraggingThis = dragTabId === tab.id; + const isDropTarget = dragOverTabId === tab.id && !isDraggingThis; + return ( - onSwitchToTab(tab.id)} - onClose={() => onCloseTab(tab.id)} - /> + ref={(el) => { + if (el) rowEls.current.set(tab.id, el); + else rowEls.current.delete(tab.id); + }} + onPointerDown={(e) => { + if (e.button !== 0) return; + dragStartY.current = e.clientY; + didDragRef.current = false; + setDragTabId(tab.id); + }} + className={`relative ${isDropTarget ? "border-t-2 border-accent-brand" : ""}`} + style={{ + cursor: dragTabId + ? isDraggingThis + ? "grabbing" + : "default" + : "grab", + }} + > + { + if (!didDragRef.current) onSwitchToTab(tab.id); + }} + onClose={() => onCloseTab(tab.id)} + onRename={ + onRenameTab + ? (newLabel) => onRenameTab(tab.id, newLabel) + : undefined + } + isDragging={isDraggingThis} + /> +
); })}
diff --git a/src/ui/sidebar/CredentialEditorView.tsx b/src/ui/sidebar/CredentialEditorView.tsx index f149c5ad..57f1ec59 100644 --- a/src/ui/sidebar/CredentialEditorView.tsx +++ b/src/ui/sidebar/CredentialEditorView.tsx @@ -56,6 +56,10 @@ export function CredentialEditorView({ const [saving, setSaving] = useState(false); const handleSave = async () => { + if (!credForm.name.trim()) { + toast.error(t("hosts.credentialNameRequired")); + return; + } setSaving(true); try { const data = { @@ -92,8 +96,9 @@ export function CredentialEditorView({ ); window.dispatchEvent(new CustomEvent("termix:credentials-changed")); onSave(saved); - } catch { - toast.error(t("hosts.failedToSaveCredential")); + } catch (err) { + const msg = err instanceof Error ? err.message : null; + toast.error(msg || t("hosts.failedToSaveCredential")); } finally { setSaving(false); } @@ -327,7 +332,7 @@ export function CredentialEditorView({ { const file = e.target.files?.[0]; diff --git a/src/ui/sidebar/HostEditor.tsx b/src/ui/sidebar/HostEditor.tsx index 285a8274..2c177446 100644 --- a/src/ui/sidebar/HostEditor.tsx +++ b/src/ui/sidebar/HostEditor.tsx @@ -32,8 +32,9 @@ import { subscribeTunnelStatuses, connectTunnel, disconnectTunnel, + getUserInfo, } from "@/main-axios"; -import { getTailscaleDevices } from "@/api/settings-api"; +import { getTailscaleDevices, getHostDefaults } from "@/api/settings-api"; import type { Host } from "@/types/ui-types"; import type { SSHHost, TunnelStatus } from "@/types"; import { useTabsSafe } from "@/shell/TabContext"; @@ -110,6 +111,13 @@ export function HostEditor({ const [tailscaleHasApiKey, setTailscaleHasApiKey] = useState(false); const [tailscaleLoading, setTailscaleLoading] = useState(false); const [connectingTunnel, setConnectingTunnel] = useState(null); + const [isOidcUser, setIsOidcUser] = useState(false); + + useEffect(() => { + getUserInfo() + .then((info) => setIsOidcUser(info.is_oidc)) + .catch(() => {}); + }, []); useEffect(() => { getSnippets() @@ -117,6 +125,13 @@ export function HostEditor({ .catch(() => {}); }, []); + useEffect(() => { + if (host) return; + getHostDefaults() + .then((d) => setForm(createHostEditorForm(null, d))) + .catch(() => {}); + }, [host]); + useEffect(() => { if (activeTab !== "tunnels") return; const unsub = subscribeTunnelStatuses((s) => setTunnelStatuses(s)); @@ -266,8 +281,19 @@ export function HostEditor({ !!selectedCredential?.username && !form.overrideCredentialUsername } + onFocus={() => { + if (form.username === "root") setField("username", ""); + }} + onBlur={() => { + if (form.username === "") setField("username", "root"); + }} onChange={(e) => setField("username", e.target.value)} /> + {isOidcUser && ( +

+ {t("hosts.oidcUsernameHint")} +

+ )}
{authMethod === "password" && (
@@ -337,7 +363,7 @@ export function HostEditor({ { const file = e.target.files?.[0]; @@ -566,6 +592,18 @@ export function HostEditor({ )}
)} + {authMethod === "warpgate" && ( +
+
+ + {t("hosts.warpgateLabel")} + +
+

+ {t("hosts.warpgateDesc")} +

+
+ )} setField("forceKeyboardInteractive", v)} /> + + setField("allowLegacyAlgorithms", v)} + /> + )} +
+ +

+ {t("hosts.backgroundImageDesc")} +

+ + setField("backgroundImage", e.target.value) + } + placeholder="https://example.com/image.jpg" + className="flex h-9 w-full border border-border bg-background px-3 py-1 text-xs outline-none focus:ring-1 focus:ring-ring font-mono" + /> +
+ {form.backgroundImage && ( +
+
+ + + {Math.round(form.backgroundImageOpacity * 100)}% + +
+ + setField("backgroundImageOpacity", v) + } + /> +
+ )}
@@ -891,6 +979,15 @@ export function HostEditor({ onChange={(v) => setField("agentForwarding", v)} /> + + setField("useSSHTitle", v)} + /> + setField("enableCommandHistory", v)} /> +
+ + +

+ {t("hosts.linkClickBehaviorDesc")} +

+
@@ -1540,6 +1665,7 @@ export function HostEditor({ setField={setField} setGuacField={setGuacField} host={host} + credentials={credentials} /> )} @@ -1549,6 +1675,7 @@ export function HostEditor({ setField={setField} setGuacField={setGuacField} host={host} + credentials={credentials} /> )} @@ -1557,6 +1684,8 @@ export function HostEditor({ form={form} setField={setField} setGuacField={setGuacField} + host={host} + credentials={credentials} /> )}
diff --git a/src/ui/sidebar/HostEditorData.ts b/src/ui/sidebar/HostEditorData.ts index b15c6c3c..25363fe7 100644 --- a/src/ui/sidebar/HostEditorData.ts +++ b/src/ui/sidebar/HostEditorData.ts @@ -1,6 +1,7 @@ import { TERMINAL_THEMES } from "@/lib/terminal-themes"; import type { Host } from "@/types/ui-types"; import type { SSHHostData } from "@/types"; +import type { HostDefaults } from "@/api/settings-api"; type HostSocks5ProxyNode = NonNullable[number]; @@ -42,8 +43,12 @@ export function mapSnippetResponse( })); } -export function createHostEditorForm(host: Host | null) { - const rawTheme = host?.terminalConfig?.theme; +export function createHostEditorForm( + host: Host | null, + defaults?: HostDefaults, +) { + const d = host ? undefined : defaults; + const rawTheme = host?.terminalConfig?.theme ?? d?.theme; const normalizedTheme = !rawTheme || ["Termix Dark", "Termix Light", "termixDark", "termixLight"].includes( @@ -57,12 +62,13 @@ export function createHostEditorForm(host: Host | null) { return { name: host?.name ?? "", ip: host?.ip ?? "", - username: host?.username ?? "", + username: host?.username ?? (host ? "" : "root"), sshPort: host?.sshPort ?? host?.port ?? 22, rdpPort: host?.rdpPort ?? 3389, vncPort: host?.vncPort ?? 5900, telnetPort: host?.telnetPort ?? 23, authType: host?.authType ?? "password", + useWarpgate: host?.useWarpgate ?? false, password: host?.password ?? "", key: host?.key ?? (host?.hasKey ? "existing_key" : ""), keyPassword: host?.hasKeyPassword @@ -70,7 +76,9 @@ export function createHostEditorForm(host: Host | null) { : (host?.keyPassword ?? ""), keyType: host?.keyType ?? "auto", keySubTab: "paste" as "paste" | "upload", - credentialId: host?.credentialId ?? "", + credentialId: + host?.credentialId ?? + (d?.credentialId != null ? String(d.credentialId) : ""), overrideCredentialUsername: host?.overrideCredentialUsername ?? false, folder: host?.folder ?? "", tags: host?.tags ?? ([] as string[]), @@ -78,24 +86,29 @@ export function createHostEditorForm(host: Host | null) { notes: host?.notes ?? "", pin: host?.pin ?? false, macAddress: host?.macAddress ?? "", - useSocks5: host?.useSocks5 ?? false, - socks5Host: host?.socks5Host ?? "", - socks5Port: host?.socks5Port ?? 1080, - socks5Username: host?.socks5Username ?? "", - socks5Password: host?.socks5Password ?? "", + wolBroadcastAddress: host?.wolBroadcastAddress ?? "", + useSocks5: host?.useSocks5 ?? d?.useSocks5 ?? false, + socks5Host: host?.socks5Host ?? d?.socks5Host ?? "", + socks5Port: host?.socks5Port ?? d?.socks5Port ?? 1080, + socks5Username: host?.socks5Username ?? d?.socks5Username ?? "", + socks5Password: host?.socks5Password ?? d?.socks5Password ?? "", socks5ProxyMode: ((host?.socks5ProxyChain ?? []).length > 0 ? "chain" : "single") as "single" | "chain", socks5ProxyChain: (host?.socks5ProxyChain ?? []) as HostSocks5ProxyNode[], enableTerminal: host?.enableTerminal ?? true, - enableSessionLogging: host?.enableSessionLogging ?? true, - enableCommandHistory: host?.enableCommandHistory ?? true, + enableSessionLogging: + host?.enableSessionLogging ?? d?.enableSessionLogging ?? true, + enableCommandHistory: + host?.enableCommandHistory ?? d?.enableCommandHistory ?? true, enableFileManager: host?.enableFileManager ?? false, + scpLegacy: host?.scpLegacy ?? false, enableDocker: host?.enableDocker ?? false, enableTmuxMonitor: host?.enableTmuxMonitor ?? false, enableProxmox: host?.enableProxmox ?? false, proxmoxConfig: host?.proxmoxConfig ?? { defaultCredentialId: null as number | null, + defaultAuthType: "password" as string, windowsPatterns: "win, windows", dockerPatterns: "docker", preferredPrefixes: "10., 192.168.", @@ -103,15 +116,16 @@ export function createHostEditorForm(host: Host | null) { enableTunnel: host?.enableTunnel ?? false, defaultPath: host?.defaultPath ?? "/", forceKeyboardInteractive: host?.forceKeyboardInteractive ?? false, - fontSize: host?.terminalConfig?.fontSize ?? 14, + fontSize: host?.terminalConfig?.fontSize ?? d?.fontSize ?? 14, fontFamily: - host?.terminalConfig?.fontFamily ?? "Caskaydia Cove Nerd Font Mono", + host?.terminalConfig?.fontFamily ?? + d?.fontFamily ?? + "Caskaydia Cove Nerd Font Mono", theme: normalizedTheme, - cursorStyle: (host?.terminalConfig?.cursorStyle ?? "bar") as - | "block" - | "underline" - | "bar", - cursorBlink: host?.terminalConfig?.cursorBlink ?? true, + cursorStyle: (host?.terminalConfig?.cursorStyle ?? + d?.cursorStyle ?? + "bar") as "block" | "underline" | "bar", + cursorBlink: host?.terminalConfig?.cursorBlink ?? d?.cursorBlink ?? true, scrollback: host?.terminalConfig?.scrollback ?? 10000, letterSpacing: host?.terminalConfig?.letterSpacing ?? 0, lineHeight: host?.terminalConfig?.lineHeight ?? 1.0, @@ -139,6 +153,13 @@ export function createHostEditorForm(host: Host | null) { sudoPassword: host?.terminalConfig?.sudoPassword ?? "", keepaliveInterval: host?.terminalConfig?.keepaliveInterval ?? 60, keepaliveCountMax: host?.terminalConfig?.keepaliveCountMax ?? 5, + backgroundImage: host?.terminalConfig?.backgroundImage ?? "", + backgroundImageOpacity: + host?.terminalConfig?.backgroundImageOpacity ?? 0.15, + allowLegacyAlgorithms: host?.terminalConfig?.allowLegacyAlgorithms ?? true, + linkClickBehavior: (host?.terminalConfig?.linkClickBehavior ?? + "default") as "default" | "confirm" | "direct", + useSSHTitle: host?.terminalConfig?.useSSHTitle ?? false, syntaxHighlighting: host?.terminalConfig?.syntaxHighlighting ?? true, syntaxHighlightingOptions: { logLevels: @@ -161,21 +182,37 @@ export function createHostEditorForm(host: Host | null) { ([] as { port: number; protocol: "tcp" | "udp"; delay: number }[]), quickActions: host?.quickActions ?? ([] as { name: string; snippetId: string }[]), + rdpCredentialId: host?.rdpCredentialId ?? "", rdpUser: host?.rdpUser ?? "", rdpPassword: host?.rdpPassword ?? "", domain: host?.domain ?? "", security: host?.security ?? "", ignoreCert: host?.ignoreCert ?? false, + vncCredentialId: host?.vncCredentialId ?? "", vncPassword: host?.vncPassword ?? "", vncUser: host?.vncUser ?? "", telnetUser: host?.telnetUser ?? "", telnetPassword: host?.telnetPassword ?? "", + telnetCredentialId: + host?.telnetCredentialId != null ? String(host.telnetCredentialId) : "", + rdpAuthType: (host?.rdpAuthType ?? + (host?.rdpCredentialId ? "credential" : "direct")) as + | "direct" + | "credential", + vncAuthType: (host?.vncAuthType ?? + (host?.vncCredentialId ? "credential" : "direct")) as + | "direct" + | "credential", + telnetAuthType: (host?.telnetAuthType ?? + (host?.telnetCredentialId ? "credential" : "direct")) as + | "direct" + | "credential", guacamoleConfig: host?.guacamoleConfig ?? {}, statsConfig: host?.statsConfig ?? { - statusCheckEnabled: true, + statusCheckEnabled: d?.statusCheckEnabled ?? true, statusCheckInterval: 60, useGlobalStatusInterval: true, - metricsEnabled: true, + metricsEnabled: d?.metricsEnabled ?? true, metricsInterval: 30, useGlobalMetricsInterval: true, enabledWidgets: [ @@ -229,6 +266,7 @@ export function buildHostEditorPayload( tags: form.tags, pin: form.pin, authType: form.authType, + useWarpgate: form.useWarpgate, password: usesPassword ? form.password || null : null, key: usesKey ? form.key === "existing_key" @@ -246,11 +284,13 @@ export function buildHostEditorPayload( overrideCredentialUsername: form.overrideCredentialUsername, notes: form.notes, macAddress: form.macAddress || null, + wolBroadcastAddress: form.wolBroadcastAddress || null, enableTerminal: form.enableTerminal, enableSessionLogging: form.enableSessionLogging, enableCommandHistory: form.enableCommandHistory, enableTunnel: form.enableTunnel, enableFileManager: form.enableFileManager, + scpLegacy: form.scpLegacy, enableDocker: form.enableDocker, enableTmuxMonitor: form.enableTmuxMonitor, enableProxmox: form.enableProxmox, @@ -276,15 +316,54 @@ export function buildHostEditorPayload( vncPort: Number(form.vncPort), telnetPort: Number(form.telnetPort), forceKeyboardInteractive: form.forceKeyboardInteractive, - rdpUser: form.rdpUser || null, - rdpPassword: form.rdpPassword || null, + rdpAuthType: protocols.enableRdp ? form.rdpAuthType : null, + rdpCredentialId: + protocols.enableRdp && + form.rdpAuthType === "credential" && + form.rdpCredentialId + ? Number(form.rdpCredentialId) + : null, + rdpUser: + protocols.enableRdp && form.rdpAuthType === "direct" + ? form.rdpUser || null + : null, + rdpPassword: + protocols.enableRdp && form.rdpAuthType === "direct" + ? form.rdpPassword || null + : null, rdpDomain: form.domain || null, rdpSecurity: form.security || null, rdpIgnoreCert: form.ignoreCert, - vncPassword: form.vncPassword || null, - vncUser: form.vncUser || null, - telnetUser: form.telnetUser || null, - telnetPassword: form.telnetPassword || null, + vncAuthType: protocols.enableVnc ? form.vncAuthType : null, + vncCredentialId: + protocols.enableVnc && + form.vncAuthType === "credential" && + form.vncCredentialId + ? Number(form.vncCredentialId) + : null, + vncPassword: + protocols.enableVnc && form.vncAuthType === "direct" + ? form.vncPassword || null + : null, + vncUser: + protocols.enableVnc && form.vncAuthType === "direct" + ? form.vncUser || null + : null, + telnetAuthType: protocols.enableTelnet ? form.telnetAuthType : null, + telnetCredentialId: + protocols.enableTelnet && + form.telnetAuthType === "credential" && + form.telnetCredentialId + ? Number(form.telnetCredentialId) + : null, + telnetUser: + protocols.enableTelnet && form.telnetAuthType === "direct" + ? form.telnetUser || null + : null, + telnetPassword: + protocols.enableTelnet && form.telnetAuthType === "direct" + ? form.telnetPassword || null + : null, jumpHosts: form.jumpHosts, portKnockSequence: form.portKnockSequence, tunnelConnections: form.serverTunnels, @@ -324,8 +403,16 @@ export function buildHostEditorPayload( keepaliveInterval: Number(form.keepaliveInterval), keepaliveCountMax: Number(form.keepaliveCountMax), environmentVariables: form.environmentVariables, + useSSHTitle: form.useSSHTitle, syntaxHighlighting: form.syntaxHighlighting, syntaxHighlightingOptions: form.syntaxHighlightingOptions, + backgroundImage: form.backgroundImage || null, + backgroundImageOpacity: Number(form.backgroundImageOpacity), + allowLegacyAlgorithms: form.allowLegacyAlgorithms, + linkClickBehavior: + form.linkClickBehavior !== "default" + ? form.linkClickBehavior + : undefined, } : null, }; diff --git a/src/ui/sidebar/HostEditorFeatureTabs.tsx b/src/ui/sidebar/HostEditorFeatureTabs.tsx index c6b7faa7..5bc3d384 100644 --- a/src/ui/sidebar/HostEditorFeatureTabs.tsx +++ b/src/ui/sidebar/HostEditorFeatureTabs.tsx @@ -72,6 +72,7 @@ export function HostProxmoxTab({ const cfg = form.proxmoxConfig ?? { defaultCredentialId: null, + defaultAuthType: "password", windowsPatterns: "win, windows", dockerPatterns: "docker", preferredPrefixes: "10., 192.168.", @@ -106,6 +107,29 @@ export function HostProxmoxTab({ {form.enableProxmox && ( <> + + + setField("enableFileManager", v)} /> + + setField("scpLegacy", v)} + /> +
)} + {protocols.enableSsh && form.macAddress && ( +
+ + + setField("wolBroadcastAddress", e.target.value) + } + /> +

+ {t("hosts.wolBroadcastAddressDesc")} +

+
+ )}
diff --git a/src/ui/sidebar/HostEditorGuacamoleTabs.tsx b/src/ui/sidebar/HostEditorGuacamoleTabs.tsx index 47225286..3b3eb0fc 100644 --- a/src/ui/sidebar/HostEditorGuacamoleTabs.tsx +++ b/src/ui/sidebar/HostEditorGuacamoleTabs.tsx @@ -14,6 +14,7 @@ import { Shield, Terminal, Zap, + Cpu, } from "lucide-react"; import type { HostEditorForm } from "./HostEditorData"; @@ -42,11 +43,13 @@ export function HostEditorRdpTab({ setField, setGuacField, host, + credentials, }: { form: HostEditorForm; setField: HostEditorSetField; setGuacField: GuacFieldSetter; host?: Host | null; + credentials?: { id: string; name: string; username: string }[]; }) { const { t } = useTranslation(); @@ -78,41 +81,181 @@ export function HostEditorRdpTab({
} + title={t("hosts.statusChecksLabel")} + icon={} + > +
+ + + setField("statsConfig", { + ...form.statsConfig, + statusCheckEnabled: v, + }) + } + /> + + {form.statsConfig.statusCheckEnabled && ( + + + setField("statsConfig", { + ...form.statsConfig, + useGlobalStatusInterval: v, + }) + } + /> + + )} + {form.statsConfig.statusCheckEnabled && + !form.statsConfig.useGlobalStatusInterval && ( + + + setField("statsConfig", { + ...form.statsConfig, + statusCheckInterval: Number(e.target.value), + }) + } + className="w-20 h-7 text-xs text-right [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" + /> + + )} +
+
+ } >
setField("rdpUser", e.target.value)} + placeholder={t("hosts.guac.guacdHostnamePlaceholder")} + value={(form.guacamoleConfig["guacd-hostname"] as string) ?? ""} + onChange={(e) => setGuacField("guacd-hostname", e.target.value)} />
- setField("rdpPassword", e.target.value)} - /> -
-
- setField("domain", e.target.value)} + type="number" + placeholder="4822" + value={(form.guacamoleConfig["guacd-port"] as string) ?? ""} + onChange={(e) => setGuacField("guacd-port", e.target.value)} + className="[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" />
+

+ {t("hosts.guac.guacdProxyDesc")} +

+
+
+ + } + > +
+ {credentials && credentials.length > 0 && ( +
+ +
+ {(["direct", "credential"] as const).map((m) => ( + + ))} +
+
+ )} +
+ {form.rdpAuthType === "credential" && + credentials && + credentials.length > 0 ? ( +
+ + +
+ ) : ( + <> +
+ + setField("rdpUser", e.target.value)} + /> +
+
+ + setField("rdpPassword", e.target.value)} + /> +
+ + )} +
+ + setField("domain", e.target.value)} + /> +
+
@@ -147,6 +290,23 @@ export function HostEditorRdpTab({ onChange={(v) => setField("ignoreCert", v)} /> +
+ + + setGuacField("load-balance-info", e.target.value) + } + /> +

+ {t("hosts.guac.loadBalanceInfoDesc")} +

+
@@ -810,11 +970,13 @@ export function HostEditorVncTab({ setField, setGuacField, host, + credentials, }: { form: HostEditorForm; setField: HostEditorSetField; setGuacField: GuacFieldSetter; host?: Host | null; + credentials?: { id: string; name: string; username: string }[]; }) { const { t } = useTranslation(); @@ -846,31 +1008,169 @@ export function HostEditorVncTab({
} + title={t("hosts.statusChecksLabel")} + icon={} + > +
+ + + setField("statsConfig", { + ...form.statsConfig, + statusCheckEnabled: v, + }) + } + /> + + {form.statsConfig.statusCheckEnabled && ( + + + setField("statsConfig", { + ...form.statsConfig, + useGlobalStatusInterval: v, + }) + } + /> + + )} + {form.statsConfig.statusCheckEnabled && + !form.statsConfig.useGlobalStatusInterval && ( + + + setField("statsConfig", { + ...form.statsConfig, + statusCheckInterval: Number(e.target.value), + }) + } + className="w-20 h-7 text-xs text-right [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" + /> + + )} +
+
+ } >
- setField("vncPassword", e.target.value)} + setGuacField("guacd-hostname", e.target.value)} />
setField("vncUser", e.target.value)} + type="number" + placeholder="4822" + value={(form.guacamoleConfig["guacd-port"] as string) ?? ""} + onChange={(e) => setGuacField("guacd-port", e.target.value)} + className="[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" />
+

+ {t("hosts.guac.guacdProxyDesc")} +

+
+
+ + } + > +
+ {credentials && credentials.length > 0 && ( +
+ +
+ {(["direct", "credential"] as const).map((m) => ( + + ))} +
+
+ )} + {form.vncAuthType === "credential" && + credentials && + credentials.length > 0 ? ( +
+ + +
+ ) : ( +
+
+ + setField("vncPassword", e.target.value)} + /> +
+
+ + setField("vncUser", e.target.value)} + /> +
+
+ )}
@@ -981,6 +1281,28 @@ export function HostEditorVncTab({
+
+ + +
} + title={t("hosts.statusChecksLabel")} + icon={} + > +
+ + + setField("statsConfig", { + ...form.statsConfig, + statusCheckEnabled: v, + }) + } + /> + + {form.statsConfig.statusCheckEnabled && ( + + + setField("statsConfig", { + ...form.statsConfig, + useGlobalStatusInterval: v, + }) + } + /> + + )} + {form.statsConfig.statusCheckEnabled && + !form.statsConfig.useGlobalStatusInterval && ( + + + setField("statsConfig", { + ...form.statsConfig, + statusCheckInterval: Number(e.target.value), + }) + } + className="w-20 h-7 text-xs text-right [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" + /> + + )} +
+
+ } >
setField("telnetUser", e.target.value)} + placeholder={t("hosts.guac.guacdHostnamePlaceholder")} + value={(form.guacamoleConfig["guacd-hostname"] as string) ?? ""} + onChange={(e) => setGuacField("guacd-hostname", e.target.value)} />
- setField("telnetPassword", e.target.value)} + setGuacField("guacd-port", e.target.value)} + className="[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" />
+

+ {t("hosts.guac.guacdProxyDesc")} +

+
+
+ } + > +
+ {credentials && credentials.length > 0 && ( +
+ +
+ {(["direct", "credential"] as const).map((m) => ( + + ))} +
+
+ )} + {form.telnetAuthType === "credential" && + credentials && + credentials.length > 0 ? ( +
+ + +
+ ) : ( +
+
+ + setField("telnetUser", e.target.value)} + /> +
+
+ + setField("telnetPassword", e.target.value)} + /> +
+
+ )}
diff --git a/src/ui/sidebar/HostEditorStatsTab.tsx b/src/ui/sidebar/HostEditorStatsTab.tsx index 9237fce8..1cca465e 100644 --- a/src/ui/sidebar/HostEditorStatsTab.tsx +++ b/src/ui/sidebar/HostEditorStatsTab.tsx @@ -50,20 +50,22 @@ export function HostStatsTab({ } />
- - - setField("statsConfig", { - ...form.statsConfig, - useGlobalStatusInterval: v, - }) - } - /> - + {form.statsConfig.statusCheckEnabled && ( + + + setField("statsConfig", { + ...form.statsConfig, + useGlobalStatusInterval: v, + }) + } + /> + + )} {form.statsConfig.statusCheckEnabled && !form.statsConfig.useGlobalStatusInterval && ( - - - setField("statsConfig", { - ...form.statsConfig, - useGlobalMetricsInterval: v, - }) - } - /> - + {form.statsConfig.metricsEnabled && ( + + + setField("statsConfig", { + ...form.statsConfig, + useGlobalMetricsInterval: v, + }) + } + /> + + )} {form.statsConfig.metricsEnabled && !form.statsConfig.useGlobalMetricsInterval && ( diff --git a/src/ui/sidebar/HostsPanel.tsx b/src/ui/sidebar/HostsPanel.tsx index 955f394e..07c52122 100644 --- a/src/ui/sidebar/HostsPanel.tsx +++ b/src/ui/sidebar/HostsPanel.tsx @@ -39,6 +39,7 @@ import { import { getSSHHosts, bulkImportSSHHosts, + importSSHConfigHosts, exportAllSSHHosts, } from "@/main-axios"; import type { SSHHostWithStatus } from "@/main-axios"; @@ -248,6 +249,9 @@ export function HostsPanel({ const [proxmoxDefaultCredentialId, setProxmoxDefaultCredentialId] = useState< number | null >(null); + const [proxmoxDefaultAuthType, setProxmoxDefaultAuthType] = useState< + string | undefined + >(undefined); const [proxmoxDefaultUsername, setProxmoxDefaultUsername] = useState< string | undefined >(undefined); @@ -267,6 +271,7 @@ export function HostsPanel({ }); const filterActive = Object.values(filterState).some((arr) => arr.length > 0); const fileInputRef = useRef(null); + const sshConfigInputRef = useRef(null); const importOverwriteRef = useRef(false); const allTags = [...new Set(rawHosts.flatMap((h) => h.tags ?? []))]; @@ -501,6 +506,42 @@ export function HostsPanel({ }} /> + { + const file = e.target.files?.[0]; + if (!file) return; + e.target.value = ""; + try { + const text = await file.text(); + const result = await importSSHConfigHosts( + text, + importOverwriteRef.current, + ); + const hosts = await getSSHHosts(); + setRawHosts(hosts); + window.dispatchEvent(new CustomEvent("termix:hosts-changed")); + const msg = [ + result.success ? `${result.success} imported` : null, + result.updated ? `${result.updated} updated` : null, + result.failed ? `${result.failed} failed` : null, + ] + .filter(Boolean) + .join(", "); + toast.success(`${t("hosts.importSSHConfig")}: ${msg}`); + } catch (err: unknown) { + toast.error( + err instanceof Error + ? err.message + : "Failed to import SSH config", + ); + } + }} + /> +
diff --git a/src/ui/sidebar/QuickConnectPanel.tsx b/src/ui/sidebar/QuickConnectPanel.tsx index a9ab717a..460e87d8 100644 --- a/src/ui/sidebar/QuickConnectPanel.tsx +++ b/src/ui/sidebar/QuickConnectPanel.tsx @@ -1,8 +1,10 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Eye, EyeOff, FolderSearch, Terminal } from "lucide-react"; import { Input } from "@/components/input"; import type { Host } from "@/types/ui-types"; +import { getCredentials } from "@/api/credentials-api"; +import { mapCredentials } from "./HostManagerData"; interface QuickConnectPanelProps { onConnect: (host: Host, type: "terminal" | "files") => void; @@ -12,13 +14,23 @@ export function QuickConnectPanel({ onConnect }: QuickConnectPanelProps) { const { t } = useTranslation(); const [host, setHost] = useState(""); const [port, setPort] = useState("22"); - const [username, setUsername] = useState(""); + const [username, setUsername] = useState("root"); const [authType, setAuthType] = useState<"password" | "key" | "credential">( "password", ); const [password, setPassword] = useState(""); const [privateKey, setPrivateKey] = useState(""); const [showPassword, setShowPassword] = useState(false); + const [credentialId, setCredentialId] = useState(""); + const [credentials, setCredentials] = useState< + { id: string; name: string; username: string }[] + >([]); + + useEffect(() => { + getCredentials() + .then((res) => setCredentials(mapCredentials(res))) + .catch(() => {}); + }, []); const connect = (type: "terminal" | "files") => { if (!host || !username) return; @@ -31,6 +43,7 @@ export function QuickConnectPanel({ onConnect }: QuickConnectPanelProps) { authType, password: authType === "password" ? password : undefined, key: authType === "key" ? privateKey : undefined, + credentialId: authType === "credential" ? credentialId : undefined, folder: "", online: false, cpu: null, @@ -94,6 +107,12 @@ export function QuickConnectPanel({ onConnect }: QuickConnectPanelProps) { { + if (username === "root") setUsername(""); + }} + onBlur={() => { + if (username === "") setUsername("root"); + }} onChange={(e) => setUsername(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") connect("terminal"); @@ -172,12 +191,25 @@ export function QuickConnectPanel({ onConnect }: QuickConnectPanelProps) { - +
)}
diff --git a/src/ui/sidebar/SSOProviderDialog.tsx b/src/ui/sidebar/SSOProviderDialog.tsx index 12f3a99c..3f1888fb 100644 --- a/src/ui/sidebar/SSOProviderDialog.tsx +++ b/src/ui/sidebar/SSOProviderDialog.tsx @@ -51,6 +51,7 @@ function emptyOidc(): OIDCProviderConfig { allowed_users: "", admin_group: "", group_claim: "", + ca_cert: "", }; } @@ -84,6 +85,7 @@ type OIDCFields = { allowed_users: string; admin_group: string; group_claim: string; + ca_cert: string; }; type LDAPFields = { @@ -175,6 +177,7 @@ export function SSOProviderDialog({ allowed_users: (config.allowed_users as string) ?? d.allowed_users, admin_group: (config.admin_group as string) ?? d.admin_group, group_claim: (config.group_claim as string) ?? "", + ca_cert: (config.ca_cert as string) ?? "", }); } } else { @@ -218,19 +221,29 @@ export function SSOProviderDialog({ allowedUsers: ldap.allowedUsers || undefined, }; } + const providerDefaults = + type === "google" + ? googleDefaults + : type === "github" + ? githubDefaults + : null; return { client_id: oidc.client_id, client_secret: oidc.client_secret, - issuer_url: oidc.issuer_url, - authorization_url: oidc.authorization_url, - token_url: oidc.token_url, - userinfo_url: oidc.userinfo_url || undefined, - identifier_path: oidc.identifier_path, - name_path: oidc.name_path, - scopes: oidc.scopes, + issuer_url: oidc.issuer_url || providerDefaults?.issuer_url || "", + authorization_url: + oidc.authorization_url || providerDefaults?.authorization_url || "", + token_url: oidc.token_url || providerDefaults?.token_url || "", + userinfo_url: + oidc.userinfo_url || providerDefaults?.userinfo_url || undefined, + identifier_path: + oidc.identifier_path || providerDefaults?.identifier_path || "sub", + name_path: oidc.name_path || providerDefaults?.name_path || "name", + scopes: oidc.scopes || providerDefaults?.scopes || "openid email profile", allowed_users: oidc.allowed_users || undefined, admin_group: oidc.admin_group || undefined, group_claim: oidc.group_claim || undefined, + ca_cert: oidc.ca_cert || undefined, }; } @@ -395,8 +408,24 @@ function OIDCConfigFields({ simplified: boolean; t: (key: string) => string; }) { - const githubAuthUrl = "https://github.com/login/oauth/authorize"; - const googleAuthUrl = "https://accounts.google.com/o/oauth2/v2/auth"; + const githubDefaults = { + authorization_url: "https://github.com/login/oauth/authorize", + token_url: "https://github.com/login/oauth/access_token", + issuer_url: "https://token.actions.githubusercontent.com", + userinfo_url: "https://api.github.com/user", + scopes: "read:user user:email", + identifier_path: "id", + name_path: "name", + }; + const googleDefaults = { + authorization_url: "https://accounts.google.com/o/oauth2/v2/auth", + token_url: "https://oauth2.googleapis.com/token", + issuer_url: "https://accounts.google.com", + userinfo_url: "https://openidconnect.googleapis.com/v1/userinfo", + scopes: "openid email profile", + identifier_path: "sub", + name_path: "name", + }; const docsHref = simplified ? "https://docs.termix.site/features/authentication/github-google" : "https://docs.termix.site/features/authentication/oidc"; @@ -434,8 +463,8 @@ function OIDCConfigFields({
{type === "github" - ? `Authorization URL: ${githubAuthUrl}` - : `Authorization URL: ${googleAuthUrl}`} + ? `Authorization URL: ${githubDefaults.authorization_url}` + : `Authorization URL: ${googleDefaults.authorization_url}`}
) : ( @@ -531,6 +560,20 @@ function OIDCConfigFields({ className="text-xs" /> + + + {t("admin.oidcCaCertDesc")} + +