mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-29 22:55:24 +00:00
+16



![dependabot[bot]](/assets/img/avatar_default.png)





Luke Gustafson
ZacharyZcR
Angad Singh
Angad Singh
Neo
dependabot[bot]
Wali Lambert
Nasif Rahman
Claude Opus 5
vietanhtwdk
inontz
inontz
Max Serov
Max
ssmurfgg04-gif
ssmurfgg04-gif
ZacharyZcR
slsgzs-cloud
anshtsolanki-sketch
Cursor
tcezarl
Anton Priestley
Hakim M
copilot-swe-agent[bot]
Adel Alzubeir
Copilot Autofix powered by AI
fef8a5f28a
* Fix private AI custom endpoints (#1299) * Fix Proxmox credential guest imports (#1300) * Fix Fleet command results layout (#1301) * Fix synced client tunnel endpoints (#1302) * Fix Proxmox sync jump host persistence (#1303) * Fix command palette keyboard navigation (#1304) * Add accessible interface font choices (#1306) * Add selectable host temperature sensors (#1307) * Improve file manager navigation and compact layout (#1308) * Add configurable global hotkeys (#1305) * fix: restore split layout selection (#1310) * fix: support macOS VNC connections (#1311) * fix: use matching Undici fetch for private AI providers (#1309) Co-authored-by: Angad Singh <angad@singhangad.in> * feat: support additional TOTP authenticators (#1312) * feat: add VNC display zoom controls (#1314) * feat: add host context menu actions (#1315) * fix: force classic auth for macOS VNC (#1313) * fix: harden HTTP trust boundaries (#1316) * fix: harden application trust boundaries (#1317) * fix: verify OPKSSH binary integrity (#1318) * Fix remote desktop connection timeout (#1319) * chore(deps): bump node in /docker in the docker-major-updates group (#1321) Bumps the docker-major-updates group in /docker with 1 update: node. Updates `node` from 24-slim to 26-slim --- updated-dependencies: - dependency-name: node dependency-version: 26-slim dependency-type: direct:production dependency-group: docker-major-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump the dev-patch-updates group with 15 updates (#1322) Bumps the dev-patch-updates group with 15 updates: | Package | From | To | | --- | --- | --- | | [@codemirror/view](https://github.com/codemirror/view) | `6.43.7` | `6.43.9` | | [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `21.2.1` | `21.2.2` | | [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) | `21.2.0` | `21.2.2` | | [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) | `7.0.0` | `7.0.1` | | [@testing-library/user-event](https://github.com/testing-library/user-event) | `14.6.1` | `14.6.5` | | [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `4.1.10` | `4.1.11` | | [@vitest/ui](https://github.com/vitest-dev/vitest/tree/HEAD/packages/ui) | `4.1.10` | `4.1.11` | | [concurrently](https://github.com/open-cli-tools/concurrently) | `10.0.4` | `10.0.5` | | [cytoscape](https://github.com/cytoscape/cytoscape.js) | `3.34.0` | `3.34.1` | | [eslint](https://github.com/eslint/eslint) | `10.8.0` | `10.8.1` | | [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.5.3` | `0.5.4` | | [react-i18next](https://github.com/i18next/react-i18next) | `17.0.11` | `17.0.12` | | [sonner](https://github.com/emilkowalski/sonner) | `2.0.7` | `2.0.8` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.2.0` | `8.2.2` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.10` | `4.1.11` | Updates `@codemirror/view` from 6.43.7 to 6.43.9 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/commits) Updates `@commitlint/cli` from 21.2.1 to 21.2.2 - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.2.2/@commitlint/cli) Updates `@commitlint/config-conventional` from 21.2.0 to 21.2.2 - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.2.2/@commitlint/config-conventional) Updates `@testing-library/jest-dom` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/testing-library/jest-dom/releases) - [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/jest-dom/compare/v7.0.0...v7.0.1) Updates `@testing-library/user-event` from 14.6.1 to 14.6.5 - [Release notes](https://github.com/testing-library/user-event/releases) - [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/user-event/compare/v14.6.1...v14.6.5) Updates `@vitest/coverage-v8` from 4.1.10 to 4.1.11 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/coverage-v8) Updates `@vitest/ui` from 4.1.10 to 4.1.11 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/ui) Updates `concurrently` from 10.0.4 to 10.0.5 - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v10.0.4...v10.0.5) Updates `cytoscape` from 3.34.0 to 3.34.1 - [Release notes](https://github.com/cytoscape/cytoscape.js/releases) - [Commits](https://github.com/cytoscape/cytoscape.js/compare/v3.34.0...v3.34.1) Updates `eslint` from 10.8.0 to 10.8.1 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v10.8.0...v10.8.1) Updates `eslint-plugin-react-refresh` from 0.5.3 to 0.5.4 - [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases) - [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md) - [Commits](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/compare/v0.5.3...v0.5.4) Updates `react-i18next` from 17.0.11 to 17.0.12 - [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/react-i18next/compare/v17.0.11...v17.0.12) Updates `sonner` from 2.0.7 to 2.0.8 - [Release notes](https://github.com/emilkowalski/sonner/releases) - [Commits](https://github.com/emilkowalski/sonner/compare/v2.0.7...v2.0.8) Updates `vite` from 8.2.0 to 8.2.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v8.2.2/packages/vite) Updates `vitest` from 4.1.10 to 4.1.11 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/vitest) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-version: 6.43.9 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@commitlint/cli" dependency-version: 21.2.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@commitlint/config-conventional" dependency-version: 21.2.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@testing-library/jest-dom" dependency-version: 7.0.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@testing-library/user-event" dependency-version: 14.6.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@vitest/coverage-v8" dependency-version: 4.1.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@vitest/ui" dependency-version: 4.1.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: concurrently dependency-version: 10.0.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: cytoscape dependency-version: 3.34.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: eslint dependency-version: 10.8.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: eslint-plugin-react-refresh dependency-version: 0.5.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: react-i18next dependency-version: 17.0.12 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: sonner dependency-version: 2.0.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: vite dependency-version: 8.2.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: vitest dependency-version: 4.1.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the prod-patch-updates group with 5 updates (#1324) Bumps the prod-patch-updates group with 5 updates: | Package | From | To | | --- | --- | --- | | [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual) | `3.14.9` | `3.14.10` | | [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | `13.0.2` | `13.0.3` | | [jose](https://github.com/panva/jose) | `6.2.8` | `6.2.9` | | [mysql2](https://github.com/sidorares/node-mysql2) | `3.23.2` | `3.23.4` | | [ws](https://github.com/websockets/ws) | `8.21.1` | `8.21.3` | Updates `@tanstack/react-virtual` from 3.14.9 to 3.14.10 - [Release notes](https://github.com/TanStack/virtual/releases) - [Changelog](https://github.com/TanStack/virtual/blob/main/packages/react-virtual/CHANGELOG.md) - [Commits](https://github.com/TanStack/virtual/commits/@tanstack/react-virtual@3.14.10/packages/react-virtual) Updates `better-sqlite3` from 13.0.2 to 13.0.3 - [Release notes](https://github.com/WiseLibs/better-sqlite3/releases) - [Commits](https://github.com/WiseLibs/better-sqlite3/compare/v13.0.2...v13.0.3) Updates `jose` from 6.2.8 to 6.2.9 - [Release notes](https://github.com/panva/jose/releases) - [Changelog](https://github.com/panva/jose/blob/main/CHANGELOG.md) - [Commits](https://github.com/panva/jose/compare/v6.2.8...v6.2.9) Updates `mysql2` from 3.23.2 to 3.23.4 - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.23.2...v3.23.4) Updates `ws` from 8.21.1 to 8.21.3 - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.21.1...8.21.3) --- updated-dependencies: - dependency-name: "@tanstack/react-virtual" dependency-version: 3.14.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: better-sqlite3 dependency-version: 13.0.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: jose dependency-version: 6.2.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: mysql2 dependency-version: 3.23.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: ws dependency-version: 8.21.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump motion in the major-updates group (#1326) Bumps the major-updates group with 1 update: [motion](https://github.com/motiondivision/motion). Updates `motion` from 12.43.0 to 13.1.1 - [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md) - [Commits](https://github.com/motiondivision/motion/compare/v12.43.0...v13.1.1) --- updated-dependencies: - dependency-name: motion dependency-version: 13.1.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: major-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: add semantic motion system (#1320) * feat: add semantic motion system * feat: animate session workspace transitions * feat: refine motion accessibility and transfer feedback * feat: enforce RBAC and harden collaboration features (#1327) * feat: enforce RBAC and harden collaboration features - Mount requirePermission on hosts/snippets/credentials/automations/AI routes - Seed and backfill system role permissions on every dialect at startup - Support personal credential overrides for RDP/VNC/Telnet shared hosts - Broadcast participant presence in shared terminal sessions - Make audit log forwarding configurable from the admin panel - Add role members endpoint and snippet folder sharing * fix: enforce RBAC across split routes * fix: reject malformed Guacamole tokens safely (#1329) * fix: allow approved private notification hosts (#1330) * feat: collaboration rooms with switchable presenter (#1328) * feat: add collaboration rooms with switchable presenter Rooms are a group of members watching one stage - the live SSH/RDP/VNC session the current presenter shares. Any member can take over the stage; the host can invite, force-stop and end the meeting. Stages reuse session_shares (new room share type), so gating, recording, expiry and the global sharing toggle all apply unchanged. * feat: add stage control handoff to collaboration rooms The presenter or host can grant any member write access to the live stage and take it back; members can raise a hand to ask. SSH flips the participant's permission on the live gate; RDP/VNC re-mint the viewer's join token. Control clears on every stage switch. * feat: guest links, role invites and invite awareness for collab rooms - Anonymous guest link per room (host toggles/rotates), followed by polling the public resolve endpoint; SSH guests join over the terminal WS with roomGuestToken, guac guests get read-only join tokens - Invite by role (expands to current members, snapshot semantics) - Toast when a room you were invited to appears - Stale stages are cleared lazily when the presenter is gone - Telnet presenting, expired-tab fallback, documented single-instance and guac-kick limits - Tests for the collab routes, room hub, share access and control flip * fix: keep remote desktop collaboration read-only * fix: restore RDP clipboard paste across browsers (#1331) * fix: show the full command line in the process inspector (#1334) The CMD column rendered ps's comm field, which the kernel caps at 15 characters, so anything longer looked truncated no matter how wide the column was. The full args were already collected; show them. * fix: harden collaboration room access (#1332) * fix: harden collaboration room access * fix: confirm guest link lifecycle changes * fix: make RDP drive redirection writable on the stock deployment (#1333) * fix: make RDP drive redirection writable on the stock deployment The default drive-path was /drive on the guacd side, which the official guacd image cannot create as its non-root user, so every upload was refused with guacd's raw "FAIL (CANNOT OPEN)" ack. Default to GUACD_DRIVE_PATH (set to the shared termix-data volume in compose) with one folder per user, and explain guacd's refusal in the file browser. * style: format RDP drive settings * feat: quick connect for RDP and VNC (#1335) The Quick Connect panel gets a protocol switch. RDP/VNC quick hosts are built like SSH ones (never saved) and opened as regular remote desktop tabs; GuacamoleApp mints their token from the typed fields through the existing /guacamole/token endpoint instead of a host-row lookup. * fix: authenticate unwatched hosts during the status probe (#1337) With metrics enabled, the status probe left SSH authentication to the metrics poll - which only runs while someone is viewing the host. An unwatched host therefore never left "reachable", while a host with metrics disabled (whose probe always authenticates) showed online. The probe now authenticates whenever no metrics poll will. * feat: compact snippet list option (#1339) A "Show Commands" toggle in the snippets settings menu hides the command text under each snippet name, for people who dock the panel on the narrow right rail and only need the names. Local preference, on by default. * fix: guide users to Auto-Tmux when a persisted session expires (#1336) * fix: guide users to Auto-Tmux when a persisted session expires A timed-out terminal session silently reconnected to a fresh shell, so people running long jobs lost them with no explanation and never learned about Auto-Tmux. Explain the expiry with a one-click Enable Auto-Tmux action, let admins default it for new hosts and tune the persistence timeout from the UI, and move the setting up with copy that says what it does. The global default stays off. * style: format terminal expiry notice * feat: improve collaboration rooms (#1338) * feat: Step CA SSH certificates as a host authentication type (#1340) * feat: Step CA SSH certificates as a host authentication type Issue short-lived SSH user certificates from a smallstep CA through its OIDC provisioner, over the CA's HTTP API rather than the step binary. Everything after issuance reuses the OPKSSH plumbing: the same encrypted per-user/host token store, WebSocket dialog and ssh2 certificate injection, with the connect paths branching on a shared usesIssuedCertificate() predicate. Instance-wide CA settings live in the admin panel, with a private-host allowlist for the SSRF guard. * fix: harden Step CA callback flow * style: format Step CA changes * feat: 1Password Connect secret sources for SSH credentials (#1341) * feat: 1Password Connect secret sources for SSH credentials Hosts and credentials can hold op://vault/item/field references instead of secrets; they are resolved at connect time from the user's secret source (1Password Connect) at the single point where every subsystem receives plaintext credentials, so terminal, SFTP, Docker, metrics and tunnels all work without per-subsystem changes. Sources are per user, optionally shared, with the access token encrypted under the owner's data key; resolved values are cached briefly in memory. * style: format secret source changes * feat: share credentials with users and roles, inherit data on account deletion (#1342) * feat: share credentials with users and roles, inherit data on account deletion Credentials can be shared at "use" or "manage" level. Recipients get a copy re-encrypted under their own data key (shared_credential_secrets), kept in step with the owner's row through the same lifecycle hooks as shared host secrets. One gate, findUsableCredential(), replaces the private-namespace lookups so a shared credential works wherever a private one does. Deleting a user now hands their hosts and credentials to a successor (the deleting admin by default) instead of revoking everything they shared. * fix: harden credential ownership transfer * feat: folder shares apply to hosts added later (#1343) * feat: folder shares apply to hosts added later Sharing a folder only fanned grants out to the hosts in it at the time. The share is now also kept as a standing rule on the folder, and a host created in or moved into it (or a subfolder) inherits the same access and secret snapshots. Rules follow folder renames and can be stopped from the share dialog. * fix: stabilize folder access migrations * fix: package sharp for both macOS architectures (#1344) * fix: prompt shared RDP users for credentials (#1345) * feat: add terminal copy-on-select option (#1346) * fix: retry protected file reads with sudo (#1349) * fix: stop SSH-authenticating hosts during routine status polling (#1347) * fix: preserve omitted host protocol settings (#1350) * fix: surface remote sync reauthentication failures (#1351) * fix: harden file reads and timer cleanup (#1352) * fix: harden file reads and timer cleanup * fix: preserve literal file path escapes * fix: enforce SSH pool connection limits (#1353) * fix: enforce SSH pool connection limits * fix: discard stale pooled connections * fix: harden connection, payload, and persisted state handling (#1354) * fix: clean up Cloudflare tunnel timeouts * fix: couple tunnel socket lifecycle * fix: validate Docker console messages * fix: bound homepage proxy responses * fix: bound reconnect and response failures * fix: harden persisted and socket state * fix: support local connections to shared hosts * fix: recover expired dashboard metrics sessions (#1355) * fix: upload files to redirected RDP drives (#1356) * fix: unify connection toolbar visibility (#1357) * fix: reset host virtualizer after editing (#1358) * test: update Guacamole toolbar display mock (#1360) * fix: reflect live SSH sessions in host status (#1359) * fix: support Vault auth in file manager (#1361) * fix: allow exec on shared hosts (#1362) * fix(file-manager): align chunked upload contract (#1371) * fix(file-manager): make bulk uploads resilient (#1373) * fix(terminal): disable local echo on alternate screen (#1372) * fix(homepage): validate clock widget timezones (#1374) An invalid timezone in a clock widget's config reached toLocaleTimeString unchecked, throwing RangeError during render and taking the homepage canvas down with it. The edit dialog accepted any string, so "America/New York" - a space where IANA wants an underscore - was easy to save, and the homepage stayed broken on every later load because the value is reloaded from the database. The edit dialog now flags an unusable zone the way FolderMetadataDialog flags a duplicate folder name: inline message, aria-invalid, and a disabled Save. Whitespace is normalized to underscores on save, so the space spelling is stored as America/New_York rather than rejected. ClockWidget falls back to local time for any config already holding an invalid zone. Related to Termix-SSH/Support#1238 * fix(hosts): preserve connection origin in editor (#1376) * fix(remote-sync): expose local login notification (#1375) * fix(auth): allow passkeys in desktop login (#1378) * fix(proxmox): elevate guest discovery commands (#1379) * Fix permanent file-transfer completion toasts (#1383) * fix(file-manager): expire completed progress toasts * test(file-manager): use valid transfer status * fix(hosts): allow clearing SSH key type (#1384) * fix(terminal): suppress local echo for contextual password prompts (#1387) * fix(desktop): surface a failed embedded backend start (#1382) * fix(desktop): surface a failed embedded backend start When the embedded backend's HTTP port was already taken, the desktop app sat on the "Loading..." spinner forever with nothing in the UI to say why. The backend logged the conflict and exited 1, and startBackendServer resolved false, but that verdict never reached the renderer: the get-embedded-server-status channel was not exposed in preload and nothing called it. The renderer, by design, treats every connection failure as "the embedded backend is still booting" and retries indefinitely -- in main.tsx's verifying phase, in Auth's desktop auto-session, and in FullScreenAppWrapper. That holds while the backend is merely slow to boot, but not once the process has exited, and nothing distinguished the two. Classify why the child died from its exit code and a bounded tail of its stderr, report it through get-embedded-server-status, and have each retry loop keep waiting only while no failure is reported. A port conflict names the port, since that is what the user has to act on -- most often a Termix container on the same ports, or a backend orphaned by a hard-kill that reapOrphanedBackendProcess could not claim. A deliberate shutdown is not reported as a crash, and a backend that is only slow to start still gets retried as before. Fixes Termix-SSH/Support#1254 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(desktop): treat every unrequested backend exit as a failure The classifier exempted a clean exit and SIGTERM/SIGINT, calling those a deliberate shutdown. It has no evidence for that: its only caller already sits behind backendStopRequested, so it is reached only for exits stopBackendServer() did not ask for. A backend that exited 0 on its own, or was terminated by the OS or an external signal, therefore reported no failure at all -- leaving all three renderer loops waiting forever for a process that is gone, which is the exact hang this change set exists to remove. Every exit reaching the classifier is now a failure, port-in-use when stderr carries EADDRINUSE and crashed otherwise, with backendStopRequested left as the sole deliberate-shutdown guard. That makes the exit code and signal irrelevant to the verdict, so the classifier now takes only the stderr tail rather than carrying two parameters it no longer reads. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * Add white label branding settings (#1386) * feat(admin): add white label branding settings Admins can configure a custom app name, logo and tagline from the Admin Settings panel. The values apply to the login screen and the browser tab title/favicon at runtime. * fix(admin): restore default icons on logo reset, validate upload MIME type Resetting the logo now restores the bundled favicon/apple-touch-icon instead of leaving the previous custom one until a reload. The admin upload also validates file.type up front instead of only failing later on save. * fix(admin): restore default favicons and reject invalid logo types Capture bundled icon hrefs before the first custom logo is applied so a reset does not leave the previous upload in the tab, and reject non-image uploads before they are read into branding state. * test(admin): cover branding routes and logo validation Add backend tests for the public GET, admin-only PATCH, unknown-field rejection, and parseBrandingLogoDataUrl so invalid images cannot land in settings without a failing test. * fix(backend): report port conflicts on the service ports (#1388) Express's app.listen(port, host, callback) registers that callback as the server's error handler as well as its listening handler: if (typeof args[args.length - 1] === 'function') { var done = args[args.length - 1] = once(args[args.length - 1]) server.once('error', done) } so a bind failure invoked the service's "started" callback with an EADDRINUSE error as its only argument and emitted nothing. None of the services read that argument, which made a failed bind indistinguishable from a successful one: the service logged that it had started, ran its initialisation, and served nothing. With one of 30003-30012 occupied the backend still reported backend_init_complete, the app loaded, and the affected feature was dead for the session with no error anywhere in the logs -- searching the backend log, the Electron main log and stdout for EADDRINUSE returned nothing, as did uncaughtException and unhandledRejection probes. This is also why only the main port behaved sensibly: database.ts does not use app.listen(), it builds the server and attaches a real error handler, so 30001 was the one port whose conflict was ever detected. listenOnServicePort() builds the server so that listening and error stay separate, and treats a conflict the way database.ts already does -- name the port, then exit -- rather than running on with one feature missing. Exiting also hands the desktop app the classified failure it already surfaces, so the user is told which port to free. Services that must own their server, such as the tunnel service with its WebSocket upgrade handler, get the same handler via attachServicePortConflictHandler(). Note that adding .on("error") to the services would not have worked: express consumes the event through once('error', done) before any later handler runs. The callback has to stop being passed to listen() at all. Fixes Termix-SSH/Support#1260 Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * feat(desktop): allow RDP/VNC/Telnet to originate from this device (#1389) The desktop pinned rdp/vnc/telnet to the remote server, so a host the user's own machine could reach but the Termix server could not was impossible to open: the app answered "Remote server required" even when no remote server was wanted. The embedded backend already runs the Guacamole websocket server and guacd's address is already configurable globally and per host, so what was missing was the choice. resolveConnectionOrigin now honours an explicit per-host origin for these protocols. Left on Default they still resolve to remote: they need a guacd, which the desktop does not ship, so originating locally only works once the user has pointed Termix at one of their own. Keeping that opt-in means an upgrade never moves a working connection onto a guacd that is not there. Serial and non-Electron behaviour are unchanged. Three call paths had the same assumption baked in and would have quietly ignored the setting: - The Guacamole call sites resolved the origin without passing the host's own override, so it could never take effect. - guacamole-api sent every token, connect-host and status call to the remote server whenever running under Electron, and remapped the host id onto the remote server's id -- which would address the wrong row, or fail outright with no server configured. - GuacamoleDisplay minted its token before resolving the origin, so the token could come from a different backend than the socket dialled. The origin is a required parameter on those API functions rather than a defaulted one. A default silently sent a missed call site to the remote server: the guacd status check in fetchToken was one, and it failed with a bare "Network Error" on a desktop with no server configured. Making it required means the compiler names every caller instead. That also covers CollabRoomTab, which now resolves from the host it already holds, so a locally-originated host stays local when presented into a room. Finally, the Connection Origin control was gated on SSH alone, so a host enabling only these protocols could never reach the setting. That gate is now a named predicate covering every protocol the control applies to. Verified end to end on Linux against a local guacd: with a host set to "This device", guacd accepted the connection and reached the target, which answered for itself. With guacd stopped, the guacd status check that has run before every connection since v2.3.0 -- now asking the backend the session will actually use -- reports it clearly before a socket is opened. Refs Termix-SSH/Support#1240 Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * feat(local-terminal): add copy/paste support (#1391) * feat(local-terminal): add copy/paste support Local terminal had no clipboard wiring, so selected text couldn't be copied. Extracted the SSH terminal's copy/paste shortcut and right-click handling into a shared terminal-clipboard module and wired it into both terminals, removing duplicated logic in the process. * fix(local-terminal): stop language changes from restarting the shell session The session effect that starts the local PTY depended on `t`, whose identity changes on every language switch (react-i18next). That tore down the running shell and spawned a new one just from changing the UI language. Read translations through a ref instead so localization stays decoupled from the PTY lifecycle. Also adds regression coverage for the extracted terminal-clipboard.ts helpers: copy with/without selection, explicit vs native paste, right-click preference, and Ctrl+right-click passthrough. * fix(file-manager): keep name column visible on narrow viewports in list view (#1402) Rebased onto dev-2.8.0 (the density refactor kept the same 3 list-view grid patterns). Use minmax(140px, 1fr) for the name track so it cannot collapse to 0px on narrow viewports; the table scrolls horizontally instead of hiding names and icons. Co-authored-by: inontz <inontz@users.noreply.github.com> * feat(desktop): local filesystem and transfer bridge for the file manager (#1392) * feat(desktop): local filesystem and transfer bridge for the file manager Adds the Electron main-process side of the upcoming Local | Remote dual-pane file manager, with no UI yet: - electron/local-files.cjs: IPC handlers to browse the local disk (home, list, mkdir, createFile, rename, trash, ensureDir, walk, reveal, open) and to stream files between the local disk and the file-manager backend (uploadLocalFile / downloadToLocal with progress events and cancellation). Streams go through Electron's `net` so the session cookie / remembered JWT is attached the same way as the renderer's own requests. - electron/preload.js: exposes them as `window.electronAPI.localFs` and `window.electronAPI.localTransfer`; the existing `invoke` allowlist is untouched. - src/types/electron.d.ts: typings for the new surface. - electron/main.cjs: registers the handlers. Follow-up PRs add the renderer side (local pane, drag-and-drop transfers, context menu). * fix(desktop): harden the local transfer bridge (origin allowlist, collision policy) Addresses the review on the transfer boundary: - The renderer no longer supplies a URL or headers. It sends `{ origin: "local" | "remote", route, deviceId }` and the main process resolves the target itself: fixed route allowlist (`uploadFileStream`, `downloadFileStream`), local = the embedded backend base, remote = the remote-sync config's URL (http/https only) with the stored JWT. Anything else is rejected before a request is made. `deviceId` is validated. - Downloads never rename or replace silently. The destination is checked first and `EEXIST` is returned unless the caller passes `overwrite: true`. Each transfer writes to its own `<dest>.<transferId>.termix-part` opened with `wx`, and publishes with `fs.link` / `COPYFILE_EXCL` (rename only when overwriting), so concurrent transfers to the same path cannot share or clobber a partial (`EBUSY` for the second). Partials are removed on failure or cancel. - New `local-fs:exists` handler so the renderer can ask before starting. - `createLocalFileHandlers` / `createTargetResolver` take their dependencies (net, shell, remote-sync getters) as parameters so the boundary is unit-testable without Electron. - src/backend/tests/electron/local-files.test.ts: target resolution and off-origin refusal, EEXIST / EBUSY / overwrite paths, unique partials and cleanup, upload multipart integrity (parsed with Busboy). * fix(desktop): Windows-safe replace for overwrite downloads `publishDownload()` used `rename(partial, dest)` for the explicit overwrite path. POSIX replaces the destination, but on Windows rename() onto an existing name commonly fails (EEXIST / EPERM, always while the file is open), so "Replace" did not actually work there. The overwrite path no longer renames onto an occupied name: 1. the current file is moved aside to a transfer-unique sibling (`<dest>.<transferId>.termix-replaced`) - renaming to a fresh name is safe on every platform; 2. the partial is published exclusively under the now-free name (the same `link` / `COPYFILE_EXCL` primitive the non-overwrite path uses); 3. the aside copy is deleted (retried once; if another process still holds it open on Windows it is left in place and logged rather than failing the transfer). Failure handling preserves the original: if step 1 fails (file in use) nothing has changed and the caller gets `EBUSY`; if step 2 fails the aside copy is moved back under its name and the error propagates. Replacing a folder with a file is refused with `EISDIR`; a destination that vanished mid-transfer falls back to the exclusive publish. The publish primitives take their filesystem operations as an injectable `publishFs` (default: real fs), and the tests drive them with a Windows-like fs whose rename() refuses to overwrite - so the strategy is verified without relying on POSIX rename-over-existing semantics: successful swap with no rename ever targeting an occupied name, original restored byte-for-byte when publishing fails, EBUSY with nothing touched when the file cannot be moved aside, EISDIR for folders, vanished destination, and the end-to-end overwrite through the download handler. --------- Co-authored-by: Max <maxim@cogitate.ai> * chore: update package lock * feat(file-manager): Termius-style Local | Remote dual pane with drag-and-drop transfers (desktop) Renderer side of the dual-pane file manager, built on the local filesystem bridge added in the previous PR. Desktop app only; the web build is unchanged (the toggle is hidden when `window.electronAPI.localFs` is absent). - New Local pane (LocalFilePane) next to the remote grid, toggled from the toolbar (Laptop icon); path, visibility and width are remembered in localStorage (`termix:file-manager:local-pane:*`). Grid and list views, hidden files toggle, breadcrumb navigation, New Folder. - Drag files/folders from the Local pane onto the remote grid to upload, and from the remote grid onto the Local pane to download. Both directions stream through the main process (`useLocalTransfers`) with a single progress toast per batch (speed, ETA, cancel). Finder drops onto the remote grid keep working as before. - Collision policy for downloads: destinations are checked first; if any exist the user is asked Replace / Skip for the batch. Skip, dismiss and timeout all mean skip - nothing is ever replaced without an explicit click, and the main process enforces the same rule (`EEXIST` unless `overwrite` is set). - Drag MIME contract: `application/x-termix-local-files` for local drags, `application/x-termix-remote-files` marker on the remote grid's internal drags, so each pane can tell the two apart from Finder drops. - Transfer targets are described as `{ origin, route, deviceId }` (`getSessionOrigin` in main-axios) - the renderer never hands the main process a URL. - i18n: new `fileManager.local*` keys in en.json only (other locales via Crowdin). - Tests: LocalFilePane rendering/navigation, local-transfer-utils (relative-path planning, size formatting). - Modified column uses the same `Mon DD HH:MM` / `Mon DD YYYY` (ls -l style) format as the remote grid, so both panes read alike. * docs: point security note to the docs root (old /security page is gone) (#1400) * chore: sync Crowdin translations * chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325) Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg). Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0) Updates `js-yaml` from 5.2.3 to 5.3.0 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/5.2.3...5.3.0) Updates `pg` from 8.22.0 to 8.23.0 - [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg) --- updated-dependencies: - dependency-name: "@anthropic-ai/sdk" dependency-version: 0.120.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: js-yaml dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: pg dependency-version: 8.23.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323) Bumps the dev-minor-updates group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` | | [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` | | [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` | | [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` | | [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` | | [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` | Updates `@codemirror/commands` from 6.10.4 to 6.11.0 - [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/commands/commits) Updates `@types/node` from 26.1.2 to 26.2.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react) Updates `electron` from 43.2.0 to 43.4.1 - [Release notes](https://github.com/electron/electron/releases) - [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1) Updates `globals` from 17.9.0 to 17.11.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0) Updates `i18next` from 26.3.6 to 26.4.0 - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0) Updates `lucide-react` from 1.28.0 to 1.33.0 - [Release notes](https://github.com/lucide-icons/lucide/releases) - [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react) Updates `react-hook-form` from 7.84.0 to 7.85.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0) Updates `react-pdf` from 10.4.1 to 10.5.0 - [Release notes](https://github.com/wojtekmaj/react-pdf/releases) - [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf) Updates `typescript-eslint` from 8.66.0 to 8.67.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@codemirror/commands" dependency-version: 6.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@types/node" dependency-version: 26.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@vitejs/plugin-react" dependency-version: 6.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: electron dependency-version: 43.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: globals dependency-version: 17.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: i18next dependency-version: 26.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: lucide-react dependency-version: 1.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-hook-form dependency-version: 7.85.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-pdf dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: typescript-eslint dependency-version: 8.67.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: sync Crowdin translations * Update redirect-issues workflow configuration Updated the workflow to change the runner and modify the issue response message. * chore: sync Crowdin translations * Add Hetzner logo and referral link to README Added Hetzner logo with a referral link to README. * Fix Hetzner logo URL in README.md * docs: point security note to the feature security page The old /security page is gone and the docs root redirects to /install/, which loses the encryption context the sentence promises. Point the per-user secret and database encryption note at the canonical docs.termix.site/features/authentication/security/ page instead. Applied across all README locales. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: ssmurfgg04-gif <232103099+ssmurfgg04-gif@users.noreply.github.com> Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com> * fix: use i18n for host status tooltip labels (#1403) * chore: sync Crowdin translations * chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325) Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg). Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0) Updates `js-yaml` from 5.2.3 to 5.3.0 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/5.2.3...5.3.0) Updates `pg` from 8.22.0 to 8.23.0 - [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg) --- updated-dependencies: - dependency-name: "@anthropic-ai/sdk" dependency-version: 0.120.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: js-yaml dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: pg dependency-version: 8.23.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323) Bumps the dev-minor-updates group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` | | [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` | | [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` | | [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` | | [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` | | [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` | Updates `@codemirror/commands` from 6.10.4 to 6.11.0 - [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/commands/commits) Updates `@types/node` from 26.1.2 to 26.2.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react) Updates `electron` from 43.2.0 to 43.4.1 - [Release notes](https://github.com/electron/electron/releases) - [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1) Updates `globals` from 17.9.0 to 17.11.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0) Updates `i18next` from 26.3.6 to 26.4.0 - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0) Updates `lucide-react` from 1.28.0 to 1.33.0 - [Release notes](https://github.com/lucide-icons/lucide/releases) - [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react) Updates `react-hook-form` from 7.84.0 to 7.85.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0) Updates `react-pdf` from 10.4.1 to 10.5.0 - [Release notes](https://github.com/wojtekmaj/react-pdf/releases) - [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf) Updates `typescript-eslint` from 8.66.0 to 8.67.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@codemirror/commands" dependency-version: 6.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@types/node" dependency-version: 26.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@vitejs/plugin-react" dependency-version: 6.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: electron dependency-version: 43.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: globals dependency-version: 17.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: i18next dependency-version: 26.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: lucide-react dependency-version: 1.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-hook-form dependency-version: 7.85.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-pdf dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: typescript-eslint dependency-version: 8.67.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: sync Crowdin translations * Update redirect-issues workflow configuration Updated the workflow to change the runner and modify the issue response message. * chore: sync Crowdin translations * fix: use i18n for host status tooltip labels (#1265) * fix: add missing hosts.status.* locale keys (fixes #1265) * fix: add hosts.status.* translation keys for i18n tooltip The buildStatusTooltip function calls t("hosts.status.available"), t("hosts.status.reachable"), t("hosts.status.offline"), and t("hosts.status.monitoringDisabled"), but the locale file only had "status": "Status" as a flat string. Replaced with a status object containing all four keys plus a "label" key preserving the original "Status" string. * fix: restore final newline in en.json Requested by ZacharyZcR in review feedback. * test: assert translated labels in buildStatusTooltip Per review feedback from ZacharyZcR: add focused tests that exercise buildStatusTooltip with a translator and assert the rendered labels rather than key paths. Covers all three status values, monitoring disabled, protocol list, and the no-key-path regression guard. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com> * fix(workspaces): fall back when randomUUID is unavailable (#1397) * fix(terminal): preserve macOS Alt digit characters (#1398) * fix(ssh): verify resolved server host identity (#1419) * fix: add principals to Termix ID certificates (#1421) * chore: sync Crowdin translations * chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325) Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg). Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0) Updates `js-yaml` from 5.2.3 to 5.3.0 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/5.2.3...5.3.0) Updates `pg` from 8.22.0 to 8.23.0 - [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg) --- updated-dependencies: - dependency-name: "@anthropic-ai/sdk" dependency-version: 0.120.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: js-yaml dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: pg dependency-version: 8.23.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323) Bumps the dev-minor-updates group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` | | [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` | | [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` | | [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` | | [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` | | [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` | Updates `@codemirror/commands` from 6.10.4 to 6.11.0 - [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/commands/commits) Updates `@types/node` from 26.1.2 to 26.2.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react) Updates `electron` from 43.2.0 to 43.4.1 - [Release notes](https://github.com/electron/electron/releases) - [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1) Updates `globals` from 17.9.0 to 17.11.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0) Updates `i18next` from 26.3.6 to 26.4.0 - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0) Updates `lucide-react` from 1.28.0 to 1.33.0 - [Release notes](https://github.com/lucide-icons/lucide/releases) - [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react) Updates `react-hook-form` from 7.84.0 to 7.85.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0) Updates `react-pdf` from 10.4.1 to 10.5.0 - [Release notes](https://github.com/wojtekmaj/react-pdf/releases) - [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf) Updates `typescript-eslint` from 8.66.0 to 8.67.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@codemirror/commands" dependency-version: 6.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@types/node" dependency-version: 26.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@vitejs/plugin-react" dependency-version: 6.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: electron dependency-version: 43.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: globals dependency-version: 17.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: i18next dependency-version: 26.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: lucide-react dependency-version: 1.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-hook-form dependency-version: 7.85.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-pdf dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: typescript-eslint dependency-version: 8.67.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: sync Crowdin translations * Update redirect-issues workflow configuration Updated the workflow to change the runner and modify the issue response message. * chore: sync Crowdin translations * Add Hetzner logo and referral link to README Added Hetzner logo with a referral link to README. * Fix Hetzner logo URL in README.md * chore: pull sponsor logos from the docs site * fix: add principals to Termix ID certificates --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com> * fix(deps): resolve transitive security advisories (#1412) * chore: sync Crowdin translations * chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325) Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg). Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0) Updates `js-yaml` from 5.2.3 to 5.3.0 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/5.2.3...5.3.0) Updates `pg` from 8.22.0 to 8.23.0 - [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg) --- updated-dependencies: - dependency-name: "@anthropic-ai/sdk" dependency-version: 0.120.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: js-yaml dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: pg dependency-version: 8.23.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323) Bumps the dev-minor-updates group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` | | [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` | | [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` | | [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` | | [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` | | [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` | Updates `@codemirror/commands` from 6.10.4 to 6.11.0 - [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/commands/commits) Updates `@types/node` from 26.1.2 to 26.2.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react) Updates `electron` from 43.2.0 to 43.4.1 - [Release notes](https://github.com/electron/electron/releases) - [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1) Updates `globals` from 17.9.0 to 17.11.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0) Updates `i18next` from 26.3.6 to 26.4.0 - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0) Updates `lucide-react` from 1.28.0 to 1.33.0 - [Release notes](https://github.com/lucide-icons/lucide/releases) - [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react) Updates `react-hook-form` from 7.84.0 to 7.85.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0) Updates `react-pdf` from 10.4.1 to 10.5.0 - [Release notes](https://github.com/wojtekmaj/react-pdf/releases) - [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf) Updates `typescript-eslint` from 8.66.0 to 8.67.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@codemirror/commands" dependency-version: 6.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@types/node" dependency-version: 26.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@vitejs/plugin-react" dependency-version: 6.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: electron dependency-version: 43.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: globals dependency-version: 17.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: i18next dependency-version: 26.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: lucide-react dependency-version: 1.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-hook-form dependency-version: 7.85.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-pdf dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: typescript-eslint dependency-version: 8.67.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: sync Crowdin translations * Update redirect-issues workflow configuration Updated the workflow to change the runner and modify the issue response message. * chore: sync Crowdin translations * Add Hetzner logo and referral link to README Added Hetzner logo with a referral link to README. * Fix Hetzner logo URL in README.md * chore: pull sponsor logos from the docs site * fix(deps): resolve transitive security advisories --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix(sync): map nested host parent references (#1418) * fix(metrics): surface SSH host key changes (#1404) * fix(guacamole): coalesce VNC wheel floods and label meta keys by device (#1385) High-latency proxies like Cloudflare queue guacamole-common-js scroll clicks so the desktop keeps crawling after the user stops. Cap in-flight wheel buttons, and show Super/Cmd in the VNC toolbar on non-Windows clients. Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com> * fix(file-manager): keep downloaded files inside the selected local folder Remote file names were turned into local destinations by splitting the relative remote path on "/" and concatenating each name with the platform separator. A POSIX file name may contain "\", ":" or end in a dot, so on Windows a remote "..\outside.txt" downloaded into C:\Downloads\selected was normalised to C:\Downloads\outside.txt - outside the folder the user picked, even with overwrite disabled. The main process only normalised destPath and never checked it against the selected root. Two independent layers now enforce containment: Renderer (local-transfer-utils.ts) - `assertSafeLocalComponent(name, separator)` validates each remote path component for the destination platform: never empty, "." or "..", never "/" or NUL; on Windows (separator "\") additionally no "\ : * ? " < > |", no control characters, no trailing dot/space, no reserved device names (CON, NUL, COM1...). Backslashes stay legal on macOS/Linux, where they are ordinary file-name characters and the result remains inside the folder. - `buildLocalDestination(localDir, relativePath, separator)` joins the validated components and asserts the result is strictly under localDir (case-insensitive on Windows). - useLocalTransfers builds every file and directory destination through it. Items that fail are skipped before any filesystem call and reported ("Skipped N item(s) whose names cannot be used on this computer"). Main process (electron/local-files.cjs) - `assertWithinRoot(rootPath, candidate, pathImpl)` resolves + normalises both paths and refuses anything that is the root itself, escapes it (".." after normalisation), is absolute relative to it (another drive, UNC) or contains empty/".." segments. `pathImpl` is injectable so the Windows rules run in tests on any OS. - downloadToLocal requires `rootPath` (the selected folder) and checks the destination before the request is made or any file is created; the ensure-dir handler applies the same check when a root is passed (used for the directory skeleton of downloaded trees). - LocalDownloadRequest / downloadSessionFileToLocal / ensureLocalDirectory carry the root. Tests - Renderer: ordinary nested folders on Windows; backslash traversal in a POSIX name; absolute, drive-qualified and UNC names; reserved names, trailing dots/spaces, control chars; POSIX traversal rejected while a POSIX-legal backslash name is kept inside the folder. - Main process (path.win32): nested destinations accepted incl. case differences; "selected\..\outside.txt" refused; other drive / UNC / sibling folder refused; missing root refused; end-to-end handler test that a POSIX "../outside.txt" download and an escaping ensure-dir are refused before any network traffic or disk write. * feat(file-manager): right-click context menu for the local pane Mirrors the remote grid's menu for the user's own disk. On an entry (or the current multi-selection): Open / Open folder, Upload to server, Reveal in Finder/Explorer, Rename (inline, F2), Copy Path, Move to Trash (confirmation toast, Del). On the background: New Folder, New File, Reveal, Show/Hide hidden files, Refresh (F5). Enter opens, Cmd/Ctrl+A selects all, Escape clears the selection. Deletion goes through shell.trashItem so it lands in the OS Trash and is recoverable; rename and create refuse names containing path separators and never overwrite an existing entry. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W * feat(file-manager): resizable list-view columns in both panes Drag the boundary at the left edge of a column header (Modified, Owner, Size, Permissions on the remote grid; Modified, Size, Kind in the local pane) to change its width; the Name column takes whatever is left. Double-click a handle to reset that column. Widths are remembered per pane in localStorage. Finishing a drag over a sortable header no longer toggles the sort. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W * feat(file-manager): pinned ".." parent entry in both panes Both the remote grid (list, grid and empty-folder states) and the local pane show a Termius-style ".." row pinned above the entries whenever the current folder has a parent. Double-clicking it goes up one level. It is also a drop target: local files dropped on it upload into the parent folder, remote rows dragged onto it move there, and remote items dropped on the local pane's ".." download into the parent folder. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W * feat(file-manager): show/hide list-view columns from the header Right-click a list-view header (remote grid or local pane) to open a Columns menu and tick/untick Modified, Owner, Size, Permissions (remote) or Modified, Size, Kind (local). Hidden columns leave the grid template entirely so the Name column gets the space back; at least one optional column always stays on. The choice is remembered per pane alongside the column widths. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W * feat(file-manager): sidebar toggle works on desktop too The toolbar's sidebar button now shows/hides the directories panel on desktop (persisted), while below md it still opens the mobile overlay. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W * feat(file-manager): resizable directories sidebar The Trash/Directories sidebar can now be resized by dragging its right edge (160px minimum, up to 40% of the row); double-click the handle to restore the default 224px. The width is remembered. The same handle and persisted-width hook now also drive the local pane divider, replacing the inline implementation. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W * fix(metrics): support macOS/WIN hosts in stats collection (#1430) * fix(metrics): support macOS hosts in stats collection Host metrics collectors only ever ran Linux commands (/proc/*, ip, GNU df flags), so any macOS host always reported 0%/null for cpu, memory, uptime, network and disk. Detect the host platform once per poll and use vm_stat, sysctl, top, ifconfig and netstat on Darwin hosts instead. * fix(metrics): support Windows hosts in stats collection RDP/VNC hosts running Windows hit the same problem as macOS did: no /proc, no BSD tools, not even uname. Route CPU, memory, uptime, network and disk through PowerShell (WMI/CIM) when the host is detected as Windows, using -EncodedCommand so there's no cmd.exe quoting to fight with. * fix(metrics): use real macOS df/mount for disk collection BSD df's -T flag filters by filesystem type instead of printing one like GNU df does, so the previous macOS disk path was still running a GNU-only command and coming back empty. Now uses df -Pk plus mount output to build the filesystem type/percent list, filtering out the noisy APFS system volumes and devfs/autofs mounts. Verified on an M4 MacBook running the latest macOS - disk usage now reports correctly. * feat(file-manager): Termius-style Local | Remote dual pane with drag-and-drop transfers (desktop) (#1413) Integrate the reviewed change and its maintainer fixes into dev-2.8.0. Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs. * fix(terminal): persist Ctrl+/- font zoom so it survives option refreshes (#1399) Integrate the reviewed change and its maintainer fixes into dev-2.8.0. Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs. * Fix macOS terminal packaging and keyboard shortcuts. (#1417) Integrate the reviewed change and its maintainer fixes into dev-2.8.0. Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs. * fix(auth): skip TOTP only after verified WebAuthn user verification (#1420) Integrate the reviewed change and its maintainer fixes into dev-2.8.0. Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs. * feat(hosts): add per-host Web Endpoints (direct or SSH-tunnelled web UIs) (#1416) * test: provide an in-memory localStorage for the vitest environment jsdom in this project ships without a localStorage global, so every suite that touched storage threw "Cannot read properties of undefined" during setup and failed wholesale -- 119 tests across 15 files, none of them actual product defects. Node only supplies localStorage with --localstorage-file, which persists to disk and is shared across test files. A per-process in-memory Storage is what tests want, so define one (plus sessionStorage) when the global is absent, alongside the existing matchMedia shim. Full suite goes from 15 failed files / 119 failed tests to 400 files and 2888 tests passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fdjjsdaz6aFMyJr4h3Y6qj * feat(web-endpoints): add endpoint types and URL resolution First step of per-host Web Endpoints: a host declares web UIs it serves and opens them either directly at the host's address or through an SSH forward Termix establishes on demand. This commit is pure logic with no I/O, so it needs no mocks to test. resolveWebEndpointUrl expects an already-normalized path -- normalization is the storage boundary's job (a later commit), and duplicating it here would invite the two copies to drift. separatedTunnelHost is the one part that is a security control rather than a convenience. Cookies are keyed by host and ignore the port, and SameSite computes "site" as scheme + registrable domain -- also ignoring the port. A forward reached at the host string serving Termix is therefore same-site with Termix, which leaks the session both ways: the framed service receives the jwt cookie, and a Set-Cookie it returns lands in the jar Termix's own API calls read from. So a tunnel URL resolves to a different loopback spelling than the page's, and refuses outright when no alias exists. Only loopback literals qualify -- a same-registrable-domain alias could still answer Set-Cookie with a Domain attribute that reaches Termix. The cookie-separation tests were verified to fail against a resolver that returns the page host (4 failures), so they cannot pass vacuously. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(web-endpoints): validate and normalize endpoint config normalizeWebEndpoints is the enforcement point for values that reach an href and an iframe src, so the editor's constraints are UX rather than security. It drops any row it refuses instead of rejecting the whole host -- one bad endpoint must not make a host unsaveable or unlistable. Paths are checked for C0 controls and DEL by codepoint rather than by regex character class: "\t//evil.example" defeats a startsWith("//") guard, because the browser strips the control character and then follows the authority. bindHost lands both in a TCP listener and in a URL authority, so it is restricted to a bare host literal -- nothing carrying a scheme, port, path or credentials survives. bindHost and localPort are ignored on a direct endpoint, which never creates a forward. parseWebUiConfig never throws. A malformed stored value yields an empty endpoint list, so a half-written config cannot take out the whole host listing -- which is what dockerConfig's bare JSON.parse does today. The editor validator is a second implementation in a layer that cannot import backend route modules. Its accompanying test runs BOTH implementations over the same path and port samples, because drift here is invisible in the worst way: the editor accepts a row, the normalizer silently drops it, and the endpoint disappears on reload with no error. That agreement test was verified to fail (4 cases) when the editor's control-character check is removed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * chore(db): migrate the shared_credential_secrets foreign key rename Running `npm run schema:migrations` on an UNCHANGED schema emits these, so they are pre-existing drift between schema.ts and drizzle/, not something this branch introduced. Landing them alone, before the web-endpoint columns, so the feature's own migration is reviewable without an unrelated table rebuild sitting in the middle of it. Both forms are a foreign-key constraint rename only. Postgres drops and re-adds the constraint under a shorter name. SQLite has no ALTER for that, so drizzle emits the standard table rebuild -- verified data-preserving: CREATE lists 14 columns, INSERT...SELECT copies the same 14 in the same order, and both indexes are recreated. The SQLite file is in practice dead code: runRemoteMigrations throws for sqlite, which builds its schema from db/index.ts instead. It is kept rather than hand-trimmed because drizzle derives the meta snapshot from schema.ts regardless, so trimming the .sql while the snapshot advances would make the drift permanently invisible -- no future `generate` would re-emit it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(db): add enable_web_ui and web_ui_config columns Two columns on ssh_data mirroring the Docker pair. No show_web_ui_in_sidebar: every existing showXInSidebar column is vestigial -- they appear only in defaults, the export payload and tests, and gate no rendering -- so a fourth dead column plus a migration buys nothing. web_ui_config stores an object rather than a bare array so host-level web settings can be added later without a second migration. The column has to be declared in FOUR places, not one. SQLite never runs the drizzle migrations at all (runRemoteMigrations throws for sqlite), so the live default-dialect schema comes from hand-written DDL: 1. db/schema.ts, then the two generated dialect schemas and the migrations 2. db/index.ts CREATE TABLE -- fresh databases 3. db/index.ts addColumnIfNotExists -- existing databases 4. database.ts CREATE TABLE and its positional INSERT -- encrypted export Missing 2 or 3 breaks every host write on the default dialect while the migration file sits there looking correct. Two guards, both watched failing first. bootstrap-matches-schema-columns boots a real database and compares PRAGMA table_info against the drizzle definition for every table -- it reported ssh_data.enable_web_ui and ssh_data.web_ui_config missing before item 2/3 landed. A grep-based guard could not: db/index.ts names columns as snake_case strings, never the camelCase the schema uses. export-ddl-matches-schema-columns covers database.ts, which no booted database reaches. It caught a real defect while being written: the two new columns went into the INSERT list but the VALUES list still held 53 placeholders for 55 columns. Being positional, that shifts every later value by one. The placeholder-count assertion is now permanent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(hosts): thread web endpoint config through host read and write paths A host field has to be enumerated by hand in nine places here, and "added a column, missed one update path" is this codebase's most repeated bug -- during the first attempt at this feature a field was missed at one of these points six separate times, each surfacing as a different mystery: endpoints that saved but never appeared, config that vanished on reload. Backend: host-normalizers (input type, CONNECT_LEVEL_FIELDS, boolean normalization, parse block), host.ts (create, update, both read paths, quick-connect defaults), host-bulk-routes (bulk update, import, reset). Renderer: host-export-payload, HostManagerData's sshHostToHost, tabUtils' hostToSSHHost, HostEditorData's form seed and payload builder. The three renderer mappers copy field by field, so an unlisted field is silently dropped -- which is how endpoints saved correctly and never appeared. webUiConfig is parsed with parseWebUiConfig rather than a bare JSON.parse. dockerConfig on the adjacent line uses a bare one, so a single malformed value takes out the whole host listing; that is a bug to avoid copying, not a convention to follow. All three write paths now clear webUiConfig when the feature is disabled. They disagreed before, and the export payload ships the config unconditionally -- so a host disabled without clearing still exported its endpoint list (internal hostnames, ports, paths) while the UI read as off, and re-enabling resurrected stale endpoints. webUiConfig is shared with connect-level recipients, unlike dockerConfig. A connect-level recipient is already authorized to open these tunnels, so withholding the config only breaks discovery while the flag advertises the feature. Docker's precedent does not transfer: its tab works without its config, whereas a web endpoint IS its config. The enumeration guard asserts every one of the nine files mentions the web endpoint field beside its Docker counterpart, and checks the Docker anchor is present too so it cannot pass vacuously if a file is restructured. The clear-on-disable assertion was rewritten after the first version passed with the guard deleted -- a loose regex matched unrelated sites. Both halves are now anchored on exact text and were watched failing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(tunnel): report the real bound port, support idle close, reserve web: Three changes the web endpoint open route depends on, plus the name reservation that makes the scheme safe. Real bound port. Under sourcePort 0 the kernel assigns the port, but the runtime recorded the requested value -- so it advertised 0 and any caller reusing it failed. It now records tcpServer.address().port. Idle close, behind the new tunnelConfig.idleTimeoutMs. Web endpoint tunnels are opened on demand and must not outlive their use. The timer lives inside establishDirectTunnel because the socket set is only visible from that closure, polls at min(30s, timeout) so "empty for N" means roughly that rather than "empty at the instant of one N-spaced tick", and unrefs so it cannot hold the process open. It calls cleanupTunnelResources rather than close(): close() stops the listener but leaves the entry in activeTunnelRuntimes, so the open route would keep handing out a port nothing is listening on. Reserved names skip retry. handleDisconnect returns early for a "web:" name after a forced cleanup. maxRetries: 0 would NOT achieve this -- the retry path reads `maxRetries || 3`, so 0 falls through to 3. The cleanup is forced because cleanupTunnelResources no-ops while tunnelConnecting holds the name, and a web tunnel has no retry pass to self-heal a leaked runtime. That early return carries an identity guard, which is the subtle one. sourceClient.end() only STARTS an async teardown, so the SSH "close" event lands after a reopen may already have registered a NEW runtime under the same name. Acting by name alone would tear down the successor rather than the stale tunnel -- surfacing as a 200 with a good port followed by a silent connection reset and no error anywhere. handleDisconnect now takes the closing Client and returns early when the registered runtime belongs to someone else. The idle timer carries the same guard for the same reason. /ssh/tunnel/connect now rejects a user-supplied "web:" name with 400. validateTunnelConfig is no defence here: it returns true unconditionally for any name that is not the legacy 6-part format, so an authenticated user could otherwise create a real retry-configured tunnel that collides with a live web endpoint forward and silently loses its own reconnect behaviour. The manager tests run against a real TCP listener and real timers -- mixing fake timers with real socket I/O is a known route to a hanging test. Both were watched failing: reverting the bound port fails the port test, and swapping cleanupTunnelResources for close() fails the idle test, which asserts the ENTRY is gone rather than merely that the listener stopped. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(tunnel): add the web endpoint open route POST /ssh/tunnel/web-endpoint/open { hostId, endpointId } -> { port }. The host is resolved through the user-scoped resolveHostById, so an authenticated user cannot obtain a forward to a host id they do not own. The endpoint is re-normalized out of storage rather than trusted: the stored value predates any later tightening of the rules, and this is what a forward gets built from. An enabled flag is required as well as a present endpoint -- a bulk update that sends only { webUiConfig } can leave a configured endpoint on a host whose UI reads as off everywhere. Not gated to the desktop. The forward binds wherever this backend runs, as the server tunnels feature does, and the endpoint's own bindHost decides whether that is reachable from a browser. endpointHost: "127.0.0.1" is load-bearing, not cosmetic. connectSSHTunnel picks its strategy via shouldEstablishDirectTunnel -> isSingleHostTunnel, which keys on endpointHost -- setting only targetHost selects a different path and the forward never binds locally. connectSSHTunnel never rejects, and its promise resolves right after conn.connect() -- long before the SSH "ready" event populates activeTunnelRuntimes. Awaited is not connected, so waitForTunnelSettled polls the maps the manager already exports. Polling rather than adding a promise-returning variant: every existing caller is fire-and-forget by design, and changing that contract for one new caller is the larger blast radius. A probe forwardOut runs before returning 200. Without it the route succeeds the moment listen() does, and forwardOut is only attempted per inbound socket where failure is swallowed -- so the likeliest real error, nothing listening on the endpoint's port, reached the user as a blank frame and no message. Staleness is validated at open, never on save: host save lives in the database service and the runtimes live in the tunnel service, with no push between them. On reuse the route compares a fingerprint covering the endpoint's target AND the host's SSH identity, and reopens when it differs. An absent fingerprint means reuse, not staleness -- a reserved-prefixed runtime can only have been created here. Deletion, disabling and host removal then need no handling: nothing reopens the tunnel, so it idles out. Also closes an authorization gap this feature would otherwise have created. /ssh/tunnel/disconnect and /ssh/tunnel/cancel checked ownership only inside `if (config && config.sourceHostId)`, and web tunnels are deliberately absent from tunnelConfigs -- so the check never ran for them. Host ids are small sequential integers and endpoint ids are client-supplied, so the name is guessable and any authenticated user could force-close another user's tunnel. authorizeTunnelAction recovers the host id from the name and fails closed when it cannot; the tests were watched failing against the old behaviour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(hosts): add the web endpoint client and per-origin certificate allowance The client posts a path relative to tunnelApi's base, which already includes /ssh -- a leading "/ssh" here resolves to /ssh/ssh/... and 404s on every call. The test asserts that on the captured runtime argument rather than by scanning source, so quoting style and indirection cannot fool it. Backend error messages are preserved rather than collapsed. 502 is this route's likeliest real failure and carries the actionable cause -- SSH auth rejected, host unreachable, nothing listening on the target port -- and handleApiError would replace all three with "Server error occurred". It stays as the fallback for bodies that carry no string reason, so a body shaped { error: <object> } cannot reach the user as "[object Object]". openWebEndpointExternally applies the same refusal gate as the embedded tab. Opening in the real browser is not the safer path: the cookie jar is the browser's either way, so a tunnel URL on the page's own host string leaks the session exactly as a frame would. The refusal happens before the forward is opened -- binding the port and then declining to navigate would be no protection. Certificate allowance covers the one case Electron's existing handling misses: direct access to a HOSTNAME over https. isPrivateNetworkHost matches IP literals only and sshData.ip has no IP validation, so https://nas.local:8006 fails the check and renders blank inside an iframe with no click-through -- Chromium offers no proceed option for subframes. Three properties of that allowance are deliberate and now pinned by tests, because each would otherwise be undone by a reasonable-looking simplification: - it is NOT wired into isInvalidCertificateAllowedForUrl, which also governs this process's own outbound TLS via getTlsVerificationOptions; - it is https-only, in both the check and the IPC handler, since a non-TLS origin in a TLS-error allowlist is meaningless and file:/ftp: must never be storable; and - entries carry a five-minute TTL refreshed on each registration. Main has no host-database access and cannot verify the renderer's claim that an origin is a configured endpoint, so the residual risk has to be a momentary window rather than one lasting until the app restarts. The handler stores the parsed origin, never the caller's string, so a path or wildcard cannot widen the allowance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(hosts): add the Web UI editor tab Mounted as a Web UI sub-tab inside the SSH group, beside Docker, Tunnels, Files and Host Metrics, and laid out as two SectionCards following the tunnels editor: settings first, then the list it governs. There is a deliberate asymmetry with the sidebar here. The sidebar entry will appear on enableWebUi alone, because a direct endpoint needs no SSH -- but Web UI is an SSH sub-tab, so a host with SSH disabled cannot configure endpoints at all. That is the accepted behaviour and both halves are pinned by tests, so neither gets "fixed" into agreement later. tunnelAvailable is enableSsh && originIsLocal, resolved inside HostWebUiTab rather than in HostEditor.tsx, which is already ~2600 lines. It is NOT gated on isElectron(): the forward binds wherever the backend runs, exactly as the server tunnels feature does. resolveConnectionOrigin is called with connectionType "ssh" deliberately -- a tunnel endpoint always rides SSH, and "ssh" avoids the guacamole special case that forces "remote" for RDP/VNC/Telnet. Three input details that each prevent a silent data loss: - the id generator falls back off crypto.randomUUID, which is undefined outside a secure context -- a plain-http web deployment is a first-class target for direct+external and would otherwise throw on "Add endpoint"; - a new row gets a de-duplicated label, since labels are what identify an endpoint in the sidebar picker; and - the port field commits only a value the normalizer would keep. Number("") is 0, which the normalizer rejects, so clearing the field would otherwise write an endpoint that vanishes on save with no error. The tunnel fields carry three warnings: a non-loopback bind exposes the target's web UI unauthenticated to anyone who can reach the port; a loopback bind on a remote backend cannot be reached from a browser at all; and a tunnel reached at Termix's own hostname would hand the tunnelled service this session. All three are shown while configuring rather than only when the tab fails to load. The unavailable-tunnel reason is shown whenever tunnelling is unavailable, not only once a row asks for it -- a disabled dropdown option with no stated reason reads as the control being broken. Copy is reused verbatim from the previous iteration's reviewed strings rather than reworded. One test was written and then removed rather than kept: its name promised that switching to tunnel access clears ignoreCert, but Radix Select needs pointer APIs jsdom lacks, so the body only asserted the control existed. The clearing is covered where it is enforced, in the normalizer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * feat(hosts): open web endpoints from the sidebar and in a tab One sidebar entry per host, never one per endpoint: a host may declare up to 16, and a row of 16 identical globes is unusable. With a single endpoint the entry wears its label and acts directly; with several it carries no endpointId and the click opens a picker -- a DropdownMenu in the tray, a DropdownMenuSub in the Connect submenu. The entry is gated on enableWebUi ALONE, unlike every neighbouring action, which requires enableSsh. A direct endpoint needs no SSH; SSH matters only per-endpoint, for tunnel access, which the open route enforces. openTab gains a fourth optional parameter rather than overloading `restore`, which means something else. What was actually broken for two endpoints on one host was the LABEL -- tab ids are already `${name}-${type}-${Date.now()}`, so they never collided. All existing call sites keep working. The tab is passed the endpoint ID, not the endpoint object, so one deleted while its tab is open renders a plain message instead of throwing. Reload re-resolves and REMOUNTS. A direct endpoint's URL never changes and a live tunnel returns the same port on every open, so setUrl(resolved) would be a same-value setState that React bails out of, leaving the frame untouched -- Reload would silently do nothing in the two most common cases. A generation counter folded into the iframe key fixes that and doubles as the staleness guard for two resolutions landing out of order. The test captures the DOM node before and after, and was watched failing against a url-only key. PERSISTENT_TAB_TYPES is hoisted to module scope and exported so it can be asserted on -- it was a local const inside the component and therefore untestable. web-endpoint is deliberately excluded: an idle tunnel re-binds a fresh kernel-assigned port, so a restored tab could never hold a valid URL. Two notes on verification. `tsc -p tsconfig.json` passes vacuously in this repo -- tsconfig.json is a solution file with project references and does nothing without -b -- so `npm run type-check` (tsc -b --force) is the real check; it caught two insertions that had landed in the wrong function. And the one full-suite failure seen along the way was vault-signer-core, which passes in isolation and on re-run, is untouched by this branch, and is a flake under parallel load. Lint: 0 errors, 102 warnings, identical to the baseline on a clean tree. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(tunnel): register the web endpoint route under its /ssh path Every route in routes.ts registers the full "/ssh/tunnel/..." path -- nginx proxies /ssh through with the path intact -- and the client resolves "/tunnel/web-endpoint/open" against a baseURL that already ends in /ssh. The unprefixed registration therefore 404'd every call. No handler unit test could catch this: they call handleWebEndpointOpen directly and never touch registration. It surfaced only on opening a real tunnel against a deployed build, which is why that step exists. Added a registration test that captures the paths passed to app.post, so the invariant is checked without needing a server. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(hosts): apply session-cookie isolation to direct web endpoints The cookie guard only covered tunnel access. `unreachableTunnelReason` returned null for every `access: direct` endpoint, so WebEndpointTab framed the host's own address unconditionally. With Termix served at https://termix.example/ and a direct endpoint at https://termix.example:8443/, the browser attaches Termix's `jwt` to the framed request -- cookies are keyed by host and ignore the port -- and a `Set-Cookie` from that service lands in the jar both auth middlewares read before the Authorization header. Renames the helper to `webEndpointRefusalReason` so its scope is no longer tunnel-only, and gives it the endpoint's target host. A direct endpoint is now refused in a browser when that host shares Termix's cookie site, checked BEFORE any navigation in both open paths (embedded tab and external window) -- refusing after framing would leak on the first request. `sharesCookieSiteWithPage` treats an equal host as same-site (the jwt is set host-only, so the port is irrelevant) and also a parent/sub domain, which a `Set-Cookie: Domain=` from the target crosses. The suffix test is anchored on a dot boundary so `eviltermix.example` does not pass as `termix.example`. A precise eTLD+1 test would also catch sibling subdomains, but needs a public suffix list this app does not bundle. The desktop stays exempt: its session is Bearer-only with no `jwt` in the jar. Also drops "or change this endpoint to Direct" from the tunnel refusal copy, which pointed at the path that had this same leak. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com> * fix(tunnel): preserve local status when remote names collide (#1431) * fix(desktop): honor remote sync certificate setting (#1432) * fix(file-manager): interpolate preview download filename (#1433) * fix(automations): dispatch SSH login events to triggers (#1434) * fix(hosts): preserve imported settings and remap jump hosts (#1435) * fix(hosts): preserve terminal switches across JSON transfer * fix(hosts): remap imported jump-host dependencies * fix(ssh): preserve agent framing after unsupported extensions (#1436) * fix(guacamole): return tokens before awaiting the client handshake (#1437) * fix(sidebar): unmount the host tree while its panel is hidden (#1438) * fix(terminal): leave macOS Option characters enabled by default (#1439) * fix(dashboard): open the enabled remote desktop protocol (#1440) * fix(version): preserve local version when update checks fail (#1441) * fix(sftp): create uploaded directories without shell access (#1442) * fix(desktop): honor explicit GPU acceleration opt-out (#1443) * fix(desktop): exclude remote-only host IDs from local tab persistence (#1444) * Enhance SFTP and terminal flows, stabilize desktop sync (#1377) * feat: add electron sftp c2s and terminal ai flows * fix: stabilize desktop sync and c2s tunnels * Improve remote tunnels and SFTP transfer feedback * chore: sync Crowdin translations * chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325) Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg). Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0) Updates `js-yaml` from 5.2.3 to 5.3.0 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/5.2.3...5.3.0) Updates `pg` from 8.22.0 to 8.23.0 - [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg) --- updated-dependencies: - dependency-name: "@anthropic-ai/sdk" dependency-version: 0.120.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: js-yaml dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: pg dependency-version: 8.23.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323) Bumps the dev-minor-updates group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` | | [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` | | [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` | | [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` | | [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` | | [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` | Updates `@codemirror/commands` from 6.10.4 to 6.11.0 - [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/commands/commits) Updates `@types/node` from 26.1.2 to 26.2.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react) Updates `electron` from 43.2.0 to 43.4.1 - [Release notes](https://github.com/electron/electron/releases) - [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1) Updates `globals` from 17.9.0 to 17.11.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0) Updates `i18next` from 26.3.6 to 26.4.0 - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0) Updates `lucide-react` from 1.28.0 to 1.33.0 - [Release notes](https://github.com/lucide-icons/lucide/releases) - [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react) Updates `react-hook-form` from 7.84.0 to 7.85.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0) Updates `react-pdf` from 10.4.1 to 10.5.0 - [Release notes](https://github.com/wojtekmaj/react-pdf/releases) - [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf) Updates `typescript-eslint` from 8.66.0 to 8.67.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@codemirror/commands" dependency-version: 6.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@types/node" dependency-version: 26.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: "@vitejs/plugin-react" dependency-version: 6.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: electron dependency-version: 43.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: globals dependency-version: 17.11.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: i18next dependency-version: 26.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: lucide-react dependency-version: 1.33.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-hook-form dependency-version: 7.85.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: react-pdf dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: typescript-eslint dependency-version: 8.67.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: sync Crowdin translations * Update redirect-issues workflow configuration Updated the workflow to change the runner and modify the issue response message. * test(sftp): verify local collection limit boundaries --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com> * chore: increment ver * fix: allow any origin by default when CORS_ALLOWED_ORIGINS is unset * feat(file-manager): parallel local transfers (#1446) Uploads from the Local pane (and downloads to it) ran strictly one file after another. Batches of many small files were bound by per-file latency rather than bandwidth. - `runWithConcurrency(items, limit, worker, shouldStop)`: a bounded worker pool that dispatches in order, keeps at most `limit` transfers in flight, and stops dispatching once cancelled while letting in-flight items finish. Worker errors are handled by the worker (one failure never aborts the batch). - useLocalTransfers: both directions go through the pool. Remote / local directory skeletons are still created up front, so file order does not matter. The batch runner now tracks a set of in-flight transfer ids (Cancel cancels all of them), sums bytes across in-flight transfers plus settled ones for the progress bar / speed, and shows how many files are moving at once. - New preference "Simultaneous File Transfers" (1-8, default 4) in the profile settings, stored in localStorage (`termix:file-manager:transfer-concurrency`) and part of the storage snapshot. 1 restores the previous sequential behaviour; the hint suggests lowering it for servers that limit SFTP channels. - Remote directories are created with the now-idempotent mkdir (#1442) without swallowing its errors, so a real failure stops the batch up front instead of surfacing as N per-file failures. When files do fail, the summary toast carries the first underlying reason (e.g. the backend's 401 message) instead of a bare "Upload failed". - Tests: pool never exceeds the limit and drains everything, stops on cancel, tolerates a failing item, handles empty input; preference clamping and persistence; bridge-level concurrent uploads/downloads with a mid-flight cancel leave every other file intact and no partials. Co-authored-by: Max <maxim@cogitate.ai> * fix(sftp): complete streamed uploads and stop pre-parsing chunk bodies * fix(desktop): stop setting Content-Length on local download requests * fix(file-manager): keep drop overlays in view when the list is scrolled * fix(file-manager): let remote rows be dropped on the local pane * fix(desktop): authenticate local transfers with the renderer's token * chore: update release notes * chore: remove unused gitlab ci and argocd deploy configs * chore: remove unused files * feat: improve loading animation * fix(shell): stop tab reorder from resetting terminals and tab indicator Keep the tab-content portal order stable so reordering tabs doesn't retrigger React's offscreen pass and dispose live terminals. Also stop the active tab indicator from teleporting during a drag, and fix the drag ghost's size/border mismatch. * fix(shell): hand-roll the tab indicator instead of a shared layoutId Framer's layoutId could measure the wrong tab's rect during a reorder and land on an inactive tab, or leave a stray line visible mid-drag. Now it reads the active tab's own DOM rect directly and hides while dragging. * fix(hosts): fix right-click menu position and unwanted tray expand * chore: update release notes * fix(terminal): stop autosuggestion ghost text overlapping typed input Position was computed from cursorX before server echo landed, causing a stale read that overlapped just-typed characters on fast local input. * chore: update release notes for v2.8.0 * fix(sftp): rebuild transfer tab for web, fix menu offset bug Drop the electron-only local mode and dead code, i18n all strings, fix double progress toasts and a wrong pane refresh on move. Fix context menus rendering offset due to a lingering CSS transform from the tab-switch animation. Move SFTP next to SSH Tools in the rail. * fix(file-manager): shrink oversized .. entry, navigate on single click * fix: make select2 component use rounded corners * fix: rebuild terminal AI assistant on the real backend Removes the Electron-only Agent Mode/AI Command Helper that bypassed admin/user gating and ran commands with no approval step. Replaces it with a terminal-docked panel on the same gated backend as the AI tab, adds a per-host toggle (off by default), moves it into the toolbar, and fixes proposal ordering and run-in-terminal execution. * fix(file-manager): remove duplicate borders in toolbar view toggle Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: separate registration toggle from step ca settings * fix: collab room bugs and add room deletion Accent-colored new room button, fix fullscreen guest view layout and duplicate view-only badges, self-heal stale presenter state, add delete room for persistent rooms. * refactor: move host-identity helpers to hosts core Used by docker, file-manager, and terminal alike, so it belongs at the hosts root instead of under terminal/. * refactor: move host-session-status singleton to hosts core metrics subscribed to terminal's private online/offline pub-sub module. Moved to hosts core so both sides depend on a shared module instead of metrics reaching into terminal. Marked the subscribe call with PLUGIN-EVENT for the future event bus. * refactor: split generic automation event notify out of metrics notifyAutomationInternalEvent was in hosts/metrics/automation-bridge.ts but is used by tunnel, host routes, user routes, and automations engine itself, not just metrics. Moved it to hosts/automation-events.ts so those callers depend on a shared module instead of metrics internals. Left the metrics-specific notifiers in place. * feat: add plugin system schema and repositories Adds plugins, plugin_permission_grants, plugin_registries, and plugin_install_counts tables plus their repositories. No routes or UI yet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * feat: add runtime rail item and tab component registries for plugins * feat: support runtime-registered permission groups Adds register/unregister for plugin permission groups so the RBAC catalog and validation can grow beyond the static list. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * feat: add plugin-api nginx route and dispatcher stub * feat: add plugin manifest schema and validator * chore: update release notes * chore: update i18n for local/remote file manager * feat: add toggle to show/hide app rail pin button * feat(host-metrics): add NVIDIA GPU metrics card (#1452) * feat(host-metrics): add NVIDIA GPU metrics card Collect per-GPU utilization, VRAM, temperature, power, fan speed and the processes using each GPU over SSH with nvidia-smi. The collector exits immediately when nvidia-smi is missing, so hosts without a GPU pay almost nothing per poll. The GPU card is opt-in: it is available from the Add card tray but is not part of new-host defaults or any UI preset. It shows live sparklines for utilization and VRAM per GPU. Adaptive polling now also watches GPU readings and the GPU process count, so it no longer backs off on hosts where only the GPU is busy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F2ctuPwiesLzhF6XQiozm8 * fix(host-metrics): draw sparklines from the first metrics sample The first sample fetched when the tab connects was shown but never added to the sparkline history, so every sparkline (CPU, memory, disk, GPU) stayed empty until the second poll, a full metrics interval later (about 35 s with the default 30 s interval). Record the first sample like every later one, so the lines appear as soon as the tab loads. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F2ctuPwiesLzhF6XQiozm8 * Fix logical condition for memory percentage calculation Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: annotate local transfer plan type to fix CI type-check * fix: move connection toolbar settings to bottom of host editor general tab * chore: add debug logging for macOS sharp packaging failure Temporary diagnostic to find which phase drops @img/sharp-darwin-x64 from the packaged app. Revert once root cause is found. * fix: correct macOS sharp verify script for universal build layout electron-builder uses mergeASARs: false, so universal builds ship app-x64.asar.unpacked and app-arm64.asar.unpacked side by side instead of a single app.asar.unpacked. The verify script only checked the single-asar path, so it always failed on universal/mas artifacts even when packaging was correct. * fix: update sharp verify test fixtures for universal build layout The test built fake apps using the single app.asar.unpacked layout, which doesn't match how universal builds are actually packaged now (app-x64.asar.unpacked / app-arm64.asar.unpacked side by side). * chore: update readme * fix: guard against missing rooms array in collab list response * fix: distinct guac connection log stages, RDP black screen before failure * fix: proxy /collab routes in nginx configs * fix: stop tab-switch flash and host metrics/proxmox reconnect Tab DOM visibility now syncs before paint instead of after, and switching tabs no longer tears down live metrics connections. * fix: tab bar flashing, growing, and merged separators Terminal tabs no longer flash when switching, the enter animation no longer nudges layout size, and a stray transform on resting tabs no longer causes the border between tabs to vanish at some zoom levels. * fix: match select trigger height to inputs in web UI editor * chore: lint, format, and bump version to 2.8.0 * chore: sync Crowdin translations for 2.8.0 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com> Co-authored-by: Angad Singh <7099405+singhangadin@users.noreply.github.com> Co-authored-by: Angad Singh <angad@singhangad.in> Co-authored-by: Neo <54811660+neooriginal@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wali Lambert <98448225+YatoVoid@users.noreply.github.com> Co-authored-by: Nasif Rahman <44437976+nasif-naseef@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: vietanhtwdk <vietanhtruongwdk@gmail.com> Co-authored-by: inontz <inontz@icloud.com> Co-authored-by: inontz <inontz@users.noreply.github.com> Co-authored-by: Max Serov <133950708+maxser0v@users.noreply.github.com> Co-authored-by: Max <maxim@cogitate.ai> Co-authored-by: ssmurfgg04-gif <ssmurfgg04@gmail.com> Co-authored-by: ssmurfgg04-gif <232103099+ssmurfgg04-gif@users.noreply.github.com> Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com> Co-authored-by: slsgzs-cloud <slsgzs@gmail.com> Co-authored-by: anshtsolanki-sketch <anshtsolanki@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: tcezarl <tomescu.cezar.laurentiu@gmail.com> Co-authored-by: Anton Priestley <anton@priestley.me> Co-authored-by: Hakim M <hakimmarsudi@outlook.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Adel Alzubeir <14052842+Adelzu@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
5105 lines
336 KiB
JSON
5105 lines
336 KiB
JSON
{
|
|
"connection": {
|
|
"retryingIn": "إعادة المحاولة خلال {{seconds}}ثانية ({{attempt}}/{{max}})",
|
|
"retryingNow": "جارٍ إعادة المحاولة... ({{attempt}}/{{max}})",
|
|
"disconnected": "تعذر الاتصال",
|
|
"reconnect": "إعادة الاتصال"
|
|
},
|
|
"termixId": {
|
|
"title": "Termix ID",
|
|
"loadFailed": "فشل تحميل Termix ID",
|
|
"claimTitle": "احصل على Termix ID الخاص بك",
|
|
"claimIntro": "اختر معرّفًا فريدًا. سيتم نشر مفاتيح SSH العامة الخاصة بك في رابط عام يمكنك إضافته إلى ملف authorized_keys لأي خادم.",
|
|
"handleLabel": "المعرّف",
|
|
"handlePlaceholder": "alice",
|
|
"checking": "جارٍ التحقق…",
|
|
"available": "متاح",
|
|
"taken": "مستخدم بالفعل",
|
|
"invalidHandle": "أحرف صغيرة، أرقام، - و _ فقط",
|
|
"descriptionLabel": "الوصف (اختياري)",
|
|
"descriptionPlaceholder": "مفاتيح حاسوب العمل والهاتف",
|
|
"create": "إنشاء Termix ID",
|
|
"created": "تم إنشاء Termix ID",
|
|
"createFailed": "فشل إنشاء Termix ID",
|
|
"deleteConfirm": "حذف Termix ID وجميع المفاتيح المنشورة؟ ستحتفظ الخوادم التي قمت بتجهيزها بالمفاتيح حتى تقوم بإزالتها يدويًا.",
|
|
"deleted": "تم حذف Termix ID",
|
|
"deleteFailed": "فشل حذف Termix ID",
|
|
"copyFailed": "فشل النسخ",
|
|
"resolverUrlLabel": "رابط المُحلل العام",
|
|
"provisionLabel": "تجهيز خادم",
|
|
"publishTitle": "نشر مفتاح عام",
|
|
"generate": "توليد",
|
|
"generateTooltip": "توليد زوج مفاتيح Ed25519 — ينشر المفتاح العام ويُنزّل المفتاح الخاص إلى جهازك",
|
|
"saveToVault": "حفظ في بيانات الاعتماد",
|
|
"keyPlaceholder": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@host",
|
|
"labelPlaceholder": "وسم (اختياري)",
|
|
"add": "إضافة",
|
|
"importFromCredential": "أو استيراد من بيانات اعتماد مخزّنة",
|
|
"keyPublished": "تم نشر المفتاح",
|
|
"addKeyFailed": "فشل إضافة المفتاح",
|
|
"generatedSaved": "تم توليد زوج المفاتيح وحفظه في مخزن بيانات الاعتماد. كما تم تنزيل المفتاح الخاص.",
|
|
"generatedOnly": "تم توليد زوج المفاتيح — تم تنزيل المفتاح الخاص (يُعرض مرة واحدة فقط).",
|
|
"generateFailed": "فشل توليد المفتاح",
|
|
"imported": "تم استيراد المفتاح من بيانات الاعتماد",
|
|
"importFailed": "فشل استيراد المفتاح",
|
|
"noKeys": "لا توجد مفاتيح عامة منشورة بعد.",
|
|
"keysTitle": "المفاتيح المنشورة",
|
|
"published": "منشور",
|
|
"hidden": "مخفي",
|
|
"keyRemoved": "تمت إزالة المفتاح",
|
|
"removeKeyFailed": "فشل إزالة المفتاح",
|
|
"updateKeyFailed": "فشل تحديث المفتاح",
|
|
"fromVault": "من خزنة بيانات الاعتماد",
|
|
"linkedToTermixId": "منشور عبر Termix ID",
|
|
"selectCredential": "اختر بيانات اعتماد...",
|
|
"import": "استيراد",
|
|
"caTitle": "المرجع المصدق (CA)",
|
|
"caIntro": "وثق هذا المرجع المصدق على الخادم ليقبل أي شهادة توقعها. دوِّره لإبطال كل الشهادات دفعة واحدة؛ تنتهي صلاحية الشهادات تلقائيًا أيضًا.",
|
|
"caEnable": "فعّل المرجع المصدق",
|
|
"caEnabled": "تم تفعيل المرجع المصدق",
|
|
"caCreateFailed": "فشل تفعيل المرجع المصدق",
|
|
"caPublicKeyLabel": "المفتاح العام للمرجع المصدق",
|
|
"caTrustLabel": "ثق به على الخادم (تشغيل بصلاحيات الجذر)",
|
|
"caRotate": "دوِّر",
|
|
"caRotateConfirm": "هل تريد تدوير المرجع المصدق؟ ستتوقف جميع الشهادات التي وقعها عن القبول ويجب إعادة إصدارها.",
|
|
"caRotated": "تم تدوير المرجع المصدق — أُبطلت الشهادات السابقة",
|
|
"caRotateFailed": "فشل تدوير المرجع المصدق",
|
|
"caDelete": "أزل المرجع المصدق",
|
|
"caDeleteConfirm": "هل تريد إزالة المرجع المصدق؟",
|
|
"caDeleted": "تمت إزالة المرجع المصدق",
|
|
"caDeleteFailed": "فشل إزالة المرجع المصدق",
|
|
"caValidityLabel": "صلاحية الشهادة (بالأيام)",
|
|
"issueCert": "شهادة",
|
|
"issueCertTooltip": "إصدار شهادة SSH لهذا المفتاح، موقعة من المرجع المصدق الخاص بك",
|
|
"certIssued": "تم إصدار الشهادة وتنزيلها",
|
|
"certIssueFailed": "فشل إصدار الشهادة"
|
|
},
|
|
"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",
|
|
"noPublicKeyAvailable": "لا يوجد مفتاح عام متوفر. افتح محرر بيانات الاعتماد أولاً.",
|
|
"deployCommandCopied": "تم نسخ أمر النشر",
|
|
"sortCredentials": "ترتيب بيانات الاعتماد",
|
|
"sortDefault": "الترتيب الافتراضي",
|
|
"sortNameAsc": "الاسم (A → Z)",
|
|
"sortNameDesc": "الاسم (Z → A)",
|
|
"sortUsernameAsc": "اسم المستخدم (A → Z)",
|
|
"sortUsernameDesc": "اسم المستخدم (Z → A)",
|
|
"filterCredentials": "تصفية بيانات الاعتماد",
|
|
"filterClearAll": "مسح عوامل التصفية",
|
|
"filterTypeGroup": "النوع",
|
|
"filterTypePassword": "كلمة المرور",
|
|
"filterTypeKey": "مفتاح SSH",
|
|
"filterTagsGroup": "وسوم",
|
|
"copyDeployCommand": "نسخ أمر النشر",
|
|
"cloneCredentialAction": "بيانات اعتماد الاستنساخ",
|
|
"clonedCredential": "مستنسخ {{name}}",
|
|
"clonedCredentialName": "{{name}} (نسخة)",
|
|
"shareCredentialAction": "بيانات اعتماد المشاركة",
|
|
"sharedBadge": "تمت المشاركة",
|
|
"sharedBy": "تمت المشاركة بواسطة {{owner}}",
|
|
"share": {
|
|
"title": "شارك \"{{name}}\"",
|
|
"description": "يحصل المستلمون على نسخة مشفرة خاصة بهم من الأسرار. يتم تحديثها كلما تغيرت بيانات الاعتماد، وتُحذف عند إلغاء المشاركة.",
|
|
"users": "المستخدمون",
|
|
"roles": "الأدوار",
|
|
"searchPlaceholder": "يبحث...",
|
|
"permission": "إذن",
|
|
"levelUse": "يستخدم",
|
|
"levelManage": "يدير",
|
|
"levelUseDesc": "طريقة الاستخدام: قم بإرفاق بيانات الاعتماد بالمضيفين واتصل. يبقى السر نفسه مخفيًا.",
|
|
"levelManageDesc": "إدارة: يمكنك أيضًا تعديل بيانات الاعتماد ومشاركتها مع الآخرين.",
|
|
"expires": "تاريخ الانتهاء",
|
|
"expiry": {
|
|
"never": "أبداً",
|
|
"oneDay": "يوم واحد",
|
|
"sevenDays": "7 أيام",
|
|
"thirtyDays": "30 يومًا"
|
|
},
|
|
"currentAccess": "تمت المشاركة مع",
|
|
"revoke": "إلغاء",
|
|
"shared": "تمت مشاركة بيانات الاعتماد",
|
|
"shareButton": "يشارك"
|
|
},
|
|
"deleteCredentialAction": "حذف بيانات الاعتماد",
|
|
"editCredentialAction": "تعديل بيانات الاعتماد",
|
|
"failedToCloneCredential": "فشل استنساخ بيانات الاعتماد",
|
|
"failedToDeleteCredential": "فشل حذف بيانات الاعتماد",
|
|
"idBadge": "بطاقة تعريف",
|
|
"keyBadge": "مفتاح",
|
|
"passwordBadge": "ذوي الاحتياجات الخاصة",
|
|
"renameFolder": "إعادة تسمية المجلد",
|
|
"deleteFolder": "حذف المجلد",
|
|
"deleteCredentialConfirm": "حذف بيانات الاعتماد \"{{name}}\"?",
|
|
"deletedCredential": "تم الحذف {{name}}",
|
|
"deploySSHKeyTitle": "نشر المفتاح على المضيف",
|
|
"loadingCredentials": "جارٍ تحميل بيانات الاعتماد...",
|
|
"noCredentialsFound": "لم يتم العثور على بيانات اعتماد",
|
|
"noCredentialsMatchSearch": "لا توجد بيانات اعتماد مطابقة لبحثك",
|
|
"addCredentialBtn": "إضافة بيانات اعتماد",
|
|
"failedToReorder": "فشل إعادة ترتيب بيانات الاعتماد",
|
|
"failedToMoveCredential": "فشل نقل بيانات الاعتماد",
|
|
"sortManual": "يدوي (اسحب لإعادة الترتيب)",
|
|
"customizeSidebar": "تخصيص الشريط الجانبي",
|
|
"customizeSidebarDescription": "اختر كيف تبدو قائمة بيانات الاعتماد وكيف تعمل.",
|
|
"customizeDensityTitle": "كثافة",
|
|
"densityComfortableDesc": "بيانات اعتماد واحدة لكل صف، مع تفاصيل إضافية.",
|
|
"densityCompactDesc": "سطر واحد لكل بيانات اعتماد، للقوائم الأطول.",
|
|
"displayDensityComfortable": "مريح",
|
|
"displayDensityCompact": "صغير الحجم",
|
|
"customizeBehaviorTitle": "سلوك",
|
|
"showCredentialTags": "عرض العلامات",
|
|
"showCredentialTagsDesc": "عرض العلامات في قائمة بيانات الاعتماد",
|
|
"actionsVisibility": "إجراءات الاعتماد",
|
|
"actionsVisibilityDesc": "عند ظهور أزرار الاتصال والإدارة على كل بيانات اعتماد",
|
|
"actionsAlways": "مرئي دائمًا",
|
|
"actionsOnly": "الاتصال فقط، والباقي عند النقر",
|
|
"actionsHover": "عرض عند تمرير المؤشر",
|
|
"actionsClick": "يظهر عند النقر",
|
|
"customizeSortHint": "يوجد خيار ترتيب الفرز في قائمة الفرز الموجودة في شريط الأدوات.",
|
|
"expandActions": "توسيع الإجراءات",
|
|
"collapseActions": "إجراءات الانهيار",
|
|
"backToHosts": "العودة إلى المضيفين",
|
|
"backToCredentials": "العودة إلى بيانات الاعتماد",
|
|
"searchCredentialsPlaceholder": "بيانات اعتماد البحث…",
|
|
"deployDialogTitle": "نشر مفتاح SSH",
|
|
"deployDialogDesc": "قم بنشر {{name}} إلى authorized_keys الخاص بالمضيف.",
|
|
"targetHostLabel": "المضيف المستهدف",
|
|
"selectHostOption": "اختر مضيفًا...",
|
|
"deployingBtn": "جارٍ النشر...",
|
|
"deployBtn": "انشر",
|
|
"keyDeployedSuccess": "تم نشر المفتاح بنجاح",
|
|
"failedToDeployKey": "فشل نشر المفتاح",
|
|
"folderRenamedTo": "تمت إعادة تسمية المجلد إلى \"{{name}}\"",
|
|
"failedToRenameFolder": "فشل إعادة تسمية المجلد",
|
|
"arrangeUnlockedSwitchedToManual": "تم التحويل إلى الفرز اليدوي لضمان بقاء طلبك",
|
|
"arrangeUnlocked": "قم بإلغاء القفل واسحب لإعادة الترتيب"
|
|
},
|
|
"homepage": {
|
|
"title": "الصفحة الرئيسية",
|
|
"addWidget": "إضافة ويدجت",
|
|
"editWidget": "تعديل ويدجت",
|
|
"deleteWidget": "حذف",
|
|
"widgetTypes": "أنواع الأدوات",
|
|
"serviceLink": "رابط الخدمة",
|
|
"folder": "مجلد",
|
|
"clock": "الساعة",
|
|
"notes": "ملاحظات",
|
|
"hostStatus": "حالة المضيف",
|
|
"bookmarkList": "علامات مرجعية",
|
|
"zoomIn": "تكبير",
|
|
"zoomOut": "تصغير",
|
|
"resetView": "إعادة تعيين العرض",
|
|
"lockLayout": "قفل التخطيط",
|
|
"unlockLayout": "إلغاء قفل التخطيط",
|
|
"noWidgets": "انقر بزر الماوس الأيمن أو انقر على + لإضافة أداتك الأولى",
|
|
"openFullView": "فتح العرض الكامل",
|
|
"previewTitle": "معاينة الصفحة الرئيسية",
|
|
"cancel": "إلغاء",
|
|
"save": "حفظ",
|
|
"title_label": "العنوان",
|
|
"widgetTitlePlaceholder": "عنوان الأداة (اختياري)",
|
|
"url": "URL",
|
|
"imageUrl": "URL صورة مخصصة",
|
|
"imageUrlHint": "اتركه فارغًا لاستخدام أيقونة الموقع تلقائيًا",
|
|
"showImage": "إظهار الصورة",
|
|
"description": "الوصف",
|
|
"color": "اللون",
|
|
"icon": "الأيقونة",
|
|
"expanded": "موسَّع بشكل افتراضي",
|
|
"timezone": "المنطقة الزمنية",
|
|
"invalidTimezone": "المنطقة الزمنية غير صالحة. استخدم اسمًا من IANA مثل America/New_York",
|
|
"showSeconds": "عرض الثواني",
|
|
"format12h": "12 ساعة",
|
|
"format24h": "24 ساعة",
|
|
"content": "المحتوى",
|
|
"backgroundColor": "لون الخلفية",
|
|
"host": "المضيف",
|
|
"showMetrics": "عرض المقاييس",
|
|
"links": "روابط",
|
|
"addLink": "إضافة رابط",
|
|
"linkLabel": "التسمية",
|
|
"linkUrl": "URL",
|
|
"removeLink": "إزالة",
|
|
"categoryLinks": "روابط",
|
|
"categoryInfo": "معلومات",
|
|
"categorySystem": "النظام",
|
|
"widgetServiceLinkDesc": "بلاطة قابلة للنقر تؤدي إلى رابط خدمة",
|
|
"widgetFolderDesc": "حاوية لتجميع الأدوات ذات الصلة",
|
|
"widgetClockDesc": "ساعة مباشرة مع منطقة زمنية قابلة للتكوين",
|
|
"widgetNotesDesc": "أداة ملاحظات بتنسيق Markdown",
|
|
"widgetHostStatusDesc": "يعرض بيانات المعالج والذاكرة والقرص لخادم SSH مباشرة",
|
|
"widgetBookmarkListDesc": "قائمة بالروابط السريعة",
|
|
"copyLink": "نسخ الرابط",
|
|
"linkCopied": "تم نسخ الرابط!",
|
|
"location": "الموقع",
|
|
"temperatureUnit": "وحدة درجة الحرارة",
|
|
"showForecast": "إظهار توقعات 3 أيام",
|
|
"scrolling": "السماح بالتمرير",
|
|
"feedUrl": "رابط التغذية",
|
|
"maxItems": "الحد الأقصى للعناصر",
|
|
"showDescription": "إظهار الوصف",
|
|
"widgetWeatherName": "الطقس",
|
|
"widgetWeatherDesc": "حالة الطقس المباشرة لأي موقع",
|
|
"widgetIframeName": "تضمين iFrame",
|
|
"widgetIframeDesc": "تضمين أي رابط في إطار iFrame",
|
|
"widgetRssName": "تغذية RSS",
|
|
"widgetRssDesc": "عرض عناصر من تغذية RSS أو Atom",
|
|
"dragToFolder": "اسحب الأدوات هنا أو استخدم + للإضافة",
|
|
"showDisk": "إظهار استخدام القرص",
|
|
"addToFolder": "إضافة أداة إلى المجلد",
|
|
"noHostSelected": "لم يتم تحديد أي مضيف",
|
|
"metricsNotAvailable": "المقاييس غير متوفرة",
|
|
"selectHost": "اختيار مضيف...",
|
|
"displayedMetrics": "المقاييس المعروضة",
|
|
"metricCpu": "CPU",
|
|
"metricMemory": "الذاكرة",
|
|
"metricDisk": "القرص",
|
|
"metricUptime": "وقت التشغيل",
|
|
"metricSystem": "النظام",
|
|
"metricOs": "نظام التشغيل",
|
|
"metricKernel": "النواة",
|
|
"metricHostname": "اسم المضيف",
|
|
"metricNetwork": "الشبكة",
|
|
"metricProcesses": "العمليات",
|
|
"metricProcessesTotal": "إجمالي",
|
|
"metricProcessesRunning": "قيد التشغيل",
|
|
"categoryMonitoring": "المراقبة",
|
|
"loading": "جار التحميل...",
|
|
"noData": "لا توجد بيانات",
|
|
"allClear": "كل شيء طبيعي",
|
|
"acknowledgeAlert": "إقرار",
|
|
"noPingUrls": "لم يتم تكوين عناوين URL",
|
|
"pingLabel": "التسمية",
|
|
"addPingUrl": "إضافة URL",
|
|
"showLatency": "إظهار زمن الانتقال",
|
|
"refreshInterval": "فترة التحديث",
|
|
"seconds": "ثانية",
|
|
"filterActivityTypes": "أنواع التصفية",
|
|
"filterTypesHint": "اترك فارغاً لإظهار الكل",
|
|
"showTimestamp": "إظهار الطابع الزمني",
|
|
"uptimeUnavailable": "وقت التشغيل غير متوفر",
|
|
"uptimeLabel": "وقت التشغيل",
|
|
"overviewVersion": "الإصدار",
|
|
"overviewUpdate": "محدّث",
|
|
"overviewUpdateLabel": "تحديث",
|
|
"overviewUpdateAvailable": "تحديث متوفر",
|
|
"overviewDatabase": "قاعدة البيانات",
|
|
"overviewUptime": "وقت التشغيل",
|
|
"noHosts": "لا توجد مضيفات مُهيأة",
|
|
"hostGridHosts": "المضيفات",
|
|
"hostGridAllHint": "اتركه فارغًا لعرض جميع المضيفات",
|
|
"columns": "الأعمدة",
|
|
"showIp": "إظهار عنوان IP",
|
|
"connectionType": "نوع الاتصال",
|
|
"layout": "التخطيط",
|
|
"showStatus": "إظهار الحالة",
|
|
"showHostName": "إظهار اسم المضيف",
|
|
"noDockerActivity": "لا يوجد نشاط Docker",
|
|
"noActivity": "لا يوجد نشاط",
|
|
"showAcknowledged": "إظهار المُقر بها",
|
|
"showCurrentValue": "إظهار القيمة الحالية",
|
|
"chartMetric": "المقياس",
|
|
"metricRange": "النطاق",
|
|
"widgetMetricsChartName": "مخطط المقاييس",
|
|
"widgetMetricsChartDesc": "مخطط تاريخي لوحدة المعالجة المركزية أو الذاكرة أو القرص أو الشبكة لمضيف",
|
|
"widgetHostGridName": "شبكة المضيفات",
|
|
"widgetHostGridDesc": "عرض شبكي لحالات مضيفات SSH",
|
|
"widgetAlertFeedName": "موجز التنبيهات",
|
|
"widgetAlertFeedDesc": "تنبيهات حية مع دعم الإقرار",
|
|
"widgetPingStatusName": "حالة Ping",
|
|
"widgetPingStatusDesc": "حالة ping HTTP لعنوان URL واحد أو أكثر",
|
|
"widgetRecentActivityName": "النشاط الأخير",
|
|
"widgetRecentActivityDesc": "موجز قابل للتمرير للنشاط الأخير في Termix",
|
|
"widgetTermixUptimeName": "مدة تشغيل Termix",
|
|
"widgetTermixUptimeDesc": "عداد مباشر لمدة تشغيل خادم Termix",
|
|
"widgetSystemOverviewName": "نظرة عامة على النظام",
|
|
"widgetSystemOverviewDesc": "إصدار Termix وصحة قاعدة البيانات ومدة التشغيل في لمحة",
|
|
"widgetSshQuickConnectName": "اتصال SSH السريع",
|
|
"widgetSshQuickConnectDesc": "أزرار بنقرة واحدة لفتح جلسات SSH",
|
|
"widgetDockerActivityName": "نشاط Docker",
|
|
"widgetDockerActivityDesc": "أحداث حاويات Docker الأخيرة عبر جميع المضيفات",
|
|
"widgetCalendarName": "التقويم",
|
|
"widgetCalendarDesc": "تقويم شهري مع إبراز اليوم",
|
|
"widgetCountdownName": "عداد تنازلي",
|
|
"widgetCountdownDesc": "مؤقت عد تنازلي لتاريخ مستهدف",
|
|
"widgetSearchBarName": "شريط البحث",
|
|
"widgetSearchBarDesc": "ودجت بحث سريع على الويب",
|
|
"widgetTextBannerName": "لافتة نصية",
|
|
"widgetTextBannerDesc": "تسمية عريضة أو رأس قسم للوحة",
|
|
"widgetImageWidgetName": "صورة",
|
|
"widgetImageWidgetDesc": "عرض صورة من رابط URL",
|
|
"widgetMarkdownNotesName": "ملاحظات ماركداون",
|
|
"widgetMarkdownNotesDesc": "ملاحظات غنية مع عرض ماركداون مضمن",
|
|
"widgetCustomApiName": "API مخصص",
|
|
"widgetCustomApiDesc": "جلب وعرض بيانات من أي JSON API",
|
|
"widgetServiceGridName": "شبكة الخدمات",
|
|
"widgetServiceGridDesc": "شبكة قابلة للتكوين من روابط مربعات الخدمات",
|
|
"widgetDashboardLinksName": "روابط لوحة المعلومات",
|
|
"widgetDashboardLinksDesc": "عرض روابط الخدمات المكوّنة من لوحة المعلومات",
|
|
"widgetSearchLinksName": "اختصارات البحث",
|
|
"widgetSearchLinksDesc": "أزرار اختصارات بحث سريعة مع إدخال مضمن",
|
|
"widgetLinkTreeName": "شجرة الروابط",
|
|
"widgetLinkTreeDesc": "أقسام مجمّعة من الروابط مع عناوين",
|
|
"calMon": "إثنين",
|
|
"calTue": "ثلاثاء",
|
|
"calWed": "أربعاء",
|
|
"calThu": "خميس",
|
|
"calFri": "جمعة",
|
|
"calSat": "سبت",
|
|
"calSun": "أحد",
|
|
"startOnMonday": "بدء الأسبوع يوم الإثنين",
|
|
"countdownNoDate": "لم يتم تحديد تاريخ مستهدف",
|
|
"countdownPast": "انقضى الحدث",
|
|
"countdownDays": "أيام",
|
|
"countdownHours": "ساعات",
|
|
"countdownMinutes": "دقائق",
|
|
"countdownSeconds": "ثوانٍ",
|
|
"countdownLabel": "تسمية",
|
|
"countdownLabelPlaceholder": "مثال: يوم الإطلاق",
|
|
"countdownShowDays": "إظهار الأيام",
|
|
"countdownShowHours": "إظهار الساعات",
|
|
"targetDate": "التاريخ المستهدف",
|
|
"searchEngine": "محرك البحث",
|
|
"customSearchUrl": "عنوان URL بحث مخصص",
|
|
"searchPlaceholder": "بحث...",
|
|
"searchGo": "تنفيذ",
|
|
"searchPlaceholderLabel": "نص العنصر النائب",
|
|
"searchPlaceholderHint": "النص المعروض داخل حقل البحث",
|
|
"openInNewTab": "فتح في علامة تبويب جديدة",
|
|
"searchQueryPlaceholder": "أدخل الاستعلام...",
|
|
"noSearchShortcuts": "لا توجد اختصارات مكونة",
|
|
"addSearchShortcut": "إضافة اختصار",
|
|
"fontSize": "حجم الخط",
|
|
"textAlign": "محاذاة النص",
|
|
"fontWeight": "وزن الخط",
|
|
"clearColor": "مسح اللون",
|
|
"imageFit": "ملاءمة الصورة",
|
|
"imageLinkUrl": "رابط URL",
|
|
"noImage": "لم يتم تعيين عنوان URL للصورة",
|
|
"altText": "نص بديل",
|
|
"altTextPlaceholder": "وصف الصورة",
|
|
"renderMarkdown": "عرض Markdown",
|
|
"displayMode": "وضع العرض",
|
|
"displayField": "حقل العرض",
|
|
"jsonPath": "مسار JSON",
|
|
"customApiLabel": "تسمية",
|
|
"customApiLabelPlaceholder": "مثال: درجة الحرارة",
|
|
"customApiUnit": "وحدة",
|
|
"customApiNoUrl": "لم يتم تكوين عنوان URL API",
|
|
"customApiError": "فشل في الجلب",
|
|
"customApiNotArray": "الاستجابة ليست مصفوفة",
|
|
"addService": "إضافة خدمة",
|
|
"showLabels": "إظهار التسميات",
|
|
"iconSize": "حجم الأيقونة",
|
|
"noDashboardLinks": "لا توجد روابط لوحة تحكم مُعدة",
|
|
"noLimit": "غير محدود",
|
|
"sectionHeading": "عنوان القسم",
|
|
"addSection": "إضافة قسم",
|
|
"compactMode": "الوضع المضغوط",
|
|
"showDetailed": "إظهار التفاصيل",
|
|
"selectHosts": "اختيار المضيفين",
|
|
"allHosts": "جميع المضيفين",
|
|
"listLayout": "قائمة",
|
|
"gridLayout": "شبكة",
|
|
"terminal": "الطرفية",
|
|
"files": "الملفات",
|
|
"docker": "Docker",
|
|
"range15m": "15 دقيقة",
|
|
"range1h": "ساعة واحدة",
|
|
"range6h": "6 ساعات",
|
|
"range24h": "24 ساعة",
|
|
"metricNetRx": "تنزيل الشبكة",
|
|
"metricNetTx": "رفع الشبكة",
|
|
"severityFilter": "مرشح الخطورة",
|
|
"filterAll": "الكل",
|
|
"accentColor": "لون التمييز",
|
|
"widgetSshTerminalName": "طرفية SSH",
|
|
"widgetSshTerminalDesc": "طرفية SSH مضمنة متصلة بمضيف مُعد",
|
|
"sshTerminalNoHost": "لم يتم إعداد مضيف",
|
|
"sshTerminalConnect": "اتصل",
|
|
"sshTerminalAutoConnect": "اتصال تلقائي عند التحميل",
|
|
"widgetQuickConnectName": "اتصال سريع",
|
|
"widgetQuickConnectDesc": "أزرار تشغيل بنقرة واحدة لأي نوع اتصال عبر مضيفيك",
|
|
"connectionTypes": "أنواع الاتصال",
|
|
"connType_terminal": "الطرفية",
|
|
"connType_files": "مدير الملفات",
|
|
"connType_docker": "Docker",
|
|
"connType_tunnel": "نفق",
|
|
"connType_host-metrics": "مقاييس المضيف",
|
|
"connType_rdp": "RDP",
|
|
"connType_vnc": "VNC",
|
|
"connType_telnet": "Telnet",
|
|
"widgetFileManagerName": "مدير الملفات",
|
|
"widgetFileManagerDesc": "مدير ملفات SFTP مدمج لمضيف مكوّن",
|
|
"widgetDockerName": "مدير Docker",
|
|
"widgetDockerDesc": "مدير حاويات Docker مدمج لمضيف مكوّن",
|
|
"widgetTunnelName": "مدير الأنفاق",
|
|
"widgetTunnelDesc": "مدير أنفاق SSH مدمج لمضيف مكوّن",
|
|
"widgetNoHostSelected": "لم يتم تكوين أي مضيف"
|
|
},
|
|
"serverConfig": {
|
|
"title": "إعدادات الخادم",
|
|
"description": "تكوين رابط خادم Termix للاتصال بخدماتك الخلفية",
|
|
"serverUrl": "رابط الخادم",
|
|
"enterServerUrl": "يرجى إدخال رابط الخادم",
|
|
"saveFailed": "فشل حفظ الإعدادات",
|
|
"saveError": "خطأ في حفظ الإعدادات",
|
|
"saving": "جاري الحفظ...",
|
|
"saveConfig": "حفظ الإعدادات",
|
|
"helpText": "أدخل الرابط حيث يعمل خادم Termix (مثال: http://localhost:30001 أو https://your-server.com)",
|
|
"changeServer": "تغيير الخادم",
|
|
"mustIncludeProtocol": "يجب أن يبدأ رابط الخادم بـ http:// أو https://",
|
|
"allowInvalidCertificate": "السماح بشهادة غير صالحة",
|
|
"allowInvalidCertificateDesc": "استخدم فقط للخوادم الموثوقة ذاتية الاستضافة التي تحمل شهادات موقعة ذاتيًا أو بعنوان IP.",
|
|
"useEmbedded": "استخدام الخادم المحلي",
|
|
"embeddedDesc": "تشغيل Termix مع الخادم المحلي المدمج (لا حاجة لخادم بعيد)",
|
|
"embeddedConnecting": "جاري الاتصال بالخادم المحلي...",
|
|
"embeddedNotReady": "الخادم المحلي غير جاهز بعد. يرجى الانتظار قليلاً ثم المحاولة مرة أخرى.",
|
|
"localServer": "الخادم المحلي",
|
|
"savedServers": "الخوادم المحفوظة",
|
|
"noSavedServers": "لا توجد خوادم محفوظة",
|
|
"removeServer": "إزالة"
|
|
},
|
|
"migrationNotice": {
|
|
"title": "يعمل برنامج Termix Desktop الآن بشكل مستقل",
|
|
"body1": "كان هذا التطبيق يتصل مباشرةً بخادم Termix الخاص بك. تم تطويره ليعمل بشكل مستقل تمامًا، حيث يخزن بيانات المضيفين وبيانات الاعتماد محليًا، مما يضمن استمرارية عمله دون اتصال بالإنترنت. أصبح التزامن ثنائي الاتجاه مع خادم Termix مُستضاف ذاتيًا اختياريًا الآن.",
|
|
"body2": "لا تزال بيانات المضيفين وبيانات الاعتماد الحالية موجودة على {{url}}. قم بتشغيل المزامنة عن بُعد وأعد الاتصال بهذا الخادم لاستعادتها والحفاظ على تزامنها في المستقبل.",
|
|
"dismiss": "ليس الآن",
|
|
"setUpSync": "إعداد المزامنة عن بُعد"
|
|
},
|
|
"remoteSync": {
|
|
"title": "المزامنة عن بعد",
|
|
"description": "يمكنك ربط تطبيق سطح المكتب هذا بخادم Termix مُستضاف ذاتيًا لمزامنة بيانات المضيفين وبيانات الاعتماد والقصاصات البرمجية عبر الأجهزة. يعمل التطبيق دائمًا بشكل كامل دون اتصال بالإنترنت سواءً كنت متصلاً أم لا.",
|
|
"notConnected": "غير متصل",
|
|
"connected": "متصل",
|
|
"connectedTo": "متصل بـ {{url}}",
|
|
"lastSynced": "آخر مزامنة {{time}}",
|
|
"neverSynced": "لم تتم المزامنة مطلقاً",
|
|
"syncError": "خطأ في المزامنة: {{message}}",
|
|
"needsReauth": "انتهت صلاحية تسجيل الدخول",
|
|
"connectButton": "الاتصال بالخادم",
|
|
"disconnectButton": "قطع الاتصال",
|
|
"syncNowButton": "مزامنة الآن",
|
|
"syncing": "جارٍ المزامنة...",
|
|
"syncSuccess": "اكتملت المزامنة عن بعد",
|
|
"syncUnavailable": "تعذر بدء المزامنة عن بعد",
|
|
"serverUrl": "عنوان الخادم",
|
|
"enterServerUrl": "الرجاء إدخال عنوان URL للخادم",
|
|
"mustIncludeProtocol": "يجب أن يبدأ عنوان URL للخادم بـ http:// أو https://",
|
|
"connectionTestFailed": "تعذر الوصول إلى خادم Termix على عنوان URL هذا",
|
|
"allowInvalidCertificate": "السماح بشهادة غير صالحة",
|
|
"allowInvalidCertificateDesc": "استخدمه فقط للخوادم الموثوقة ذاتية الاستضافة التي تحتوي على شهادات موقعة ذاتيًا أو شهادات عناوين IP.",
|
|
"savedServers": "الخوادم المحفوظة",
|
|
"removeServer": "يزيل",
|
|
"continueButton": "يكمل",
|
|
"cancelButton": "يلغي",
|
|
"signInTitle": "سجّل الدخول إلى {{url}}",
|
|
"originTitle": "أصل الاتصالات",
|
|
"originDescription": "اختر مصدر اتصالات SSH الافتراضي. يمكن تغيير هذا الإعداد لكل مضيف على حدة.",
|
|
"originLocal": "هذا الجهاز (الشبكة المحلية)",
|
|
"originRemote": "خادم بعيد",
|
|
"bannerReconnect": "إعادة الاتصال",
|
|
"bannerMessage": "يتطلب المزامنة عن بُعد إعادة المصادقة"
|
|
},
|
|
"versionCheck": {
|
|
"error": "خطأ في التحقق من الإصدار",
|
|
"checkFailed": "فشل التحقق من وجود تحديثات",
|
|
"upToDate": "التطبيق محدث",
|
|
"currentVersion": "أنت تعمل على الإصدار {{version}}",
|
|
"updateAvailable": "تحديث متاح",
|
|
"updateLinkLabel": "يتوفر تحديث — افتح ملاحظات الإصدار على GitHub",
|
|
"newVersionAvailable": "إصدار جديد متاح! أنت تعمل على {{current}}، لكن {{latest}} متاح.",
|
|
"betaVersion": "إصدار تجريبي",
|
|
"betaVersionDesc": "أنت تعمل على {{current}}، وهو أحدث من آخر إصدار مستقر {{latest}}.",
|
|
"releasedOn": "صدر في {{date}}",
|
|
"downloadUpdate": "تنزيل التحديث",
|
|
"checking": "جارٍ التحقق من التحديثات...",
|
|
"checkUpdates": "التحقق من التحديثات",
|
|
"checkingUpdates": "جارٍ التحقق من التحديثات...",
|
|
"updateRequired": "التحديث مطلوب"
|
|
},
|
|
"common": {
|
|
"close": "إغلاق",
|
|
"minimize": "تصغير",
|
|
"online": "متصل",
|
|
"offline": "غير متصل",
|
|
"unknown": "غير معروف",
|
|
"continue": "متابعة",
|
|
"maintenance": "صيانة",
|
|
"degraded": "متدهور",
|
|
"error": "خطأ",
|
|
"warning": "تحذير",
|
|
"unsavedChanges": "تغييرات غير محفوظة",
|
|
"dismiss": "تجاهل",
|
|
"more": "أكثر",
|
|
"loading": "جارٍ التحميل...",
|
|
"optional": "اختياري",
|
|
"connect": "اتصل",
|
|
"copied": "تم النسخ",
|
|
"connecting": "جارٍ الاتصال...",
|
|
"updateAvailable": "تحديث متاح",
|
|
"appName": "Termix",
|
|
"openInNewTab": "فتح في علامة تبويب جديدة",
|
|
"noReleases": "لا توجد إصدارات",
|
|
"updatesAndReleases": "التحديثات والإصدارات",
|
|
"newVersionAvailable": "يتوفر إصدار جديد ({{version}}).",
|
|
"failedToFetchUpdateInfo": "فشل جلب معلومات التحديث",
|
|
"preRelease": "ما قبل الإصدار",
|
|
"noReleasesFound": "لم يتم العثور على إصدارات.",
|
|
"cancel": "إلغاء",
|
|
"username": "اسم المستخدم",
|
|
"login": "تسجيل الدخول",
|
|
"logout": "تسجيل الخروج",
|
|
"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": "فشل النسخ إلى الحافظة",
|
|
"maximize": "تكبير",
|
|
"restore": "استعادة",
|
|
"of": "من",
|
|
"saved": "محفوظ",
|
|
"deleted": "محذوف",
|
|
"deleteFailed": "فشل في الحذف",
|
|
"saveFailed": "فشل في الحفظ",
|
|
"required": "مطلوب"
|
|
},
|
|
"onboarding": {
|
|
"stepCounter": "الخطوة {{current}} من {{total}}",
|
|
"skip": "تخطي الإعداد",
|
|
"next": "التالي",
|
|
"finish": "ابدأ الآن",
|
|
"welcomeTitle": "أهلا بكم في تيرميكس",
|
|
"welcomeIntro": "يدير Termix خوادمك من مكان واحد. يستغرق هذا الإعداد حوالي دقيقة واحدة، ولا شيء هنا دائم.",
|
|
"welcome_hosts": "احفظ خوادمك",
|
|
"welcome_hosts_desc": "احتفظ بجميع الأجهزة التي تديرها في قائمة واحدة.",
|
|
"welcome_terminal": "اتصل على الفور",
|
|
"welcome_terminal_desc": "افتح نافذة طرفية في علامة تبويب، بدون عميل SSH منفصل.",
|
|
"welcome_files": "تصفح الملفات وتعديلها",
|
|
"welcome_files_desc": "تحميل وتنزيل وتعديل الملفات عن بُعد.",
|
|
"presetTitle": "ما مقدار ما تريد عرضه على الشاشة؟",
|
|
"presetIntro": "يمكنك استخدام Termix بطريقة بسيطة أو مفصلة حسب رغبتك. اختر نقطة بداية.",
|
|
"presetChangeLater": "يمكنك تبديل الإعدادات المسبقة أو تغيير أي إعداد فردي لاحقًا في الإعدادات، ضمن واجهة المستخدم.",
|
|
"appearanceTitle": "اجعلها ملكك",
|
|
"appearanceIntro": "اختر سمة ولونًا مميزًا ولغتك. يمكنك تغيير كل هذه العناصر لاحقًا من الإعدادات.",
|
|
"featuresTitle": "ما الذي تقدمه شركة Termix أيضاً؟",
|
|
"featuresIntro": "يمكن فتح كل خادم تقوم بحفظه في أكثر من مجرد نافذة طرفية. إليك ما ينتظرك خلف الأيقونات الموجودة على اليسار.",
|
|
"feature_files": "مدير الملفات",
|
|
"feature_files_desc": "تصفح الملفات وقم بتحميلها وتنزيلها وتعديلها عبر بروتوكول SFTP دون مغادرة التطبيق.",
|
|
"feature_desktop": "سطح المكتب البعيد",
|
|
"feature_desktop_desc": "افتح جلسات RDP وVNC وTelnet في علامة تبويب، تمامًا مثل SSH.",
|
|
"feature_tunnels": "الأنفاق",
|
|
"feature_tunnels_desc": "إعادة توجيه المنافذ عبر خادم للوصول إلى الخدمات غير المكشوفة.",
|
|
"feature_docker": "عامل ميناء",
|
|
"feature_docker_desc": "اطلع على الحاويات، واقرأ السجلات، وراقب الإحصائيات على أي مضيف يعمل بنظام Docker.",
|
|
"feature_snippets": "مقتطفات",
|
|
"feature_snippets_desc": "احفظ الأوامر التي تقوم بتشغيلها بشكل متكرر وأرسلها إلى الطرفية بنقرة واحدة.",
|
|
"feature_automations": "الأتمتة",
|
|
"feature_automations_desc": "قم بتشغيل الخطوات تلقائيًا عند حدوث شيء ما، واحصل على إشعار بذلك.",
|
|
"feature_metrics": "المقاييس والتنبيهات",
|
|
"feature_metrics_desc": "تتبع أداء وحدة المعالجة المركزية والذاكرة والقرص بمرور الوقت، واحصل على تنبيهات عند حدوث مشاكل فيها.",
|
|
"featuresRailHint": "لا تحتاج إلى أحد هذه الخيارات؟ يمكنك إخفاء أي أيقونة من الشريط الجانبي في الإعدادات، ضمن قسم التنقل.",
|
|
"workflowTitle": "تحرك بشكل أسرع",
|
|
"workflowIntro": "بعض العادات التي توفر الكثير من الوقت بمجرد امتلاكك لعدد قليل من الخوادم.",
|
|
"workflow_palette": "لوحة الأوامر",
|
|
"workflow_palette_desc": "انتقل إلى أي خادم أو إجراء عن طريق الكتابة. اضغط على مفتاح Shift مرتين لفتحه.",
|
|
"workflow_split": "شاشة مقسمة",
|
|
"workflow_split_desc": "اعرض ما يصل إلى أربع علامات تبويب جنبًا إلى جنب لمراقبة السجلات أثناء عملك.",
|
|
"workflow_dock": "اللوحة الجانبية",
|
|
"workflow_dock_desc": "انقر بزر الفأرة الأوسط أو الأيمن على أيقونة الشريط الجانبي لفتحها كعلامة تبويب أو لتثبيتها على اليمين.",
|
|
"workflow_workspaces": "مساحات العمل",
|
|
"workflow_workspaces_desc": "احفظ مجموعة من علامات التبويب المفتوحة وأعد فتح التخطيط بأكمله لاحقًا.",
|
|
"securityTitle": "الحفاظ على أمان بيانات تسجيل الدخول الخاصة بك",
|
|
"securityIntro": "يقوم Termix بتخزين بيانات الاعتماد الخاصة بك، لذا يجدر بك قضاء دقيقة لمعرفة كيفية عمل ذلك.",
|
|
"security_credentials": "بيانات اعتماد قابلة لإعادة الاستخدام",
|
|
"security_credentials_desc": "احفظ مفتاحًا أو كلمة مرور مرة واحدة وقم بإرفاقها بأي عدد تريده من الخوادم.",
|
|
"security_twofa": "المصادقة الثنائية وكلمات المرور",
|
|
"security_twofa_desc": "أضف رمز TOTP أو رمز مرور إلى حسابك في الإعدادات، ضمن قسم الأمان.",
|
|
"security_identity": "معرف Termix",
|
|
"security_identity_desc": "إصدار شهادات SSH قصيرة الأجل بدلاً من نسخ المفاتيح إلى كل خادم.",
|
|
"security_sharing": "مشاركة",
|
|
"security_sharing_desc": "امنح المستخدمين الآخرين إمكانية الوصول إلى الخادم دون تسليم كلمة المرور.",
|
|
"securityEncryptionNote": "يتم تشفير بيانات الاعتماد قبل تخزينها، ولا يتم فك تشفيرها إلا عند الحاجة إليها في الاتصال.",
|
|
"doneTitle": "أنت جاهز تماماً",
|
|
"doneHeading": "اكتمل الإعداد",
|
|
"doneDesc": "اختر خادمًا من الشريط الجانبي لفتح نافذة طرفية، أو تصفح ملفاته، أو الاطلاع على مقاييسه.",
|
|
"done_settings": "قم بتغيير أي شيء لاحقًا",
|
|
"done_settings_desc": "تتوفر جميع السمات وكثافة التخطيط والأيقونات التي تظهر في الإعدادات.",
|
|
"done_rerun": "هل تريد هذا مرة أخرى؟",
|
|
"done_rerun_desc": "افتح الإعدادات، وانتقل إلى الواجهة، ثم اختر تشغيل الإعداد لتكرار هذه الخطوات مرة أخرى.",
|
|
"done_desktop": "تطبيق سطح المكتب",
|
|
"done_desktop_desc": "يعمل تطبيق Termix كتطبيق سطح مكتب على أنظمة التشغيل Windows و macOS و Linux.",
|
|
"done_desktop_link": "احصل على تطبيق سطح المكتب",
|
|
"done_mobile": "تطبيق الهاتف المحمول",
|
|
"done_mobile_desc": "اصطحب خوادمك معك على نظامي التشغيل iOS و Android.",
|
|
"done_mobile_link": "احصل على تطبيق الهاتف المحمول",
|
|
"done_docs": "وثائق كاملة",
|
|
"done_docs_desc": "أدلة لكل ميزة، بما في ذلك الميزات التي لم يتم تغطيتها هنا.",
|
|
"done_docs_link": "افتح المستندات",
|
|
"done_cli": "أداة سطر الأوامر",
|
|
"done_cli_desc": "قم بإدارة خوادمك من خلال طرفية، واستخدم Termix في البرامج النصية الخاصة بك.",
|
|
"done_cli_link": "افتح وثائق واجهة سطر الأوامر",
|
|
"aiTitle": "مساعد الذكاء الاصطناعي",
|
|
"aiIntro": "يمكن أن يتضمن تطبيق Termix مساعدًا ذكيًا اختياريًا. يمكنك تغيير هذا الخيار لاحقًا من الإعدادات.",
|
|
"aiEnableTitle": "قم بتشغيله",
|
|
"aiEnableDesc": "يُضيف هذا البرنامج مساعدًا يقرأ إعداداتك ويقترح تغييرات توافق عليها. يتطلب ذلك مزود خدمة تُحدده بنفسك، مثل مزود خدمة Ollama محلي.",
|
|
"aiSkipTitle": "اتركه مغلقًا",
|
|
"aiSkipDesc": "يعمل برنامج Termix كما هو الآن. ويبقى المساعد مخفياً.",
|
|
"aiNote": "لن يتم إرسال أي شيء إلى أي مكان حتى تقوم بإضافة مزود خدمة وإرسال رسالة."
|
|
},
|
|
"nav": {
|
|
"collab": "الاجتماعات",
|
|
"home": "الرئيسية",
|
|
"terminal": "الطرفية",
|
|
"localTerminal": "المحطة المحلية",
|
|
"docker": "Docker",
|
|
"tunnels": "الأنفاق",
|
|
"fileManager": "مدير الملفات",
|
|
"serverStats": "مقاييس المضيف",
|
|
"hostMetrics": "مقاييس المضيف",
|
|
"admin": "الإدارة",
|
|
"termixId": "معرف",
|
|
"userProfile": "ملف المستخدم",
|
|
"splitScreen": "تقسيم الشاشة",
|
|
"confirmClose": "هل تريد إغلاق هذه الجلسة النشطة؟",
|
|
"close": "إغلاق",
|
|
"cancel": "إلغاء",
|
|
"sshManager": "مدير SSH",
|
|
"cannotSplitTab": "لا يمكن تقسيم علامة التبويب هذه",
|
|
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
|
|
"copyPassword": "نسخ كلمة المرور",
|
|
"copySudoPassword": "نسخ كلمة مرور Sudo",
|
|
"passwordCopied": "تم نسخ كلمة المرور إلى الحافظة",
|
|
"noPasswordAvailable": "لا توجد كلمة مرور متاحة",
|
|
"failedToCopyPassword": "فشل نسخ كلمة المرور",
|
|
"refreshTab": "تحديث الاتصال",
|
|
"renameTab": "إعادة تسمية علامة التبويب",
|
|
"openFileManager": "فتح مدير الملفات",
|
|
"dashboard": "لوحة المعلومات",
|
|
"networkGraph": "رسم بياني للشبكة",
|
|
"tmuxMonitor": "مراقب Tmux",
|
|
"homepage": "الصفحة الرئيسية",
|
|
"quickConnect": "اتصال سريع",
|
|
"sshTools": "أدوات SSH",
|
|
"history": "السجل",
|
|
"sessionLogs": "سجلات الجلسات",
|
|
"openAsTabHint": "اضغط على مفتاح Ctrl + انقر أو انقر بالزر الأوسط لفتحها كعلامة تبويب",
|
|
"openAsTab": "افتح كعلامة تبويب",
|
|
"openInRightDock": "افتح في الرصيف الأيمن",
|
|
"closeRightDock": "إغلاق الرصيف الأيمن",
|
|
"toggleRightDock": "تبديل الرصيف الأيمن",
|
|
"multiPanelHintTitle": "العمل مع أكثر من لجنة",
|
|
"multiPanelHintBody": "أبقِ هذه اللوحة مفتوحة أثناء استخدام الشريط الجانبي لغرض آخر. هناك طريقتان لنقلها:",
|
|
"multiPanelHintTabHow": "انقر مع الضغط على مفتاح Ctrl على أيقونة السكة، أو استخدم الزر الموجود في هذا العنوان.",
|
|
"multiPanelHintDockHow": "انقر بزر الماوس الأيمن على أيقونة السكة، أو استخدم أيقونة اللوحة في شريط علامات التبويب.",
|
|
"sidebarSettings": "إعدادات الشريط الجانبي...",
|
|
"hosts": "المضيفون",
|
|
"snippets": "المقتطفات",
|
|
"macros": "وحدات الماكرو",
|
|
"fleets": "الأساطيل",
|
|
"automations": "الأتمتة",
|
|
"workspaces": "مساحات العمل",
|
|
"hostManager": "مدير المضيفين",
|
|
"credentials": "بيانات الاعتماد",
|
|
"portForwarding": "إعادة التوجيه",
|
|
"sftp": "SFTP",
|
|
"connections": "الاتصالات",
|
|
"alerts": "التنبيهات",
|
|
"serial": "تسلسلي",
|
|
"keepSideMenuOpen": "أبقِ قائمة الطعام مفتوحة",
|
|
"collapseSideMenu": "قائمة قابلة للطي",
|
|
"roleAdministrator": "مسؤول",
|
|
"roleUser": "مستخدم",
|
|
"ai": "الذكاء الاصطناعي"
|
|
},
|
|
"hosts": {
|
|
"hosts": "المضيفون",
|
|
"noHosts": "لا توجد مضيفات SSH",
|
|
"retry": "إعادة المحاولة",
|
|
"refresh": "تحديث",
|
|
"optional": "اختياري",
|
|
"downloadSample": "تنزيل عينة",
|
|
"failedToDeleteHost": "فشل حذف {{name}}",
|
|
"importSkipExisting": "استيراد (تخطي الموجود)",
|
|
"importSSHConfig": "استيراد من إعدادات SSH",
|
|
"connectionDetails": "تفاصيل الاتصال",
|
|
"ssh": "SSH",
|
|
"telnet": "Telnet",
|
|
"remoteDesktop": "سطح المكتب البعيد",
|
|
"port": "المنفذ",
|
|
"username": "اسم المستخدم",
|
|
"folder": "المجلد",
|
|
"tags": "الوسوم",
|
|
"pin": "تثبيت",
|
|
"addHost": "إضافة مضيف",
|
|
"editHost": "تحرير المضيف",
|
|
"cloneHost": "استنساخ المضيف",
|
|
"enableTerminal": "تمكين الطرفية",
|
|
"enableTunnel": "تمكين النفق",
|
|
"enableFileManager": "تمكين مدير الملفات",
|
|
"enableDocker": "تمكين Docker",
|
|
"defaultPath": "المسار الافتراضي",
|
|
"connection": "الاتصال",
|
|
"upload": "رفع",
|
|
"authentication": "المصادقة",
|
|
"password": "كلمة المرور",
|
|
"passwordSaved": "تم حفظ كلمة المرور، اكتب لتغييرها",
|
|
"key": "المفتاح",
|
|
"credential": "بيانات الاعتماد",
|
|
"none": "لا يوجد",
|
|
"sshPrivateKey": "مفتاح SSH الخاص",
|
|
"keyType": "نوع المفتاح",
|
|
"uploadFile": "رفع ملف",
|
|
"tabGeneral": "عام",
|
|
"tabSsh": "SSH",
|
|
"tabTerminal": "الطرفية",
|
|
"tabRdp": "RDP",
|
|
"tabVnc": "VNC",
|
|
"tabTunnels": "الأنفاق",
|
|
"tabDocker": "Docker",
|
|
"tabFiles": "الملفات",
|
|
"tabStats": "مقاييس المضيف",
|
|
"tabHostMetrics": "مقاييس المضيف",
|
|
"tabTelnet": "Telnet",
|
|
"tabSharing": "المشاركة",
|
|
"tabAuthentication": "المصادقة",
|
|
"terminal": "الطرفية",
|
|
"tunnel": "النفق",
|
|
"fileManager": "مدير الملفات",
|
|
"serverStats": "مقاييس المضيف",
|
|
"status": {
|
|
"available": "متاح",
|
|
"reachable": "يمكن الوصول إليه، ولكن لا يتطلب مصادقة.",
|
|
"offline": "غير متصل بالإنترنت",
|
|
"monitoringDisabled": "تم تعطيل المراقبة",
|
|
"label": "حالة"
|
|
},
|
|
"folderRenamed": "تمت إعادة تسمية المجلد \"{{oldName}}\" إلى \"{{newName}}\" بنجاح",
|
|
"failedToRenameFolder": "فشلت إعادة تسمية المجلد",
|
|
"unsavedChangesDescription": "لم يتم حفظ تغييرات المضيف. هل تريد تجاهلها؟",
|
|
"keepEditing": "استمر في التحرير",
|
|
"discardChanges": "تجاهل التغييرات",
|
|
"movedToFolder": "تم نقل {{count}} مضيف إلى \"{{folder}}\"",
|
|
"editHostTooltip": "تعديل المضيف",
|
|
"statusChecks": "فحوصات الحالة",
|
|
"metricsCollection": "جمع المقاييس",
|
|
"metricsInterval": "فترة جمع المقاييس",
|
|
"metricsIntervalDesc": "مدة جمع إحصائيات الخادم (5s - 1h)",
|
|
"behavior": "السلوك",
|
|
"themePreview": "معاينة السمة",
|
|
"theme": "السمة",
|
|
"fontFamily": "عائلة الخط",
|
|
"fontSize": "حجم الخط",
|
|
"letterSpacing": "تباعد الأحرف",
|
|
"lineHeight": "ارتفاع السطر",
|
|
"cursorStyle": "نمط المؤشر",
|
|
"cursorBlink": "وميض المؤشر",
|
|
"scrollbackBuffer": "مخزن التمرير",
|
|
"bellStyle": "نمط الجرس",
|
|
"rightClickSelectsWord": "النقر باليمين يحدد الكلمة",
|
|
"fastScrollModifier": "مُعدِّل التمرير السريع",
|
|
"fastScrollSensitivity": "حساسية التمرير السريع",
|
|
"sshAgentForwarding": "إعادة توجيه وكيل SSH",
|
|
"backspaceMode": "نمط الحذف",
|
|
"startupSnippet": "مقتطف بدء التشغيل",
|
|
"selectSnippet": "اختيار مقتطف",
|
|
"forceKeyboardInteractive": "فرض تفاعل لوحة المفاتيح",
|
|
"overrideCredentialUsername": "تجاوز اسم مستخدم الاعتماد",
|
|
"overrideCredentialUsernameDesc": "استخدم اسم المستخدم المحدد أعلاه بدلاً من اسم مستخدم الاعتماد",
|
|
"oidcUsernameHint": "استخدم $oidc.preferred_username لاستبدال اسم تسجيل الدخول الخاص بـ OIDC.",
|
|
"tailscaleUsernameHint": "يجب أن يكون هذا مستخدمًا لنظام Unix، حيث يتم منح هوية Tailscale الخاصة بك في قائمة التحكم بالوصول SSH الخاصة بشبكة tailnet، وليس بالضرورة المستخدم الجذر.",
|
|
"jumpHostChain": "سلسلة مضيفات الانتقال",
|
|
"portKnocking": "طرق المنفذ",
|
|
"addKnock": "إضافة منفذ",
|
|
"addProxyNode": "إضافة عقدة",
|
|
"proxyNode": "عقدة الوكيل",
|
|
"proxyType": "نوع الوكيل",
|
|
"quickActions": "إجراءات سريعة",
|
|
"sudoPasswordAutoFill": "التعبئة التلقائية لكلمة مرور Sudo",
|
|
"sudoPassword": "كلمة مرور Sudo",
|
|
"keepaliveInterval": "فاصل الإبقاء (مللي ثانية)",
|
|
"moshCommand": "أمر MOSH",
|
|
"environmentVariables": "متغيرات البيئة",
|
|
"addVariable": "إضافة متغير",
|
|
"docker": "Docker",
|
|
"copyTerminalUrl": "نسخ URL الطرفية",
|
|
"copyFileManagerUrl": "نسخ URL مدير الملفات",
|
|
"copyRemoteDesktopUrl": "نسخ URL سطح المكتب البعيد",
|
|
"failedToConnect": "فشل الاتصال بوحدة التحكم",
|
|
"connect": "اتصل",
|
|
"disconnect": "قطع الاتصال",
|
|
"start": "بدء",
|
|
"enableStatusCheck": "تفعيل فحص الحالة",
|
|
"enableMetrics": "تفعيل المقاييس",
|
|
"bulkUpdateFailed": "فشل التحديث الجماعي",
|
|
"selectAll": "تحديد الكل",
|
|
"deselectAll": "إلغاء تحديد الكل",
|
|
"protocols": "البروتوكولات",
|
|
"secureShell": "Secure Shell",
|
|
"virtualNetwork": "الشبكة الافتراضية",
|
|
"unencryptedShell": "shell غير مشفر",
|
|
"addressIp": "العنوان / IP",
|
|
"friendlyName": "الاسم المألوف",
|
|
"macAddress": "عنوان MAC",
|
|
"wolBroadcastAddress": "عنوان بث WoL",
|
|
"wolBroadcastAddressDesc": "بث موجه اختياري لشبكات Docker/الموجهة (مثال: 192.168.1.255). اتركه فارغًا لاستخدام 255.255.255.255.",
|
|
"folderAndAdvanced": "المجلد والمتقدم",
|
|
"showAdvancedSettings": "عرض الإعدادات المتقدمة",
|
|
"hideAdvancedSettings": "إخفاء الإعدادات المتقدمة",
|
|
"privateNotes": "ملاحظات خاصة",
|
|
"privateNotesPlaceholder": "تفاصيل حول هذا الخادم...",
|
|
"pinToTop": "تثبيت في الأعلى",
|
|
"pinToTopDesc": "إظهار هذا المضيف دائمًا في أعلى القائمة",
|
|
"portKnockingSequence": "تسلسل طرق المنفذ",
|
|
"addKnockBtn": "إضافة طرق",
|
|
"noPortKnocking": "لم يتم تكوين أي إجراء لطرق المنافذ.",
|
|
"knockPort": "منفذ الطرق",
|
|
"protocol": "البروتوكول",
|
|
"delayAfterMs": "التأخير بعد (مللي ثانية)",
|
|
"useSocks5Proxy": "استخدام وكيل SOCKS5",
|
|
"useSocks5ProxyDesc": "توجيه الاتصال عبر خادم وكيل",
|
|
"connectionOrigin": "أصل الاتصالات",
|
|
"connectionOriginDesc": "مصدر اتصال هذا المضيف. يتجاوز الإعداد الافتراضي العام لتطبيق سطح المكتب.",
|
|
"connectionOriginGuacamoleNote": "يستخدم RDP و VNC و Telnet الخادم البعيد ما لم تختار \"هذا الجهاز\"، الأمر الذي يتطلب guacd يمكن لهذا الجهاز الوصول إليه - قم بتعيين واحد في إعداد عنوان URL الخاص بـ guacd، أو لكل مضيف ضمن guacd Proxy.",
|
|
"connectionOriginDefault": "استخدم الإعدادات الافتراضية",
|
|
"connectionOriginLocal": "هذا الجهاز (الشبكة المحلية)",
|
|
"connectionOriginRemote": "خادم بعيد",
|
|
"proxyHost": "مضيف الوكيل",
|
|
"proxyPort": "منفذ الوكيل",
|
|
"proxyUsername": "اسم مستخدم الوكيل",
|
|
"proxyPassword": "كلمة مرور الوكيل",
|
|
"proxySingleMode": "وكيل فردي",
|
|
"proxyChainMode": "سلسلة الوكلاء",
|
|
"you": "أنت",
|
|
"jumpHostChainLabel": "سلسلة مضيفات القفز",
|
|
"addJumpBtn": "إضافة قفزة",
|
|
"noJumpHosts": "لم يتم تكوين أي مضيفات قفز.",
|
|
"selectAServer": "اختيار خادم...",
|
|
"sshPort": "منفذ SSH",
|
|
"authMethod": "طريقة المصادقة",
|
|
"authenticationMethod": "طريقة المصادقة",
|
|
"authenticationMethodDesc": "اختر الطريقة التي سيستخدمها Termix للتحقق من صحة اتصال SSH هذا. لن يتم تجربة الطرق الأخرى تلقائيًا.",
|
|
"storedCredential": "بيانات اعتماد مخزنة",
|
|
"selectACredential": "اختيار بيانات اعتماد...",
|
|
"vaultProfile": "ملف توقيع Vault",
|
|
"selectAVaultProfile": "اختيار ملف توقيع Vault...",
|
|
"vaultProfileHint": "تأتي الإعدادات من الملف المشترك؛ ستقوم بتسجيل الدخول إلى Vault عبر OIDC عند الاتصال. لا يتم تخزين أي أسرار.",
|
|
"vaultNewProfile": "ملف جديد",
|
|
"secretRefHint": "يمكنك لصق مرجع 1Password (op://vault/item/field) بدلاً من السر؛ يتم جلبه من مصدر السر الخاص بك عند الاتصال.",
|
|
"secretSourcesManage": "إدارة المصادر السرية",
|
|
"secretSourcesTitle": "مصادر سرية",
|
|
"secretSourcesDesc": "يقرأ برنامج إدارة كلمات المرور الخارجي Termix البيانات السرية عند الاتصال. حاليًا، نستخدم 1Password Connect (مُستضاف ذاتيًا). يتم تخزين رمز الوصول مُشفّرًا باستخدام مفتاح البيانات الخاص بك.",
|
|
"secretSourceNew": "مصدر جديد",
|
|
"secretSourceUrlLabel": "عنوان URL لخادم الاتصال",
|
|
"secretSourceTokenLabel": "رمز الوصول للاتصال",
|
|
"secretSourceTokenKeep": "اتركه فارغًا للاحتفاظ بالرمز المميز الحالي",
|
|
"secretSourceSharedLabel": "مشاركة مع جميع المستخدمين (للمسؤولين فقط؛ يتم حل المشكلة أثناء تسجيل دخولك)",
|
|
"secretSourceShared": "تمت المشاركة",
|
|
"secretSourceTest": "امتحان",
|
|
"secretSourceTestOk": "متصل — {{count}} الخزائن مرئية",
|
|
"secretSourceTestFailed": "فشل اختبار الاتصال",
|
|
"secretSourceRequired": "الاسم وعنوان URL للخادم والرمز المميز مطلوبة",
|
|
"secretSourceSaved": "تم حفظ المصدر السري",
|
|
"secretSourceDeleted": "تم حذف المصدر السري",
|
|
"vaultManageProfiles": "إدارة ملفات Vault",
|
|
"vaultAddrLabel": "عنوان Vault",
|
|
"vaultNamespaceLabel": "مساحة الاسم",
|
|
"vaultOidcMountLabel": "تثبيت مصادقة OIDC",
|
|
"vaultOidcRoleLabel": "دور OIDC",
|
|
"vaultSshMountLabel": "تثبيت أسرار SSH",
|
|
"vaultSshRoleLabel": "دور موقع SSH",
|
|
"vaultValidPrincipalsLabel": "المستخدمون المسموح بهم",
|
|
"vaultKeyTypeLabel": "نوع المفتاح المؤقت",
|
|
"vaultSharedLabel": "مشاركة مع جميع المستخدمين",
|
|
"vaultCreateProfile": "إنشاء ملف تعريف",
|
|
"vaultProfileCreated": "تم إنشاء ملف تعريف Vault",
|
|
"vaultProfileSaved": "تم حفظ ملف تعريف Vault",
|
|
"vaultProfileDeleted": "تم حذف ملف تعريف Vault",
|
|
"vaultProfileSaveFailed": "فشل حفظ ملف تعريف Vault",
|
|
"vaultProfileDeleteFailed": "فشل حذف ملف تعريف Vault",
|
|
"vaultSaveProfile": "حفظ ملف التعريف",
|
|
"vaultProfileValidationError": "الاسم وعنوان Vault ودور الموقّع SSH مطلوب",
|
|
"vaultNoProfiles": "لا توجد ملفات تعريف Vault بعد.",
|
|
"vaultSharedBadge": "مشترك",
|
|
"keyTypeLabel": "نوع المفتاح",
|
|
"keyTypeAuto": "اكتشاف تلقائي",
|
|
"keyPasteTab": "لصق",
|
|
"keyUploadTab": "رفع",
|
|
"keyFileLoaded": "تم تحميل ملف المفتاح",
|
|
"keyUploadClick": "انقر لرفع ملف .pem / .key / .ppk",
|
|
"clearKey": "مسح المفتاح",
|
|
"keySaved": "تم حفظ مفتاح SSH",
|
|
"keyReplaceNotice": "الصق مفتاحًا جديدًا أدناه لاستبداله",
|
|
"keyPassphraseSaved": "تم حفظ عبارة المرور، اكتب للتغيير",
|
|
"replaceKey": "استبدال المفتاح",
|
|
"docsLink": "عرض المستندات",
|
|
"stepcaLabel": "الخطوة ج",
|
|
"stepcaDesc": "سجّل الدخول عبر موفر الهوية الخاص بك، ودع جهة إصدار الشهادات المعتمدة (SA) التابعة لـ Step CA تُصدر شهادة SSH مؤقتة لهذا المضيف. يتم تحديد عنوان URL الخاص بجهة إصدار الشهادات المعتمدة، وبصمة الجذر، وموفر OIDC بواسطة مسؤول النظام ضمن إعدادات المسؤول.",
|
|
"authTypeStepca": "الخطوة ج",
|
|
"opksshLabel": "OPKSSH",
|
|
"opksshDesc": "تسجيل الدخول إلى هذا المضيف باستخدام مزود الهوية بدلاً من كلمة المرور أو المفتاح. يتطلب إعداد OPKSSH على الخادم.",
|
|
"warpgateLabel": "بوابة Warpgate",
|
|
"warpgateDesc": "يتصل هذا المضيف عبر وكيل SSH من Warpgate. سيتولى Termix عملية الموافقة عبر المتصفح تلقائيًا بعد المصادقة.",
|
|
"agentLabel": "وكيل SSH",
|
|
"agentDesc": "المصادقة باستخدام وكيل SSH يعمل على خادم Termix (مثل Bitwarden, 1Password, gpg-agent, KeeAgent, ssh-agent). يجب أن يكون الوكيل قيد التشغيل على الجهاز الذي يستضيف Termix.",
|
|
"agentAuthenticationDesc": "استخدم مفاتيح من وكيل SSH لمصادقة هذا الاتصال. اترك مسار المقبس فارغًا لاستخدام SSH_AUTH_SOCK.",
|
|
"agentSocketPathLabel": "مسار مقبس الوكيل",
|
|
"agentSocketPathPlaceholder": "اتركه فارغًا لاستخدام SSH_AUTH_SOCK",
|
|
"agentSocketPathHint": "اتركه فارغًا للاكتشاف التلقائي من متغير البيئة SSH_AUTH_SOCK، أو أدخل مسار مقبس مخصص (مثال: /run/user/1000/gnupg/S.gpg-agent.ssh).",
|
|
"agentIdentityLabel": "هوية الوكيل (المفتاح العام)",
|
|
"agentIdentityPlaceholder": "اترك هذا الحقل فارغًا لتجربة جميع المفاتيح من الوكيل.",
|
|
"agentIdentityHint": "ألصق مفتاحًا عامًا (مثل ssh-ed25519 AAAA...) لعرض هذا المفتاح فقط من جانب الوكيل. يُنصح بذلك عندما يمتلك الوكيل العديد من المفاتيح، لتجنب تجاوز الحد الأقصى لمحاولات المصادقة (MaxAuthTries) للخادم.",
|
|
"shareSshAuthLabel": "مشاركة مصادقة SSH",
|
|
"shareSshAuthDesc": "قم بتزويد المستلمين بنسخ مشفرة من بيانات مصادقة SSH الخاصة بهذا المضيف. مع ذلك، تظل بيانات اعتماد المستلم الشخصية هي المرجع الأساسي.",
|
|
"tailscaleDeviceSelect": "اختيار جهاز Tailscale",
|
|
"tailscaleDeviceSelectPlaceholder": "اختر جهازًا...",
|
|
"tailscaleNoApiKey": "لم يتم تكوين مفتاح API لـ Tailscale. أضف واحدًا في إعدادات المسؤول لتمكين اكتشاف الأجهزة.",
|
|
"tailscaleDocsLink": "عرض المستندات",
|
|
"tailscaleLoadingDevices": "جارٍ تحميل الأجهزة...",
|
|
"tailscaleDeviceLoadFailed": "فشل تحميل أجهزة Tailscale. يرجى التحقق من عنوان URL الخاص بواجهة برمجة التطبيقات (API) واتصال الشبكة.",
|
|
"tailscaleNoDevices": "لم يتم العثور على أجهزة في tailnet الخاص بك.",
|
|
"tailscaleDeviceAutoFill": "سيؤدي تحديد جهاز إلى تعبئة عنوان IP للمضيف تلقائيًا.",
|
|
"forceKeyboardInteractiveLabel": "فرض التفاعل عبر لوحة المفاتيح",
|
|
"forceKeyboardInteractiveShortDesc": "فرض إدخال كلمة المرور يدويًا حتى لو كانت المفاتيح موجودة",
|
|
"allowLegacyAlgorithmsLabel": "السماح بالخوارزميات القديمة",
|
|
"allowLegacyAlgorithmsDesc": "تمكين خوارزميات SSH المهملة (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) للاتصال بالأجهزة القديمة التي لا يمكن ترقيتها.",
|
|
"insecure": "غير آمن",
|
|
"terminalAppearance": "مظهر الطرفية",
|
|
"colorTheme": "نظام الألوان",
|
|
"fontFamilyLabel": "عائلة الخط",
|
|
"fontFamilyCustomOption": "مخصص...",
|
|
"fontFamilyCustomPlaceholder": "اسم الخط بالضبط، على سبيل المثال MesloLGS NF",
|
|
"fontFamilyCustomHint": "اختر خطًا مُضمّنًا، أو اختر \"مخصص\" واكتب الاسم الدقيق لخط مُثبّت مُسبقًا على نظامك (مثل MesloLGS NF أو Noto Sans Mono). لا يُمكن لبرنامج Termix تثبيت الخطوط نيابةً عنك، لذا ثبّته على نظام التشغيل أولًا.",
|
|
"fontSizeLabel": "حجم الخط",
|
|
"cursorStyleLabel": "نمط المؤشر",
|
|
"letterSpacingPx": "تباعد الأحرف (بكسل)",
|
|
"lineHeightLabel": "ارتفاع السطر",
|
|
"bellStyleLabel": "نمط الجرس",
|
|
"backspaceModeLabel": "وضع المسح الخلفي",
|
|
"cursorBlinking": "وميض المؤشر",
|
|
"cursorBlinkingDesc": "تمكين تأثير وميض المؤشر في الطرفية",
|
|
"rightClickSelectsWordLabel": "تحديد الكلمة بالنقر الأيمن",
|
|
"rightClickSelectsWordShortDesc": "تحديد الكلمة تحت المؤشر عند النقر بالزر الأيمن",
|
|
"macOptionIsMetaLabel": "مفتاح الخيار يرسل البيانات الوصفية",
|
|
"macOptionIsMetaShortDesc": "تعطيل كتابة الأحرف الخاصة (مثل @ أو |) باستخدام مفتاح Option/Alt على نظام macOS بدلاً من إرسال Meta",
|
|
"backgroundImageLabel": "رابط صورة الخلفية",
|
|
"backgroundImageDesc": "رابط اختياري لصورة خلفية الطرفية",
|
|
"backgroundImageOpacityLabel": "شفافية صورة الخلفية",
|
|
"customThemeColors": "ألوان مخصصة",
|
|
"customThemeBackground": "الخلفية",
|
|
"customThemeForeground": "المقدمة",
|
|
"customThemeCursor": "المؤشر",
|
|
"customThemeCursorAccent": "تمييز المؤشر",
|
|
"customThemeSelection": "التحديد",
|
|
"customThemeAnsiColors": "ألوان ANSI",
|
|
"customThemeBlack": "أسود",
|
|
"customThemeRed": "أحمر",
|
|
"customThemeGreen": "أخضر",
|
|
"customThemeYellow": "أصفر",
|
|
"customThemeBlue": "أزرق",
|
|
"customThemeMagenta": "ماجنتا",
|
|
"customThemeCyan": "سماوي",
|
|
"customThemeWhite": "أبيض",
|
|
"customThemeBrightBlack": "أسود ساطع",
|
|
"customThemeBrightRed": "أحمر ساطع",
|
|
"customThemeBrightGreen": "أخضر ساطع",
|
|
"customThemeBrightYellow": "أصفر ساطع",
|
|
"customThemeBrightBlue": "أزرق ساطع",
|
|
"customThemeBrightMagenta": "ماجنتا ساطع",
|
|
"customThemeBrightCyan": "سماوي ساطع",
|
|
"customThemeBrightWhite": "أبيض ساطع",
|
|
"customThemeResetTooltip": "إعادة تعيين إلى الإعدادات الافتراضية",
|
|
"savedThemesLabel": "السمات المحفوظة",
|
|
"saveAsGlobalTheme": "حفظ كقالب عام",
|
|
"saveGlobalThemeNamePrompt": "أدخل اسمًا لهذا القالب",
|
|
"saveGlobalThemeSuccess": "حفظ السمة",
|
|
"saveGlobalThemeError": "فشل حفظ السمة",
|
|
"applyGlobalThemeTooltip": "قم بتطبيق هذا القالب",
|
|
"deleteGlobalThemeTooltip": "احذف هذا القالب",
|
|
"noSavedThemes": "لم يتم حفظ أي سمات بعد",
|
|
"syntaxHighlightingLabel": "تمييز الصيغة",
|
|
"syntaxHighlightingDesc": "تلوين مخرجات الطرفية (الأخطاء، المسارات، عناوين IP، الطوابع الزمنية)",
|
|
"syntaxHighlightingCategories": "فئات التمييز",
|
|
"syntaxHighlightingCategoriesDesc": "اختر أنواع المحتوى المراد تلوينها",
|
|
"syntaxCategoryLogLevels": "مستويات السجل",
|
|
"syntaxCategoryLogLevelsDesc": "خطأ، تحذير، معلومات، تنقيح، فادح",
|
|
"syntaxCategoryPaths": "مسارات الملفات",
|
|
"syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt",
|
|
"syntaxCategoryTimestamps": "الطوابع الزمنية",
|
|
"syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15",
|
|
"syntaxCategoryIpAddresses": "عناوين IP",
|
|
"syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080",
|
|
"syntaxCategoryUrls": "عناوين URL",
|
|
"syntaxCategoryUrlsDesc": "https://example.com",
|
|
"syntaxCategoryNumbers": "أرقام معنونة",
|
|
"syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404",
|
|
"behaviorAndAdvanced": "السلوك والمتقدم",
|
|
"scrollbackBufferLabel": "مخزن التمرير المؤقت",
|
|
"scrollbackMaxLines": "الحد الأقصى لعدد الأسطر المحفوظة في السجل",
|
|
"sshAgentForwardingLabel": "توجيه وكيل SSH",
|
|
"sshAgentForwardingShortDesc": "اسمح لهذا المضيف البعيد باستخدام وكيل SSH المحلي الخاص بك للاتصالات اللاحقة. هذا غير مطلوب لمصادقة الوكيل.",
|
|
"useSSHTitleLabel": "استخدام عنوان نافذة SSH",
|
|
"useSSHTitleDesc": "تحديث عنوان التبويب من عنوان نافذة الصدفة بدلاً من اسم المضيف",
|
|
"enableAutoMosh": "تمكين Mosh التلقائي",
|
|
"enableAutoMoshDesc": "تفضيل Mosh على SSH إذا كان متاحاً",
|
|
"enableAutoTmux": "تمكين tmux التلقائي",
|
|
"enableAutoTmuxDesc": "حافظ على تشغيل shell وأي شيء يعمل بداخله أثناء انقطاع الاتصال وإعادة تشغيل المتصفح عن طريق التشغيل داخل tmux (يجب تثبيت tmux على المضيف).",
|
|
"enableSessionLogging": "تسجيل الجلسات",
|
|
"enableSessionLoggingDesc": "تسجيل مخرجات الجلسة الطرفية للمراجعة لاحقاً",
|
|
"allowSessionSharing": "السماح بمشاركة الجلسة",
|
|
"allowSessionSharingDesc": "يمكن مشاركة الجلسات المباشرة على هذا المضيف عبر رابط أو مع مستخدمين آخرين",
|
|
"enableCommandHistory": "سجل الأوامر",
|
|
"enableCommandHistoryDesc": "تسجيل الأوامر المنفذة في هذه الطرفية للسجل والإكمال التلقائي",
|
|
"localEchoLabel": "صدى محلي",
|
|
"localEchoDesc": "توقع ضغطات المفاتيح الآمنة القابلة للطباعة محليًا على الاتصالات البطيئة. لا يتم عرض مطالبات كلمة المرور أو مدخلات التحكم على الشاشة.",
|
|
"localEchoDefault": "استخدم الإعدادات العامة",
|
|
"localEchoOff": "عن",
|
|
"localEchoAuto": "معادلة",
|
|
"localEchoOn": "متصل دائمًا",
|
|
"linkClickBehaviorLabel": "سلوك النقر على الرابط",
|
|
"linkClickBehaviorDesc": "يتحكم في ما يحدث عند النقر على رابط في الطرفية. استخدم 'افتراضي' لاتباع إعداد التطبيق العام.",
|
|
"linkClickBehaviorDefault": "افتراضي (اتباع إعداد التطبيق)",
|
|
"linkClickBehaviorConfirm": "إظهار نافذة منبثقة للفتح أو النسخ",
|
|
"linkClickBehaviorDirect": "فتح مباشرةً",
|
|
"sudoPasswordAutoFillLabel": "الملء التلقائي لكلمة مرور sudo",
|
|
"sudoPasswordAutoFillShortDesc": "توفير كلمة مرور sudo تلقائياً عند المطالبة",
|
|
"sudoPasswordAutoFillDesc": "تخزين كلمة مرور sudo لتشغيل مقاييس المضيف ومطالبات الطرفية وغيرها من الأوامر المميزة تلقائياً.",
|
|
"sudoPasswordLabel": "كلمة مرور sudo",
|
|
"sudoPasswordSaved": "تم حفظ كلمة المرور، اكتب لتغييرها",
|
|
"environmentVariablesLabel": "متغيرات البيئة",
|
|
"addVariableBtn": "إضافة متغير",
|
|
"noEnvVars": "لم يتم تكوين أي متغيرات البيئة.",
|
|
"fastScrollModifierLabel": "مفتاح التمرير السريع",
|
|
"fastScrollSensitivityLabel": "حساسية التمرير السريع",
|
|
"moshCommandLabel": "أمر Mosh",
|
|
"startupSnippetLabel": "مقتطف بدء التشغيل",
|
|
"keepaliveIntervalLabel": "فترة إبقاء الاتصال (بالثواني)",
|
|
"maxKeepaliveMisses": "الحد الأقصى لمرات فقدان إبقاء الاتصال",
|
|
"tunnelSettings": "إعدادات النفق",
|
|
"enableTunneling": "تمكين الأنفاق",
|
|
"enableTunnelingDesc": "تمكين وظيفة نفق SSH لهذا المضيف",
|
|
"serverTunnelsSection": "أنفاق الخادم",
|
|
"addTunnelBtn": "إضافة نفق",
|
|
"noTunnelsConfigured": "لم يتم تكوين أي أنفاق.",
|
|
"tunnelLabel": "نفق {{number}}",
|
|
"tunnelType": "نوع النفق",
|
|
"tunnelModeLocalDesc": "توجيه منفذ محلي إلى منفذ على الخادم البعيد (أو مضيف يمكن الوصول إليه منه).",
|
|
"tunnelModeRemoteDesc": "إعادة توجيه منفذ على الخادم البعيد إلى منفذ محلي على جهازك.",
|
|
"tunnelModeDynamicDesc": "إنشاء وكيل SOCKS5 على منفذ محلي لتوجيه المنافذ الديناميكي.",
|
|
"sameHost": "هذا المضيف (نفق مباشر)",
|
|
"endpointHost": "مضيف نقطة النهاية",
|
|
"endpointHostPlaceholder": "نفس المضيف، مضيف SSH، أو مضيف/IP يمكن الوصول إليه",
|
|
"endpointPort": "منفذ نقطة النهاية",
|
|
"bindHost": "مضيف الربط",
|
|
"sourcePort": "منفذ المصدر",
|
|
"maxRetries": "الحد الأقصى لإعادة المحاولات",
|
|
"retryIntervalS": "فترة إعادة المحاولة (بالثواني)",
|
|
"autoStartLabel": "تشغيل تلقائي",
|
|
"autoStartDesc": "الاتصال بهذا النفق تلقائياً عند تحميل المضيف",
|
|
"tunnelConnecting": "جارٍ توصيل النفق...",
|
|
"tunnelDisconnected": "تم قطع اتصال النفق",
|
|
"failedToConnectTunnel": "فشل الاتصال",
|
|
"failedToDisconnectTunnel": "فشل قطع الاتصال",
|
|
"dockerIntegration": "تكامل Docker",
|
|
"enableDockerMonitor": "تمكين Docker",
|
|
"enableDockerMonitorDesc": "مراقبة وإدارة الحاويات على هذا المضيف عبر Docker",
|
|
"containerRuntime": "بيئة تشغيل الحاويات",
|
|
"containerRuntimeDesc": "اختر واجهة سطر الأوامر المستخدمة لإدارة الحاويات على هذا المضيف",
|
|
"containerRuntimeDocker": "Docker",
|
|
"containerRuntimePodman": "Podman",
|
|
"enableTmuxMonitor": "تمكين مراقب Tmux",
|
|
"enableTmuxMonitorDesc": "إظهار هذا المضيف في مراقب Tmux وإضافة إجراءات tmux الخاصة به إلى الشريط الجانبي",
|
|
"enableTerminalToolbar": "تفعيل شريط أدوات الطرفية",
|
|
"enableTerminalToolbarDesc": "اعرض شريط أدوات سريع الوصول مثبتًا على الطرفية النشطة لأدوات هذا المضيف وإحصائياته المباشرة.",
|
|
"connectionToolbar": "شريط أدوات الاتصال",
|
|
"showConnectionToolbar": "إظهار شريط أدوات الاتصال",
|
|
"showConnectionToolbarDesc": "يمكنك إظهار شريط الأدوات في جلسات SSH وRDP وVNC وTelnet الخاصة بهذا المضيف. كما يمكنك إخفاؤه مؤقتًا من شريط الأدوات نفسه.",
|
|
"enableAiAssistant": "تفعيل مساعد الذكاء الاصطناعي",
|
|
"enableAiAssistantDesc": "اسمح للمساعد الذكي بالمساعدة في طرفية هذا المضيف. هذه الميزة معطلة افتراضيًا، ولا يزال يتعين تفعيلها لحسابك.",
|
|
"tabProxmox": "Proxmox",
|
|
"proxmoxIntegration": "تكامل Proxmox",
|
|
"enableProxmox": "تمكين Proxmox",
|
|
"enableProxmoxDesc": "تعليم هذا المضيف كعقدة Proxmox. يُمكّن اكتشاف الضيوف واستيرادهم مباشرة من هذا المضيف.",
|
|
"proxmoxDefaultAuthType": "نوع المصادقة الافتراضي",
|
|
"proxmoxDefaultAuthTypeDesc": "طريقة المصادقة المطبقة على المضيفين الضيوف المستوردين. اختر نوع المصادقة الذي يتوافق مع طريقة اتصالك بالضيوف.",
|
|
"authTypePassword": "كلمة مرور",
|
|
"authTypeKey": "مفتاح SSH",
|
|
"authTypeCredential": "بيانات اعتماد",
|
|
"authTypeOpkssh": "OPKSSH",
|
|
"authTypeNone": "بلا",
|
|
"proxmoxDefaultCredential": "بيانات الاعتماد الافتراضية",
|
|
"proxmoxDefaultCredentialDesc": "بيانات الاعتماد المُستخدمة للأجهزة الضيفة المستوردة عند ضبط نوع المصادقة على 'بيانات الاعتماد'.",
|
|
"proxmoxWindowsDetection": "اكتشاف Windows / RDP",
|
|
"proxmoxWindowsDetectionDesc": "أنماط الأسماء مفصولة بفواصل تُشغّل RDP بدلاً من SSH (غير حسّاسة لحالة الأحرف)",
|
|
"proxmoxDockerDetection": "اكتشاف Docker",
|
|
"proxmoxDockerDetectionDesc": "أنماط الأسماء مفصولة بفواصل تُمكّن Docker للأجهزة الضيفة المطابقة",
|
|
"proxmoxPreferredRanges": "نطاقات IP المُفضّلة",
|
|
"proxmoxPreferredRangesDesc": "بادئات مفصولة بفواصل بترتيب الأولوية لاختيار IP عندما يكون للجهاز الضيف واجهات متعددة",
|
|
"proxmoxAutoSync": "مزامنة تلقائية للأجهزة الضيفة",
|
|
"proxmoxAutoSyncDesc": "اكتشاف عقدة Proxmox هذه بشكل دوري وإنشاء أو تحديث الأجهزة الضيفة المستوردة أثناء فتح جلستك.",
|
|
"proxmoxSyncInterval": "فترة المزامنة (بالدقائق)",
|
|
"proxmoxSyncIntervalDesc": "الحد الأدنى 5 دقائق. يتخطّى المجدول جلسات المستخدم المقفلة.",
|
|
"proxmoxMarkMissing": "تعليم الأجهزة الضيفة المفقودة",
|
|
"proxmoxMarkMissingDesc": "أضف وسم proxmox-missing عندما يختفي جهاز ضيف تم استيراده مسبقاً بدلاً من حذفه.",
|
|
"proxmoxLastSync": "آخر مزامنة",
|
|
"proxmoxLastSyncNever": "لم تتم المزامنة بعد",
|
|
"proxmoxLastSyncNoResult": "لا توجد تفاصيل للنتائج",
|
|
"proxmoxLastSyncSummary": "{{created}} مُنشأ، {{updated}} مُحدَّث، {{markedMissing}} مفقود، {{skipped}} مُتخطّى",
|
|
"proxmoxLastSyncStatus": {
|
|
"success": "نجاح",
|
|
"error": "فشل",
|
|
"pending": "قيد الانتظار"
|
|
},
|
|
"proxmoxDiscoverAction": "اكتشاف واستيراد أجهزة Proxmox الضيفة",
|
|
"proxmoxImportTitle": "استيراد من Proxmox",
|
|
"proxmoxSelectHost": "اختر مضيف Proxmox…",
|
|
"proxmoxDiscover": "اكتشف",
|
|
"proxmoxDiscovering": "جارٍ الاكتشاف…",
|
|
"proxmoxDiscoverGuests": "اكتشف الأجهزة الضيفة",
|
|
"proxmoxGuestsSelected_one": "{{count}} جهاز ضيف — {{selected}} مُحدد",
|
|
"proxmoxGuestsSelected_other": "{{count}} أجهزة ضيفة — {{selected}} مُحددة",
|
|
"proxmoxSelectAll": "تحديد الكل",
|
|
"proxmoxDeselectAll": "إلغاء تحديد الكل",
|
|
"proxmoxNoGuests": "لم يتم العثور على أجهزة ضيفة على عقدة Proxmox هذه.",
|
|
"proxmoxImportButton_one": "استيراد {{count}} مضيف",
|
|
"proxmoxImportButton_other": "استيراد {{count}} مضيفين",
|
|
"proxmoxResultImported": "{{count}} تم استيرادها",
|
|
"proxmoxResultUpdated": "{{count}} تم تحديثها",
|
|
"proxmoxResultFailed": "{{count}} فشلت",
|
|
"proxmoxResultSkippedNoIp": "تم تخطي {{count}} (لم يتم العثور على عنوان IP)",
|
|
"proxmoxImportComplete": "اكتمل استيراد Proxmox: {{summary}}",
|
|
"proxmoxDiscoveryFailed": "فشل الاكتشاف",
|
|
"proxmoxImportFailed": "فشل الاستيراد",
|
|
"enableProxmoxStats": "تفعيل إحصائيات Proxmox",
|
|
"enableProxmoxStatsDesc": "اعرض علامة تبويب إحصائيات Proxmox لهذا المضيف مع إحصائيات العقدة والضيف والتخزين والمجموعة التي تم جمعها عبر SSH.",
|
|
"proxmoxStatsPollInterval": "فاصل الاستطلاع (بالثواني)",
|
|
"proxmoxStatsPollIntervalDesc": "الحد الأدنى 15 ثانية. عدد مرات تحديث إحصائيات عقدة Proxmox.",
|
|
"proxmoxStatsNodeOverride": "تجاوز اسم العقدة",
|
|
"proxmoxStatsNodeOverrideDesc": "تجاوز الكشف التلقائي عن اسم عقدة Proxmox (يتم الكشف عنه عبر اسم المضيف افتراضيًا).",
|
|
"proxmoxStatsNodeOverridePlaceholder": "تم اكتشافه تلقائيًا من اسم المضيف",
|
|
"proxmoxStatsUrlCopied": "تم نسخ رابط إحصائيات Proxmox إلى الحافظة",
|
|
"copyProxmoxStatsUrlAction": "انسخ رابط إحصائيات Proxmox",
|
|
"enableFileManagerMonitor": "تمكين مدير الملفات",
|
|
"enableFileManagerMonitorDesc": "استعراض وإدارة الملفات على هذا المضيف عبر SFTP",
|
|
"scpLegacyLabel": "وضع SCP القديم",
|
|
"scpLegacyDesc": "استخدم وضع النقل القديم للملفات للخوادم التي لا تدعم النظام الفرعي SFTP (مثل خوادم SSH المدمجة أو ذات الإمكانيات المحدودة).",
|
|
"defaultPathLabel": "المسار الافتراضي",
|
|
"fileManagerPathHint": "الدليل الذي سيتم فتحه عند تشغيل مدير الملفات لهذا المضيف.",
|
|
"statusChecksLabel": "فحوصات الحالة",
|
|
"enableStatusChecks": "تمكين فحوصات الحالة",
|
|
"enableStatusChecksDesc": "إرسال ping دوريًا لهذا المضيف للتحقق من توفره",
|
|
"useGlobalInterval": "استخدام الفاصل الزمني العام",
|
|
"useGlobalIntervalDesc": "تجاوز باستخدام فترة فحص الحالة على مستوى الخادم",
|
|
"checkIntervalS": "فترة الفحص (ثانية)",
|
|
"checkIntervalDesc": "عدد الثواني بين كل ping للتحقق من الاتصال",
|
|
"metricsCollectionLabel": "تجميع المقاييس",
|
|
"enableMetricsLabel": "تمكين المقاييس",
|
|
"enableMetricsDesc": "تجميع مقاييس وحدة المعالجة المركزية والذاكرة والقرص وغيرها من هذا المضيف",
|
|
"useGlobalMetrics": "استخدام الفاصل الزمني العام",
|
|
"useGlobalMetricsDesc": "تجاوز باستخدام فترة المقاييس على مستوى الخادم",
|
|
"metricsIntervalS": "فترة المقاييس (ثانية)",
|
|
"metricsIntervalDesc2": "الثواني بين لقطات المقاييس",
|
|
"excludedMountsLabel": "حوامل مستثناة",
|
|
"monitoredMountsLabel": "مسارات مراقبة مخصصة",
|
|
"monitoredMountsDesc": "أضف المسارات التي لا يتم عرضها كعمليات ربط منفصلة، بما في ذلك مسارات Home Assistant المرتبطة مثل /config.",
|
|
"monitoredMountPathPlaceholder": "المسار (/config، /mnt/data)",
|
|
"monitoredMountLabelPlaceholder": "ملصق (اختياري)",
|
|
"addMonitoredMount": "إضافة مسار",
|
|
"excludedMountsDesc": "إخفاء نقاط التحميل المحددة أو أنواع أنظمة الملفات (مثل nfs و cifs) من استخدام القرص والتنبيهات لهذا المضيف.",
|
|
"excludedMountsPlaceholder": "مسار التثبيت (/mnt/nas) أو نوع نظام الملفات (nfs، cifs)",
|
|
"excludedMountsEmpty": "لم يتم استبعاد أي وحدات تخزين. يتم عرض جميع أنظمة الملفات المكتشفة.",
|
|
"addExcludedMount": "يضيف",
|
|
"visibleWidgets": "الأدوات المرئية",
|
|
"widgetsMovedToHostMetrics": "تتم الآن إضافة البطاقات وترتيبها وتغيير حجمها مباشرةً في علامة تبويب مقاييس المضيف. افتح مقاييس المضيف لهذا المضيف واستخدم تخصيص لاختيار البطاقات التي ستظهر.",
|
|
"cpuUsageLabel": "استخدام وحدة المعالجة المركزية",
|
|
"cpuUsageDesc": "نسبة وحدة المعالجة المركزية، متوسطات الحمل، رسم بياني شريطي صغير",
|
|
"memoryLabel": "استخدام الذاكرة",
|
|
"memoryDesc": "استخدام RAM، الذاكرة المؤقتة للتبادل (swap)، المحفوظة مؤقتًا",
|
|
"storageLabel": "استخدام القرص",
|
|
"storageDesc": "استخدام القرص لكل نقطة تركيب",
|
|
"networkLabel": "واجهات الشبكة",
|
|
"networkDesc": "قائمة الواجهات وعرض النطاق",
|
|
"uptimeLabel": "مدة التشغيل",
|
|
"uptimeDesc": "مدة تشغيل النظام ووقت الإقلاع",
|
|
"systemInfoLabel": "معلومات النظام",
|
|
"systemInfoDesc": "نظام التشغيل، النواة، اسم المضيف، المعمارية",
|
|
"recentLoginsLabel": "عمليات تسجيل الدخول الأخيرة",
|
|
"recentLoginsDesc": "أحداث تسجيل الدخول الناجحة والفاشلة",
|
|
"topProcessesLabel": "أهم العمليات",
|
|
"topProcessesDesc": "PID، نسبة المعالج، نسبة الذاكرة، الأمر",
|
|
"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": "فشل حفظ بيانات الاعتماد",
|
|
"credentialNameRequired": "الرجاء إدخال اسم لبيانات الاعتماد",
|
|
"credentialAuthRequired": "أضف كلمة مرور أو مفتاح SSH أو كليهما",
|
|
"createCredentialFromHostBtn": "إنشاء بيانات اعتماد",
|
|
"createCredentialFromHostTitle": "إنشاء بيانات اعتماد من المضيف",
|
|
"createCredentialFromHostDesc": "قم بإنشاء إدخال بيانات اعتماد قابل لإعادة الاستخدام والمشاركة، معبأ مسبقًا باسم المستخدم وكلمة المرور و/أو مفتاح SSH الحالي لهذا المضيف.",
|
|
"backToHosts": "العودة إلى المضيفين",
|
|
"pinned": "مثبّت",
|
|
"noHostsFound": "لم يتم العثور على مضيفين",
|
|
"tryDifferentTerm": "جرّب مصطلحًا مختلفًا",
|
|
"addFirstHost": "أضِف مضيفك الأول للبدء",
|
|
"noCredentialsFound": "لم يتم العثور على بيانات اعتماد",
|
|
"addCredentialBtn": "إضافة بيانات اعتماد",
|
|
"updateCredentialBtn": "تحديث بيانات اعتماد",
|
|
"editCredentialAction": "تعديل بيانات الاعتماد",
|
|
"backToHost": "العودة إلى المضيف",
|
|
"saveCredentialAsNewBtn": "حفظ كجديد",
|
|
"saveCredentialAsNewDesc": "يُنشئ بيانات اعتماد جديدة تتضمن هذه التغييرات ويُخصصها لهذا المضيف. وتبقى بيانات الاعتماد الأصلية دون تغيير.",
|
|
"credentialSavedAsNew": "تم حفظها كبيانات اعتماد جديدة",
|
|
"failedToSaveCredentialAsNew": "فشل الحفظ كبيانات اعتماد جديدة",
|
|
"features": "الميزات",
|
|
"noFolder": "(بلا مجلد)",
|
|
"deleteSelected": "حذف",
|
|
"exitSelection": "إنهاء التحديد",
|
|
"importSkip": "استيراد (تخطّي الموجود)",
|
|
"importOverwrite": "استيراد (استبدال)",
|
|
"collapseBtn": "طي",
|
|
"importExportBtn": "استيراد / تصدير",
|
|
"hostStatusesRefreshed": "تم تحديث حالات المضيفين",
|
|
"failedToRefreshHosts": "فشل تحديث المضيفين",
|
|
"movedHostTo": "تم نقل {{host}} إلى \"{{folder}}\"",
|
|
"failedToMoveHost": "فشل نقل المضيف",
|
|
"deletedFolder": "تم حذف المجلد \"{{name}}\"",
|
|
"failedToDeleteFolder": "فشل حذف المجلد",
|
|
"deleteAllInFolder": "حذف جميع المضيفين في \"{{name}}\"؟ لا يمكن التراجع عن هذا.",
|
|
"folderPickerPlaceholder": "بلا مجلد",
|
|
"folderPickerSearch": "ابحث أو أنشئ (استخدم / للمجلدات الفرعية)...",
|
|
"folderPickerNone": "بلا مجلد",
|
|
"folderPickerCreate": "إنشاء \"{{path}}\"",
|
|
"folderPickerEmpty": "لا توجد مجلدات مطابقة",
|
|
"parentHost": "المضيف الرئيسي",
|
|
"useFolderInstead": "استخدم المجلد بدلاً من ذلك",
|
|
"useParentHostInstead": "استخدم المضيف الرئيسي بدلاً من ذلك",
|
|
"parentHostPickerPlaceholder": "لا يوجد مضيف أب",
|
|
"parentHostPickerSearch": "ابحث عن المضيفين...",
|
|
"parentHostPickerNone": "لا يوجد مضيف أب",
|
|
"parentHostPickerEmpty": "لا توجد مضيفات مطابقة",
|
|
"collapseSubHosts": "طي المضيفين الفرعيين",
|
|
"expandSubHosts": "توسيع المضيفين الفرعيين",
|
|
"cannotNestUnderDescendant": "لا يمكن تضمين مضيف ضمن مضيف فرعي خاص به",
|
|
"movedToParent": "تم نقل المضيف (المضيفين) {{count}} إلى \"{{parent}}\"",
|
|
"newFolder": "مجلد جديد",
|
|
"createFolderTitle": "إنشاء مجلد",
|
|
"editFolderTitle": "تعديل المجلد",
|
|
"folderDialogDescription": "اختر اسمًا ولونًا وأيقونة. استخدم / لتداخل المجلدات.",
|
|
"folderNameLabel": "اسم المجلد",
|
|
"folderNamePlaceholder": "مثال: إنتاج/ويب",
|
|
"folderNestingHint": "استخدم / لفصل المستويات وإنشاء مجلدات متداخلة.",
|
|
"folderNameDuplicate": "يوجد مجلد بهذا الاسم هنا بالفعل.",
|
|
"folderColor": "لون",
|
|
"folderIcon": "أيقونة",
|
|
"folderCredential": "بيانات الاعتماد",
|
|
"folderCredentialNone": "لم يتم تخصيص أي بيانات اعتماد",
|
|
"folderCredentialHint": "سترث الأجهزة المضيفة الموجودة في هذا المجلد والتي تستخدم مصادقة \"بيانات الاعتماد المخزنة\" دون تحديد بيانات الاعتماد الخاصة بها هذه البيانات.",
|
|
"folderPreview": "معاينة",
|
|
"folderNameFallback": "مجلد بدون عنوان",
|
|
"createFolderButton": "إنشاء مجلد",
|
|
"saveFolderButton": "حفظ المجلد",
|
|
"cancel": "إلغاء",
|
|
"iconSearchPlaceholder": "بحث عن أيقونات...",
|
|
"openAllSessions": "فتح جميع الجلسات",
|
|
"editFolder": "تعديل المجلد",
|
|
"deleteFolder": "حذف المجلد",
|
|
"selectFolder": "حدد جميع المضيفين في المجلد",
|
|
"deselectFolder": "قم بإلغاء تحديد جميع المضيفين في المجلد",
|
|
"folderSaved": "تم حفظ المجلد",
|
|
"failedToSaveFolder": "فشل حفظ المجلد",
|
|
"folderDeleted": "تم حذف المجلد \"{{name}}\"",
|
|
"deleteFolderConfirm": "حذف \"{{name}}\" ومضيفيه {{count}}؟ لا يمكن التراجع عن هذا.",
|
|
"failedToMoveHosts": "فشل نقل المضيفين",
|
|
"failedToReorder": "فشل إعادة الطلب",
|
|
"expandAll": "توسيع جميع المجلدات",
|
|
"collapseAll": "طي جميع المجلدات",
|
|
"moreActions": "المزيد",
|
|
"groupBy": "تجميع حسب",
|
|
"GroupByFolder": "المجلد",
|
|
"GroupByTag": "الوسم",
|
|
"GroupByStatus": "الحالة",
|
|
"GroupByProtocol": "البروتوكول",
|
|
"GroupByAuth": "نوع المصادقة",
|
|
"groupUngrouped": "غير مجمعة",
|
|
"customizeSidebar": "تخصيص الشريط الجانبي",
|
|
"customizeSidebarDescription": "اختر كيف تبدو قائمة المضيفين وكيف تتصرف.",
|
|
"customizeDensityTitle": "كثافة",
|
|
"customizeBehaviorTitle": "سلوك",
|
|
"customizeSortHint": "تتوفر خيارات ترتيب الفرز والتجميع في قوائم الفرز والتجميع الموجودة في شريط الأدوات.",
|
|
"densityComfortableDesc": "مزيد من التفاصيل لكل مضيف: العنوان، والوسوم، واستخدام الموارد.",
|
|
"densityCompactDesc": "سطر واحد لكل مضيف، للقوائم الأطول.",
|
|
"display": "عرض",
|
|
"displayDensity": "كثافة",
|
|
"displayDensityComfortable": "مريح",
|
|
"displayDensityCompact": "صغير الحجم",
|
|
"displayShowTags": "عرض العلامات",
|
|
"displayTrayOnClick": "فتح الإجراءات عند النقر (بدلاً من التمرير)",
|
|
"actionsVisibility": "عرض إجراءات المضيف",
|
|
"actionsVisibilityDesc": "اختر متى تتوسع إجراءات المضيف. حدد \"انقر\" لاستعادة سلوك النقر للتوسيع السابق.",
|
|
"actionsAlways": "مرئي دائمًا",
|
|
"actionsOnly": "الاتصال فقط، والباقي عند النقر",
|
|
"actionsHover": "عرض عند تمرير المؤشر",
|
|
"actionsClick": "انقر للتوسيع/الطي",
|
|
"openOnDoubleClick": "افتح بالنقر المزدوج",
|
|
"openOnDoubleClickDesc": "يتطلب فتح جلسة المضيف نقرتين بدلاً من نقرة واحدة",
|
|
"deletedHost": "تم حذف {{name}}",
|
|
"copiedToClipboard": "تم النسخ إلى الحافظة",
|
|
"terminalUrlCopied": "تم نسخ رابط الطرفية",
|
|
"fileManagerUrlCopied": "تم نسخ رابط مدير الملفات",
|
|
"tunnelUrlCopied": "تم نسخ رابط النفق",
|
|
"dockerUrlCopied": "تم نسخ رابط Docker",
|
|
"hostMetricsUrlCopied": "تم نسخ رابط مقاييس المضيف",
|
|
"tmuxMonitorUrlCopied": "تم نسخ رابط Tmux Monitor",
|
|
"rdpUrlCopied": "تم نسخ رابط RDP",
|
|
"openNativeRdp": "افتح في سطح المكتب البعيد لنظام التشغيل Windows",
|
|
"nativeRdpOpened": "تم فتحه في سطح المكتب البعيد لنظام التشغيل Windows",
|
|
"nativeRdpFailed": "فشل فتح سطح المكتب البعيد لنظام التشغيل Windows",
|
|
"vncUrlCopied": "تم نسخ رابط VNC",
|
|
"telnetUrlCopied": "تم نسخ رابط Telnet",
|
|
"remoteDesktopUrlCopied": "تم نسخ رابط سطح المكتب البعيد",
|
|
"expandActions": "توسيع الإجراءات",
|
|
"collapseActions": "طي الإجراءات",
|
|
"wakeOnLanAction": "إيقاظ عبر الشبكة",
|
|
"wakeOnLanSuccess": "تم إرسال حزمة سحرية إلى {{name}}",
|
|
"wakeOnLanError": "فشل إرسال الحزمة السحرية",
|
|
"cloneHostAction": "استنساخ المضيف",
|
|
"copyAddress": "نسخ العنوان",
|
|
"copyLink": "نسخ الرابط",
|
|
"copyTerminalUrlAction": "نسخ رابط الطرفية",
|
|
"copyFileManagerUrlAction": "نسخ رابط مدير الملفات",
|
|
"copyTunnelUrlAction": "نسخ رابط النفق",
|
|
"copyDockerUrlAction": "نسخ رابط Docker",
|
|
"copyHostMetricsUrlAction": "نسخ رابط مقاييس المضيف",
|
|
"copyTmuxMonitorUrlAction": "نسخ رابط Tmux Monitor",
|
|
"copyRdpUrlAction": "نسخ رابط RDP",
|
|
"copyVncUrlAction": "نسخ رابط VNC",
|
|
"copyTelnetUrlAction": "نسخ رابط Telnet",
|
|
"copyRemoteDesktopUrlAction": "نسخ رابط سطح المكتب البعيد",
|
|
"deleteCredentialConfirm": "هل تريد حذف بيانات الاعتماد \"{{name}}\"؟",
|
|
"deletedCredential": "تم حذف {{name}}",
|
|
"deleteHostsConfirm": "هل تريد حذف {{count}} مضيف{{plural}}؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"movedToRoot": "تم النقل إلى الجذر",
|
|
"enableTerminalFeature": "تفعيل الطرفية",
|
|
"disableTerminalFeature": "تعطيل الطرفية",
|
|
"enableFilesFeature": "تفعيل الملفات",
|
|
"disableFilesFeature": "تعطيل الملفات",
|
|
"enableTunnelsFeature": "تفعيل الأنفاق",
|
|
"disableTunnelsFeature": "تعطيل الأنفاق",
|
|
"enableDockerFeature": "تفعيل Docker",
|
|
"disableDockerFeature": "تعطيل Docker",
|
|
"enableProxmoxFeature": "تفعيل Proxmox",
|
|
"disableProxmoxFeature": "تعطيل Proxmox",
|
|
"addTagsPlaceholder": "إضافة علامات...",
|
|
"authDetails": "تفاصيل المصادقة",
|
|
"credType": "النوع",
|
|
"generateKeyPairDesc": "إنشاء زوج مفاتيح جديد، سيتم ملء كل من المفتاح الخاص والعام تلقائياً.",
|
|
"generatingKey": "جارٍ التوليد...",
|
|
"generateLabel": "توليد {{label}}",
|
|
"uploadFileBtn": "رفع ملف",
|
|
"keyPassphraseOptional": "عبارة مرور المفتاح (اختياري)",
|
|
"sshPublicKeyOptional": "مفتاح SSH العام (اختياري)",
|
|
"publicKeyGenerated": "تم إنشاء المفتاح العام",
|
|
"failedToGeneratePublicKey": "فشل اشتقاق المفتاح العام",
|
|
"publicKeyCopied": "تم نسخ المفتاح العام",
|
|
"keyPairGenerated": "تم إنشاء زوج مفاتيح {{label}}",
|
|
"failedToGenerateKeyPair": "فشل إنشاء زوج المفاتيح",
|
|
"searchHostsPlaceholder": "البحث عن المضيفين والعناوين والعلامات...",
|
|
"refreshBtn": "تحديث",
|
|
"addTag": "إضافة علامات...",
|
|
"deleteConfirmBtn": "حذف",
|
|
"tunnelRequirementsText": "يجب أن يحتوي خادم SSH على الإعدادات GatewayPorts yes و AllowTcpForwarding yes و PermitRootLogin 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": "الخروج من التحديد",
|
|
"addHostBtn2": "إضافة مضيف",
|
|
"addCredentialBtn2": "إضافة بيانات اعتماد",
|
|
"checkingHostStatuses": "جارٍ التحقق من حالات المضيفين...",
|
|
"pinnedSection": "مثبت",
|
|
"hostsExported": "تم تصدير المضيفين بنجاح",
|
|
"export": {
|
|
"menuItem": "يصدّر...",
|
|
"title": "مضيفات التصدير",
|
|
"scope": "نِطَاق",
|
|
"scopeAll": "الجميع",
|
|
"scopeSelected": "مختار",
|
|
"searchHosts": "ابحث عن المضيفين...",
|
|
"include": "يشمل",
|
|
"groupConnection": "اتصال",
|
|
"groupCredentials": "أوراق اعتماد",
|
|
"groupNotes": "ملحوظات",
|
|
"groupTags": "العلامات والدبابيس",
|
|
"groupTunnels": "الأنفاق",
|
|
"groupJumpHosts": "مضيفو القفز",
|
|
"groupQuickActions": "إجراءات سريعة",
|
|
"groupFeatureFlags": "ميزات مميزة",
|
|
"groupAdvanced": "الإعدادات المتقدمة",
|
|
"preview": "معاينة",
|
|
"moreHosts": "... {{count}} المزيد من المضيفين",
|
|
"summary": "{{selected}} من {{total}} مضيف",
|
|
"credentialsIncluded": "تضمنت المؤهلات",
|
|
"credentialsExcluded": "تم استبعاد بيانات الاعتماد",
|
|
"noneSelected": "لم يتم تحديد أي مضيفين",
|
|
"cancel": "يلغي",
|
|
"confirm": "يصدّر",
|
|
"fetchFailed": "فشل تحميل المضيفين للتصدير",
|
|
"bulkButton": "يصدّر"
|
|
},
|
|
"sampleDownloaded": "تم تنزيل الملف النموذجي",
|
|
"failedToDeleteCredential2": "فشل حذف بيانات الاعتماد",
|
|
"noFolderOption": "(بدون مجلد)",
|
|
"nSelected": "تم تحديد {{count}}",
|
|
"featuresMenu": "الميزات",
|
|
"moveMenu": "نقل",
|
|
"connectSelected": "اتصال",
|
|
"cancelSelection": "إلغاء",
|
|
"deletedCount": "تم حذف {{count}} مضيفين",
|
|
"failedToDeleteCount": "فشل حذف {{count}} مضيفين",
|
|
"duplicatedHost": "تم نسخ \"{{name}}\"",
|
|
"failedToDuplicateHost": "فشل نسخ المضيف",
|
|
"updatedCount": "تم تحديث {{count}} مضيف",
|
|
"friendlyNameLabel": "الاسم المألوف",
|
|
"descriptionLabel": "الوصف",
|
|
"loadingHost": "جارٍ تحميل المضيف...",
|
|
"loadingHosts": "جارٍ تحميل المضيفين...",
|
|
"loadingCredentials": "جارٍ تحميل بيانات الاعتماد...",
|
|
"noHostsYet": "لا يوجد مضيفون بعد",
|
|
"noHostsYetHint": "أضف خادمًا لفتح المحطات الطرفية، وتصفح الملفات، وعرض المقاييس.",
|
|
"noHostsMatchSearch": "لا يوجد مضيفون يطابقون بحثك",
|
|
"hostNotFound": "المضيف غير موجود",
|
|
"searchHosts": "ابحث عن مضيفين...",
|
|
"sortHosts": "ترتيب المضيفين",
|
|
"sortDefault": "الترتيب الافتراضي",
|
|
"sortNameAsc": "الاسم (أ → ي)",
|
|
"sortNameDesc": "الاسم (ي → أ)",
|
|
"sortIpAsc": "عنوان IP (تصاعدي)",
|
|
"sortIpDesc": "عنوان IP (تنازلي)",
|
|
"sortOnlineFirst": "المتصل أولاً",
|
|
"sortOfflineFirst": "غير المتصل أولاً",
|
|
"sortManual": "يدوي (اسحب لإعادة الترتيب)",
|
|
"sortPinnedFirst": "المثبت أولاً",
|
|
"filterHosts": "تصفية المضيفين",
|
|
"filterClearAll": "مسح التصفية",
|
|
"filterStatusGroup": "الحالة",
|
|
"filterOnline": "متصل",
|
|
"filterOffline": "غير متصل",
|
|
"filterPinned": "مثبت",
|
|
"filterAuthGroup": "نوع المصادقة",
|
|
"filterAuthPassword": "كلمة المرور",
|
|
"filterAuthKey": "مفتاح SSH",
|
|
"filterAuthCredential": "بيانات الاعتماد",
|
|
"filterAuthNone": "بلا",
|
|
"filterAuthOpkssh": "OPKSSH",
|
|
"filterAuthStepca": "الخطوة ج",
|
|
"filterProtocolGroup": "البروتوكول",
|
|
"filterProtocolSsh": "SSH",
|
|
"filterProtocolRdp": "RDP",
|
|
"filterProtocolVnc": "VNC",
|
|
"filterProtocolTelnet": "Telnet",
|
|
"filterFeaturesGroup": "الميزات",
|
|
"filterFeatureTerminal": "الطرفية",
|
|
"filterFeatureFileManager": "مدير الملفات",
|
|
"filterFeatureTunnel": "نفق",
|
|
"filterFeatureDocker": "Docker",
|
|
"filterTagsGroup": "الوسوم",
|
|
"connectRdp": "RDP",
|
|
"connectVnc": "VNC",
|
|
"connectTelnet": "تيلنت",
|
|
"editHostAction": "تعديل المضيف",
|
|
"moreOptions": "خيارات إضافية",
|
|
"shareHost": "مشاركة المضيف",
|
|
"shareHostTitle": "مشاركة: {{name}}",
|
|
"shareFolder": "مجلد مشترك",
|
|
"shareFolderTitle": "مجلد المشاركة: {{name}}",
|
|
"folderSharedSuccessfully": "المضيف (المضيفون) المشترك {{count}} في المجلد",
|
|
"failedToShareFolder": "فشل مشاركة المجلد",
|
|
"sharing": {
|
|
"loadError": "فشل تحميل بيانات المشاركة. يرجى المحاولة مرة أخرى.",
|
|
"shareWithSection": "مشاركة مع",
|
|
"usersTab": "المستخدمون",
|
|
"rolesTab": "الأدوار",
|
|
"searchPlaceholder": "البحث عن مستخدمين أو أدوار...",
|
|
"noMatches": "لا توجد نتائج مطابقة",
|
|
"permissionLevelLabel": "مستوى الصلاحية",
|
|
"levels": {
|
|
"connect": {
|
|
"label": "اتصال",
|
|
"description": "فتح الجلسات فقط: الطرفية، سطح المكتب البعيد، مدير الملفات، الأنفاق وDocker. لا يمكن الوصول إلى إعدادات المضيف."
|
|
},
|
|
"view": {
|
|
"label": "عرض",
|
|
"description": "الاتصال، بالإضافة إلى عرض إعدادات المضيف. لا تظهر الأسرار أبدًا."
|
|
},
|
|
"edit": {
|
|
"label": "تعديل",
|
|
"description": "يمكنك عرض وتعديل إعدادات المضيف غير المتعلقة بالمصادقة. تبقى مصادقة SSH الخاصة بالمالك سرية ومخصصة له فقط."
|
|
},
|
|
"manage": {
|
|
"label": "إدارة",
|
|
"description": "التعديل، بالإضافة إلى مشاركة المضيف مع الآخرين، وتغيير مستويات الصلاحية وإلغاء الوصول."
|
|
}
|
|
},
|
|
"expiryLabel": "انتهاء صلاحية الوصول",
|
|
"expiry": {
|
|
"never": "أبدًا",
|
|
"oneHour": "ساعة واحدة",
|
|
"oneDay": "24 ساعة",
|
|
"sevenDays": "7 أيام",
|
|
"thirtyDays": "30 يومًا",
|
|
"custom": "مخصص"
|
|
},
|
|
"customHoursPlaceholder": "عدد الساعات حتى انتهاء صلاحية الوصول",
|
|
"shareButton": "مشاركة",
|
|
"shareWithCount": "مشاركة ({{count}})",
|
|
"currentAccess": "الوصول الحالي",
|
|
"noAccessEntries": "لم تتم مشاركة هذا المضيف بعد",
|
|
"folderRulesTitle": "ينطبق على المضيفين الذين تمت إضافتهم لاحقًا",
|
|
"folderRulesHint": "تبقى هذه المشاركات ضمن المجلد: يحصل أي جهاز مضيف تم إنشاؤه فيه أو نقله إليه (أو إلى مجلد فرعي) على نفس صلاحيات الوصول تلقائيًا. إزالة قاعدة ما توقف فقط التوريث المستقبلي.",
|
|
"folderRuleRemove": "توقف عن التوريث",
|
|
"folderShareSummary": "مُشترك {{shared}} من {{total}} مُضيف (مضيفين) في هذا المجلد",
|
|
"grantedBy": "ممنوح بواسطة",
|
|
"expires": "انتهاء",
|
|
"expired": "منتهي",
|
|
"never": "أبداً",
|
|
"revoke": "إلغاء",
|
|
"accessUpdated": "تم تحديث الوصول",
|
|
"accessUpdateFailed": "فشل تحديث الوصول",
|
|
"sharedBadge": "مشترك",
|
|
"sharedBadgeTooltip": "مُشارَك بواسطة {{owner}} (مستوى وصول {{level}})",
|
|
"viewOnlyBanner": "تمت مشاركة هذا المضيف معك من قبل {{owner}} بصلاحية العرض فقط. التكوين للقراءة فقط.",
|
|
"sharedEditBanner": "تمت مشاركة هذا المضيف معك من قبل {{owner}} بصلاحية التعديل. التغييرات تؤثر على المضيف الفعلي؛ لا يمكن تغيير مراجع المصادقة إلا من قبل المالك.",
|
|
"ownerOnlyControl": "يمكن لمالك المضيف فقط تغيير هذا",
|
|
"ownerAuthPrivate": "بيانات اعتماد SSH الخاصة بمالك المضيف خاصة. استخدم خيار \"تعيين بيانات اعتماد SSH الشخصية\" من قائمة المضيف لاختيار بيانات اعتمادك الخاصة.",
|
|
"ownerAuthShared": "قام مالك المضيف بمشاركة بيانات اعتماد SSH لهذا المضيف. يمكنك استخدامها أو اختيار بيانات اعتمادك الخاصة من \"تعيين بيانات اعتماد SSH الشخصية\".",
|
|
"authOverrideAction": "قم بتعيين مصادقة SSH الشخصية",
|
|
"authOverrideActionProtocol": "تعيين المصادقة الشخصية {{protocol}}",
|
|
"authOverrideTitle": "مصادقة SSH الشخصية",
|
|
"authOverrideTitleProtocol": "مصادقة شخصية {{protocol}}",
|
|
"authOverrideDescriptionPrivate": "تبقى بيانات اعتماد SSH الخاصة بمالك المضيف سرية. اختر إحدى بيانات الاعتماد المحفوظة لديك للاتصال بـ {{host}}.",
|
|
"authOverrideDescriptionShared": "استخدم بيانات المصادقة التي شاركها مالك المضيف، أو استبدلها بإحدى بيانات الاعتماد المحفوظة لديك للاتصال بـ {{host}}.",
|
|
"authOverrideCredentialLabel": "بيانات اعتماد المصادقة",
|
|
"useSharedAuthentication": "استخدم مصادقة المضيف المشترك",
|
|
"noPersonalCredential": "لا توجد وثائق اعتماد شخصية",
|
|
"authOverrideNoCredentials": "ليس لديك أي بيانات اعتماد SSH محفوظة حتى الآن. أنشئ واحدة في قسم بيانات الاعتماد للاتصال بالأجهزة المضيفة التي تتطلب مصادقة.",
|
|
"authOverrideRequired": "يتطلب هذا المضيف إحدى بيانات الاعتماد المحفوظة لديك قبل أن تتمكن من الاتصال.",
|
|
"authOverridePrivateHint": "هذه البيانات خاصة بك وحدك. لا يمكن لمالك المضيف أو المستلمين الآخرين رؤيتها أو استخدامها.",
|
|
"authOverrideSaved": "تم حفظ مصادقة SSH الشخصية",
|
|
"authOverrideCleared": "تمت إزالة مصادقة SSH الشخصية",
|
|
"authOverrideClearedToShared": "استخدام مصادقة المضيف المشترك",
|
|
"authOverrideLoadError": "فشل تحميل بيانات مصادقة SSH الخاصة بك. يرجى المحاولة مرة أخرى.",
|
|
"authOverrideSaveError": "فشل حفظ بيانات مصادقة SSH الخاصة بك"
|
|
},
|
|
"guac": {
|
|
"connection": "اتصال",
|
|
"authentication": "المصادقة",
|
|
"storedCredential": "بيانات الاعتماد المخزنة",
|
|
"noCredential": "لا توجد بيانات اعتماد (بيانات اعتماد مباشرة أدناه)",
|
|
"authMethod": "طريقة المصادقة",
|
|
"authTypeDirect": "مباشر",
|
|
"authTypeCredential": "بيانات الاعتماد",
|
|
"authTypeNone": "لا أحد",
|
|
"authTypeNoneDesc": "لا يتم تخزين أي بيانات اعتماد. سيُطلب منك إدخال اسم المستخدم وكلمة المرور في كل مرة تتصل فيها؛ فهي غير محفوظة.",
|
|
"selectCredential": "اختر بيانات اعتماد...",
|
|
"connectionSettings": "إعدادات الاتصال",
|
|
"displaySettings": "إعدادات العرض",
|
|
"audioSettings": "إعدادات الصوت",
|
|
"rdpPerformance": "أداء RDP",
|
|
"deviceRedirection": "إعادة توجيه الأجهزة",
|
|
"session": "جلسة",
|
|
"gateway": "بوابة",
|
|
"remoteApp": "RemoteApp",
|
|
"clipboard": "الحافظة",
|
|
"sessionRecording": "تسجيل الجلسة",
|
|
"wakeOnLan": "الإيقاظ عبر الشبكة",
|
|
"vncSettings": "إعدادات VNC",
|
|
"terminalSettings": "إعدادات الطرفية",
|
|
"rdpPort": "منفذ RDP",
|
|
"username": "اسم المستخدم",
|
|
"password": "كلمة المرور",
|
|
"passwordSaved": "تم حفظ كلمة المرور، اكتب لتغييرها",
|
|
"domain": "مجال",
|
|
"securityMode": "وضع الأمان",
|
|
"colorDepth": "عمق اللون",
|
|
"width": "العرض",
|
|
"height": "الارتفاع",
|
|
"dpi": "DPI",
|
|
"resizeMethod": "طريقة تغيير الحجم",
|
|
"clientName": "اسم العميل",
|
|
"initialProgram": "البرنامج الأولي",
|
|
"serverLayout": "تخطيط الخادم",
|
|
"timezone": "المنطقة الزمنية",
|
|
"loadBalanceInfo": "معلومات موازنة التحميل / ملف تعريف ارتباط",
|
|
"loadBalanceInfoDesc": "ملف تعريف ارتباط وسيط اتصال RD لموازنة تحميل مزرعة RDS (مثل: tsv://MS Terminal Services Plugin.1.CollectionName)",
|
|
"guacdProxy": "وكيل guacd",
|
|
"guacdHostname": "مضيف guacd",
|
|
"guacdHostnamePlaceholder": "الافتراضي العام",
|
|
"guacdPort": "منفذ guacd",
|
|
"guacdProxyDesc": "تجاوز مثيل guacd العام لهذا الاتصال. اتركه فارغًا لاستخدام إعدادات guacd العمومية.",
|
|
"gatewayHostname": "اسم مضيف البوابة",
|
|
"gatewayPort": "منفذ البوابة",
|
|
"gatewayUsername": "اسم مستخدم البوابة",
|
|
"gatewayPassword": "كلمة مرور البوابة",
|
|
"gatewayDomain": "مجال البوابة",
|
|
"remoteAppProgram": "برنامج RemoteApp",
|
|
"workingDirectory": "دليل العمل",
|
|
"arguments": "الوسائط",
|
|
"normalizeLineEndings": "تطبيع نهايات الأسطر",
|
|
"recordingPath": "مسار التسجيل",
|
|
"recordingName": "اسم التسجيل",
|
|
"macAddress": "عنوان MAC",
|
|
"broadcastAddress": "عنوان البث",
|
|
"udpPort": "منفذ UDP",
|
|
"waitTimeS": "وقت الانتظار (ث)",
|
|
"driveName": "اسم القرص",
|
|
"drivePath": "مسار القرص",
|
|
"ignoreCertificate": "تجاهل الشهادة",
|
|
"ignoreCertificateDesc": "السماح بالاتصال بالمضيفين بشهادات موقعة ذاتيًا",
|
|
"forceLossless": "فرض بدون فقدان",
|
|
"forceLosslessDesc": "فرض ترميز الصور بدون فقدان (جودة أعلى، استهلاك أكبر للنطاق الترددي)",
|
|
"disableAudio": "تعطيل الصوت",
|
|
"disableAudioDesc": "كتم كل الصوت من الجلسة البعيدة",
|
|
"enableAudioInput": "تمكين إدخال الصوت (الميكروفون)",
|
|
"enableAudioInputDesc": "إعادة توجيه الميكروفون المحلي إلى الجلسة البعيدة",
|
|
"wallpaper": "خلفية سطح المكتب",
|
|
"wallpaperDesc": "إظهار خلفية سطح المكتب (التعطيل يحسن الأداء)",
|
|
"theming": "السمات",
|
|
"themingDesc": "تمكين السمات والأنماط المرئية",
|
|
"fontSmoothing": "تنعيم الخطوط",
|
|
"fontSmoothingDesc": "تمكين عرض خطوط ClearType",
|
|
"fullWindowDrag": "سحب النافذة بالكامل",
|
|
"fullWindowDragDesc": "إظهار محتويات النافذة أثناء السحب",
|
|
"desktopComposition": "تركيب سطح المكتب",
|
|
"desktopCompositionDesc": "تمكين تأثيرات Aero الزجاجية",
|
|
"menuAnimations": "حركات القوائم",
|
|
"menuAnimationsDesc": "تمكين حركات التلاشي والانزلاق للقوائم",
|
|
"disableBitmapCaching": "تعطيل التخزين المؤقت للصور النقطية",
|
|
"disableBitmapCachingDesc": "إيقاف التخزين المؤقت للصور النقطية (قد يساعد في حل المشكلات)",
|
|
"disableOffscreenCaching": "تعطيل التخزين المؤقت خارج الشاشة",
|
|
"disableOffscreenCachingDesc": "إيقاف التخزين المؤقت خارج الشاشة",
|
|
"disableGlyphCaching": "تعطيل التخزين المؤقت للأشكال",
|
|
"disableGlyphCachingDesc": "إيقاف التخزين المؤقت للأشكال",
|
|
"enableGfx": "تمكين 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": "نوع الطرفية",
|
|
"fontName": "اسم الخط",
|
|
"fontSize": "حجم الخط",
|
|
"colorScheme": "نظام الألوان",
|
|
"backspaceKey": "مفتاح Backspace",
|
|
"saveHostFirst": "احفظ المضيف أولاً.",
|
|
"sharingOptionsAfterSave": "خيارات المشاركة متاحة بعد حفظ المضيف.",
|
|
"permissionLevel": "مستوى الصلاحية",
|
|
"typeHeader": "النوع",
|
|
"targetHeader": "الهدف",
|
|
"permissionHeader": "الصلاحية",
|
|
"cancelBtn": "إلغاء",
|
|
"savingBtn": "جارٍ الحفظ...",
|
|
"updateHostBtn": "تحديث المضيف",
|
|
"addHostBtn": "إضافة مضيف"
|
|
},
|
|
"arrangeUnlockedSwitchedToManual": "تم التحويل إلى الفرز اليدوي لضمان بقاء طلبك",
|
|
"dragToRearrange": "اسحب لإعادة الترتيب",
|
|
"arrangeUnlocked": "قم بإلغاء القفل واسحب لإعادة الترتيب",
|
|
"tabWebUi": "واجهة المستخدم على الويب",
|
|
"webUiEndpointLabel": "نقطة النهاية {{number}}",
|
|
"webUiIntegration": "واجهة المستخدم على الويب",
|
|
"webUiEndpointsSection": "نقاط النهاية",
|
|
"webUiRequirementsText": "يفتح متصفحك نقطة نهاية مباشرة، لذا يجب أن يكون منفذها قابلاً للوصول من هنا. أما Termix فيفتح نفق SSH عبر اتصال SSH الخاص بهذا المضيف، لذا يكفي أن يكون المنفذ قابلاً للوصول من المضيف نفسه.",
|
|
"enableWebUi": "تفعيل نقاط نهاية الويب",
|
|
"enableWebUiDesc": "افتح واجهات الويب الخاصة بهذا المضيف من الشريط الجانبي.",
|
|
"webUiAddEndpoint": "إضافة نقطة نهاية",
|
|
"webUiAddress": "عنوان",
|
|
"webUiOpening": "افتتاح",
|
|
"webUiBindHostDesc": "حيث يقوم الخادم الخلفي بربط التوجيه الأمامي. اترك هذا الحقل فارغًا للعنوان 127.0.0.1، والذي لا يمكن الوصول إليه إلا من خلال الجهاز الذي يُشغّل برنامج Termix.",
|
|
"webUiBindHostExposed": "يمكن الوصول إلى هذا العنوان من خارج جهاز Termix، لذا فإن أي شخص يمكنه الوصول إلى المنفذ سيحصل على واجهة المستخدم هذه عبر الويب دون الحاجة إلى تسجيل الدخول.",
|
|
"webUiBindHostUnreachable": "لا يستطيع متصفحك الوصول إلى 127.0.0.1 على الجهاز الذي يُشغّل Termix، لذا لن يتم تحميل هذه النقطة النهائية. استخدم عنوانًا يستجيب له الجهاز، مثل 0.0.0.0.",
|
|
"webUiBindHostSharesSessionCookie": "من هذا المتصفح، سيتم الوصول إلى إعادة التوجيه عبر نفس اسم المضيف الذي يُشغّل Termix، وبالتالي ستتلقى الخدمة المُمرّرة جلسة Termix الخاصة بك. تتجاهل ملفات تعريف الارتباط رقم المنفذ. لن يتم فتح نقطة النهاية هذه هنا؛ فهي تعمل من تطبيق Termix لسطح المكتب، أو عند فتح Termix على المضيف المحلي (localhost).",
|
|
"webUiLocalPort": "الميناء المحلي",
|
|
"webUiLocalPortAuto": "معادلة",
|
|
"webUiLocalPortDesc": "ما هو المنفذ الذي يستمع إليه التوجيه؟ اتركه فارغًا ليختاره النظام، أو حدد واحدًا عندما يكون من الضروري معرفة المنفذ مسبقًا، كما هو الحال في حاوية تنشره.",
|
|
"webUiNewEndpointLabel": "نقطة نهاية جديدة",
|
|
"webUiErrorLabelRequired": "نقطة النهاية {{row}} تحتاج إلى تسمية.",
|
|
"webUiErrorLabelDuplicate": "كل نقطة نهاية تحتاج إلى اسم مختلف.",
|
|
"webUiErrorPortRange": "نقطة النهاية {{row}} تحتاج إلى منفذ بين 1 و 65535.",
|
|
"webUiErrorPathInvalid": "يحتوي المسار {{row}} على مسار غير صالح. استخدم مسارًا مثل /admin.",
|
|
"webUiLabel": "ملصق",
|
|
"webUiScheme": "مخطط",
|
|
"webUiPort": "ميناء",
|
|
"webUiPath": "طريق",
|
|
"webUiAccess": "وصول",
|
|
"webUiAccessDirect": "مباشر",
|
|
"webUiAccessTunnel": "نفق SSH",
|
|
"webUiAccessTunnelUnavailable": "يتطلب نفق SSH تمكين SSH على هذا المضيف ومصدر اتصال من هذا الجهاز.",
|
|
"webUiRender": "افتح في",
|
|
"webUiRenderExternal": "نافذة سطح المكتب المعزولة",
|
|
"webUiRenderEmbedded": "علامة تبويب Termix",
|
|
"webUiRenderEmbeddedDesc": "يُعدّ تضمين المحتوى أفضل محاولة ممكنة: فبعض واجهات الويب ترفض التحميل داخل إطار، وقد تتكرر عملية تسجيل الدخول التي تعتمد على ملفات تعريف الارتباط الخاصة بالموقع نفسه. أما المتصفح الخارجي فيعمل دائمًا.",
|
|
"webUiIgnoreCert": "السماح بشهادة غير صالحة",
|
|
"webUiIgnoreCertDesc": "نقاط النهاية المباشرة فقط. تم إعفاء نقاط نهاية Loopback بالفعل، لذا لن يكون لهذا أي تأثير على نقاط نهاية النفق.",
|
|
"webUiRemoveEndpoint": "إزالة نقطة النهاية",
|
|
"webUiOpenFailed": "فشل فتح نقطة نهاية الويب"
|
|
},
|
|
"commandPalette": {
|
|
"searchPlaceholder": "ابحث عن المضيفين، الأوامر، أو الإعدادات...",
|
|
"quickActions": "إجراءات سريعة",
|
|
"navigation": "ملاحة",
|
|
"orShortcut": "أو",
|
|
"hostManager": "مدير المضيفين",
|
|
"hostManagerDesc": "إدارة المضيفين أو إضافتهم أو تعديلهم",
|
|
"addNewHost": "إضافة مضيف جديد",
|
|
"addNewHostDesc": "تسجيل مضيف جديد",
|
|
"adminSettings": "إعدادات المدير",
|
|
"adminSettingsDesc": "تكوين تفضيلات النظام والمستخدمين",
|
|
"userProfile": "الملف الشخصي للمستخدم",
|
|
"userProfileDesc": "إدارة حسابك وتفضيلاتك",
|
|
"addCredential": "إضافة اعتماد",
|
|
"addCredentialDesc": "تخزين مفاتيح SSH أو كلمات المرور",
|
|
"tmuxMonitor": "مراقب Tmux",
|
|
"tmuxMonitorDesc": "مراقبة جلسات tmux عبر مضيفيك",
|
|
"snippets": "مقتطفات",
|
|
"runSnippetDesc": "قم بتشغيله في علامة تبويب الطرفية النشطة",
|
|
"noSnippetsFound": "لم يتم العثور على أي مقتطفات مطابقة لـ \"{{search}}\"",
|
|
"recentActivity": "النشاط الأخير",
|
|
"serversAndHosts": "الخوادم والمضيفون",
|
|
"noHostsFound": "لم يتم العثور على مضيفين يطابقون \"{{search}}\"",
|
|
"links": "روابط",
|
|
"navigate": "تنقل",
|
|
"select": "تحديد",
|
|
"toggleWith": "تبديل باستخدام",
|
|
"localTerminal": "المحطة المحلية",
|
|
"localTerminalDesc": "افتح نافذة طرفية على هذا الكمبيوتر"
|
|
},
|
|
"splitScreen": {
|
|
"paneEmpty": "الجزء {{index}} - فارغ",
|
|
"noTabAssigned": "لم يتم تعيين علامة تبويب",
|
|
"focusedPane": "الجزء النشط"
|
|
},
|
|
"connections": {
|
|
"noConnections": "لا توجد اتصالات",
|
|
"noConnectionsDesc": "افتح محطة طرفية، أو مدير ملفات، أو سطح مكتب بعيد لرؤية الاتصالات هنا",
|
|
"connectedFor": "متصل منذ {{duration}}",
|
|
"connected": "متصل",
|
|
"disconnected": "غير متصل",
|
|
"closeTab": "إغلاق علامة التبويب",
|
|
"closeConnection": "إغلاق الاتصال",
|
|
"forgetTab": "نسيان",
|
|
"removeBackground": "إزالة",
|
|
"reconnect": "إعادة الاتصال",
|
|
"reopenTab": "إعادة فتح",
|
|
"sectionOpen": "مفتوحة",
|
|
"sectionBackground": "الخلفية",
|
|
"backgroundDesc": "تستمر الجلسات لمدة {{minutes}} دقيقة بعد قطع الاتصال ويمكن إعادة الاتصال بها.",
|
|
"persisted": "محفوظة في الخلفية",
|
|
"expiresIn": "تنتهي خلال {{duration}}",
|
|
"search": "بحث في الاتصالات...",
|
|
"noSearchResults": "لا توجد اتصالات تطابق بحثك",
|
|
"rename": "إعادة تسمية الجلسة",
|
|
"sectionSharedWithMe": "تمت مشاركته معي",
|
|
"sharedBy": "تمت المشاركة بواسطة {{username}}",
|
|
"join": "ينضم",
|
|
"sharedSessionLabel": "{{hostName}} (مشترك)"
|
|
},
|
|
"collab": {
|
|
"createRoom": "غرف جديدة",
|
|
"roomName": "اسم الغرفة",
|
|
"persistentRoom": "غرفة مستمرة",
|
|
"persistentRoomHint": "تبقى الغرف الدائمة مدرجة بعد انتهاء الاجتماع ويمكن إعادة استخدامها.",
|
|
"noRooms": "لا توجد غرف اجتماعات بعد. أنشئ غرفة لبدء اجتماع.",
|
|
"openRoom": "يفتح",
|
|
"endRoom": "انتهاء الاجتماع",
|
|
"leaveRoom": "يترك",
|
|
"deleteMember": "يزيل",
|
|
"removeMember": "إزالة {{name}}",
|
|
"removeMemberTitle": "هل تريد حذف هذا العضو؟",
|
|
"removeMemberDescription": "سيفقد المستخدم {{name}} إمكانية الوصول إلى هذه الغرفة فورًا. وسيتم فصل أي برنامج عرض SSH نشط.",
|
|
"invite": "يدعو",
|
|
"inviteTitle": "دعوة الأعضاء",
|
|
"members": "أعضاء",
|
|
"membersPanel": "أعضاء الغرفة وطلبات التحكم",
|
|
"membersWithCount": "الأعضاء ({{count}})",
|
|
"online": "متصل",
|
|
"offline": "غير متصل بالإنترنت",
|
|
"you": "(أنت)",
|
|
"hostBadge": "يستضيف",
|
|
"presenterBadge": "تقديم",
|
|
"present": "حاضر",
|
|
"presentTitle": "اصعد إلى المسرح",
|
|
"presentHost": "يستضيف",
|
|
"searchHosts": "البحث عن المضيفين",
|
|
"noHostsFound": "لم يتم العثور على مضيفين متاحين.",
|
|
"presentProtocol": "بروتوكول",
|
|
"stopPresenting": "توقف عن التقديم",
|
|
"takeOver": "تولي زمام الأمور",
|
|
"takeOverConfirmTitle": "هل تريد استبدال العرض التقديمي الحالي؟",
|
|
"takeOverDescription": "{{name}} يقدم العرض الآن. سيؤدي الاستحواذ على المنصة إلى فصل الجميع عنها.",
|
|
"emptyStage": "لا يوجد مقدمون. تفضلوا بالصعود إلى المنصة لمشاركة جلسة.",
|
|
"stageLoading": "الاتصال بالمسرح...",
|
|
"stageEnded": "انتهى العرض التقديمي",
|
|
"roomEnded": "انتهى هذا الاجتماع",
|
|
"presenterLabel": "{{name}} يقدم",
|
|
"guestLink": "رابط الضيف",
|
|
"guestLinkOn": "رابط الضيوف مُفعّل. يمكن لأي شخص لديه الرابط مشاهدة العرض.",
|
|
"guestLinkOff": "رابط الضيف معطل.",
|
|
"copyLink": "نسخ الوصلة",
|
|
"rotateLink": "تدوير الرابط",
|
|
"disableLink": "تعطيل الرابط",
|
|
"rotateLinkConfirmTitle": "هل تريد تدوير رابط الضيف؟",
|
|
"rotateLinkDescription": "سيتوقف الرابط الحالي عن العمل فوراً. سيتم فصل الضيوف المتصلين عبر SSH.",
|
|
"disableLinkConfirmTitle": "هل تريد تعطيل رابط الضيف؟",
|
|
"disableLinkDescription": "سيتم قطع اتصال عارضي SSH المجهولين على الفور وسيتوقف الرابط الحالي عن العمل.",
|
|
"linkCopied": "تم نسخ الرابط",
|
|
"roles": "الأدوار",
|
|
"users": "المستخدمون",
|
|
"searchUsers": "ابحث عن المستخدمين",
|
|
"endConfirmTitle": "هل ننهي هذا الاجتماع؟",
|
|
"endDescription": "سينتهي {{name}} للجميع ولن يكون من الممكن إعادة فتحه.",
|
|
"endPersistentDescription": "سيتوقف العرض التقديمي النشط في {{name}} . وستبقى الغرفة متاحة لإعادة الاستخدام.",
|
|
"deleteRoom": "حذف الغرفة",
|
|
"deleteConfirmTitle": "هل تريد حذف هذه الغرفة؟",
|
|
"deleteDescription": "سيتم حذف {{name}} نهائياً للجميع ولا يمكن التراجع عنه.",
|
|
"invitedTo": "لقد تمت دعوتك إلى \"{{name}}\"",
|
|
"guest": {
|
|
"title": "مقابلة",
|
|
"waiting": "في انتظار المذيع...",
|
|
"linkInvalid": "رابط الضيف هذا غير صالح أو انتهى الاجتماع"
|
|
},
|
|
"reopenFromPanel": "انتهت صلاحية علامة تبويب هذا الاجتماع. أعد فتح الغرفة من لوحة الاجتماعات.",
|
|
"requestControl": "التحكم في الطلبات",
|
|
"cancelControlRequest": "إلغاء الطلب",
|
|
"controlQueue": "طلبات التحكم",
|
|
"noControlRequests": "لا توجد طلبات معلقة.",
|
|
"grantControlTo": "قم بمنح التحكم إلى {{name}}",
|
|
"dismissControlRequest": "رفض طلب التحكم {{name}}",
|
|
"releaseControl": "التحكم في الإصدار",
|
|
"grantControl": "امنح السيطرة",
|
|
"revokeControl": "استعد السيطرة",
|
|
"controlRequestedBy": "طلب {{name}} التحكم",
|
|
"grant": "منحة",
|
|
"controlBadge": "مسيطر",
|
|
"youArePresenting": "أنت تعرض المحتوى في علامة تبويب أخرى. توقف عن العرض لتسليم المنصة.",
|
|
"created": "تم إنشاء الغرفة",
|
|
"invited": "الأعضاء المدعوون",
|
|
"roomTab": "مقابلة"
|
|
},
|
|
"sessionSharing": {
|
|
"guestView": {
|
|
"loading": "جارٍ الاتصال بالجلسة المشتركة...",
|
|
"linkInvalid": "رابط المشاركة هذا غير صالح أو منتهي الصلاحية أو تم إلغاؤه",
|
|
"rateLimited": "عدد المحاولات كبير جدًا، يرجى المحاولة مرة أخرى قريبًا",
|
|
"sessionEnded": "انتهت هذه الجلسة",
|
|
"readOnlyBadge": "للعرض فقط",
|
|
"ownerLabel": "مالك المضيف"
|
|
},
|
|
"modalTitle": "جلسة مشاركة",
|
|
"shareButton": "يشارك",
|
|
"notReadyToShare": "الجلسة غير جاهزة للمشاركة بعد",
|
|
"modeTab": {
|
|
"link": "وصلة",
|
|
"user": "مستخدم"
|
|
},
|
|
"linkModeDescription": "يمكن لأي شخص لديه هذا الرابط الانضمام، ولا يلزم وجود حساب.",
|
|
"userModeDescription": "شارك الملف مع مستخدم محدد لديه صلاحية الوصول إلى هذا المضيف. إذا لم يكن لديه صلاحية الوصول بعد، فشارك معه المضيف أولاً أو استخدم رابطًا. بمجرد المشاركة، ستظهر الجلسة في علامة تبويب \"الاتصالات\" الخاصة به.",
|
|
"permissionLevel": {
|
|
"label": "مستوى الإذن",
|
|
"readOnly": "للقراءة فقط",
|
|
"readOnlyDescription": "يمكنني مشاهدة الجلسة مباشرة ولكن لا يمكنني الكتابة أو التفاعل.",
|
|
"readWrite": "القراءة والكتابة",
|
|
"readWriteDescription": "يمكنه الكتابة والتفاعل مع الجلسة تمامًا مثل المالك."
|
|
},
|
|
"expiryLabel": "انتهاء صلاحية الرابط",
|
|
"createLinkButton": "إنشاء رابط",
|
|
"createShareButton": "مشاركة مع المستخدم",
|
|
"searchUsersPlaceholder": "ابحث عن المستخدمين...",
|
|
"noUsersFound": "لم يتم العثور على مستخدمين",
|
|
"linkCreated": "تم إنشاء رابط المشاركة",
|
|
"linkCopied": "تم نسخ الرابط إلى الحافظة",
|
|
"copyLink": "نسخ الوصلة",
|
|
"shareCreated": "تمت مشاركة الجلسة. ستظهر في علامة تبويب \"الاتصالات\" الخاصة بهم.",
|
|
"shareFailed": "فشل إنشاء المشاركة",
|
|
"userLacksHostAccess": "لا يملك هذا المستخدم صلاحية الوصول إلى هذا المضيف بعد. شارك المضيف معه أولاً، أو استخدم رابطاً بدلاً من ذلك.",
|
|
"activeShares": "الأسهم النشطة",
|
|
"noActiveShares": "لا توجد أسهم نشطة لهذه الجلسة",
|
|
"revoke": "إلغاء",
|
|
"revokeConfirmTitle": "إلغاء هذه الحصة؟",
|
|
"revokeConfirmDescription": "أي شخص يستخدم هذا الملف المشترك سيفقد الوصول إليه فوراً.",
|
|
"revoked": "تم إلغاء الحصة",
|
|
"revokeFailed": "فشل في إلغاء المشاركة",
|
|
"joinCount": "{{count}} انضم",
|
|
"joinCount_other": "{{count}} ينضم",
|
|
"expiresAt": "تاريخ الانتهاء {{date}}",
|
|
"linkShareBadge": "وصلة",
|
|
"userShareBadge": "المستخدم: {{username}}",
|
|
"loadSharesFailed": "فشل تحميل المشاركات النشطة"
|
|
},
|
|
"guacamole": {
|
|
"connecting": "جارٍ الاتصال بجلسة {{type}}...",
|
|
"checkingGuacd": "جارٍ التحقق من خدمة سطح المكتب البعيد...",
|
|
"requestingToken": "طلب رمز اتصال {{type}}...",
|
|
"openingSession": "جارٍ فتح الجلسة {{type}}...",
|
|
"negotiating": "التفاوض على مصافحة {{type}}...",
|
|
"sessionReady": "{{type}} الجلسة جاهزة",
|
|
"connectionError": "خطأ في الاتصال",
|
|
"connectionFailed": "فشل الاتصال",
|
|
"failedToConnect": "فشل الحصول على رمز الاتصال",
|
|
"hostNotFound": "المضيف غير موجود",
|
|
"noHostSelected": "لم يتم اختيار مضيف",
|
|
"reconnect": "إعادة الاتصال",
|
|
"retry": "إعادة المحاولة",
|
|
"guacdUnavailable": "خدمة سطح المكتب البعيد (guacd) غير متاحة. يرجى التأكد من تشغيل guacd وإمكانية الوصول إليه وتكوينه بشكل صحيح في إعدادات المسؤول.",
|
|
"credentialPromptTitle": "أدخل بيانات اعتماد RDP",
|
|
"credentialPromptDescription": "تم ضبط هذا المضيف ليطلب بيانات الاعتماد عند الاتصال. تُستخدم هذه البيانات لهذه الجلسة فقط ولا يتم حفظها.",
|
|
"connect": "يتصل",
|
|
"ctrlAltDel": "Ctrl+Alt+Del",
|
|
"files": {
|
|
"title": "ملفات محرك الأقراص",
|
|
"parent": "الدليل الرئيسي",
|
|
"refresh": "ينعش",
|
|
"empty": "هذا المجلد فارغ",
|
|
"listFailed": "فشل في قراءة هذا المجلد",
|
|
"download": "تحميل",
|
|
"downloadFailed": "فشل تنزيل {{name}}",
|
|
"upload": "تحميل الملفات",
|
|
"uploading": "جارٍ التحميل {{name}}...",
|
|
"uploaded": "تم التحميل {{name}}",
|
|
"uploadFailed": "فشل تحميل {{name}}",
|
|
"uploadDisabled": "تم تعطيل التحميلات لهذا الاتصال",
|
|
"driveUnavailable": "قم بتمكين إعادة توجيه محرك الأقراص RDP قبل تحميل الملفات",
|
|
"driveNotWritable": "لا يستطيع برنامج guacd الكتابة إلى مجلد القرص. تحقق من مسار محرك الأقراص GUACD_DRIVE_PATH (أو مسار محرك الأقراص الخاص بالجهاز المضيف) وصلاحياته.",
|
|
"dropToUpload": "قم بإسقاط الملفات لتحميلها"
|
|
},
|
|
"toolbar": {
|
|
"ctrlAltDel": "Ctrl+Alt+Del",
|
|
"winL": "Win+L (قفل الشاشة)",
|
|
"winKey": "مفتاح Windows",
|
|
"superL": "Super+L (شاشة القفل)",
|
|
"superKey": "مفتاح سوبر",
|
|
"super": "ممتاز",
|
|
"cmdL": "Cmd+L (قفل الشاشة)",
|
|
"cmdKey": "مفتاح الاختصار",
|
|
"cmd": "الأمر",
|
|
"ctrl": "Ctrl",
|
|
"alt": "Alt",
|
|
"shift": "Shift",
|
|
"win": "Win",
|
|
"stickyActive": "{{key}} (مثبت - انقر لتحرير)",
|
|
"stickyInactive": "{{key}} (انقر للتثبيت)",
|
|
"esc": "Escape",
|
|
"tab": "Tab",
|
|
"home": "Home",
|
|
"end": "End",
|
|
"pageUp": "Page Up",
|
|
"pageDown": "Page Down",
|
|
"arrowUp": "Arrow Up",
|
|
"arrowDown": "Arrow Down",
|
|
"arrowLeft": "Arrow Left",
|
|
"arrowRight": "Arrow Right",
|
|
"fnToggle": "مفاتيح الوظائف",
|
|
"reconnect": "إعادة الاتصال بالجلسة",
|
|
"collapse": "طي شريط الأدوات",
|
|
"expand": "توسيع شريط الأدوات",
|
|
"dragHandle": "اسحب لتغيير الموضع",
|
|
"hide": "إخفاء هذه الميزة لهذه الجلسة. لتعطيلها نهائياً، افتح إعدادات المضيف ← عام ← شريط أدوات الاتصال.",
|
|
"zoomIn": "تكبير الصورة",
|
|
"zoomOut": "تصغير العرض",
|
|
"resetZoom": "إعادة ضبط التكبير",
|
|
"fitToScreen": "مناسب للشاشة",
|
|
"switchToTrackpad": "قم بالتبديل إلى وضع لوحة اللمس (اسحب لتحريك المؤشر، انقر للنقر)",
|
|
"switchToTouch": "قم بالتبديل إلى وضع اللمس (انقر مباشرة في المكان الذي تريد النقر فيه)"
|
|
}
|
|
},
|
|
"terminal": {
|
|
"sessionExpiredNotice": "انتهت صلاحية جلستك السابقة على {{host}} بعد {{minutes}} دقيقة من قطع الاتصال؛ تم إغلاق نافذة الأوامر وأي شيء يعمل بداخلها. فعّل خاصية Auto-Tmux على هذا المضيف للحفاظ على استمرارية الجلسات.",
|
|
"sessionExpiredNoticeNoMinutes": "انتهت صلاحية جلستك السابقة على {{host}} أثناء انقطاع الاتصال؛ تم حذف واجهة سطر الأوامر وأي شيء كان يعمل بداخلها. فعّل خاصية Auto-Tmux على هذا المضيف للحفاظ على استمرارية الجلسات.",
|
|
"enableAutoTmuxAction": "تفعيل خاصية Auto-Tmux",
|
|
"autoTmuxEnabled": "تم تفعيل خاصية Auto-Tmux لـ {{host}}. وسيتم تطبيقها بدءًا من الاتصال التالي.",
|
|
"autoTmuxEnableFailed": "فشل تفعيل خاصية Auto-Tmux",
|
|
"connect": "الاتصال بالمضيف",
|
|
"clear": "مسح",
|
|
"paste": "لصق",
|
|
"reconnect": "إعادة الاتصال",
|
|
"connectionLost": "انقطع الاتصال",
|
|
"connected": "متصل",
|
|
"clipboardWriteFailed": "فشل النسخ إلى الحافظة. تأكد من تقديم الصفحة عبر HTTPS أو localhost.",
|
|
"clipboardReadFailed": "فشلت القراءة من الحافظة. تأكد من منح أذونات الحافظة.",
|
|
"clipboardHttpWarning": "تعذر قراءة الحافظة. بعض المتصفحات تقيّد الوصول إلى الحافظة خارج بروتوكول HTTPS - جرّب Ctrl+V بدلاً من ذلك، أو شغّل Termix عبر HTTPS.",
|
|
"passwordPromptFillTitle": "هل تريد ملء كلمة المرور المحفوظة في هذه النافذة؟",
|
|
"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",
|
|
"searchPlaceholder": "يجد",
|
|
"searchCaseSensitive": "علبة كبريت",
|
|
"searchWholeWord": "تطابق الكلمة الكاملة",
|
|
"searchRegex": "استخدم التعبير النمطي",
|
|
"searchNoResults": "لا توجد نتائج",
|
|
"searchResultCount": "{{index}} من {{count}}",
|
|
"searchNext": "المباراة التالية (إدخال)",
|
|
"searchPrevious": "المباراة السابقة (Shift+Enter)",
|
|
"searchClose": "إغلاق (الهروب)",
|
|
"maxReconnectAttemptsReached": "تم الوصول إلى الحد الأقصى لمحاولات إعادة الاتصال",
|
|
"closeTab": "إغلاق",
|
|
"connectionTimeout": "انتهت مهلة الاتصال",
|
|
"terminalTitle": "الطرفية - {{host}}",
|
|
"terminalWithPath": "الطرفية - {{host}}:{{path}}",
|
|
"runTitle": "تشغيل {{command}} - {{host}}",
|
|
"totpRequired": "مطلوب المصادقة الثنائية",
|
|
"totpCodeLabel": "رمز التحقق",
|
|
"totpVerify": "تحقق",
|
|
"mfaPromptRequired": "المصادقة مطلوبة",
|
|
"mfaPushRequired": "يلزم التحقق من صحة الإشعارات",
|
|
"mfaMenuPlaceholder": "أدخل ردك",
|
|
"mfaWaitingApproval": "في انتظار الموافقة على جهازك...",
|
|
"mfaSendRequest": "إرسال الطلب",
|
|
"warpgateAuthRequired": "مطلوب مصادقة Warpgate",
|
|
"warpgateSecurityKey": "مفتاح الأمان",
|
|
"warpgateAuthUrl": "رابط المصادقة",
|
|
"warpgateOpenBrowser": "فتح في المتصفح",
|
|
"warpgateContinue": "لقد أكملت المصادقة",
|
|
"certAuthRequired": "{{provider}} تسجيل الدخول مطلوب",
|
|
"opksshAuthRequired": "مطلوب مصادقة OPKSSH",
|
|
"opksshAuthDescription": "أكمل المصادقة في المتصفح للمتابعة. تبقى هذه الجلسة صالحة لمدة 24 ساعة.",
|
|
"opksshOpenBrowser": "افتح المتصفح للمصادقة",
|
|
"opksshWaitingForAuth": "في انتظار المصادقة في المتصفح...",
|
|
"opksshAuthenticating": "جارٍ معالجة المصادقة...",
|
|
"opksshTimeout": "انتهت مهلة المصادقة. يرجى المحاولة مرة أخرى.",
|
|
"opksshAuthFailed": "فشلت المصادقة. يرجى التحقق من بيانات الاعتماد والمحاولة مرة أخرى.",
|
|
"opksshSignInWith": "تسجيل الدخول باستخدام {{provider}}",
|
|
"tailscaleCheckRequired": "يلزم التحقق من الهوية على مستوى ذيل الطائرة",
|
|
"tailscaleCheckDescription": "يتطلب Tailscale SSH إجراء فحص إضافي. قم بتسجيل الدخول إلى متصفحك للمتابعة.",
|
|
"tailscaleCheckOpenBrowser": "افتح المتصفح للمصادقة",
|
|
"tailscaleCheckWaiting": "في انتظار مصادقة Tailscale...",
|
|
"tailscaleCheckTimeout": "انتهت مهلة مصادقة Tailscale. يرجى المحاولة مرة أخرى.",
|
|
"vaultAuthTitle": "مطلوب تسجيل الدخول إلى Vault",
|
|
"vaultAuthDescription": "تم فتح نافذة لتسجيل الدخول إلى HashiCorp Vault. أكمل تسجيل الدخول هناك؛ سيستمر هذا الاتصال تلقائيًا.",
|
|
"vaultAuthFailed": "فشلت مصادقة Vault. يرجى المحاولة مرة أخرى.",
|
|
"vaultReopen": "أعد فتح نافذة تسجيل الدخول",
|
|
"sudoPasswordPopupTitle": "إدراج كلمة المرور؟",
|
|
"linkDialogTitle": "فتح الرابط",
|
|
"linkDialogOpen": "فتح",
|
|
"linkDialogCopy": "نسخ",
|
|
"websocketAbnormalClose": "أُغلق الاتصال بشكل غير متوقع. قد يكون السبب مشكلة في الوكيل العكسي أو إعدادات SSL. يرجى مراجعة سجلات الخادم.",
|
|
"connectionLogTitle": "سجل الاتصال",
|
|
"connectionLogCopy": "نسخ السجلات إلى الحافظة",
|
|
"connectionLogEmpty": "لا توجد سجلات اتصال بعد",
|
|
"connectionLogWaiting": "في انتظار سجلات الاتصال...",
|
|
"connectionLogCopied": "تم نسخ سجلات الاتصال إلى الحافظة",
|
|
"connectionLogCopyFailed": "فشل نسخ السجلات إلى الحافظة",
|
|
"connectionRejected": "تم رفض الاتصال من قبل الخادم. يرجى التحقق من المصادقة وإعدادات الشبكة.",
|
|
"hostKeyRejected": "تم رفض التحقق من مفتاح مضيف SSH. تم إلغاء الاتصال.",
|
|
"sessionTakenOver": "تم فتح الجلسة في علامة تبويب أخرى. جارٍ إعادة الاتصال...",
|
|
"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": "فشل رفع الملف",
|
|
"uploadingFolderFiles": "جارٍ تحميل {{count}} ملف(ملفات)...",
|
|
"uploadedFolderFiles": "تم تحميل {{count}} ملف بنجاح",
|
|
"uploadedFolderPartial": "تم تحميل {{uploaded}} ملفًا، {{failed}} فشل",
|
|
"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": "أفلت الملفات هنا لرفعها",
|
|
"dropToUploadHere": "قم بإسقاط الملف هنا للتحميل",
|
|
"dropToDownloadHere": "قم بالتنزيل من هنا",
|
|
"localFiles": "محلي",
|
|
"showLocalFiles": "عرض الملفات المحلية (عرض مقسم)",
|
|
"hideLocalFiles": "إخفاء الملفات المحلية",
|
|
"localHome": "المجلد الرئيسي",
|
|
"localPathPlaceholder": "مسار المجلد المحلي",
|
|
"localShowHidden": "إظهار الملفات المخفية",
|
|
"localHideHidden": "إخفاء الملفات المخفية",
|
|
"localRevealInFileManager": "إظهار في مدير ملفات النظام",
|
|
"localCannotOpenFolder": "لا يمكن فتح المجلد",
|
|
"localItemCount": "{{count}} عناصر",
|
|
"localSelectedCount": "{{count}} تم الاختيار",
|
|
"back": "خلف",
|
|
"forward": "إلى الأمام",
|
|
"up": "أعلى",
|
|
"kind": "عطوف",
|
|
"localUploadingProgress": "جارٍ تحميل {{current}} من {{total}}",
|
|
"localDownloadingProgress": "جارٍ تنزيل {{current}} من {{total}}",
|
|
"localTransferInFlight": "{{count}} دفعة واحدة",
|
|
"localPreparingDownload": "جارٍ تحضير التنزيل...",
|
|
"localTransferCancelled": "تم إلغاء التحويل",
|
|
"localNothingToTransfer": "لا يوجد شيء لنقله",
|
|
"localUploadComplete": "تم تحميل {{count}} ملف(ملفات)",
|
|
"localUploadFailed": "فشل التحميل",
|
|
"localUploadPartial": "تم تحميل {{done}} ملفًا، {{failed}} فشل",
|
|
"localDownloadComplete": "تم تنزيل {{count}} ملفًا(ملفات)",
|
|
"localDownloadFailed": "فشل التنزيل",
|
|
"localDownloadPartial": "تم تنزيل {{done}} ملفًا، {{failed}} فشل",
|
|
"localReplaceExistingPrompt": "{{count}} العنصر (العناصر) موجودة بالفعل في هذا المجلد. هل تريد استبدالها؟",
|
|
"localReplace": "يستبدل",
|
|
"localSkipExisting": "يتخطى",
|
|
"localSkippedExisting": "تم تخطي {{count}} عنصر (عناصر) موجودة",
|
|
"localUnsafeNamesSkipped": "تم تخطي {{count}} عنصرًا لا يمكن استخدام أسمائها على هذا الكمبيوتر",
|
|
"localOpen": "يفتح",
|
|
"localOpenFolder": "افتح المجلد",
|
|
"localUploadToRemote": "التحميل إلى الخادم",
|
|
"localUploadToRemoteMany": "قم بتحميل {{count}} عنصرًا إلى الخادم",
|
|
"localMoveToTrash": "انقل إلى سلة المهملات",
|
|
"localMoveToTrashMany": "انقل {{count}} عنصرًا إلى سلة المهملات",
|
|
"localTrashConfirmSingle": "هل تريد نقل \"{{name}}\" إلى سلة المهملات؟",
|
|
"localTrashConfirmFolder": "هل تريد نقل المجلد \"{{name}}\" وجميع محتوياته إلى سلة المهملات؟",
|
|
"localTrashConfirmMany": "هل تريد نقل العناصر {{count}} إلى سلة المهملات؟",
|
|
"localTrashed": "تم نقل {{count}} عنصرًا إلى سلة المهملات",
|
|
"localTrashFailed": "لم يتمكن من الانتقال إلى سلة المهملات",
|
|
"localRenameFailed": "فشلت عملية إعادة التسمية",
|
|
"localCreateFailed": "تعذر إنشاء العنصر",
|
|
"goToParentFolder": "انتقل إلى المجلد الرئيسي",
|
|
"resizeSidebar": "اسحب لتغيير حجم الشريط الجانبي (انقر نقراً مزدوجاً لإعادة التعيين)",
|
|
"resizeLocalPane": "اسحب لتغيير حجم اللوحة المحلية (انقر نقراً مزدوجاً لإعادة التعيين)",
|
|
"columns": "الأعمدة",
|
|
"columnsHint": "انقر بزر الماوس الأيمن لاختيار الأعمدة",
|
|
"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": "فشل نسخ المسار إلى الحافظة",
|
|
"copyFolderLink": "نسخ رابط المجلد",
|
|
"copyCurrentFolderLink": "نسخ رابط المجلد الحالي",
|
|
"folderLinkCopied": "تم نسخ رابط المجلد إلى الحافظة",
|
|
"failedToCopyFolderLink": "فشل نسخ رابط المجلد",
|
|
"movedItems": "تم نقل {{count}} عناصر",
|
|
"failedToDeleteItem": "فشل حذف العنصر",
|
|
"itemRenamedSuccessfully": "تمت إعادة تسمية {{type}} بنجاح",
|
|
"failedToRenameItem": "فشلت إعادة تسمية العنصر",
|
|
"download": "تنزيل",
|
|
"openExternalEditor": "فتح خارجيًا",
|
|
"chooseExternalEditor": "اختيار محرر خارجي",
|
|
"externalEditorSelected": "تم اختيار المحرر الخارجي",
|
|
"externalEditorDesktopOnly": "المحرر الخارجي متاح فقط في تطبيق سطح المكتب",
|
|
"externalEditorOpened": "تم الفتح في المحرر الخارجي. سيؤدي الحفظ هناك إلى رفع التغييرات إلى الخادم.",
|
|
"failedToOpenExternalEditor": "فشل فتح المحرر الخارجي",
|
|
"failedToSelectExternalEditor": "فشل اختيار المحرر الخارجي",
|
|
"permissions": "الصلاحيات",
|
|
"size": "الحجم",
|
|
"modified": "تاريخ التعديل",
|
|
"path": "المسار",
|
|
"confirmDelete": "هل أنت متأكد أنك تريد حذف {{name}}؟",
|
|
"permissionDenied": "تم رفض الإذن",
|
|
"serverError": "خطأ في الخادم",
|
|
"fileSavedSuccessfully": "تم حفظ الملف بنجاح",
|
|
"failedToSaveFile": "فشل حفظ الملف",
|
|
"confirmDeleteSingleItem": "هل أنت متأكد أنك تريد حذف \"{{name}}\" نهائيًا؟",
|
|
"confirmDeleteMultipleItems": "هل أنت متأكد أنك تريد حذف {{count}} عناصر نهائيًا؟",
|
|
"confirmDeleteMultipleItemsWithFolders": "هل أنت متأكد أنك تريد حذف {{count}} عناصر نهائيًا؟ يتضمن ذلك المجلدات ومحتوياتها.",
|
|
"confirmDeleteFolder": "هل أنت متأكد أنك تريد حذف المجلد \"{{name}}\" وجميع محتوياته نهائيًا؟",
|
|
"permanentDeleteWarning": "لا يمكن التراجع عن هذا الإجراء. سيتم حذف العنصر (العناصر) نهائيًا من الخادم.",
|
|
"moveToTrashWarning": "سيتم نقل العنصر (العناصر) إلى سلة مهملات Termix ويمكن استعادته قبل انتهاء فترة الاحتفاظ.",
|
|
"itemsMovedToTrash": "تم نقل العنصر (العناصر) إلى سلة المهملات {{count}}",
|
|
"trash": "نفاية",
|
|
"trashDescription": "يتم الاحتفاظ بالعناصر المحذوفة لمدة {{days}} يوم (أيام) على هذا المضيف.",
|
|
"trashLoadFailed": "فشل تحميل سلة المهملات",
|
|
"trashEmpty": "سلة المهملات فارغة",
|
|
"trashRestore": "يعيد",
|
|
"trashRestored": "تمت الاستعادة {{name}}",
|
|
"trashRestoreFailed": "فشلت عملية استعادة العنصر. قد يكون المسار الأصلي موجودًا بالفعل.",
|
|
"trashDeletePermanently": "حذف نهائياً",
|
|
"trashDeleteConfirm": "حذف {{name}}نهائياً؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"trashPermanentlyDeleted": "تم الحذف نهائياً {{name}}",
|
|
"trashDeleteFailed": "فشل حذف العنصر نهائياً",
|
|
"trashEmptyAction": "قم بإفراغ سلة المهملات",
|
|
"trashEmptyConfirm": "هل تريد حذف جميع العناصر الموجودة في سلة المهملات نهائياً؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"trashEmptied": "تم إفراغ سلة المهملات",
|
|
"trashRetention": "التنظيف التلقائي بعد (أيام)",
|
|
"trashRetentionSaved": "تحديث نظام الاحتفاظ بالنفايات",
|
|
"trashRetentionFailed": "فشل تحديث الاحتفاظ بالنفايات",
|
|
"trashUnavailableConfirm": "لا يمكن نقل هذا العنصر إلى سلة المهملات، عادةً لأنه موجود على نظام ملفات آخر أو يتطلب صلاحيات إدارية. هل تريد حذفه نهائياً بدلاً من ذلك؟",
|
|
"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": "فشل التنزيل",
|
|
"downloadingFile": "جارٍ التنزيل {{name}}…",
|
|
"downloadProgressBytes": "{{transferred}} / {{total}}",
|
|
"moveTo": "نقل إلى {{name}}",
|
|
"diffCompareWith": "مقارنة الاختلافات مع {{name}}",
|
|
"dragOutsideToDownload": "اسحب خارج النافذة للتنزيل ({{count}} ملفات)",
|
|
"newFolderDefault": "مجلد جديد",
|
|
"newFileDefault": "ملف جديد.txt",
|
|
"successfullyMovedItems": "تم نقل {{count}} عناصر بنجاح إلى {{target}}",
|
|
"move": "نقل",
|
|
"searchInFile": "بحث في الملف (Ctrl+F)",
|
|
"showKeyboardShortcuts": "إظهار اختصارات لوحة المفاتيح",
|
|
"decreaseFontSize": "تصغير حجم الخط",
|
|
"increaseFontSize": "تكبير حجم الخط",
|
|
"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": "فشلت المصادقة",
|
|
"incorrectPassphrase": "عبارة المرور غير صحيحة. يرجى المحاولة مرة أخرى.",
|
|
"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": "إظهار/إخفاء الشريط الجانبي",
|
|
"compactLayout": "استخدم تصميمًا مضغوطًا",
|
|
"comfortableLayout": "استخدم تصميمًا مريحًا",
|
|
"cannotLoadPdf": "لا يمكن تحميل PDF",
|
|
"pdfLoadError": "حدث خطأ أثناء تحميل ملف PDF هذا.",
|
|
"loadingPdf": "جارٍ تحميل PDF...",
|
|
"loadingPage": "جارٍ تحميل الصفحة..."
|
|
},
|
|
"transfer": {
|
|
"copyToHost": "نسخ إلى المضيف…",
|
|
"moveToHost": "نقل إلى المضيف…",
|
|
"copyItemsToHost": "نسخ {{count}} عناصر إلى المضيف…",
|
|
"moveItemsToHost": "نقل {{count}} عناصر إلى المضيف…",
|
|
"noHostsConnected": "لا تتوفر مضيفات أخرى لمدير الملفات.",
|
|
"noHostsConnectedHint": "أضف مضيف SSH آخر مع تمكين مدير الملفات في مدير المضيفات.",
|
|
"selectDestinationHost": "تحديد المضيف الوجهة",
|
|
"destinationPath": "مسار الوجهة",
|
|
"recentDestinations": "الوجهات الأخيرة",
|
|
"collapseRecentDestinations": "طي الوجهات الأخيرة",
|
|
"expandRecentDestinations": "توسيع الوجهات الأخيرة",
|
|
"browseFolders": "تصفح مجلدات الوجهة",
|
|
"browseDestination": "تصفح المسار أو أدخله",
|
|
"confirmCopy": "نسخ",
|
|
"confirmMove": "نقل",
|
|
"transferring": "جارٍ النقل…",
|
|
"progressVerifying": "التحقق من سلامة الملف…",
|
|
"progressBenchmarking": "اختيار أسرع مسار نقل…",
|
|
"compressing": "جارٍ الضغط…",
|
|
"extracting": "جارٍ الاستخراج…",
|
|
"transferringItems": "جارٍ نقل {{current}} من {{total}} عناصر…",
|
|
"transferSuccess": "اكتمل النقل",
|
|
"transferError": "فشل النقل",
|
|
"transferPartial": "اكتمل النقل مع {{count}} أخطاء",
|
|
"transferPartialHint": "تعذر النقل: {{paths}}",
|
|
"itemsSummary": "{{count}} عنصر",
|
|
"destMustBeDirectory": "يجب أن تكون الوجهة مجلدًا لنقل عناصر متعددة",
|
|
"selectThisFolder": "تحديد هذا المجلد",
|
|
"browsePathWillBeCreated": "هذا المجلد غير موجود بعد. سيتم إنشاؤه عند بدء النقل.",
|
|
"browsePathError": "تعذر فتح هذا المسار على المضيف الوجهة.",
|
|
"goUp": "للأعلى",
|
|
"copyFolderToHost": "نسخ المجلد إلى المضيف…",
|
|
"moveFolderToHost": "نقل المجلد إلى المضيف…",
|
|
"hostReady": "جاهز",
|
|
"hostConnecting": "جارٍ الاتصال…",
|
|
"hostDisconnected": "غير متصل",
|
|
"hostAuthRequired": "المصادقة مطلوبة — افتح مدير الملفات على هذا المضيف أولاً",
|
|
"hostConnectionFailed": "فشل الاتصال",
|
|
"metricsTitle": "توقيتات النقل",
|
|
"metricsPrepare": "تحضير الوجهة: {{duration}}",
|
|
"metricsCompress": "ضغط على المصدر: {{duration}}",
|
|
"metricsHopSourceRead": "المصدر → الخادم: {{throughput}}",
|
|
"metricsHopDestSftpWrite": "الخادم → الوجهة (SFTP): {{throughput}}",
|
|
"metricsHopDestLocalWrite": "الخادم → الوجهة (محلي): {{throughput}}",
|
|
"metricsTransfer": "نقل شامل: {{throughput}} ({{duration}})",
|
|
"metricsExtract": "فك على الوجهة: {{duration}}",
|
|
"metricsVerify": "تم التحقق من SHA-256: {{duration}}",
|
|
"metricsRouteBenchmark": "مسبار المسار — مباشر: {{direct}}، مرحل: {{relay}}",
|
|
"metricsSourceDelete": "إزالة من المصدر: {{duration}}",
|
|
"metricsTotal": "الإجمالي: {{duration}}",
|
|
"progressCompressing": "جارٍ الضغط على المضيف المصدر…",
|
|
"progressExtracting": "جارٍ الفك على الوجهة…",
|
|
"progressTransferring": "جارٍ نقل البيانات…",
|
|
"progressReconnecting": "جارٍ إعادة الاتصال…",
|
|
"parallelSegmentsLabel": "مسارات النقل المتوازية",
|
|
"parallelSegmentsOption": "{{count}} مسارات",
|
|
"parallelSegmentsHint": "تُقسم الملفات الكبيرة إلى أجزاء بحجم 256 ميغابايت. تستخدم المسارات المتعددة اتصالات منفصلة (مثل بدء عدة عمليات نقل) لتحقيق إنتاجية إجمالية أعلى.",
|
|
"progressTotalSpeed": "{{speed}} إجمالي ({{lanes}} مسارات)",
|
|
"progressTransferringItems": "جارٍ نقل الملفات ({{current}} من {{total}})…",
|
|
"progressBytes": "{{transferred}} / {{total}}",
|
|
"progressItems": "{{current}} / {{total}} ملفات",
|
|
"sourceNotDeletedPartial": "الملفات المصدر محفوظة (نقل جزئي)",
|
|
"jumpHostLimitation": "يجب أن يكون كلا المضيفين قابلين للوصول من خادم Termix. التوجيه المباشر من مضيف إلى مضيف غير مدعوم.",
|
|
"cancel": "إلغاء",
|
|
"methodLabel": "طريقة النقل",
|
|
"methodAuto": "تلقائي",
|
|
"methodTar": "أرشيف Tar",
|
|
"methodItemSftp": "SFTP لكل ملف",
|
|
"methodAutoHint": "يختار tar أو SFTP لكل ملف بناءً على عدد الملفات وحجمها وقابلية الضغط. الملفات المفردة تستخدم دائمًا SFTP التدفقي.",
|
|
"methodTarHint": "ضغط على المصدر، نقل أرشيف واحد، فك على الوجهة. يتطلب tar على كلا المضيفين Unix.",
|
|
"methodItemSftpHint": "نقل كل ملف على حدة عبر SFTP. يعمل على جميع المضيفين بما في ذلك Windows.",
|
|
"methodPreviewLoading": "جارٍ حساب طريقة النقل…",
|
|
"methodPreviewError": "تعذّر معاينة طريقة النقل. سيختار الخادم طريقة عند بدء النقل.",
|
|
"methodPreviewWillUseTar": "سيُستخدم: أرشيف Tar",
|
|
"methodPreviewWillUseItemSftp": "سيُستخدم: SFTP لكل ملف",
|
|
"methodPreviewScanSummary": "{{fileCount}} ملفات، {{totalSize}} إجمالي (تم المسح على المضيف المصدر).",
|
|
"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_many_incompressible": "تلقائي: البيانات غالبًا غير قابلة للضغط — SFTP لكل ملف.",
|
|
"auto_many_files": "تلقائي: عدة ملفات ({{fileCount}}) — يقلل tar الحمل لكل ملف.",
|
|
"auto_default": "تلقائي: SFTP لكل ملف لهذه المجموعة."
|
|
},
|
|
"progressCancel": "إلغاء",
|
|
"progressCancelling": "جارٍ الإلغاء…",
|
|
"progressStalled": "متوقف",
|
|
"resumedHint": "تمت إعادة الاتصال بنقل نشط بدأ في نافذة أخرى.",
|
|
"transferCancelled": "تم إلغاء النقل",
|
|
"transferCancelledCopyHint": "قد تبقى ملفات جزئية على الوجهة.",
|
|
"transferCancelledMoveHint": "قد تبقى ملفات جزئية على الوجهة. لم يتم حذف ملفات المصدر.",
|
|
"cleanupDestFiles": "تنظيف الوجهة",
|
|
"cleanupDestFilesSuccess": "تمت إزالة الملفات الجزئية من الوجهة",
|
|
"cleanupDestFilesPartial": "تعذر إزالة بعض الملفات الجزئية",
|
|
"cleanupDestFilesNothing": "لا شيء للتنظيف على الوجهة",
|
|
"cleanupDestFilesError": "فشل التنظيف",
|
|
"retryTransfer": "إعادة المحاولة",
|
|
"retryTransferError": "فشلت إعادة المحاولة",
|
|
"transferFailedRetryHint": "تم الاحتفاظ بالبيانات الجزئية على الوجهة. ستُستأنف إعادة المحاولة عند عودة الاتصال."
|
|
},
|
|
"sftpTransfer": {
|
|
"title": "SFTP",
|
|
"description": "نقل الملفات بين مضيفين عبر بروتوكول SSH.",
|
|
"sourceServer": "خادم المصدر",
|
|
"destinationServer": "خادم الوجهة",
|
|
"selectHost": "حدد المضيف",
|
|
"noHostSelected": "لم يتم تحديد أي مضيف",
|
|
"move": "يتحرك",
|
|
"copy": "ينسخ",
|
|
"upload": "رفع",
|
|
"itemsSelected": "تم تحديد العنصر {{count}}",
|
|
"itemsSelected_other": "تم تحديد {{count}} عنصر",
|
|
"ready": "مستعد",
|
|
"loadingHosts": "جارٍ تحميل المضيفين...",
|
|
"name": "اسم",
|
|
"modified": "معدل",
|
|
"size": "مقاس",
|
|
"noFiles": "لا توجد ملفات",
|
|
"open": "يفتح",
|
|
"up": "أعلى",
|
|
"refresh": "ينعش",
|
|
"copyToTarget": "انسخ إلى الدليل الهدف",
|
|
"rename": "إعادة تسمية",
|
|
"delete": "يمسح",
|
|
"editPermissions": "تعديل الأذونات",
|
|
"createNewFolder": "إنشاء مجلد جديد",
|
|
"deleteSelectedItems": "حذف العناصر المحددة",
|
|
"deleteConfirm": "حذف العنصر المحدد {{count}}؟",
|
|
"deleteConfirm_other": "حذف {{count}} من العناصر المحددة؟",
|
|
"cancel": "يلغي",
|
|
"save": "يحفظ",
|
|
"folderCreated": "تم إنشاء المجلد",
|
|
"itemRenamed": "تمت إعادة تسمية العنصر",
|
|
"actionFailed": "فشلت العملية",
|
|
"itemsDeleted": "تم حذف العنصر {{count}}",
|
|
"itemsDeleted_other": "تم حذف {{count}} عنصر",
|
|
"deleteFailed": "فشلت عملية الحذف",
|
|
"permissionsUpdated": "تم تحديث الأذونات",
|
|
"noRemoteSessionConnected": "لم يتم الاتصال بأي جلسة عن بعد",
|
|
"failedToListFiles": "فشل في عرض قائمة الملفات",
|
|
"failedToRefresh": "فشل التحديث",
|
|
"destinationInsideSource": "لا يمكن أن تكون الوجهة داخل مسار المصدر المحدد.",
|
|
"sameHostNoOp": "المصدر والوجهة هما نفس المجلد."
|
|
},
|
|
"tunnels": {
|
|
"noSshTunnels": "لا توجد أنفاق SSH",
|
|
"createFirstTunnelMessage": "لم تُنشئ أي أنفاق SSH بعد. قم بتكوين اتصالات الأنفاق في مدير المضيف للبدء.",
|
|
"connected": "متصل",
|
|
"disconnected": "غير متصل",
|
|
"connecting": "جارٍ الاتصال...",
|
|
"error": "خطأ",
|
|
"canceling": "جارٍ الإلغاء...",
|
|
"connect": "اتصل",
|
|
"disconnect": "فصل",
|
|
"cancel": "إلغاء",
|
|
"port": "منفذ",
|
|
"localPort": "المنفذ المحلي",
|
|
"remotePort": "المنفذ البعيد",
|
|
"destinationPort": "ميناء الوجهة",
|
|
"currentHostPort": "منفذ المضيف الحالي",
|
|
"endpointPort": "منفذ النهاية",
|
|
"bindIp": "عنوان IP المحلي",
|
|
"localAddress": "العنوان المحلي",
|
|
"remoteAddress": "عنوان بعيد",
|
|
"destinationAddress": "عنوان الوجهة",
|
|
"remoteBindAddress": "عنوان الربط عن بعد",
|
|
"intermediateHost": "المضيف الوسيط",
|
|
"endpointSshConfig": "إعدادات SSH للنهاية",
|
|
"endpointSshHost": "مضيف SSH للنهاية",
|
|
"endpointSshHostPlaceholder": "اختر مضيفًا مُعيّنًا",
|
|
"endpointSshHostRequired": "اختر مضيف SSH للنهاية لكل نفق عميل.",
|
|
"attempt": "محاولة {{current}} من {{max}}",
|
|
"nextRetryIn": "إعادة المحاولة التالية في {{seconds}} ثانية",
|
|
"clientTunnels": "أنفاق العميل",
|
|
"clientTunnel": "نفق العميل",
|
|
"addClientTunnel": "إضافة نفق عميل",
|
|
"noClientTunnels": "لا توجد أنفاق عميل مُعدّة على سطح المكتب هذا.",
|
|
"tunnelName": "اسم النفق",
|
|
"remoteHost": "المضيف البعيد",
|
|
"autoStart": "بدء تلقائي",
|
|
"clientAutoStartDesc": "يبدأ عند فتح عميل سطح المكتب هذا ويبقى متصلاً.",
|
|
"clientManualStartDesc": "استخدم بدء وإيقاف من هذا الصف. لن يقوم Termix بفتحه تلقائيًا.",
|
|
"clientRemoteServerNote": "قد يتطلب التوجيه البعيد AllowTcpForwarding و GatewayPorts على خادم SSH للنهاية. يُغلق المنفذ البعيد عند فصل سطح المكتب هذا.",
|
|
"clientTunnelStarted": "تم بدء نفق العميل",
|
|
"clientTunnelStopped": "تم إيقاف نفق العميل",
|
|
"tunnelTestSucceeded": "نجح اختبار النفق",
|
|
"tunnelTestFailed": "فشل اختبار النفق",
|
|
"localSaved": "تم حفظ أنفاق العميل",
|
|
"localSaveError": "فشل حفظ أنفاق العميل المحلية",
|
|
"invalidBindIp": "يجب أن يكون عنوان IP المحلي عنوان IPv4 صالحًا.",
|
|
"invalidLocalTargetIp": "يجب أن يكون عنوان IP الهدف المحلي عنوان IPv4 صالحًا.",
|
|
"invalidRemoteAddress": "يلزم وجود عنوان بعيد.",
|
|
"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}}.",
|
|
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{remoteHost}}:{{remotePort}} عبر {{endpoint}}",
|
|
"summaryClientRemote": "{{remoteHost}}:{{remotePort}} on {{endpoint}} → {{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": "جارٍ العمل..."
|
|
},
|
|
"cardGrid": {
|
|
"dragToMove": "اسحب للنقل",
|
|
"dragToResize": "اسحب لتغيير الحجم",
|
|
"changeWidth": "تغيير العرض",
|
|
"removeCard": "إزالة {{label}}",
|
|
"addCard": "إضافة",
|
|
"columns": "الأعمدة",
|
|
"empty": "لا توجد بطاقات. استخدم زر 'إضافة' أدناه لوضع البطاقات."
|
|
},
|
|
"hostMetrics": {
|
|
"cpu": "المعالج",
|
|
"memory": "الذاكرة",
|
|
"disk": "القرص",
|
|
"network": "الشبكة",
|
|
"uptime": "مدة التشغيل",
|
|
"processes": "العمليات",
|
|
"available": "المتاح",
|
|
"free": "الخالي",
|
|
"connecting": "جارٍ الاتصال...",
|
|
"connectionFailed": "فشل الاتصال بالخادم",
|
|
"naCpus": "غير متوفر",
|
|
"cpuCores_one": "{{count}} نواة",
|
|
"cpuCores_other": "{{count}} نوى",
|
|
"cpuUsage": "استخدام المعالج",
|
|
"memoryUsage": "استخدام الذاكرة",
|
|
"diskUsage": "استخدام القرص",
|
|
"selectFilesystem": "حدد نظام الملفات",
|
|
"temperature": "درجة الحرارة",
|
|
"highestTemperature": "أعلى درجة حرارة",
|
|
"primaryTemperatureSensor": "المستشعر الأساسي",
|
|
"gpu": {
|
|
"title": "وحدة معالجة الرسومات",
|
|
"noDevice": "لم يتم الكشف عن وحدة معالجة رسومات NVIDIA. قم بتثبيت برنامج تشغيل NVIDIA (يوفر nvidia-smi) لعرض مقاييس وحدة معالجة الرسومات.",
|
|
"driver": "السائق {{version}}",
|
|
"utilization": "استخدام",
|
|
"memory": "ذاكرة الوصول العشوائي للفيديو",
|
|
"temperature": "درجة حرارة",
|
|
"power": "قوة",
|
|
"fan": "معجب",
|
|
"processes": "عمليات وحدة معالجة الرسومات",
|
|
"noProcesses": "لا توجد عمليات تستخدم وحدة معالجة الرسومات (GPU)."
|
|
},
|
|
"failedToFetchHostConfig": "فشل جلب تكوين المضيف",
|
|
"serverOffline": "الخادم غير متصل",
|
|
"cannotFetchMetrics": "لا يمكن جلب المؤشرات من خادم غير متصل",
|
|
"totpFailed": "فشل التحقق من TOTP",
|
|
"noneAuthNotSupported": "مقاييس المضيف لا تدعم نوع المصادقة 'none'.",
|
|
"noHostSelected": "لم يتم تحديد مضيف",
|
|
"load": "الحمل",
|
|
"systemInfo": "معلومات النظام",
|
|
"hostname": "اسم المضيف",
|
|
"operatingSystem": "نظام التشغيل",
|
|
"kernel": "النواة",
|
|
"seconds": "ثوانٍ",
|
|
"networkInterfaces": "واجهات الشبكة",
|
|
"noInterfacesFound": "لم يتم العثور على واجهات شبكة",
|
|
"noProcessesFound": "لم يتم العثور على عمليات",
|
|
"processesTotal": "الإجمالي",
|
|
"processesRunning": "قيد التشغيل",
|
|
"loginStats": "إحصائيات تسجيل الدخول عبر SSH",
|
|
"noRecentLoginData": "لا توجد بيانات تسجيل دخول حديثة",
|
|
"executingQuickAction": "جارٍ تنفيذ {{name}}...",
|
|
"quickActionSuccess": "تم إكمال {{name}} بنجاح",
|
|
"quickActionFailed": "فشل {{name}}",
|
|
"quickActionError": "فشل تنفيذ {{name}}",
|
|
"ports": {
|
|
"title": "المنافذ المستمعة",
|
|
"protocol": "البروتوكول",
|
|
"port": "المنفذ",
|
|
"address": "العنوان",
|
|
"process": "العملية",
|
|
"search": "بحث في المنافذ...",
|
|
"allProtocols": "الكل",
|
|
"noData": "لا توجد بيانات للمنافذ المستمعة"
|
|
},
|
|
"firewall": {
|
|
"title": "جدار الحماية",
|
|
"inactive": "غير نشط",
|
|
"policy": "السياسة",
|
|
"rules": "قواعد",
|
|
"noRules": "لا توجد قواعد في هذه السلسلة",
|
|
"noData": "لا توجد بيانات لجدار الحماية",
|
|
"action": "الإجراء",
|
|
"protocol": "البروتوكول",
|
|
"port": "المنفذ",
|
|
"source": "المصدر",
|
|
"anywhere": "أي مكان",
|
|
"chains": "السلاسل"
|
|
},
|
|
"loadAvg": "متوسط التحميل",
|
|
"swap": "التبديل",
|
|
"architecture": "المعمارية",
|
|
"refresh": "تحديث",
|
|
"retry": "إعادة المحاولة",
|
|
"customize": "تخصيص التخطيط",
|
|
"reset": "إعادة تعيين",
|
|
"tabLive": "مباشر",
|
|
"editModeInstructions": "اسحب البطاقات لإعادة ترتيبها، واسحب الحافة السفلية لتغيير حجمها، واستخدم زر العرض لتغيير امتداد البطاقة. أضف البطاقات أو أزلها أدناه.",
|
|
"managers": {
|
|
"services": "الخدمات",
|
|
"processInspector": "مفتش العمليات",
|
|
"logViewer": "عارض السجلات",
|
|
"cron": "مهام كرون",
|
|
"packages": "الحزم",
|
|
"ssl": "شهادات SSL",
|
|
"firewall": "جدار الحماية",
|
|
"users": "المستخدمون والأذونات",
|
|
"healthCheck": "فحوصات الصحة",
|
|
"diskBreakdown": "تفصيل القرص",
|
|
"systemdTimers": "المؤقتات",
|
|
"topMemory": "الأعلى استهلاكًا للذاكرة",
|
|
"noData": "لا توجد بيانات",
|
|
"sudoHint": "قم بتعيين كلمة مرور sudo لهذا المضيف في محرر المضيف لتمكين الإجراءات المميزة.",
|
|
"filter": "تصفية...",
|
|
"start": "بدء",
|
|
"stop": "إيقاف",
|
|
"restart": "إعادة تشغيل",
|
|
"actionDone": "تم تحديث {{name}}",
|
|
"actionFailed": "فشل الإجراء",
|
|
"signalSent": "تم إرسال إشارة إلى PID {{pid}}",
|
|
"killHint": "نقرة: إنهاء (SIGTERM). نقرة بزر الماوس الأيمن: إنهاء إجباري (SIGKILL).",
|
|
"working": "جارٍ العمل...",
|
|
"update": "تحديث",
|
|
"upgradeAll": "ترقية الكل",
|
|
"allUpToDate": "كل شيء محدث",
|
|
"save": "حفظ",
|
|
"command": "أمر",
|
|
"enabled": "مفعل",
|
|
"cronSaved": "تم تحديث crontab",
|
|
"clients": "العملاء",
|
|
"dryRun": "تشغيل تجريبي",
|
|
"renew": "تجديد",
|
|
"noAcmeClient": "لم يتم العثور على عميل ACME (certbot أو acme.sh) على هذا المضيف.",
|
|
"addInputRule": "إضافة قاعدة INPUT",
|
|
"firewallWarning": "التغييرات مؤقتة حتى يتم حفظها. احذر من قفل وصولك.",
|
|
"ruleApplied": "تم تطبيق القاعدة",
|
|
"invalidPort": "أدخل منفذًا صالحًا (1-65535)",
|
|
"newUsername": "اسم مستخدم جديد",
|
|
"addUser": "إضافة",
|
|
"deleteUser": "حذف المستخدم",
|
|
"noHealthChecks": "لم يتم تكوين فحوصات الصحة بعد.",
|
|
"follow": "متابعة",
|
|
"noLogData": "لا توجد مخرجات سجل.",
|
|
"tree": "شجري",
|
|
"enableDisable": "تفعيل / تعطيل عند الإقلاع",
|
|
"grantSudo": "منح sudo",
|
|
"revokeSudo": "سحب sudo",
|
|
"sslIssueCert": "إصدار شهادة",
|
|
"sslExpired": "منتهية الصلاحية",
|
|
"sslInDays": "خلال {{days}} يومًا",
|
|
"sslNeedDomain": "أدخل نطاقًا واحدًا على الأقل",
|
|
"sslIssued": "تم إصدار الشهادة",
|
|
"sslDomainsPlaceholder": "example.com, www.example.com",
|
|
"sslHttpStandalone": "HTTP (مستقل)",
|
|
"sslHttpWebroot": "HTTP (webroot)",
|
|
"sslDns": "DNS",
|
|
"sslDnsProvider": "مزود DNS (مثل cloudflare)",
|
|
"sslIssueHint": "يجب أن تكون بيانات اعتماد مزود DNS قد تم تكوينها مسبقًا على المضيف.",
|
|
"sslRevoke": "إلغاء الشهادة",
|
|
"sslRevoked": "تم إلغاء الشهادة",
|
|
"sslRevokeConfirm": "هل تريد إلغاء الشهادة \"{{name}}\" وإزالتها؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"healthRun": "تشغيل",
|
|
"healthName": "الاسم",
|
|
"healthTarget": "المضيف / العنوان",
|
|
"healthAddCheck": "إضافة فحص",
|
|
"healthSaved": "تم حفظ فحوصات الصحة",
|
|
"healthMissingFields": "يتطلب كل فحص اسمًا وهدفًا",
|
|
"logFile": "ملف",
|
|
"logUnit": "وحدة",
|
|
"logCustomPath": "مسار مخصص تحت /var/log (اختياري)",
|
|
"logGrep": "تصفية السطور...",
|
|
"firewallPersist": "حفظ القواعد",
|
|
"firewallPersisted": "تم حفظ قواعد جدار الحماية",
|
|
"wireguard": "WireGuard",
|
|
"tailscale": "Tailscale",
|
|
"wgNotInstalled": "WireGuard غير مثبت على هذا المضيف",
|
|
"wgNoInterfaces": "لا توجد واجهات WireGuard مُعدّة",
|
|
"wgInterfaceUp": "رفع",
|
|
"wgInterfaceDown": "إنزال",
|
|
"wgBringingUp": "جارٍ رفع {{name}}...",
|
|
"wgBringingDown": "جارٍ إنزال {{name}}...",
|
|
"wgInterfaceUpDone": "{{name}} مرفوع",
|
|
"wgInterfaceDownDone": "{{name}} منزّل",
|
|
"wgListenPort": "المنفذ",
|
|
"wgPublicKey": "المفتاح العام",
|
|
"wgEndpoint": "نقطة النهاية",
|
|
"wgAllowedIPs": "عناوين IP المسموح بها",
|
|
"wgLastHandshake": "آخر مصافحة",
|
|
"wgHandshakeNever": "أبدًا",
|
|
"wgTransfer": "نقل",
|
|
"tsNotInstalled": "Tailscale غير مثبت على هذا المضيف",
|
|
"tsRunning": "يعمل",
|
|
"tsStopped": "متوقف",
|
|
"tsEnable": "اتصل",
|
|
"tsDisable": "افصل",
|
|
"tsEnabling": "جارٍ الاتصال بـ Tailscale...",
|
|
"tsDisabling": "جارٍ قطع الاتصال بـ Tailscale...",
|
|
"tsEnabled": "Tailscale متصل",
|
|
"tsDisabled": "Tailscale غير متصل",
|
|
"tsIPs": "عناوين IP لـ Tailscale",
|
|
"tsPeers": "الأقران",
|
|
"tsOnline": "متصل",
|
|
"tsOffline": "غير متصل",
|
|
"tsExitNode": "عقدة خروج",
|
|
"tsExitNodeActive": "عقدة خروج نشطة",
|
|
"tsHostname": "اسم المضيف"
|
|
}
|
|
},
|
|
"proxmoxStats": {
|
|
"tabTitle": "إحصائيات Proxmox",
|
|
"cpuUsage": "استخدام وحدة المعالجة المركزية",
|
|
"memoryUsage": "استخدام الذاكرة",
|
|
"diskUsage": "استخدام القرص",
|
|
"networkInterfaces": "واجهات الشبكة",
|
|
"uptime": "وقت التشغيل",
|
|
"systemInfo": "معلومات النظام",
|
|
"guestsSummary": "الضيوف",
|
|
"storagePools": "أحواض التخزين",
|
|
"clusterHealth": "الصحة العنقودية",
|
|
"cpuCores_one": "{{count}} النواة",
|
|
"cpuCores_other": "{{count}} النوى",
|
|
"used": "مستخدم",
|
|
"total": "المجموع",
|
|
"hostname": "اسم المضيف",
|
|
"kernel": "النواة",
|
|
"pveVersion": "إصدار لاعب ضد البيئة",
|
|
"name": "اسم",
|
|
"status": "حالة",
|
|
"type": "يكتب",
|
|
"cpu": "وحدة المعالجة المركزية",
|
|
"mem": "ميم",
|
|
"disk": "أدك",
|
|
"running": "جري",
|
|
"stopped": "توقف",
|
|
"guestCounts": "{{running}}/{{total}} قيد التشغيل",
|
|
"inactive": "غير نشط",
|
|
"notClustered": "عقدة مستقلة (ليست جزءًا من مجموعة)",
|
|
"quorate": "اقتبس",
|
|
"notQuorate": "غير مكتمل النصاب",
|
|
"nodeOnline": "متصل",
|
|
"nodeOffline": "غير متصل بالإنترنت",
|
|
"noHostSelected": "لم يتم تحديد أي مضيف",
|
|
"pveshNotFound": "لم يتم العثور على pvesh - هل هذه عقدة Proxmox؟",
|
|
"nodeDetectionFailed": "تعذر تحديد اسم عقدة Proxmox صالح",
|
|
"connecting": "جارٍ الاتصال...",
|
|
"connectionFailed": "فشل الاتصال بعقدة Proxmox",
|
|
"refresh": "ينعش",
|
|
"searchGuests": "ابحث عن الضيوف...",
|
|
"filterAll": "الجميع",
|
|
"filterVm": "آلة افتراضية",
|
|
"filterLxc": "LXC",
|
|
"noGuests": "لم يتم العثور على أي أجهزة افتراضية أو حاويات LXC على هذه العقدة.",
|
|
"noGuestsMatch": "لا يوجد ضيوف يطابقون المعايير الحالية."
|
|
},
|
|
"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.",
|
|
"loginWithProvider": "تسجيل الدخول باستخدام {{name}}",
|
|
"orContinueWith": "أو المتابعة باستخدام",
|
|
"ldapUsername": "اسم مستخدم LDAP",
|
|
"ldapPassword": "كلمة مرور LDAP",
|
|
"ldapSignIn": "تسجيل الدخول",
|
|
"ldapLoginFailed": "فشل تسجيل الدخول عبر LDAP",
|
|
"resetPasswordButton": "إعادة تعيين كلمة المرور",
|
|
"sendResetCode": "إرسال رمز إعادة التعيين",
|
|
"resetCodeDesc": "أدخل اسم المستخدم لتلقي رمز إعادة تعيين كلمة المرور. سيتم تسجيل الرمز في سجلات حاوية docker.",
|
|
"resetCode": "رمز إعادة التعيين",
|
|
"verifyCodeButton": "التحقق من الرمز",
|
|
"enterResetCode": "أدخل الرمز المكون من 6 أرقام من سجلات حاوية docker للمستخدم:",
|
|
"newPassword": "كلمة المرور الجديدة",
|
|
"confirmNewPassword": "تأكيد كلمة المرور",
|
|
"enterNewPassword": "أدخل كلمة المرور الجديدة للمستخدم:",
|
|
"signUp": "إنشاء حساب",
|
|
"desktopApp": "تطبيق سطح المكتب",
|
|
"loggingInToDesktopApp": "تسجيل الدخول إلى تطبيق سطح المكتب",
|
|
"loadingServer": "جارٍ تحميل الخادم...",
|
|
"dataLossWarning": "ستؤدي إعادة تعيين كلمة المرور بهذه الطريقة إلى حذف جميع مضيفي SSH المحفوظين وبيانات الاعتماد والبيانات المشفرة الأخرى. لا يمكن التراجع عن هذا الإجراء. استخدم هذا فقط إذا نسيت كلمة المرور ولم تقم بتسجيل الدخول.",
|
|
"authenticationDisabled": "المصادقة معطلة",
|
|
"authenticationDisabledDesc": "جميع طرق المصادقة معطلة حاليًا. الرجاء الاتصال بالمسؤول.",
|
|
"passwordLoginDisabledDesc": "تسجيل الدخول بكلمة المرور معطل. استخدم مفتاح مرور أو مزود مصادقة خارجي.",
|
|
"signInWithPasskey": "تسجيل الدخول باستخدام مفتاح المرور",
|
|
"passkeyLoginFailed": "فشل تسجيل الدخول بمفتاح المرور",
|
|
"attemptsRemaining": "{{count}} محاولات متبقية",
|
|
"confirmResetDataWipe": "لم يتم تسجيل الدخول إلى هذا الحساب منذ ترقية التشفير، لذا لا يمكن استرداد البيانات المخزنة بدون كلمة المرور القديمة. ستؤدي إعادة التعيين إلى حذف المضيفات وبيانات الاعتماد والمقتطفات بشكل دائم. هل تريد المتابعة؟"
|
|
},
|
|
"hostKey": {
|
|
"verifyNewHost": "تحقق من مفتاح مضيف SSH",
|
|
"keyChangedWarning": "تم تغيير مفتاح مضيف SSH",
|
|
"firstConnectionTitle": "أول اتصال بهذا المضيف",
|
|
"firstConnectionDescription": "لا يمكن التحقق من صحة هذا المضيف. تحقق من تطابق البصمة مع ما تتوقعه.",
|
|
"keyChangedDescription": "لقد تغير مفتاح المضيف لهذا الخادم منذ آخر اتصال. قد يشير ذلك إلى مشكلة أمنية.",
|
|
"previousKey": "المفتاح السابق",
|
|
"newFingerprint": "البصمة الجديدة",
|
|
"fingerprint": "البصمة",
|
|
"verifyInstructions": "إذا كنت تثق بهذا المضيف، فانقر على قبول للمتابعة وحفظ هذه البصمة للاتصالات المستقبلية.",
|
|
"securityWarning": "تحذير أمني",
|
|
"acceptAndContinue": "قبول ومتابعة",
|
|
"acceptNewKey": "قبول المفتاح الجديد والمتابعة"
|
|
},
|
|
"errors": {
|
|
"databaseConnection": "تعذر الاتصال بقاعدة البيانات",
|
|
"embeddedServerFailed": "تعذر بدء تشغيل الخادم المحلي لـ Termix",
|
|
"unknownError": "خطأ غير معروف",
|
|
"loginFailed": "فشل تسجيل الدخول",
|
|
"failedPasswordReset": "فشل بدء إعادة تعيين كلمة المرور",
|
|
"failedVerifyCode": "فشل التحقق من رمز إعادة التعيين",
|
|
"failedCompleteReset": "فشل إكمال إعادة تعيين كلمة المرور",
|
|
"invalidTotpCode": "رمز TOTP غير صالح",
|
|
"failedOidcLogin": "فشل بدء تسجيل الدخول عبر OIDC",
|
|
"silentSigninOidcUnavailable": "تم طلب تسجيل الدخول الصامت، لكن تسجيل الدخول عبر OIDC غير متاح.",
|
|
"failedUserInfo": "فشل الحصول على معلومات المستخدم بعد تسجيل الدخول",
|
|
"oidcAuthFailed": "فشلت مصادقة OIDC",
|
|
"invalidAuthUrl": "تم استلام عنوان URL تفويض غير صالح من الخادم الخلفي",
|
|
"requiredField": "هذا الحقل مطلوب",
|
|
"minLength": "الحد الأدنى للطول هو {{min}}",
|
|
"passwordMismatch": "كلمات المرور غير متطابقة",
|
|
"passwordLoginDisabled": "تسجيل الدخول باسم المستخدم وكلمة المرور معطل حالياً",
|
|
"sessionExpired": "انتهت الجلسة - يرجى تسجيل الدخول مرة أخرى",
|
|
"totpRateLimited": "تم تقييد المعدل: عدد كبير جدًا من محاولات التحقق من TOTP. يرجى المحاولة مرة أخرى لاحقًا.",
|
|
"totpRateLimitedWithTime": "تم تقييد المعدل: عدد كبير جدًا من محاولات التحقق من TOTP. يرجى الانتظار {{time}} ثانية قبل المحاولة مرة أخرى.",
|
|
"resetCodeRateLimited": "تم تقييد المعدل: عدد كبير جدًا من محاولات التحقق. يرجى المحاولة مرة أخرى لاحقًا.",
|
|
"resetCodeRateLimitedWithTime": "محدودية المعدل: عدد كبير جداً من محاولات التحقق. يرجى الانتظار {{time}} ثانية قبل المحاولة مرة أخرى.",
|
|
"authTokenSaveFailed": "فشل في حفظ رمز المصادقة",
|
|
"authTokenMissing": "لم يُرسل الخادم رمز مصادقة جديدًا. يُرجى تسجيل الدخول مرة أخرى.",
|
|
"authTokenRejected": "رفض الخادم البعيد رمز المصادقة الجديد",
|
|
"keyringUnavailable": "تم تسجيل الدخول، ولكن تعذر حفظ الجلسة: لا يتوفر لدى هذا النظام سلسلة مفاتيح لتشفيرها. شغّل خدمة سرية (مثل gnome-keyring أو KWallet) وسجّل الدخول مرة أخرى.",
|
|
"failedToLoadServer": "فشل في تحميل الخادم",
|
|
"remoteServerRequired": "يلزم وجود خادم بعيد. قم بتوصيل خادم بعيد في الإعدادات لاستخدام نوع الاتصال هذا."
|
|
},
|
|
"messages": {
|
|
"registrationDisabled": "تسجيل الحسابات الجديدة معطل حالياً من قبل المسؤول. يرجى تسجيل الدخول أو الاتصال بالمسؤول.",
|
|
"userNotAllowed": "حسابك غير مخول بالتسجيل. يرجى الاتصال بالمسؤول.",
|
|
"databaseConnectionFailed": "فشل الاتصال بخادم قاعدة البيانات",
|
|
"embeddedServerPortInUse": "المنفذ {{port}} قيد الاستخدام بالفعل من قِبل برنامج آخر. عادةً ما يكون هذا حاوية Docker خاصة بـ Termix أو عملية Termix متبقية من جلسة سابقة. أغلقه، ثم أعد تشغيل Termix.",
|
|
"embeddedServerPortInUseUnknownPort": "أحد المنافذ التي يحتاجها برنامج Termix قيد الاستخدام بالفعل من قبل برنامج آخر. أغلق البرنامج الذي يستخدمه، ثم أعد تشغيل Termix.",
|
|
"embeddedServerCrashed": "توقف الخادم المحلي بشكل غير متوقع. أعد تشغيل Termix، وتحقق من سجل سطح المكتب إذا استمر هذا الأمر.",
|
|
"resetCodeSent": "تم إرسال رمز إعادة التعيين إلى سجلات Docker",
|
|
"codeVerified": "تم التحقق من الرمز بنجاح",
|
|
"passwordResetSuccess": "تمت إعادة تعيين كلمة المرور بنجاح",
|
|
"loginSuccess": "تم تسجيل الدخول بنجاح",
|
|
"registrationSuccess": "تم التسجيل بنجاح"
|
|
},
|
|
"profile": {
|
|
"c2sTunnelConfigDesc": "أنفاق سطح المكتب المحلية التي تستهدف مضيفي SSH المكونين.",
|
|
"c2sTunnelPresets": "إعدادات النفق المُسبَقة للعميل",
|
|
"c2sTunnelPresetsDesc": "احفظ قائمة الأنفاق المحلية لعميل سطح المكتب هذا كإعداد مُسبَق مسمى على الخادم، أو حمّل إعداداً مُسبَقاً إلى هذا العميل.",
|
|
"c2sTunnelPresetsUnavailable": "إعدادات النفق المُسبَقة للعميل متاحة فقط في تطبيق سطح المكتب.",
|
|
"c2sPresetName": "اسم الإعداد المُسبَق",
|
|
"c2sPresetNamePlaceholder": "اسم الإعداد المُسبَق للعميل",
|
|
"c2sPresetToLoad": "الإعداد المُسبَق للتحميل",
|
|
"c2sNoPresetSelected": "لم يتم تحديد إعداد مُسبَق",
|
|
"c2sNoPresets": "لا توجد إعدادات مُسبَقة محفوظة",
|
|
"c2sLoadPreset": "تحميل",
|
|
"c2sCurrentLocalConfig": "تم تكوين {{count}} نفق محلي للعميل على سطح المكتب هذا.",
|
|
"c2sPresetSyncNote": "الإعدادات المُسبَقة هي لقطات واضحة؛ تحميل أحدها يستبدل قائمة الأنفاق المحلية لعميل سطح المكتب هذا.",
|
|
"c2sPresetSaved": "تم حفظ الإعداد المُسبَق لنفق العميل",
|
|
"c2sPresetLoaded": "تم تحميل الإعداد المُسبَق لنفق العميل محلياً",
|
|
"c2sPresetRenamed": "تمت إعادة تسمية الإعداد المُسبَق لنفق العميل",
|
|
"c2sPresetDeleted": "تم حذف الإعداد المُسبَق لنفق العميل",
|
|
"c2sPresetLoadError": "فشل في تحميل إعدادات نفق العميل المُسبَقة"
|
|
},
|
|
"placeholders": {
|
|
"maxRetries": "3",
|
|
"retryInterval": "10",
|
|
"language": "اللغة",
|
|
"keyPassword": "كلمة مرور المفتاح",
|
|
"pastePrivateKey": "الصق مفتاحك الخاص هنا...",
|
|
"localListenerHost": "127.0.0.1 (استماع محلي)",
|
|
"localTargetHost": "127.0.0.1 (الهدف على هذا الكمبيوتر)",
|
|
"remoteTargetHost": "127.0.0.1 (الهدف من نقطة النهاية)",
|
|
"remoteBindHost": "127.0.0.1 (الاستماع على نقطة النهاية)",
|
|
"socksListenerHost": "127.0.0.1 (مستمع SOCKS)",
|
|
"enterPassword": "أدخل كلمة المرور",
|
|
"defaultPort": "22",
|
|
"defaultEndpointPort": "224"
|
|
},
|
|
"dashboard": {
|
|
"title": "لوحة التحكم",
|
|
"loading": "جارٍ تحميل لوحة التحكم...",
|
|
"github": "GitHub",
|
|
"support": "الدعم",
|
|
"discord": "Discord",
|
|
"docs": "المستندات",
|
|
"donate": "تبرع",
|
|
"serverOverview": "نظرة عامة على الخادم",
|
|
"version": "الإصدار",
|
|
"upToDate": "مُحدَّث",
|
|
"updateAvailable": "تحديث متاح",
|
|
"beta": "بيتا",
|
|
"uptime": "مدة التشغيل",
|
|
"database": "قاعدة البيانات",
|
|
"healthy": "سليم",
|
|
"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": "إحصائيات الخادم",
|
|
"panelMain": "الرئيسية",
|
|
"panelSide": "الجانبية",
|
|
"justNow": "للتو",
|
|
"serviceLinks": "روابط الخدمات",
|
|
"homepagePreview": "معاينة الصفحة الرئيسية"
|
|
},
|
|
"donation": {
|
|
"title": "هل تستمتع بـ Termix؟",
|
|
"body": "Termix هو برنامج مجاني ومفتوح المصدر، تم بناؤه وصيانته بواسطة فريق مكون من شخصين في وقت فراغنا. إذا كان قد استبدل أداة تجارية كنت ستضطر لدفع ثمنها، فالتبرع يساعد في تغطية تكاليف الاستضافة ويحافظ على استمرار التطوير. حتى الآن، التبرعات مقبولة بالعملات المشفرة فقط.",
|
|
"milestones": "تساعد التبرعات أيضًا في تمويل الوقت اللازم للبحث والتعلم لبناء ميزات مثل دعم SAML و Kubernetes. يمكنك الاطلاع على التقدم في صفحة التبرع.",
|
|
"cta": "تبرع",
|
|
"dismiss": "ربما لاحقًا"
|
|
},
|
|
"dashboardTab": {
|
|
"stable": "مستقر",
|
|
"hostsOnline": "المضيفون المتصلون",
|
|
"activeTunnels": "الأنفاق النشطة",
|
|
"registerNewServer": "تسجيل خادم جديد",
|
|
"storeSshKeysOrPasswords": "تخزين مفاتيح SSH أو كلمات المرور",
|
|
"manageUsersAndRoles": "إدارة المستخدمين والأدوار",
|
|
"manageYourAccount": "إدارة حسابك",
|
|
"hostStatus": "حالة المضيف",
|
|
"noHostsConfigured": "لم يتم تكوين أي مضيفين",
|
|
"online": "متصل",
|
|
"offline": "غير متصل",
|
|
"checking": "جارٍ التحقق",
|
|
"onlineLower": "متصل",
|
|
"nodes": "{{count}} عقدة",
|
|
"add": "إضافة:",
|
|
"commandPalette": "لوحة الأوامر",
|
|
"done": "تم",
|
|
"editModeInstructions": "اسحب البطاقات لإعادة الترتيب · اسحب مقسم العمود لتغيير حجم الأعمدة · اسحب الحافة السفلية للبطاقة لتغيير ارتفاعها · اسحب إلى سلة المهملات للإزالة",
|
|
"empty": "فارغ",
|
|
"clear": "مسح",
|
|
"serviceLinksTitle": "روابط الخدمات",
|
|
"serviceLinksEmpty": "لا توجد روابط خدمات بعد",
|
|
"serviceLinksAddLabel": "التسمية",
|
|
"serviceLinksAddUrl": "URL",
|
|
"serviceLinksAdd": "إضافة",
|
|
"serviceLinksLabelPlaceholder": "خدمتي",
|
|
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
|
|
"serviceLinksInvalidUrl": "أدخل عنوان ويب صالح",
|
|
"serviceLinksAddFailed": "فشل في إضافة رابط الخدمة",
|
|
"disk": "القرص",
|
|
"viewServerDetails": "عرض تفاصيل الخادم"
|
|
},
|
|
"sessionLogs": {
|
|
"title": "سجلات الجلسات",
|
|
"noLogs": "لا توجد سجلات جلسات بعد",
|
|
"noLogsDesc": "فعّل تسجيل الجلسات على مضيف لبدء التسجيل",
|
|
"duration": "المدة",
|
|
"viewLog": "عرض السجل",
|
|
"downloadLog": "تنزيل",
|
|
"downloadAsText": "تنزيل كنص",
|
|
"deleteLog": "حذف",
|
|
"confirmDelete": "حذف سجل الجلسة هذا؟",
|
|
"confirmDeleteDesc": "لا يمكن التراجع عن هذا الإجراء.",
|
|
"copyContent": "نسخ",
|
|
"copied": "تم النسخ!",
|
|
"loadError": "فشل في تحميل سجلات الجلسات",
|
|
"deleteError": "فشل في حذف سجل الجلسة",
|
|
"filterByHost": "تصفية حسب المضيف..."
|
|
},
|
|
"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": "IP",
|
|
"status": "الحالة",
|
|
"failedToAddNode": "فشل في إضافة العقدة",
|
|
"sourceDifferentFromTarget": "يجب أن يكون المصدر والهدف مختلفين",
|
|
"exportJSON": "تصدير JSON",
|
|
"importJSON": "استيراد JSON",
|
|
"terminal": "الطرفية",
|
|
"fileManager": "مدير الملفات",
|
|
"tunnel": "نفق",
|
|
"docker": "Docker",
|
|
"serverStats": "مقاييس المضيف",
|
|
"hostMetrics": "مقاييس المضيف",
|
|
"noNodes": "لا توجد عُقد بعد"
|
|
},
|
|
"docker": {
|
|
"notEnabled": "Docker غير مفعّل لهذا المضيف",
|
|
"validating": "جارٍ التحقق من Docker...",
|
|
"connecting": "جارٍ الاتصال...",
|
|
"error": "خطأ",
|
|
"version": "{{runtime}} {{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": "استخدام CPU",
|
|
"current": "الحالي",
|
|
"memoryUsage": "استخدام الذاكرة",
|
|
"networkIo": "الإدخال/الإخراج للشبكة",
|
|
"input": "إدخال",
|
|
"output": "المخرجات",
|
|
"blockIo": "الإدخال/الإخراج الكتلي",
|
|
"read": "قراءة",
|
|
"write": "كتابة",
|
|
"pids": "PIDs",
|
|
"containerInformation": "معلومات الحاوية",
|
|
"name": "الاسم",
|
|
"id": "المعرف",
|
|
"state": "الحالة",
|
|
"containerMustBeRunning": "يجب أن تكون الحاوية قيد التشغيل للوصول إلى وحدة التحكم",
|
|
"verificationCodePrompt": "أدخل رمز التحقق",
|
|
"totpVerificationFailed": "فشل التحقق من TOTP. يرجى المحاولة مرة أخرى.",
|
|
"warpgateVerificationFailed": "فشلت مصادقة Warpgate. يرجى المحاولة مرة أخرى.",
|
|
"connectedTo": "متصل بـ {{containerName}}",
|
|
"disconnected": "تم قطع الاتصال",
|
|
"consoleError": "خطأ في وحدة التحكم",
|
|
"errorMessage": "خطأ: {{message}}",
|
|
"failedToConnect": "فشل الاتصال بالحاوية",
|
|
"console": "وحدة التحكم",
|
|
"selectShell": "اختر الصدفة",
|
|
"bash": "Bash",
|
|
"sh": "sh",
|
|
"ash": "ash",
|
|
"connect": "اتصل",
|
|
"disconnect": "قطع الاتصال",
|
|
"notConnected": "غير متصل",
|
|
"clickToConnect": "انقر فوق 'اتصل' لبدء جلسة صدفة",
|
|
"connectingTo": "جارٍ الاتصال بـ {{containerName}}...",
|
|
"containerNotFound": "الحاوية غير موجودة",
|
|
"backToList": "عودة إلى القائمة",
|
|
"logs": "السجلات",
|
|
"stats": "الإحصائيات",
|
|
"consoleTab": "وحدة التحكم",
|
|
"startContainerToAccess": "ابدأ تشغيل الحاوية للوصول إلى وحدة التحكم"
|
|
},
|
|
"admin": {
|
|
"sectionGeneral": "عام",
|
|
"sectionOidc": "OIDC",
|
|
"sectionSso": "مزودو SSO",
|
|
"ssoAddProvider": "إضافة مزود",
|
|
"ssoDocsLink": "عرض المستندات",
|
|
"ssoProviderDocsLink": "عرض المستندات",
|
|
"ssoNoProviders": "لم يتم تكوين أي مزود SSO.",
|
|
"ssoProviderName": "الاسم المعروض",
|
|
"ssoProviderType": "نوع المزود",
|
|
"ssoDeleteProvider": "حذف المزود",
|
|
"ssoDeleteConfirm": "حذف هذا المزود؟ لن يتمكن المستخدمون المرتبطون من تسجيل الدخول.",
|
|
"ssoTypeOidc": "OIDC",
|
|
"ssoTypeLdap": "LDAP",
|
|
"ssoTypeGithub": "GitHub",
|
|
"ssoTypeGoogle": "Google",
|
|
"ssoEnabled": "مُمكّن",
|
|
"ssoDisabled": "معطل",
|
|
"ssoSaveProvider": "حفظ المزود",
|
|
"ssoTestConnection": "اختبار الاتصال",
|
|
"ssoEditProvider": "تعديل المزود",
|
|
"ldapHost": "مضيف LDAP",
|
|
"ldapPort": "المنفذ",
|
|
"ldapUseTls": "استخدام TLS (LDAPS)",
|
|
"ldapBindDn": "اسم مميز للربط",
|
|
"ldapBindPassword": "كلمة مرور الارتباط",
|
|
"ldapUserSearchBase": "قاعدة بحث المستخدمين",
|
|
"ldapUserSearchFilter": "مرشح بحث المستخدمين",
|
|
"ldapUsernameAttr": "سمة اسم المستخدم",
|
|
"ldapDisplayNameAttr": "سمة اسم العرض",
|
|
"ldapGroupSearchBase": "قاعدة بحث المجموعات",
|
|
"ldapAdminGroup": "مجموعة المديرين",
|
|
"ldapAllowedUsers": "المستخدمون المسموح بهم",
|
|
"sectionUsers": "المستخدمون",
|
|
"sectionSessions": "الجلسات",
|
|
"sectionRoles": "الأدوار",
|
|
"sectionDatabase": "قاعدة البيانات",
|
|
"sectionApiKeys": "مفاتيح API",
|
|
"sectionAuditLog": "سجل التدقيق",
|
|
"sectionSsl": "SSL / Let's Encrypt",
|
|
"sectionTouchInput": "إدخال اللمس",
|
|
"touchEnabled": "تفعيل إدخال اللمس",
|
|
"touchEnabledDesc": "السماح بالتمرير بلمسة إصبع واحدة في المحطات الطرفية",
|
|
"touchMomentumEnabled": "تفعيل الزخم",
|
|
"touchMomentumEnabledDesc": "استمر في التمرير لفترة وجيزة بعد التمرير",
|
|
"touchAdvanced": "متقدم",
|
|
"touchDragThreshold": "عتبة السحب",
|
|
"touchMaxWheelDelta": "أقصى دلتا للعجلة",
|
|
"touchMomentumSampleWindow": "نافذة عينة الزخم",
|
|
"touchReleaseGracePeriod": "فترة السماح للإفراج",
|
|
"touchMinimumVelocity": "الحد الأدنى للسرعة",
|
|
"touchMaximumVelocity": "أقصى سرعة",
|
|
"touchMaximumDuration": "أقصى مدة",
|
|
"touchMaximumTravel": "أقصى قدر من السفر",
|
|
"touchDecayTime": "وقت التحلل",
|
|
"touchPixelsPerTick": "بكسل لكل نبضة",
|
|
"touchMaximumFrameInterval": "أقصى فاصل زمني بين الإطارات",
|
|
"touchMaximumTicksPerFrame": "الحد الأقصى للنبضات لكل إطار",
|
|
"touchResetDefaults": "إعادة ضبط الإعدادات الافتراضية",
|
|
"touchSaved": "تم حفظ إعدادات إدخال اللمس",
|
|
"touchSaveFailed": "فشل حفظ إعدادات إدخال اللمس",
|
|
"sectionImageStorage": "تخزين الصور",
|
|
"imageStorageMode": "وضع التخزين",
|
|
"imageStorageModeDesc": "يتم حفظ الصور الطرفية الملصقة والمرفوعة في هذا المكان. يتم تثبيت عمليات الاختيار التلقائي حسب الاتصال، سواء كان محليًا أو عن بُعد (SFTP).",
|
|
"imageStorageModeAuto": "آلي",
|
|
"imageStorageModeLocal": "محلي",
|
|
"imageStorageModeRemoteSftp": "عن بعد (SFTP)",
|
|
"imageStorageLocalDir": "الدليل المحلي",
|
|
"imageStorageLocalDirDesc": "المسار المطلق في نظام Termix الخلفي. لا يظهر بعد الحفظ لأسباب أمنية.",
|
|
"imageStorageLocalDirPlaceholder": "اتركه فارغًا للحفاظ على التحديث",
|
|
"imageStorageHostPath": "مسار المضيف",
|
|
"imageStorageHostPathDesc": "عرض الدليل المحلي من جانب المضيف الذي تتلقاه وكلاء المحطة الطرفية.",
|
|
"imageStorageTtl": "مدة البقاء (بالمللي ثانية)",
|
|
"imageStorageMaxCount": "الحد الأقصى لعدد الصور",
|
|
"imageStorageMaxBytes": "الحد الأقصى لحجم التخزين بالبايت",
|
|
"imageStorageSaved": "تم حفظ إعدادات تخزين الصور",
|
|
"imageStorageSaveFailed": "فشل حفظ إعدادات تخزين الصور",
|
|
"imageStorageInstanceId": "معرّف مثيل جلسة الطرفية",
|
|
"imageStorageInstanceIdDesc": "معرف مثيل إحدى علامات تبويب الطرفية المتصلة، المستخدمة لاختبار الرؤية.",
|
|
"imageStorageInstanceIdRequired": "أدخل أولاً معرّف مثيل جلسة طرفية",
|
|
"imageStorageTest": "امتحان",
|
|
"imageStorageTesting": "جارٍ الاختبار...",
|
|
"imageStorageTestFailed": "فشل اختبار تخزين الصور",
|
|
"imageStorageTestConnected": "تم الاتصال بجلسة الطرفية.",
|
|
"imageStorageTestNotConnected": "لا توجد جلسة طرفية متصلة بهذا المعرف.",
|
|
"imageStorageTestSelectedMode": "سيتم استخدام الأمر التالي للتحميل: {{mode}}",
|
|
"imageStorageSelectedModeUnavailable": "غير متاح",
|
|
"imageStorageTestLocalVisible": "الدليل المحلي مرئي من الجهاز المضيف المتصل.",
|
|
"imageStorageTestLocalNotVisible": "الدليل المحلي غير مرئي من الجهاز المضيف المتصل.",
|
|
"sectionBranding": "العلامة البيضاء",
|
|
"brandingAppName": "اسم التطبيق",
|
|
"brandingAppNameDesc": "يظهر هذا الحقل في شاشة تسجيل الدخول وعلامة تبويب المتصفح. اتركه فارغًا لاستخدام \"Termix\".",
|
|
"brandingTagline": "الشعار",
|
|
"brandingTaglineDesc": "يظهر هذا الحقل أسفل اسم التطبيق في شاشة تسجيل الدخول. اتركه فارغًا لاستخدام الشعار الافتراضي.",
|
|
"brandingLogo": "الشعار",
|
|
"brandingLogoDesc": "بصيغة PNG أو JPEG أو WEBP، حتى 750 كيلوبايت. يستبدل الأيقونة الافتراضية على شاشة تسجيل الدخول وعلامة تبويب المتصفح.",
|
|
"brandingLogoUpload": "تحميل الشعار",
|
|
"brandingLogoReset": "إعادة الضبط إلى الوضع الافتراضي",
|
|
"brandingLogoInvalid": "صورة غير صالحة. استخدم ملف PNG أو JPEG أو WEBP بحجم يصل إلى 750 كيلوبايت.",
|
|
"brandingSaved": "حفظ إعدادات العلامة التجارية",
|
|
"brandingSaveFailed": "فشل حفظ إعدادات العلامة التجارية",
|
|
"sslDescription": "إصدار وتجديد شهادة SSL موثوقة تلقائيًا من Let's Encrypt. يتطلب نطاقًا عامًا والمنفذ 80 أو وصول DNS.",
|
|
"sslDocsLink": "عرض مستندات SSL",
|
|
"sslDomain": "النطاق",
|
|
"sslDomainPlaceholder": "termix.example.com",
|
|
"sslDomainDesc": "اسم النطاق العام للشهادة.",
|
|
"sslEmail": "البريد الإلكتروني",
|
|
"sslEmailPlaceholder": "admin@example.com",
|
|
"sslEmailDesc": "بريد الاتصال لإشعارات Let's Encrypt والحساب.",
|
|
"sslChallengeType": "نوع التحدي",
|
|
"sslChallengeTypeDesc": "كيفية إثبات ملكية النطاق لـ Let's Encrypt.",
|
|
"sslChallengeHttp": "HTTP (webroot) - يتطلب المنفذ 80 متاحًا من الإنترنت",
|
|
"sslChallengeDns": "DNS (Cloudflare) - يتطلب رمز Cloudflare API",
|
|
"sslCloudflareToken": "رمز Cloudflare API",
|
|
"sslCloudflareTokenPlaceholder": "أدخل الرمز...",
|
|
"sslCloudflareTokenDesc": "رمز مقيد بصلاحية Zone:DNS:Edit للنطاق الخاص بك.",
|
|
"sslCertStatus": "حالة الشهادة",
|
|
"sslCertStatusNone": "لا توجد شهادة",
|
|
"sslCertStatusValid": "صالحة",
|
|
"sslCertStatusExpiring": "ستنتهي قريبًا",
|
|
"sslCertStatusExpired": "منتهية",
|
|
"sslCertExpiresAt": "تنتهي في {{date}}",
|
|
"sslLastIssued": "آخر إصدار {{date}}",
|
|
"sslRequestCert": "إصدار / تجديد الشهادة",
|
|
"sslRequestCertLoading": "جارٍ طلب الشهادة...",
|
|
"sslRequestCertSuccess": "تم إصدار الشهادة وتثبيتها بنجاح",
|
|
"sslRequestCertFailed": "فشل طلب الشهادة",
|
|
"sslSave": "حفظ الإعدادات",
|
|
"sslSaved": "تم حفظ إعدادات SSL",
|
|
"sslSaveFailed": "فشل حفظ إعدادات SSL",
|
|
"sslRequiresDomain": "النطاق والبريد الإلكتروني مطلوبان",
|
|
"sslInfoNote": "بعد إصدار الشهادة أو تحميلها، سيقوم Termix تلقائيًا بتفعيل بروتوكول HTTPS على منفذ SSL_PORT (المنفذ الافتراضي 8443) بالإضافة إلى منفذ HTTP الحالي. تأكد من نشر هذا المنفذ/ربطه بهذه الحاوية لضمان إمكانية الوصول إليه.",
|
|
"sslManualOption": "يدوي (تحميل الشهادة)",
|
|
"sslManualCert": "شهادة (PEM)",
|
|
"sslManualCertPlaceholder": "-----بداية الشهادة-----",
|
|
"sslManualKey": "المفتاح الخاص (PEM)",
|
|
"sslManualKeyPlaceholder": "-----بداية المفتاح الخاص-----",
|
|
"sslManualDesc": "ألصق شهادتك الحالية ومفتاحك الخاص، بما في ذلك سلسلة كاملة إذا طلبت منك جهة إصدار الشهادات الخاصة بك ذلك.",
|
|
"sslManualUpload": "تحميل وتثبيت الشهادة",
|
|
"sslManualUploadLoading": "جارٍ تحميل الشهادة...",
|
|
"sslManualUploadSuccess": "تم تحميل الشهادة وتثبيتها بنجاح",
|
|
"sslManualUploadFailed": "فشل تحميل الشهادة",
|
|
"sslManualRequiresFields": "الشهادة والمفتاح الخاص مطلوبان",
|
|
"auditLogTotal": "{{total}} إجمالي السجلات",
|
|
"auditLogEmpty": "لا توجد إدخالات في سجل التدقيق",
|
|
"auditLogSuccess": "نجاح",
|
|
"auditLogFailed": "فشل",
|
|
"auditLogClearFilters": "مسح الفلاتر",
|
|
"auditLogPage": "صفحة {{page}} من {{totalPages}} (إجمالي {{total}})",
|
|
"auditLogIp": "IP",
|
|
"auditLogResourceId": "معرف المورد",
|
|
"auditLogFilterUser": "مستخدم",
|
|
"auditLogFilterAction": "الإجراء",
|
|
"auditLogFilterResourceType": "نوع المورد",
|
|
"auditLogFilterStatus": "الحالة",
|
|
"auditLogFilterFrom": "من",
|
|
"auditLogFilterTo": "إلى",
|
|
"auditLogFilterAll": "الكل",
|
|
"allowRegistration": "السماح بتسجيل المستخدمين",
|
|
"allowRegistrationDesc": "يسمح للمستخدمين الجدد بالتسجيل الذاتي باستخدام اسم مستخدم وكلمة مرور",
|
|
"allowPasswordLogin": "السماح بتسجيل الدخول بكلمة المرور",
|
|
"allowPasswordLoginDesc": "تسجيل الدخول باسم المستخدم/كلمة المرور",
|
|
"oidcAutoProvision": "التزويد التلقائي لـ OIDC",
|
|
"oidcAutoProvisionDesc": "إنشاء الحسابات تلقائياً لمستخدمي OIDC/SSO عند تسجيل الدخول الأول (بغض النظر عن مفتاح التسجيل)",
|
|
"oidcSilentLoginDefault": "تسجيل الدخول الصامت لـ OIDC بشكل افتراضي",
|
|
"oidcSilentLoginDefaultDesc": "إعادة التوجيه تلقائياً إلى تسجيل الدخول OIDC في كل زيارة، وتخطي نموذج تسجيل الدخول بالكامل",
|
|
"oidcSilentLoginDefaultLockedDesc": "هذا الإعداد مقفل بواسطة متغير البيئة OIDC_SILENT_LOGIN_DEFAULT ولا يمكن تغييره هنا.",
|
|
"allowPasswordReset": "السماح بإعادة تعيين كلمة المرور",
|
|
"allowPasswordResetDesc": "رمز إعادة التعيين عبر سجلات Docker",
|
|
"commandHistoryEnabled": "سجل الأوامر",
|
|
"commandHistoryEnabledDesc": "السماح بتسجيل سجل الأوامر. عند التعطيل، لا يتم حفظ السجل بغض النظر عن إعدادات كل جهاز.",
|
|
"updateCommandHistoryFailed": "فشل تحديث إعداد سجل الأوامر",
|
|
"analyticsEnabled": "مشاركة إحصائيات الاستخدام المجهولة",
|
|
"analyticsEnabledDesc": "يرسل النظام إحصاءً يومياً مجهولاً للمستخدمين والمضيفين واستخدام الميزات للمساعدة في تحسين Termix. ولا يتم تضمين أي بيانات شخصية أو تفاصيل اتصال على الإطلاق.",
|
|
"analyticsEnabledLockedDesc": "هذا الإعداد مقفل بواسطة متغير البيئة ENABLE_TELEMETRY ولا يمكن تغييره هنا.",
|
|
"updateAnalyticsFailed": "فشل تحديث إعدادات التحليلات",
|
|
"sessionSharingGloballyEnabled": "السماح بمشاركة الجلسة",
|
|
"auditForwardingTitle": "إعادة التوجيه إلى SIEM",
|
|
"auditForwardingDesc": "أرسل نسخة من كل إدخال تدقيق إلى جامع بيانات خارجي بصيغة NDJSON. تبقى السجلات المحلية هي المصدر الموثوق.",
|
|
"auditForwardingEnvNotice": "يُستخدم متغير البيئة أيضًا لضبط عملية إعادة التوجيه؛ ويأخذ عنوان URL المحفوظ هنا الأولوية.",
|
|
"auditForwardingToken": "رمز حامل (اختياري)",
|
|
"auditForwardingTokenStored": "رمز حامل (مخزن)",
|
|
"auditForwardingSaved": "تم حفظ إعدادات إعادة توجيه التدقيق",
|
|
"auditForwardingSaveError": "فشل حفظ إعدادات إعادة توجيه التدقيق",
|
|
"sessionSharingGloballyEnabledDesc": "يسمح هذا الخيار بمشاركة جلسات الطرفية المباشرة، وجلسات RDP، وVNC، وTelnet على مستوى الجهاز. ويتجاوز هذا الخيار جميع إعدادات المشاركة الخاصة بكل مضيف عند تعطيله.",
|
|
"updateSessionSharingFailed": "فشل تحديث إعدادات مشاركة الجلسة",
|
|
"sessionTimeout": "مهلة الجلسة",
|
|
"hours": "ساعات",
|
|
"sessionTimeoutRange": "الحد الأدنى 1 ساعة · الحد الأقصى 720 ساعة",
|
|
"monitoringDefaults": "إعدادات المراقبة الافتراضية",
|
|
"statusCheck": "فحص الحالة",
|
|
"metrics": "مقاييس",
|
|
"sec": "ثانية",
|
|
"logLevel": "مستوى السجل",
|
|
"enableGuacamole": "تمكين Guacamole",
|
|
"enableGuacamoleDesc": "سطح المكتب البعيد RDP/VNC",
|
|
"enableGuacamoleDocsLink": "عرض المستندات",
|
|
"guacdUrl": "رابط guacd",
|
|
"tailscaleApiKey": "مفتاح Tailscale API",
|
|
"tailscaleApiKeyDescription": "يُستخدم لاكتشاف الأجهزة في محرر المضيف. يدعم مفاتيح Tailscale (tskey-) وHeadscale (hskey-). أنشئ مفتاحًا من خلال tailscale.com/admin/settings/keys أو من خلال حسابك في Headscale.",
|
|
"tailscaleApiKeyDocsLink": "عرض المستندات",
|
|
"tailscaleApiBaseUrl": "عنوان URL الأساسي لواجهة برمجة التطبيقات",
|
|
"tailscaleApiBaseUrlDescription": "اختياري. قم بالإشارة إلى نسخة Headscale مستضافة ذاتيًا بدلاً من api.tailscale.com. اتركه فارغًا لاستخدام الإعداد الافتراضي لـ Tailscale.",
|
|
"oidcDescription": "تكوين OpenID Connect لتسجيل الدخول الموحّد (SSO). الحقول المميزة بـ * مطلوبة.",
|
|
"oidcDocsLink": "عرض المستندات",
|
|
"oidcClientId": "معرف العميل",
|
|
"oidcClientSecret": "سر العميل",
|
|
"oidcAuthUrl": "رابط التفويض",
|
|
"oidcIssuerUrl": "رابط المُصدر",
|
|
"oidcTokenUrl": "رابط الرمز المميز",
|
|
"oidcUserIdentifier": "مسار معرّف المستخدم",
|
|
"oidcDisplayName": "مسار اسم العرض",
|
|
"oidcScopes": "النطاقات",
|
|
"oidcUserinfoUrl": "تجاوز رابط Userinfo",
|
|
"oidcAllowedUsers": "المستخدمون المسموح لهم",
|
|
"oidcAllowedUsersDesc": "بريد إلكتروني واحد في كل سطر. اتركه فارغًا للسماح للجميع.",
|
|
"oidcAdminGroup": "مجموعة المسؤولين",
|
|
"oidcAdminGroupDesc": "يُمنح المستخدمون في هذه المجموعة صلاحيات المسؤول. اتركه فارغًا لتعطيل مزامنة المجموعة.",
|
|
"oidcGroupClaim": "مطالبة المجموعة",
|
|
"oidcGroupClaimDesc": "اختياري. مسار المطالبة الذي يحتوي على مجموعات المستخدم. القيمة الافتراضية هي groups، ثم roles، ثم group. استخدم هذا للموفّرين الذين لديهم مطالبة مخصصة (مثل Zitadel).",
|
|
"oidcCaCert": "شهادة CA مخصصة",
|
|
"oidcCaCertDesc": "اختياري. شهادة CA بترميز PEM لموفّري OIDC الذين يستخدمون شهادة CA خاصة أو موقّعة ذاتيًا. اتركه فارغًا لاستخدام مخزن الثقة في النظام.",
|
|
"removeOidc": "إزالة",
|
|
"usersCount": "{{count}} مستخدم",
|
|
"searchUsers": "ابحث عن المستخدمين...",
|
|
"noUsers": "لا يوجد مستخدمون",
|
|
"noUsersMatch": "لا يوجد مستخدمون يطابقون بحثك",
|
|
"pageOf": "الصفحة {{page}} من {{total}}",
|
|
"createUser": "إنشاء",
|
|
"newRole": "دور جديد",
|
|
"roleName": "الاسم",
|
|
"roleDisplayName": "اسم العرض",
|
|
"roleDescription": "الوصف",
|
|
"rolesCount": "{{count}} دور",
|
|
"createRole": "إنشاء",
|
|
"creating": "جارٍ الإنشاء...",
|
|
"exportDatabase": "تصدير قاعدة البيانات",
|
|
"exportDatabaseDesc": "قم بتنزيل نسخة احتياطية محمولة من SQLite لجميع المضيفين وبيانات الاعتماد والإعدادات",
|
|
"export": "تصدير",
|
|
"exporting": "جارٍ التصدير...",
|
|
"importDatabase": "استيراد قاعدة البيانات",
|
|
"importDatabaseDesc": "استعادة البيانات من نسخة احتياطية محمولة بصيغة .sqlite على أي نظام قاعدة بيانات.",
|
|
"importDatabaseSelected": "المحدد: {{name}}",
|
|
"selectFile": "اختيار ملف",
|
|
"changeFile": "تغيير",
|
|
"import": "استيراد",
|
|
"importing": "جارٍ الاستيراد...",
|
|
"apiKeysCount": "{{count}} مفتاح",
|
|
"apiKeysDocsLink": "عرض المستندات",
|
|
"apiKeysCliHint": "استخدم مفتاح API مع واجهة سطر الأوامر Termix لإدارة الخوادم من جهازك الطرفي.",
|
|
"apiKeysCliLink": "عرض وثائق واجهة سطر الأوامر",
|
|
"newApiKey": "مفتاح API جديد",
|
|
"apiKeyCreatedWarning": "تم إنشاء المفتاح - انسخه الآن، لن يُعرض مرة أخرى.",
|
|
"apiKeyName": "الاسم",
|
|
"apiKeyUser": "المستخدم",
|
|
"apiKeySelectUser": "اختيار مستخدم...",
|
|
"apiKeyExpiresAt": "تاريخ الانتهاء",
|
|
"createKey": "إنشاء مفتاح",
|
|
"apiKeyNoExpiry": "بدون انتهاء صلاحية",
|
|
"revokedBadge": "ملغى",
|
|
"authTypeDual": "مصادقة مزدوجة",
|
|
"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": "إجبار تسجيل الدخول مجددًا على جميع الأجهزة",
|
|
"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": "معرّف المستخدم",
|
|
"linkAccountTitle": "ربط الحسابات",
|
|
"linkAccountDesc": "دمج حساب OIDC {{username}} مع حساب محلي موجود.",
|
|
"linkAccountDescLocal": "ربط حساب محلي {{username}} بحساب OIDC فقط موجود.",
|
|
"linkAccountWarningTitle": "سيؤدي هذا إلى:",
|
|
"linkAccountEffect1": "حذف حساب OIDC فقط",
|
|
"linkAccountEffect2": "إضافة تسجيل دخول OIDC إلى الحساب الهدف",
|
|
"linkAccountEffect3": "السماح بتسجيل الدخول عبر OIDC وكلمة المرور",
|
|
"linkAccountTargetUsername": "اسم مستخدم الحساب المحلي",
|
|
"linkAccountTargetPlaceholder": "أدخل اسم مستخدم الحساب المحلي للربط به",
|
|
"linkAccountOidcUsername": "اسم مستخدم حساب OIDC",
|
|
"linkAccountOidcPlaceholder": "أدخل اسم مستخدم حساب OIDC فقط للدمج",
|
|
"linkAccountOidcNotFound": "لم يتم العثور على حساب OIDC فقط بهذا الاسم",
|
|
"linkAccounts": "ربط الحسابات",
|
|
"linkAccountSuccess": "تم ربط الحسابات بنجاح",
|
|
"linkAccountFailed": "فشل ربط الحسابات",
|
|
"linkAccountInProgress": "جارٍ الربط...",
|
|
"unlinkAccountTitle": "إلغاء ربط OIDC",
|
|
"unlinkAccountDesc": "إزالة مصادقة OIDC من {{username}}. سيتمكن من تسجيل الدخول باستخدام كلمة المرور فقط.",
|
|
"unlinkAccountWarning": "سيؤدي هذا إلى إزالة تسجيل دخول OIDC من هذا الحساب. يجب أن يكون لدى المستخدم كلمة مرور لمواصلة تسجيل الدخول.",
|
|
"unlinkAccount": "إلغاء ربط OIDC",
|
|
"unlinkAccountInProgress": "جارٍ إلغاء الربط...",
|
|
"unlinkAccountSuccess": "تم إلغاء ربط OIDC بنجاح",
|
|
"unlinkAccountFailed": "فشل إلغاء ربط OIDC",
|
|
"saving": "جارٍ الحفظ...",
|
|
"updateRegistrationFailed": "فشل تحديث إعداد التسجيل",
|
|
"updatePasswordLoginFailed": "فشل تحديث إعداد تسجيل الدخول بكلمة المرور",
|
|
"cannotDisablePasswordLoginWithTotp": "لا يمكن تعطيل تسجيل الدخول بكلمة المرور أثناء تمكين المصادقة الثنائية (2FA) لمستخدم واحد أو أكثر. قم بتعطيل المصادقة الثنائية أولاً.",
|
|
"updateOidcAutoProvisionFailed": "فشل تحديث إعداد التزويد التلقائي لـ OIDC",
|
|
"updateOidcSilentLoginDefaultFailed": "فشل تحديث إعداد تسجيل الدخول الصامت لـ OIDC",
|
|
"updatePasswordResetFailed": "فشل تحديث إعداد إعادة تعيين كلمة المرور",
|
|
"sessionTimeoutRange2": "يجب أن تكون مهلة الجلسة بين 1 و 720 ساعة",
|
|
"sessionTimeoutSaved": "تم حفظ مهلة الجلسة",
|
|
"sessionTimeoutSaveFailed": "فشل حفظ مهلة الجلسة",
|
|
"monitoringIntervalInvalid": "قيم الفاصل الزمني غير صالحة",
|
|
"monitoringSaved": "تم حفظ إعدادات المراقبة",
|
|
"monitoringSaveFailed": "فشل حفظ إعدادات المراقبة",
|
|
"metricsHistoryRetention": "الاحتفاظ بسجل المقاييس",
|
|
"metricsHistoryRetentionRange": "من 1 إلى 90 يومًا",
|
|
"days": "أيام",
|
|
"guacamoleSaved": "تم حفظ إعدادات Guacamole",
|
|
"guacamoleSaveFailed": "فشل حفظ إعدادات Guacamole",
|
|
"guacamoleUpdateFailed": "فشل تحديث إعداد Guacamole",
|
|
"tailscaleSettingsSaved": "تم حفظ إعدادات Tailscale",
|
|
"tailscaleSettingsSaveFailed": "فشل حفظ إعدادات Tailscale",
|
|
"logLevelUpdateFailed": "فشل تحديث مستوى السجل",
|
|
"oidcSaved": "تم حفظ تكوين OIDC",
|
|
"oidcSaveFailed": "فشل حفظ تكوين OIDC",
|
|
"oidcRemoved": "تمت إزالة تكوين OIDC",
|
|
"oidcRemoveFailed": "فشلت إزالة تكوين OIDC",
|
|
"createUserRequired": "اسم المستخدم وكلمة المرور مطلوبان",
|
|
"createUserPasswordTooShort": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل",
|
|
"createUserSuccess": "تم إنشاء المستخدم \"{{username}}\"",
|
|
"createUserFailed": "فشل إنشاء المستخدم",
|
|
"updateAdminStatusFailed": "فشل تحديث حالة المسؤول",
|
|
"allSessionsRevoked": "تم إبطال جميع الجلسات",
|
|
"revokeSessionsFailed": "فشل إبطال الجلسات",
|
|
"manageUserData": "إدارة بيانات المستخدم",
|
|
"backToUsers": "العودة إلى المستخدمين",
|
|
"manageTabAccount": "الحساب",
|
|
"manageTabHosts": "المضيفون",
|
|
"manageTabCredentials": "بيانات الاعتماد",
|
|
"manageTabSnippets": "المقتطفات",
|
|
"manageTabSessions": "الجلسات",
|
|
"manageTabDanger": "خطر",
|
|
"manageEditorBack": "العودة إلى بيانات {{username}}",
|
|
"dataLockedBadge": "مقفل",
|
|
"dataLockedNotice": "تظل بيانات {{username}} مقفلة حتى تسجيل الدخول التالي. لا يمكن عرض أو تعديل مضيفيه وبيانات اعتماده ومقاطع حتى ذلك الحين.",
|
|
"resetPasswordTitle": "إعادة تعيين كلمة المرور",
|
|
"resetPasswordOidcOnly": "يسجل هذا المستخدم الدخول عبر مزود خارجي ولا يملك كلمة مرور.",
|
|
"resetPasswordPlaceholder": "كلمة مرور جديدة",
|
|
"resetPasswordBtn": "إعادة تعيين",
|
|
"resetPasswordWorking": "جارٍ إعادة التعيين...",
|
|
"resetPasswordSuccess": "تمت إعادة تعيين كلمة المرور",
|
|
"resetPasswordSuccessWiped": "تمت إعادة تعيين كلمة المرور. تم حذف البيانات المشفرة للمستخدم.",
|
|
"resetPasswordFailed": "فشلت إعادة تعيين كلمة المرور",
|
|
"resetPasswordConfirmWipe": "لم يسجل {{username}} الدخول منذ ترقية التشفير، لذا لا يمكن استرداد بياناته. ستؤدي إعادة التعيين الآن إلى حذف مضيفيه وبيانات اعتماده ومقاطع. هل تريد المتابعة؟",
|
|
"totpSectionTitle": "المصادقة الثنائية",
|
|
"totpStatusEnabled": "تم تمكين TOTP لهذا المستخدم",
|
|
"totpStatusDisabled": "لم يتم تمكين TOTP لهذا المستخدم",
|
|
"disableTotp": "تعطيل",
|
|
"disableTotpConfirm": "تعطيل المصادقة الثنائية لـ {{username}}؟ سيكون بمقدورهم تسجيل الدخول باستخدام كلمة المرور فقط.",
|
|
"totpDisabledSuccess": "تم تعطيل TOTP",
|
|
"totpDisableFailed": "فشل تعطيل TOTP",
|
|
"manageApiKeys": "مفاتيح API",
|
|
"apiKeyNamePlaceholder": "اسم المفتاح",
|
|
"apiKeyCopyNotice": "انسخ هذا المفتاح الآن، فلن يظهر مرة أخرى.",
|
|
"noApiKeysForUser": "لا توجد مفاتيح API",
|
|
"apiKeyDeleteFailed": "فشل حذف مفتاح API",
|
|
"exportUserData": "تصدير البيانات",
|
|
"exportUserDataDesc": "تنزيل مضيفات هذا المستخدم وبيانات اعتماده وبيانات مدير الملفات بصيغة JSON. يتم فك تشفير الأسرار.",
|
|
"exportUserDataSuccess": "تم تصدير بيانات المستخدم",
|
|
"exportUserDataFailed": "فشل تصدير بيانات المستخدم",
|
|
"hostsCount": "{{count}} مضيفات",
|
|
"addHostForUser": "إضافة مضيف",
|
|
"noHostsForUser": "لا يملك هذا المستخدم أي مضيفات",
|
|
"connectToHost": "اتصال",
|
|
"deleteHostConfirm": "حذف المضيف \"{{name}}\" التابع لـ {{username}}؟",
|
|
"hostDeletedSuccess": "تم حذف المضيف",
|
|
"hostDeleteFailed": "فشل حذف المضيف",
|
|
"credentialsCount": "{{count}} بيانات اعتماد",
|
|
"addCredentialForUser": "إضافة بيانات اعتماد",
|
|
"noCredentialsForUser": "هذا المستخدم ليس لديه بيانات اعتماد",
|
|
"deleteCredentialConfirm": "حذف بيانات الاعتماد \"{{name}}\" الخاصة بـ {{username}}؟",
|
|
"credentialDeletedSuccess": "تم حذف بيانات الاعتماد",
|
|
"credentialDeleteFailed": "فشل حذف بيانات الاعتماد",
|
|
"snippetsCount": "{{count}} مقتطفات",
|
|
"addSnippetForUser": "إضافة مقتطف",
|
|
"noSnippetsForUser": "هذا المستخدم ليس لديه مقتطفات",
|
|
"snippetRequiredFields": "اسم المقتطف والمحتوى مطلوبان",
|
|
"snippetNamePlaceholder": "اسم المقتطف",
|
|
"snippetContentPlaceholder": "محتوى الأمر",
|
|
"snippetFolderPlaceholder": "المجلد (اختياري)",
|
|
"snippetSaved": "تم حفظ المقتطف",
|
|
"snippetSaveFailed": "فشل حفظ المقتطف",
|
|
"deleteSnippetConfirm": "حذف المقتطف \"{{name}}\" الخاص بـ {{username}}؟",
|
|
"snippetDeletedSuccess": "تم حذف المقتطف",
|
|
"snippetDeleteFailed": "فشل حذف المقتطف",
|
|
"noSessionsForUser": "لا توجد جلسات نشطة",
|
|
"deleteSuccessorLabel": "قم بتسليم المضيفين وبيانات الاعتماد إلى",
|
|
"deleteSuccessorMe": "أنا (المسؤول عن الحذف)",
|
|
"deleteSuccessorNone": "لا أحد — احذفهم",
|
|
"deleteSuccessorDesc": "كل ما شاركه هذا المستخدم سيستمر في العمل تحت إدارة المالك الجديد؛ اختيار \"لا أحد\" سيؤدي إلى إزالة مضيفيه وبيانات اعتماده ومشاركاته.",
|
|
"deleteUserDangerDesc": "حذف {{username}} وجميع بياناته بشكل دائم (المضيفين، بيانات الاعتماد، المقتطفات، السجل). لا يمكن التراجع عن هذا الإجراء.",
|
|
"deleteUserConfirm": "حذف {{username}} وجميع بياناته بشكل دائم؟",
|
|
"deleteUserAdminBlocked": "إزالة صلاحية المسؤول قبل حذف هذا المستخدم.",
|
|
"createRoleRequired": "الاسم واسم العرض مطلوبان",
|
|
"createRoleSuccess": "تم إنشاء الدور \"{{name}}\"",
|
|
"createRoleFailed": "فشل إنشاء الدور",
|
|
"apiKeyNameRequired": "اسم المفتاح مطلوب",
|
|
"apiKeyUserRequired": "معرف المستخدم مطلوب",
|
|
"apiKeyCreatedSuccess": "تم إنشاء مفتاح API \"{{name}}\"",
|
|
"apiKeyCreateFailed": "فشل إنشاء مفتاح API",
|
|
"exportSuccess": "تم تصدير قاعدة البيانات بنجاح",
|
|
"exportFailed": "فشل تصدير قاعدة البيانات",
|
|
"importSelectFile": "يرجى تحديد ملف أولاً",
|
|
"importCompleted": "اكتمل الاستيراد: تم استيراد {{total}} عنصر، وتم تخطي {{skipped}}",
|
|
"importFailed": "فشل الاستيراد: {{error}}",
|
|
"importError": "فشل استيراد قاعدة البيانات",
|
|
"sectionHostDefaults": "الإعدادات الافتراضية للمضيفين",
|
|
"hostDefaultsDesc": "الإعدادات التي يتم تطبيقها تلقائيًا عند إنشاء مضيف جديد. لا يزال بإمكان كل مضيف تجاوز هذه الإعدادات.",
|
|
"hostDefaultsSocks5": "وكيل SOCKS5",
|
|
"hostDefaultsUseSocks5": "تمكين وكيل SOCKS5",
|
|
"hostDefaultsUseSocks5Desc": "ملء وكيل SOCKS5 مسبقًا على جميع المضيفين الجدد",
|
|
"hostDefaultsSocks5Host": "مضيف الوكيل / المنفذ",
|
|
"hostDefaultsSocks5Username": "اسم مستخدم الوكيل",
|
|
"hostDefaultsSocks5Password": "كلمة مرور الوكيل",
|
|
"hostDefaultsMetrics": "مقاييس المضيف",
|
|
"hostDefaultsMetricsEnabled": "تمكين المقاييس",
|
|
"hostDefaultsMetricsEnabledDesc": "جمع إحصائيات المعالج والذاكرة وغيرها على المضيفين الجدد افتراضيًا",
|
|
"hostDefaultsStatusCheckEnabled": "تمكين فحص الحالة",
|
|
"hostDefaultsStatusCheckEnabledDesc": "استطلاع حالة الاتصال أو الانفصال على المضيفين الجدد افتراضيًا",
|
|
"hostDefaultsTerminal": "الطرفية",
|
|
"hostDefaultsAutoTmux": "Auto-Tmux",
|
|
"hostDefaultsAutoTmuxDesc": "قم بتشغيل طرفيات المضيفين الجدد داخل tmux حتى تستمر الجلسات في حالة انقطاع الاتصال (يتطلب tmux على المضيف).",
|
|
"terminalSessionTimeout": "استمرار جلسة الطرفية",
|
|
"terminalSessionTimeoutDesc": "مدة بقاء طرفية غير متصلة على الخادم قبل إغلاقها. الحد الأدنى: دقيقة واحدة، الحد الأقصى: 1440 دقيقة. بالنسبة للجلسات التي يجب أن تستمر لفترة أطول من ذلك، فعّل خاصية Auto-Tmux على المضيف.",
|
|
"terminalSessionTimeoutRange": "أدخل قيمة بين 1 و 1440 دقيقة",
|
|
"terminalSessionTimeoutSaved": "تم حفظ استمرارية جلسة الطرفية",
|
|
"terminalSessionTimeoutSaveFailed": "فشل حفظ بيانات جلسة الطرفية",
|
|
"minutes": "دقائق",
|
|
"hostDefaultsSessionLogging": "تسجيل الجلسات",
|
|
"hostDefaultsSessionLoggingDesc": "تسجيل جلسات الطرفية على المضيفين الجدد افتراضيًا",
|
|
"hostDefaultsCommandHistory": "سجل الأوامر",
|
|
"hostDefaultsCommandHistoryDesc": "تتبع سجل الأوامر على المضيفين الجدد افتراضيًا",
|
|
"hostDefaultsSaved": "تم حفظ الإعدادات الافتراضية للمضيف",
|
|
"hostDefaultsSaveFailed": "فشل حفظ الإعدادات الافتراضية للمضيف",
|
|
"rolePermissions": {
|
|
"count": "{{count}} صلاحيات",
|
|
"editAction": "تحرير الصلاحيات",
|
|
"loadError": "فشل تحميل كتالوج الصلاحيات",
|
|
"saved": "تم حفظ صلاحيات الدور",
|
|
"saveError": "فشل حفظ صلاحيات الدور",
|
|
"save": "حفظ",
|
|
"saving": "جارٍ الحفظ..."
|
|
},
|
|
"aiGloballyEnabled": "مساعد الذكاء الاصطناعي",
|
|
"aiGloballyEnabledDesc": "اسمح للمستخدمين بتفعيل مساعد الذكاء الاصطناعي. عند إيقاف تشغيله، يكون المساعد مخفيًا ومحظورًا عن الجميع.",
|
|
"aiPrivateEndpoints": "المضيفون الخاصون المسموح بهم للذكاء الاصطناعي",
|
|
"aiPrivateEndpointsDesc": "المضيفون على شبكتك الخاصة الذين يمكن للمستخدمين توجيه مزود الخدمة إليهم، مثل Ollama المستضاف ذاتيًا. افصل بينهم بفواصل.",
|
|
"stepCa": "الخطوة ج",
|
|
"stepCaDesc": "إصدار شهادات SSH قصيرة الأجل من جهة مصدقة صغيرة (Smallstep CA). أدخل عنوان URL الخاص بالجهة المصدقة، وبصمة الجذر (كما هو موضح في أمر step ca bootstrap)، واسم موفر OIDC؛ ثم اختر \"Step CA\" كنوع مصادقة المضيف. اترك الحقول الثلاثة فارغة لتعطيل هذه الميزة.",
|
|
"stepCaFingerprint": "بصمة الجذر (SHA-256)",
|
|
"stepCaProvisioner": "اسم موفر OIDC",
|
|
"stepCaSaved": "تم حفظ إعدادات CA للخطوة",
|
|
"stepCaSaveFailed": "فشل حفظ إعدادات الخطوة CA",
|
|
"secretSourcePrivateEndpoints": "مضيفو مصادر الأسرار الخاصة المسموح بهم",
|
|
"secretSourcePrivateEndpointsDesc": "المضيفون الخاصون الذين قد تتصل بهم مصادر سرية (مثل 1Password Connect). افصل بينهم بفواصل.",
|
|
"updateSecretSourceEndpointsFailed": "فشل تحديث قائمة السماح لنقاط نهاية المصدر السرية",
|
|
"stepCaPrivateEndpoints": "مضيفو شهادات الخطوة الخاصة المسموح بها",
|
|
"stepCaPrivateEndpointsDesc": "قد تتصل جهات الاستضافة الخاصة بعملية شهادة Step CA بما يلي: جهة إصدار الشهادات نفسها، وإذا كانت داخلية، مزود الهوية الخاص بك. افصل بينهما بفواصل.",
|
|
"updateStepCaEndpointsFailed": "فشل تحديث قائمة السماح لنقاط نهاية شهادة التحقق من صحة الخطوة",
|
|
"notificationPrivateEndpoints": "المضيفون المسموح لهم بالإشعارات الخاصة",
|
|
"notificationPrivateEndpointsDesc": "حدد المضيفين الخاصين الذين يمكن لقنوات الإشعارات الاتصال بهم. افصل بينهم بفواصل.",
|
|
"updateNotificationEndpointsFailed": "فشل تحديث قائمة السماح لنقاط نهاية الإشعارات",
|
|
"updateAiEnabledFailed": "تعذر تحديث إعدادات الذكاء الاصطناعي",
|
|
"updateAiEndpointsFailed": "تعذر تحديث المضيفين المسموح بهم"
|
|
},
|
|
"newUi": {
|
|
"sidebar": {
|
|
"quickConnect": {
|
|
"hostLabel": "المضيف",
|
|
"hostPlaceholder": "192.168.1.1 أو example.com",
|
|
"portLabel": "المنفذ",
|
|
"portPlaceholder": "22",
|
|
"usernameLabel": "اسم المستخدم",
|
|
"usernamePlaceholder": "username",
|
|
"authLabel": "المصادقة",
|
|
"passwordLabel": "كلمة المرور",
|
|
"passwordPlaceholder": "password",
|
|
"privateKeyLabel": "المفتاح الخاص",
|
|
"privateKeyPlaceholder": "الصق المفتاح الخاص...",
|
|
"credentialLabel": "بيانات الاعتماد",
|
|
"credentialPlaceholder": "اختر بيانات اعتماد محفوظة",
|
|
"protocolLabel": "بروتوكول",
|
|
"domainLabel": "اِختِصاص",
|
|
"domainPlaceholder": "خياري",
|
|
"connectToRdp": "الاتصال عبر بروتوكول سطح المكتب البعيد (RDP)",
|
|
"connectToVnc": "الاتصال عبر VNC",
|
|
"connectToTerminal": "اتصل بالطرفية",
|
|
"connectToFiles": "اتصل بالملفات"
|
|
},
|
|
"history": {
|
|
"noTerminalSelected": "لا توجد طرفية محددة",
|
|
"noTerminalSelectedHint": "افتح علامة تبويب طرفية SSH لعرض سجل الأوامر الخاص بها",
|
|
"searchPlaceholder": "ابحث في السجل...",
|
|
"clearAll": "مسح الكل",
|
|
"noHistoryEntries": "لا توجد مدخلات سجل",
|
|
"trackingDisabled": "تتبع السجل معطل",
|
|
"trackingDisabledHint": "قم بتمكينه في إعدادات الطرفية الخاصة بالمضيف."
|
|
},
|
|
"sshTools": {
|
|
"keyRecordingTitle": "تسجيل المفاتيح",
|
|
"recordToTerminals": "التسجيل إلى الطرفيات",
|
|
"selectAll": "الكل",
|
|
"selectNone": "بلا",
|
|
"noTerminalTabsOpen": "لا توجد علامات تبويب طرفية مفتوحة",
|
|
"selectTerminalsAbove": "اختر الطرفيات أعلاه",
|
|
"broadcastInputPlaceholder": "اكتب هنا لبث ضغطات المفاتيح...",
|
|
"fillPassword": "املأ كلمة المرور",
|
|
"fillPasswordSuccess": "تم ملء كلمة المرور في {{count}} طرفية",
|
|
"fillPasswordMissing": "لا توجد كلمة مرور محفوظة لـ {{count}} طرفية محددة",
|
|
"stopRecording": "إيقاف التسجيل",
|
|
"startRecording": "بدء التسجيل",
|
|
"settingsTitle": "الإعدادات",
|
|
"enableRightClickCopyPaste": "تمكين النسخ واللصق بالزر الأيمن",
|
|
"copyOnSelect": "يتم نسخ النص المحدد تلقائيًا"
|
|
},
|
|
"splitScreen": {
|
|
"layoutTitle": "التخطيط",
|
|
"selectLayoutAbove": "اختر تخطيطًا أعلاه",
|
|
"selectLayoutHint": "اختر عدد الأجزاء المراد عرضها",
|
|
"panesTitle": "الأجزاء",
|
|
"openTabsTitle": "علامات التبويب المفتوحة",
|
|
"dragTabsHint": "اسحب علامات التبويب إلى الأجزاء أعلاه، أو استخدم التعيين السريع",
|
|
"dropHere": "أسقط هنا",
|
|
"emptyPane": "فارغ",
|
|
"dashboard": "لوحة التحكم",
|
|
"clearSplitScreen": "مسح تقسيم الشاشة",
|
|
"quickAssign": "تعيين سريع",
|
|
"alreadyAssigned": "لوحة {{index}}",
|
|
"splitTab": "تقسيم التبويب",
|
|
"addToSplit": "إضافة إلى التقسيم",
|
|
"removeFromSplit": "إزالة من التقسيم",
|
|
"assignToPane": "تعيين للوحة",
|
|
"hotkeysTitle": "اختصارات لوحة المفاتيح",
|
|
"hotkeysSplitRight": "تبديل التقسيم الثنائي",
|
|
"hotkeysSplitBelow": "تبديل التقسيم الثلاثي",
|
|
"hotkeysNavigatePane": "التنقل بين اللوحات",
|
|
"hotkeysNextTab": "التبويب التالي",
|
|
"hotkeysPrevTab": "التبويب السابق",
|
|
"hotkeysJumpTab": "انتقل إلى علامة التبويب"
|
|
},
|
|
"snippets": {
|
|
"title": "المقتطفات",
|
|
"createSnippetTitle": "إنشاء مقتطفة",
|
|
"createSnippetDescription": "إنشاء مقتطفة أمر جديدة للتنفيذ السريع",
|
|
"nameLabel": "الاسم",
|
|
"namePlaceholder": "مثال: إعادة تشغيل Nginx",
|
|
"descriptionLabel": "الوصف",
|
|
"descriptionPlaceholder": "وصف اختياري",
|
|
"optional": "اختياري",
|
|
"folderLabel": "مجلد",
|
|
"noFolder": "بدون مجلد (غير مصنف)",
|
|
"commandLabel": "الأمر",
|
|
"commandPlaceholder": "مثلاً: sudo systemctl restart nginx",
|
|
"typeLabel": "يكتب",
|
|
"typeCommand": "يأمر",
|
|
"typeNote": "ملحوظة",
|
|
"noteLabel": "ملحوظة",
|
|
"notePlaceholder": "على سبيل المثال، نص تذكير أو مطالبة قابلة لإعادة الاستخدام",
|
|
"cancel": "إلغاء",
|
|
"createSnippetButton": "إنشاء مقتطفة",
|
|
"createFolderTitle": "إنشاء مجلد",
|
|
"createFolderDescription": "تنظيم المقتطفات في مجلدات",
|
|
"folderNameLabel": "اسم المجلد",
|
|
"folderNamePlaceholder": "مثلاً: أوامر النظام، نصوص Docker",
|
|
"folderColorLabel": "لون المجلد",
|
|
"folderIconLabel": "أيقونة المجلد",
|
|
"previewLabel": "معاينة",
|
|
"folderNameFallback": "اسم المجلد",
|
|
"createFolderButton": "إنشاء مجلد",
|
|
"targetTerminals": "الطرفيات المستهدفة",
|
|
"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}}\"؟",
|
|
"confirmRunButton": "تشغيل",
|
|
"runSuccess": "تم تشغيل \"{{name}}\" في {{count}} طرفية",
|
|
"pasteSuccess": "تم لصق \"{{name}}\" في {{count}} طرفية (أطراف)",
|
|
"pasteToTerminal": "لصق",
|
|
"copySuccess": "تم نسخ \"{{name}}\" إلى الحافظة",
|
|
"shareTitle": "مشاركة المقتطف",
|
|
"shareUser": "مستخدم",
|
|
"shareRole": "دور",
|
|
"selectUser": "اختر مستخدمًا...",
|
|
"selectRole": "اختر دورًا...",
|
|
"shareSuccess": "تمت مشاركة الجزء البرمجي بنجاح",
|
|
"shareFailed": "فشلت مشاركة الجزء البرمجي",
|
|
"revokeSuccess": "تم إبطال الوصول",
|
|
"revokeFailed": "فشل إبطال الوصول",
|
|
"currentAccess": "الوصول الحالي",
|
|
"shareLoadError": "فشل تحميل بيانات المشاركة",
|
|
"loading": "جارٍ التحميل...",
|
|
"close": "إغلاق",
|
|
"reorderFailed": "فشل حفظ ترتيب الأجزاء البرمجية",
|
|
"importExport": "استيراد / تصدير",
|
|
"exportBtn": "تصدير JSON",
|
|
"importBtn": "استيراد JSON",
|
|
"exportSuccess": "تم تصدير الأجزاء البرمجية بنجاح",
|
|
"exportFailed": "فشل تصدير الأجزاء البرمجية",
|
|
"importTitle": "استيراد الأجزاء البرمجية",
|
|
"importDescription": "استيراد الأجزاء البرمجية والمجلدات من ملف JSON تم تصديره بواسطة Termix",
|
|
"importDropOrClick": "أفلت ملف JSON هنا أو انقر للاستعراض",
|
|
"importSelectedFile": "المحدد: {{name}}",
|
|
"importOverwrite": "الكتابة فوق الأجزاء البرمجية الموجودة بنفس الاسم والمجلد",
|
|
"importStartBtn": "استيراد",
|
|
"importSuccess": "اكتمل الاستيراد: تمت إضافة {{snippets}} جزء برمجي، وتحديث {{updated}}، وتخطي {{skipped}}، وإضافة {{folders}} مجلد",
|
|
"importFailed": "فشل استيراد الأجزاء البرمجية",
|
|
"importInvalidFile": "ملف غير صالح: يُتوقع كائن JSON يحتوي على مصفوفات من الأجزاء البرمجية أو المجلدات",
|
|
"targetHostsLabel": "المضيفات المستهدفة",
|
|
"targetHostsHint": "تعيين مضيفات لتشغيل هذا الجزء البرمجي مباشرة بدون فتح طرفية.",
|
|
"noHostsAvailable": "لم يتم إعداد مضيفات",
|
|
"clearTargetHosts": "مسح الكل",
|
|
"hasTargetHosts": "لديه مضيفات مستهدفة",
|
|
"runOnTargets": "تشغيل على المضيفات",
|
|
"directRunSuccess": "تم تشغيل \"{{name}}\" على {{count}} مضيف",
|
|
"directRunPartialFail": "فشل \"{{name}}\" على واحد أو أكثر من المضيفات",
|
|
"executionResultTitle": "نتائج التنفيذ: {{name}}",
|
|
"executionResultDescription": "المخرجات الناتجة عن تشغيل المقتطف على كل مضيف مستهدف.",
|
|
"executionSuccess": "نجاح",
|
|
"executionFailed": "فشل",
|
|
"expandAll": "قم بتوسيع جميع المجلدات",
|
|
"collapseAll": "طي جميع المجلدات",
|
|
"settings": "إعدادات المقتطف",
|
|
"variablesHint": "المتغيرات: $HOST، $USER، $PORT، $NAME، ${INPUT_1:Label}",
|
|
"variablesDialogTitle": "تشغيل \"{{name}}\"",
|
|
"variablesDialogDescription": "أدخل القيم التي يحتاجها هذا المقتطف البرمجي قبل تشغيله.",
|
|
"variablesPreviewLabel": "معاينة",
|
|
"variablesConfirmButton": "يجري"
|
|
},
|
|
"automations": {
|
|
"title": "الأتمتة",
|
|
"tabAutomations": "الأتمتة",
|
|
"tabRuns": "يركض",
|
|
"tabChannels": "القنوات",
|
|
"createAutomation": "الأتمتة الجديدة",
|
|
"backToAutomations": "العودة إلى الأتمتة",
|
|
"createTitle": "الأتمتة الجديدة",
|
|
"editTitle": "أتمتة التحرير",
|
|
"empty": "لا توجد عمليات أتمتة حتى الآن. أنشئ واحدة للتفاعل مع مقياس أو جدول زمني أو حدث.",
|
|
"emptyRuns": "لم يتم تسجيل أي نقاط حتى الآن.",
|
|
"emptyChannels": "لا توجد قنوات حتى الآن. أضف قناة لإرسال الإشعارات إلى مكان ما.",
|
|
"noChannelsHint": "لم يتم إعداد أي قنوات بعد. أضف قناة في تبويب القنوات.",
|
|
"addChannel": "إضافة قناة",
|
|
"testChannel": "امتحان",
|
|
"channelTestSent": "تم إرسال إشعار الاختبار",
|
|
"channelTestFailed": "فشل إشعار الاختبار",
|
|
"channelDeleted": "تم حذف القناة",
|
|
"deleteChannelConfirm": "هل تريد حذف هذه القناة؟ ستتوقف عمليات التشغيل الآلي التي تستخدمها عن إرسال الإشعارات.",
|
|
"nameLabel": "اسم",
|
|
"namePlaceholder": "مثال: تنظيف /data عند امتلائها",
|
|
"nameRequired": "الاسم مطلوب",
|
|
"descriptionLabel": "وصف",
|
|
"descriptionPlaceholder": "وصف اختياري",
|
|
"enabledLabel": "مُفعّل",
|
|
"concurrencyLabel": "إذا كان قيد التشغيل بالفعل",
|
|
"concurrencyHint": "ماذا نفعل عندما يتم تشغيل هذا مرة أخرى قبل انتهاء التشغيل الأخير؟",
|
|
"concurrency": {
|
|
"skip": "تخطَّ الجولة الجديدة",
|
|
"queue": "انتظر واركض خلفه",
|
|
"allow": "قم بتشغيل كليهما في وقت واحد"
|
|
},
|
|
"save": "يحفظ",
|
|
"created": "تم إنشاء الأتمتة",
|
|
"updated": "تم حفظ الأتمتة",
|
|
"deleted": "تم حذف الأتمتة",
|
|
"deleteConfirm": "هل تريد حذف هذه العملية الآلية؟ سيتم حذف سجل تشغيلها أيضاً.",
|
|
"runNow": "انطلق الآن",
|
|
"testRun": "تشغيل تجريبي",
|
|
"testRunHint": "يقوم بتنفيذ كل خطوة ولكنه لا يلمس أي شيء خارج Termix.",
|
|
"runStarted": "بدأ الجري",
|
|
"runFinished": "انتهت العملية: {{status}}",
|
|
"trigger": "مشغل",
|
|
"steps": "خطوات",
|
|
"addStep": "خطوات إضافية",
|
|
"removeStep": "خطوة الإزالة",
|
|
"moveUp": "انتقل إلى مستوى أعلى",
|
|
"moveDown": "انزل لأسفل",
|
|
"noSteps": "لم تُتخذ أي خطوات بعد. أضف خطوة واحدة لتوضيح ما ينبغي أن يحدث.",
|
|
"webhookTokenTitle": "رابط الويب هوك",
|
|
"webhookTokenDescription": "هذا يظهر مرة واحدة فقط. احفظه الآن، فلن تتمكن من استعادته لاحقاً.",
|
|
"copy": "ينسخ",
|
|
"copied": "تم النسخ",
|
|
"viewJson": "JSON",
|
|
"viewBuilder": "باني",
|
|
"viewGraph": "الرسم البياني",
|
|
"lastRun": "الجولة الأخيرة",
|
|
"never": "أبداً",
|
|
"duration": "{{seconds}}s",
|
|
"stepOutput": "الناتج",
|
|
"stepError": "خطأ",
|
|
"dryRunBadge": "تشغيل تجريبي",
|
|
"hostSelector": {
|
|
"trigger": "تشغيل المضيف",
|
|
"host": "مضيف محدد",
|
|
"fleet": "أسطول",
|
|
"all": "جميع المضيفين"
|
|
},
|
|
"triggerKinds": {
|
|
"metric_threshold": "العتبة المترية",
|
|
"host_status": "يرتفع أو ينخفض مستوى المضيف",
|
|
"health_check": "تغييرات في الفحص الصحي",
|
|
"schedule": "وفقًا لجدول زمني",
|
|
"docker_event": "حدث الحاوية",
|
|
"internal_event": "حدث تيرميكس",
|
|
"webhook": "رابط الويب الوارد"
|
|
},
|
|
"stepTypes": {
|
|
"notify": "إرسال إشعار",
|
|
"http": "استدعاء عنوان URL",
|
|
"run_snippet": "قم بتشغيل جزء من التعليمات البرمجية",
|
|
"run_command": "نفّذ أمرًا",
|
|
"docker": "التحكم في حاوية",
|
|
"tunnel": "التحكم في نفق",
|
|
"wol": "أيقظ مضيفًا",
|
|
"wait": "انتظر",
|
|
"set_var": "قم بتعيين متغير",
|
|
"if": "إذا / خلاف ذلك",
|
|
"run_automation": "قم بتشغيل عملية أتمتة أخرى",
|
|
"stop": "قف"
|
|
},
|
|
"statuses": {
|
|
"running": "جري",
|
|
"success": "نجاح",
|
|
"failed": "فشل",
|
|
"timeout": "انتهت مهلة الاتصال",
|
|
"skipped": "تم التخطي",
|
|
"cancelled": "تم الإلغاء"
|
|
},
|
|
"fields": {
|
|
"host": "يستضيف",
|
|
"metric": "متري",
|
|
"mount": "نقطة التثبيت",
|
|
"operator": "يكون",
|
|
"value": "قيمة",
|
|
"forSeconds": "استمر لمدة (ثوانٍ)",
|
|
"cooldown": "فترة التهدئة (بالدقائق)",
|
|
"cron": "تعبير كرون",
|
|
"intervalSeconds": "كل (ثانية)",
|
|
"timezone": "المنطقة الزمنية",
|
|
"timezoneServer": "وقت الخادم",
|
|
"timezoneHint": "تُقرأ أوقات Cron في هذه المنطقة. لا ينطبق ذلك على الجداول الزمنية الفاصلة.",
|
|
"container": "حاوية",
|
|
"command": "يأمر",
|
|
"url": "عنوان URL",
|
|
"method": "طريقة",
|
|
"body": "جسم",
|
|
"channels": "القنوات",
|
|
"title": "عنوان",
|
|
"message": "رسالة",
|
|
"snippet": "مقتطف",
|
|
"seconds": "ثوانٍ",
|
|
"conditionLeftPlaceholder": "قيمة يجب التحقق منها",
|
|
"conditionRightPlaceholder": "قارن بـ",
|
|
"variableName": "اسم المتغير",
|
|
"variableValue": "قيمة",
|
|
"elevated": "قم بتشغيل الأمر sudo",
|
|
"onError": "إذا فشل هذا",
|
|
"allowPrivateNetwork": "السماح بعناوين الشبكة المحلية",
|
|
"allowPrivateNetworkHint": "هذا الخيار ضروري لخدمة مُستضافة ذاتيًا على شبكتك المحلية. وهو مُعطّل افتراضيًا لمنع الطلبات إلى العناوين الداخلية."
|
|
},
|
|
"onError": {
|
|
"stop": "أوقف الجري",
|
|
"continue": "حمل"
|
|
}
|
|
},
|
|
"fleets": {
|
|
"title": "الأساطيل",
|
|
"createFleet": "إنشاء أسطول",
|
|
"createFleetTitle": "إنشاء أسطول",
|
|
"editFleetTitle": "تعديل الأسطول",
|
|
"createFleetDescription": "الأسطول عبارة عن مجموعة محددة من المضيفين يمكنك شنّ عمليات ضدهم كوحدة واحدة.",
|
|
"nameLabel": "اسم",
|
|
"namePlaceholder": "مثال: خوادم الويب",
|
|
"nameRequired": "اسم الأسطول مطلوب",
|
|
"descriptionLabel": "وصف",
|
|
"descriptionPlaceholder": "وصف اختياري",
|
|
"colorLabel": "لون",
|
|
"tagRulesLabel": "قواعد الوسوم",
|
|
"tagRulesPlaceholder": "موقع الإنتاج، الحافة",
|
|
"tagRulesHint": "يتم تضمين المضيفين الذين يحملون أيًا من هذه العلامات تلقائيًا، بالإضافة إلى المضيفين الذين تمت إضافتهم يدويًا.",
|
|
"fleetCreated": "تم إنشاء الأسطول",
|
|
"fleetUpdated": "تحديث الأسطول",
|
|
"fleetDeleted": "تم حذف الأسطول",
|
|
"saveFailed": "فشل في إنقاذ الأسطول",
|
|
"deleteFailed": "فشل حذف الأسطول",
|
|
"loadFailed": "فشل تحميل الأساطيل",
|
|
"deleteFleetTitle": "حذف الأسطول",
|
|
"deleteFleetDescription": "هل أنت متأكد من رغبتك في حذف \"{{name}}\"؟ هذا لا يحذف المضيفين الأعضاء أنفسهم.",
|
|
"searchFleets": "أساطيل البحث...",
|
|
"noFleets": "لا توجد أساطيل حتى الآن. أنشئ أسطولاً للبدء.",
|
|
"memberCount": "{{count}} المضيف",
|
|
"memberCount_other": "{{count}} المضيفون",
|
|
"manageMembers": "إدارة الأعضاء",
|
|
"manageMembersTitle": "إدارة أعضاء الأسطول",
|
|
"manageMembersDescription": "قم بتفعيل أو تعطيل عضوية المضيفين في هذه المجموعة الثابتة. يتم تضمين المضيفين الذين تتطابق قواعد الوسوم معهم دائمًا.",
|
|
"searchHosts": "ابحث عن المضيفين...",
|
|
"noHostsFound": "لم يتم العثور على مضيفين",
|
|
"noMembers": "لا يوجد أعضاء في هذا الأسطول حتى الآن. أضف مضيفين أو حدد قاعدة للوسوم.",
|
|
"membersLoadFailed": "فشل تحميل أعضاء الأسطول",
|
|
"memberUpdateFailed": "فشل تحديث عضوية الأسطول",
|
|
"tabRun": "تشغيل الأمر",
|
|
"tabTransfer": "نقل الملفات",
|
|
"tabInventory": "جرد",
|
|
"openInventoryTab": "افتح في علامة تبويب كاملة",
|
|
"tabPackages": "الطرود",
|
|
"runOnFleet": "انطلق على الأسطول",
|
|
"commandPlaceholder": "وقت التشغيل && df -h",
|
|
"commandRequired": "يلزم إصدار أمر",
|
|
"commandInputsLabel": "إدخالات الأوامر",
|
|
"commandSucceeded": "تم تنفيذ الأمر بنجاح على جميع الأجهزة المضيفة",
|
|
"commandPartialFailure": "فشل {{failed}} من أصل {{total}} مضيف",
|
|
"commandFailed": "فشل تنفيذ الأمر",
|
|
"resultSuccess": "نجاح",
|
|
"resultFailed": "فشل",
|
|
"push": "يدفع",
|
|
"pull": "يحذب",
|
|
"remotePathLabel": "مسار بعيد",
|
|
"remotePathRequired": "يلزم وجود مسار بعيد",
|
|
"fileLabel": "ملف",
|
|
"fileRequired": "الملف مطلوب",
|
|
"pushHint": "يتم كتابة الملف المحدد في هذا المسار المحدد على كل مضيف في الأسطول.",
|
|
"pullHint": "يتم قراءة الملف الموجود في هذا المسار من كل مضيف وتنزيله كملف مضغوط واحد، مجلد واحد لكل مضيف.",
|
|
"transferComplete": "اكتملت عملية النقل",
|
|
"transferFailed": "فشلت عملية النقل",
|
|
"refreshInventory": "تحديث المخزون",
|
|
"inventoryLoadFailed": "فشل تحميل المخزون",
|
|
"inventoryRefreshed": "تم تحديث المخزون",
|
|
"inventoryRefreshFailed": "فشل تحديث المخزون",
|
|
"inventoryNoData": "لا توجد بيانات جرد حتى الآن - قم بتحديث الصفحة لجمعها.",
|
|
"inventoryHost": "يستضيف",
|
|
"inventoryCollectedCount": "تم جمع {{count}}/{{total}}",
|
|
"inventoryOs": "نظام التشغيل",
|
|
"inventoryKernel": "النواة",
|
|
"inventoryArch": "قوس",
|
|
"inventoryUptime": "وقت التشغيل",
|
|
"inventoryPackageManager": "مدير الحزم",
|
|
"inventoryCollectedAt": "تم جمعها",
|
|
"packageActionLabel": "فعل",
|
|
"packageInstall": "ثَبَّتَ",
|
|
"packageRemove": "يزيل",
|
|
"packageUpgradeAll": "قم بترقية جميع الحزم",
|
|
"packageNameLabel": "اسم الحزمة",
|
|
"packageNameRequired": "اسم الحزمة مطلوب",
|
|
"packageHint": "يتطلب الوصول على مستوى الإدارة لكل مضيف ويتم رفعه باستخدام كلمة مرور sudo المخزنة للمضيف."
|
|
},
|
|
"workspaces": {
|
|
"title": "مساحات العمل",
|
|
"saveCurrent": "حفظ الوضع الحالي",
|
|
"saveCurrentTitle": "حفظ مساحة العمل الحالية",
|
|
"saveCurrentDescription": "احفظ كل علامة تبويب مفتوحة، وتخطيط مقسم، وترتيب أجزاء كمساحة عمل جديدة مسماة.",
|
|
"nameLabel": "اسم",
|
|
"namePlaceholder": "مثال: تصحيح أخطاء الإنتاج",
|
|
"nameRequired": "اسم مساحة العمل مطلوب",
|
|
"colorLabel": "لون",
|
|
"workspaceCreated": "تم حفظ مساحة العمل",
|
|
"workspaceUpdated": "تم تحديث مساحة العمل",
|
|
"workspaceDeleted": "تم حذف مساحة العمل",
|
|
"workspaceDuplicated": "تم تكرار مساحة العمل",
|
|
"saveFailed": "فشل حفظ مساحة العمل",
|
|
"updateFailed": "فشل تحديث مساحة العمل",
|
|
"deleteFailed": "فشل حذف مساحة العمل",
|
|
"duplicateFailed": "فشل تكرار مساحة العمل",
|
|
"loadFailed": "فشل تحميل مساحات العمل",
|
|
"applyFailed": "فشل تطبيق مساحة العمل",
|
|
"deleteWorkspaceTitle": "حذف مساحة العمل",
|
|
"deleteWorkspaceDescription": "هل أنت متأكد من رغبتك في حذف \"{{name}}\"؟ لا يمكن التراجع عن هذا.",
|
|
"noWorkspaces": "لم يتم حفظ أي مساحات عمل حتى الآن. احفظ ترتيب علامات التبويب الحالي للبدء.",
|
|
"tabCount": "{{count}} علامة تبويب",
|
|
"tabCount_other": "علامات تبويب {{count}}",
|
|
"apply": "يتقدم",
|
|
"applyConfirmTitle": "تطبيق مساحة العمل",
|
|
"applyConfirmDescription": "سيؤدي تطبيق \"{{name}}\" إلى إغلاق علامات التبويب الحالية واستبدالها بالترتيب المحفوظ لمساحة العمل هذه. ستفقد التغييرات غير المحفوظة على تخطيطك الحالي.",
|
|
"applyConfirmButton": "تطبيق مساحة العمل",
|
|
"updateWithCurrent": "تحديث بالبيانات الحالية",
|
|
"updateWithCurrentConfirm": "هل تريد استبدال \"{{name}}\" بترتيب علامات التبويب الحالي؟",
|
|
"rename": "إعادة تسمية",
|
|
"duplicate": "ينسخ",
|
|
"duplicateNameSuffix": "{{name}} (نسخة)",
|
|
"setDefault": "تعيين كافتراضي",
|
|
"unsetDefault": "إزالة كإعداد افتراضي",
|
|
"defaultBadge": "تقصير",
|
|
"lastSession": "الجلسة الأخيرة",
|
|
"lastSessionDescription": "يتم تحديثها تلقائيًا بأحدث ترتيب لعلامات التبويب لديك. قم بتطبيقها لاستعادة ما كنت قد فتحته.",
|
|
"lastUsed": "آخر استخدام {{time}}",
|
|
"neverUsed": "لم يتم التقديم مطلقا",
|
|
"tabsSkipped": "تم تطبيق مساحة العمل — تم تخطي علامة (علامات) التبويب {{count}} (لم يعد المضيف موجودًا): {{names}}"
|
|
},
|
|
"keybindings": {
|
|
"title": "اختصارات لوحة المفاتيح",
|
|
"description": "قم بتخصيص اختصارات النسخ واللصق والتحكم في الطرفية، أو اربط المفاتيح لإرسال نص أو تشغيل جزء من التعليمات البرمجية.",
|
|
"defaultsHeading": "اختصارات مدمجة",
|
|
"customHeading": "اختصارات مخصصة",
|
|
"addBinding": "إضافة اختصار",
|
|
"addBindingTitle": "إضافة اختصار",
|
|
"editBindingTitle": "تحرير الاختصار",
|
|
"loading": "تحميل...",
|
|
"noCustomBindings": "لا توجد اختصارات مخصصة حتى الآن",
|
|
"defaultBadge": "تقصير",
|
|
"customizedBadge": "مخصص",
|
|
"customize": "تخصيص",
|
|
"resetToDefault": "إعادة الضبط إلى الوضع الافتراضي",
|
|
"resetAllToDefaults": "إعادة ضبط جميع الإعدادات إلى الوضع الافتراضي",
|
|
"close": "يغلق",
|
|
"cancel": "يلغي",
|
|
"saveBinding": "حفظ الاختصار",
|
|
"saveError": "فشل حفظ اختصارات لوحة المفاتيح",
|
|
"pressKeysToRecord": "مجموعة المفاتيح",
|
|
"pressKeysPlaceholder": "انقر واضغط على المفاتيح",
|
|
"recording": "اضغط على المفاتيح...",
|
|
"comboRequiredError": "اضغط على مجموعة مفاتيح أولاً",
|
|
"textRequiredError": "أدخل النص المراد إرساله",
|
|
"controlCodeRequiredError": "أدخل حرفًا واحدًا لرمز التحكم",
|
|
"snippetRequiredError": "حدد جزءًا من التعليمات البرمجية",
|
|
"conflictWarning": "هذا المزيج مرتبط بالفعل بـ {{combo}}. سيؤدي الحفظ إلى إطلاق النار من كليهما.",
|
|
"actionLabel": "فعل",
|
|
"actionCopy": "تحديد النص",
|
|
"actionPaste": "لصق",
|
|
"actionSendControlCode": "إرسال إشارة Ctrl+حرف",
|
|
"actionSendText": "أرسل رسالة نصية",
|
|
"actionRunSnippet": "تشغيل المقتطف البرمجي الحالي",
|
|
"actionNextTab": "انتقل إلى علامة التبويب التالية",
|
|
"actionPreviousTab": "انتقل إلى علامة التبويب السابقة",
|
|
"actionOpenCommandPalette": "افتح البحث السريع",
|
|
"controlCodeLabel": "خطاب",
|
|
"textLabel": "نص لإرساله",
|
|
"appendEnterLabel": "اضغط على زر الإدخال بعد الإرسال",
|
|
"snippetLabel": "مقتطف",
|
|
"selectSnippetPlaceholder": "حدد جزءًا من التعليمات البرمجية",
|
|
"orphanedSnippetWarning": "لم يتم العثور على المقتطف",
|
|
"clipboardPermissionNote": "قد يطلب منك بعض المتصفحات منح إذن الوصول إلى الحافظة عند الاستخدام الأول."
|
|
},
|
|
"connectionDefaults": {
|
|
"title": "الإعدادات الافتراضية للاتصال",
|
|
"description": "قم بتعيين القيم التي يرثها كل مضيف ما لم يقم بتجاوزها.",
|
|
"manage": "يدير",
|
|
"dialogDescription": "تنطبق هذه الشروط على الأجهزة المضيفة التي تترك إعدادًا غير مُحدد. أي إعداد مُحدد على الجهاز المضيف هو الذي يُعتمد.",
|
|
"tabTerminal": "صالة",
|
|
"tabRemoteDesktop": "سطح المكتب البعيد",
|
|
"inherit": "يرث",
|
|
"on": "على",
|
|
"off": "عن",
|
|
"resizeDisplayUpdate": "تحديث الشاشة",
|
|
"resizeReconnect": "إعادة الاتصال",
|
|
"clearAll": "مسح الكل",
|
|
"saved": "تم حفظ إعدادات الاتصال الافتراضية",
|
|
"saveFailed": "فشل حفظ إعدادات الاتصال الافتراضية"
|
|
},
|
|
"userProfile": {
|
|
"donateTitle": "ضمان استمرارية Termix",
|
|
"donateDescription": "Termix مجاني، وذاتي الاستضافة، وقد أنشأه عدد قليل من الأشخاص في أوقات فراغهم. إذا وفر عليك الوقت أو المال، فإن التبرع بالعملات الرقمية يساعد في استمراريته.",
|
|
"donateMilestones": "التبرعات تساعد في تمويل الوقت للبحث والتعلم عما يلزم لبناء دعم SAML و Kubernetes و Agent. شاهد التقدم وتبرع.",
|
|
"donateButton": "تبرع بالعملات الرقمية",
|
|
"storageModeLocal": "المتصفح",
|
|
"storageModeCloud": "قاعدة البيانات",
|
|
"storageModeDescription": "المتصفح يخزن الإعدادات في هذا المتصفح فقط. قاعدة البيانات تتم مزامنتها مع الخادم وتحميلها على أي جهاز.",
|
|
"resetToDefaults": "استعادة الإعدادات الافتراضية",
|
|
"resetToDefaultsSuccess": "تمت إعادة تعيين الإعدادات إلى الوضع الافتراضي.",
|
|
"storageModeSwitch": "تخزين التفضيلات",
|
|
"sectionAccount": "الحساب",
|
|
"desktopProfileTitle": "ملف تعريف سطح المكتب المحلي التلقائي",
|
|
"desktopProfileDescription": "يقتصر هذا الملف الشخصي على الواجهة الخلفية المدمجة ويتم تسجيل الدخول إليه تلقائيًا. لا يتطلب كلمة مرور لتسجيل الدخول؛ يستخدم المزامنة عن بُعد أدناه حساب خادم منفصل.",
|
|
"sectionInterface": "واجهة المستخدم",
|
|
"interfacePresetDesc": "ما مدى دقة التفاصيل التي يعرضها برنامج Termix؟ جميع الميزات تبقى متاحة.",
|
|
"preset_simple": "بسيط",
|
|
"preset_simple_desc": "الضروريات فقط.",
|
|
"preset_balanced": "متوازن",
|
|
"preset_balanced_desc": "التصميم القياسي.",
|
|
"preset_advanced": "متقدم",
|
|
"preset_advanced_desc": "كل شيء مُفعّل، ومُكدّس بكثافة.",
|
|
"presetClearOverrides": "إعادة ضبط الكل",
|
|
"presetOverridesTitle": "مخصص",
|
|
"presetRevertArea": "يرجع",
|
|
"presetConfirmTitle": "التبديل إلى {{preset}}؟",
|
|
"presetConfirmDesc": "يؤدي هذا إلى إعادة ضبط الشريط الجانبي، وقائمة التنقل، وتخطيط لوحة التحكم، وشريط أدوات الطرفية، وعرض مدير الملفات. لن يتم تغيير إعدادات المضيفين، أو بيانات الاعتماد، أو الصفحة الرئيسية.",
|
|
"presetConfirmApply": "تطبيق الإعدادات المسبقة",
|
|
"runSetupAgainDesc": "قم بمراجعة إعدادات الجولة الأولى مرة أخرى.",
|
|
"runSetupAgainButton": "قم بتشغيل الإعداد",
|
|
"uiArea_chrome": "تطبيق كروم",
|
|
"uiArea_hostList": "قائمة المضيفين",
|
|
"uiArea_credentialList": "قائمة بيانات الاعتماد",
|
|
"uiArea_rail": "ملاحة",
|
|
"uiArea_dashboard": "لوحة التحكم",
|
|
"uiArea_terminal": "صالة",
|
|
"uiArea_fileManager": "مدير الملفات",
|
|
"uiArea_docker": "عامل ميناء",
|
|
"uiArea_hostMetrics": "مقاييس المضيف",
|
|
"uiArea_hostEditor": "محرر المضيف",
|
|
"uiArea_homepage": "الصفحة الرئيسية",
|
|
"sectionAppearance": "المظهر",
|
|
"sectionSecurity": "الأمان",
|
|
"sectionApiKeys": "مفاتيح API",
|
|
"sectionData": "بيانات",
|
|
"sectionC2sTunnels": "أنفاق C2S",
|
|
"usernameLabel": "اسم المستخدم",
|
|
"roleLabel": "الدور",
|
|
"roleAdministrator": "مسؤول",
|
|
"authMethodLabel": "طريقة المصادقة",
|
|
"authMethodLocal": "محلي",
|
|
"twoFaLabel": "المصادقة الثنائية",
|
|
"twoFaOn": "مفعلة",
|
|
"twoFaOff": "غير مفعلة",
|
|
"versionLabel": "الإصدار",
|
|
"betaProgramTitle": "برنامج بيتا",
|
|
"betaProgramDescription": "جرب الميزات القادمة مبكراً مع الوسم الأسبوعي المتجدد :beta لـ Docker. غير مستقر، وغير مخصص للإنتاج.",
|
|
"betaProgramFeedback": "وجدت خطأ؟ أبلغ عنه هنا.",
|
|
"betaProgramLearnMore": "معرفة المزيد",
|
|
"cliTitle": "واجهة سطر الأوامر Termix",
|
|
"cliDescription": "افتح المحطات الطرفية، وقم بتشغيل الأوامر، وانقل الملفات من خلال سطر الأوامر الخاص بك.",
|
|
"cliLearnMore": "يتعلم أكثر",
|
|
"deleteAccount": "حذف الحساب",
|
|
"deleteAccountDescription": "حذف حسابك بشكل دائم",
|
|
"changeServerDescription": "التبديل إلى خادم Termix خلفي آخر",
|
|
"deleteButton": "حذف",
|
|
"deleteAccountPermanent": "هذا الإجراء دائم ولا يمكن التراجع عنه.",
|
|
"deleteAccountWarning": "سيتم حذف جميع الجلسات والمضيفين وبيانات الاعتماد والإعدادات بشكل دائم.",
|
|
"confirmPasswordDeletePlaceholder": "أدخل كلمة المرور للتأكيد",
|
|
"languageLabel": "اللغة",
|
|
"themeLabel": "المظهر",
|
|
"fontSizeLabel": "حجم الخط",
|
|
"interfaceFontLabel": "خط واجهة المستخدم",
|
|
"interfaceFontDescription": "يُغيّر هذا الخيار خط واجهة التطبيق. تحتفظ ملفات تعريف الطرفية بإعدادات الخط الخاصة بها.",
|
|
"accentColorLabel": "لون التمييز",
|
|
"settingsTerminal": "الطرفية",
|
|
"commandAutocomplete": "الإكمال التلقائي للأوامر",
|
|
"commandAutocompleteDesc": "إظهار الإكمال التلقائي أثناء الكتابة عند الضغط على زر Tab",
|
|
"localEcho": "صدى محلي",
|
|
"localEchoDesc": "تقليل زمن استجابة الإدخال المُدرك باستخدام التنبؤ الآمن المحلي بضغطات المفاتيح",
|
|
"keyboardShortcuts": "اختصارات لوحة المفاتيح",
|
|
"keyboardShortcutsDescription": "تخصيص اختصارات النسخ واللصق والأوامر في الطرفية",
|
|
"manageShortcuts": "يدير",
|
|
"terminalLinkBehavior": "سلوك النقر على الروابط في الطرفية",
|
|
"terminalLinkBehaviorDesc": "السلوك الافتراضي عند النقر على الروابط في الطرفية",
|
|
"historyTracking": "تتبع السجل",
|
|
"historyTrackingDesc": "تتبع أوامر الطرفية",
|
|
"commandPalette": "لوحة الأوامر",
|
|
"commandPaletteDesc": "تمكين اختصار لوحة المفاتيح",
|
|
"reopenTabsOnLogin": "إعادة فتح علامات التبويب عند تسجيل الدخول",
|
|
"reopenTabsOnLoginDesc": "استعادة علامات التبويب المفتوحة عند تسجيل الدخول أو تحديث الصفحة، حتى من جهاز آخر",
|
|
"confirmTabClose": "تأكيد إغلاق علامة التبويب",
|
|
"confirmTabCloseDesc": "طلب التأكيد قبل إغلاق علامات تبويب الطرفية",
|
|
"transferConcurrency": "نقل الملفات المتزامن",
|
|
"transferConcurrencyDesc": "كم عدد الملفات التي يقوم مدير الملفات المحلي/البعيد بتحميلها أو تنزيلها في نفس الوقت؟ قلل هذا العدد إذا كان خادمك يحد من قنوات SFTP.",
|
|
"settingsAppRail": "تطبيق السكك الحديدية",
|
|
"sidebarSettingsMoved": "تم نقل إعدادات عرض الشريط الجانبي للمضيف إلى لوحة تخصيص الشريط الجانبي، والتي يتم فتحها من شريط أدوات المضيفين.",
|
|
"showHostTags": "إظهار وسوم المضيفين",
|
|
"showHostTagsDesc": "عرض الوسوم في قائمة المضيفين",
|
|
"hostTrayOnClick": "النقر لتوسيع إجراءات المضيف",
|
|
"hostTrayOnClickDesc": "إظهار أزرار الاتصال دائمًا؛ النقر لتوسيع خيارات الإدارة بدلاً من التحويم",
|
|
"compactHostView": "عرض مضغوط للمضيفين",
|
|
"compactHostViewDesc": "طي كل مضيف إلى سطر واحد يعرض الاسم والعنوان فقط",
|
|
"statusColors": "ألوان الحالة الحقيقية",
|
|
"statusColorsDesc": "استخدام الأخضر/الأحمر لحالة الاتصال/عدم الاتصال بدلاً من لون التمييز",
|
|
"pinAppRail": "تثبيت شريط التطبيقات",
|
|
"pinAppRailDesc": "إبقاء شريط التطبيقات الأيسر موسعًا دائمًا بدلاً من التوسيع عند التحويم",
|
|
"openFullscreenSettings": "افتح الإعدادات في وضع ملء الشاشة",
|
|
"exitFullscreenSettings": "الخروج من إعدادات ملء الشاشة",
|
|
"expandAppRailOnHover": "توسيع شريط التطبيقات عند التحويم",
|
|
"expandAppRailOnHoverDesc": "السماح بتوسيع شريط التطبيقات الأيسر عند تحريك المؤشر فوقه",
|
|
"showPinAppRailButton": "إظهار زر تثبيت التطبيق",
|
|
"showPinAppRailButtonDesc": "إظهار زر في شريط التطبيق لتثبيته مفتوحًا. مُعطّل افتراضيًا.",
|
|
"settingsNavigation": "التنقل",
|
|
"navigationTabsDesc": "اختيار علامات التبويب التي تظهر في شريط التطبيق",
|
|
"showSnippetCommands": "عرض الأوامر",
|
|
"showSnippetCommandsDesc": "اعرض أمر كل جزء من التعليمات البرمجية أسفل اسمه. قم بإيقاف تشغيل هذا الخيار لعرض قائمة مختصرة.",
|
|
"foldersCollapsed": "المجلدات المطوية",
|
|
"foldersCollapsedDesc": "طي المجلدات افتراضيًا",
|
|
"confirmExecution": "تأكيد التنفيذ",
|
|
"confirmExecutionDesc": "طلب التأكيد قبل تشغيل المقتطفات",
|
|
"settingsUpdates": "التحديثات",
|
|
"disableUpdateChecks": "تعطيل التحقق من التحديثات",
|
|
"disableUpdateChecksDesc": "إيقاف التحقق من التحديثات",
|
|
"totpAuthenticator": "مُوثِّق TOTP",
|
|
"totpEnabled": "التحقق بخطوتين ممكّن",
|
|
"totpDisabled": "إضافة أمان إضافي لتسجيل الدخول",
|
|
"totpAddAuthenticator": "إضافة جهاز",
|
|
"totpAddTitle": "إضافة جهاز المصادقة",
|
|
"totpAddDescription": "قم بتأكيد هويتك لتسجيل مصادق آخر باستخدام نفس مفتاح TOTP الآمن.",
|
|
"totpAddInputRequired": "أدخل رمز TOTP أو كلمة المرور الخاصة بك",
|
|
"totpAddFailed": "فشل إضافة المصادقة",
|
|
"totpAddScanInstructions": "امسح رمز الاستجابة السريعة هذا باستخدام أداة المصادقة الإضافية. ستستمر أدوات المصادقة الحالية في العمل.",
|
|
"totpAddSuccess": "تم تسجيل مصادق إضافي",
|
|
"disable": "تعطيل",
|
|
"enable": "تمكين",
|
|
"setupTotp": "إعداد TOTP",
|
|
"qrCode": "رمز الاستجابة السريعة",
|
|
"totpInstructions": "امسح رمز الاستجابة السريعة أو أدخل السر في تطبيق الموثق، ثم أدخل الرمز المكون من 6 أرقام",
|
|
"totpCodePlaceholder": "000000",
|
|
"verify": "تحقق",
|
|
"changePassword": "تغيير كلمة المرور",
|
|
"currentPasswordLabel": "كلمة المرور الحالية",
|
|
"currentPasswordPlaceholder": "كلمة المرور الحالية",
|
|
"newPasswordLabel": "كلمة المرور الجديدة",
|
|
"newPasswordPlaceholder": "كلمة المرور الجديدة",
|
|
"confirmPasswordLabel": "تأكيد كلمة المرور الجديدة",
|
|
"confirmPasswordPlaceholder": "تأكيد كلمة المرور الجديدة",
|
|
"updatePassword": "تحديث كلمة المرور",
|
|
"createApiKeyTitle": "إنشاء مفتاح API",
|
|
"createApiKeyDescription": "توليد مفتاح API جديد للوصول البرمجي.",
|
|
"apiKeyNameLabel": "الاسم",
|
|
"apiKeyNamePlaceholder": "مثال: مسار CI",
|
|
"expiryDateLabel": "تاريخ الانتهاء",
|
|
"optional": "اختياري",
|
|
"cancel": "إلغاء",
|
|
"createKey": "إنشاء مفتاح",
|
|
"apiKeyCreatedWarning": "تم إنشاء المفتاح - انسخه الآن، لن يظهر مرة أخرى.",
|
|
"copyApiKey": "نسخ مفتاح API",
|
|
"copiedToClipboard": "تم نسخها إلى الحافظة",
|
|
"apiKeyCount": "{{count}} مفتاح",
|
|
"newKey": "مفتاح جديد",
|
|
"noApiKeys": "لا توجد مفاتيح API بعد.",
|
|
"apiKeyActive": "نشط",
|
|
"apiKeyUsageHint": "قم بتضمين مفتاحك في",
|
|
"apiKeyUsageHintHeader": "رأس الطلب.",
|
|
"apiKeyPermissionsHint": "ترث المفاتيح صلاحيات المستخدم المنشئ.",
|
|
"exportData": "تصدير بياناتي",
|
|
"exportDataDesc": "قم بتنزيل نسخة احتياطية من ملفات المضيفين وبيانات الاعتماد والإعدادات الخاصة بك لنقلها إلى جهاز آخر.",
|
|
"export": "يصدّر",
|
|
"exporting": "جارٍ التصدير...",
|
|
"importData": "استيراد بياناتي",
|
|
"importDataDesc": "استعد بيانات المضيفين وبيانات الاعتماد والإعدادات من ملف نسخ احتياطي بصيغة .sqlite",
|
|
"importDataSelected": "تم الاختيار: {{name}}",
|
|
"selectFile": "حدد ملفًا",
|
|
"changeFile": "يتغير",
|
|
"import": "يستورد",
|
|
"importing": "جارٍ الاستيراد...",
|
|
"exportSuccess": "تم تصدير البيانات بنجاح",
|
|
"exportFailed": "فشل تصدير البيانات",
|
|
"importSelectFile": "يرجى تحديد ملف أولاً",
|
|
"importCompleted": "اكتمل الاستيراد: تم استيراد {{total}} عنصرًا، وتم تخطي {{skipped}} عنصرًا",
|
|
"importFailed": "فشل الاستيراد: {{error}}",
|
|
"roleUser": "مستخدم",
|
|
"authMethodDual": "مصادقة مزدوجة",
|
|
"authMethodOidc": "OIDC",
|
|
"totpSetupFailed": "فشل بدء إعداد TOTP",
|
|
"totpEnter6Digits": "أدخل رمزًا من 6 أرقام",
|
|
"totpEnabledSuccess": "تم تمكين المصادقة الثنائية",
|
|
"totpInvalidCode": "رمز غير صالح، يرجى المحاولة مرة أخرى",
|
|
"totpDisableInputRequired": "أدخل رمز TOTP أو كلمة المرور",
|
|
"totpDisabledSuccess": "تم تعطيل المصادقة الثنائية",
|
|
"totpDisableFailed": "فشل تعطيل المصادقة الثنائية",
|
|
"totpDisableTitle": "تعطيل المصادقة الثنائية",
|
|
"totpDisablePlaceholder": "أدخل رمز TOTP أو كلمة المرور",
|
|
"totpDisableConfirm": "تعطيل المصادقة الثنائية",
|
|
"totpContinueVerify": "متابعة للتحقق",
|
|
"totpVerifyTitle": "التحقق من الرمز",
|
|
"totpBackupTitle": "رموز النسخ الاحتياطي",
|
|
"totpDownloadBackup": "تنزيل رموز النسخ الاحتياطي",
|
|
"passkeys": "مفاتيح المرور",
|
|
"passkeysDesc": "استخدم بيانات اعتماد WebAuthn/FIDO2 لتسجيل الدخول بدون كلمة مرور",
|
|
"passkeyName": "اسم مفتاح المرور",
|
|
"passkeyUvPreferred": "مفضل",
|
|
"passkeyUvRequired": "مطلوب",
|
|
"passkeyUvDiscouraged": "غير مشجع",
|
|
"addPasskey": "إضافة مفتاح مرور",
|
|
"noPasskeys": "لا توجد مفاتيح مرور مسجلة.",
|
|
"passkeyAdded": "تمت إضافة مفتاح المرور",
|
|
"passkeyAddFailed": "فشل إضافة مفتاح المرور",
|
|
"passkeyDeleted": "تم حذف مفتاح المرور",
|
|
"passkeyDeleteFailed": "فشل حذف مفتاح المرور",
|
|
"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": "دراكولا",
|
|
"themeCatppuccin": "كاتبوسين",
|
|
"themeNord": "نورد",
|
|
"themeSolarized": "سولارايزد",
|
|
"themeTokyoNight": "طوكيو نايت",
|
|
"themeOneDark": "ون دارك",
|
|
"themeGruvbox": "جروفبوكس"
|
|
}
|
|
}
|
|
},
|
|
"terminalToolbar": {
|
|
"title": "شريط أدوات الطرفية",
|
|
"showActions": "إظهار شريط الأدوات",
|
|
"hideToolbar": "إخفاء شريط الأدوات",
|
|
"showToolbar": "توسيع شريط الأدوات",
|
|
"moveToolbar": "نقل شريط الأدوات",
|
|
"moveToolbarHint": "اسحب لإعادة وضع شريط الأدوات",
|
|
"layout": "وضع عرض شريط الأدوات",
|
|
"layoutIcon": "أيقونة فقط",
|
|
"layoutLabeled": "الرموز والملصقات",
|
|
"layoutExpanded": "تم توسيعه بمقاييس",
|
|
"image": "إجراءات الصور (للصور فقط)",
|
|
"upload": "تحميل صورة",
|
|
"paste": "لصق الصورة",
|
|
"detachTmux": "افصل tmux",
|
|
"detachTmuxDescription": "فصل جلسة tmux",
|
|
"imageActionFailed": "فشلت عملية معالجة الصورة",
|
|
"retry": "إعادة المحاولة",
|
|
"dismissError": "تجاهل خطأ الصورة",
|
|
"cpu": "وحدة المعالجة المركزية",
|
|
"memory": "ذاكرة",
|
|
"disk": "أدك",
|
|
"statsUnavailable": "الإحصائيات المباشرة غير متوفرة",
|
|
"tmuxDetach": "فصل جلسة tmux",
|
|
"uploadImage": "قم بتحميل صورة إلى المضيف",
|
|
"uploadingImage": "جارٍ التحميل...",
|
|
"pasteImage": "لصق الصورة من الحافظة (الصور فقط)",
|
|
"openFiles": "فتح الملفات",
|
|
"openDocker": "أوبن دوكر",
|
|
"openTunnel": "نفق مفتوح",
|
|
"openHostMetrics": "مقاييس المضيف المفتوح",
|
|
"openProxmoxStats": "افتح إحصائيات Proxmox",
|
|
"openTmuxMonitor": "افتح شاشة Tmux"
|
|
},
|
|
"tmuxMonitor": {
|
|
"title": "مراقب Tmux",
|
|
"failedToLoadHosts": "فشل تحميل الأجهزة المضيفة",
|
|
"failedToLoad": "فشل تحميل جلسات tmux",
|
|
"tmuxUnavailable": "tmux غير مثبت على هذا الجهاز المضيف",
|
|
"noSessions": "لا توجد جلسات tmux على هذا الجهاز المضيف",
|
|
"noHostSelected": "لم يتم تحديد أي جهاز مضيف",
|
|
"attached": "متصلة",
|
|
"detached": "منفصلة",
|
|
"attach": "اتصال",
|
|
"editTags": "تعديل العلامات",
|
|
"tagsHint": "علامات مفصولة بفواصل (مثال: YOLO, lab, training)",
|
|
"tagsSaved": "تم حفظ العلامات",
|
|
"tagsSaveFailed": "فشل حفظ العلامات",
|
|
"searchPlaceholder": "بحث في المخرجات عبر الجلسات...",
|
|
"searchResults": "{{count}} مطابقة",
|
|
"searchFailed": "فشل البحث",
|
|
"selectPaneHint": "حدد إطارًا لمعاينة مخرجاته",
|
|
"closePreview": "إغلاق المعاينة",
|
|
"newSession": "جلسة جديدة",
|
|
"newSessionHint": "اسم الجلسة (حروف، أرقام، _ @ % + = -)",
|
|
"newSessionPlaceholder": "my-session",
|
|
"create": "إنشاء",
|
|
"sessionCreated": "تم إنشاء الجلسة \"{{name}}\"",
|
|
"sessionCreateFailed": "فشل إنشاء الجلسة",
|
|
"splitRight": "تقسيم لليمين",
|
|
"splitDown": "تقسيم للأسفل",
|
|
"splitFailed": "فشل تقسيم الإطار",
|
|
"newWindow": "نافذة جديدة",
|
|
"windowCreateFailed": "فشل إنشاء النافذة",
|
|
"attachSessionTooltip": "اتصل بـ {{session}}",
|
|
"refresh": "تحديث",
|
|
"refreshFailed": "فشل تحديث الجلسات",
|
|
"collapseAll": "طي الكل",
|
|
"expandAll": "توسيع الكل",
|
|
"moreActions": "إجراءات أخرى",
|
|
"sessionStats": "إحصائيات الجلسة",
|
|
"renameSessionTitle": "إعادة تسمية الجلسة \"{{name}}\"",
|
|
"rename": "إعادة تسمية",
|
|
"sessionRenamed": "تمت إعادة تسمية الجلسة إلى \"{{name}}\"",
|
|
"sessionRenameFailed": "فشل إعادة تسمية الجلسة",
|
|
"editTagsTitle": "تعديل العلامات لـ \"{{name}}\"",
|
|
"killPane": "إنهاء الجزء",
|
|
"resizeTree": "اسحب لتغيير الحجم — انقر نقرًا مزدوجًا لإعادة الضبط",
|
|
"reattach": "إعادة الارتباط (لإصلاح العرض المشوش)",
|
|
"killWindow": "إنهاء النافذة",
|
|
"killWindowTitle": "هل تريد إنهاء النافذة {{index}} من الجلسة \"{{session}}\"؟",
|
|
"killWindowBody": "سيتم إنهاء كل جزء وعملية في هذه النافذة. إنهاء آخر نافذة ينهي الجلسة.",
|
|
"windowKillFailed": "فشل إنهاء النافذة",
|
|
"statusActivity": "نشاط",
|
|
"statusWindows": "نوافذ",
|
|
"statusPanes": "أجزاء",
|
|
"statusTags": "وسوم",
|
|
"killPaneTitle": "هل تريد إنهاء الجزء {{id}}؟",
|
|
"killPaneBody": "سيتم إنهاء العملية الجارية في هذا الجزء. إنهاء آخر جزء يغلق نافذته.",
|
|
"paneKillFailed": "فشل إنهاء الجزء",
|
|
"killSessionTitle": "هل تريد إنهاء الجلسة \"{{name}}\"؟",
|
|
"killSessionBody": "سيتم إنهاء جميع النوافذ والعمليات الجارية في هذه الجلسة. لا يمكن التراجع عن ذلك.",
|
|
"kill": "إنهاء",
|
|
"sessionKilled": "تم إنهاء الجلسة \"{{name}}\"",
|
|
"sessionKillFailed": "فشل إنهاء الجلسة",
|
|
"hostUnreachable": "تعذر الاتصال بالمضيف. تأكد من أنه متصل وقابل للوصول.",
|
|
"noServer": "لا يوجد خادم tmux يعمل على هذا المضيف.",
|
|
"searchTruncated": "نتائج جزئية — يشمل البحث آخر {{lines}} سطرًا من كل جزء وبحد أقصى {{panes}} جزءًا.",
|
|
"closeSearchResults": "إغلاق نتائج البحث",
|
|
"retry": "إعادة المحاولة",
|
|
"noHosts": "لا توجد مضيفات SSH متاحة",
|
|
"noHostsHint": "قم بتمكين خيار Tmux Monitor على مضيف SSH (مدير المضيفات → تبويب الطرفية) لمراقبة جلسات tmux الخاصة به.",
|
|
"tmuxInstallHint": "قم بتثبيته على المضيف باستخدام:",
|
|
"attachTooltip": "افتح طرفية إلى {{host}}",
|
|
"attachTooltipPane": "افتح طرفية إلى {{host}} — جلسة tmux {{session}}",
|
|
"timeJustNow": "الآن",
|
|
"timeMinutes": "قبل {{count}}m",
|
|
"timeHours": "قبل {{count}}h",
|
|
"timeDays": "قبل {{count}}d"
|
|
},
|
|
"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",
|
|
"paste": "لصق",
|
|
"editQuickKeys": "تحرير المفاتيح السريعة",
|
|
"quickKeysTitle": "المفاتيح السريعة",
|
|
"quickKeysDesc": "اضغط × للإزالة. يدعم حتى 8 أحرف.",
|
|
"quickKeyPlaceholder": "مثال: sudo ",
|
|
"addQuickKey": "إضافة",
|
|
"removeQuickKey": "إزالة",
|
|
"resetDefaults": "استعادة الإعدادات الافتراضية",
|
|
"done": "تم"
|
|
},
|
|
"serial": {
|
|
"title": "منفذ تسلسلي",
|
|
"portLabel": "المنفذ",
|
|
"portPlaceholder": "/dev/ttyUSB0 or COM3",
|
|
"baudRateLabel": "معدل الباود",
|
|
"dataBitsLabel": "البيانات",
|
|
"stopBitsLabel": "التوقف",
|
|
"parityLabel": "التكافؤ",
|
|
"parityNone": "بلا",
|
|
"parityEven": "زوجي",
|
|
"parityOdd": "فردي",
|
|
"connect": "اتصال",
|
|
"disconnect": "قطع الاتصال",
|
|
"refreshPorts": "تحديث المنافذ",
|
|
"connected": "متصل بـ {{path}} بسرعة {{baud}} باود",
|
|
"disconnected": "تم قطع الاتصال بالمنفذ التسلسلي",
|
|
"connectionError": "فشل في فتح المنفذ التسلسلي",
|
|
"wsError": "خطأ في WebSocket",
|
|
"errorNoServerUrl": "لم يتم تكوين عنوان URL للخادم",
|
|
"notSupportedTitle": "المنفذ التسلسلي غير مدعوم",
|
|
"notSupported": "تتطلب الاتصالات التسلسلية متصفحًا يدعم Web Serial API (Chrome، أو Edge، أو Firefox 151+)، أو تطبيق Termix لسطح المكتب.",
|
|
"hideHint": "يمكنك إخفاء تبويب المنفذ التسلسلي من الملف الشخصي > المظهر > الشريط الجانبي > التنقل.",
|
|
"browserPickerHint": "انقر على Connect وسيفتح متصفحك نافذة اختيار المنفذ لتحديد الجهاز."
|
|
},
|
|
"metricsHistory": {
|
|
"title": "سجل المقاييس",
|
|
"historySuffix": "السجل",
|
|
"cpuMemoryDisk": "وحدة المعالجة المركزية / الذاكرة / القرص",
|
|
"network": "الشبكة",
|
|
"download": "استقبال",
|
|
"upload": "إرسال",
|
|
"noData": "لا توجد بيانات تاريخية متاحة لهذا النطاق الزمني.",
|
|
"custom": "مخصص",
|
|
"to": "إلى",
|
|
"apply": "تطبيق",
|
|
"viewHistory": "عرض السجل"
|
|
},
|
|
"alerts": {
|
|
"tabFirings": "التنبيهات",
|
|
"tabRules": "القواعد",
|
|
"tabChannels": "القنوات",
|
|
"noFirings": "لا توجد تنبيهات غير مُقَرَّة",
|
|
"noRules": "لم يتم تكوين قواعد تنبيه",
|
|
"noChannels": "لم يتم تكوين قنوات إشعار",
|
|
"rulesDesc": "تقوم قواعد التنبيه بتشغيل الإشعارات",
|
|
"channelsDesc": "مكان إرسال إشعارات التنبيه",
|
|
"acknowledge": "إقرار",
|
|
"ackAll": "إقرار الكل",
|
|
"allAcknowledged": "تم إقرار جميع التنبيهات",
|
|
"ackFailed": "فشل في إقرار التنبيه",
|
|
"ackAllFailed": "فشل في إقرار جميع التنبيهات",
|
|
"showAcknowledged": "إظهار الكل",
|
|
"hideAcknowledged": "إخفاء المُقَرَّة",
|
|
"addChannel": "إضافة قناة",
|
|
"editChannel": "تعديل القناة",
|
|
"channelName": "الاسم",
|
|
"channelType": "النوع",
|
|
"channelNameRequired": "الاسم مطلوب",
|
|
"webhookUrl": "URL",
|
|
"webhookUrlRequired": "رابط Webhook مطلوب",
|
|
"webhookDesc": "يُرسل حمولة JSON عبر طلب POST إلى عنوان URL هذا عند كل تنبيه",
|
|
"ntfyServer": "عنوان URL للخادم",
|
|
"ntfyTopic": "الموضوع",
|
|
"ntfyTopicRequired": "الموضوع مطلوب",
|
|
"ntfyToken": "رمز الوصول (اختياري)",
|
|
"channelSaveFailed": "فشل حفظ القناة",
|
|
"test": "اختبار",
|
|
"testSent": "تم إرسال إشعار الاختبار",
|
|
"testFailed": "فشل إشعار الاختبار",
|
|
"testFailedWithReason": "فشل إشعار الاختبار: {{reason}}",
|
|
"addRule": "إضافة قاعدة تنبيه",
|
|
"editRule": "تعديل قاعدة تنبيه",
|
|
"ruleName": "اسم القاعدة",
|
|
"ruleNameRequired": "الاسم مطلوب",
|
|
"triggerType": "المشغّل",
|
|
"thresholdValue": "الحد (%)",
|
|
"durationSeconds": "المدة (بالثواني، 0 = إطلاق فوري)",
|
|
"cooldownMinutes": "فترة التهدئة (بالدقائق)",
|
|
"channels": "قنوات الإشعارات",
|
|
"noChannelsHint": "أضف قنوات في تبويب القنوات أولاً",
|
|
"ruleSaveFailed": "فشل حفظ القاعدة"
|
|
},
|
|
"ai": {
|
|
"title": "مساعد",
|
|
"send": "يرسل",
|
|
"stop": "قف",
|
|
"save": "يحفظ",
|
|
"cancel": "يلغي",
|
|
"running": "جري",
|
|
"approve": "يعتمد",
|
|
"reject": "يرفض",
|
|
"inputPlaceholder": "استفسر عن خوادمك، أو صف تغييرًا ترغب في اقتراحه.",
|
|
"selectProvider": "اختر مزود الخدمة",
|
|
"providerSettings": "إعدادات المزوّد",
|
|
"addProvider": "إضافة موفر",
|
|
"editProvider": "موفر التحرير",
|
|
"removeProvider": "إزالة الموفر",
|
|
"providerType": "مزود",
|
|
"providerLabel": "اسم",
|
|
"providerLabelPlaceholder": "على سبيل المثال: أولاما المحلي",
|
|
"baseUrl": "عنوان الخادم",
|
|
"apiKey": "مفتاح API",
|
|
"defaultModel": "النموذج الافتراضي",
|
|
"defaultModelPlaceholder": "على سبيل المثال: llama3.1 أو claude-opus-5",
|
|
"labelRequired": "أعطِ هذا المزوّد اسمًا",
|
|
"providerSaveFailed": "تعذر حفظ بيانات المزوّد",
|
|
"providerUpdated": "تم تحديث المزوّد",
|
|
"providerDeleteFailed": "تعذر إزالة الموفر",
|
|
"privateEndpointHint": "تحتاج العناوين الموجودة على شبكتك الخاصة إلى موافقة المسؤول أولاً للسماح للمضيف بالوصول إليها.",
|
|
"providerOllama": "أولاما",
|
|
"providerAnthropic": "الأنثروبيك",
|
|
"providerOpenai": "أوبن إيه آي",
|
|
"providerGemini": "جوجل جيميني",
|
|
"providerOpenaiCompatible": "متوافق مع OpenAI",
|
|
"toolArguments": "مدخل",
|
|
"toolResult": "نتيجة",
|
|
"statusApplied": "مُطبَّق",
|
|
"statusRejected": "مرفوض",
|
|
"proposalApplied": "تم تطبيق التغيير",
|
|
"proposalApplyFailed": "تعذر تطبيق التغيير",
|
|
"proposalRejectFailed": "لم يكن بالإمكان رفض التغيير",
|
|
"enableTitle": "قم بتفعيل مساعد الذكاء الاصطناعي",
|
|
"enableDescription": "دع المساعد يقرأ إعداداتك ويقترح تغييرات لتوافق عليها.",
|
|
"readOnlyCommands": "السماح بأوامر التشخيص للقراءة فقط",
|
|
"readOnlyCommandsDescription": "قد يقوم المساعد بتشغيل قائمة مختصرة من الأوامر الآمنة مثل df و uptime دون الحاجة إلى طلب ذلك في كل مرة. ويتم اقتراح أي أمر يُغيّر حالة الخادم أولاً.",
|
|
"modelDetectFailed": "تعذر الوصول إلى المورّد، لذا فهذه قائمة عامة. يمكنك كتابة أي اسم طراز.",
|
|
"modelCustom": "أدخل اسم النموذج",
|
|
"modelRefresh": "تحديث القائمة",
|
|
"modelPlaceholder": "اختر أو اكتب طرازًا",
|
|
"attachHint": "اكتب @ للإشارة إلى مضيف أو مقتطف أو عملية آلية. سيتم اقتراح تغييرات عليك الموافقة عليها.",
|
|
"runCommandTitle": "تشغيل الأمر",
|
|
"assistant": "مساعد الذكاء الاصطناعي",
|
|
"terminalPanelEmpty": "استفسر من المساعد عن هذا المضيف. أي تغيير في حالته يتطلب موافقتك أولاً.",
|
|
"terminalPanelPlaceholder": "اسأل عن هذا المضيف...",
|
|
"noProvidersConfigured": "لم يتم إعداد أي موفر للذكاء الاصطناعي حتى الآن. أضف واحداً في علامة تبويب مساعد الذكاء الاصطناعي.",
|
|
"runsInOpenTerminal": "يتم تشغيله في جلسة الطرفية المفتوحة لديك.",
|
|
"runInTerminal": "يجري"
|
|
},
|
|
"macros": {
|
|
"title": "وحدات الماكرو",
|
|
"description": "قم بتشغيل سلسلة من الأوامر المحفوظة في طرفية، وتفاعل مع ما يرسله الخادم.",
|
|
"target": "هدف",
|
|
"noTerminal": "لا يوجد طرفية مفتوحة",
|
|
"empty": "لا توجد وحدات ماكرو حتى الآن",
|
|
"emptyHint": "أنشئ ماكرو لأتمتة تدفق طرفية، مثل تسجيل الدخول أو إعادة تشغيل خدمة أو الإجابة على المطالبات.",
|
|
"create": "ماكرو جديد",
|
|
"back": "العودة إلى وحدات الماكرو",
|
|
"name": "اسم",
|
|
"namePlaceholder": "أعد تشغيل خادم الويب",
|
|
"nameRequired": "قم بتسمية الماكرو قبل حفظه",
|
|
"descriptionLabel": "وصف",
|
|
"descriptionPlaceholder": "ما يفعله هذا الماكرو (اختياري)",
|
|
"unsaved": "التغييرات غير المحفوظة",
|
|
"save": "يحفظ",
|
|
"saved": "تم حفظ الماكرو",
|
|
"saveFailed": "تعذر حفظ الماكرو",
|
|
"delete": "يمسح",
|
|
"deleteTitle": "هل تريد حذف هذا الماكرو؟",
|
|
"deleteBody": "سيتم حذف \"{{name}}\" نهائياً. لا يمكن التراجع عن هذا الإجراء.",
|
|
"deleted": "تم حذف الماكرو",
|
|
"cancel": "يلغي",
|
|
"run": "يجري",
|
|
"stop": "قف",
|
|
"running": "جري...",
|
|
"completed": "اللمسة النهائية الدقيقة",
|
|
"failed": "فشل الماكرو",
|
|
"loadFailed": "تعذر تحميل وحدات الماكرو",
|
|
"needTerminal": "افتح وقم بتوصيل طرفية أولاً",
|
|
"noSteps": "لا يحتوي هذا الماكرو على أي خطوات حتى الآن. أضف خطوة واحدة أدناه.",
|
|
"addStep": "خطوات إضافية",
|
|
"stepNumber": "الخطوة {{number}}",
|
|
"removeStep": "خطوة الإزالة",
|
|
"confirmRunTitle": "هل تريد تشغيل هذا الماكرو؟",
|
|
"confirmRunBody": "\"{{name}}\" سيرسل أوامر إلى {{host}}.",
|
|
"confirmRunAction": "تشغيل الماكرو",
|
|
"stepTypes": {
|
|
"send": {
|
|
"label": "إرسال الأمر",
|
|
"help": "يكتب النص في الطرفية، تمامًا كما لو كنت أنت من كتبته."
|
|
},
|
|
"wait": {
|
|
"label": "انتظر حتى يتم إخراج البيانات",
|
|
"help": "يتوقف مؤقتًا حتى يقوم الخادم بطباعة النص الذي تحدده، مثل مطالبة كلمة المرور."
|
|
},
|
|
"delay": {
|
|
"label": "يوقف",
|
|
"help": "ينتظر فترة زمنية محددة قبل الخطوة التالية."
|
|
},
|
|
"if": {
|
|
"label": "إذا احتوى الناتج",
|
|
"help": "يقوم بفحص كل ما طبعه الخادم حتى الآن، ثم يقوم بتشغيل أحد الفرعين."
|
|
},
|
|
"repeat": {
|
|
"label": "يكرر",
|
|
"help": "يقوم بتنفيذ الخطوات الموجودة بداخله لعدد محدد من المرات."
|
|
}
|
|
},
|
|
"send": {
|
|
"text": "أمر أو نص",
|
|
"textPlaceholder": "systemctl restart nginx",
|
|
"pressEnter": "اضغط على زر الإدخال بعد الإرسال",
|
|
"pressEnterHelp": "قم بإيقاف تشغيل هذا الخيار لكتابة نص دون إرساله."
|
|
},
|
|
"wait": {
|
|
"pattern": "انتظر حتى يحتوي الناتج على",
|
|
"patternPlaceholder": "كلمة المرور:",
|
|
"timeout": "الاستسلام بعد",
|
|
"onTimeout": "إذا لم يظهر أبداً",
|
|
"stop": "أوقف الماكرو",
|
|
"continue": "استمر على أي حال"
|
|
},
|
|
"delay": {
|
|
"duration": "انتظر"
|
|
},
|
|
"ifStep": {
|
|
"pattern": "إذا احتوى الناتج",
|
|
"patternPlaceholder": "نشط: نشط (قيد التشغيل)",
|
|
"then": "ثم افعل هذا",
|
|
"else": "وإلا فافعل هذا",
|
|
"emptyBranch": "لا توجد"
|
|
},
|
|
"repeat": {
|
|
"count": "عدد المرات",
|
|
"times": "أوقات"
|
|
},
|
|
"match": {
|
|
"useRegex": "مطابقة مع تعبير نمطي",
|
|
"useRegexHelp": "اترك هذا الخيار فارغًا لمطابقة النص تمامًا كما هو مكتوب.",
|
|
"invalidRegex": "هذا ليس تعبيرًا نمطيًا صالحًا، وسيتم مطابقته كنص عادي."
|
|
},
|
|
"seconds": "ثوانٍ",
|
|
"secondsShort": "{{count}}s"
|
|
},
|
|
"webEndpoint": {
|
|
"noHostSelected": "لم يتم تحديد أي مضيف",
|
|
"notFound": "لم تعد هذه النقطة النهائية موجودة.",
|
|
"tunnelUnreachableFromBrowser": "تتصل هذه النقطة الطرفية بالعنوان 127.0.0.1 على الجهاز الذي يُشغّل Termix، وهو عنوان لا يمكن لمتصفحك الوصول إليه. عيّن عنوان \"Bind Host\" لهذه النقطة الطرفية إلى عنوان يستجيب له الجهاز، مثل 0.0.0.0، وحدّد لها منفذًا محليًا ثابتًا.",
|
|
"tunnelSharesSessionCookie": "سيؤدي فتح هذا النفق إلى توجيه جلسة Termix الخاصة بك إلى الخدمة المُمرَّرة عبر النفق، لأن متصفحك سيصل إليها عبر نفس اسم المضيف الذي يُقدَّم منه Termix. تتجاهل ملفات تعريف الارتباط رقم المنفذ، لذا لا يمكن التمييز بينهما. استخدم تطبيق Termix لسطح المكتب، أو افتح Termix على localhost.",
|
|
"directSharesSessionCookie": "سيؤدي فتح هذه النقطة النهائية إلى توجيه جلسة Termix الخاصة بك إليها، لأن متصفحك يصل إليها من نفس الموقع الذي يُقدّم منه Termix. تتجاهل ملفات تعريف الارتباط رقم المنفذ، لذا فإن استخدام منفذ مختلف لا يعني تغيير الهوية. استخدم تطبيق Termix لسطح المكتب، أو قم بتشغيل واجهة المستخدم الرسومية هذه من اسم مضيف مختلف.",
|
|
"retry": "إعادة المحاولة",
|
|
"reload": "أعد تحميل الصفحة",
|
|
"copyUrl": "انسخ الرابط",
|
|
"urlCopied": "تم نسخ الرابط",
|
|
"copyFailed": "فشل نسخ عنوان URL",
|
|
"openExternally": "افتح خارجياً",
|
|
"isolationUnavailable": "لا يستطيع هذا المتصفح عزل نقاط نهاية الويب عن جلسة Termix الخاصة بك. استخدم متصفحًا يدعم الإطارات المضمنة بدون بيانات اعتماد.",
|
|
"isolationNotice": "تستخدم الصفحات المضمنة جلسة معزولة. أما بالنسبة للصفحات التي تتطلب تخزينًا أو تسجيل دخول منبثق، فاستخدم نافذة معزولة في تطبيق سطح المكتب.",
|
|
"openIsolatedWindow": "نافذة مفتوحة معزولة"
|
|
}
|
|
}
|