Files
Termix/src/ui/locales/translated/nl_NL.json
T
+16 fef8a5f28a release-2.8.0 (#1456)
* 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>
2026-09-20 14:56:39 -05:00

5105 lines
279 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"connection": {
"retryingIn": "Opnieuw proberen over {{seconds}}s ({{attempt}}/{{max}})",
"retryingNow": "Opnieuw proberen... ({{attempt}}/{{max}})",
"disconnected": "Kan geen verbinding maken",
"reconnect": "Opnieuw verbinding maken"
},
"termixId": {
"title": "Termix ID",
"loadFailed": "Het laden van de Termix-ID is mislukt.",
"claimTitle": "Vraag je Termix ID aan",
"claimIntro": "Kies een unieke gebruikersnaam. Uw openbare SSH-sleutels worden gepubliceerd op een openbare URL die u kunt toevoegen aan het authorized_keys-bestand van elke server.",
"handleLabel": "Hendel",
"handlePlaceholder": "Alice",
"checking": "Controleren…",
"available": "Beschikbaar",
"taken": "Reeds meegenomen",
"invalidHandle": "Alleen kleine letters, cijfers, - en _",
"descriptionLabel": "Beschrijving (optioneel)",
"descriptionPlaceholder": "Werklaptop en telefoonsleutels",
"create": "Maak een Termix ID aan",
"created": "Termix ID aangemaakt",
"createFailed": "Het aanmaken van een Termix ID is mislukt.",
"deleteConfirm": "Wil je je Termix ID en alle gepubliceerde sleutels verwijderen? Servers die je hebt geconfigureerd, bewaren de sleutels totdat je ze handmatig verwijdert.",
"deleted": "Termix ID verwijderd",
"deleteFailed": "Het verwijderen van de Termix-ID is mislukt.",
"copyFailed": "Kopiëren mislukt",
"resolverUrlLabel": "Openbare resolver-URL",
"provisionLabel": "Een server inrichten",
"publishTitle": "Publiceer een openbare sleutel",
"generate": "Genereren",
"generateTooltip": "Genereer een Ed25519-sleutelpaar — publiceert de publieke sleutel en downloadt de privésleutel naar uw apparaat.",
"saveToVault": "Opslaan in inloggegevens",
"keyPlaceholder": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@host",
"labelPlaceholder": "Label (optioneel)",
"add": "Toevoegen",
"importFromCredential": "Of importeren vanuit opgeslagen inloggegevens",
"keyPublished": "Sleutel gepubliceerd",
"addKeyFailed": "Sleutel toevoegen mislukt",
"generatedSaved": "Sleutelpaar gegenereerd en opgeslagen in uw inloggegevenskluis. Privésleutel ook gedownload.",
"generatedOnly": "Sleutelpaar gegenereerd — privésleutel gedownload (wordt slechts één keer weergegeven).",
"generateFailed": "Sleutel genereren mislukt",
"imported": "Sleutel geïmporteerd uit inloggegevens",
"importFailed": "Het importeren van de sleutel is mislukt.",
"noKeys": "Er zijn nog geen openbare sleutels gepubliceerd.",
"keysTitle": "Gepubliceerde sleutels",
"published": "Gepubliceerd",
"hidden": "Verborgen",
"keyRemoved": "Sleutel verwijderd",
"removeKeyFailed": "Het verwijderen van de sleutel is mislukt.",
"updateKeyFailed": "Sleutel bijwerken mislukt",
"fromVault": "Vanuit de inloggegevenskluis",
"linkedToTermixId": "Gepubliceerd via Termix ID",
"selectCredential": "Selecteer een certificaat...",
"import": "Importeren",
"caTitle": "Certificeringsinstantie",
"caIntro": "Vertrouw deze certificeringsinstantie op een server en deze accepteert elk certificaat dat u ondertekent. Roteer de certificaten om ze allemaal tegelijk in te trekken; certificaten verlopen ook automatisch.",
"caEnable": "CA inschakelen",
"caEnabled": "CA ingeschakeld",
"caCreateFailed": "CA inschakelen mislukt",
"caPublicKeyLabel": "CA openbare sleutel",
"caTrustLabel": "Vertrouw op een server (uitvoeren als root)",
"caRotate": "Draaien",
"caRotateConfirm": "Als u de certificeringsinstantie (CA) wijzigt, worden alle certificaten die door die instantie zijn ondertekend niet langer geaccepteerd en moeten ze opnieuw worden uitgegeven.",
"caRotated": "CA geroteerd — vorige certificaten ingetrokken",
"caRotateFailed": "CA-rotatie mislukt",
"caDelete": "Verwijder CA",
"caDeleteConfirm": "De certificeringsinstantie verwijderen?",
"caDeleted": "CA verwijderd",
"caDeleteFailed": "Het verwijderen van CA is mislukt.",
"caValidityLabel": "Geldigheidsduur certificaat (dagen)",
"issueCert": "Certificaat",
"issueCertTooltip": "Geef een SSH-certificaat uit voor deze sleutel, ondertekend door uw certificeringsinstantie (CA).",
"certIssued": "Certificaat uitgegeven en gedownload",
"certIssueFailed": "Certificaat kon niet worden uitgegeven"
},
"credentials": {
"folders": "Mappen",
"folder": "Map",
"password": "Wachtwoord",
"key": "Sleutel",
"sshPrivateKey": "SSH-privésleutel",
"upload": "Uploaden",
"keyPassword": "Sleutelwachtwoord",
"sshKey": "SSH-sleutel",
"uploadPrivateKeyFile": "Upload het bestand met de privésleutel",
"searchCredentials": "Zoek inloggegevens...",
"addCredential": "Voeg inloggegevens toe",
"caCertificate": "CA-certificaat (-cert.pub)",
"caCertificateDescription": "Optioneel: Upload of plak het door de CA ondertekende certificaatbestand (bijv. id_ed25519-cert.pub). Vereist wanneer uw SSH-server certificaatgebaseerde authenticatie gebruikt.",
"uploadCertFile": "Upload -cert.pub-bestand",
"clearCert": "Duidelijk",
"certLoaded": "Certificaat geladen",
"certPublicKeyLabel": "CA-certificaat",
"certTypeLabel": "Certificaattype",
"pasteOrUploadCert": "Plak of upload een -cert.pub-certificaat...",
"hasCaCert": "Beschikt over een CA-certificaat.",
"noCaCert": "Geen CA-certificaat",
"noPublicKeyAvailable": "Er is geen openbare sleutel beschikbaar. Open eerst de referentie-editor.",
"deployCommandCopied": "Implementatieopdracht gekopieerd",
"sortCredentials": "Inloggegevens sorteren",
"sortDefault": "Standaardbestelling",
"sortNameAsc": "Naam (A → Z)",
"sortNameDesc": "Naam (Z → A)",
"sortUsernameAsc": "Gebruikersnaam (A → Z)",
"sortUsernameDesc": "Gebruikersnaam (Z → A)",
"filterCredentials": "Filterreferenties",
"filterClearAll": "Filters wissen",
"filterTypeGroup": "Type",
"filterTypePassword": "Wachtwoord",
"filterTypeKey": "SSH-sleutel",
"filterTagsGroup": "Tags",
"copyDeployCommand": "Kopieer de implementatieopdracht",
"cloneCredentialAction": "Kopieer inloggegevens",
"clonedCredential": "Gekloond {{name}}",
"clonedCredentialName": "{{name}} (kopiëren)",
"shareCredentialAction": "Deel je inloggegevens",
"sharedBadge": "gedeeld",
"sharedBy": "Gedeeld door {{owner}}",
"share": {
"title": "Delen \"{{name}}\"",
"description": "Ontvangers krijgen hun eigen versleutelde kopie van de geheimen. Deze wordt vernieuwd wanneer de inloggegevens wijzigen en verwijderd wanneer de toegang wordt ingetrokken.",
"users": "Gebruikers",
"roles": "Rollen",
"searchPlaceholder": "Zoekopdracht...",
"permission": "Toestemming",
"levelUse": "Gebruik",
"levelManage": "Beheren",
"levelUseDesc": "Gebruik: koppel de inloggegevens aan hosts en maak verbinding. Het geheim zelf blijft verborgen.",
"levelManageDesc": "Beheer: u kunt de inloggegevens ook bewerken en delen met anderen.",
"expires": "Verloopt",
"expiry": {
"never": "Nooit",
"oneDay": "1 dag",
"sevenDays": "7 dagen",
"thirtyDays": "30 dagen"
},
"currentAccess": "Gedeeld met",
"revoke": "Herroepen",
"shared": "Inloggegevens gedeeld",
"shareButton": "Deel"
},
"deleteCredentialAction": "Verwijder inloggegevens",
"editCredentialAction": "Inloggegevens bewerken",
"failedToCloneCredential": "Het klonen van de inloggegevens is mislukt.",
"failedToDeleteCredential": "Het verwijderen van de inloggegevens is mislukt.",
"idBadge": "ID",
"keyBadge": "SLEUTEL",
"passwordBadge": "PWD",
"renameFolder": "Map hernoemen",
"deleteFolder": "Map verwijderen",
"deleteCredentialConfirm": "Inloggegevens verwijderen \"{{name}}\"?",
"deletedCredential": "Verwijderd {{name}}",
"deploySSHKeyTitle": "Implementeer de sleutel naar de host.",
"loadingCredentials": "Inloggegevens worden geladen...",
"noCredentialsFound": "Geen inloggegevens gevonden",
"noCredentialsMatchSearch": "Er zijn geen referenties gevonden die overeenkomen met uw zoekopdracht.",
"addCredentialBtn": "Voeg inloggegevens toe",
"failedToReorder": "Het opnieuw rangschikken van de inloggegevens is mislukt.",
"failedToMoveCredential": "Het overzetten van de inloggegevens is mislukt.",
"sortManual": "Handmatig (slepen om de volgorde te wijzigen)",
"customizeSidebar": "Zijbalk aanpassen",
"customizeSidebarDescription": "Kies hoe de lijst met inloggegevens eruitziet en zich gedraagt.",
"customizeDensityTitle": "Dikte",
"densityComfortableDesc": "Eén referentie per regel, met extra details.",
"densityCompactDesc": "Eén regel per kwalificatie, bij langere lijsten.",
"displayDensityComfortable": "Comfortabel",
"displayDensityCompact": "Compact",
"customizeBehaviorTitle": "Gedrag",
"showCredentialTags": "Toon tags",
"showCredentialTagsDesc": "Labels weergeven in de lijst met inloggegevens",
"actionsVisibility": "Acties met betrekking tot inloggegevens",
"actionsVisibilityDesc": "Wanneer de verbindings- en beheerknoppen bij elke inloggegevens verschijnen",
"actionsAlways": "Altijd zichtbaar",
"actionsOnly": "Alleen verbinden, de rest is klikken.",
"actionsHover": "Weergeven bij hoveren",
"actionsClick": "Weergeven bij klikken",
"customizeSortHint": "De sorteervolgorde wordt bepaald via het sorteermenu in de werkbalk.",
"expandActions": "Acties uitbreiden",
"collapseActions": "Inklapacties",
"backToHosts": "Terug naar hosts",
"backToCredentials": "Terug naar inloggegevens",
"searchCredentialsPlaceholder": "Zoek inloggegevens…",
"deployDialogTitle": "Implementeer SSH-sleutel",
"deployDialogDesc": "Implementeer {{name}} in de authorized_keys van een host.",
"targetHostLabel": "Doelhost",
"selectHostOption": "Selecteer een host...",
"deployingBtn": "Inzetten...",
"deployBtn": "Aanwenden",
"keyDeployedSuccess": "Sleutel succesvol geïmplementeerd",
"failedToDeployKey": "Implementatie van de sleutel is mislukt.",
"folderRenamedTo": "Map hernoemd naar \"{{name}}\"",
"failedToRenameFolder": "Het hernoemen van de map is mislukt.",
"arrangeUnlockedSwitchedToManual": "Overgeschakeld naar handmatige sortering, zodat uw bestelling correct wordt verwerkt.",
"arrangeUnlocked": "Ontgrendel slepen om te herschikken"
},
"homepage": {
"title": "Startpagina",
"addWidget": "Widget toevoegen",
"editWidget": "Widget bewerken",
"deleteWidget": "Verwijderen",
"widgetTypes": "Widgettypen",
"serviceLink": "Servicelink",
"folder": "Map",
"clock": "Klok",
"notes": "Notities",
"hostStatus": "Hoststatus",
"bookmarkList": "Bladwijzers",
"zoomIn": "Inzoomen",
"zoomOut": "Uitzoomen",
"resetView": "Weergave opnieuw instellen",
"lockLayout": "Slotindeling",
"unlockLayout": "Lay-out ontgrendelen",
"noWidgets": "Klik met de rechtermuisknop of klik op + om je eerste widget toe te voegen.",
"openFullView": "Volledige weergave openen",
"previewTitle": "Startpagina-voorbeeld",
"cancel": "Annuleren",
"save": "Redden",
"title_label": "Titel",
"widgetTitlePlaceholder": "Widgettitel (optioneel)",
"url": "URL",
"imageUrl": "Aangepaste afbeeldings-URL",
"imageUrlHint": "Laat dit veld leeg om automatisch het site-favicon te gebruiken.",
"showImage": "Afbeelding weergeven",
"description": "Beschrijving",
"color": "Kleur",
"icon": "Icon",
"expanded": "Standaard uitgevouwen",
"timezone": "Tijdzone",
"invalidTimezone": "Ongeldige tijdzone. Gebruik een IANA-naam zoals America/New_York.",
"showSeconds": "Toon seconden",
"format12h": "12 uur",
"format24h": "24 uur per dag",
"content": "Inhoud",
"backgroundColor": "Achtergrondkleur",
"host": "Gastheer",
"showMetrics": "Toon statistieken",
"links": "Links",
"addLink": "Link toevoegen",
"linkLabel": "Label",
"linkUrl": "URL",
"removeLink": "Verwijderen",
"categoryLinks": "Links",
"categoryInfo": "Informatie",
"categorySystem": "Systeem",
"widgetServiceLinkDesc": "Een aanklikbare tegel die linkt naar een service-URL.",
"widgetFolderDesc": "Een container om gerelateerde widgets te groeperen.",
"widgetClockDesc": "Een live klok met instelbare tijdzone.",
"widgetNotesDesc": "Een widget voor Markdown-notities",
"widgetHostStatusDesc": "Toont live CPU-, geheugen- en schijfgebruik voor een SSH-host.",
"widgetBookmarkListDesc": "Een lijst met snelle links",
"copyLink": "Link kopiëren",
"linkCopied": "Link gekopieerd!",
"location": "Locatie",
"temperatureUnit": "Temperatuureenheid",
"showForecast": "Toon de 3-daagse weersvoorspelling",
"scrolling": "Scrollen toestaan",
"feedUrl": "Feed-URL",
"maxItems": "Max. aantal items",
"showDescription": "Beschrijving weergeven",
"widgetWeatherName": "Weer",
"widgetWeatherDesc": "Live weerbericht voor elke locatie",
"widgetIframeName": "iFrame-insluiting",
"widgetIframeDesc": "Sluit elke URL in een iframe in.",
"widgetRssName": "RSS-feed",
"widgetRssDesc": "Items weergeven uit een RSS- of Atom-feed.",
"dragToFolder": "Sleep widgets hierheen of gebruik + om ze toe te voegen.",
"showDisk": "Schijfgebruik weergeven",
"addToFolder": "Widget toevoegen aan map",
"noHostSelected": "Geen host geselecteerd",
"metricsNotAvailable": "Gegevens niet beschikbaar",
"selectHost": "Selecteer een host...",
"displayedMetrics": "Weergegeven statistieken",
"metricCpu": "CPU",
"metricMemory": "Geheugen",
"metricDisk": "Schijf",
"metricUptime": "Beschikbaarheid",
"metricSystem": "Systeem",
"metricOs": "OS",
"metricKernel": "Kernel",
"metricHostname": "Hostnaam",
"metricNetwork": "Netwerk",
"metricProcesses": "Processen",
"metricProcessesTotal": "totaal",
"metricProcessesRunning": "rennen",
"categoryMonitoring": "Monitoring",
"loading": "Laden...",
"noData": "Geen gegevens beschikbaar",
"allClear": "Alles in orde",
"acknowledgeAlert": "Erkennen",
"noPingUrls": "Geen URL's geconfigureerd",
"pingLabel": "Label",
"addPingUrl": "URL toevoegen",
"showLatency": "Toon latentie",
"refreshInterval": "Vernieuwingsinterval",
"seconds": "seconden",
"filterActivityTypes": "Filtertypen",
"filterTypesHint": "Laat dit veld leeg om alles weer te geven.",
"showTimestamp": "Toon tijdstempel",
"uptimeUnavailable": "Beschikbaarheid niet beschikbaar",
"uptimeLabel": "Beschikbaarheid",
"overviewVersion": "Versie",
"overviewUpdate": "Actueel",
"overviewUpdateLabel": "Update",
"overviewUpdateAvailable": "Update beschikbaar",
"overviewDatabase": "Database",
"overviewUptime": "Beschikbaarheid",
"noHosts": "Geen hosts geconfigureerd",
"hostGridHosts": "Gastheren",
"hostGridAllHint": "Laat dit veld leeg om alle hosts weer te geven.",
"columns": "Kolommen",
"showIp": "IP-adres weergeven",
"connectionType": "Verbindingstype",
"layout": "Indeling",
"showStatus": "Status weergeven",
"showHostName": "Toon de naam van de presentator",
"noDockerActivity": "Geen Docker-activiteit",
"noActivity": "Geen activiteit",
"showAcknowledged": "Toon erkend",
"showCurrentValue": "Toon huidige waarde",
"chartMetric": "Metrisch",
"metricRange": "Bereik",
"widgetMetricsChartName": "Statistiekengrafiek",
"widgetMetricsChartDesc": "Historische grafiek van CPU, geheugen, schijf of netwerk voor een host.",
"widgetHostGridName": "Host Grid",
"widgetHostGridDesc": "Rasterweergave van de status van SSH-hosts",
"widgetAlertFeedName": "Waarschuwingsfeed",
"widgetAlertFeedDesc": "Live waarschuwingen met bevestigingsondersteuning",
"widgetPingStatusName": "Pingstatus",
"widgetPingStatusDesc": "HTTP-pingstatus voor een of meer URL's",
"widgetRecentActivityName": "Recente activiteit",
"widgetRecentActivityDesc": "Scrollbare feed met recente Termix-activiteiten",
"widgetTermixUptimeName": "Termix-uptime",
"widgetTermixUptimeDesc": "Live uptime-teller voor de Termix-server",
"widgetSystemOverviewName": "Systeemoverzicht",
"widgetSystemOverviewDesc": "Termix-versie, databasestatus en uptime in één oogopslag",
"widgetSshQuickConnectName": "SSH-snelverbinding",
"widgetSshQuickConnectDesc": "Met één klik kun je SSH-sessies openen.",
"widgetDockerActivityName": "Docker-activiteit",
"widgetDockerActivityDesc": "Recente gebeurtenissen met betrekking tot Docker-containers op alle hosts.",
"widgetCalendarName": "Kalender",
"widgetCalendarDesc": "Een maandkalender waarop de dag van vandaag is gemarkeerd.",
"widgetCountdownName": "Aftellen",
"widgetCountdownDesc": "Afteltimer naar een streefdatum",
"widgetSearchBarName": "Zoekbalk",
"widgetSearchBarDesc": "Widget voor snel zoeken op het web",
"widgetTextBannerName": "Tekstbanner",
"widgetTextBannerDesc": "Een opvallend label of sectiekop voor het canvas.",
"widgetImageWidgetName": "Afbeelding",
"widgetImageWidgetDesc": "Een afbeelding weergeven vanaf een URL.",
"widgetMarkdownNotesName": "Markdown-notities",
"widgetMarkdownNotesDesc": "Uitgebreide notities met inline markdown-weergave",
"widgetCustomApiName": "Aangepaste API",
"widgetCustomApiDesc": "Haal gegevens op uit en toon ze vanuit elke JSON API.",
"widgetServiceGridName": "Servicenetwerk",
"widgetServiceGridDesc": "Een configureerbaar raster van links naar servicetegels",
"widgetDashboardLinksName": "Dashboardlinks",
"widgetDashboardLinksDesc": "Toon uw geconfigureerde servicekoppelingen vanuit het dashboard.",
"widgetSearchLinksName": "Snelkoppelingen zoeken",
"widgetSearchLinksDesc": "Sneltoetsen voor snel zoeken met inline invoer.",
"widgetLinkTreeName": "Linkboom",
"widgetLinkTreeDesc": "Gegroepeerde secties met links en bijbehorende kopjes.",
"calMon": "Mo",
"calTue": "Tu",
"calWed": "Wij",
"calThu": "E",
"calFri": "Fr",
"calSat": "Sa",
"calSun": "Zo",
"startOnMonday": "De week begint op maandag.",
"countdownNoDate": "Geen streefdatum vastgesteld",
"countdownPast": "Het evenement heeft plaatsgevonden.",
"countdownDays": "dagen",
"countdownHours": "uren",
"countdownMinutes": "min",
"countdownSeconds": "sec",
"countdownLabel": "Label",
"countdownLabelPlaceholder": "bijvoorbeeld Lanceringsdag",
"countdownShowDays": "Showdagen",
"countdownShowHours": "Openingstijden",
"targetDate": "Streefdatum",
"searchEngine": "Zoekmachine",
"customSearchUrl": "Aangepaste zoek-URL",
"searchPlaceholder": "Zoekopdracht...",
"searchGo": "Gaan",
"searchPlaceholderLabel": "Plaatsvervangende tekst",
"searchPlaceholderHint": "Tekst die wordt weergegeven in het zoekveld",
"openInNewTab": "Openen in een nieuw tabblad",
"searchQueryPlaceholder": "Voer uw zoekopdracht in...",
"noSearchShortcuts": "Er zijn geen snelkoppelingen geconfigureerd.",
"addSearchShortcut": "Snelkoppeling toevoegen",
"fontSize": "Lettergrootte",
"textAlign": "Tekst uitlijnen",
"fontWeight": "Lettertypegewicht",
"clearColor": "Transparante kleur",
"imageFit": "Afbeelding passend maken",
"imageLinkUrl": "Link-URL",
"noImage": "Geen afbeeldings-URL ingesteld",
"altText": "Alternatieve tekst",
"altTextPlaceholder": "Beschrijf de afbeelding",
"renderMarkdown": "Markdown weergeven",
"displayMode": "Weergavemodus",
"displayField": "Weergaveveld",
"jsonPath": "JSON-pad",
"customApiLabel": "Label",
"customApiLabelPlaceholder": "bijv. Temperatuur",
"customApiUnit": "Eenheid",
"customApiNoUrl": "Geen API-URL geconfigureerd",
"customApiError": "Het ophalen is mislukt.",
"customApiNotArray": "Het antwoord is geen array.",
"addService": "Voeg een service toe",
"showLabels": "Labels weergeven",
"iconSize": "Pictogramgrootte",
"noDashboardLinks": "Er zijn geen dashboardlinks geconfigureerd.",
"noLimit": "Geen limiet",
"sectionHeading": "Sectiekop",
"addSection": "Sectie toevoegen",
"compactMode": "Compacte modus",
"showDetailed": "Gedetailleerde weergave",
"selectHosts": "Selecteer hosts",
"allHosts": "Alle hosts",
"listLayout": "Lijst",
"gridLayout": "Rooster",
"terminal": "Terminal",
"files": "Bestanden",
"docker": "Docker",
"range15m": "15 minuten",
"range1h": "1 uur",
"range6h": "6 uur",
"range24h": "24 uur",
"metricNetRx": "Net downloaden",
"metricNetTx": "Netupload",
"severityFilter": "Ernstfilter",
"filterAll": "Alle",
"accentColor": "Accentkleur",
"widgetSshTerminalName": "SSH-terminal",
"widgetSshTerminalDesc": "Een inline SSH-terminal verbonden met een geconfigureerde host.",
"sshTerminalNoHost": "Geen host geconfigureerd",
"sshTerminalConnect": "Verbinden",
"sshTerminalAutoConnect": "Automatisch aansluiten bij belasting",
"widgetQuickConnectName": "Snel verbinden",
"widgetQuickConnectDesc": "Startknoppen met één klik voor elk verbindingstype op al uw hosts.",
"connectionTypes": "Verbindingstypen",
"connType_terminal": "Terminal",
"connType_files": "Bestandsbeheerder",
"connType_docker": "Docker",
"connType_tunnel": "Tunnel",
"connType_host-metrics": "Hoststatistieken",
"connType_rdp": "RDP",
"connType_vnc": "VNC",
"connType_telnet": "Telnet",
"widgetFileManagerName": "Bestandsbeheerder",
"widgetFileManagerDesc": "Ingebouwde SFTP-bestandsbeheerder voor een geconfigureerde host",
"widgetDockerName": "Docker Manager",
"widgetDockerDesc": "Ingebouwde Docker-containermanager voor een geconfigureerde host",
"widgetTunnelName": "Tunnelbeheerder",
"widgetTunnelDesc": "Ingebouwde SSH-tunnelmanager voor een geconfigureerde host",
"widgetNoHostSelected": "Geen host geconfigureerd"
},
"serverConfig": {
"title": "Serverconfiguratie",
"description": "Configureer de Termix-server-URL om verbinding te maken met uw backendservices.",
"serverUrl": "Server-URL",
"enterServerUrl": "Voer een server-URL in.",
"saveFailed": "Configuratie opslaan mislukt",
"saveError": "Fout bij het opslaan van de configuratie",
"saving": "Besparing...",
"saveConfig": "Configuratie opslaan",
"helpText": "Voer de URL in waar uw Termix-server draait (bijvoorbeeld http://localhost:30001 of https://uw-server.com)",
"changeServer": "Server wijzigen",
"mustIncludeProtocol": "De server-URL moet beginnen met http:// of https://",
"allowInvalidCertificate": "Ongeldig certificaat toestaan",
"allowInvalidCertificateDesc": "Uitsluitend te gebruiken voor vertrouwde, zelfgehoste servers met zelfondertekende certificaten of IP-adrescertificaten.",
"useEmbedded": "Lokale server gebruiken",
"embeddedDesc": "Start Termix met de ingebouwde lokale server (geen externe server nodig).",
"embeddedConnecting": "Verbinding maken met de lokale server...",
"embeddedNotReady": "De lokale server is nog niet gereed. Wacht even en probeer het later opnieuw.",
"localServer": "Lokale server",
"savedServers": "Opgeslagen servers",
"noSavedServers": "Geen opgeslagen servers",
"removeServer": "Verwijderen"
},
"migrationNotice": {
"title": "Termix Desktop draait nu zelfstandig.",
"body1": "Deze app maakte voorheen rechtstreeks verbinding met uw Termix-server. Hij is herwerkt om volledig zelfstandig te werken, waarbij hosts en inloggegevens lokaal worden opgeslagen, zodat hij ook offline blijft functioneren. Tweewegsynchronisatie met een zelfgehoste Termix-server is nu optioneel.",
"body2": "Uw bestaande hosts en inloggegevens bevinden zich nog steeds op {{url}}. Schakel externe synchronisatie in en maak opnieuw verbinding met die server om ze te herstellen en beide in de toekomst gesynchroniseerd te houden.",
"dismiss": "Nu niet",
"setUpSync": "Externe synchronisatie instellen"
},
"remoteSync": {
"title": "Synchronisatie op afstand",
"description": "U kunt deze desktop-app optioneel verbinden met een zelfgehoste Termix-server om uw hosts, inloggegevens en codefragmenten op verschillende apparaten te synchroniseren. De app werkt altijd volledig offline, ongeacht of u verbinding maakt of niet.",
"notConnected": "Niet verbonden",
"connected": "Aangesloten",
"connectedTo": "Verbonden met {{url}}",
"lastSynced": "Laatst gesynchroniseerd {{time}}",
"neverSynced": "Nooit gesynchroniseerd",
"syncError": "Synchronisatiefout: {{message}}",
"needsReauth": "Aanmelden verlopen",
"connectButton": "Verbinding maken met de server",
"disconnectButton": "Verbinding verbreken",
"syncNowButton": "Nu synchroniseren",
"syncing": "Synchroniseren...",
"syncSuccess": "Externe synchronisatie voltooid",
"syncUnavailable": "Externe synchronisatie kon niet worden gestart.",
"serverUrl": "Server-URL",
"enterServerUrl": "Voer een server-URL in.",
"mustIncludeProtocol": "De server-URL moet beginnen met http:// of https://",
"connectionTestFailed": "Er kon geen Termix-server worden bereikt op die URL.",
"allowInvalidCertificate": "Ongeldig certificaat toestaan",
"allowInvalidCertificateDesc": "Uitsluitend te gebruiken voor vertrouwde, zelfgehoste servers met zelfondertekende certificaten of IP-adrescertificaten.",
"savedServers": "Opgeslagen servers",
"removeServer": "Verwijderen",
"continueButton": "Doorgaan",
"cancelButton": "Annuleren",
"signInTitle": "Meld je aan bij {{url}}",
"originTitle": "Verbindingsoorsprong",
"originDescription": "Kies de standaardlocatie voor SSH-verbindingen. Deze instelling kan per host worden gewijzigd.",
"originLocal": "Dit apparaat (lokaal netwerk)",
"originRemote": "Externe server",
"bannerReconnect": "Opnieuw verbinding maken",
"bannerMessage": "Externe synchronisatie vereist herverificatie."
},
"versionCheck": {
"error": "Versiecontrolefout",
"checkFailed": "Controleren op updates is mislukt.",
"upToDate": "De app is up-to-date.",
"currentVersion": "Je gebruikt versie {{version}}",
"updateAvailable": "Update beschikbaar",
"updateLinkLabel": "Update beschikbaar — bekijk de release-opmerkingen op GitHub.",
"newVersionAvailable": "Er is een nieuwe versie beschikbaar! Je gebruikt momenteel {{current}}, maar {{latest}} is beschikbaar.",
"betaVersion": "Bètaversie",
"betaVersionDesc": "Je gebruikt versie {{current}}, die nieuwer is dan de laatste stabiele versie {{latest}}.",
"releasedOn": "Uitgebracht op {{date}}",
"downloadUpdate": "Download update",
"checking": "Controleren op updates...",
"checkUpdates": "Controleer op updates",
"checkingUpdates": "Controleren op updates...",
"updateRequired": "Update vereist"
},
"common": {
"close": "Dichtbij",
"minimize": "Minimaliseren",
"online": "Online",
"offline": "Offline",
"unknown": "Onbekend",
"continue": "Doorgaan",
"maintenance": "Onderhoud",
"degraded": "Gedegradeerd",
"error": "Fout",
"warning": "Waarschuwing",
"unsavedChanges": "Niet-opgeslagen wijzigingen",
"dismiss": "Afwijzen",
"more": "Meer",
"loading": "Laden...",
"optional": "Optioneel",
"connect": "Verbinden",
"copied": "Gekopieerd",
"connecting": "Verbinden...",
"updateAvailable": "Update beschikbaar",
"appName": "Termix",
"openInNewTab": "Openen in een nieuw tabblad",
"noReleases": "Geen releases",
"updatesAndReleases": "Updates en releases",
"newVersionAvailable": "Een nieuwe versie ({{version}}) is beschikbaar.",
"failedToFetchUpdateInfo": "Het ophalen van update-informatie is mislukt.",
"preRelease": "Voorpublicatie",
"noReleasesFound": "Geen publicaties gevonden.",
"cancel": "Annuleren",
"username": "Gebruikersnaam",
"login": "Login",
"logout": "Uitloggen",
"register": "Register",
"password": "Wachtwoord",
"confirmPassword": "Bevestig wachtwoord",
"back": "Rug",
"save": "Redden",
"saving": "Besparing...",
"delete": "Verwijderen",
"rename": "Naam wijzigen",
"edit": "Bewerking",
"add": "Toevoegen",
"confirm": "Bevestigen",
"no": "Nee",
"or": "OF",
"next": "Volgende",
"previous": "Vorig",
"refresh": "Vernieuwen",
"language": "Taal",
"checking": "Controleren...",
"checkingDatabase": "Databaseverbinding controleren...",
"checkingAuthentication": "Authenticatie controleren...",
"backendReconnected": "Serververbinding hersteld",
"connectionDegraded": "Serververbinding verbroken, herstel bezig…",
"reload": "Herladen",
"remove": "Verwijderen",
"create": "Creëren",
"update": "Update",
"copy": "Kopiëren",
"copyFailed": "Kopiëren naar klembord mislukt",
"maximize": "Maximaliseren",
"restore": "Herstellen",
"of": "van",
"saved": "Opgeslagen",
"deleted": "Verwijderd",
"deleteFailed": "Verwijderen mislukt",
"saveFailed": "Opslaan mislukt",
"required": "Vereist"
},
"onboarding": {
"stepCounter": "Stap {{current}} van {{total}}",
"skip": "Instellen overslaan",
"next": "Volgende",
"finish": "Aan de slag",
"welcomeTitle": "Welkom bij Termix",
"welcomeIntro": "Termix beheert uw servers vanuit één centrale plek. De installatie duurt ongeveer een minuut en niets is permanent.",
"welcome_hosts": "Bespaar op je servers",
"welcome_hosts_desc": "Houd alle machines die u beheert in één lijst bij.",
"welcome_terminal": "Maak direct verbinding",
"welcome_terminal_desc": "Open een terminal in een nieuw tabblad, zonder een aparte SSH-client.",
"welcome_files": "Bestanden bekijken en bewerken",
"welcome_files_desc": "Externe bestanden uploaden, downloaden en bewerken.",
"presetTitle": "Hoeveel wilt u op het scherm zien?",
"presetIntro": "Termix kan zo eenvoudig of zo gedetailleerd zijn als u wilt. Kies een uitgangspunt.",
"presetChangeLater": "Je kunt later in de instellingen, onder Interface, van voorinstelling wisselen of een individuele instelling wijzigen.",
"appearanceTitle": "Maak het van jou",
"appearanceIntro": "Kies een thema, een accentkleur en je taal. Je kunt deze drie later allemaal wijzigen in de instellingen.",
"featuresTitle": "Wat doet Termix nog meer?",
"featuresIntro": "Elke server die je opslaat, kan op meer manieren dan alleen via een terminal worden geopend. Dit is wat er achter de pictogrammen aan de linkerkant te zien is.",
"feature_files": "Bestandsbeheerder",
"feature_files_desc": "Blader door bestanden, upload ze, download ze en bewerk ze via SFTP zonder de app te verlaten.",
"feature_desktop": "Extern bureaublad",
"feature_desktop_desc": "Open RDP-, VNC- en Telnet-sessies in een tabblad, net als bij SSH.",
"feature_tunnels": "Tunnels",
"feature_tunnels_desc": "Poorten doorsturen via een server om toegang te krijgen tot services die niet openbaar toegankelijk zijn.",
"feature_docker": "Docker",
"feature_docker_desc": "Bekijk containers, lees logboeken en bekijk statistieken op elke host waarop Docker draait.",
"feature_snippets": "Fragmenten",
"feature_snippets_desc": "Sla de commando's die je vaak gebruikt op en verstuur ze met één klik naar een terminal.",
"feature_automations": "Automatiseringen",
"feature_automations_desc": "Voer stappen automatisch uit wanneer er iets gebeurt en ontvang meldingen.",
"feature_metrics": "Statistieken en waarschuwingen",
"feature_metrics_desc": "Volg de CPU, het geheugen en de schijf gedurende een bepaalde tijd en ontvang een melding wanneer ze defect raken.",
"featuresRailHint": "Heb je er geen nodig? Verberg dan elk pictogram in de zijbalk via Instellingen, onder Navigatie.",
"workflowTitle": "Beweeg sneller",
"workflowIntro": "Een paar gewoontes die je de meeste tijd besparen zodra je een paar servers hebt.",
"workflow_palette": "Opdrachtenpalet",
"workflow_palette_desc": "Spring direct naar een server of actie door te typen. Druk twee keer op Shift om de server of actie te openen.",
"workflow_split": "Gesplitst scherm",
"workflow_split_desc": "U kunt maximaal vier tabbladen naast elkaar weergeven om logboeken te bekijken terwijl u werkt.",
"workflow_dock": "Zijpaneel",
"workflow_dock_desc": "Klik met de middelste muisknop of met de rechtermuisknop op een pictogram in de zijbalk om het als tabblad te openen of aan de rechterkant vast te zetten.",
"workflow_workspaces": "Werkruimtes",
"workflow_workspaces_desc": "Sla een set geopende tabbladen op en open de volledige lay-out later opnieuw.",
"securityTitle": "Uw inloggegevens veilig bewaren",
"securityIntro": "Termix slaat je inloggegevens voor je op, dus het is de moeite waard om even te kijken hoe dat werkt.",
"security_credentials": "Herbruikbare inloggegevens",
"security_credentials_desc": "Sla een sleutel of wachtwoord eenmalig op en koppel deze aan zoveel servers als u wilt.",
"security_twofa": "Tweefactorauthenticatie en wachtwoorden",
"security_twofa_desc": "Voeg TOTP of een wachtwoordcode toe aan je account in de instellingen, onder Beveiliging.",
"security_identity": "Termix ID",
"security_identity_desc": "Geef kortstondige SSH-certificaten uit in plaats van sleutels naar elke server te kopiëren.",
"security_sharing": "Delen",
"security_sharing_desc": "Geef andere gebruikers toegang tot een server zonder het wachtwoord te hoeven delen.",
"securityEncryptionNote": "Inloggegevens worden versleuteld voordat ze worden opgeslagen en pas ontsleuteld wanneer een verbinding ze nodig heeft.",
"doneTitle": "Je bent helemaal klaar.",
"doneHeading": "Installatie voltooid",
"doneDesc": "Selecteer een server in de zijbalk om een terminal te openen, de bestanden te bekijken of de statistieken ervan in te zien.",
"done_settings": "Wijzig later nog iets",
"done_settings_desc": "Thema's, lay-outdichtheid en welke pictogrammen worden weergegeven, vind je allemaal in de instellingen.",
"done_rerun": "Wil je dit nog een keer?",
"done_rerun_desc": "Open Instellingen, ga naar Interface en kies 'Installatie uitvoeren' om deze stappen nogmaals te doorlopen.",
"done_desktop": "Desktop-app",
"done_desktop_desc": "Termix is beschikbaar als desktopapplicatie voor Windows, macOS en Linux.",
"done_desktop_link": "Download de desktop-app",
"done_mobile": "Mobiele app",
"done_mobile_desc": "Neem je servers overal mee naartoe op iOS en Android.",
"done_mobile_link": "Download de mobiele app",
"done_docs": "Volledige documentatie",
"done_docs_desc": "Handleidingen voor elke functie, ook voor functies die hier niet aan bod komen.",
"done_docs_link": "Open de documenten",
"done_cli": "Opdrachtregelprogramma",
"done_cli_desc": "Beheer je servers vanuit een terminal en gebruik Termix in je eigen scripts.",
"done_cli_link": "Open de CLI-documentatie.",
"aiTitle": "AI-assistent",
"aiIntro": "Termix kan optioneel een AI-assistent bevatten. Je kunt dit later in je instellingen wijzigen.",
"aiEnableTitle": "Schakel het in.",
"aiEnableDesc": "Voegt een assistent toe die je instellingen leest en wijzigingen voorstelt die je kunt goedkeuren. Vereist een leverancier die je zelf aanlevert, zoals een lokale Ollama.",
"aiSkipTitle": "Laat het weg",
"aiSkipDesc": "Termix werkt zoals het nu werkt. De assistent blijft verborgen.",
"aiNote": "Er wordt niets verzonden totdat je een provider toevoegt en een bericht verstuurt."
},
"nav": {
"collab": "Vergaderingen",
"home": "Thuis",
"terminal": "Terminal",
"localTerminal": "Lokale terminal",
"docker": "Docker",
"tunnels": "Tunnels",
"fileManager": "Bestandsbeheerder",
"serverStats": "Hoststatistieken",
"hostMetrics": "Hoststatistieken",
"admin": "Beheerder",
"termixId": "ID",
"userProfile": "Gebruikersprofiel",
"splitScreen": "Gesplitst scherm",
"confirmClose": "Deze actieve sessie sluiten?",
"close": "Dichtbij",
"cancel": "Annuleren",
"sshManager": "SSH-manager",
"cannotSplitTab": "Dit tabblad kan niet worden gesplitst.",
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
"copyPassword": "Wachtwoord kopiëren",
"copySudoPassword": "Sudo-wachtwoord kopiëren",
"passwordCopied": "Wachtwoord gekopieerd naar het klembord",
"noPasswordAvailable": "Geen wachtwoord beschikbaar",
"failedToCopyPassword": "Het kopiëren van het wachtwoord is mislukt.",
"refreshTab": "Verbinding vernieuwen",
"renameTab": "Tabblad hernoemen",
"openFileManager": "Open bestandsbeheerder",
"dashboard": "Dashboard",
"networkGraph": "Netwerkgrafiek",
"tmuxMonitor": "Tmux Monitor",
"homepage": "Startpagina",
"quickConnect": "Snel verbinden",
"sshTools": "SSH-tools",
"history": "Geschiedenis",
"sessionLogs": "Sessielogboeken",
"openAsTabHint": "Ctrl+klik of middelste muisknop om te openen als een tabblad.",
"openAsTab": "Openen als tabblad",
"openInRightDock": "Openen in het rechter dock",
"closeRightDock": "Sluit het rechter dok af",
"toggleRightDock": "Rechter dock in-/uitschakelen",
"multiPanelHintTitle": "Werk met meer dan één paneel",
"multiPanelHintBody": "Houd dit paneel open terwijl de zijbalk voor iets anders wordt gebruikt. Er zijn twee manieren om het te verplaatsen:",
"multiPanelHintTabHow": "Houd de Ctrl-toets ingedrukt en klik op het railpictogram, of gebruik de knop in deze header.",
"multiPanelHintDockHow": "Klik met de rechtermuisknop op het railpictogram of gebruik het paneelpictogram in de tabbladbalk.",
"sidebarSettings": "Instellingen zijbalk...",
"hosts": "Gastheren",
"snippets": "Fragmenten",
"macros": "Macro's",
"fleets": "Vloten",
"automations": "Automatiseringen",
"workspaces": "Werkruimtes",
"hostManager": "Hostmanager",
"credentials": "Referenties",
"portForwarding": "Doorsturen",
"sftp": "SFTP",
"connections": "Verbindingen",
"alerts": "Waarschuwingen",
"serial": "Serieel",
"keepSideMenuOpen": "Menu open houden",
"collapseSideMenu": "Menu inklappen",
"roleAdministrator": "Beheerder",
"roleUser": "Gebruiker",
"ai": "AI"
},
"hosts": {
"hosts": "Gastheren",
"noHosts": "Geen SSH-hosts",
"retry": "Opnieuw proberen",
"refresh": "Vernieuwen",
"optional": "Optioneel",
"downloadSample": "Voorbeeld downloaden",
"failedToDeleteHost": "Het verwijderen van {{name}} is mislukt.",
"importSkipExisting": "Importeren (bestaande overslaan)",
"importSSHConfig": "Importeren vanuit SSH-configuratie",
"connectionDetails": "Verbindingsgegevens",
"ssh": "SSH",
"telnet": "Telnet",
"remoteDesktop": "Extern bureaublad",
"port": "Haven",
"username": "Gebruikersnaam",
"folder": "Map",
"tags": "Tags",
"pin": "Pin",
"addHost": "Voeg een host toe",
"editHost": "Bewerk de host",
"cloneHost": "Kloonhost",
"enableTerminal": "Terminal inschakelen",
"enableTunnel": "Tunnel inschakelen",
"enableFileManager": "Bestandsbeheer inschakelen",
"enableDocker": "Docker inschakelen",
"defaultPath": "Standaardpad",
"connection": "Verbinding",
"upload": "Uploaden",
"authentication": "Authenticatie",
"password": "Wachtwoord",
"passwordSaved": "Wachtwoord opgeslagen, typ om te wijzigen",
"key": "Sleutel",
"credential": "Referentie",
"none": "Geen",
"sshPrivateKey": "SSH-privésleutel",
"keyType": "Sleuteltype",
"uploadFile": "Bestand uploaden",
"tabGeneral": "Algemeen",
"tabSsh": "SSH",
"tabTerminal": "Terminal",
"tabRdp": "RDP",
"tabVnc": "VNC",
"tabTunnels": "Tunnels",
"tabDocker": "Docker",
"tabFiles": "Bestanden",
"tabStats": "Hoststatistieken",
"tabHostMetrics": "Hoststatistieken",
"tabTelnet": "Telnet",
"tabSharing": "Delen",
"tabAuthentication": "Authenticatie",
"terminal": "Terminal",
"tunnel": "Tunnel",
"fileManager": "Bestandsbeheerder",
"serverStats": "Hoststatistieken",
"status": {
"available": "Beschikbaar",
"reachable": "Bereikbaar, maar niet geauthenticeerd",
"offline": "Offline",
"monitoringDisabled": "Monitoring uitgeschakeld",
"label": "Status"
},
"folderRenamed": "Map \"{{oldName}}\" is succesvol hernoemd naar \"{{newName}}\"",
"failedToRenameFolder": "Het hernoemen van de map is mislukt.",
"unsavedChangesDescription": "Uw wijzigingen aan de host zijn niet opgeslagen. Wilt u ze verwijderen?",
"keepEditing": "Blijf bewerken",
"discardChanges": "Wijzigingen negeren",
"movedToFolder": "Verplaatst {{count}} host(s) naar \"{{folder}}\"",
"editHostTooltip": "Bewerk de host",
"statusChecks": "Statuscontroles",
"metricsCollection": "Gegevensverzameling",
"metricsInterval": "Interval voor het verzamelen van meetgegevens",
"metricsIntervalDesc": "Hoe vaak moeten serverstatistieken worden verzameld (5s - 1u)?",
"behavior": "Gedrag",
"themePreview": "Themavoorbeeld",
"theme": "Thema",
"fontFamily": "Lettertypefamilie",
"fontSize": "Lettergrootte",
"letterSpacing": "Letterafstand",
"lineHeight": "Lijnhoogte",
"cursorStyle": "Cursorstijl",
"cursorBlink": "Cursorknipperen",
"scrollbackBuffer": "Terugscrollbuffer",
"bellStyle": "Klokstijl",
"rightClickSelectsWord": "Rechtsklikken selecteert Word",
"fastScrollModifier": "Snel scrollen-modifier",
"fastScrollSensitivity": "Snel scrollen gevoeligheid",
"sshAgentForwarding": "SSH-agent doorsturen",
"backspaceMode": "Backspace-modus",
"startupSnippet": "Opstartfragment",
"selectSnippet": "Selecteer fragment",
"forceKeyboardInteractive": "Toetsenbordinteractief forceren",
"overrideCredentialUsername": "Gebruikersnaam voor het overschrijven van inloggegevens",
"overrideCredentialUsernameDesc": "Gebruik de hierboven opgegeven gebruikersnaam in plaats van de gebruikersnaam van de inloggegevens.",
"oidcUsernameHint": "Gebruik $oidc.preferred_username om uw OIDC-inlognaam te vervangen.",
"tailscaleUsernameHint": "Dit moet een Unix-gebruiker zijn die aan uw Tailscale-identiteit is toegekend in de SSH-toegangsregel van het tailnet, niet per se root.",
"jumpHostChain": "Spring naar de hostketen",
"portKnocking": "Havenkloppen",
"addKnock": "Poort toevoegen",
"addProxyNode": "Knooppunt toevoegen",
"proxyNode": "Proxy-knooppunt",
"proxyType": "Proxytype",
"quickActions": "Snelle acties",
"sudoPasswordAutoFill": "Sudo-wachtwoord automatisch invullen",
"sudoPassword": "Sudo-wachtwoord",
"keepaliveInterval": "Keepalive-interval (ms)",
"moshCommand": "MOSH-commando",
"environmentVariables": "Omgevingsvariabelen",
"addVariable": "Variabele toevoegen",
"docker": "Docker",
"copyTerminalUrl": "Terminal-URL kopiëren",
"copyFileManagerUrl": "Kopieer de URL van de bestandsbeheerder",
"copyRemoteDesktopUrl": "Kopieer de URL van Extern bureaublad",
"failedToConnect": "Verbinding met de console mislukt.",
"connect": "Verbinden",
"disconnect": "Verbinding verbreken",
"start": "Begin",
"enableStatusCheck": "Statuscontrole inschakelen",
"enableMetrics": "Statistieken inschakelen",
"bulkUpdateFailed": "Bulk-update mislukt",
"selectAll": "Alles selecteren",
"deselectAll": "Alles deselecteren",
"protocols": "Protocollen",
"secureShell": "Secure Shell",
"virtualNetwork": "Virtueel netwerk",
"unencryptedShell": "Niet-versleutelde shell",
"addressIp": "Adres / IP-adres",
"friendlyName": "Vriendelijke naam",
"macAddress": "MAC-adres",
"wolBroadcastAddress": "WoL-uitzendtoespraak",
"wolBroadcastAddressDesc": "Optionele gerichte broadcast voor Docker/gerouteerde netwerken (bijv. 192.168.1.255). Laat dit veld leeg om 255.255.255.255 te gebruiken.",
"folderAndAdvanced": "Map & Geavanceerd",
"showAdvancedSettings": "Geavanceerde instellingen weergeven",
"hideAdvancedSettings": "Geavanceerde instellingen verbergen",
"privateNotes": "Privénotities",
"privateNotesPlaceholder": "Details over deze server...",
"pinToTop": "Vastzetten bovenaan",
"pinToTopDesc": "Toon deze host altijd bovenaan de lijst.",
"portKnockingSequence": "Poortklopvolgorde",
"addKnockBtn": "Voeg klop toe",
"noPortKnocking": "Er is geen port knocking geconfigureerd.",
"knockPort": "Kloppoort",
"protocol": "Protocol",
"delayAfterMs": "Vertraging na (ms)",
"useSocks5Proxy": "Gebruik een SOCKS5-proxy",
"useSocks5ProxyDesc": "De verbinding wordt via een proxyserver geleid.",
"connectionOrigin": "Verbindingsoorsprong",
"connectionOriginDesc": "Waar de verbinding van deze host vandaan komt. Overschrijft de algemene standaardinstelling van de desktop-app.",
"connectionOriginGuacamoleNote": "RDP, VNC en Telnet gebruiken de externe server, tenzij u 'Dit apparaat' selecteert. Hiervoor is een guacd-server nodig die deze machine kan bereiken. Stel deze in via de guacd-URL-instelling of per host onder guacd-proxy.",
"connectionOriginDefault": "Gebruik de standaardinstelling",
"connectionOriginLocal": "Dit apparaat (lokaal netwerk)",
"connectionOriginRemote": "Externe server",
"proxyHost": "Proxy-host",
"proxyPort": "Proxy-poort",
"proxyUsername": "Proxy-gebruikersnaam",
"proxyPassword": "Proxy-wachtwoord",
"proxySingleMode": "Enkele proxy",
"proxyChainMode": "Proxyketen",
"you": "Jij",
"jumpHostChainLabel": "Spring naar de hostketen",
"addJumpBtn": "Springen toevoegen",
"noJumpHosts": "Er zijn geen jump hosts geconfigureerd.",
"selectAServer": "Selecteer een server...",
"sshPort": "SSH-poort",
"authMethod": "Authenticatiemethode",
"authenticationMethod": "Authenticatiemethode",
"authenticationMethodDesc": "Selecteer de methode die Termix zal gebruiken om deze SSH-verbinding te authenticeren. Andere methoden worden niet automatisch geprobeerd.",
"storedCredential": "Opgeslagen inloggegevens",
"selectACredential": "Selecteer een certificaat...",
"vaultProfile": "Vault-ondertekenaarprofiel",
"selectAVaultProfile": "Selecteer een Vault-profiel...",
"vaultProfileHint": "De instellingen zijn afkomstig van het gedeelde profiel; u meldt zich bij Vault aan via OIDC wanneer u verbinding maakt. Er worden geen geheimen opgeslagen.",
"vaultNewProfile": "Nieuw profiel",
"secretRefHint": "Je kunt in plaats van het geheim een 1Password-referentie (op://vault/item/field) plakken; deze wordt bij het verbinden opgehaald uit je geheime bron.",
"secretSourcesManage": "Beheer geheime bronnen",
"secretSourcesTitle": "Geheime bronnen",
"secretSourcesDesc": "Externe wachtwoordmanagers die Termix gebruikt, lezen de geheimen uit tijdens het verbinden. Momenteel is dat 1Password Connect (zelf gehost). Het toegangstoken wordt versleuteld opgeslagen met uw gegevenssleutel.",
"secretSourceNew": "Nieuwe bron",
"secretSourceUrlLabel": "Verbindingsserver-URL",
"secretSourceTokenLabel": "Verbindingstoegangstoken",
"secretSourceTokenKeep": "Laat dit veld leeg om het huidige token te behouden.",
"secretSourceSharedLabel": "Delen met alle gebruikers (alleen beheerders; wordt opgelost terwijl u bent ingelogd)",
"secretSourceShared": "gedeeld",
"secretSourceTest": "Test",
"secretSourceTestOk": "Verbonden — {{count}} kluis(ken) zichtbaar",
"secretSourceTestFailed": "Verbindingstest mislukt",
"secretSourceRequired": "Naam, server-URL en token zijn vereist.",
"secretSourceSaved": "Geheime bron opgeslagen",
"secretSourceDeleted": "Geheime bron verwijderd",
"vaultManageProfiles": "Beheer Vault-profielen",
"vaultAddrLabel": "Kluisadres",
"vaultNamespaceLabel": "Naamruimte",
"vaultOidcMountLabel": "OIDC-authenticatiekoppeling",
"vaultOidcRoleLabel": "OIDC-rol",
"vaultSshMountLabel": "SSH-geheimen Mount",
"vaultSshRoleLabel": "SSH-ondertekenaarrol",
"vaultValidPrincipalsLabel": "Geldige principes",
"vaultKeyTypeLabel": "Tijdelijk sleuteltype",
"vaultSharedLabel": "Delen met alle gebruikers",
"vaultCreateProfile": "Profiel aanmaken",
"vaultProfileCreated": "Vault-profiel aangemaakt",
"vaultProfileSaved": "Vault-profiel opgeslagen",
"vaultProfileDeleted": "Kluisprofiel verwijderd",
"vaultProfileSaveFailed": "Het opslaan van het Vault-profiel is mislukt.",
"vaultProfileDeleteFailed": "Het verwijderen van het Vault-profiel is mislukt.",
"vaultSaveProfile": "Profiel opslaan",
"vaultProfileValidationError": "Naam, kluisadres en SSH-ondertekeningsrol zijn vereist.",
"vaultNoProfiles": "Nog geen Vault-profielen beschikbaar.",
"vaultSharedBadge": "gedeeld",
"keyTypeLabel": "Sleuteltype",
"keyTypeAuto": "Automatische detectie",
"keyPasteTab": "Plakken",
"keyUploadTab": "Uploaden",
"keyFileLoaded": "Sleutelbestand geladen",
"keyUploadClick": "Klik om een .pem-, .key- of .ppk-bestand te uploaden.",
"clearKey": "Sleutel wissen",
"keySaved": "SSH-sleutel opgeslagen",
"keyReplaceNotice": "Plak hieronder een nieuwe sleutel om deze te vervangen.",
"keyPassphraseSaved": "Wachtwoordzin opgeslagen, typ om te wijzigen",
"replaceKey": "Vervang de sleutel",
"docsLink": "Documenten bekijken",
"stepcaLabel": "Stap CA",
"stepcaDesc": "Meld u aan via uw identiteitsprovider en laat uw Step CA een kortstondig SSH-certificaat voor deze host uitgeven. De CA-URL, root-fingerprint en OIDC-provisioner worden door een beheerder ingesteld onder Beheerinstellingen.",
"authTypeStepca": "Stap CA",
"opksshLabel": "OPKSSH",
"opksshDesc": "Meld u aan bij deze host met uw identiteitsprovider in plaats van een wachtwoord of sleutel. Hiervoor moet OPKSSH op de server geconfigureerd zijn.",
"warpgateLabel": "Warpgate-poort",
"warpgateDesc": "Deze host maakt verbinding via een Warpgate SSH-proxy. Termix handelt de browsergebaseerde goedkeuringsprocedure automatisch af na authenticatie.",
"agentLabel": "SSH-agent",
"agentDesc": "Authenticeer met behulp van een SSH-agent die op de Termix-server draait (Bitwarden, 1Password, gpg-agent, KeeAgent, ssh-agent). De agent moet draaien op de machine waarop Termix is gehost.",
"agentAuthenticationDesc": "Gebruik sleutels van een SSH-agent om deze verbinding te authenticeren. Laat het socketpad leeg om SSH_AUTH_SOCK te gebruiken.",
"agentSocketPathLabel": "Agent Socket Path",
"agentSocketPathPlaceholder": "Laat dit veld leeg om SSH_AUTH_SOCK te gebruiken.",
"agentSocketPathHint": "Laat dit veld leeg om automatisch te detecteren via de omgevingsvariabele SSH_AUTH_SOCK, of voer een aangepast socketpad in (bijv. /run/user/1000/gnupg/S.gpg-agent.ssh).",
"agentIdentityLabel": "Agentidentiteit (openbare sleutel)",
"agentIdentityPlaceholder": "Laat dit veld leeg om alle sleutels van de agent te proberen.",
"agentIdentityHint": "Plak hier een openbare sleutel (bijv. ssh-ed25519 AAAA...) zodat alleen die sleutel door de agent wordt aangeboden. Dit wordt aanbevolen wanneer de agent veel sleutels beheert, om te voorkomen dat het maximale aantal autorisaties (MaxAuthTries) van de server wordt overschreden.",
"shareSshAuthLabel": "Deel SSH-authenticatie",
"shareSshAuthDesc": "Geef ontvangers versleutelde kopieën van de SSH-authenticatiegegevens van deze host. De persoonlijke inloggegevens van de ontvanger hebben echter nog steeds voorrang.",
"tailscaleDeviceSelect": "Selecteer het Tailscale-apparaat",
"tailscaleDeviceSelectPlaceholder": "Selecteer een apparaat...",
"tailscaleNoApiKey": "Er is geen Tailscale API-sleutel geconfigureerd. Voeg er een toe in de beheerdersinstellingen om apparaatdetectie in te schakelen.",
"tailscaleDocsLink": "Documenten bekijken",
"tailscaleLoadingDevices": "Apparaten laden...",
"tailscaleDeviceLoadFailed": "Het laden van Tailscale-apparaten is mislukt. Controleer de API-URL en de netwerkverbinding.",
"tailscaleNoDevices": "Geen apparaten gevonden in uw achternet.",
"tailscaleDeviceAutoFill": "Als je een apparaat selecteert, wordt het IP-adres van de host automatisch ingevuld.",
"forceKeyboardInteractiveLabel": "Forceer toetsenbord interactief",
"forceKeyboardInteractiveShortDesc": "Handmatige wachtwoordinvoer afdwingen, zelfs als er sleutels aanwezig zijn.",
"allowLegacyAlgorithmsLabel": "Sta verouderde algoritmen toe",
"allowLegacyAlgorithmsDesc": "Schakel verouderde SSH-algoritmen (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) in voor verbindingen met oude apparaten die niet kunnen worden geüpgraded.",
"insecure": "Onzeker",
"terminalAppearance": "Terminale verschijning",
"colorTheme": "Kleurenthema",
"fontFamilyLabel": "Lettertypefamilie",
"fontFamilyCustomOption": "Aangepast...",
"fontFamilyCustomPlaceholder": "Exacte lettertypenaam, bijvoorbeeld MesloLGS NF",
"fontFamilyCustomHint": "Kies een van de meegeleverde lettertypen, of selecteer 'Aangepast' en typ de exacte naam van een lettertype dat al op uw systeem is geïnstalleerd (bijv. MesloLGS NF, Noto Sans Mono). Termix kan geen lettertypen voor u installeren; installeer ze eerst op uw besturingssysteem.",
"fontSizeLabel": "Lettergrootte",
"cursorStyleLabel": "Cursorstijl",
"letterSpacingPx": "Letterafstand (px)",
"lineHeightLabel": "Lijnhoogte",
"bellStyleLabel": "Klokstijl",
"backspaceModeLabel": "Backspace-modus",
"cursorBlinking": "Knipperende cursor",
"cursorBlinkingDesc": "Schakel de knipperanimatie voor de terminalcursor in.",
"rightClickSelectsWordLabel": "Rechtsklikken selecteert Word",
"rightClickSelectsWordShortDesc": "Selecteer het woord onder de cursor door met de rechtermuisknop te klikken.",
"macOptionIsMetaLabel": "Option-toets verzendt metadata",
"macOptionIsMetaShortDesc": "Schakel het typen van speciale tekens (zoals @ of |) met de Option/Alt-toets op macOS uit in plaats van Meta te verzenden.",
"backgroundImageLabel": "URL van de achtergrondafbeelding",
"backgroundImageDesc": "Optionele URL voor een achtergrondafbeelding voor de terminal",
"backgroundImageOpacityLabel": "Achtergrondafbeelding transparantie",
"customThemeColors": "Aangepaste kleuren",
"customThemeBackground": "Achtergrond",
"customThemeForeground": "Voorgrond",
"customThemeCursor": "Cursor",
"customThemeCursorAccent": "Cursoraccent",
"customThemeSelection": "Selectie",
"customThemeAnsiColors": "ANSI-kleuren",
"customThemeBlack": "Zwart",
"customThemeRed": "Rood",
"customThemeGreen": "Groente",
"customThemeYellow": "Geel",
"customThemeBlue": "Blauw",
"customThemeMagenta": "Magenta",
"customThemeCyan": "Cyaan",
"customThemeWhite": "Wit",
"customThemeBrightBlack": "Helderzwart",
"customThemeBrightRed": "Felrood",
"customThemeBrightGreen": "Felgroen",
"customThemeBrightYellow": "Felgeel",
"customThemeBrightBlue": "Helderblauw",
"customThemeBrightMagenta": "Fel magenta",
"customThemeBrightCyan": "Helder cyaan",
"customThemeBrightWhite": "Helder wit",
"customThemeResetTooltip": "Terugzetten naar standaardinstellingen",
"savedThemesLabel": "Opgeslagen thema's",
"saveAsGlobalTheme": "Opslaan als globaal thema",
"saveGlobalThemeNamePrompt": "Geef dit thema een naam.",
"saveGlobalThemeSuccess": "Thema opgeslagen",
"saveGlobalThemeError": "Het opslaan van het thema is mislukt.",
"applyGlobalThemeTooltip": "Pas dit thema toe",
"deleteGlobalThemeTooltip": "Verwijder dit thema",
"noSavedThemes": "Nog geen opgeslagen thema's",
"syntaxHighlightingLabel": "Syntaxmarkering",
"syntaxHighlightingDesc": "Kleur de terminaluitvoer (fouten, paden, IP-adressen, tijdstempels) in.",
"syntaxHighlightingCategories": "Markeer categorieën",
"syntaxHighlightingCategoriesDesc": "Kies welke soorten inhoud je wilt inkleuren.",
"syntaxCategoryLogLevels": "Logniveaus",
"syntaxCategoryLogLevelsDesc": "fout, waarschuwing, info, debug, fataal",
"syntaxCategoryPaths": "Bestandspaden",
"syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt",
"syntaxCategoryTimestamps": "Tijdstempels",
"syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15",
"syntaxCategoryIpAddresses": "IP-adressen",
"syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080",
"syntaxCategoryUrls": "URL's",
"syntaxCategoryUrlsDesc": "https://example.com",
"syntaxCategoryNumbers": "Gelabelde nummers",
"syntaxCategoryNumbersDesc": "poort 8080, uitgang 1, status 404",
"behaviorAndAdvanced": "Gedrag & Geavanceerd",
"scrollbackBufferLabel": "Terugscrollbuffer",
"scrollbackMaxLines": "Maximaal aantal regels dat in de geschiedenis wordt bewaard",
"sshAgentForwardingLabel": "SSH-agent doorsturen",
"sshAgentForwardingShortDesc": "Sta deze externe host toe om uw lokale SSH-agent te gebruiken voor verdere verbindingen. Dit is niet vereist voor agentverificatie.",
"useSSHTitleLabel": "Gebruik SSH-venstertitel",
"useSSHTitleDesc": "Werk de tabtitel bij met de venstertitel van de shell in plaats van de hostnaam.",
"enableAutoMosh": "Auto-Mosh inschakelen",
"enableAutoMoshDesc": "Geef de voorkeur aan Mosh boven SSH indien beschikbaar.",
"enableAutoTmux": "Auto-Tmux inschakelen",
"enableAutoTmuxDesc": "Zorg ervoor dat je shell en alles wat daarin draait, blijft functioneren, ook na een verbindingsoverbreking of een herstart van de browser, door tmux te gebruiken (tmux moet wel op de host geïnstalleerd zijn).",
"enableSessionLogging": "Sessieregistratie",
"enableSessionLoggingDesc": "Sla de uitvoer van de terminalsessie op voor latere beoordeling.",
"allowSessionSharing": "Sessiedeling toestaan",
"allowSessionSharingDesc": "Sta toe dat live sessies op deze host via een link of met andere gebruikers worden gedeeld.",
"enableCommandHistory": "Commandogeschiedenis",
"enableCommandHistoryDesc": "Sla de commando's die in deze terminal worden uitgevoerd op voor de geschiedenis en automatisch aanvullen.",
"localEchoLabel": "Local Echo",
"localEchoDesc": "Voorspel lokaal veilige toetsaanslagen, ook bij trage internetverbindingen. Wachtwoordprompts en besturingsinvoer worden nooit weergegeven.",
"localEchoDefault": "Gebruik de globale instelling",
"localEchoOff": "Uit",
"localEchoAuto": "Automatisch",
"localEchoOn": "Altijd aan",
"linkClickBehaviorLabel": "Klikgedrag op links",
"linkClickBehaviorDesc": "Hiermee bepaal je wat er gebeurt wanneer je op een link in de terminal klikt. Gebruik 'Standaard' om de instelling op app-niveau te volgen.",
"linkClickBehaviorDefault": "Standaard (volg de app-instellingen)",
"linkClickBehaviorConfirm": "Toon pop-up om te openen of te kopiëren",
"linkClickBehaviorDirect": "Direct openen",
"sudoPasswordAutoFillLabel": "Sudo-wachtwoord automatisch invullen",
"sudoPasswordAutoFillShortDesc": "Voer automatisch het sudo-wachtwoord in wanneer daarom wordt gevraagd.",
"sudoPasswordAutoFillDesc": "Sla een sudo-wachtwoord op, zodat hoststatistieken, terminalprompts en andere programma's automatisch geprivilegieerde opdrachten kunnen uitvoeren.",
"sudoPasswordLabel": "Sudo-wachtwoord",
"sudoPasswordSaved": "Wachtwoord opgeslagen, typ om te wijzigen",
"environmentVariablesLabel": "Omgevingsvariabelen",
"addVariableBtn": "Variabele toevoegen",
"noEnvVars": "Er zijn geen omgevingsvariabelen geconfigureerd.",
"fastScrollModifierLabel": "Snel scrollen-modifier",
"fastScrollSensitivityLabel": "Snel scrollen gevoeligheid",
"moshCommandLabel": "Mosh Command",
"startupSnippetLabel": "Opstartfragment",
"keepaliveIntervalLabel": "Keepalive-interval (seconden)",
"maxKeepaliveMisses": "Max Keepalive mist",
"tunnelSettings": "Tunnelinstellingen",
"enableTunneling": "Tunneling inschakelen",
"enableTunnelingDesc": "Schakel de SSH-tunnelfunctionaliteit voor deze host in.",
"serverTunnelsSection": "Servertunnels",
"addTunnelBtn": "Voeg tunnel toe",
"noTunnelsConfigured": "Er zijn geen tunnels geconfigureerd.",
"tunnelLabel": "Tunnel {{number}}",
"tunnelType": "Tunneltype",
"tunnelModeLocalDesc": "Een lokale poort doorsturen naar een poort op de externe server (of een host die vanaf die server bereikbaar is).",
"tunnelModeRemoteDesc": "Een poort op de externe server doorsturen naar een lokale poort op uw computer.",
"tunnelModeDynamicDesc": "Maak een SOCKS5-proxy aan op een lokale poort voor dynamische poortdoorsturing.",
"sameHost": "Deze host (directe tunnel)",
"endpointHost": "Eindpunthost",
"endpointHostPlaceholder": "Dezelfde host, SSH-host of bereikbare host/IP-adres",
"endpointPort": "Eindpuntpoort",
"bindHost": "Bind Host",
"sourcePort": "Bronpoort",
"maxRetries": "Max. aantal herhalingen",
"retryIntervalS": "Herhaalinterval (s)",
"autoStartLabel": "Automatisch starten",
"autoStartDesc": "Deze tunnel automatisch verbinden wanneer de host wordt geladen.",
"tunnelConnecting": "Tunnelverbinding...",
"tunnelDisconnected": "Tunnel losgekoppeld",
"failedToConnectTunnel": "Verbinding mislukt",
"failedToDisconnectTunnel": "Verbinding verbreken mislukt",
"dockerIntegration": "Docker-integratie",
"enableDockerMonitor": "Docker inschakelen",
"enableDockerMonitorDesc": "Containers op deze host bewaken en beheren via Docker.",
"containerRuntime": "Container Runtime",
"containerRuntimeDesc": "Kies de CLI die op deze host wordt gebruikt voor containerbeheer.",
"containerRuntimeDocker": "Docker",
"containerRuntimePodman": "Podman",
"enableTmuxMonitor": "Tmux Monitor inschakelen",
"enableTmuxMonitorDesc": "Toon deze host in de Tmux Monitor en voeg de bijbehorende Tmux-acties toe aan de zijbalk.",
"enableTerminalToolbar": "Terminalwerkbalk inschakelen",
"enableTerminalToolbarDesc": "Toon een sneltoegangsbalk die is vastgezet aan de actieve terminal voor de tools en live statistieken van deze host.",
"connectionToolbar": "Verbindingswerkbalk",
"showConnectionToolbar": "Verbindingswerkbalk weergeven",
"showConnectionToolbarDesc": "Toon de werkbalk in de SSH-, RDP-, VNC- en Telnet-sessies van deze host. Je kunt de werkbalk ook tijdelijk verbergen via de werkbalk zelf.",
"enableAiAssistant": "AI-assistent inschakelen",
"enableAiAssistantDesc": "Sta de AI-assistent toe om te helpen in de terminal van deze host. Standaard uitgeschakeld, maar AI moet nog steeds voor uw account zijn ingeschakeld.",
"tabProxmox": "Proxmox",
"proxmoxIntegration": "Proxmox-integratie",
"enableProxmox": "Proxmox inschakelen",
"enableProxmoxDesc": "Markeer deze host als een Proxmox-node. Dit maakt het mogelijk om virtuele machines direct vanaf deze host te detecteren en te importeren.",
"proxmoxDefaultAuthType": "Standaard authenticatietype",
"proxmoxDefaultAuthTypeDesc": "Authenticatiemethode toegepast op geïmporteerde gasthosts. Kies het authenticatietype dat overeenkomt met de manier waarop u verbinding maakt met uw gasten.",
"authTypePassword": "Wachtwoord",
"authTypeKey": "SSH-sleutel",
"authTypeCredential": "Referentie",
"authTypeOpkssh": "OPKSSH",
"authTypeNone": "Geen",
"proxmoxDefaultCredential": "Standaard inloggegevens",
"proxmoxDefaultCredentialDesc": "De inloggegevens die worden gebruikt voor geïmporteerde gasthosts wanneer het authenticatietype is ingesteld op 'Inloggegevens'.",
"proxmoxWindowsDetection": "Windows-/RDP-detectie",
"proxmoxWindowsDetectionDesc": "Door komma's gescheiden naampatronen die RDP in plaats van SSH activeren (hoofdlettergevoeligheid speelt geen rol).",
"proxmoxDockerDetection": "Docker-detectie",
"proxmoxDockerDetectionDesc": "Door komma's gescheiden naampatronen waarmee Docker gastsystemen kan herkennen.",
"proxmoxPreferredRanges": "Voorkeurs-IP-bereiken",
"proxmoxPreferredRangesDesc": "Door komma's gescheiden voorvoegsels in prioriteitsvolgorde voor IP-selectie wanneer een gast meerdere interfaces heeft.",
"proxmoxAutoSync": "Automatische synchronisatie van gasten",
"proxmoxAutoSyncDesc": "Ontdek periodiek dit Proxmox-knooppunt en maak of update geïmporteerde gasthosts terwijl uw sessie ontgrendeld is.",
"proxmoxSyncInterval": "Synchronisatie-interval (minuten)",
"proxmoxSyncIntervalDesc": "Minimaal 5 minuten. De planner slaat vergrendelde gebruikerssessies over.",
"proxmoxMarkMissing": "Markeer ontbrekende gasten",
"proxmoxMarkMissingDesc": "Voeg een 'proxmox-missing'-tag toe wanneer een eerder geïmporteerde gast verdwijnt, in plaats van deze te verwijderen.",
"proxmoxLastSync": "Laatste synchronisatie",
"proxmoxLastSyncNever": "Nog niet gesynchroniseerd",
"proxmoxLastSyncNoResult": "Geen resultaatdetails",
"proxmoxLastSyncSummary": "{{created}} aangemaakt, {{updated}} bijgewerkt, {{markedMissing}} ontbreekt, {{skipped}} overgeslagen",
"proxmoxLastSyncStatus": {
"success": "Succes",
"error": "Mislukt",
"pending": "In behandeling"
},
"proxmoxDiscoverAction": "Ontdek en importeer Proxmox-gasten",
"proxmoxImportTitle": "Importeren vanuit Proxmox",
"proxmoxSelectHost": "Selecteer een Proxmox-host…",
"proxmoxDiscover": "Ontdekken",
"proxmoxDiscovering": "Ontdekken…",
"proxmoxDiscoverGuests": "Ontdek gasten",
"proxmoxGuestsSelected_one": "{{count}} gast — {{selected}} geselecteerd",
"proxmoxGuestsSelected_other": "{{count}} gasten — {{selected}} geselecteerd",
"proxmoxSelectAll": "Alles selecteren",
"proxmoxDeselectAll": "Alles deselecteren",
"proxmoxNoGuests": "Er zijn geen gasten gevonden op dit Proxmox-knooppunt.",
"proxmoxImportButton_one": "Importeer {{count}} host",
"proxmoxImportButton_other": "Importeer {{count}} hosts",
"proxmoxResultImported": "{{count}} geïmporteerd",
"proxmoxResultUpdated": "{{count}} bijgewerkt",
"proxmoxResultFailed": "{{count}} mislukt",
"proxmoxResultSkippedNoIp": "{{count}} overgeslagen (geen IP-adres gevonden)",
"proxmoxImportComplete": "Proxmox-import voltooid: {{summary}}",
"proxmoxDiscoveryFailed": "Ontdekking mislukt",
"proxmoxImportFailed": "Importeren mislukt",
"enableProxmoxStats": "Proxmox-statistieken inschakelen",
"enableProxmoxStatsDesc": "Toon een tabblad Proxmox-statistieken voor deze host met live statistieken van knooppunten, gastsystemen, opslag en het cluster, verzameld via SSH.",
"proxmoxStatsPollInterval": "Pollinterval (seconden)",
"proxmoxStatsPollIntervalDesc": "Minimaal 15 seconden. Hoe vaak moeten de Proxmox-node-statistieken worden vernieuwd?",
"proxmoxStatsNodeOverride": "Knooppuntnaam overschrijven",
"proxmoxStatsNodeOverrideDesc": "Schakel de automatische detectie van de Proxmox-knooppuntnaam uit (deze wordt standaard gedetecteerd via de hostnaam).",
"proxmoxStatsNodeOverridePlaceholder": "Automatisch gedetecteerd op basis van hostnaam",
"proxmoxStatsUrlCopied": "De URL van Proxmox Stats is naar het klembord gekopieerd.",
"copyProxmoxStatsUrlAction": "Kopieer de URL van Proxmox-statistieken",
"enableFileManagerMonitor": "Bestandsbeheer inschakelen",
"enableFileManagerMonitorDesc": "Blader door en beheer bestanden op deze host via SFTP.",
"scpLegacyLabel": "SCP Legacy-modus",
"scpLegacyDesc": "Gebruik de traditionele bestandsoverdrachtsmethode voor servers die het SFTP-subsysteem niet ondersteunen (bijvoorbeeld ingebouwde of minimale SSH-servers).",
"defaultPathLabel": "Standaardpad",
"fileManagerPathHint": "De map die geopend moet worden wanneer de bestandsbeheerder voor deze host wordt gestart.",
"statusChecksLabel": "Statuscontroles",
"enableStatusChecks": "Statuscontroles inschakelen",
"enableStatusChecksDesc": "Controleer periodiek de beschikbaarheid van deze host.",
"useGlobalInterval": "Gebruik globaal interval",
"useGlobalIntervalDesc": "Overschrijf dit met het serverbrede statuscontrole-interval.",
"checkIntervalS": "Controle-interval (s)",
"checkIntervalDesc": "Seconden tussen elke verbindingsping",
"metricsCollectionLabel": "Gegevensverzameling",
"enableMetricsLabel": "Statistieken inschakelen",
"enableMetricsDesc": "Verzamel gegevens over CPU, RAM, schijfgebruik en andere parameters van deze host.",
"useGlobalMetrics": "Gebruik globaal interval",
"useGlobalMetricsDesc": "Overschrijf dit met het serverbrede metrische interval.",
"metricsIntervalS": "Metriekinterval (s)",
"metricsIntervalDesc2": "Seconden tussen momentopnamen van de meetwaarden",
"excludedMountsLabel": "Uitgesloten montagesystemen",
"monitoredMountsLabel": "Aangepaste bewaakte paden",
"monitoredMountsDesc": "Voeg paden toe die niet als aparte mounts worden weergegeven, inclusief bind-mounted Home Assistant-paden zoals /config.",
"monitoredMountPathPlaceholder": "Pad (/config, /mnt/data)",
"monitoredMountLabelPlaceholder": "Label (optioneel)",
"addMonitoredMount": "Pad toevoegen",
"excludedMountsDesc": "Verberg specifieke koppelpunten of bestandssysteemtypen (bijv. nfs, cifs) voor schijfgebruik en waarschuwingen voor deze host.",
"excludedMountsPlaceholder": "Mountpad (/mnt/nas) of bestandssysteemtype (nfs, cifs)",
"excludedMountsEmpty": "Geen mounts uitgesloten. Alle gedetecteerde bestandssystemen worden weergegeven.",
"addExcludedMount": "Toevoegen",
"visibleWidgets": "Zichtbare widgets",
"widgetsMovedToHostMetrics": "Kaarten kunnen nu rechtstreeks in het tabblad Hoststatistieken worden toegevoegd, gerangschikt en van formaat worden veranderd. Open Hoststatistieken voor deze host en gebruik Aanpassen om te kiezen welke kaarten worden weergegeven.",
"cpuUsageLabel": "CPU-gebruik",
"cpuUsageDesc": "CPU-percentage, gemiddelde belasting, sparkline-grafiek",
"memoryLabel": "Geheugengebruik",
"memoryDesc": "RAM-gebruik, swap, cache",
"storageLabel": "Schijfgebruik",
"storageDesc": "Schijfgebruik per koppelpunt",
"networkLabel": "Netwerkinterfaces",
"networkDesc": "Interfacelijst en bandbreedte",
"uptimeLabel": "Beschikbaarheid",
"uptimeDesc": "Systeem uptime en opstarttijd",
"systemInfoLabel": "Systeeminfo",
"systemInfoDesc": "OS, kernel, hostnaam, architectuur",
"recentLoginsLabel": "Recente aanmeldingen",
"recentLoginsDesc": "Succesvolle en mislukte inloggebeurtenissen",
"topProcessesLabel": "Belangrijkste processen",
"topProcessesDesc": "PID, CPU%, MEM%, commando",
"listeningPortsLabel": "Luisterpoorten",
"listeningPortsDesc": "Open poorten met proces en status",
"firewallLabel": "Firewall",
"firewallDesc": "Firewall-, AppArmor- en SELinux-status",
"quickActionsLabel": "Snelle acties",
"quickActionsToolbar": "Snelle acties verschijnen als knoppen in de Host Metrics-werkbalk, zodat u opdrachten met één klik kunt uitvoeren.",
"noQuickActions": "Nog geen snelle acties ondernomen.",
"buttonLabel": "Knoplabel",
"selectSnippetPlaceholder": "Selecteer fragment...",
"addActionBtn": "Actie toevoegen",
"hostSharedSuccessfully": "Host heeft succesvol gedeeld",
"failedToShareHost": "Het delen van de host is mislukt.",
"accessRevoked": "Toegang ingetrokken",
"failedToRevokeAccess": "Toegang intrekken is mislukt",
"cancelBtn": "Annuleren",
"savingBtn": "Besparing...",
"addHostBtn": "Voeg een host toe",
"hostUpdated": "Host bijgewerkt",
"hostCreated": "Host aangemaakt",
"failedToSave": "Het opslaan van de host is mislukt.",
"credentialUpdated": "Inloggegevens bijgewerkt",
"credentialCreated": "Inloggegevens aangemaakt",
"failedToSaveCredential": "Het opslaan van de inloggegevens is mislukt.",
"credentialNameRequired": "Voer een naam in voor de legitimatie.",
"credentialAuthRequired": "Voeg een wachtwoord, een SSH-sleutel of beide toe.",
"createCredentialFromHostBtn": "Een inloggegeven aanmaken",
"createCredentialFromHostTitle": "Maak een inloggegeven aan vanuit de host.",
"createCredentialFromHostDesc": "Maak een herbruikbare, deelbare inloggegevensvermelding aan die vooraf is ingevuld met de huidige gebruikersnaam, het wachtwoord en/of de SSH-sleutel van deze host.",
"backToHosts": "Terug naar hosts",
"pinned": "Vastgepind",
"noHostsFound": "Geen hosts gevonden",
"tryDifferentTerm": "Probeer een andere term.",
"addFirstHost": "Voeg je eerste host toe om te beginnen.",
"noCredentialsFound": "Geen inloggegevens gevonden",
"addCredentialBtn": "Voeg inloggegevens toe",
"updateCredentialBtn": "Inloggegevens bijwerken",
"editCredentialAction": "Inloggegevens bewerken",
"backToHost": "Terug naar de host",
"saveCredentialAsNewBtn": "Opslaan als nieuw",
"saveCredentialAsNewDesc": "Hiermee wordt een nieuwe referentie aangemaakt met deze wijzigingen en toegewezen aan deze host. De oorspronkelijke referentie blijft ongewijzigd.",
"credentialSavedAsNew": "Opgeslagen als een nieuwe referentie",
"failedToSaveCredentialAsNew": "Opslaan als nieuwe inloggegevens is mislukt.",
"features": "Functies",
"noFolder": "(Geen map)",
"deleteSelected": "Verwijderen",
"exitSelection": "Selectie verlaten",
"importSkip": "Importeren (bestaande overslaan)",
"importOverwrite": "Importeren (overschrijven)",
"collapseBtn": "Instorten",
"importExportBtn": "Import/Export",
"hostStatusesRefreshed": "Hoststatussen vernieuwd",
"failedToRefreshHosts": "Het vernieuwen van de hosts is mislukt.",
"movedHostTo": "Verplaatst {{host}} naar \"{{folder}}\"",
"failedToMoveHost": "Het verplaatsen van de host is mislukt.",
"deletedFolder": "Verwijderde map \"{{name}}\"",
"failedToDeleteFolder": "Map verwijderen mislukt",
"deleteAllInFolder": "Alle hosts in \"{{name}}\" verwijderen? Dit kan niet ongedaan gemaakt worden.",
"folderPickerPlaceholder": "Geen map",
"folderPickerSearch": "Zoeken of aanmaken (gebruik / voor submappen)...",
"folderPickerNone": "Geen map",
"folderPickerCreate": "Maak \"{{path}}\"",
"folderPickerEmpty": "Geen overeenkomende mappen gevonden",
"parentHost": "Ouderlijke gastheer",
"useFolderInstead": "Gebruik in plaats daarvan een map.",
"useParentHostInstead": "Gebruik in plaats daarvan de hoofdhost.",
"parentHostPickerPlaceholder": "Geen ouderhost",
"parentHostPickerSearch": "Zoek hosts...",
"parentHostPickerNone": "Geen ouderhost",
"parentHostPickerEmpty": "Geen overeenkomende hosts gevonden",
"collapseSubHosts": "Subhosts inklappen",
"expandSubHosts": "Subhosts uitbreiden",
"cannotNestUnderDescendant": "Je kunt een host niet onder zijn eigen subhost nesten.",
"movedToParent": "Verplaatst {{count}} host(s) naar \"{{parent}}\"",
"newFolder": "Nieuwe map",
"createFolderTitle": "Map aanmaken",
"editFolderTitle": "Map bewerken",
"folderDialogDescription": "Kies een naam, kleur en pictogram. Gebruik / om mappen te nesten.",
"folderNameLabel": "Mapnaam",
"folderNamePlaceholder": "bijv. Productie/Web",
"folderNestingHint": "Gebruik / om niveaus te scheiden en geneste mappen te maken.",
"folderNameDuplicate": "Er bestaat hier al een map met deze naam.",
"folderColor": "Kleur",
"folderIcon": "Icon",
"folderCredential": "Referentie",
"folderCredentialNone": "Geen inloggegevens toegewezen",
"folderCredentialHint": "Hosts in deze map die gebruikmaken van authenticatie met \"Opgeslagen referenties\" zonder hun eigen referenties te hebben geselecteerd, zullen deze referenties overnemen.",
"folderPreview": "Voorbeeld",
"folderNameFallback": "Naamloze map",
"createFolderButton": "Map aanmaken",
"saveFolderButton": "Map opslaan",
"cancel": "Annuleren",
"iconSearchPlaceholder": "Zoekpictogrammen...",
"openAllSessions": "Open alle sessies",
"editFolder": "Map bewerken",
"deleteFolder": "Map verwijderen",
"selectFolder": "Selecteer alle hosts in de map",
"deselectFolder": "Deselecteer alle hosts in de map",
"folderSaved": "Map opgeslagen",
"failedToSaveFolder": "Map opslaan mislukt",
"folderDeleted": "Verwijderde map \"{{name}}\"",
"deleteFolderConfirm": "Verwijder \"{{name}}\" en de bijbehorende {{count}} host(s)? Dit kan niet ongedaan gemaakt worden.",
"failedToMoveHosts": "Het verplaatsen van hosts is mislukt.",
"failedToReorder": "Opnieuw bestellen is mislukt",
"expandAll": "Vouw alle mappen uit",
"collapseAll": "Alle mappen inklappen",
"moreActions": "Meer",
"groupBy": "Groeperen op",
"GroupByFolder": "Map",
"GroupByTag": "Tag",
"GroupByStatus": "Status",
"GroupByProtocol": "Protocol",
"GroupByAuth": "Auth-type",
"groupUngrouped": "Niet gegroepeerd",
"customizeSidebar": "Zijbalk aanpassen",
"customizeSidebarDescription": "Kies hoe de hostlijst eruitziet en zich gedraagt.",
"customizeDensityTitle": "Dikte",
"customizeBehaviorTitle": "Gedrag",
"customizeSortHint": "De sorteervolgorde en groepering vindt u in de sorteer- en groeperingsmenu's in de werkbalk.",
"densityComfortableDesc": "Meer details per host: adres, tags en resourcegebruik.",
"densityCompactDesc": "Eén regel per host, voor langere lijsten.",
"display": "Weergave",
"displayDensity": "Dikte",
"displayDensityComfortable": "Comfortabel",
"displayDensityCompact": "Compact",
"displayShowTags": "Toon tags",
"displayTrayOnClick": "Acties openen bij klikken (in plaats van bij hoveren)",
"actionsVisibility": "Weergave van hostacties",
"actionsVisibilityDesc": "Kies wanneer hostacties worden uitgevouwen. Selecteer 'klikken' om het eerdere 'klikken om uit te vouwen'-gedrag te herstellen.",
"actionsAlways": "Altijd zichtbaar",
"actionsOnly": "Alleen verbinden, de rest is klikken.",
"actionsHover": "Weergeven bij hoveren",
"actionsClick": "Klik om uit te vouwen/in te klappen",
"openOnDoubleClick": "Openen bij dubbelklikken",
"openOnDoubleClickDesc": "Vereis een dubbelklik in plaats van een enkele klik om een hostsessie te openen.",
"deletedHost": "Verwijderd {{name}}",
"copiedToClipboard": "Gekopieerd naar het klembord",
"terminalUrlCopied": "Terminal-URL gekopieerd",
"fileManagerUrlCopied": "URL van bestandsbeheerder gekopieerd",
"tunnelUrlCopied": "Tunnel-URL gekopieerd",
"dockerUrlCopied": "Docker-URL gekopieerd",
"hostMetricsUrlCopied": "URL van hoststatistieken gekopieerd",
"tmuxMonitorUrlCopied": "Tmux Monitor URL gekopieerd",
"rdpUrlCopied": "RDP-URL gekopieerd",
"openNativeRdp": "Openen in Windows Extern bureaublad",
"nativeRdpOpened": "Geopend in Windows Remote Desktop",
"nativeRdpFailed": "Het openen van Windows Remote Desktop is mislukt.",
"vncUrlCopied": "VNC-URL gekopieerd",
"telnetUrlCopied": "Telnet-URL gekopieerd",
"remoteDesktopUrlCopied": "URL voor extern bureaublad gekopieerd",
"expandActions": "Acties uitbreiden",
"collapseActions": "Inklapacties",
"wakeOnLanAction": "Wake on LAN",
"wakeOnLanSuccess": "Magisch pakket verzonden naar {{name}}",
"wakeOnLanError": "Het verzenden van het magic packet is mislukt.",
"cloneHostAction": "Kloonhost",
"copyAddress": "Kopieer adres",
"copyLink": "Link kopiëren",
"copyTerminalUrlAction": "Terminal-URL kopiëren",
"copyFileManagerUrlAction": "Kopieer de URL van de bestandsbeheerder",
"copyTunnelUrlAction": "Kopieer de tunnel-URL",
"copyDockerUrlAction": "Kopieer de Docker-URL",
"copyHostMetricsUrlAction": "Kopieer de URL voor hoststatistieken",
"copyTmuxMonitorUrlAction": "Kopieer de URL van Tmux Monitor",
"copyRdpUrlAction": "Kopieer de RDP-URL",
"copyVncUrlAction": "Kopieer de VNC-URL",
"copyTelnetUrlAction": "Telnet-URL kopiëren",
"copyRemoteDesktopUrlAction": "Kopieer de URL van Extern bureaublad",
"deleteCredentialConfirm": "Verwijder inloggegevens \"{{name}}\"?",
"deletedCredential": "Verwijderd {{name}}",
"deleteHostsConfirm": "Host {{count}} verwijderen{{plural}}? Dit kan niet ongedaan gemaakt worden.",
"movedToRoot": "Verplaatst naar de rootmap",
"enableTerminalFeature": "Terminal inschakelen",
"disableTerminalFeature": "Terminal uitschakelen",
"enableFilesFeature": "Bestanden inschakelen",
"disableFilesFeature": "Bestanden uitschakelen",
"enableTunnelsFeature": "Tunnels inschakelen",
"disableTunnelsFeature": "Tunnels uitschakelen",
"enableDockerFeature": "Docker inschakelen",
"disableDockerFeature": "Docker uitschakelen",
"enableProxmoxFeature": "Proxmox inschakelen",
"disableProxmoxFeature": "Proxmox uitschakelen",
"addTagsPlaceholder": "Tags toevoegen...",
"authDetails": "Authenticatiegegevens",
"credType": "Type",
"generateKeyPairDesc": "Genereer een nieuw sleutelpaar; zowel de privésleutel als de publieke sleutel worden automatisch ingevuld.",
"generatingKey": "Genereren...",
"generateLabel": "Genereer {{label}}",
"uploadFileBtn": "Bestand uploaden",
"keyPassphraseOptional": "Sleutelwachtwoordzin (optioneel)",
"sshPublicKeyOptional": "SSH-publieke sleutel (optioneel)",
"publicKeyGenerated": "Openbare sleutel gegenereerd",
"failedToGeneratePublicKey": "Het is niet gelukt om de publieke sleutel af te leiden.",
"publicKeyCopied": "Openbare sleutel gekopieerd",
"keyPairGenerated": "{{label}} sleutelpaar gegenereerd",
"failedToGenerateKeyPair": "Het genereren van het sleutelpaar is mislukt.",
"searchHostsPlaceholder": "Zoek hosts, adressen, tags…",
"refreshBtn": "Vernieuwen",
"addTag": "Tags toevoegen...",
"deleteConfirmBtn": "Verwijderen",
"tunnelRequirementsText": "De SSH-server moet de volgende instellingen hebben: GatewayPorts yes, AllowTcpForwarding yes en PermitRootLogin yes in /etc/ssh/sshd_config.",
"deleteHostConfirm": "Verwijder \"{{name}}\"?",
"enableAtLeastOneProtocol": "Schakel ten minste één van de bovenstaande protocollen in om de authenticatie- en verbindingsinstellingen te configureren.",
"keyPassphrase": "Sleutelwachtwoordzin",
"connectBtn": "Verbinden",
"disconnectBtn": "Verbinding verbreken",
"basicInformation": "Basisgegevens",
"authDetailsSection": "Authenticatiegegevens",
"credTypeLabel": "Type",
"hostsTab": "Gastheren",
"credentialsTab": "Referenties",
"selectMultiple": "Selecteer meerdere",
"selectHosts": "Selecteer hosts",
"connectionLabel": "Verbinding",
"authenticationLabel": "Authenticatie",
"generateKeyPairTitle": "Sleutelpaar genereren",
"generateKeyPairDescription": "Genereer een nieuw sleutelpaar; zowel de privésleutel als de publieke sleutel worden automatisch ingevuld.",
"generateFromPrivateKey": "Genereren vanuit privésleutel",
"refreshBtn2": "Vernieuwen",
"exitSelectionTitle": "Selectie verlaten",
"addHostBtn2": "Voeg een host toe",
"addCredentialBtn2": "Voeg inloggegevens toe",
"checkingHostStatuses": "De status van de hosts controleren...",
"pinnedSection": "Vastgepind",
"hostsExported": "Hosts succesvol geëxporteerd",
"export": {
"menuItem": "Exporteren...",
"title": "Exporteer hosts",
"scope": "Domein",
"scopeAll": "Alle",
"scopeSelected": "Gekozen",
"searchHosts": "Hosts zoeken...",
"include": "Erbij betrekken",
"groupConnection": "Verbinding",
"groupCredentials": "Referenties",
"groupNotes": "Notities",
"groupTags": "Labels en speld",
"groupTunnels": "Tunnels",
"groupJumpHosts": "Jump-hosts",
"groupQuickActions": "Snelle acties",
"groupFeatureFlags": "Functievlaggen",
"groupAdvanced": "Geavanceerde configuratie",
"preview": "Voorbeeld",
"moreHosts": "... {{count}} meer hosts",
"summary": "{{selected}} van {{total}} hosts",
"credentialsIncluded": "referenties inbegrepen",
"credentialsExcluded": "inloggegevens uitgesloten",
"noneSelected": "Geen hosts geselecteerd",
"cancel": "Annuleren",
"confirm": "Exporteren",
"fetchFailed": "Het laden van hosts voor export is mislukt.",
"bulkButton": "Exporteren"
},
"sampleDownloaded": "Voorbeeldbestand gedownload",
"failedToDeleteCredential2": "Het verwijderen van de inloggegevens is mislukt.",
"noFolderOption": "(Geen map)",
"nSelected": "{{count}} geselecteerd",
"featuresMenu": "Functies",
"moveMenu": "Beweging",
"connectSelected": "Verbinden",
"cancelSelection": "Annuleren",
"deletedCount": "Verwijderde {{count}} hosts",
"failedToDeleteCount": "Het verwijderen van {{count}} hosts is mislukt.",
"duplicatedHost": "Gedupliceerd \"{{name}}\"",
"failedToDuplicateHost": "Het dupliceren van de host is mislukt.",
"updatedCount": "Bijgewerkte {{count}} hosts",
"friendlyNameLabel": "Vriendelijke naam",
"descriptionLabel": "Beschrijving",
"loadingHost": "Host wordt geladen...",
"loadingHosts": "Hosts worden geladen...",
"loadingCredentials": "Inloggegevens worden geladen...",
"noHostsYet": "Nog geen hosts beschikbaar",
"noHostsYetHint": "Voeg een server toe om terminals te openen, bestanden te bekijken en statistieken in te zien.",
"noHostsMatchSearch": "Er zijn geen hosts gevonden die aan uw zoekopdracht voldoen.",
"hostNotFound": "Host niet gevonden",
"searchHosts": "Zoek hosts...",
"sortHosts": "Sorteer hosts",
"sortDefault": "Standaardbestelling",
"sortNameAsc": "Naam (A → Z)",
"sortNameDesc": "Naam (Z → A)",
"sortIpAsc": "IP-adres (oplopend)",
"sortIpDesc": "IP-adres (Beschrijving)",
"sortOnlineFirst": "Eerst online",
"sortOfflineFirst": "Eerst offline",
"sortManual": "Handmatig (slepen om de volgorde te wijzigen)",
"sortPinnedFirst": "Eerst vastgepind",
"filterHosts": "Filter hosts",
"filterClearAll": "Filters wissen",
"filterStatusGroup": "Status",
"filterOnline": "Online",
"filterOffline": "Offline",
"filterPinned": "Vastgepind",
"filterAuthGroup": "Auth-type",
"filterAuthPassword": "Wachtwoord",
"filterAuthKey": "SSH-sleutel",
"filterAuthCredential": "Referentie",
"filterAuthNone": "Geen",
"filterAuthOpkssh": "OPKSSH",
"filterAuthStepca": "Stap CA",
"filterProtocolGroup": "Protocol",
"filterProtocolSsh": "SSH",
"filterProtocolRdp": "RDP",
"filterProtocolVnc": "VNC",
"filterProtocolTelnet": "Telnet",
"filterFeaturesGroup": "Functies",
"filterFeatureTerminal": "Terminal",
"filterFeatureFileManager": "Bestandsbeheerder",
"filterFeatureTunnel": "Tunnel",
"filterFeatureDocker": "Docker",
"filterTagsGroup": "Tags",
"connectRdp": "RDP",
"connectVnc": "VNC",
"connectTelnet": "Telnet",
"editHostAction": "Bewerk de host",
"moreOptions": "Meer opties",
"shareHost": "Deel host",
"shareHostTitle": "Delen: {{name}}",
"shareFolder": "Map delen",
"shareFolderTitle": "Map delen: {{name}}",
"folderSharedSuccessfully": "Gedeelde {{count}} host(s) in map",
"failedToShareFolder": "Map delen mislukt",
"sharing": {
"loadError": "Het laden van de deelgegevens is mislukt. Probeer het opnieuw.",
"shareWithSection": "Delen met",
"usersTab": "Gebruikers",
"rolesTab": "Rollen",
"searchPlaceholder": "Gebruikers of rollen zoeken...",
"noMatches": "Geen overeenkomsten gevonden",
"permissionLevelLabel": "Toegangsniveau",
"levels": {
"connect": {
"label": "Verbinden",
"description": "Alleen open sessies: terminal, extern bureaublad, bestandsbeheer, tunnels en Docker. Geen toegang tot de hostconfiguratie."
},
"view": {
"label": "Weergave",
"description": "Maak verbinding en bekijk de hostconfiguratie. Geheime gegevens worden nooit weergegeven."
},
"edit": {
"label": "Bewerking",
"description": "Bekijk en wijzig de instellingen van de host die geen authenticatie vereist. De SSH-authenticatie van de eigenaar blijft privé en alleen toegankelijk voor de eigenaar."
},
"manage": {
"label": "Beheren",
"description": "Bewerken, de host delen met anderen, toegangsrechten wijzigen en toegang intrekken."
}
},
"expiryLabel": "Toegang verloopt",
"expiry": {
"never": "Nooit",
"oneHour": "1 uur",
"oneDay": "24 uur",
"sevenDays": "7 dagen",
"thirtyDays": "30 dagen",
"custom": "Aangepast"
},
"customHoursPlaceholder": "Aantal uren tot de toegang verloopt",
"shareButton": "Deel",
"shareWithCount": "Delen ({{count}})",
"currentAccess": "Huidige toegang",
"noAccessEntries": "Deze host is nog niet gedeeld.",
"folderRulesTitle": "Van toepassing op hosts die later zijn toegevoegd.",
"folderRulesHint": "Deze gedeelde mappen blijven behouden: een host die erin (of in een submap) wordt aangemaakt of ernaartoe wordt verplaatst, krijgt automatisch dezelfde toegang. Het verwijderen van een regel stopt alleen de toekomstige overerving.",
"folderRuleRemove": "Stop met erven",
"folderShareSummary": "Gedeelde {{shared}} van {{total}} host(s) in deze map",
"grantedBy": "Toegekend door",
"expires": "Verloopt",
"expired": "Verlopen",
"never": "Nooit",
"revoke": "Herroepen",
"accessUpdated": "Toegang bijgewerkt",
"accessUpdateFailed": "Toegang kon niet worden bijgewerkt.",
"sharedBadge": "Gedeeld",
"sharedBadgeTooltip": "Gedeeld door {{owner}} ({{level}} toegang)",
"viewOnlyBanner": "Deze host wordt met u gedeeld door {{owner}} met leesrechten. De configuratie is alleen-lezen.",
"sharedEditBanner": "Deze host wordt met u gedeeld door {{owner}} met bewerkingsrechten. Wijzigingen zijn van toepassing op de daadwerkelijke host; authenticatiegegevens kunnen alleen door de eigenaar worden gewijzigd.",
"ownerOnlyControl": "Alleen de eigenaar van de host kan dit wijzigen.",
"ownerAuthPrivate": "De SSH-authenticatie van de hosteigenaar is privé. Gebruik 'Persoonlijke SSH-authenticatie instellen' in het hostmenu om uw eigen inloggegevens te kiezen.",
"ownerAuthShared": "De hosteigenaar heeft SSH-authenticatie voor deze host gedeeld. U kunt deze gebruiken of uw eigen inloggegevens kiezen via 'Persoonlijke SSH-authenticatie instellen'.",
"authOverrideAction": "Stel persoonlijke SSH-authenticatie in",
"authOverrideActionProtocol": "Stel persoonlijke authenticatie in {{protocol}}",
"authOverrideTitle": "Persoonlijke SSH-authenticatie",
"authOverrideTitleProtocol": "Persoonlijke {{protocol}} authenticatie",
"authOverrideDescriptionPrivate": "De SSH-gegevens van de hosteigenaar blijven privé. Kies een van uw opgeslagen gegevens voor verbindingen met {{host}}.",
"authOverrideDescriptionShared": "Gebruik de authenticatiegegevens die door de hosteigenaar worden gedeeld, of vervang deze door een van uw opgeslagen inloggegevens voor verbindingen met {{host}}.",
"authOverrideCredentialLabel": "Authenticatiegegevens",
"useSharedAuthentication": "Gebruik authenticatie voor gedeelde hosts.",
"noPersonalCredential": "Geen persoonlijke referenties",
"authOverrideNoCredentials": "Je hebt nog geen SSH-gegevens opgeslagen. Maak er een aan in 'Referenties' om verbinding te maken met hosts die authenticatie vereisen.",
"authOverrideRequired": "Deze host vereist een van uw opgeslagen inloggegevens voordat u verbinding kunt maken.",
"authOverridePrivateHint": "Deze inloggegevens zijn alleen voor u toegankelijk. De hosteigenaar en andere ontvangers kunnen deze niet zien of gebruiken.",
"authOverrideSaved": "Persoonlijke SSH-authenticatie opgeslagen",
"authOverrideCleared": "Persoonlijke SSH-authenticatie verwijderd",
"authOverrideClearedToShared": "Authenticatie via gedeelde host",
"authOverrideLoadError": "Het laden van uw SSH-authenticatie is mislukt. Probeer het opnieuw.",
"authOverrideSaveError": "Het opslaan van uw SSH-authenticatie is mislukt."
},
"guac": {
"connection": "Verbinding",
"authentication": "Authenticatie",
"storedCredential": "Opgeslagen inloggegevens",
"noCredential": "Geen inloggegevens (directe inloggegevens hieronder)",
"authMethod": "Authenticatiemethode",
"authTypeDirect": "Direct",
"authTypeCredential": "Referentie",
"authTypeNone": "Geen",
"authTypeNoneDesc": "Er worden geen inloggegevens opgeslagen. U wordt bij elke verbinding gevraagd om een gebruikersnaam en wachtwoord; deze worden niet bewaard.",
"selectCredential": "Selecteer een certificaat...",
"connectionSettings": "Verbindingsinstellingen",
"displaySettings": "Weergave-instellingen",
"audioSettings": "Audio-instellingen",
"rdpPerformance": "RDP-prestaties",
"deviceRedirection": "Apparaatomleiding",
"session": "Sessie",
"gateway": "Gateway",
"remoteApp": "RemoteApp",
"clipboard": "Klembord",
"sessionRecording": "Sessieopname",
"wakeOnLan": "Wake-on-LAN",
"vncSettings": "VNC-instellingen",
"terminalSettings": "Terminalinstellingen",
"rdpPort": "RDP-poort",
"username": "Gebruikersnaam",
"password": "Wachtwoord",
"passwordSaved": "Wachtwoord opgeslagen, typ om te wijzigen",
"domain": "Domein",
"securityMode": "Beveiligingsmodus",
"colorDepth": "Kleurdiepte",
"width": "Breedte",
"height": "Hoogte",
"dpi": "DPI",
"resizeMethod": "Formaatwijzigingsmethode",
"clientName": "Klantnaam",
"initialProgram": "Initiële programma",
"serverLayout": "Serverindeling",
"timezone": "Tijdzone",
"loadBalanceInfo": "Informatie over load balancing / Cookie",
"loadBalanceInfoDesc": "RD Connection Broker-cookie voor load balancing van RDS-farms (bijv. tsv://MS Terminal Services Plugin.1.CollectionName)",
"guacdProxy": "guacd-proxy",
"guacdHostname": "guacd Host",
"guacdHostnamePlaceholder": "Globale standaard",
"guacdPort": "bewakingshaven",
"guacdProxyDesc": "Overschrijf de globale guacd-instantie voor deze verbinding. Laat dit veld leeg om de globaal geconfigureerde guacd te gebruiken.",
"gatewayHostname": "Gateway-hostnaam",
"gatewayPort": "Gateway-poort",
"gatewayUsername": "Gateway-gebruikersnaam",
"gatewayPassword": "Gateway-wachtwoord",
"gatewayDomain": "Gateway-domein",
"remoteAppProgram": "RemoteApp-programma",
"workingDirectory": "Werkmap",
"arguments": "Argumenten",
"normalizeLineEndings": "Normaliseer regeleinden",
"recordingPath": "Opnamepad",
"recordingName": "Opnamenaam",
"macAddress": "MAC-adres",
"broadcastAddress": "Uitzendadres",
"udpPort": "UDP-poort",
"waitTimeS": "Wachttijd (s)",
"driveName": "Schijfnaam",
"drivePath": "Rijpad",
"ignoreCertificate": "Certificaat negeren",
"ignoreCertificateDesc": "Sta verbindingen toe met hosts die zelfondertekende certificaten hebben.",
"forceLossless": "Krachtverliesloos",
"forceLosslessDesc": "Forceer verliesvrije beeldcodering (hogere kwaliteit, meer bandbreedte)",
"disableAudio": "Geluid uitschakelen",
"disableAudioDesc": "Demp alle audio van de externe sessie.",
"enableAudioInput": "Audio-ingang (microfoon) inschakelen",
"enableAudioInputDesc": "Stuur de lokale microfoon door naar de externe sessie.",
"wallpaper": "Behang",
"wallpaperDesc": "Toon bureaubladachtergrond (uitschakelen verbetert de prestaties)",
"theming": "Thema",
"themingDesc": "Schakel visuele thema's en stijlen in.",
"fontSmoothing": "Lettertype-vloeiendheid",
"fontSmoothingDesc": "Schakel ClearType-lettertypeweergave in",
"fullWindowDrag": "Volledig venster slepen",
"fullWindowDragDesc": "Toon de inhoud van het venster tijdens het slepen.",
"desktopComposition": "Bureaubladcompositie",
"desktopCompositionDesc": "Schakel Aero-glaseffecten in",
"menuAnimations": "Menu-animaties",
"menuAnimationsDesc": "Schakel menu-vervagings- en schuifanimaties in.",
"disableBitmapCaching": "Bitmapcaching uitschakelen",
"disableBitmapCachingDesc": "Schakel de bitmapcache uit (dit kan helpen bij storingen).",
"disableOffscreenCaching": "Offscreen-caching uitschakelen",
"disableOffscreenCachingDesc": "Schakel de offscreen cache uit.",
"disableGlyphCaching": "Glyph-caching uitschakelen",
"disableGlyphCachingDesc": "Schakel de glyph-cache uit.",
"enableGfx": "Schakel GFX in",
"enableGfxDesc": "Gebruik de RemoteFX-grafische pipeline",
"enablePrinting": "Afdrukken inschakelen",
"enablePrintingDesc": "Lokale printers doorverwijzen naar de externe sessie",
"enableDriveRedirection": "Schakel schijfomleiding in",
"enableDriveRedirectionDesc": "Een lokale map toewijzen als schijfstation in de externe sessie.",
"createDrivePath": "Maak een rijpad aan",
"createDrivePathDesc": "Maak de map automatisch aan als deze nog niet bestaat.",
"disableDownload": "Download uitschakelen",
"disableDownloadDesc": "Voorkom het downloaden van bestanden vanuit de externe sessie.",
"disableUpload": "Uploaden uitschakelen",
"disableUploadDesc": "Voorkom het uploaden van bestanden naar de externe sessie.",
"enableTouch": "Aanraakbediening inschakelen",
"enableTouchDesc": "Schakel het doorsturen van aanraakinvoer in.",
"consoleSession": "Consolesessie",
"consoleSessionDesc": "Maak verbinding met de console (sessie 0) in plaats van een nieuwe sessie te starten.",
"sendWolPacket": "Verzend WOL-pakket",
"sendWolPacketDesc": "Verzend een magic packet om deze host te activeren voordat u verbinding maakt.",
"disableCopy": "Kopiëren uitschakelen",
"disableCopyDesc": "Voorkom het kopiëren van tekst vanuit de externe sessie.",
"disablePaste": "Plakken uitschakelen",
"disablePasteDesc": "Voorkom dat tekst in de externe sessie wordt geplakt.",
"createPathIfMissing": "Maak een pad aan als dit ontbreekt.",
"createPathIfMissingDesc": "Maak automatisch de opnamemap aan.",
"excludeOutput": "Uitvoer uitsluiten",
"excludeOutputDesc": "Schermuitvoer niet opnemen (alleen metadata).",
"excludeMouse": "Muis uitsluiten",
"excludeMouseDesc": "Neem geen muisbewegingen op.",
"includeKeystrokes": "Inclusief toetsaanslagen",
"includeKeystrokesDesc": "Registreer naast de schermuitvoer ook onbewerkte toetsaanslagen.",
"vncPort": "VNC-poort",
"vncPassword": "VNC-wachtwoord",
"vncUsernameOptional": "Gebruikersnaam (optioneel)",
"vncLeaveBlank": "Laat dit veld leeg als het niet verplicht is.",
"cursorMode": "Cursormodus",
"swapRedBlue": "Wissel rood/blauw om.",
"swapRedBlueDesc": "Wissel de rode en blauwe kleurkanalen om (dit lost enkele kleurproblemen op).",
"readOnly": "Alleen-lezen",
"readOnlyDesc": "Bekijk het externe scherm zonder invoer te verzenden.",
"telnetPort": "Telnet-poort",
"terminalType": "Terminaltype",
"fontName": "Lettertypenaam",
"fontSize": "Lettergrootte",
"colorScheme": "Kleurenschema",
"backspaceKey": "Backspace-toets",
"saveHostFirst": "Sla eerst de host op.",
"sharingOptionsAfterSave": "Deelopties zijn beschikbaar nadat de host is opgeslagen.",
"permissionLevel": "Toegangsniveau",
"typeHeader": "Type",
"targetHeader": "Doel",
"permissionHeader": "Toestemming",
"cancelBtn": "Annuleren",
"savingBtn": "Besparing...",
"updateHostBtn": "Update Host",
"addHostBtn": "Voeg een host toe"
},
"arrangeUnlockedSwitchedToManual": "Overgeschakeld naar handmatige sortering, zodat uw bestelling correct wordt verwerkt.",
"dragToRearrange": "Sleep om de volgorde te wijzigen",
"arrangeUnlocked": "Ontgrendel slepen om te herschikken",
"tabWebUi": "Web-UI",
"webUiEndpointLabel": "Eindpunt {{number}}",
"webUiIntegration": "Web-UI",
"webUiEndpointsSection": "Eindpunten",
"webUiRequirementsText": "Uw browser opent een rechtstreeks eindpunt, dus de poort moet vanaf hier bereikbaar zijn. Termix opent in plaats daarvan een SSH-tunnel via de SSH-verbinding van deze host, dus de poort hoeft alleen vanaf de host bereikbaar te zijn.",
"enableWebUi": "Web-eindpunten inschakelen",
"enableWebUiDesc": "Open de webinterfaces van deze host via de zijbalk.",
"webUiAddEndpoint": "Eindpunt toevoegen",
"webUiAddress": "Adres",
"webUiOpening": "Opening",
"webUiBindHostDesc": "Waar de backend de forward verbindt. Laat dit veld leeg voor 127.0.0.1, dat alleen bereikbaar is vanaf de machine waarop Termix draait.",
"webUiBindHostExposed": "Dit adres is bereikbaar vanaf elke locatie buiten de Termix-machine, dus iedereen die de poort kan bereiken, krijgt toegang tot deze webinterface zonder in te loggen.",
"webUiBindHostUnreachable": "Uw browser kan 127.0.0.1 niet bereiken op de machine waarop Termix draait, waardoor dit eindpunt niet wordt geladen. Gebruik een adres waarop de machine wel reageert, zoals 0.0.0.0.",
"webUiBindHostSharesSessionCookie": "Vanuit deze browser wordt de server doorgestuurd via dezelfde hostnaam als waar Termix wordt aangeboden, waardoor de getunnelde service uw Termix-sessie ontvangt. Cookies negeren de poort. Dit eindpunt zal hier niet openen; het werkt wel vanuit de Termix-desktopapp of wanneer Termix lokaal wordt geopend.",
"webUiLocalPort": "Lokale haven",
"webUiLocalPortAuto": "Automatisch",
"webUiLocalPortDesc": "Op welke poort luistert de forwarder? Laat dit veld leeg om het systeem zelf een poort te laten kiezen, of stel er een in als de poort van tevoren bekend moet zijn, bijvoorbeeld omdat een container deze publiceert.",
"webUiNewEndpointLabel": "Nieuw eindpunt",
"webUiErrorLabelRequired": "Eindpunt {{row}} heeft een label nodig.",
"webUiErrorLabelDuplicate": "Elk eindpunt heeft een andere naam nodig.",
"webUiErrorPortRange": "Eindpunt {{row}} vereist een poort tussen 1 en 65535.",
"webUiErrorPathInvalid": "Het eindpunt {{row}} heeft een ongeldig pad. Gebruik een pad zoals /admin.",
"webUiLabel": "Label",
"webUiScheme": "Schema",
"webUiPort": "Haven",
"webUiPath": "Pad",
"webUiAccess": "Toegang",
"webUiAccessDirect": "Direct",
"webUiAccessTunnel": "SSH-tunnel",
"webUiAccessTunnelUnavailable": "Voor een SSH-tunnel is het nodig dat SSH op deze host is ingeschakeld en dat de verbinding afkomstig is van dit apparaat.",
"webUiRender": "Openen in",
"webUiRenderExternal": "Geïsoleerd bureaubladvenster",
"webUiRenderEmbedded": "Termix-tabblad",
"webUiRenderEmbeddedDesc": "Het inbedden is een poging naar beste vermogen: sommige webinterfaces weigeren te laden in een frame, en een inlogproces dat afhankelijk is van cookies van dezelfde website kan in een oneindige lus terechtkomen. De externe browser werkt altijd.",
"webUiIgnoreCert": "Ongeldig certificaat toestaan",
"webUiIgnoreCertDesc": "Alleen directe eindpunten. Loopback is al uitgezonderd, dus dit heeft geen effect op tunnel-eindpunten.",
"webUiRemoveEndpoint": "Eindpunt verwijderen",
"webUiOpenFailed": "Het openen van het web-eindpunt is mislukt."
},
"commandPalette": {
"searchPlaceholder": "Zoek naar hosts, commando's of instellingen...",
"quickActions": "Snelle acties",
"navigation": "Navigatie",
"orShortcut": "of",
"hostManager": "Hostmanager",
"hostManagerDesc": "Beheer, voeg toe of bewerk hosts",
"addNewHost": "Nieuwe host toevoegen",
"addNewHostDesc": "Registreer een nieuwe host",
"adminSettings": "Beheerinstellingen",
"adminSettingsDesc": "Systeemvoorkeuren en gebruikers configureren",
"userProfile": "Gebruikersprofiel",
"userProfileDesc": "Beheer je account en voorkeuren",
"addCredential": "Voeg inloggegevens toe",
"addCredentialDesc": "Bewaar SSH-sleutels of -wachtwoorden",
"tmuxMonitor": "Tmux Monitor",
"tmuxMonitorDesc": "Monitor tmux-sessies op al je hosts.",
"snippets": "Fragmenten",
"runSnippetDesc": "Voer dit uit in het actieve terminaltabblad.",
"noSnippetsFound": "Geen fragmenten gevonden die overeenkomen met \"{{search}}\"",
"recentActivity": "Recente activiteit",
"serversAndHosts": "Servers en hostingproviders",
"noHostsFound": "Geen hosts gevonden die overeenkomen met \"{{search}}\"",
"links": "Links",
"navigate": "Navigeren",
"select": "Select",
"toggleWith": "Schakelen met",
"localTerminal": "Lokale terminal",
"localTerminalDesc": "Open een shell op deze computer."
},
"splitScreen": {
"paneEmpty": "Paneel {{index}} - leeg",
"noTabAssigned": "Geen tabblad toegewezen",
"focusedPane": "Actief venster"
},
"connections": {
"noConnections": "Geen verbindingen",
"noConnectionsDesc": "Open een terminal, bestandsbeheerder of extern bureaublad om de verbindingen hier te bekijken.",
"connectedFor": "Verbonden voor {{duration}}",
"connected": "Aangesloten",
"disconnected": "Verbinding verbroken",
"closeTab": "Tab sluiten",
"closeConnection": "Nauwe verbinding",
"forgetTab": "Vergeten",
"removeBackground": "Verwijderen",
"reconnect": "Opnieuw verbinding maken",
"reopenTab": "Heropenen",
"sectionOpen": "Open",
"sectionBackground": "Achtergrond",
"backgroundDesc": "Sessies blijven {{minutes}} minuten na de verbreking van de verbinding actief en kunnen opnieuw worden verbonden.",
"persisted": "Bleef op de achtergrond aanwezig",
"expiresIn": "Verloopt over {{duration}}",
"search": "Zoek naar verbanden...",
"noSearchResults": "Er zijn geen resultaten gevonden die overeenkomen met uw zoekopdracht.",
"rename": "Sessie hernoemen",
"sectionSharedWithMe": "Met mij gedeeld",
"sharedBy": "Gedeeld door {{username}}",
"join": "Meedoen",
"sharedSessionLabel": "{{hostName}} (gedeeld)"
},
"collab": {
"createRoom": "Nieuwe kamer",
"roomName": "Kamernaam",
"persistentRoom": "Permanente kamer",
"persistentRoomHint": "Kamers die permanent gereserveerd blijven, blijven na afloop van de vergadering beschikbaar en kunnen opnieuw worden gebruikt.",
"noRooms": "Er zijn nog geen vergaderruimtes. Maak er een aan om een vergadering te starten.",
"openRoom": "Open",
"endRoom": "Einde vergadering",
"leaveRoom": "Vertrekken",
"deleteMember": "Verwijderen",
"removeMember": "Verwijder {{name}}",
"removeMemberTitle": "Dit lid verwijderen?",
"removeMemberDescription": "{{name}} verliest onmiddellijk de toegang tot deze ruimte. Elke actieve SSH-viewer wordt losgekoppeld.",
"invite": "Uitnodiging",
"inviteTitle": "Nodig leden uit",
"members": "Leden",
"membersPanel": "Kamerleden en beheerverzoeken",
"membersWithCount": "Leden ({{count}})",
"online": "online",
"offline": "offline",
"you": "(Jij)",
"hostBadge": "Gastheer",
"presenterBadge": "Presentatie",
"present": "Cadeau",
"presentTitle": "Betreed het podium",
"presentHost": "Gastheer",
"searchHosts": "Zoek hosts",
"noHostsFound": "Geen beschikbare hosts gevonden.",
"presentProtocol": "Protocol",
"stopPresenting": "Stop met presenteren",
"takeOver": "Neem het over",
"takeOverConfirmTitle": "De huidige presentatie vervangen?",
"takeOverDescription": "{{name}} presenteert nu. Als je het overneemt, wordt iedereen van dat podium losgekoppeld.",
"emptyStage": "Niemand geeft een presentatie. Betreed het podium om een sessie te delen.",
"stageLoading": "Verbinding maken met het podium...",
"stageEnded": "De presentatie eindigde.",
"roomEnded": "Deze vergadering is afgelopen.",
"presenterLabel": "{{name}} presenteert",
"guestLink": "Gastlink",
"guestLinkOn": "De gastlink is ingeschakeld. Iedereen met de link kan het optreden bekijken.",
"guestLinkOff": "De gastlink is uitgeschakeld.",
"copyLink": "Kopieer link",
"rotateLink": "Draai de link",
"disableLink": "Link uitschakelen",
"rotateLinkConfirmTitle": "De gastlink roteren?",
"rotateLinkDescription": "De huidige verbinding wordt onmiddellijk verbroken. Verbonden SSH-gasten worden losgekoppeld.",
"disableLinkConfirmTitle": "De gastlink uitschakelen?",
"disableLinkDescription": "Anonieme SSH-gebruikers worden onmiddellijk losgekoppeld en de huidige verbinding zal niet meer werken.",
"linkCopied": "Link gekopieerd",
"roles": "Rollen",
"users": "Gebruikers",
"searchUsers": "Zoek gebruikers",
"endConfirmTitle": "Deze vergadering beëindigen?",
"endDescription": "{{name}} zal voor iedereen eindigen en kan niet opnieuw worden geopend.",
"endPersistentDescription": "De actieve presentatie in {{name}} wordt gestopt. De ruimte blijft beschikbaar voor hergebruik.",
"deleteRoom": "Verwijder kamer",
"deleteConfirmTitle": "Deze kamer verwijderen?",
"deleteDescription": "{{name}} wordt permanent verwijderd voor iedereen en kan niet ongedaan worden gemaakt.",
"invitedTo": "Je werd uitgenodigd voor \"{{name}}\"",
"guest": {
"title": "Ontmoeting",
"waiting": "Wachten op de presentator...",
"linkInvalid": "Deze gastlink is ongeldig of de vergadering is afgelopen."
},
"reopenFromPanel": "Dit vergadertabblad is verlopen. Heropen de ruimte via het paneel Vergaderingen.",
"requestControl": "Verzoekbeheer",
"cancelControlRequest": "Verzoek annuleren",
"controlQueue": "Controleverzoeken",
"noControlRequests": "Geen openstaande aanvragen.",
"grantControlTo": "Geef de controle aan {{name}}",
"dismissControlRequest": "Negeer het controleverzoek van {{name}}",
"releaseControl": "Ontgrendeling",
"grantControl": "Geef de controle",
"revokeControl": "Neem de controle terug",
"controlRequestedBy": "{{name}} vroeg om controle",
"grant": "Studiebeurs",
"controlBadge": "Onder controle",
"youArePresenting": "Je presenteert momenteel in een ander tabblad. Stop met presenteren en geef het woord aan iemand anders.",
"created": "Kamer gecreëerd",
"invited": "Leden uitgenodigd",
"roomTab": "Ontmoeting"
},
"sessionSharing": {
"guestView": {
"loading": "Verbinding maken met de gedeelde sessie...",
"linkInvalid": "Deze deelbare link is ongeldig, verlopen of ingetrokken.",
"rateLimited": "Te veel pogingen, probeer het over een tijdje opnieuw.",
"sessionEnded": "Deze sessie is afgelopen.",
"readOnlyBadge": "Alleen bekijken",
"ownerLabel": "Gastheer/gastvrouw"
},
"modalTitle": "Deel sessie",
"shareButton": "Deel",
"notReadyToShare": "De sessie is nog niet klaar om te delen.",
"modeTab": {
"link": "Link",
"user": "Gebruiker"
},
"linkModeDescription": "Iedereen met deze link kan deelnemen, een account is niet nodig.",
"userModeDescription": "Deel de host met een specifieke gebruiker die er al toegang toe heeft. Als die gebruiker nog geen toegang heeft, deel de host dan eerst met hem of haar, of gebruik een link. Zodra de sessie is gedeeld, verschijnt deze in het tabblad 'Verbindingen' van de gebruiker.",
"permissionLevel": {
"label": "Toegangsniveau",
"readOnly": "Alleen-lezen",
"readOnlyDescription": "Je kunt de sessie live volgen, maar je kunt niet typen of interageren.",
"readWrite": "Lezen en schrijven",
"readWriteDescription": "Kan typen en interactie hebben met de sessie, net als de eigenaar."
},
"expiryLabel": "Link verloopt",
"createLinkButton": "Link maken",
"createShareButton": "Delen met gebruiker",
"searchUsersPlaceholder": "Gebruikers doorzoeken...",
"noUsersFound": "Geen gebruikers gevonden",
"linkCreated": "Deellink aangemaakt",
"linkCopied": "Link gekopieerd naar het klembord.",
"copyLink": "Kopieer link",
"shareCreated": "De sessie is gedeeld. Deze verschijnt in hun tabblad 'Verbindingen'.",
"shareFailed": "Aanmaken van de share is mislukt",
"userLacksHostAccess": "Die gebruiker heeft nog geen toegang tot deze host. Deel de host eerst met hem of haar, of gebruik een link.",
"activeShares": "Actieve aandelen",
"noActiveShares": "Geen actieve aandelen voor deze sessie.",
"revoke": "Herroepen",
"revokeConfirmTitle": "Wilt u dit aandeel intrekken?",
"revokeConfirmDescription": "Iedereen die deze gedeelde map gebruikt, verliest onmiddellijk de toegang.",
"revoked": "Aandeel ingetrokken",
"revokeFailed": "Het intrekken van het aandeel is mislukt.",
"joinCount": "{{count}} join",
"joinCount_other": "{{count}} sluit zich aan",
"expiresAt": "Verloopt {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Gebruiker: {{username}}",
"loadSharesFailed": "Het laden van actieve aandelen is mislukt."
},
"guacamole": {
"connecting": "Verbinding maken met de {{type}} sessie...",
"checkingGuacd": "De externe bureaubladservice controleren...",
"requestingToken": "Verzoek om {{type}} verbindingstoken...",
"openingSession": "Sessie {{type}} openen...",
"negotiating": "Onderhandelen over een {{type}} handdruk...",
"sessionReady": "{{type}} sessie gereed",
"connectionError": "Verbindingsfout",
"connectionFailed": "Verbinding mislukt",
"failedToConnect": "Verbindingstoken kon niet worden verkregen.",
"hostNotFound": "Host niet gevonden",
"noHostSelected": "Geen host geselecteerd",
"reconnect": "Opnieuw verbinding maken",
"retry": "Opnieuw proberen",
"guacdUnavailable": "De service voor extern bureaublad (guacd) is niet beschikbaar. Zorg ervoor dat guacd actief en toegankelijk is en correct is geconfigureerd in de beheerdersinstellingen.",
"credentialPromptTitle": "Voer de RDP-inloggegevens in.",
"credentialPromptDescription": "Deze host is zo ingesteld dat er bij het verbinden om inloggegevens wordt gevraagd. Deze worden alleen voor deze sessie gebruikt en niet opgeslagen.",
"connect": "Verbinden",
"ctrlAltDel": "Ctrl+Alt+Del",
"files": {
"title": "Drive-bestanden",
"parent": "Hoofdmap",
"refresh": "Vernieuwen",
"empty": "Deze map is leeg.",
"listFailed": "Het lezen van deze map is mislukt.",
"download": "Download",
"downloadFailed": "Downloaden mislukt {{name}}",
"upload": "Bestanden uploaden",
"uploading": "Bezig met uploaden {{name}}...",
"uploaded": "Geüpload {{name}}",
"uploadFailed": "Uploaden mislukt {{name}}",
"uploadDisabled": "Uploaden is uitgeschakeld voor deze verbinding.",
"driveUnavailable": "Schakel RDP-schijfomleiding in voordat u bestanden uploadt.",
"driveNotWritable": "guacd kan niet naar de schijfmap schrijven. Controleer GUACD_DRIVE_PATH (of het schijfpad van de host) en de bijbehorende machtigingen.",
"dropToUpload": "Sleep de bestanden hierheen om ze te uploaden."
},
"toolbar": {
"ctrlAltDel": "Ctrl+Alt+Del",
"winL": "Win+L (Vergrendelscherm)",
"winKey": "Windows-toets",
"superL": "Super+L (Vergrendelscherm)",
"superKey": "Supersleutel",
"super": "Super",
"cmdL": "Cmd+L (Scherm vergrendelen)",
"cmdKey": "Commando-toets",
"cmd": "Commando",
"ctrl": "Ctrl",
"alt": "Alt",
"shift": "Verschuiving",
"win": "Winnen",
"stickyActive": "{{key}} (vergrendeld - klik om te ontgrendelen)",
"stickyInactive": "{{key}} (klik om te vergrendelen)",
"esc": "Ontsnappen",
"tab": "Tab",
"home": "Thuis",
"end": "Einde",
"pageUp": "Pagina omhoog",
"pageDown": "Pagina omlaag",
"arrowUp": "Pijl omhoog",
"arrowDown": "Pijl omlaag",
"arrowLeft": "Pijl naar links",
"arrowRight": "Pijl naar rechts",
"fnToggle": "Functietoetsen",
"reconnect": "Herverbindingssessie",
"collapse": "Werkbalk inklappen",
"expand": "Werkbalk uitklappen",
"dragHandle": "Sleep om te verplaatsen",
"hide": "Voor deze sessie verbergen. Om het permanent uit te schakelen, opent u Hostinstellingen → Algemeen → Verbindingswerkbalk.",
"zoomIn": "Zoom in",
"zoomOut": "Uitzoomen",
"resetZoom": "Zoom opnieuw instellen",
"fitToScreen": "Aan het scherm aanpassen",
"switchToTrackpad": "Schakel over naar de trackpadmodus (sleep om de cursor te verplaatsen, tik om te klikken).",
"switchToTouch": "Schakel over naar de aanraakmodus (tik direct op de plek waar u wilt klikken)."
}
},
"terminal": {
"sessionExpiredNotice": "Je vorige sessie op {{host}} is na {{minutes}} minuten verlopen; de shell en alles wat erin draaide, is verdwenen. Schakel Auto-Tmux op deze host in om sessies actief te houden.",
"sessionExpiredNoticeNoMinutes": "Je vorige sessie op {{host}} is verlopen terwijl de verbinding verbroken was; de shell en alles wat daarin draaide, is verdwenen. Schakel Auto-Tmux in op deze host om sessies actief te houden.",
"enableAutoTmuxAction": "Auto-Tmux inschakelen",
"autoTmuxEnabled": "Auto-Tmux ingeschakeld voor {{host}}. Dit geldt vanaf de volgende verbinding.",
"autoTmuxEnableFailed": "Auto-Tmux inschakelen is mislukt.",
"connect": "Verbinden met de host",
"clear": "Duidelijk",
"paste": "Plakken",
"reconnect": "Opnieuw verbinding maken",
"connectionLost": "Verbinding verbroken",
"connected": "Aangesloten",
"clipboardWriteFailed": "Kopiëren naar klembord mislukt. Zorg ervoor dat de pagina via HTTPS of localhost wordt aangeboden.",
"clipboardReadFailed": "Het lezen van het klembord is mislukt. Zorg ervoor dat de juiste klembordrechten zijn verleend.",
"clipboardHttpWarning": "Kon het klembord niet lezen. Sommige browsers beperken de toegang tot het klembord buiten HTTPS - probeer in plaats daarvan Ctrl+V, of serveer Termix via HTTPS.",
"passwordPromptFillTitle": "Voer het opgeslagen wachtwoord in op dit veld.",
"unknownError": "Er is een onbekende fout opgetreden.",
"websocketError": "WebSocket-verbindingsfout",
"connecting": "Verbinden...",
"noHostSelected": "Geen host geselecteerd",
"reconnecting": "Opnieuw verbinding maken... ({{attempt}}/{{max}})",
"reconnected": "De verbinding is succesvol hersteld.",
"tmuxSessionCreated": "tmux-sessie aangemaakt: {{name}}",
"tmuxSessionAttached": "tmux-sessie gekoppeld: {{name}}",
"tmuxUnavailable": "Tmux is niet geïnstalleerd op de externe host, er wordt teruggevallen op de standaard shell.",
"tmuxSessionPickerTitle": "tmux-sessies",
"tmuxSessionPickerDesc": "Bestaande tmux-sessies gevonden op deze host. Selecteer er een om opnieuw verbinding te maken of een nieuwe sessie te creëren.",
"tmuxWindows": "Windows",
"tmuxWindowCount": "{{count}} venster",
"tmuxAttached": "Aangesloten klanten",
"tmuxAttachedCount": "{{count}} bevestigd",
"tmuxLastActivity": "Laatste activiteit",
"tmuxTimeJustNow": "zojuist",
"tmuxTimeMinutes": "{{count}}m geleden",
"tmuxTimeHours": "{{count}}uur geleden",
"tmuxTimeDays": "{{count}}dagen geleden",
"tmuxCreateNew": "Start een nieuwe sessie",
"tmuxCopyHint": "Pas je selectie aan en druk op Enter om naar het klembord te kopiëren.",
"tmuxDetach": "Ontkoppel van de tmux-sessie",
"tmuxDetached": "Losgekoppeld van de tmux-sessie",
"searchPlaceholder": "Vinden",
"searchCaseSensitive": "Lucifersdoosje",
"searchWholeWord": "Combineer het hele woord",
"searchRegex": "Gebruik een reguliere expressie.",
"searchNoResults": "Geen resultaten",
"searchResultCount": "{{index}} van {{count}}",
"searchNext": "Volgende wedstrijd (Invoeren)",
"searchPrevious": "Vorige wedstrijd (Shift+Enter)",
"searchClose": "Sluiten (Escape)",
"maxReconnectAttemptsReached": "Maximaal aantal herverbindingspogingen bereikt",
"closeTab": "Dichtbij",
"connectionTimeout": "Verbindingstime-out",
"terminalTitle": "Terminal - {{host}}",
"terminalWithPath": "Terminal - {{host}}:{{path}}",
"runTitle": "Bezig met uitvoeren van {{command}} - {{host}}",
"totpRequired": "Tweefactorauthenticatie vereist",
"totpCodeLabel": "Verificatiecode",
"totpVerify": "Verifiëren",
"mfaPromptRequired": "Authenticatie vereist",
"mfaPushRequired": "Push-authenticatie vereist",
"mfaMenuPlaceholder": "Voer uw antwoord in",
"mfaWaitingApproval": "Wachten op goedkeuring op uw apparaat...",
"mfaSendRequest": "Verzoek verzenden",
"warpgateAuthRequired": "Authenticatie via Warpgate vereist",
"warpgateSecurityKey": "Beveiligingssleutel",
"warpgateAuthUrl": "Authenticatie-URL",
"warpgateOpenBrowser": "Openen in browser",
"warpgateContinue": "Ik heb de authenticatie voltooid.",
"certAuthRequired": "{{provider}} Aanmelden vereist",
"opksshAuthRequired": "OPKSSH-authenticatie vereist",
"opksshAuthDescription": "Voltooi de authenticatie in uw browser om verder te gaan. Deze sessie blijft 24 uur geldig.",
"opksshOpenBrowser": "Open de browser om te authenticeren.",
"opksshWaitingForAuth": "Wachten op authenticatie in de browser...",
"opksshAuthenticating": "Authenticatie wordt verwerkt...",
"opksshTimeout": "De authenticatie is mislukt vanwege een time-out. Probeer het opnieuw.",
"opksshAuthFailed": "Authenticatie mislukt. Controleer uw inloggegevens en probeer het opnieuw.",
"opksshSignInWith": "Aanmelden met {{provider}}",
"tailscaleCheckRequired": "Tailscale-authenticatie vereist",
"tailscaleCheckDescription": "Tailscale SSH vereist een extra controle. Authenticeer in uw browser om verder te gaan.",
"tailscaleCheckOpenBrowser": "Open de browser om te authenticeren.",
"tailscaleCheckWaiting": "Wachten op Tailscale-authenticatie...",
"tailscaleCheckTimeout": "De authenticatie bij Tailscale is mislukt vanwege een time-out. Probeer het opnieuw.",
"vaultAuthTitle": "Aanmelden bij Vault is vereist.",
"vaultAuthDescription": "Er is een venster geopend om in te loggen bij HashiCorp Vault. Voltooi de aanmelding daar; deze verbinding wordt automatisch tot stand gebracht.",
"vaultAuthFailed": "Authenticatie voor de kluis is mislukt. Probeer het opnieuw.",
"vaultReopen": "Heropen het aanmeldvenster",
"sudoPasswordPopupTitle": "Wachtwoord invoeren?",
"linkDialogTitle": "Open link",
"linkDialogOpen": "Open",
"linkDialogCopy": "Kopiëren",
"websocketAbnormalClose": "De verbinding is onverwacht verbroken. Dit kan te wijten zijn aan een probleem met de reverse proxy of de SSL-configuratie. Controleer de serverlogboeken.",
"connectionLogTitle": "Verbindingslogboek",
"connectionLogCopy": "Kopieer logbestanden naar het klembord.",
"connectionLogEmpty": "Nog geen verbindingslogboeken",
"connectionLogWaiting": "Wachten op verbindingslogboeken...",
"connectionLogCopied": "Verbindingslogboeken naar het klembord gekopieerd.",
"connectionLogCopyFailed": "Het kopiëren van logbestanden naar het klembord is mislukt.",
"connectionRejected": "Verbinding geweigerd door de server. Controleer uw authenticatie- en netwerkconfiguratie.",
"hostKeyRejected": "SSH-hostsleutelverificatie geweigerd. Verbinding verbroken.",
"sessionTakenOver": "De sessie is in een ander tabblad geopend. Opnieuw verbinding maken...",
"split": {
"splitTab": "Gesplitst tabblad",
"addToSplit": "Toevoegen aan splitsen",
"removeFromSplit": "Verwijderen uit Split"
}
},
"fileManager": {
"noHostSelected": "Geen host geselecteerd",
"initializingEditor": "Editor wordt geïnitialiseerd...",
"file": "Bestand",
"folder": "Map",
"uploadFile": "Bestand uploaden",
"downloadFile": "Download",
"extractArchive": "Archief uitpakken",
"extractingArchive": "Extractie van {{name}}...",
"archiveExtractedSuccessfully": "{{name}} succesvol geëxtraheerd",
"extractFailed": "Extractie mislukt",
"compressFile": "Bestand comprimeren",
"compressFiles": "Bestanden comprimeren",
"compressFilesDesc": "Comprimeer {{count}} items tot een archief",
"archiveName": "Archiefnaam",
"enterArchiveName": "Voer de archiefnaam in...",
"compressionFormat": "Compressieformaat",
"selectedFiles": "Geselecteerde bestanden",
"andMoreFiles": "en {{count}} meer...",
"compress": "Comprimeren",
"compressingFiles": "Het comprimeren van {{count}} items naar {{name}}...",
"filesCompressedSuccessfully": "{{name}} succesvol aangemaakt",
"compressFailed": "Compressie mislukt",
"edit": "Bewerking",
"preview": "Voorbeeld",
"previous": "Vorig",
"next": "Volgende",
"pageXOfY": "Pagina {{current}} van {{total}}",
"zoomOut": "Uitzoomen",
"zoomIn": "Inzoomen",
"newFile": "Nieuw bestand",
"newFolder": "Nieuwe map",
"rename": "Naam wijzigen",
"uploading": "Bezig met uploaden...",
"uploadingFile": "Bezig met uploaden {{name}}...",
"fileName": "Bestandsnaam",
"folderName": "Mapnaam",
"fileUploadedSuccessfully": "Bestand \"{{name}}\" succesvol geüpload",
"failedToUploadFile": "Het uploaden van het bestand is mislukt.",
"uploadingFolderFiles": "Bestand(en) {{count}} uploaden...",
"uploadedFolderFiles": "Bestand(en) {{count}} succesvol geüpload",
"uploadedFolderPartial": "Geüploade {{uploaded}} bestand(en), {{failed}} mislukt",
"fileDownloadedSuccessfully": "Bestand \"{{name}}\" succesvol gedownload",
"failedToDownloadFile": "Het downloaden van het bestand is mislukt.",
"fileCreatedSuccessfully": "Bestand \"{{name}}\" is succesvol aangemaakt.",
"folderCreatedSuccessfully": "Map \"{{name}}\" is succesvol aangemaakt",
"failedToCreateItem": "Het aanmaken van het item is mislukt.",
"operationFailed": "{{operation}} bewerking mislukt voor {{name}}: {{error}}",
"failedToResolveSymlink": "Het is niet gelukt om de symbolische link op te lossen.",
"itemsDeletedSuccessfully": "{{count}} items succesvol verwijderd",
"failedToDeleteItems": "Het verwijderen van items is mislukt.",
"sudoPasswordRequired": "Beheerderswachtwoord vereist",
"enterSudoPassword": "Voer het sudo-wachtwoord in om deze bewerking voort te zetten.",
"sudoPassword": "Sudo-wachtwoord",
"sudoOperationFailed": "De sudo-bewerking is mislukt.",
"sudoAuthFailed": "Sudo-authenticatie mislukt",
"dragFilesToUpload": "Sleep bestanden hierheen om ze te uploaden",
"dropToUploadHere": "Sleep hierheen om te uploaden",
"dropToDownloadHere": "Sleep hierheen om te downloaden",
"localFiles": "Lokaal",
"showLocalFiles": "Lokale bestanden weergeven (gesplitste weergave)",
"hideLocalFiles": "Lokale bestanden verbergen",
"localHome": "Startpagina-map",
"localPathPlaceholder": "Lokaal mappad",
"localShowHidden": "Verborgen bestanden weergeven",
"localHideHidden": "Verborgen bestanden verbergen",
"localRevealInFileManager": "Weergeven in de systeembestandsbeheerder",
"localCannotOpenFolder": "Kan de map niet openen",
"localItemCount": "{{count}} items",
"localSelectedCount": "{{count}} geselecteerd",
"back": "Rug",
"forward": "Vooruit",
"up": "Omhoog",
"kind": "Vriendelijk",
"localUploadingProgress": "Uploaden van {{current}} van {{total}}",
"localDownloadingProgress": "{{current}} van {{total}} downloaden",
"localTransferInFlight": "{{count}} tegelijk",
"localPreparingDownload": "Download wordt voorbereid...",
"localTransferCancelled": "Overdracht geannuleerd",
"localNothingToTransfer": "Niets over te dragen",
"localUploadComplete": "Geüploade {{count}} bestand(en)",
"localUploadFailed": "Uploaden mislukt",
"localUploadPartial": "Geüploade {{done}} bestand(en), {{failed}} mislukt",
"localDownloadComplete": "Gedownloade {{count}} bestand(en)",
"localDownloadFailed": "Download mislukt",
"localDownloadPartial": "Gedownloade {{done}} bestand(en), {{failed}} mislukt",
"localReplaceExistingPrompt": "{{count}} item(s) bestaan al in deze map. Wilt u ze vervangen?",
"localReplace": "Vervangen",
"localSkipExisting": "Overslaan",
"localSkippedExisting": "Bestaande item(s) overgeslagen {{count}}",
"localUnsafeNamesSkipped": "Er zijn {{count}} items overgeslagen waarvan de namen niet op deze computer gebruikt kunnen worden.",
"localOpen": "Open",
"localOpenFolder": "Map openen",
"localUploadToRemote": "Uploaden naar server",
"localUploadToRemoteMany": "Upload {{count}} items naar de server",
"localMoveToTrash": "Verplaats het naar de prullenbak",
"localMoveToTrashMany": "Verplaats {{count}} items naar de prullenbak",
"localTrashConfirmSingle": "\"{{name}}\" naar de prullenbak verplaatsen?",
"localTrashConfirmFolder": "Verplaats de map \"{{name}}\" en alle inhoud ervan naar de prullenbak?",
"localTrashConfirmMany": "Verplaats {{count}} items naar de prullenbak?",
"localTrashed": "Verplaatst {{count}} item(s) naar de prullenbak",
"localTrashFailed": "Kon niet naar de prullenbak verplaatst worden.",
"localRenameFailed": "Hernoemen mislukt",
"localCreateFailed": "Kon item niet aanmaken",
"goToParentFolder": "Ga naar de bovenliggende map",
"resizeSidebar": "Sleep om de zijbalk te vergroten of verkleinen (dubbelklik om terug te zetten).",
"resizeLocalPane": "Sleep om het lokale venster te vergroten of verkleinen (dubbelklikken om terug te zetten).",
"columns": "Kolommen",
"columnsHint": "Klik met de rechtermuisknop om kolommen te kiezen.",
"emptyFolder": "Deze map is leeg.",
"searchFiles": "Bestanden doorzoeken...",
"upload": "Uploaden",
"selectHostToStart": "Selecteer een host om het bestandsbeheer te starten.",
"sshRequiredForFileManager": "Bestandsbeheer vereist SSH. Op deze host is SSH niet ingeschakeld.",
"failedToConnect": "Verbinding met SSH mislukt",
"failedToLoadDirectory": "Map laden mislukt",
"noSSHConnection": "Geen SSH-verbinding beschikbaar",
"copy": "Kopiëren",
"cut": "Snee",
"paste": "Plakken",
"copyPath": "Kopieer pad",
"copyPaths": "Kopieerpaden",
"delete": "Verwijderen",
"properties": "Eigenschappen",
"refresh": "Vernieuwen",
"downloadFiles": "Download {{count}} bestanden naar de browser",
"copyFiles": "Kopieer {{count}} items",
"cutFiles": "Knip {{count}} items",
"deleteFiles": "Verwijder {{count}} items",
"filesCopiedToClipboard": "{{count}} items gekopieerd naar het klembord",
"filesCutToClipboard": "{{count}} items naar het klembord geknipt",
"pathCopiedToClipboard": "Pad gekopieerd naar klembord",
"pathsCopiedToClipboard": "{{count}} paden gekopieerd naar het klembord",
"failedToCopyPath": "Het kopiëren van het pad naar het klembord is mislukt.",
"copyFolderLink": "Kopieer de link naar de map",
"copyCurrentFolderLink": "Kopieer de link naar de huidige map",
"folderLinkCopied": "Maplink gekopieerd naar het klembord.",
"failedToCopyFolderLink": "Het kopiëren van de maplink is mislukt.",
"movedItems": "Verplaatste {{count}} items",
"failedToDeleteItem": "Het verwijderen van het item is mislukt.",
"itemRenamedSuccessfully": "{{type}} succesvol hernoemd",
"failedToRenameItem": "Het hernoemen van het item is mislukt.",
"download": "Download",
"openExternalEditor": "Extern openen",
"chooseExternalEditor": "Externe editor kiezen",
"externalEditorSelected": "Externe redacteur geselecteerd",
"externalEditorDesktopOnly": "De externe editor is alleen beschikbaar in de desktop-app.",
"externalEditorOpened": "Geopend in een externe editor. Door daar op te slaan, worden de wijzigingen naar de server geüpload.",
"failedToOpenExternalEditor": "Het openen van de externe editor is mislukt.",
"failedToSelectExternalEditor": "Externe editor selecteren mislukt",
"permissions": "Toestemmingen",
"size": "Maat",
"modified": "Gewijzigd",
"path": "Pad",
"confirmDelete": "Weet je zeker dat je {{name}} wilt verwijderen?",
"permissionDenied": "Toegang geweigerd",
"serverError": "Serverfout",
"fileSavedSuccessfully": "Bestand succesvol opgeslagen",
"failedToSaveFile": "Het opslaan van het bestand is mislukt.",
"confirmDeleteSingleItem": "Weet je zeker dat je \"{{name}} \" permanent wilt verwijderen?",
"confirmDeleteMultipleItems": "Weet je zeker dat je {{count}} items permanent wilt verwijderen?",
"confirmDeleteMultipleItemsWithFolders": "Weet je zeker dat je {{count}} items permanent wilt verwijderen? Dit omvat mappen en hun inhoud.",
"confirmDeleteFolder": "Weet je zeker dat je de map \"{{name}}\" en alle inhoud ervan permanent wilt verwijderen?",
"permanentDeleteWarning": "Deze actie kan niet ongedaan worden gemaakt. Het/de item(s) wordt/worden permanent van de server verwijderd.",
"moveToTrashWarning": "Het/de item(s) wordt/worden verplaatst naar de Termix-prullenbak en kan/kunnen worden hersteld voordat de bewaartermijn is verlopen.",
"itemsMovedToTrash": "{{count}} item(s) verplaatst naar de prullenbak",
"trash": "Afval",
"trashDescription": "Verwijderde items worden {{days}} dag(en) op deze host bewaard.",
"trashLoadFailed": "Het laden van de prullenbak is mislukt.",
"trashEmpty": "De prullenbak is leeg.",
"trashRestore": "Herstellen",
"trashRestored": "Hersteld {{name}}",
"trashRestoreFailed": "Het herstellen van het item is mislukt. Het oorspronkelijke pad bestaat mogelijk al.",
"trashDeletePermanently": "Permanent verwijderen",
"trashDeleteConfirm": "Permanent verwijderen {{name}}? Dit kan niet ongedaan gemaakt worden.",
"trashPermanentlyDeleted": "Permanent verwijderd {{name}}",
"trashDeleteFailed": "Het is niet gelukt om het item permanent te verwijderen.",
"trashEmptyAction": "Leeg de prullenbak",
"trashEmptyConfirm": "Alle items in de prullenbak permanent verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"trashEmptied": "Vuilnisbak geleegd",
"trashRetention": "Automatische opruiming na (dagen)",
"trashRetentionSaved": "Afvalretentie bijgewerkt",
"trashRetentionFailed": "Het bijwerken van de prullenbakretentie is mislukt.",
"trashUnavailableConfirm": "Dit item kan niet naar de prullenbak worden verplaatst, meestal omdat het zich op een ander bestandssysteem bevindt of verhoogde machtigingen vereist. Wilt u het in plaats daarvan permanent verwijderen?",
"recent": "Recent",
"pinned": "Vastgepind",
"folderShortcuts": "Mapsnelkoppelingen",
"failedToReconnectSSH": "Het opnieuw tot stand brengen van de SSH-sessie is mislukt.",
"openTerminalHere": "Terminal hier openen",
"run": "Loop",
"openTerminalInFolder": "Open Terminal in deze map",
"openTerminalInFileLocation": "Open Terminal op de bestandslocatie.",
"runningFile": "Hardlopen - {{file}}",
"onlyRunExecutableFiles": "Kan alleen uitvoerbare bestanden uitvoeren",
"directories": "Gidsen",
"removedFromRecentFiles": "\"{{name}}\" is verwijderd uit recente bestanden",
"removeFailed": "Verwijderen mislukt",
"unpinnedSuccessfully": "\"{{name}}\" succesvol losgemaakt",
"unpinFailed": "Ontgrendelen mislukt",
"removedShortcut": "Sneltoets \"{{name}}\" verwijderd",
"removeShortcutFailed": "Snelkoppeling verwijderen mislukt",
"clearedAllRecentFiles": "Alle recente bestanden verwijderd.",
"clearFailed": "Wissen mislukt",
"removeFromRecentFiles": "Verwijderen uit recente bestanden",
"clearAllRecentFiles": "Wis alle recente bestanden",
"unpinFile": "Maak het bestand los",
"removeShortcut": "Snelkoppeling verwijderen",
"pinFile": "Speldbestand",
"addToShortcuts": "Toevoegen aan snelkoppelingen",
"pasteFailed": "Plakken mislukt",
"noUndoableActions": "Geen onomkeerbare acties",
"undoCopySuccess": "Kopieerbewerking ongedaan gemaakt: {{count}} gekopieerde bestanden verwijderd",
"undoCopyFailedDelete": "Ongedaan maken mislukt: Er konden geen gekopieerde bestanden worden verwijderd.",
"undoCopyFailedNoInfo": "Ongedaan maken mislukt: Gekopieerde bestandsinformatie niet gevonden.",
"undoMoveSuccess": "Verplaatsingsbewerking ongedaan gemaakt: {{count}} bestanden teruggeplaatst naar de oorspronkelijke locatie",
"undoMoveFailedMove": "Ongedaan maken mislukt: Er konden geen bestanden teruggezet worden.",
"undoMoveFailedNoInfo": "Ongedaan maken mislukt: Verplaatste bestandsinformatie niet gevonden.",
"undoDeleteNotSupported": "De verwijderingsbewerking kan niet ongedaan worden gemaakt: de bestanden zijn permanent van de server verwijderd.",
"undoTypeNotSupported": "Niet-ondersteund type ongedaan maken-bewerking",
"undoOperationFailed": "De bewerking 'Ongedaan maken' is mislukt.",
"unknownError": "Onbekende fout",
"confirm": "Bevestigen",
"find": "Vinden...",
"replace": "Vervangen",
"downloadInstead": "Download in plaats daarvan",
"keyboardShortcuts": "Toetsenbord sneltoetsen",
"searchAndReplace": "Zoeken en vervangen",
"editing": "Bewerken",
"search": "Zoekopdracht",
"findNext": "Volgende zoeken",
"findPrevious": "Vorige zoeken",
"save": "Redden",
"selectAll": "Alles selecteren",
"undo": "Ongedaan maken",
"redo": "Opnieuw doen",
"moveLineUp": "Verplaats je in de rij",
"moveLineDown": "Lijn omlaag verplaatsen",
"toggleComment": "Reactie weergeven/verbergen",
"autoComplete": "Automatisch aanvullen",
"imageLoadError": "Afbeelding laden mislukt",
"startTyping": "Begin met typen...",
"unknownSize": "Onbekende grootte",
"fileIsEmpty": "Het bestand is leeg.",
"largeFileWarning": "Waarschuwing voor grote bestanden",
"largeFileWarningDesc": "Dit bestand is {{size}} groot, wat prestatieproblemen kan veroorzaken wanneer het als tekstbestand wordt geopend.",
"fileNotFoundAndRemoved": "Bestand \"{{name}}\" is niet gevonden en is verwijderd uit recente/vastgepinde bestanden.",
"failedToLoadFile": "Bestand laden mislukt: {{error}}",
"serverErrorOccurred": "Er is een serverfout opgetreden. Probeer het later opnieuw.",
"autoSaveFailed": "Automatisch opslaan is mislukt",
"fileAutoSaved": "Bestand automatisch opgeslagen",
"moveFileFailed": "Verplaatsen mislukt {{name}}",
"moveOperationFailed": "Verplaatsingsbewerking mislukt",
"canOnlyCompareFiles": "Er kunnen slechts twee bestanden vergeleken worden.",
"comparingFiles": "Bestanden vergelijken: {{file1}} en {{file2}}",
"dragFailed": "Sleepbewerking mislukt",
"filePinnedSuccessfully": "Bestand \"{{name}}\" succesvol vastgezet",
"pinFileFailed": "Het vastzetten van het bestand is mislukt.",
"fileUnpinnedSuccessfully": "Bestand \"{{name}}\" is succesvol losgemaakt.",
"unpinFileFailed": "Het losmaken van het bestand is mislukt.",
"shortcutAddedSuccessfully": "Mapsnelkoppeling \"{{name}}\" succesvol toegevoegd",
"addShortcutFailed": "Snelkoppeling toevoegen mislukt",
"operationCompletedSuccessfully": "{{operation}} {{count}} items succesvol",
"operationCompleted": "{{operation}} {{count}} items",
"downloadFileSuccess": "Bestand {{name}} succesvol gedownload",
"downloadFileFailed": "Download mislukt",
"downloadingFile": "Downloaden {{name}}…",
"downloadProgressBytes": "{{transferred}} / {{total}}",
"moveTo": "Ga naar {{name}}",
"diffCompareWith": "Vergelijk het verschil met {{name}}",
"dragOutsideToDownload": "Sleep buiten het venster om bestanden te downloaden ({{count}})",
"newFolderDefault": "Nieuwe map",
"newFileDefault": "NieuwBestand.txt",
"successfullyMovedItems": "Succesvol {{count}} items verplaatst naar {{target}}",
"move": "Beweging",
"searchInFile": "Zoeken in bestand (Ctrl+F)",
"showKeyboardShortcuts": "Toon sneltoetsen",
"decreaseFontSize": "Verklein de lettergrootte",
"increaseFontSize": "Lettergrootte vergroten",
"startWritingMarkdown": "Begin met het schrijven van je markdown-content...",
"loadingFileComparison": "Bestandsvergelijking laden...",
"reload": "Herladen",
"compare": "Vergelijken",
"sideBySide": "Naast elkaar",
"inline": "Inline",
"fileComparison": "Bestandsvergelijking: {{file1}} versus {{file2}}",
"fileTooLarge": "Bestand te groot: {{error}}",
"sshConnectionFailed": "SSH-verbinding mislukt. Controleer uw verbinding met {{name}} ({{ip}}:{{port}})",
"loadFileFailed": "Bestand laden mislukt: {{error}}",
"connecting": "Verbinden...",
"connectedSuccessfully": "Verbinding succesvol tot stand gebracht.",
"totpVerificationFailed": "TOTP-verificatie mislukt",
"warpgateVerificationFailed": "Warpgate-authenticatie mislukt",
"authenticationFailed": "Authenticatie mislukt",
"incorrectPassphrase": "Onjuiste wachtzin. Probeer het opnieuw.",
"verificationCodePrompt": "Verificatiecode:",
"changePermissions": "Machtigingen wijzigen",
"currentPermissions": "Huidige vergunningen",
"owner": "Eigenaar",
"group": "Groep",
"others": "Anderen",
"read": "Lezen",
"write": "Schrijven",
"execute": "Uitvoeren",
"permissionsChangedSuccessfully": "Machtigingen succesvol gewijzigd",
"failedToChangePermissions": "Het wijzigen van de machtigingen is mislukt.",
"name": "Naam",
"sortByName": "Naam",
"sortByDate": "Datum gewijzigd",
"sortBySize": "Maat",
"ascending": "Stijgend",
"descending": "Dalend",
"root": "Wortel",
"new": "Nieuw",
"sortBy": "Sorteren op",
"items": "Artikelen",
"selected": "Gekozen",
"editor": "Editor",
"octal": "Octaal",
"storage": "Opslag",
"disk": "Schijf",
"used": "Gebruikt",
"of": "van",
"toggleSidebar": "Zijbalk in-/uitschakelen",
"compactLayout": "Gebruik een compacte lay-out.",
"comfortableLayout": "Gebruik een comfortabele lay-out.",
"cannotLoadPdf": "Kan PDF niet laden",
"pdfLoadError": "Er is een fout opgetreden bij het laden van dit PDF-bestand.",
"loadingPdf": "PDF laden...",
"loadingPage": "Pagina laden..."
},
"transfer": {
"copyToHost": "Kopiëren naar host…",
"moveToHost": "Verplaats naar host…",
"copyItemsToHost": "Kopieer {{count}} items naar host…",
"moveItemsToHost": "Verplaats {{count}} items naar host…",
"noHostsConnected": "Er zijn geen andere bestandsbeheerhosts beschikbaar.",
"noHostsConnectedHint": "Voeg een andere SSH-host toe met Bestandsbeheer ingeschakeld in Hostbeheer.",
"selectDestinationHost": "Selecteer de bestemmingshost",
"destinationPath": "Bestemmingspad",
"recentDestinations": "Recente bestemmingen",
"collapseRecentDestinations": "Recente bestemmingen inklappen",
"expandRecentDestinations": "Recente bestemmingen uitbreiden",
"browseFolders": "Blader door bestemmingsmappen",
"browseDestination": "Bladeren of pad invoeren",
"confirmCopy": "Kopiëren",
"confirmMove": "Beweging",
"transferring": "Overdracht…",
"progressVerifying": "Bestandsintegriteit controleren…",
"progressBenchmarking": "De snelste overstaproute selecteren…",
"compressing": "Comprimeren…",
"extracting": "Extractie van…",
"transferringItems": "Overdracht van {{current}} van {{total}} items…",
"transferSuccess": "Overdracht voltooid",
"transferError": "Overdracht mislukt",
"transferPartial": "Overdracht voltooid met {{count}} fouten",
"transferPartialHint": "Overdracht mislukt: {{paths}}",
"itemsSummary": "{{count}} items",
"destMustBeDirectory": "De bestemming moet een adresboek zijn voor overdrachten van meerdere items.",
"selectThisFolder": "Selecteer deze map",
"browsePathWillBeCreated": "Deze map bestaat nog niet. Hij wordt aangemaakt zodra de overdracht start.",
"browsePathError": "Dit pad kon niet worden geopend op de doelhost.",
"goUp": "Ga omhoog",
"copyFolderToHost": "Kopieer de map naar de host…",
"moveFolderToHost": "Map verplaatsen naar host…",
"hostReady": "Klaar",
"hostConnecting": "Verbinding maken…",
"hostDisconnected": "Niet verbonden",
"hostAuthRequired": "Authenticatie vereist — open eerst Bestandsbeheer op deze host.",
"hostConnectionFailed": "Verbinding mislukt",
"metricsTitle": "Transfertijden",
"metricsPrepare": "Bestemming voorbereiden: {{duration}}",
"metricsCompress": "Comprimeren op bron: {{duration}}",
"metricsHopSourceRead": "Bron → server: {{throughput}}",
"metricsHopDestSftpWrite": "Server → bestemming (SFTP): {{throughput}}",
"metricsHopDestLocalWrite": "Server → bestemming (lokaal): {{throughput}}",
"metricsTransfer": "Einde tot einde: {{throughput}} ({{duration}})",
"metricsExtract": "Uitpakken op bestemming: {{duration}}",
"metricsVerify": "SHA-256 geverifieerd: {{duration}}",
"metricsRouteBenchmark": "Route probe — direct: {{direct}}, relay: {{relay}}",
"metricsSourceDelete": "Verwijderen uit de bron: {{duration}}",
"metricsTotal": "Totaal: {{duration}}",
"progressCompressing": "Comprimeren op de bronhost…",
"progressExtracting": "Uitpakken op bestemming…",
"progressTransferring": "Gegevens overdragen…",
"progressReconnecting": "Opnieuw verbinding maken…",
"parallelSegmentsLabel": "Parallelle transferstroken",
"parallelSegmentsOption": "{{count}} rijstroken",
"parallelSegmentsHint": "Grote bestanden worden opgesplitst in blokken van 256 MB. Meerdere lanes gebruiken aparte verbindingen (alsof er meerdere overdrachten worden gestart) voor een hogere totale doorvoer.",
"progressTotalSpeed": "{{speed}} totaal ({{lanes}} rijstroken)",
"progressTransferringItems": "Bestanden overdragen ({{current}} van {{total}})…",
"progressBytes": "{{transferred}} / {{total}}",
"progressItems": "{{current}} / {{total}} bestanden",
"sourceNotDeletedPartial": "Bronbestanden behouden (gedeeltelijke overdracht)",
"jumpHostLimitation": "Beide hosts moeten bereikbaar zijn vanaf de Termix-server. Directe routering tussen hosts wordt niet ondersteund.",
"cancel": "Annuleren",
"methodLabel": "Overdrachtsmethode",
"methodAuto": "Auto",
"methodTar": "Tar-archief",
"methodItemSftp": "SFTP per bestand",
"methodAutoHint": "Selecteert tar of SFTP per bestand op basis van het aantal bestanden, de grootte en de comprimeerbaarheid. Voor afzonderlijke bestanden wordt altijd streaming SFTP gebruikt.",
"methodTarHint": "Comprimeer op de bron, verstuur één archiefbestand en pak het uit op de bestemming. Vereist tar op beide Unix-hosts.",
"methodItemSftpHint": "Verstuur elk bestand afzonderlijk via SFTP. Werkt op alle besturingssystemen, inclusief Windows.",
"methodPreviewLoading": "Berekeningsmethode voor overdracht…",
"methodPreviewError": "De overdrachtsmethode kon niet worden bekeken. De server kiest nog steeds een methode wanneer u start.",
"methodPreviewWillUseTar": "Zal gebruiken: Tar-archief",
"methodPreviewWillUseItemSftp": "Zal gebruikmaken van: SFTP per bestand",
"methodPreviewScanSummary": "{{fileCount}} bestanden, {{totalSize}} totaal (gescand op de bronhost).",
"methodItemSftpLimitation": "Elk bestand gebruikt dezelfde SFTP-stream als een kopie van een enkel bestand, de een na de ander. De voortgang wordt gecombineerd voor alle bestanden, waardoor de voortgangsbalk langzaam beweegt bij grote bestanden.",
"methodReason": {
"user_item_sftp": "Je hebt gekozen voor SFTP per bestand.",
"user_tar": "Je hebt gekozen voor een tar-archief.",
"tar_unavailable": "Tar is niet beschikbaar op een of beide hosts; in plaats daarvan wordt SFTP per bestand gebruikt.",
"windows_host": "Er wordt gebruikgemaakt van een Windows-host; tar wordt niet gebruikt.",
"auto_multi_large": "Automatisch: meerdere bestanden, waaronder een groot bestand ({{largestSize}}) met comprimeerbare gegevens — tar bundelt deze tot één overdracht.",
"auto_single_large_in_archive": "Auto: één groot bestand ({{largestSize}}) in deze set — SFTP per bestand.",
"auto_many_incompressible": "Automatisch: voornamelijk niet-comprimeerbare gegevens — SFTP per bestand.",
"auto_many_files": "Auto: veel bestanden ({{fileCount}}) — tar vermindert de overhead per bestand.",
"auto_default": "Automatisch: SFTP per bestand voor deze set."
},
"progressCancel": "Annuleren",
"progressCancelling": "Annuleren…",
"progressStalled": "Vastgelopen",
"resumedHint": "De verbinding met een actieve overdracht die in een ander venster is gestart, is hersteld.",
"transferCancelled": "Overdracht geannuleerd",
"transferCancelledCopyHint": "Er kunnen gedeeltelijke bestanden op de bestemming achterblijven.",
"transferCancelledMoveHint": "Er kunnen gedeeltelijke bestanden op de bestemming achterblijven. De bronbestanden zijn niet verwijderd.",
"cleanupDestFiles": "Opruimbestemming",
"cleanupDestFilesSuccess": "Gedeeltelijke bestanden verwijderd van de bestemming.",
"cleanupDestFilesPartial": "Sommige gedeeltelijke bestanden konden niet worden verwijderd.",
"cleanupDestFilesNothing": "Niets op te ruimen op de bestemming.",
"cleanupDestFilesError": "Opruimen mislukt",
"retryTransfer": "Opnieuw proberen",
"retryTransferError": "Opnieuw proberen mislukt",
"transferFailedRetryHint": "Er zijn gedeeltelijke gegevens op de bestemming bewaard gebleven. De herhaalpoging wordt hervat zodra de verbinding hersteld is."
},
"sftpTransfer": {
"title": "SFTP",
"description": "Bestanden overdragen tussen twee SSH-hosts.",
"sourceServer": "Bronserver",
"destinationServer": "Doelserver",
"selectHost": "Selecteer host",
"noHostSelected": "Geen host geselecteerd",
"move": "Beweging",
"copy": "Kopiëren",
"upload": "Uploaden",
"itemsSelected": "{{count}} item geselecteerd",
"itemsSelected_other": "{{count}} items geselecteerd",
"ready": "Klaar",
"loadingHosts": "Hosts worden geladen...",
"name": "Naam",
"modified": "Gewijzigd",
"size": "Maat",
"noFiles": "Geen bestanden",
"open": "Open",
"up": "Omhoog",
"refresh": "Vernieuwen",
"copyToTarget": "Kopiëren naar doelmap",
"rename": "Naam wijzigen",
"delete": "Verwijderen",
"editPermissions": "Machtigingen bewerken",
"createNewFolder": "Nieuwe map maken",
"deleteSelectedItems": "Geselecteerde items verwijderen",
"deleteConfirm": "Verwijder het geselecteerde item {{count}}?",
"deleteConfirm_other": "Verwijder {{count}} geselecteerde items?",
"cancel": "Annuleren",
"save": "Redden",
"folderCreated": "Map aangemaakt",
"itemRenamed": "Item hernoemd",
"actionFailed": "Actie mislukt",
"itemsDeleted": "{{count}} item verwijderd",
"itemsDeleted_other": "{{count}} items verwijderd",
"deleteFailed": "Verwijderen mislukt",
"permissionsUpdated": "Machtigingen bijgewerkt",
"noRemoteSessionConnected": "Geen externe sessie verbonden",
"failedToListFiles": "Het lukte niet om de bestanden weer te geven.",
"failedToRefresh": "Vernieuwen mislukt",
"destinationInsideSource": "De bestemming mag zich niet binnen het geselecteerde bronpad bevinden.",
"sameHostNoOp": "De bron- en bestemmingsmap zijn dezelfde map."
},
"tunnels": {
"noSshTunnels": "Geen SSH-tunnels",
"createFirstTunnelMessage": "Je hebt nog geen SSH-tunnels aangemaakt. Configureer tunnelverbindingen in de Host Manager om te beginnen.",
"connected": "Aangesloten",
"disconnected": "Verbinding verbroken",
"connecting": "Verbinden...",
"error": "Fout",
"canceling": "Annuleren...",
"connect": "Verbinden",
"disconnect": "Verbinding verbreken",
"cancel": "Annuleren",
"port": "Haven",
"localPort": "Lokale haven",
"remotePort": "Externe poort",
"destinationPort": "Bestemmingshaven",
"currentHostPort": "Huidige hostpoort",
"endpointPort": "Eindpuntpoort",
"bindIp": "Lokaal IP-adres",
"localAddress": "Lokaal adres",
"remoteAddress": "Extern adres",
"destinationAddress": "Bestemmingsadres",
"remoteBindAddress": "Extern bindadres",
"intermediateHost": "Tussenliggende gastheer",
"endpointSshConfig": "SSH-configuratie van het eindpunt",
"endpointSshHost": "Eindpunt SSH-host",
"endpointSshHostPlaceholder": "Selecteer een geconfigureerde host.",
"endpointSshHostRequired": "Selecteer een SSH-host voor elke clienttunnel.",
"attempt": "Poging {{current}} van {{max}}",
"nextRetryIn": "Volgende poging over {{seconds}} seconden",
"clientTunnels": "Clienttunnels",
"clientTunnel": "Clienttunnel",
"addClientTunnel": "Clienttunnel toevoegen",
"noClientTunnels": "Er zijn geen clienttunnels geconfigureerd op deze desktop.",
"tunnelName": "Tunnelnaam",
"remoteHost": "Externe host",
"autoStart": "Automatische start",
"clientAutoStartDesc": "Begint wanneer deze desktopclient wordt geopend en blijft verbonden.",
"clientManualStartDesc": "Gebruik Start en Stop vanuit deze regel. Termix opent deze niet automatisch.",
"clientRemoteServerNote": "Voor het doorsturen van externe poorten zijn mogelijk de instellingen AllowTcpForwarding en GatewayPorts vereist op de SSH-server van het eindpunt. De externe poort wordt gesloten wanneer deze desktop de verbinding verbreekt.",
"clientTunnelStarted": "Clienttunnel gestart",
"clientTunnelStopped": "Clienttunnel gestopt",
"tunnelTestSucceeded": "Tunneltest geslaagd",
"tunnelTestFailed": "Tunneltest mislukt",
"localSaved": "Clienttunnels opgeslagen",
"localSaveError": "Het opslaan van lokale clienttunnels is mislukt.",
"invalidBindIp": "Het lokale IP-adres moet een geldig IPv4-adres zijn.",
"invalidLocalTargetIp": "Het lokale doel-IP-adres moet een geldig IPv4-adres zijn.",
"invalidRemoteAddress": "Een extern adres is vereist.",
"invalidLocalPort": "Het lokale poortnummer moet tussen 1 en 65535 liggen.",
"invalidRemotePort": "De externe poort moet tussen 1 en 65535 liggen.",
"invalidLocalTargetPort": "De lokale doelpoort moet tussen 1 en 65535 liggen.",
"invalidEndpointPort": "De eindpoort moet tussen 1 en 65535 liggen.",
"duplicateAutoStartBind": "Slechts één automatisch startende clienttunnel kan {{bind}} gebruiken.",
"manualControlError": "Het bijwerken van de tunnelstatus is mislukt.",
"active": "Actief",
"start": "Begin",
"stop": "Stop",
"test": "Test",
"type": "Tunneltype",
"typeLocal": "Lokaal (-L)",
"typeRemote": "Afstandsbediening (-R)",
"typeDynamic": "Dynamisch (-D)",
"typeServerLocalDesc": "Huidige host naar eindpunt.",
"typeServerRemoteDesc": "Eindpunt terug naar de huidige host.",
"typeClientLocalDesc": "Lokale computer naar eindpunt.",
"typeClientRemoteDesc": "Eindpunt terug naar lokale computer.",
"typeClientDynamicDesc": "SOCKS op de lokale computer.",
"typeDynamicDesc": "Stuur SOCKS5 CONNECT-verkeer door via SSH.",
"forwardDescriptionServerLocal": "Huidige host {{sourcePort}} → eindpunt {{endpointPort}}.",
"forwardDescriptionServerRemote": "Eindpunt {{endpointPort}} → huidige host {{sourcePort}}.",
"forwardDescriptionServerDynamic": "SOCKS op de huidige host {{sourcePort}}.",
"forwardDescriptionClientLocal": "Lokaal {{sourcePort}} → extern {{endpointPort}}.",
"forwardDescriptionClientRemote": "Extern {{sourcePort}} → lokaal {{endpointPort}}.",
"forwardDescriptionClientDynamic": "SOCKS op lokale poort {{sourcePort}}.",
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{remoteHost}}:{{remotePort}} via {{endpoint}}",
"summaryClientRemote": "{{remoteHost}}:{{remotePort}} op {{endpoint}} → {{localHost}}:{{localPort}}",
"summaryClientDynamic": "{{localHost}}:{{localPort}} → SOKKEN via {{endpoint}}",
"autoNameClientLocal": "Lokaal {{localPort}} → {{endpoint}} {{remotePort}}",
"autoNameClientRemote": "{{endpoint}} {{remotePort}} → lokaal {{localPort}}",
"autoNameClientDynamic": "SOKKEN {{localPort}} via {{endpoint}}",
"route": "Route:",
"lastStarted": "Laatst gestart",
"lastTested": "Laatst getest",
"lastError": "Laatste fout",
"maxRetries": "Max. aantal herhalingen",
"maxRetriesDescription": "Maximaal aantal herhaalpogingen.",
"retryInterval": "Interval voor herpogingen (seconden)",
"retryIntervalDescription": "De tijd die tussen herhaalpogingen verstreken moet worden.",
"local": "Lokaal",
"remote": "Op afstand",
"destination": "Bestemming",
"host": "Gastheer",
"mode": "Modus",
"noHostSelected": "Geen host geselecteerd",
"working": "Bezig met verwerken..."
},
"cardGrid": {
"dragToMove": "Sleep om te verplaatsen",
"dragToResize": "Sleep om het formaat aan te passen.",
"changeWidth": "Breedte wijzigen",
"removeCard": "Verwijder {{label}}",
"addCard": "Toevoegen",
"columns": "Kolommen",
"empty": "Geen kaarten. Gebruik 'Voeg hieronder toe' om kaarten te plaatsen."
},
"hostMetrics": {
"cpu": "CPU",
"memory": "Geheugen",
"disk": "Schijf",
"network": "Netwerk",
"uptime": "Beschikbaarheid",
"processes": "Processen",
"available": "Beschikbaar",
"free": "Vrij",
"connecting": "Verbinden...",
"connectionFailed": "Verbinding met de server mislukt.",
"naCpus": "Niet van toepassing CPU('s)",
"cpuCores_one": "{{count}} Kern",
"cpuCores_other": "{{count}} Kernen",
"cpuUsage": "CPU-gebruik",
"memoryUsage": "Geheugengebruik",
"diskUsage": "Schijfgebruik",
"selectFilesystem": "Selecteer bestandssysteem",
"temperature": "Temperatuur",
"highestTemperature": "Hoogste temperatuur",
"primaryTemperatureSensor": "Primaire sensor",
"gpu": {
"title": "GPU",
"noDevice": "Geen NVIDIA GPU gedetecteerd. Installeer het NVIDIA-stuurprogramma (dit levert nvidia-smi) om GPU-statistieken te bekijken.",
"driver": "Bestuurder {{version}}",
"utilization": "Gebruik",
"memory": "VRAM",
"temperature": "Temp",
"power": "Stroom",
"fan": "Fan",
"processes": "GPU-processen",
"noProcesses": "Er zijn geen processen die de GPU gebruiken."
},
"failedToFetchHostConfig": "Het ophalen van de hostconfiguratie is mislukt.",
"serverOffline": "Server offline",
"cannotFetchMetrics": "Het is niet mogelijk om meetgegevens op te halen van een offline server.",
"totpFailed": "TOTP-verificatie mislukt",
"noneAuthNotSupported": "Host Metrics ondersteunt geen authenticatietype 'none'.",
"noHostSelected": "Geen host geselecteerd",
"load": "Laden",
"systemInfo": "Systeeminformatie",
"hostname": "Hostnaam",
"operatingSystem": "Besturingssysteem",
"kernel": "Kernel",
"seconds": "seconden",
"networkInterfaces": "Netwerkinterfaces",
"noInterfacesFound": "Geen netwerkinterfaces gevonden",
"noProcessesFound": "Geen processen gevonden",
"processesTotal": "totaal",
"processesRunning": "rennen",
"loginStats": "SSH-aanmeldingsstatistieken",
"noRecentLoginData": "Geen recente inloggegevens",
"executingQuickAction": "Het uitvoeren van {{name}}...",
"quickActionSuccess": "{{name}} succesvol voltooid",
"quickActionFailed": "{{name}} mislukt",
"quickActionError": "Het uitvoeren van {{name}} is mislukt.",
"ports": {
"title": "Luisterpoorten",
"protocol": "Protocol",
"port": "Haven",
"address": "Adres",
"process": "Proces",
"search": "Poorten doorzoeken...",
"allProtocols": "Alle",
"noData": "Geen gegevens over luisterpoorten"
},
"firewall": {
"title": "Firewall",
"inactive": "Inactief",
"policy": "Beleid",
"rules": "regels",
"noRules": "Er zijn geen regels in deze keten.",
"noData": "Geen firewallgegevens beschikbaar",
"action": "Actie",
"protocol": "Proto",
"port": "Haven",
"source": "Bron",
"anywhere": "Overal",
"chains": "kettingen"
},
"loadAvg": "Gemiddelde belasting",
"swap": "Ruil",
"architecture": "Architectuur",
"refresh": "Vernieuwen",
"retry": "Opnieuw proberen",
"customize": "Lay-out aanpassen",
"reset": "Reset",
"tabLive": "Live",
"editModeInstructions": "Sleep kaarten om ze te herschikken, sleep de onderrand om het formaat aan te passen en gebruik de breedteknop om de afmetingen van een kaart te wijzigen. Voeg hieronder kaarten toe of verwijder ze.",
"managers": {
"services": "Diensten",
"processInspector": "Procesinspecteur",
"logViewer": "Logboekviewer",
"cron": "Cron Jobs",
"packages": "Pakketten",
"ssl": "SSL-certificaten",
"firewall": "Firewall",
"users": "Gebruikers en machtigingen",
"healthCheck": "Gezondheidscontroles",
"diskBreakdown": "Schijfdefect",
"systemdTimers": "Timers",
"topMemory": "Top op geheugen",
"noData": "Geen gegevens",
"sudoHint": "Stel een sudo-wachtwoord in voor deze host in de hosteditor om acties met verhoogde bevoegdheden mogelijk te maken.",
"filter": "Filter...",
"start": "Begin",
"stop": "Stop",
"restart": "Opnieuw opstarten",
"actionDone": "{{name}} bijgewerkt",
"actionFailed": "Actie mislukt",
"signalSent": "Signaal verzonden naar PID {{pid}}",
"killHint": "Klikken: beëindigen (SIGTERM). Rechtsklikken: geforceerd afsluiten (SIGKILL).",
"working": "Bezig met verwerken...",
"update": "Update",
"upgradeAll": "Upgrade alles",
"allUpToDate": "Alles is actueel.",
"save": "Redden",
"command": "Commando",
"enabled": "Ingeschakeld",
"cronSaved": "Crontab bijgewerkt",
"clients": "Klanten",
"dryRun": "Proefloop",
"renew": "Vernieuwen",
"noAcmeClient": "Er is geen ACME-client (certbot of acme.sh) gevonden op deze host.",
"addInputRule": "Voeg een INPUT-regel toe",
"firewallWarning": "Wijzigingen zijn alleen tijdens de uitvoering van het programma geldig totdat ze zijn opgeslagen. Pas op dat u uzelf niet buitensluit.",
"ruleApplied": "Toegepaste regel",
"invalidPort": "Voer een geldig poortnummer in (1-65535)",
"newUsername": "Nieuwe gebruikersnaam",
"addUser": "Toevoegen",
"deleteUser": "Gebruiker verwijderen",
"noHealthChecks": "Er zijn nog geen gezondheidscontroles geconfigureerd.",
"follow": "Volgen",
"noLogData": "Geen loguitvoer.",
"tree": "Boom",
"enableDisable": "In-/uitschakelen bij het opstarten",
"grantSudo": "Verleen sudo",
"revokeSudo": "Sudo intrekken",
"sslIssueCert": "Certificaat uitreiken",
"sslExpired": "Verlopen",
"sslInDays": "in {{days}}d",
"sslNeedDomain": "Voer ten minste één domein in",
"sslIssued": "Certificaat afgegeven",
"sslDomainsPlaceholder": "example.com, www.example.com",
"sslHttpStandalone": "HTTP (zelfstandig)",
"sslHttpWebroot": "HTTP (webroot)",
"sslDns": "DNS",
"sslDnsProvider": "DNS-provider (bijv. Cloudflare)",
"sslIssueHint": "De inloggegevens van de DNS-provider moeten al op de host geconfigureerd zijn.",
"sslRevoke": "Certificaat intrekken",
"sslRevoked": "Certificaat ingetrokken",
"sslRevokeConfirm": "Het certificaat \"{{name}}\" intrekken en verwijderen? Dit kan niet ongedaan gemaakt worden.",
"healthRun": "Loop",
"healthName": "Naam",
"healthTarget": "Host / adres",
"healthAddCheck": "Voeg een controle toe",
"healthSaved": "Gezondheidscontroles opgeslagen",
"healthMissingFields": "Elke controle heeft een naam en een doel nodig.",
"logFile": "Bestand",
"logUnit": "Eenheid",
"logCustomPath": "Aangepast pad onder /var/log (optioneel)",
"logGrep": "Filterlijnen...",
"firewallPersist": "Persist-regels",
"firewallPersisted": "De firewallregels bleven van kracht.",
"wireguard": "WireGuard",
"tailscale": "Staartschaal",
"wgNotInstalled": "WireGuard is niet geïnstalleerd op deze host.",
"wgNoInterfaces": "Er zijn geen WireGuard-interfaces geconfigureerd.",
"wgInterfaceUp": "Breng ter sprake",
"wgInterfaceDown": "Neerhalen",
"wgBringingUp": "{{name}} wordt geladen...",
"wgBringingDown": "{{name}} naar beneden halen...",
"wgInterfaceUpDone": "{{name}} is up",
"wgInterfaceDownDone": "{{name}} is omlaag",
"wgListenPort": "Haven",
"wgPublicKey": "Openbare sleutel",
"wgEndpoint": "Eindpunt",
"wgAllowedIPs": "Toegestane IP-adressen",
"wgLastHandshake": "Laatste handdruk",
"wgHandshakeNever": "Nooit",
"wgTransfer": "Overdracht",
"tsNotInstalled": "Tailscale is niet geïnstalleerd op deze host.",
"tsRunning": "Rennen",
"tsStopped": "Gestopt",
"tsEnable": "Verbinden",
"tsDisable": "Verbinding verbreken",
"tsEnabling": "Verbinding maken met Tailscale...",
"tsDisabling": "Verbinding met Tailscale verbreken...",
"tsEnabled": "Aangesloten staartschaal",
"tsDisabled": "Staartschaal losgekoppeld",
"tsIPs": "Tailscale IP-adressen",
"tsPeers": "Leeftijdsgenoten",
"tsOnline": "Online",
"tsOffline": "Offline",
"tsExitNode": "Uitgangsknooppunt",
"tsExitNodeActive": "Uitgangsknooppunt actief",
"tsHostname": "Hostnaam"
}
},
"proxmoxStats": {
"tabTitle": "Proxmox-statistieken",
"cpuUsage": "CPU-gebruik",
"memoryUsage": "Geheugengebruik",
"diskUsage": "Schijfgebruik",
"networkInterfaces": "Netwerkinterfaces",
"uptime": "Beschikbaarheid",
"systemInfo": "Systeeminformatie",
"guestsSummary": "Gasten",
"storagePools": "Opslagbassins",
"clusterHealth": "Clustergezondheid",
"cpuCores_one": "{{count}} Kern",
"cpuCores_other": "{{count}} Kernen",
"used": "Gebruikt",
"total": "Totaal",
"hostname": "Hostnaam",
"kernel": "Kernel",
"pveVersion": "PVE-versie",
"name": "Naam",
"status": "Status",
"type": "Type",
"cpu": "CPU",
"mem": "Mem",
"disk": "Schijf",
"running": "Rennen",
"stopped": "Gestopt",
"guestCounts": "{{running}}/{{total}} rennend",
"inactive": "Inactief",
"notClustered": "Zelfstandig knooppunt (geen onderdeel van een cluster)",
"quorate": "Quoraat",
"notQuorate": "Niet quorum",
"nodeOnline": "Online",
"nodeOffline": "Offline",
"noHostSelected": "Geen host geselecteerd",
"pveshNotFound": "pvesh niet gevonden - is dit een Proxmox-node?",
"nodeDetectionFailed": "Kan geen geldige Proxmox-knooppuntnaam bepalen",
"connecting": "Verbinden...",
"connectionFailed": "Verbinding met Proxmox-node mislukt.",
"refresh": "Vernieuwen",
"searchGuests": "Gasten zoeken...",
"filterAll": "Alle",
"filterVm": "VM",
"filterLxc": "LXC",
"noGuests": "Er zijn geen VM's of LXC-containers gevonden op dit knooppunt.",
"noGuestsMatch": "Er zijn geen gasten die aan de huidige filters voldoen."
},
"auth": {
"tagline": "Zelf gehoste SSH- en beheerservices voor externe bureaubladen",
"loginTitle": "Welkom terug",
"registerTitle": "Account aanmaken",
"forgotPassword": "Wachtwoord vergeten?",
"rememberMe": "Apparaat 30 dagen onthouden (inclusief TOTP)",
"noAccount": "Nog geen account?",
"hasAccount": "Heb je al een account?",
"twoFactorAuth": "Tweefactorauthenticatie",
"enterCode": "Voer de verificatiecode in.",
"backupCode": "Of gebruik de back-upcode.",
"verifyCode": "Code verifiëren",
"redirectingToApp": "Doorverwijzen naar app...",
"sshAuthenticationRequired": "SSH-authenticatie vereist",
"sshNoKeyboardInteractive": "Toetsenbord-interactieve authenticatie niet beschikbaar",
"sshAuthenticationFailed": "Authenticatie mislukt",
"sshAuthenticationTimeout": "Authenticatietime-out",
"sshNoKeyboardInteractiveDescription": "De server ondersteunt geen authenticatie via het toetsenbord. Voer uw wachtwoord of SSH-sleutel in.",
"sshAuthFailedDescription": "De opgegeven inloggegevens waren onjuist. Probeer het opnieuw met geldige inloggegevens.",
"sshTimeoutDescription": "De authenticatiepoging is mislukt vanwege een time-out. Probeer het opnieuw.",
"sshProvideCredentialsDescription": "Geef uw SSH-gegevens op om verbinding te maken met deze server.",
"sshPasswordDescription": "Voer het wachtwoord voor deze SSH-verbinding in.",
"sshKeyPasswordDescription": "Als uw SSH-sleutel versleuteld is, voer dan hier de wachtzin in.",
"passphraseRequired": "Wachtwoordzin vereist",
"passphraseRequiredDescription": "De SSH-sleutel is versleuteld. Voer de wachtzin in om deze te ontgrendelen.",
"back": "Rug",
"firstUser": "Eerste gebruiker",
"firstUserMessage": "U bent de eerste gebruiker en wordt beheerder. U kunt de beheerdersinstellingen bekijken in het zijmenu voor gebruikers. Als u denkt dat dit een fout is, controleer dan de Docker-logs of maak een GitHub-issue aan.",
"external": "Extern",
"loginWithExternal": "Inloggen met een externe provider",
"loginWithExternalDesc": "Meld u aan met uw geconfigureerde externe identiteitsprovider.",
"externalNotSupportedInElectron": "Externe authenticatie wordt nog niet ondersteund in de Electron-app. Gebruik de webversie voor OIDC-aanmelding.",
"loginWithProvider": "Inloggen met {{name}}",
"orContinueWith": "of verdergaan met",
"ldapUsername": "LDAP-gebruikersnaam",
"ldapPassword": "LDAP-wachtwoord",
"ldapSignIn": "Inloggen",
"ldapLoginFailed": "LDAP-aanmelding mislukt",
"resetPasswordButton": "Wachtwoord opnieuw instellen",
"sendResetCode": "Verzend resetcode",
"resetCodeDesc": "Voer uw gebruikersnaam in om een code voor het opnieuw instellen van uw wachtwoord te ontvangen. De code wordt opgeslagen in de logbestanden van de Docker-container.",
"resetCode": "Resetcode",
"verifyCodeButton": "Code verifiëren",
"enterResetCode": "Voer de 6-cijferige code uit de Docker-containerlogboeken in voor de gebruiker:",
"newPassword": "Nieuw wachtwoord",
"confirmNewPassword": "Bevestig wachtwoord",
"enterNewPassword": "Voer uw nieuwe wachtwoord in voor gebruiker:",
"signUp": "Aanmelden",
"desktopApp": "Desktop-app",
"loggingInToDesktopApp": "Inloggen bij de desktop-app",
"loadingServer": "Server wordt geladen...",
"dataLossWarning": "Als u uw wachtwoord op deze manier opnieuw instelt, worden al uw opgeslagen SSH-hosts, inloggegevens en andere versleutelde gegevens verwijderd. Deze actie kan niet ongedaan worden gemaakt. Gebruik deze optie alleen als u uw wachtwoord bent vergeten en niet bent ingelogd.",
"authenticationDisabled": "Authenticatie uitgeschakeld",
"authenticationDisabledDesc": "Alle authenticatiemethoden zijn momenteel uitgeschakeld. Neem contact op met uw beheerder.",
"passwordLoginDisabledDesc": "Inloggen met wachtwoord is uitgeschakeld. Gebruik een toegangscode of een externe authenticatieprovider.",
"signInWithPasskey": "Aanmelden met wachtwoord",
"passkeyLoginFailed": "Aanmelden met wachtwoord mislukt",
"attemptsRemaining": "{{count}} resterende pogingen",
"confirmResetDataWipe": "Dit account is sinds de upgrade van de encryptie niet meer gebruikt, waardoor de opgeslagen gegevens niet kunnen worden hersteld zonder het oude wachtwoord. Door het wachtwoord opnieuw in te stellen, worden de hosts, inloggegevens en codefragmenten permanent verwijderd. Doorgaan?"
},
"hostKey": {
"verifyNewHost": "Verifieer de SSH-hostsleutel",
"keyChangedWarning": "SSH-hostsleutel gewijzigd",
"firstConnectionTitle": "Dit is de eerste keer dat ik verbinding maak met deze host.",
"firstConnectionDescription": "De authenticiteit van deze host kan niet worden vastgesteld. Controleer of de vingerafdruk overeenkomt met wat u verwacht.",
"keyChangedDescription": "De host-sleutel voor deze server is gewijzigd sinds uw laatste verbinding. Dit kan duiden op een beveiligingsprobleem.",
"previousKey": "Vorige sleutel",
"newFingerprint": "Nieuwe vingerafdruk",
"fingerprint": "Vingerafdruk",
"verifyInstructions": "Als u deze host vertrouwt, klik dan op Accepteren om verder te gaan en deze vingerafdruk op te slaan voor toekomstige verbindingen.",
"securityWarning": "Beveiligingswaarschuwing",
"acceptAndContinue": "Accepteren en doorgaan",
"acceptNewKey": "Nieuwe sleutel accepteren en verdergaan"
},
"errors": {
"databaseConnection": "Er kon geen verbinding worden gemaakt met de database.",
"embeddedServerFailed": "De lokale server van Termix kon niet starten.",
"unknownError": "Onbekende fout",
"loginFailed": "Aanmelden mislukt",
"failedPasswordReset": "Wachtwoordherstel is mislukt.",
"failedVerifyCode": "Het verifiëren van de resetcode is mislukt.",
"failedCompleteReset": "Wachtwoordherstel is mislukt.",
"invalidTotpCode": "Ongeldige TOTP-code",
"failedOidcLogin": "Het starten van de OIDC-aanmelding is mislukt.",
"silentSigninOidcUnavailable": "Er is een verzoek ingediend voor een stille aanmelding, maar inloggen via OIDC is niet mogelijk.",
"failedUserInfo": "Het ophalen van gebruikersgegevens na het inloggen is mislukt.",
"oidcAuthFailed": "OIDC-authenticatie mislukt",
"invalidAuthUrl": "Ongeldige autorisatie-URL ontvangen van de backend.",
"requiredField": "Dit veld is verplicht.",
"minLength": "De minimale lengte is {{min}}",
"passwordMismatch": "De wachtwoorden komen niet overeen.",
"passwordLoginDisabled": "Inloggen met gebruikersnaam/wachtwoord is momenteel uitgeschakeld.",
"sessionExpired": "Sessie verlopen - log opnieuw in.",
"totpRateLimited": "Snelheid beperkt: Te veel TOTP-verificatiepogingen. Probeer het later opnieuw.",
"totpRateLimitedWithTime": "Snelheid beperkt: Te veel TOTP-verificatiepogingen. Wacht {{time}} seconden voordat u het opnieuw probeert.",
"resetCodeRateLimited": "Snelheid beperkt: Te veel verificatiepogingen. Probeer het later opnieuw.",
"resetCodeRateLimitedWithTime": "Snelheid beperkt: Te veel verificatiepogingen. Wacht {{time}} seconden voordat u het opnieuw probeert.",
"authTokenSaveFailed": "Het opslaan van het authenticatietoken is mislukt.",
"authTokenMissing": "De server heeft geen nieuw authenticatietoken teruggestuurd. Meld u alstublieft opnieuw aan.",
"authTokenRejected": "De externe server heeft het nieuwe authenticatietoken geweigerd.",
"keyringUnavailable": "U bent ingelogd, maar de sessie kon niet worden opgeslagen: dit systeem heeft geen sleutelbos beschikbaar om deze mee te versleutelen. Start een geheime service (zoals gnome-keyring of KWallet) en log opnieuw in.",
"failedToLoadServer": "Server laden mislukt",
"remoteServerRequired": "Externe server vereist. Verbind een externe server in de instellingen om dit verbindingstype te gebruiken."
},
"messages": {
"registrationDisabled": "Het registreren van nieuwe accounts is momenteel uitgeschakeld door een beheerder. Log in of neem contact op met een beheerder.",
"userNotAllowed": "Uw account is niet geautoriseerd om te registreren. Neem contact op met een beheerder.",
"databaseConnectionFailed": "Verbinding met de databaseserver is mislukt.",
"embeddedServerPortInUse": "Poort {{port}} is al in gebruik door een ander programma. Dit is meestal een Termix Docker-container of een achtergebleven Termix-proces van een vorige sessie. Sluit deze af en herstart Termix.",
"embeddedServerPortInUseUnknownPort": "Een van de poorten die Termix nodig heeft, is al in gebruik door een ander programma. Sluit het programma dat de poort gebruikt en start Termix opnieuw.",
"embeddedServerCrashed": "De lokale server is onverwacht gestopt. Start Termix opnieuw op en controleer het logboek op het bureaublad als dit probleem zich blijft voordoen.",
"resetCodeSent": "Resetcode verzonden naar Docker-logs",
"codeVerified": "Code succesvol geverifieerd",
"passwordResetSuccess": "Wachtwoord succesvol gereset",
"loginSuccess": "Inloggen is gelukt",
"registrationSuccess": "Registratie succesvol"
},
"profile": {
"c2sTunnelConfigDesc": "Lokale desktoptunnels gericht op geconfigureerde SSH-hosts.",
"c2sTunnelPresets": "Clienttunnel-voorinstellingen",
"c2sTunnelPresetsDesc": "Sla de lokale tunnellijst van deze desktopclient op als een vooraf ingestelde server met een naam, of laad een vooraf ingestelde server in deze client.",
"c2sTunnelPresetsUnavailable": "Clienttunnelvoorinstellingen zijn alleen beschikbaar in de desktopclient.",
"c2sPresetName": "Voorinstellingnaam",
"c2sPresetNamePlaceholder": "Naam van de clientvoorinstelling",
"c2sPresetToLoad": "Voorinstelling om te laden",
"c2sNoPresetSelected": "Geen voorinstelling geselecteerd",
"c2sNoPresets": "Geen presets opgeslagen",
"c2sLoadPreset": "Laden",
"c2sCurrentLocalConfig": "{{count}} lokale clienttunnel(s) geconfigureerd op deze desktop.",
"c2sPresetSyncNote": "Voorinstellingen zijn expliciete momentopnamen; het laden ervan vervangt de lokale lijst met clienttunnels van deze desktopclient.",
"c2sPresetSaved": "Voorinstelling voor clienttunnel opgeslagen",
"c2sPresetLoaded": "Client tunnel preset lokaal geladen",
"c2sPresetRenamed": "Client tunnel-voorinstelling hernoemd",
"c2sPresetDeleted": "Client tunnel-voorinstelling verwijderd",
"c2sPresetLoadError": "Het laden van de clienttunnelvoorinstellingen is mislukt."
},
"placeholders": {
"maxRetries": "3",
"retryInterval": "10",
"language": "Taal",
"keyPassword": "sleutel wachtwoord",
"pastePrivateKey": "Plak hier uw privésleutel...",
"localListenerHost": "127.0.0.1 (lokaal luisteren)",
"localTargetHost": "127.0.0.1 (doel op deze computer)",
"remoteTargetHost": "127.0.0.1 (doel van eindpunt)",
"remoteBindHost": "127.0.0.1 (luisteren op eindpunt)",
"socksListenerHost": "127.0.0.1 (SOCKS-luisteraar)",
"enterPassword": "Voer uw wachtwoord in",
"defaultPort": "22",
"defaultEndpointPort": "224"
},
"dashboard": {
"title": "Dashboard",
"loading": "Dashboard wordt geladen...",
"github": "GitHub",
"support": "Steun",
"discord": "Meningsverschil",
"docs": "Dokters",
"donate": "Doneer",
"serverOverview": "Serveroverzicht",
"version": "Versie",
"upToDate": "Actueel",
"updateAvailable": "Update beschikbaar",
"beta": "Beta",
"uptime": "Beschikbaarheid",
"database": "Database",
"healthy": "Gezond",
"error": "Fout",
"totalHosts": "Totaal aantal hosts",
"totalTunnels": "Totale tunnels",
"totalCredentials": "Totale referenties",
"recentActivity": "Recente activiteit",
"reset": "Reset",
"loadingRecentActivity": "Recente activiteit laden...",
"noRecentActivity": "Geen recente activiteit",
"quickActions": "Snelle acties",
"addHost": "Voeg een host toe",
"addCredential": "Voeg inloggegevens toe",
"adminSettings": "Beheerinstellingen",
"userProfile": "Gebruikersprofiel",
"serverStats": "Serverstatistieken",
"loadingServerStats": "Serverstatistieken worden geladen...",
"noServerData": "Geen servergegevens beschikbaar",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Dashboard aanpassen",
"dashboardSettings": "Dashboardinstellingen",
"enableDisableCards": "Kaarten in-/uitschakelen",
"resetLayout": "Terugzetten naar standaardinstellingen",
"serverOverviewCard": "Serveroverzicht",
"recentActivityCard": "Recente activiteit",
"networkGraphCard": "Netwerkgrafiek",
"networkGraph": "Netwerkgrafiek",
"quickActionsCard": "Snelle acties",
"serverStatsCard": "Serverstatistieken",
"panelMain": "Voornaamst",
"panelSide": "Kant",
"justNow": "zojuist",
"serviceLinks": "Servicelinks",
"homepagePreview": "Startpagina-voorbeeld"
},
"donation": {
"title": "Vind je Termix lekker?",
"body": "Termix is gratis en open source, ontwikkeld en onderhouden door een team van twee personen in hun vrije tijd. Als het een commerciële tool heeft vervangen waar je anders voor zou betalen, helpt een donatie om de hostingkosten te dekken en de ontwikkeling voort te zetten. Op dit moment accepteren we alleen donaties in cryptovaluta.",
"milestones": "Donaties helpen ook bij het financieren van de tijd die nodig is voor onderzoek en het leren van wat vereist is om functies zoals SAML- en Kubernetes-ondersteuning te ontwikkelen. Bekijk de voortgang op de donatiepagina.",
"cta": "Doneer",
"dismiss": "Misschien later"
},
"dashboardTab": {
"stable": "STABIEL",
"hostsOnline": "Hosts Online",
"activeTunnels": "Actieve tunnels",
"registerNewServer": "Een nieuwe server registreren",
"storeSshKeysOrPasswords": "Bewaar SSH-sleutels of -wachtwoorden",
"manageUsersAndRoles": "Gebruikers en rollen beheren",
"manageYourAccount": "Beheer uw account",
"hostStatus": "Hoststatus",
"noHostsConfigured": "Geen hosts geconfigureerd",
"online": "ONLINE",
"offline": "OFFLINE",
"checking": "CONTROLEREN",
"onlineLower": "Online",
"nodes": "{{count}} knooppunten",
"add": "Toevoegen:",
"commandPalette": "Commando-palet",
"done": "Klaar",
"editModeInstructions": "Sleep kaarten om de volgorde te wijzigen · Sleep de kolomscheidingslijn om de kolombreedte aan te passen · Sleep de onderrand van een kaart om de hoogte aan te passen · Verwijder kaarten uit de prullenbak",
"empty": "Leeg",
"clear": "Duidelijk",
"serviceLinksTitle": "Servicelinks",
"serviceLinksEmpty": "Er zijn nog geen servicelinks beschikbaar.",
"serviceLinksAddLabel": "Label",
"serviceLinksAddUrl": "URL",
"serviceLinksAdd": "Toevoegen",
"serviceLinksLabelPlaceholder": "Mijn Service",
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Voer een geldig webadres in.",
"serviceLinksAddFailed": "Het toevoegen van de servicelink is mislukt.",
"disk": "Schijf",
"viewServerDetails": "Servergegevens bekijken"
},
"sessionLogs": {
"title": "Sessielogboeken",
"noLogs": "Nog geen sessielogboeken",
"noLogsDesc": "Schakel sessielogging in op een host om te beginnen met opnemen.",
"duration": "Duur",
"viewLog": "Logboek bekijken",
"downloadLog": "Download",
"downloadAsText": "Downloaden als tekst",
"deleteLog": "Verwijderen",
"confirmDelete": "Dit sessielogboek verwijderen?",
"confirmDeleteDesc": "Deze actie kan niet ongedaan gemaakt worden.",
"copyContent": "Kopiëren",
"copied": "Gekopieerd!",
"loadError": "Het laden van de sessielogboeken is mislukt.",
"deleteError": "Het verwijderen van het sessielogboek is mislukt.",
"filterByHost": "Filteren op host..."
},
"networkGraph": {
"addHost": "Voeg een host toe",
"addGroup": "Groep toevoegen",
"addLink": "Link toevoegen",
"zoomIn": "Inzoomen",
"zoomOut": "Uitzoomen",
"resetView": "Weergave opnieuw instellen",
"selectHost": "Selecteer host",
"chooseHost": "Kies een host...",
"parentGroup": "Oudergroep",
"noGroup": "Geen groep",
"groupName": "Groepsnaam",
"color": "Kleur",
"source": "Bron",
"target": "Doel",
"moveToGroup": "Verplaatsen naar groep",
"selectGroup": "Selecteer groep...",
"addConnection": "Verbinding toevoegen",
"hostDetails": "Gegevens van de gastheer",
"removeFromGroup": "Verwijderen uit groep",
"addHostHere": "Voeg hier de host toe",
"editGroup": "Groep bewerken",
"delete": "Verwijderen",
"add": "Toevoegen",
"create": "Creëren",
"move": "Beweging",
"connect": "Verbinden",
"createGroup": "Groep aanmaken",
"selectSourcePlaceholder": "Selecteer bron...",
"selectTargetPlaceholder": "Doel selecteren...",
"invalidFile": "Ongeldig bestand",
"hostAlreadyExists": "De host bevindt zich al in de topologie.",
"connectionExists": "De verbinding bestaat al",
"unknown": "Onbekend",
"name": "Naam",
"ip": "IP",
"status": "Status",
"failedToAddNode": "Het toevoegen van het knooppunt is mislukt.",
"sourceDifferentFromTarget": "Bron en doel moeten verschillend zijn.",
"exportJSON": "Exporteer JSON",
"importJSON": "JSON importeren",
"terminal": "Terminal",
"fileManager": "Bestandsbeheerder",
"tunnel": "Tunnel",
"docker": "Docker",
"serverStats": "Hoststatistieken",
"hostMetrics": "Hoststatistieken",
"noNodes": "Nog geen knooppunten"
},
"docker": {
"notEnabled": "Docker is niet ingeschakeld voor deze host.",
"validating": "Docker valideren...",
"connecting": "Verbinden...",
"error": "Fout",
"version": "{{runtime}} {{version}}",
"connectionFailed": "Verbinding met Docker mislukt.",
"containerStarted": "Container {{name}} gestart",
"failedToStartContainer": "Het starten van de container is mislukt {{name}}",
"containerStopped": "Container {{name}} is gestopt",
"failedToStopContainer": "Het is niet gelukt om de container {{name}} te stoppen.",
"containerRestarted": "Container {{name}} opnieuw opgestart",
"failedToRestartContainer": "Het opnieuw opstarten van de container is mislukt {{name}}",
"containerPaused": "Container {{name}} gepauzeerd",
"containerUnpaused": "Container {{name}} is niet langer gepauzeerd",
"failedToTogglePauseContainer": "Het is niet gelukt om de pauzestatus voor container {{name}} te wijzigen.",
"containerRemoved": "Container {{name}} verwijderd",
"failedToRemoveContainer": "Het verwijderen van de container is mislukt {{name}}",
"image": "Afbeelding",
"ports": "Havens",
"noPorts": "Geen poorten",
"start": "Begin",
"confirmRemoveContainer": "Weet je zeker dat je de container '{{name}}' wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"runningContainerWarning": "Waarschuwing: Deze container is momenteel actief. Als u deze verwijdert, wordt de container eerst gestopt.",
"loadingContainers": "Containers laden...",
"manager": "Docker Manager",
"autoRefresh": "Automatisch vernieuwen",
"timestamps": "Tijdstempels",
"lines": "Lijnen",
"filterLogs": "Filterlogboeken...",
"refresh": "Vernieuwen",
"download": "Download",
"clear": "Duidelijk",
"logsDownloaded": "Logbestanden succesvol gedownload.",
"last50": "Laatste 50",
"last100": "Laatste 100",
"last500": "Laatste 500",
"last1000": "Laatste 1000",
"allLogs": "Alle logboeken",
"noLogsMatching": "Geen logbestanden gevonden die overeenkomen met \"{{query}}\"",
"noLogsAvailable": "Geen logbestanden beschikbaar",
"noContainersFound": "Geen containers gevonden",
"noContainersFoundHint": "Er zijn geen Docker-containers beschikbaar op deze host.",
"searchPlaceholder": "Containers doorzoeken...",
"allStatuses": "Alle statussen",
"stateRunning": "Rennen",
"statePaused": "Gepauzeerd",
"stateExited": "Uitgang",
"stateRestarting": "Opnieuw opstarten",
"noContainersMatchFilters": "Geen containers komen overeen met uw filters.",
"noContainersMatchFiltersHint": "Probeer je zoek- of filtercriteria aan te passen.",
"failedToFetchStats": "Het ophalen van containerstatistieken is mislukt.",
"containerNotRunning": "Container draait niet",
"startContainerToViewStats": "Start de container om de statistieken te bekijken.",
"loadingStats": "Statistieken laden...",
"errorLoadingStats": "Fout bij het laden van statistieken",
"noStatsAvailable": "Geen statistieken beschikbaar",
"cpuUsage": "CPU-gebruik",
"current": "Huidig",
"memoryUsage": "Geheugengebruik",
"networkIo": "Netwerk I/O",
"input": "Invoer",
"output": "Uitvoer",
"blockIo": "Blok I/O",
"read": "Lezen",
"write": "Schrijven",
"pids": "PID's",
"containerInformation": "Containerinformatie",
"name": "Naam",
"id": "ID",
"state": "Staat",
"containerMustBeRunning": "De container moet actief zijn om toegang te krijgen tot de console.",
"verificationCodePrompt": "Voer de verificatiecode in.",
"totpVerificationFailed": "TOTP-verificatie mislukt. Probeer het opnieuw.",
"warpgateVerificationFailed": "Authenticatie via Warpgate is mislukt. Probeer het opnieuw.",
"connectedTo": "Verbonden met {{containerName}}",
"disconnected": "Verbinding verbroken",
"consoleError": "Consolefout",
"errorMessage": "Fout: {{message}}",
"failedToConnect": "Verbinding met de container mislukt.",
"console": "Troosten",
"selectShell": "Selecteer shell",
"bash": "Knal",
"sh": "sh",
"ash": "as",
"connect": "Verbinden",
"disconnect": "Verbinding verbreken",
"notConnected": "Niet verbonden",
"clickToConnect": "Klik op 'Verbinden' om een shellsessie te starten.",
"connectingTo": "Verbinding maken met {{containerName}}...",
"containerNotFound": "Container niet gevonden",
"backToList": "Terug naar de lijst",
"logs": "Logboeken",
"stats": "Statistieken",
"consoleTab": "Troosten",
"startContainerToAccess": "Start de container om toegang te krijgen tot de console."
},
"admin": {
"sectionGeneral": "Algemeen",
"sectionOidc": "OIDC",
"sectionSso": "SSO-providers",
"ssoAddProvider": "Aanbieder toevoegen",
"ssoDocsLink": "Documenten bekijken",
"ssoProviderDocsLink": "Documenten bekijken",
"ssoNoProviders": "Er zijn geen SSO-providers geconfigureerd.",
"ssoProviderName": "Weergavenaam",
"ssoProviderType": "Aanbiedertype",
"ssoDeleteProvider": "Provider verwijderen",
"ssoDeleteConfirm": "Deze provider verwijderen? Gekoppelde gebruikers kunnen dan niet meer inloggen.",
"ssoTypeOidc": "OIDC",
"ssoTypeLdap": "LDAP",
"ssoTypeGithub": "GitHub",
"ssoTypeGoogle": "Google",
"ssoEnabled": "Ingeschakeld",
"ssoDisabled": "Gehandicapt",
"ssoSaveProvider": "Aanbieder opslaan",
"ssoTestConnection": "Testverbinding",
"ssoEditProvider": "Bewerk provider",
"ldapHost": "LDAP-host",
"ldapPort": "Haven",
"ldapUseTls": "Gebruik TLS (LDAPS)",
"ldapBindDn": "Bind DN",
"ldapBindPassword": "Bind wachtwoord",
"ldapUserSearchBase": "Gebruikerszoekbasis",
"ldapUserSearchFilter": "Gebruikerszoekfilter",
"ldapUsernameAttr": "Gebruikersnaamkenmerk",
"ldapDisplayNameAttr": "Weergavenaamkenmerk",
"ldapGroupSearchBase": "Groepszoekbasis",
"ldapAdminGroup": "Beheerdersgroep",
"ldapAllowedUsers": "Toegestane gebruikers",
"sectionUsers": "Gebruikers",
"sectionSessions": "Sessies",
"sectionRoles": "Rollen",
"sectionDatabase": "Database",
"sectionApiKeys": "API-sleutels",
"sectionAuditLog": "Auditlogboek",
"sectionSsl": "SSL / Let's Encrypt",
"sectionTouchInput": "Aanraakinvoer",
"touchEnabled": "Aanraakinvoer inschakelen",
"touchEnabledDesc": "Schakel scrollen met één vinger in op terminals in.",
"touchMomentumEnabled": "Activeer momentum",
"touchMomentumEnabledDesc": "Scroll nog even kort verder na een veegbeweging.",
"touchAdvanced": "Geavanceerd",
"touchDragThreshold": "Sleepdrempel",
"touchMaxWheelDelta": "Maximale wieldelta",
"touchMomentumSampleWindow": "Momentum-steekproefvenster",
"touchReleaseGracePeriod": "Vrijlatingstermijn",
"touchMinimumVelocity": "Minimale snelheid",
"touchMaximumVelocity": "Maximale snelheid",
"touchMaximumDuration": "Maximale duur",
"touchMaximumTravel": "Maximale reis",
"touchDecayTime": "Vervaltijd",
"touchPixelsPerTick": "Pixels per tik",
"touchMaximumFrameInterval": "Maximale frame-interval",
"touchMaximumTicksPerFrame": "Maximaal aantal ticks per frame",
"touchResetDefaults": "Terugzetten naar standaardinstellingen",
"touchSaved": "Aanraakinvoerinstellingen opgeslagen",
"touchSaveFailed": "Het opslaan van de aanraakinvoerinstellingen is mislukt.",
"sectionImageStorage": "Afbeeldingsopslag",
"imageStorageMode": "Opslagmodus",
"imageStorageModeDesc": "Hier worden geplakte en geüploade terminalafbeeldingen opgeslagen. Automatische selectie op basis van de verbinding, lokaal en extern (SFTP) zijn vastgelegd.",
"imageStorageModeAuto": "Auto",
"imageStorageModeLocal": "Lokaal",
"imageStorageModeRemoteSftp": "Op afstand (SFTP)",
"imageStorageLocalDir": "Lokale map",
"imageStorageLocalDirDesc": "Het absolute pad in de Termix-backend. Wordt na het opslaan om veiligheidsredenen niet weergegeven.",
"imageStorageLocalDirPlaceholder": "Laat dit veld leeg om de huidige pagina te behouden.",
"imageStorageHostPath": "Hostpad",
"imageStorageHostPathDesc": "De weergave aan de hostzijde van de lokale directory die terminalagents ontvangen.",
"imageStorageTtl": "TTL (ms)",
"imageStorageMaxCount": "Maximaal aantal afbeeldingen",
"imageStorageMaxBytes": "Maximale opslagcapaciteit in bytes",
"imageStorageSaved": "Instellingen voor beeldopslag opgeslagen",
"imageStorageSaveFailed": "Het opslaan van de instellingen voor beeldopslag is mislukt.",
"imageStorageInstanceId": "Terminal sessie instantie-ID",
"imageStorageInstanceIdDesc": "Instantie-ID van een van uw verbonden terminaltabbladen, gebruikt om de zichtbaarheid te testen.",
"imageStorageInstanceIdRequired": "Voer eerst een instantie-ID van een terminalsessie in.",
"imageStorageTest": "Test",
"imageStorageTesting": "Testen...",
"imageStorageTestFailed": "Het testen van de beeldopslag is mislukt.",
"imageStorageTestConnected": "De terminalsessie is verbonden.",
"imageStorageTestNotConnected": "Er is geen verbonden terminalsessie met deze instantie-ID.",
"imageStorageTestSelectedMode": "Een upload zou het volgende gebruiken: {{mode}}",
"imageStorageSelectedModeUnavailable": "Niet beschikbaar",
"imageStorageTestLocalVisible": "De lokale map is zichtbaar vanaf de verbonden host.",
"imageStorageTestLocalNotVisible": "De lokale map is NIET zichtbaar vanaf de verbonden host.",
"sectionBranding": "White Label",
"brandingAppName": "Applicatienaam",
"brandingAppNameDesc": "Weergegeven op het inlogscherm en in het browsertabblad. Laat dit veld leeg om \"Termix\" te gebruiken.",
"brandingTagline": "Slogan",
"brandingTaglineDesc": "Wordt weergegeven onder de applicatienaam op het inlogscherm. Laat dit veld leeg om de standaard slogan te gebruiken.",
"brandingLogo": "Logo",
"brandingLogoDesc": "PNG, JPEG of WEBP, tot 750 KB. Vervangt het standaardpictogram op het inlogscherm en in het browsertabblad.",
"brandingLogoUpload": "Logo uploaden",
"brandingLogoReset": "Terugzetten naar standaardinstellingen",
"brandingLogoInvalid": "Ongeldige afbeelding. Gebruik een PNG-, JPEG- of WEBP-bestand van maximaal 750 KB.",
"brandingSaved": "Merkinstellingen opgeslagen",
"brandingSaveFailed": "Het opslaan van de merkinstellingen is mislukt.",
"sslDescription": "Automatisch een vertrouwd SSL-certificaat van Let's Encrypt aanvragen en verlengen. Vereist een publiek domein en toegang tot poort 80 of DNS.",
"sslDocsLink": "Bekijk de SSL-documentatie",
"sslDomain": "Domein",
"sslDomainPlaceholder": "termix.example.com",
"sslDomainDesc": "De publieke domeinnaam voor het certificaat.",
"sslEmail": "E-mail",
"sslEmailPlaceholder": "admin@example.com",
"sslEmailDesc": "Contact-e-mailadres voor Let's Encrypt-meldingen en accountinformatie.",
"sslChallengeType": "Uitdagingstype",
"sslChallengeTypeDesc": "Hoe bewijs je domeineigendom aan Let's Encrypt?",
"sslChallengeHttp": "HTTP (webroot) - vereist poort 80 die toegankelijk is vanaf internet.",
"sslChallengeDns": "DNS (Cloudflare) - vereist een Cloudflare API-token",
"sslCloudflareToken": "Cloudflare API-token",
"sslCloudflareTokenPlaceholder": "Voer token in...",
"sslCloudflareTokenDesc": "Een scoped token met Zone:DNS:Edit-machtiging voor uw domein.",
"sslCertStatus": "Certificaatstatus",
"sslCertStatusNone": "Geen certificaat",
"sslCertStatusValid": "Geldig",
"sslCertStatusExpiring": "Verloopt binnenkort",
"sslCertStatusExpired": "Verlopen",
"sslCertExpiresAt": "Verloopt {{date}}",
"sslLastIssued": "Laatst uitgegeven {{date}}",
"sslRequestCert": "Certificaat aanvragen/verlengen",
"sslRequestCertLoading": "Certificaat aanvragen...",
"sslRequestCertSuccess": "Certificaat uitgegeven en succesvol geïnstalleerd",
"sslRequestCertFailed": "Certificaatverzoek mislukt",
"sslSave": "Instellingen opslaan",
"sslSaved": "SSL-instellingen opgeslagen",
"sslSaveFailed": "Het opslaan van de SSL-instellingen is mislukt.",
"sslRequiresDomain": "Domein en e-mailadres zijn verplicht.",
"sslInfoNote": "Na het uitgeven of uploaden van een certificaat zal Termix automatisch HTTPS inschakelen op SSL_PORT (standaard 8443) naast de bestaande HTTP-poort. Zorg ervoor dat deze poort is gepubliceerd/toegewezen aan deze container, zodat deze bereikbaar is.",
"sslManualOption": "Handmatig (certificaat uploaden)",
"sslManualCert": "Certificaat (PEM)",
"sslManualCertPlaceholder": "-----BEGIN CERTIFICAAT-----",
"sslManualKey": "Privésleutel (PEM)",
"sslManualKeyPlaceholder": "-----BEGIN PRIVÉSLEUTEL-----",
"sslManualDesc": "Plak hier uw bestaande certificaat en privésleutel, inclusief de volledige certificaatketen indien vereist door uw certificeringsinstantie.",
"sslManualUpload": "Certificaat uploaden en installeren",
"sslManualUploadLoading": "Certificaat uploaden...",
"sslManualUploadSuccess": "Certificaat succesvol geüpload en geïnstalleerd",
"sslManualUploadFailed": "Het uploaden van het certificaat is mislukt.",
"sslManualRequiresFields": "Certificaat en privésleutel vereist.",
"auditLogTotal": "{{total}} totaal aantal vermeldingen",
"auditLogEmpty": "Geen auditlogboekvermeldingen gevonden",
"auditLogSuccess": "Succes",
"auditLogFailed": "Mislukt",
"auditLogClearFilters": "Filters wissen",
"auditLogPage": "Pagina {{page}} van {{totalPages}} ({{total}} totaal)",
"auditLogIp": "IP",
"auditLogResourceId": "Resource-ID",
"auditLogFilterUser": "Gebruiker",
"auditLogFilterAction": "Actie",
"auditLogFilterResourceType": "Brontype",
"auditLogFilterStatus": "Status",
"auditLogFilterFrom": "Van",
"auditLogFilterTo": "Naar",
"auditLogFilterAll": "Alle",
"allowRegistration": "Gebruikersregistratie toestaan",
"allowRegistrationDesc": "Laat nieuwe gebruikers zich zelf registreren met een gebruikersnaam en wachtwoord.",
"allowPasswordLogin": "Wachtwoordaanmelding toestaan",
"allowPasswordLoginDesc": "Inloggen met gebruikersnaam/wachtwoord",
"oidcAutoProvision": "OIDC-automatische provisionering",
"oidcAutoProvisionDesc": "Automatisch accounts aanmaken voor OIDC/SSO-gebruikers bij de eerste aanmelding (onafhankelijk van de registratie-optie).",
"oidcSilentLoginDefault": "Standaard stille OIDC-aanmelding",
"oidcSilentLoginDefaultDesc": "Automatisch doorverwijzen naar de OIDC-inlogpagina bij elk bezoek, waarbij het inlogformulier volledig wordt overgeslagen.",
"oidcSilentLoginDefaultLockedDesc": "Deze instelling is vergrendeld door de omgevingsvariabele OIDC_SILENT_LOGIN_DEFAULT en kan hier niet worden gewijzigd.",
"allowPasswordReset": "Wachtwoordherstel toestaan",
"allowPasswordResetDesc": "Resetcode via Docker-logs",
"commandHistoryEnabled": "Commandogeschiedenis",
"commandHistoryEnabledDesc": "Sta het vastleggen van de opdrachtgeschiedenis toe. Indien uitgeschakeld, wordt de geschiedenis niet opgeslagen, ongeacht de instellingen per host.",
"updateCommandHistoryFailed": "Het bijwerken van de instelling voor de opdrachtgeschiedenis is mislukt.",
"analyticsEnabled": "Deel anonieme gebruiksstatistieken",
"analyticsEnabledDesc": "Verstuurt dagelijks anoniem een telling van gebruikers, hosts en functiegebruik om Termix te verbeteren. Er worden nooit persoonlijke gegevens of verbindingsdetails meegestuurd.",
"analyticsEnabledLockedDesc": "Deze instelling is vergrendeld door de omgevingsvariabele ENABLE_TELEMETRY en kan hier niet worden gewijzigd.",
"updateAnalyticsFailed": "Het bijwerken van de analyse-instellingen is mislukt.",
"sessionSharingGloballyEnabled": "Sessiedeling toestaan",
"auditForwardingTitle": "Doorsturen naar SIEM",
"auditForwardingDesc": "Verzend een kopie van elke auditlogboekvermelding naar een externe verzamelaar als NDJSON-bestand. Lokale logbestanden blijven de bron van waarheid.",
"auditForwardingEnvNotice": "Een omgevingsvariabele configureert ook het doorsturen; de URL die hier is opgeslagen, heeft voorrang.",
"auditForwardingToken": "Token aan toonder (optioneel)",
"auditForwardingTokenStored": "Token met houder (opgeslagen)",
"auditForwardingSaved": "Audit-doorstuurinstellingen opgeslagen",
"auditForwardingSaveError": "Het opslaan van de instellingen voor het doorsturen van auditlogboeken is mislukt.",
"sessionSharingGloballyEnabledDesc": "Sta toe dat live terminal-, RDP-, VNC- en Telnet-sessies instantiebreed worden gedeeld. Deze functie overschrijft elke instelling voor delen per host wanneer deze is uitgeschakeld.",
"updateSessionSharingFailed": "Het bijwerken van de instelling voor het delen van sessies is mislukt.",
"sessionTimeout": "Sessietime-out",
"hours": "uren",
"sessionTimeoutRange": "Minimaal 1 uur · Maximaal 720 uur",
"monitoringDefaults": "Standaardinstellingen bewaken",
"statusCheck": "Statuscontrole",
"metrics": "Statistieken",
"sec": "sec",
"logLevel": "Logniveau",
"enableGuacamole": "Schakel Guacamole in",
"enableGuacamoleDesc": "RDP/VNC-extern bureaublad",
"enableGuacamoleDocsLink": "Documenten bekijken",
"guacdUrl": "guacd URL",
"tailscaleApiKey": "Tailscale API-sleutel",
"tailscaleApiKeyDescription": "Wordt gebruikt voor apparaatdetectie in de hosteditor. Ondersteunt Tailscale (tskey-) en Headscale (hskey-) sleutels. Genereer een sleutel op tailscale.com/admin/settings/keys of vanuit uw Headscale-instantie.",
"tailscaleApiKeyDocsLink": "Documenten bekijken",
"tailscaleApiBaseUrl": "API-basis-URL",
"tailscaleApiBaseUrlDescription": "Optioneel. Verwijs naar een zelfgehoste Headscale-instantie in plaats van api.tailscale.com. Laat dit veld leeg om de standaard Tailscale-instantie te gebruiken.",
"oidcDescription": "Configureer OpenID Connect voor SSO. Velden gemarkeerd met een * zijn verplicht.",
"oidcDocsLink": "Documenten bekijken",
"oidcClientId": "Klant-ID",
"oidcClientSecret": "Klantgeheim",
"oidcAuthUrl": "Autorisatie-URL",
"oidcIssuerUrl": "URL van de uitgever",
"oidcTokenUrl": "Token-URL",
"oidcUserIdentifier": "Gebruikersidentificatiepad",
"oidcDisplayName": "Weergavenaam Pad",
"oidcScopes": "Scopes",
"oidcUserinfoUrl": "Gebruikersinfo-URL overschrijven",
"oidcAllowedUsers": "Toegestane gebruikers",
"oidcAllowedUsersDesc": "Eén e-mailadres per regel. Laat dit veld leeg om alle e-mailadressen toe te staan.",
"oidcAdminGroup": "Beheerdersgroep",
"oidcAdminGroupDesc": "Gebruikers in deze groep hebben beheerdersrechten. Laat dit veld leeg om groepssynchronisatie uit te schakelen.",
"oidcGroupClaim": "Groepsclaim",
"oidcGroupClaimDesc": "Optioneel. Het pad naar de claim dat de groepen van de gebruiker bevat. Standaard is dit: groepen, rollen, vervolgens groep. Gebruik dit voor providers met een aangepaste claim (bijv. Zitadel).",
"oidcCaCert": "Aangepast CA-certificaat",
"oidcCaCertDesc": "Optioneel. PEM-gecodeerd CA-certificaat voor OIDC-providers die gebruikmaken van een privé- of zelfondertekende CA. Laat dit veld leeg om het systeemvertrouwensarchief te gebruiken.",
"removeOidc": "Verwijderen",
"usersCount": "{{count}} gebruikers",
"searchUsers": "Gebruikers doorzoeken...",
"noUsers": "Geen gebruikers",
"noUsersMatch": "Er zijn geen gebruikers gevonden die aan uw zoekcriteria voldoen.",
"pageOf": "Pagina {{page}} van {{total}}",
"createUser": "Creëren",
"newRole": "Nieuwe rol",
"roleName": "Naam",
"roleDisplayName": "Weergavenaam",
"roleDescription": "Beschrijving",
"rolesCount": "{{count}} rollen",
"createRole": "Creëren",
"creating": "Aan het creëren...",
"exportDatabase": "Exporteer database",
"exportDatabaseDesc": "Download een draagbare SQLite-back-up van alle hosts, inloggegevens en instellingen.",
"export": "Exporteren",
"exporting": "Exporteren...",
"importDatabase": "Importeer database",
"importDatabaseDesc": "Herstel vanuit een draagbare .sqlite-back-up op elke databasebackend.",
"importDatabaseSelected": "Geselecteerd: {{name}}",
"selectFile": "Selecteer bestand",
"changeFile": "Wijziging",
"import": "Importeren",
"importing": "Importeren...",
"apiKeysCount": "{{count}} sleutels",
"apiKeysDocsLink": "Documenten bekijken",
"apiKeysCliHint": "Gebruik een API-sleutel met de Termix CLI om servers vanuit je terminal te beheren.",
"apiKeysCliLink": "Bekijk de CLI-documentatie",
"newApiKey": "Nieuwe API-sleutel",
"apiKeyCreatedWarning": "Sleutel aangemaakt - kopieer hem nu, hij wordt niet meer weergegeven.",
"apiKeyName": "Naam",
"apiKeyUser": "Gebruiker",
"apiKeySelectUser": "Selecteer een gebruiker...",
"apiKeyExpiresAt": "Verloopt op",
"createKey": "Sleutel aanmaken",
"apiKeyNoExpiry": "Geen vervaldatum",
"revokedBadge": "INGETROKKEN",
"authTypeDual": "Dubbele authenticatie",
"authTypeOidc": "OIDC",
"authTypeLocal": "Lokaal",
"adminStatusAdministrator": "Beheerder",
"adminStatusRegularUser": "Regelmatige gebruiker",
"adminBadge": "ADMINISTRATIE",
"systemBadge": "SYS",
"customBadge": "AANGEPAST",
"youBadge": "JIJ",
"sessionsActive": "{{count}} actief",
"sessionActive": "Actief: {{time}}",
"sessionExpires": "Exp: {{time}}",
"revokeAll": "Alle",
"revokeAllSessionsSuccess": "Alle sessies voor gebruiker ingetrokken",
"revokeAllSessionsFailed": "Sessies konden niet worden ingetrokken.",
"revokeSessionFailed": "Sessie kon niet worden ingetrokken",
"addRole": "Rol toevoegen",
"noCustomRoles": "Geen aangepaste rollen gedefinieerd",
"removeRoleFailed": "Het verwijderen van de rol is mislukt.",
"assignRoleFailed": "Het toewijzen van een rol is mislukt.",
"deleteRoleFailed": "Het verwijderen van de rol is mislukt.",
"userAdminAccess": "Beheerder",
"userAdminAccessDesc": "Volledige toegang tot alle beheerdersinstellingen",
"userRoles": "Rollen",
"revokeAllUserSessions": "Alle sessies intrekken",
"revokeAllUserSessionsDesc": "Forceer opnieuw inloggen op alle apparaten",
"revoke": "Herroepen",
"deleteUserWarning": "Het verwijderen van deze gebruiker is permanent.",
"deleteUser": "Verwijderen {{username}}",
"deleting": "Verwijderen...",
"deleteUserFailed": "Het verwijderen van de gebruiker is mislukt.",
"deleteUserSuccess": "Gebruiker \"{{username}}\" verwijderd",
"deleteRoleSuccess": "Rol \"{{name}}\" verwijderd",
"revokeKeySuccess": "Sleutel \"{{name}}\" ingetrokken",
"revokeKeyFailed": "Sleutel intrekken mislukt",
"copiedToClipboard": "Gekopieerd naar het klembord",
"done": "Klaar",
"createUserTitle": "Gebruiker aanmaken",
"createUserDesc": "Maak een nieuw lokaal account aan.",
"createUserUsername": "Gebruikersnaam",
"createUserPassword": "Wachtwoord",
"createUserPasswordHint": "Minimaal 6 tekens.",
"createUserEnterUsername": "Voer gebruikersnaam in",
"createUserEnterPassword": "Voer wachtwoord in",
"createUserSubmit": "Gebruiker aanmaken",
"editUserTitle": "Gebruiker beheren: {{username}}",
"editUserDesc": "Bewerk rollen, beheerdersstatus, sessies en accountinstellingen.",
"editUserUsername": "Gebruikersnaam",
"editUserAuthType": "Auth-type",
"editUserAdminStatus": "Beheerdersstatus",
"editUserUserId": "Gebruikers-ID",
"linkAccountTitle": "Accounts koppelen",
"linkAccountDesc": "Voeg het OIDC-account {{username}} samen met een bestaand lokaal account.",
"linkAccountDescLocal": "Koppel een lokaal account {{username}} aan een bestaand OIDC-only account.",
"linkAccountWarningTitle": "Dit zal:",
"linkAccountEffect1": "Verwijder het OIDC-only account.",
"linkAccountEffect2": "Voeg OIDC-aanmelding toe aan het doelaccount.",
"linkAccountEffect3": "Sta zowel OIDC- als wachtwoordaanmelding toe.",
"linkAccountTargetUsername": "Lokale accountgebruikersnaam",
"linkAccountTargetPlaceholder": "Voer de gebruikersnaam van het lokale account in om te koppelen.",
"linkAccountOidcUsername": "OIDC-account gebruikersnaam",
"linkAccountOidcPlaceholder": "Voer de gebruikersnaam van het OIDC-account in om samen te voegen.",
"linkAccountOidcNotFound": "Er is geen OIDC-only account gevonden met die gebruikersnaam.",
"linkAccounts": "Accounts koppelen",
"linkAccountSuccess": "Accounts succesvol gekoppeld",
"linkAccountFailed": "Het koppelen van accounts is mislukt.",
"linkAccountInProgress": "Koppelen...",
"unlinkAccountTitle": "Ontkoppel OIDC",
"unlinkAccountDesc": "Verwijder OIDC-authenticatie van {{username}}. Ze kunnen dan alleen nog inloggen met hun wachtwoord.",
"unlinkAccountWarning": "Hiermee wordt de OIDC-aanmelding voor dit account verwijderd. De gebruiker moet een wachtwoord hebben ingesteld om te kunnen blijven inloggen.",
"unlinkAccount": "Ontkoppel OIDC",
"unlinkAccountInProgress": "Ontkoppelen...",
"unlinkAccountSuccess": "OIDC is succesvol ontkoppeld.",
"unlinkAccountFailed": "Het ontkoppelen van OIDC is mislukt.",
"saving": "Besparing...",
"updateRegistrationFailed": "Het bijwerken van de registratie-instellingen is mislukt.",
"updatePasswordLoginFailed": "Het bijwerken van de wachtwoordinstellingen is mislukt.",
"cannotDisablePasswordLoginWithTotp": "Het is niet mogelijk om wachtwoordaanmelding uit te schakelen wanneer tweefactorauthenticatie (2FA) is ingeschakeld voor een of meer gebruikers. Schakel eerst 2FA uit.",
"updateOidcAutoProvisionFailed": "Het bijwerken van de OIDC-automatische provisioneringsinstelling is mislukt.",
"updateOidcSilentLoginDefaultFailed": "Het bijwerken van de instelling voor stille OIDC-aanmelding is mislukt.",
"updatePasswordResetFailed": "Het bijwerken van de instellingen voor het opnieuw instellen van het wachtwoord is mislukt.",
"sessionTimeoutRange2": "De sessietime-out moet tussen 1 en 720 uur liggen.",
"sessionTimeoutSaved": "Sessietime-out opgeslagen",
"sessionTimeoutSaveFailed": "Het opslaan van de sessie is mislukt.",
"monitoringIntervalInvalid": "Ongeldige intervalwaarden",
"monitoringSaved": "Bewakingsinstellingen opgeslagen",
"monitoringSaveFailed": "Het opslaan van de bewakingsinstellingen is mislukt.",
"metricsHistoryRetention": "Historische statistieken bewaren",
"metricsHistoryRetentionRange": "1 tot 90 dagen",
"days": "dagen",
"guacamoleSaved": "Guacamole-instellingen opgeslagen",
"guacamoleSaveFailed": "Het opslaan van de Guacamole-instellingen is mislukt.",
"guacamoleUpdateFailed": "Het bijwerken van de Guacamole-instellingen is mislukt.",
"tailscaleSettingsSaved": "Staartschaalinstellingen opgeslagen",
"tailscaleSettingsSaveFailed": "Het opslaan van de Tailscale-instellingen is mislukt.",
"logLevelUpdateFailed": "Het bijwerken van het logniveau is mislukt.",
"oidcSaved": "OIDC-configuratie opgeslagen",
"oidcSaveFailed": "Het opslaan van de OIDC-configuratie is mislukt.",
"oidcRemoved": "OIDC-configuratie verwijderd",
"oidcRemoveFailed": "Het verwijderen van de OIDC-configuratie is mislukt.",
"createUserRequired": "Gebruikersnaam en wachtwoord zijn vereist.",
"createUserPasswordTooShort": "Het wachtwoord moet minimaal 6 tekens lang zijn.",
"createUserSuccess": "Gebruiker \"{{username}}\" heeft gemaakt",
"createUserFailed": "Het aanmaken van een gebruiker is mislukt.",
"updateAdminStatusFailed": "Het bijwerken van de beheerdersstatus is mislukt.",
"allSessionsRevoked": "Alle sessies zijn ingetrokken.",
"revokeSessionsFailed": "Sessies konden niet worden ingetrokken.",
"manageUserData": "Gebruikersgegevens beheren",
"backToUsers": "Terug naar gebruikers",
"manageTabAccount": "Rekening",
"manageTabHosts": "Gastheren",
"manageTabCredentials": "Referenties",
"manageTabSnippets": "Fragmenten",
"manageTabSessions": "Sessies",
"manageTabDanger": "Gevaar",
"manageEditorBack": "Terug naar de gegevens van {{username}}",
"dataLockedBadge": "VERGRENDELD",
"dataLockedNotice": "De gegevens van {{username}}blijven vergrendeld tot de volgende keer dat ze inloggen. Hun hosts, inloggegevens en codefragmenten kunnen tot die tijd niet worden bekeken of bewerkt.",
"resetPasswordTitle": "Wachtwoord opnieuw instellen",
"resetPasswordOidcOnly": "Deze gebruiker meldt zich aan via een externe provider en heeft geen wachtwoord.",
"resetPasswordPlaceholder": "Nieuw wachtwoord",
"resetPasswordBtn": "Reset",
"resetPasswordWorking": "Opnieuw instellen...",
"resetPasswordSuccess": "Wachtwoord opnieuw instellen",
"resetPasswordSuccessWiped": "Wachtwoord gereset. De versleutelde gegevens van de gebruiker zijn gewist.",
"resetPasswordFailed": "Wachtwoord opnieuw instellen mislukt",
"resetPasswordConfirmWipe": "{{username}} heeft niet meer ingelogd sinds de upgrade van de encryptie, waardoor hun gegevens niet kunnen worden hersteld. Door nu opnieuw in te stellen, worden hun hosts, inloggegevens en codefragmenten verwijderd. Doorgaan?",
"totpSectionTitle": "Tweefactorauthenticatie",
"totpStatusEnabled": "TOTP is ingeschakeld voor deze gebruiker.",
"totpStatusDisabled": "TOTP is niet ingeschakeld voor deze gebruiker.",
"disableTotp": "Uitzetten",
"disableTotpConfirm": "Schakel tweefactorauthenticatie uit voor {{username}}? Zij kunnen dan inloggen met alleen hun wachtwoord.",
"totpDisabledSuccess": "TOTP uitgeschakeld",
"totpDisableFailed": "TOTP uitschakelen is mislukt.",
"manageApiKeys": "API-sleutels",
"apiKeyNamePlaceholder": "Sleutelnaam",
"apiKeyCopyNotice": "Kopieer deze sleutel nu, hij wordt niet meer weergegeven.",
"noApiKeysForUser": "Geen API-sleutels",
"apiKeyDeleteFailed": "Het verwijderen van de API-sleutel is mislukt.",
"exportUserData": "Gegevens exporteren",
"exportUserDataDesc": "Download de hosts, inloggegevens en bestandsbeheergegevens van deze gebruiker als JSON. Geheimen zijn gedecodeerd.",
"exportUserDataSuccess": "Gebruikersgegevens geëxporteerd",
"exportUserDataFailed": "Exporteren van gebruikersgegevens is mislukt.",
"hostsCount": "{{count}} hosts",
"addHostForUser": "Voeg een host toe",
"noHostsForUser": "Deze gebruiker heeft geen hosts.",
"connectToHost": "Verbinden",
"deleteHostConfirm": "Host \"{{name}}\" verwijderen die bij {{username}} hoort?",
"hostDeletedSuccess": "Host verwijderd",
"hostDeleteFailed": "Het verwijderen van de host is mislukt.",
"credentialsCount": "{{count}} inloggegevens",
"addCredentialForUser": "Voeg inloggegevens toe",
"noCredentialsForUser": "Deze gebruiker heeft geen inloggegevens.",
"deleteCredentialConfirm": "Verwijder de inloggegevens \"{{name}}\" die bij {{username}} horen.",
"credentialDeletedSuccess": "Inloggegevens verwijderd",
"credentialDeleteFailed": "Het verwijderen van de inloggegevens is mislukt.",
"snippetsCount": "{{count}} fragmenten",
"addSnippetForUser": "Voeg codefragment toe",
"noSnippetsForUser": "Deze gebruiker heeft geen codefragmenten.",
"snippetRequiredFields": "De naam en inhoud van het codefragment zijn verplicht.",
"snippetNamePlaceholder": "Fragmentnaam",
"snippetContentPlaceholder": "Opdrachtinhoud",
"snippetFolderPlaceholder": "Map (optioneel)",
"snippetSaved": "Fragment opgeslagen",
"snippetSaveFailed": "Het opslaan van het codefragment is mislukt.",
"deleteSnippetConfirm": "Verwijder het fragment \"{{name}}\" dat bij {{username}} hoort.",
"snippetDeletedSuccess": "Fragment verwijderd",
"snippetDeleteFailed": "Het verwijderen van het fragment is mislukt.",
"noSessionsForUser": "Geen actieve sessies",
"deleteSuccessorLabel": "Geef de hosts en inloggegevens door aan",
"deleteSuccessorMe": "Ik (de beheerder die de verwijdering uitvoert)",
"deleteSuccessorNone": "Niemand — verwijder ze",
"deleteSuccessorDesc": "Alles wat deze gebruiker heeft gedeeld, blijft werken onder de nieuwe eigenaar; door 'niemand' te kiezen, worden hun hosts, inloggegevens en gedeelde bestanden verwijderd.",
"deleteUserDangerDesc": "Verwijder {{username}} en alle bijbehorende gegevens (hosts, inloggegevens, codefragmenten, geschiedenis) permanent. Deze actie kan niet ongedaan worden gemaakt.",
"deleteUserConfirm": "Wil je {{username}} en al hun gegevens permanent verwijderen?",
"deleteUserAdminBlocked": "Verwijder de beheerdersstatus voordat u deze gebruiker verwijdert.",
"createRoleRequired": "Naam en weergavenaam zijn verplicht.",
"createRoleSuccess": "Rol \"{{name}}\" aangemaakt",
"createRoleFailed": "Het aanmaken van de rol is mislukt.",
"apiKeyNameRequired": "Sleutelnaam is vereist",
"apiKeyUserRequired": "Gebruikers-ID is vereist",
"apiKeyCreatedSuccess": "API-sleutel \"{{name}}\" aangemaakt",
"apiKeyCreateFailed": "Het aanmaken van de API-sleutel is mislukt.",
"exportSuccess": "Database succesvol geëxporteerd",
"exportFailed": "Database-export mislukt",
"importSelectFile": "Selecteer eerst een bestand.",
"importCompleted": "Import voltooid: {{total}} items geïmporteerd, {{skipped}} overgeslagen",
"importFailed": "Import mislukt: {{error}}",
"importError": "Database-import mislukt",
"sectionHostDefaults": "Hoststandaarden",
"hostDefaultsDesc": "Instellingen worden automatisch toegepast bij het aanmaken van een nieuwe host. Individuele hosts kunnen deze instellingen echter nog steeds overschrijven.",
"hostDefaultsSocks5": "SOCKS5-proxy",
"hostDefaultsUseSocks5": "SOCKS5-proxy inschakelen",
"hostDefaultsUseSocks5Desc": "Vul de SOCKS5-proxy vooraf in op alle nieuwe hosts.",
"hostDefaultsSocks5Host": "Proxy-host / poort",
"hostDefaultsSocks5Username": "Proxy-gebruikersnaam",
"hostDefaultsSocks5Password": "Proxy-wachtwoord",
"hostDefaultsMetrics": "Hoststatistieken",
"hostDefaultsMetricsEnabled": "Statistieken inschakelen",
"hostDefaultsMetricsEnabledDesc": "Verzamel standaard CPU-, geheugen- en andere statistieken van nieuwe hosts.",
"hostDefaultsStatusCheckEnabled": "Statuscontrole inschakelen",
"hostDefaultsStatusCheckEnabledDesc": "Controleer standaard de online/offline-status van nieuwe hosts.",
"hostDefaultsTerminal": "Terminal",
"hostDefaultsAutoTmux": "Auto-Tmux",
"hostDefaultsAutoTmuxDesc": "Start de terminals van nieuwe hosts binnen tmux, zodat sessies behouden blijven bij verbroken verbindingen (tmux moet op de host geïnstalleerd zijn).",
"terminalSessionTimeout": "Terminalsessiepersistentie",
"terminalSessionTimeoutDesc": "Hoe lang een losgekoppelde terminal actief blijft op de server voordat deze wordt gesloten. Min. 1 · Max. 1440 minuten. Voor sessies die langer dan deze tijd actief moeten blijven, schakelt u Auto-Tmux in op de host.",
"terminalSessionTimeoutRange": "Voer een waarde in tussen 1 en 1440 minuten.",
"terminalSessionTimeoutSaved": "De persistentie van de terminalsessie is opgeslagen.",
"terminalSessionTimeoutSaveFailed": "Het opslaan van de persistentie van de terminalsessie is mislukt.",
"minutes": "notulen",
"hostDefaultsSessionLogging": "Sessieregistratie",
"hostDefaultsSessionLoggingDesc": "Terminalsessies op nieuwe hosts standaard vastleggen",
"hostDefaultsCommandHistory": "Commandogeschiedenis",
"hostDefaultsCommandHistoryDesc": "Volg standaard de opdrachtgeschiedenis op nieuwe hosts.",
"hostDefaultsSaved": "Host-standaardinstellingen opgeslagen",
"hostDefaultsSaveFailed": "Het opslaan van de hoststandaardinstellingen is mislukt.",
"rolePermissions": {
"count": "{{count}} machtigingen",
"editAction": "Machtigingen bewerken",
"loadError": "Het laden van de machtigingencatalogus is mislukt.",
"saved": "Rolmachtigingen opgeslagen",
"saveError": "Het opslaan van rolmachtigingen is mislukt.",
"save": "Redden",
"saving": "Besparing..."
},
"aiGloballyEnabled": "AI-assistent",
"aiGloballyEnabledDesc": "Gebruikers kunnen de AI-assistent inschakelen. Wanneer deze is uitgeschakeld, is de assistent verborgen en voor iedereen geblokkeerd.",
"aiPrivateEndpoints": "Toegestane privé-AI-hosts",
"aiPrivateEndpointsDesc": "Hosts op uw privénetwerk waarnaar gebruikers een provider kunnen verwijzen, zoals een zelfgehoste Ollama. Scheid ze met komma's.",
"stepCa": "Stap CA",
"stepCaDesc": "Geef kortstondige SSH-certificaten uit via een smallstep CA. Voer de URL van de CA, de root-fingerprint (zoals weergegeven door step ca bootstrap) en de naam van de OIDC-provisioner in; kies vervolgens \"Step CA\" als authenticatietype voor de host. Laat alle drie de velden leeg om deze functie uit te schakelen.",
"stepCaFingerprint": "Root-vingerafdruk (SHA-256)",
"stepCaProvisioner": "Naam van de OIDC-leverancier",
"stepCaSaved": "Stap CA-instellingen opgeslagen",
"stepCaSaveFailed": "Het opslaan van de Step CA-instellingen is mislukt.",
"secretSourcePrivateEndpoints": "Toegestane hosts voor privégeheime bronnen",
"secretSourcePrivateEndpointsDesc": "Privéhosts die mogelijk door geheime bronnen (1Password Connect) worden benaderd. Scheid ze met komma's.",
"updateSecretSourceEndpointsFailed": "Het bijwerken van de whitelist voor geheime bron-eindpunten is mislukt.",
"stepCaPrivateEndpoints": "Toegestane privé Step CA-hosts",
"stepCaPrivateEndpointsDesc": "De private hosts waarmee de Step CA-certificaatstroom contact kan opnemen, zijn: de certificeringsinstantie zelf en, indien intern, uw identiteitsprovider. Scheid deze met komma's.",
"updateStepCaEndpointsFailed": "Het bijwerken van de Step CA-eindpunt-whitelist is mislukt.",
"notificationPrivateEndpoints": "Toegestane hosts voor privénotificaties",
"notificationPrivateEndpointsDesc": "De exacte privéhosts die via notificatiekanalen gecontacteerd mogen worden. Scheid ze met komma's.",
"updateNotificationEndpointsFailed": "Het bijwerken van de lijst met toegestane notificatie-eindpunten is mislukt.",
"updateAiEnabledFailed": "De AI-instelling kon niet worden bijgewerkt.",
"updateAiEndpointsFailed": "Het lukte niet om de lijst met toegestane hosts bij te werken."
},
"newUi": {
"sidebar": {
"quickConnect": {
"hostLabel": "Gastheer",
"hostPlaceholder": "192.168.1.1 of example.com",
"portLabel": "Haven",
"portPlaceholder": "22",
"usernameLabel": "Gebruikersnaam",
"usernamePlaceholder": "gebruikersnaam",
"authLabel": "Auth",
"passwordLabel": "Wachtwoord",
"passwordPlaceholder": "wachtwoord",
"privateKeyLabel": "Privésleutel",
"privateKeyPlaceholder": "Plak de privésleutel...",
"credentialLabel": "Referentie",
"credentialPlaceholder": "Selecteer een opgeslagen inloggegeven",
"protocolLabel": "Protocol",
"domainLabel": "Domein",
"domainPlaceholder": "optioneel",
"connectToRdp": "Verbinden via RDP",
"connectToVnc": "Verbinden via VNC",
"connectToTerminal": "Verbinden met de terminal",
"connectToFiles": "Verbinding maken met bestanden"
},
"history": {
"noTerminalSelected": "Geen terminal geselecteerd",
"noTerminalSelectedHint": "Open een SSH-terminaltabblad om de opdrachtgeschiedenis te bekijken.",
"searchPlaceholder": "Zoekgeschiedenis...",
"clearAll": "Alles wissen",
"noHistoryEntries": "Geen geschiedenisvermeldingen",
"trackingDisabled": "Geschiedenisregistratie is uitgeschakeld",
"trackingDisabledHint": "Schakel het in via de terminalinstellingen van de host."
},
"sshTools": {
"keyRecordingTitle": "Toonopname",
"recordToTerminals": "Opnemen naar terminals",
"selectAll": "Alle",
"selectNone": "Geen",
"noTerminalTabsOpen": "Geen terminaltabbladen geopend",
"selectTerminalsAbove": "Selecteer de terminals hierboven",
"broadcastInputPlaceholder": "Typ hier om toetsaanslagen te verzenden...",
"fillPassword": "Voer het wachtwoord in",
"fillPasswordSuccess": "Wachtwoord ingevuld in de terminal(s) {{count}}",
"fillPasswordMissing": "Er is geen opgeslagen wachtwoord voor de geselecteerde terminal(s) {{count}}",
"stopRecording": "Stop met opnemen",
"startRecording": "Start opnemen",
"settingsTitle": "Instellingen",
"enableRightClickCopyPaste": "Schakel kopiëren/plakken via rechtermuisklik in.",
"copyOnSelect": "Geselecteerde tekst automatisch kopiëren"
},
"splitScreen": {
"layoutTitle": "Indeling",
"selectLayoutAbove": "Selecteer hierboven een lay-out.",
"selectLayoutHint": "Kies hoeveel vensters u wilt weergeven.",
"panesTitle": "Panelen",
"openTabsTitle": "Open tabbladen",
"dragTabsHint": "Sleep tabbladen naar de vensters hierboven, of gebruik Snel toewijzen",
"dropHere": "Hier neerzetten",
"emptyPane": "Leeg",
"dashboard": "Dashboard",
"clearSplitScreen": "Scherm splitsen wissen",
"quickAssign": "Snel toewijzen",
"alreadyAssigned": "Paneel {{index}}",
"splitTab": "Gesplitst tabblad",
"addToSplit": "Toevoegen aan splitsen",
"removeFromSplit": "Verwijderen uit Split",
"assignToPane": "Toewijzen aan paneel",
"hotkeysTitle": "Toetsenbord sneltoetsen",
"hotkeysSplitRight": "Schakel de 2-weg splitsing in/uit.",
"hotkeysSplitBelow": "Schakel de 3-weg splitsing in/uit.",
"hotkeysNavigatePane": "Navigeervensters",
"hotkeysNextTab": "Volgend tabblad",
"hotkeysPrevTab": "Vorig tabblad",
"hotkeysJumpTab": "Ga naar het tabblad"
},
"snippets": {
"title": "Fragmenten",
"createSnippetTitle": "Maak een codefragment aan",
"createSnippetDescription": "Maak een nieuw opdrachtfragment aan voor snelle uitvoering.",
"nameLabel": "Naam",
"namePlaceholder": "bijvoorbeeld: Nginx opnieuw opstarten",
"descriptionLabel": "Beschrijving",
"descriptionPlaceholder": "Optionele beschrijving",
"optional": "Optioneel",
"folderLabel": "Map",
"noFolder": "Geen map (Niet gecategoriseerd)",
"commandLabel": "Commando",
"commandPlaceholder": "bijvoorbeeld: sudo systemctl restart nginx",
"typeLabel": "Type",
"typeCommand": "Commando",
"typeNote": "Opmerking",
"noteLabel": "Opmerking",
"notePlaceholder": "bijvoorbeeld een herbruikbare prompt of herinneringstekst",
"cancel": "Annuleren",
"createSnippetButton": "Maak een codefragment aan",
"createFolderTitle": "Map maken",
"createFolderDescription": "Organiseer je codefragmenten in mappen.",
"folderNameLabel": "Mapnaam",
"folderNamePlaceholder": "bijvoorbeeld systeemopdrachten, Docker-scripts",
"folderColorLabel": "Mapkleur",
"folderIconLabel": "Mappictogram",
"previewLabel": "Voorbeeld",
"folderNameFallback": "Mapnaam",
"createFolderButton": "Map maken",
"targetTerminals": "Doelterminals",
"selectAll": "Alle",
"selectNone": "Geen",
"noTerminalTabsOpen": "Geen terminaltabbladen geopend",
"searchPlaceholder": "Zoekfragmenten...",
"newSnippet": "Nieuw fragment",
"newFolder": "Nieuwe map",
"run": "Loop",
"noSnippetsInFolder": "Geen codefragmenten in deze map",
"uncategorized": "Niet gecategoriseerd",
"editSnippetTitle": "Bewerk fragment",
"editSnippetDescription": "Werk dit opdrachtfragment bij.",
"saveSnippetButton": "Wijzigingen opslaan",
"createSuccess": "Codefragment succesvol aangemaakt",
"createFailed": "Het is niet gelukt om een codefragment te maken.",
"updateSuccess": "Codefragment succesvol bijgewerkt",
"updateFailed": "Het bijwerken van het codefragment is mislukt.",
"deleteFailed": "Het verwijderen van het fragment is mislukt.",
"folderCreateSuccess": "Map succesvol aangemaakt",
"folderCreateFailed": "Map aanmaken mislukt",
"editFolderTitle": "Map bewerken",
"editFolderDescription": "Hernoem of wijzig het uiterlijk van deze map.",
"saveFolderButton": "Wijzigingen opslaan",
"editFolder": "Map bewerken",
"deleteFolder": "Map verwijderen",
"folderDeleteSuccess": "Map \"{{name}}\" verwijderd",
"folderDeleteFailed": "Map verwijderen mislukt",
"folderEditSuccess": "Map succesvol bijgewerkt",
"folderEditFailed": "Het bijwerken van de map is mislukt.",
"confirmRunMessage": "Run \"{{name}}\"?",
"confirmRunButton": "Loop",
"runSuccess": "Voerde \"{{name}}\" uit in {{count}} terminal(s)",
"pasteSuccess": "\"{{name}}\" is geplakt in de terminal(s) {{count}}",
"pasteToTerminal": "Plakken",
"copySuccess": "\"{{name}}\" is naar het klembord gekopieerd",
"shareTitle": "Fragment delen",
"shareUser": "Gebruiker",
"shareRole": "Rol",
"selectUser": "Selecteer een gebruiker...",
"selectRole": "Kies een rol...",
"shareSuccess": "Fragment succesvol gedeeld",
"shareFailed": "Het delen van het fragment is mislukt.",
"revokeSuccess": "Toegang ingetrokken",
"revokeFailed": "Toegang intrekken is mislukt",
"currentAccess": "Huidige toegang",
"shareLoadError": "Het laden van de gedeelde gegevens is mislukt.",
"loading": "Laden...",
"close": "Dichtbij",
"reorderFailed": "Het opslaan van de volgorde van de codefragmenten is mislukt.",
"importExport": "Import/Export",
"exportBtn": "Exporteer JSON",
"importBtn": "JSON importeren",
"exportSuccess": "Codefragmenten succesvol geëxporteerd",
"exportFailed": "Het exporteren van codefragmenten is mislukt.",
"importTitle": "Importeer codefragmenten",
"importDescription": "Importeer codefragmenten en mappen vanuit een JSON-bestand dat is geëxporteerd door Termix.",
"importDropOrClick": "Sleep hier een JSON-bestand naartoe of klik om te bladeren.",
"importSelectedFile": "Geselecteerd: {{name}}",
"importOverwrite": "Overschrijf bestaande codefragmenten met dezelfde naam en map.",
"importStartBtn": "Importeren",
"importSuccess": "Import voltooid: {{snippets}} fragment(en) toegevoegd, {{updated}} bijgewerkt, {{skipped}} overgeslagen, {{folders}} map(pen) toegevoegd",
"importFailed": "Het importeren van codefragmenten is mislukt.",
"importInvalidFile": "Ongeldig bestand: er werd een JSON-object verwacht met snippets of mappenarrays.",
"targetHostsLabel": "Doelhosts",
"targetHostsHint": "Wijs hosts toe om dit codefragment direct uit te voeren zonder een geopende terminal.",
"noHostsAvailable": "Geen hosts geconfigureerd",
"clearTargetHosts": "Alles wissen",
"hasTargetHosts": "Heeft doelhosts",
"runOnTargets": "Uitvoeren op doelen",
"directRunSuccess": "Voerde \"{{name}}\" uit op {{count}} host(s)",
"directRunPartialFail": "\"{{name}}\" is mislukt op een of meer hosts",
"executionResultTitle": "Uitvoeringsresultaten: {{name}}",
"executionResultDescription": "Uitvoer van het uitvoeren van het codefragment op elke doelhost.",
"executionSuccess": "Succes",
"executionFailed": "Mislukt",
"expandAll": "Vouw alle mappen uit",
"collapseAll": "Alle mappen inklappen",
"settings": "Snippet-instellingen",
"variablesHint": "Variabelen: $HOST, $USER, $PORT, $NAME, ${INPUT_1:Label}",
"variablesDialogTitle": "Uitvoeren \"{{name}}\"",
"variablesDialogDescription": "Vul de waarden in die dit codefragment nodig heeft voordat je het uitvoert.",
"variablesPreviewLabel": "Voorbeeld",
"variablesConfirmButton": "Loop"
},
"automations": {
"title": "Automatiseringen",
"tabAutomations": "Automatiseringen",
"tabRuns": "Loopt",
"tabChannels": "Kanalen",
"createAutomation": "Nieuwe automatisering",
"backToAutomations": "Terug naar automatiseringen",
"createTitle": "Nieuwe automatisering",
"editTitle": "Automatisering bewerken",
"empty": "Nog geen automatiseringen. Maak er een aan die reageert op een meetwaarde, een planning of een gebeurtenis.",
"emptyRuns": "Nog geen runs.",
"emptyChannels": "Nog geen kanalen. Voeg er een toe om meldingen ergens naartoe te sturen.",
"noChannelsHint": "Er zijn nog geen kanalen ingesteld. Voeg er een toe via het tabblad Kanalen.",
"addChannel": "Kanaal toevoegen",
"testChannel": "Test",
"channelTestSent": "Testmelding verzonden",
"channelTestFailed": "Testmelding mislukt",
"channelDeleted": "Kanaal verwijderd",
"deleteChannelConfirm": "Als u dit kanaal wilt verwijderen, zullen automatiseringsprocessen die ervan gebruikmaken geen meldingen meer versturen.",
"nameLabel": "Naam",
"namePlaceholder": "Bijvoorbeeld: maak /data leeg wanneer het vol is.",
"nameRequired": "Naam is verplicht",
"descriptionLabel": "Beschrijving",
"descriptionPlaceholder": "Optionele beschrijving",
"enabledLabel": "Ingeschakeld",
"concurrencyLabel": "Als het al draait",
"concurrencyHint": "Wat te doen als dit opnieuw wordt geactiveerd voordat de laatste run is voltooid?",
"concurrency": {
"skip": "Sla de nieuwe run over",
"queue": "Wacht en ren erachteraan.",
"allow": "Voer ze allebei tegelijk uit."
},
"save": "Redden",
"created": "Automatisering gecreëerd",
"updated": "Automatisering opgeslagen",
"deleted": "Automatisering verwijderd",
"deleteConfirm": "Als je deze automatisering verwijdert, wordt ook de uitvoeringsgeschiedenis ervan verwijderd.",
"runNow": "Ren nu",
"testRun": "Testrun",
"testRunHint": "Voert elke stap uit, maar raakt niets buiten Termix aan.",
"runStarted": "De run is gestart.",
"runFinished": "Run voltooid: {{status}}",
"trigger": "Trekker",
"steps": "Stappen",
"addStep": "Voeg stap toe",
"removeStep": "Verwijder stap",
"moveUp": "Omhoog gaan",
"moveDown": "Ga naar beneden",
"noSteps": "Nog geen stappen. Voeg er een toe om aan te geven wat er moet gebeuren.",
"webhookTokenTitle": "Webhook-URL",
"webhookTokenDescription": "Dit wordt eenmalig weergegeven. Sla het nu op, het kan later niet meer worden opgevraagd.",
"copy": "Kopiëren",
"copied": "Gekopieerd",
"viewJson": "JSON",
"viewBuilder": "Bouwer",
"viewGraph": "Grafiek",
"lastRun": "Laatste run",
"never": "Nooit",
"duration": "{{seconds}}s",
"stepOutput": "Uitvoer",
"stepError": "Fout",
"dryRunBadge": "Testrun",
"hostSelector": {
"trigger": "Activerende host",
"host": "Specifieke gastheer",
"fleet": "Vloot",
"all": "Alle hosts"
},
"triggerKinds": {
"metric_threshold": "Metrische drempelwaarde",
"host_status": "De host gaat omhoog of omlaag.",
"health_check": "Wijzigingen in de gezondheidscontrole",
"schedule": "Volgens een schema",
"docker_event": "Container-gebeurtenis",
"internal_event": "Termix-evenement",
"webhook": "Inkomende webhook"
},
"stepTypes": {
"notify": "Een melding verzenden",
"http": "Roep een URL aan",
"run_snippet": "Voer een codefragment uit",
"run_command": "Voer een commando uit",
"docker": "Een container besturen",
"tunnel": "Beheer een tunnel",
"wol": "Maak een gastheer wakker",
"wait": "Wachten",
"set_var": "Een variabele instellen",
"if": "Indien / anders",
"run_automation": "Voer nog een automatisering uit",
"stop": "Stop"
},
"statuses": {
"running": "Rennen",
"success": "Succes",
"failed": "Mislukt",
"timeout": "De tijd is verlopen.",
"skipped": "Overgeslagen",
"cancelled": "Geannuleerd"
},
"fields": {
"host": "Gastheer",
"metric": "Metrisch",
"mount": "Bergpunt",
"operator": "Is",
"value": "Waarde",
"forSeconds": "Aangehouden gedurende (seconden)",
"cooldown": "Afkoeltijd (minuten)",
"cron": "Cron-expressie",
"intervalSeconds": "Elke (seconden)",
"timezone": "Tijdzone",
"timezoneServer": "Servertijd",
"timezoneHint": "In deze zone worden de cron-tijden gelezen. Dit geldt niet voor intervalschema's.",
"container": "Container",
"command": "Commando",
"url": "URL",
"method": "Methode",
"body": "Lichaam",
"channels": "Kanalen",
"title": "Titel",
"message": "Bericht",
"snippet": "Fragment",
"seconds": "Seconden",
"conditionLeftPlaceholder": "Waarde om te controleren",
"conditionRightPlaceholder": "Vergelijk met",
"variableName": "Variabelenaam",
"variableValue": "Waarde",
"elevated": "Uitvoeren met sudo",
"onError": "Als dit mislukt",
"allowPrivateNetwork": "Sta lokale netwerkadressen toe.",
"allowPrivateNetworkHint": "Nodig voor een zelfgehoste service op uw LAN. Standaard uitgeschakeld om verzoeken naar interne adressen te voorkomen."
},
"onError": {
"stop": "Stop de loop",
"continue": "Ga zo door"
}
},
"fleets": {
"title": "Vloten",
"createFleet": "Vloot creëren",
"createFleetTitle": "Vloot creëren",
"editFleetTitle": "Vloot bewerken",
"createFleetDescription": "Een vloot is een benoemde groep hosts waartegen je als eenheid acties kunt uitvoeren.",
"nameLabel": "Naam",
"namePlaceholder": "bijvoorbeeld webservers",
"nameRequired": "Vlootnaam is verplicht",
"descriptionLabel": "Beschrijving",
"descriptionPlaceholder": "Optionele beschrijving",
"colorLabel": "Kleur",
"tagRulesLabel": "Tagregels",
"tagRulesPlaceholder": "prod-web, edge",
"tagRulesHint": "Hosts met een van deze tags worden automatisch opgenomen, naast hosts die handmatig zijn toegevoegd.",
"fleetCreated": "Vloot gecreëerd",
"fleetUpdated": "Vloot bijgewerkt",
"fleetDeleted": "Vloot verwijderd",
"saveFailed": "Vloot kon niet worden gered",
"deleteFailed": "Het verwijderen van de vloot is mislukt.",
"loadFailed": "Het laden van de vloot is mislukt.",
"deleteFleetTitle": "Vloot verwijderen",
"deleteFleetDescription": "Weet je zeker dat je \"{{name}}\" wilt verwijderen? Hiermee worden de lidhosts zelf niet verwijderd.",
"searchFleets": "Zoekvloten...",
"noFleets": "Nog geen vloten. Maak er een aan om te beginnen.",
"memberCount": "{{count}} host",
"memberCount_other": "{{count}} hosts",
"manageMembers": "Leden beheren",
"manageMembersTitle": "Vlootleden beheren",
"manageMembersDescription": "Voeg hosts toe aan of verwijder ze uit het statische lidmaatschap van deze vloot. Hosts die overeenkomen met tagregels zijn altijd inbegrepen.",
"searchHosts": "Zoek hosts...",
"noHostsFound": "Geen hosts gevonden",
"noMembers": "Deze vloot heeft nog geen leden. Voeg hosts toe of stel een tagregel in.",
"membersLoadFailed": "Het laden van de vlootleden is mislukt.",
"memberUpdateFailed": "Het bijwerken van het vlootlidmaatschap is mislukt.",
"tabRun": "Voer het commando uit",
"tabTransfer": "Bestanden overdragen",
"tabInventory": "Inventaris",
"openInventoryTab": "Openen in een volledig tabblad",
"tabPackages": "Pakketten",
"runOnFleet": "Run on Fleet",
"commandPlaceholder": "uptime && df -h",
"commandRequired": "Een opdracht is vereist.",
"commandInputsLabel": "Commando-invoer",
"commandSucceeded": "De opdracht is op alle hosts succesvol uitgevoerd.",
"commandPartialFailure": "{{failed}} van {{total}} hosts mislukt",
"commandFailed": "Het uitvoeren van de opdracht is mislukt.",
"resultSuccess": "Succes",
"resultFailed": "Mislukt",
"push": "Duw",
"pull": "Trekken",
"remotePathLabel": "Externe route",
"remotePathRequired": "Een externe verbinding is vereist.",
"fileLabel": "Bestand",
"fileRequired": "Een bestand is vereist.",
"pushHint": "Het geselecteerde bestand wordt op elke host in de vloot naar precies dit pad geschreven.",
"pullHint": "Het bestand op dit pad wordt van elke host gelezen en gedownload als één zip-bestand, één map per host.",
"transferComplete": "Overdracht voltooid",
"transferFailed": "Overdracht mislukt",
"refreshInventory": "Voorraad vernieuwen",
"inventoryLoadFailed": "Het laden van de inventaris is mislukt.",
"inventoryRefreshed": "Voorraad bijgewerkt",
"inventoryRefreshFailed": "Het vernieuwen van de inventaris is mislukt.",
"inventoryNoData": "Er zijn nog geen voorraadgegevens beschikbaar - vernieuw de pagina om ze te verzamelen.",
"inventoryHost": "Gastheer",
"inventoryCollectedCount": "{{count}}/{{total}} verzameld",
"inventoryOs": "OS",
"inventoryKernel": "Kernel",
"inventoryArch": "Boog",
"inventoryUptime": "Beschikbaarheid",
"inventoryPackageManager": "Pakketbeheerder",
"inventoryCollectedAt": "Verzameld",
"packageActionLabel": "Actie",
"packageInstall": "Installeren",
"packageRemove": "Verwijderen",
"packageUpgradeAll": "Upgrade alle pakketten",
"packageNameLabel": "Pakketnaam",
"packageNameRequired": "Een pakketnaam is vereist.",
"packageHint": "Vereist beheerrechten per host en verhoogt deze rechten met behulp van het opgeslagen sudo-wachtwoord van de host."
},
"workspaces": {
"title": "Werkruimtes",
"saveCurrent": "Huidige opslaan",
"saveCurrentTitle": "Huidige werkruimte opslaan",
"saveCurrentDescription": "Sla elk geopend tabblad, elke gesplitste lay-out en elke vensterindeling op als een nieuwe, benoemde werkruimte.",
"nameLabel": "Naam",
"namePlaceholder": "bijvoorbeeld, productiedebugging",
"nameRequired": "De naam van de werkruimte is verplicht.",
"colorLabel": "Kleur",
"workspaceCreated": "Werkruimte opgeslagen",
"workspaceUpdated": "Werkruimte bijgewerkt",
"workspaceDeleted": "Werkruimte verwijderd",
"workspaceDuplicated": "Werkruimte gedupliceerd",
"saveFailed": "Het opslaan van de werkruimte is mislukt.",
"updateFailed": "Het bijwerken van de werkruimte is mislukt.",
"deleteFailed": "Het verwijderen van de werkruimte is mislukt.",
"duplicateFailed": "Het dupliceren van de werkruimte is mislukt.",
"loadFailed": "Het laden van de werkruimtes is mislukt.",
"applyFailed": "Het toepassen van de werkruimte is mislukt.",
"deleteWorkspaceTitle": "Werkruimte verwijderen",
"deleteWorkspaceDescription": "Weet je zeker dat je \"{{name}}\" wilt verwijderen? Dit kan niet ongedaan gemaakt worden.",
"noWorkspaces": "Er zijn nog geen werkruimtes opgeslagen. Sla je huidige tabbladindeling op om te beginnen.",
"tabCount": "{{count}} tab",
"tabCount_other": "{{count}} tabs",
"apply": "Toepassen",
"applyConfirmTitle": "Werkruimte toepassen",
"applyConfirmDescription": "Door \"{{name}}\" toe te passen, worden uw huidige tabbladen gesloten en vervangen door de opgeslagen indeling van deze werkruimte. Niet-opgeslagen wijzigingen in uw huidige lay-out gaan verloren.",
"applyConfirmButton": "Werkruimte toepassen",
"updateWithCurrent": "Update met de huidige",
"updateWithCurrentConfirm": "Wil je \"{{name}}\" overschrijven met je huidige tabindeling?",
"rename": "Naam wijzigen",
"duplicate": "Duplicaat",
"duplicateNameSuffix": "{{name}} (kopiëren)",
"setDefault": "Instellen als standaard",
"unsetDefault": "Verwijderen als standaard",
"defaultBadge": "Standaard",
"lastSession": "Laatste sessie",
"lastSessionDescription": "Wordt automatisch bijgewerkt met uw meest recente tabbladindeling. Gebruik deze instelling om uw geopende tabbladen te herstellen.",
"lastUsed": "Laatst gebruikt {{time}}",
"neverUsed": "Nooit gesolliciteerd",
"tabsSkipped": "Werkruimte toegepast — {{count}} tabblad(en) overgeslagen (host bestaat niet meer): {{names}}"
},
"keybindings": {
"title": "Toetsenbord sneltoetsen",
"description": "Pas de sneltoetsen voor kopiëren, plakken en besturing in de terminal aan, of koppel toetsen aan het verzenden van tekst of het uitvoeren van een codefragment.",
"defaultsHeading": "Ingebouwde sneltoetsen",
"customHeading": "Aangepaste sneltoetsen",
"addBinding": "Snelkoppeling toevoegen",
"addBindingTitle": "Snelkoppeling toevoegen",
"editBindingTitle": "Snelkoppeling bewerken",
"loading": "Laden...",
"noCustomBindings": "Er zijn nog geen aangepaste sneltoetsen beschikbaar.",
"defaultBadge": "Standaard",
"customizedBadge": "Op maat gemaakt",
"customize": "Aanpassen",
"resetToDefault": "Terugzetten naar standaardinstellingen",
"resetAllToDefaults": "Alles terugzetten naar de standaardinstellingen",
"close": "Dichtbij",
"cancel": "Annuleren",
"saveBinding": "Snelkoppeling opslaan",
"saveError": "Het opslaan van de sneltoetsen is mislukt.",
"pressKeysToRecord": "Toetsencombinatie",
"pressKeysPlaceholder": "Klik en druk op de toetsen",
"recording": "Druk op de toetsen...",
"comboRequiredError": "Druk eerst op een toetsencombinatie.",
"textRequiredError": "Voer de tekst in die u wilt verzenden",
"controlCodeRequiredError": "Voer één letter in als besturingscode.",
"snippetRequiredError": "Selecteer een fragment",
"conflictWarning": "Deze combinatie is al gekoppeld aan {{combo}}. Door op te slaan zullen beide vuren.",
"actionLabel": "Actie",
"actionCopy": "Selectie kopiëren",
"actionPaste": "Plakken",
"actionSendControlCode": "Verzend het Ctrl+letter-signaal",
"actionSendText": "Sms verzenden",
"actionRunSnippet": "Voer het bestaande codefragment uit.",
"actionNextTab": "Ga naar het volgende tabblad",
"actionPreviousTab": "Ga terug naar het vorige tabblad",
"actionOpenCommandPalette": "Snel zoeken openen",
"controlCodeLabel": "Brief",
"textLabel": "Tekst om te verzenden",
"appendEnterLabel": "Druk op Enter na het verzenden.",
"snippetLabel": "Fragment",
"selectSnippetPlaceholder": "Selecteer een fragment",
"orphanedSnippetWarning": "fragment niet gevonden",
"clipboardPermissionNote": "In sommige browsers kan bij het eerste gebruik om toestemming voor het gebruik van het klembord worden gevraagd."
},
"connectionDefaults": {
"title": "Verbindingsstandaarden",
"description": "Stel waarden in die elke host overneemt, tenzij deze ze overschrijft.",
"manage": "Beheren",
"dialogDescription": "Dit geldt voor hosts die een instelling niet hebben ingesteld. Alles wat op een host is ingesteld, heeft voorrang.",
"tabTerminal": "Terminal",
"tabRemoteDesktop": "Extern bureaublad",
"inherit": "Erven",
"on": "Op",
"off": "Uit",
"resizeDisplayUpdate": "Weergave bijwerken",
"resizeReconnect": "Opnieuw verbinding maken",
"clearAll": "Alles wissen",
"saved": "Verbindingsstandaarden opgeslagen",
"saveFailed": "Het opslaan van de verbindingsinstellingen is mislukt."
},
"userProfile": {
"donateTitle": "Houd Termix in leven",
"donateDescription": "Termix is gratis, zelf te hosten en is ontwikkeld door slechts een paar mensen in hun vrije tijd. Als het je tijd of geld heeft bespaard, helpt een cryptodonatie om het project draaiende te houden.",
"donateMilestones": "Donaties helpen ons de tijd te financieren die nodig is voor onderzoek en het leren van de benodigde kennis om SAML-, Kubernetes- en Agent-ondersteuning te ontwikkelen. Bekijk de voortgang en doneer.",
"donateButton": "Doneer crypto",
"storageModeLocal": "Browser",
"storageModeCloud": "Database",
"storageModeDescription": "De browser slaat instellingen alleen in deze browser op. De database synchroniseert met de server en laadt op elk apparaat.",
"resetToDefaults": "Terugzetten naar standaardinstellingen",
"resetToDefaultsSuccess": "Instellingen teruggezet naar standaardwaarden.",
"storageModeSwitch": "Voorkeurenopslag",
"sectionAccount": "Rekening",
"desktopProfileTitle": "Automatisch lokaal bureaubladprofiel",
"desktopProfileDescription": "Dit profiel is beperkt tot de ingebouwde backend en meldt zich automatisch aan. Het heeft geen inlogwachtwoord; Remote Sync hieronder gebruikt een apart serveraccount.",
"sectionInterface": "Interface",
"interfacePresetDesc": "Hoeveel details Termix laat zien. Alle functies blijven beschikbaar.",
"preset_simple": "Eenvoudig",
"preset_simple_desc": "Alleen de essentiële zaken.",
"preset_balanced": "Evenwichtig",
"preset_balanced_desc": "De standaardindeling.",
"preset_advanced": "Geavanceerd",
"preset_advanced_desc": "Alles is aan, dicht op elkaar gepakt.",
"presetClearOverrides": "Alles resetten",
"presetOverridesTitle": "Op maat gemaakt",
"presetRevertArea": "Terugdraaien",
"presetConfirmTitle": "Overschakelen naar {{preset}}?",
"presetConfirmDesc": "Dit reset je zijbalk, navigatie, dashboardindeling, terminalwerkbalk en bestandsbeheerweergave. Je hosts, inloggegevens en startpagina blijven ongewijzigd.",
"presetConfirmApply": "Voorinstelling toepassen",
"runSetupAgainDesc": "Doorloop de eerste installatieprocedure nog eens.",
"runSetupAgainButton": "Installatie uitvoeren",
"uiArea_chrome": "App Chrome",
"uiArea_hostList": "Hostlijst",
"uiArea_credentialList": "Referentielijst",
"uiArea_rail": "Navigatie",
"uiArea_dashboard": "Dashboard",
"uiArea_terminal": "Terminal",
"uiArea_fileManager": "Bestandsbeheerder",
"uiArea_docker": "Docker",
"uiArea_hostMetrics": "Hoststatistieken",
"uiArea_hostEditor": "Hoofdredacteur",
"uiArea_homepage": "Startpagina",
"sectionAppearance": "Verschijning",
"sectionSecurity": "Beveiliging",
"sectionApiKeys": "API-sleutels",
"sectionData": "Gegevens",
"sectionC2sTunnels": "C2S-tunnels",
"usernameLabel": "Gebruikersnaam",
"roleLabel": "Rol",
"roleAdministrator": "Beheerder",
"authMethodLabel": "Authenticatiemethode",
"authMethodLocal": "Lokaal",
"twoFaLabel": "2FA",
"twoFaOn": "Op",
"twoFaOff": "Uit",
"versionLabel": "Versie",
"betaProgramTitle": "Bèta-programma",
"betaProgramDescription": "Test aankomende functies vroegtijdig met de wekelijkse, doorlopende :beta Docker-tag. Deze is niet stabiel en niet geschikt voor productie.",
"betaProgramFeedback": "Een bug gevonden? Meld hem hier.",
"betaProgramLearnMore": "Meer informatie",
"cliTitle": "Termix CLI",
"cliDescription": "Open terminals, voer commando's uit en verplaats bestanden vanuit je eigen shell.",
"cliLearnMore": "Meer informatie",
"deleteAccount": "Account verwijderen",
"deleteAccountDescription": "Verwijder je account permanent",
"changeServerDescription": "Schakel over naar een andere Termix-backendserver.",
"deleteButton": "Verwijderen",
"deleteAccountPermanent": "Deze actie is permanent en kan niet ongedaan gemaakt worden.",
"deleteAccountWarning": "Alle sessies, hosts, inloggegevens en instellingen worden permanent verwijderd.",
"confirmPasswordDeletePlaceholder": "Voer uw wachtwoord in om te bevestigen",
"languageLabel": "Taal",
"themeLabel": "Thema",
"fontSizeLabel": "Lettergrootte",
"interfaceFontLabel": "Interface-lettertype",
"interfaceFontDescription": "Wijzigt het lettertype van de applicatie-interface. Terminalprofielen behouden hun eigen lettertype-instellingen.",
"accentColorLabel": "Accentkleur",
"settingsTerminal": "Terminal",
"commandAutocomplete": "Opdracht automatisch aanvullen",
"commandAutocompleteDesc": "Toon automatisch aanvullen tijdens het typen als je op tab drukt.",
"localEcho": "Local Echo",
"localEchoDesc": "Verminder de waargenomen invoerlatentie met behulp van veilige lokale toetsaanslagvoorspelling.",
"keyboardShortcuts": "Toetsenbord sneltoetsen",
"keyboardShortcutsDescription": "Pas de sneltoetsen voor kopiëren, plakken en opdrachten in de terminal aan.",
"manageShortcuts": "Beheren",
"terminalLinkBehavior": "Terminallink Klik",
"terminalLinkBehaviorDesc": "Standaardgedrag bij het klikken op links in de terminal",
"historyTracking": "Geschiedenis bijhouden",
"historyTrackingDesc": "Terminalopdrachten volgen",
"commandPalette": "Commando-palet",
"commandPaletteDesc": "Toetsenbord sneltoets inschakelen",
"reopenTabsOnLogin": "Tabbladen opnieuw openen bij inloggen",
"reopenTabsOnLoginDesc": "Herstel je geopende tabbladen wanneer je inlogt of de pagina vernieuwt, zelfs vanaf een ander apparaat.",
"confirmTabClose": "Bevestig tabblad sluiten",
"confirmTabCloseDesc": "Vraag eerst voordat je terminaltabbladen sluit.",
"transferConcurrency": "Gelijktijdige bestandsoverdracht",
"transferConcurrencyDesc": "Hoeveel bestanden de lokale/externe manager naast elkaar tegelijkertijd uploadt of downloadt. Verlaag deze waarde als uw server het aantal SFTP-kanalen beperkt.",
"settingsAppRail": "App Rail",
"sidebarSettingsMoved": "De instellingen voor de weergave van de zijbalk van de host zijn verplaatst naar het paneel 'Zijbalk aanpassen', dat u kunt openen via de werkbalk 'Hosts'.",
"showHostTags": "Toon host-tags",
"showHostTagsDesc": "Tags weergeven in de hostlijst",
"hostTrayOnClick": "Klik om de hostacties uit te breiden",
"hostTrayOnClickDesc": "Toon altijd de verbindingsknoppen; klik om de beheermogelijkheden uit te vouwen in plaats van eroverheen te zweven.",
"compactHostView": "Compacte hostweergave",
"compactHostViewDesc": "Vouw elke host samen tot één regel waarop alleen de naam en het adres worden weergegeven.",
"statusColors": "Echte statuskleuren",
"statusColorsDesc": "Gebruik groen/rood voor de online/offline status in plaats van de accentkleur.",
"pinAppRail": "Pin App Rail",
"pinAppRailDesc": "Houd de app-rail aan de linkerkant altijd uitgevouwen in plaats van deze uit te vouwen wanneer je er met de muis overheen beweegt.",
"openFullscreenSettings": "Open de instellingen in volledig scherm.",
"exitFullscreenSettings": "Instellingen voor volledig scherm verlaten",
"expandAppRailOnHover": "App-balk uitklappen bij muisovergang",
"expandAppRailOnHoverDesc": "Zorg ervoor dat de app-rail aan de linkerkant uitklapt wanneer de muiswijzer eroverheen beweegt.",
"showPinAppRailButton": "Toon Pin App Rail-knop",
"showPinAppRailButtonDesc": "Toon een knop in de app-rail om deze open te houden. Standaard uitgeschakeld.",
"settingsNavigation": "Navigatie",
"navigationTabsDesc": "Kies welke tabbladen in de app-rail verschijnen.",
"showSnippetCommands": "Toon opdrachten",
"showSnippetCommandsDesc": "Toon de opdracht van elk codefragment onder de naam ervan. Schakel deze optie uit voor een compactere lijst.",
"foldersCollapsed": "Mappen ingeklapt",
"foldersCollapsedDesc": "Mappen standaard inklappen",
"confirmExecution": "Bevestig de uitvoering",
"confirmExecutionDesc": "Controleer voordat u de codefragmenten uitvoert.",
"settingsUpdates": "Updates",
"disableUpdateChecks": "Schakel updatecontroles uit",
"disableUpdateChecksDesc": "Stop met controleren op updates.",
"totpAuthenticator": "TOTP-authenticator",
"totpEnabled": "Tweefactorauthenticatie (2FA) is ingeschakeld.",
"totpDisabled": "Voeg extra inlogbeveiliging toe.",
"totpAddAuthenticator": "Apparaat toevoegen",
"totpAddTitle": "Authenticatorapparaat toevoegen",
"totpAddDescription": "Bevestig uw identiteit om een andere authenticatie-app te registreren met dezelfde beveiligde TOTP-sleutel.",
"totpAddInputRequired": "Voer uw TOTP-code of wachtwoord in.",
"totpAddFailed": "Authenticator toevoegen mislukt",
"totpAddScanInstructions": "Scan deze QR-code met de extra authenticatie-app. Bestaande authenticatie-apps blijven gewoon werken.",
"totpAddSuccess": "Extra authenticatie-app geregistreerd",
"disable": "Uitzetten",
"enable": "Inschakelen",
"setupTotp": "TOTP instellen",
"qrCode": "QR-code",
"totpInstructions": "Scan de QR-code of voer het geheime wachtwoord in uw authenticatie-app in en voer vervolgens de 6-cijferige code in.",
"totpCodePlaceholder": "000000",
"verify": "Verifiëren",
"changePassword": "Wachtwoord wijzigen",
"currentPasswordLabel": "Huidig wachtwoord",
"currentPasswordPlaceholder": "Huidig wachtwoord",
"newPasswordLabel": "Nieuw wachtwoord",
"newPasswordPlaceholder": "Nieuw wachtwoord",
"confirmPasswordLabel": "Bevestig nieuw wachtwoord",
"confirmPasswordPlaceholder": "Bevestig nieuw wachtwoord",
"updatePassword": "Wachtwoord bijwerken",
"createApiKeyTitle": "API-sleutel aanmaken",
"createApiKeyDescription": "Genereer een nieuwe API-sleutel voor programmatische toegang.",
"apiKeyNameLabel": "Naam",
"apiKeyNamePlaceholder": "bijv. CI-pipeline",
"expiryDateLabel": "Vervaldatum",
"optional": "optioneel",
"cancel": "Annuleren",
"createKey": "Sleutel aanmaken",
"apiKeyCreatedWarning": "Sleutel aangemaakt - kopieer hem nu, hij wordt niet meer weergegeven.",
"copyApiKey": "API-sleutel kopiëren",
"copiedToClipboard": "Gekopieerd naar het klembord",
"apiKeyCount": "{{count}} sleutels",
"newKey": "Nieuwe sleutel",
"noApiKeys": "Nog geen API-sleutels beschikbaar.",
"apiKeyActive": "Actief",
"apiKeyUsageHint": "Voeg uw sleutel toe aan de",
"apiKeyUsageHintHeader": "koptekst.",
"apiKeyPermissionsHint": "Sleutels erven de machtigingen van de gebruiker die ze heeft aangemaakt.",
"exportData": "Mijn gegevens exporteren",
"exportDataDesc": "Download een back-up van uw hosts, inloggegevens en instellingen om deze over te zetten naar een ander apparaat.",
"export": "Exporteren",
"exporting": "Exporteren...",
"importData": "Mijn gegevens importeren",
"importDataDesc": "Herstel uw hosts, inloggegevens en instellingen vanuit een .sqlite-back-upbestand.",
"importDataSelected": "Geselecteerd: {{name}}",
"selectFile": "Selecteer bestand",
"changeFile": "Wijziging",
"import": "Importeren",
"importing": "Importeren...",
"exportSuccess": "Gegevens succesvol geëxporteerd",
"exportFailed": "Gegevensexport mislukt",
"importSelectFile": "Selecteer eerst een bestand.",
"importCompleted": "Import voltooid: {{total}} items geïmporteerd, {{skipped}} overgeslagen",
"importFailed": "Import mislukt: {{error}}",
"roleUser": "Gebruiker",
"authMethodDual": "Dubbele authenticatie",
"authMethodOidc": "OIDC",
"totpSetupFailed": "Het starten van de TOTP-configuratie is mislukt.",
"totpEnter6Digits": "Voer een 6-cijferige code in",
"totpEnabledSuccess": "Tweefactorauthenticatie ingeschakeld",
"totpInvalidCode": "Ongeldige code, probeer het opnieuw.",
"totpDisableInputRequired": "Voer uw TOTP-code of wachtwoord in.",
"totpDisabledSuccess": "Tweefactorauthenticatie uitgeschakeld",
"totpDisableFailed": "Het uitschakelen van 2FA is mislukt.",
"totpDisableTitle": "Schakel 2FA uit",
"totpDisablePlaceholder": "Voer de TOTP-code of het wachtwoord in.",
"totpDisableConfirm": "Schakel 2FA uit",
"totpContinueVerify": "Doorgaan met verifiëren",
"totpVerifyTitle": "Code verifiëren",
"totpBackupTitle": "Back-upcodes",
"totpDownloadBackup": "Back-upcodes downloaden",
"passkeys": "Wachtwoorden",
"passkeysDesc": "Gebruik WebAuthn/FIDO2-gegevens om zonder wachtwoord in te loggen.",
"passkeyName": "Wachtwoordnaam",
"passkeyUvPreferred": "Voorkeur",
"passkeyUvRequired": "Vereist",
"passkeyUvDiscouraged": "Ontmoedigd",
"addPasskey": "Voeg wachtwoord toe",
"noPasskeys": "Er zijn geen wachtwoorden geregistreerd.",
"passkeyAdded": "Wachtwoord toegevoegd",
"passkeyAddFailed": "Wachtwoord toevoegen mislukt",
"passkeyDeleted": "Wachtwoord verwijderd",
"passkeyDeleteFailed": "Het verwijderen van de toegangscode is mislukt.",
"done": "Klaar",
"secretCopied": "Geheim gekopieerd naar het klembord",
"apiKeyNameRequired": "Sleutelnaam is vereist",
"apiKeyCreated": "API-sleutel \"{{name}}\" aangemaakt",
"apiKeyCreateFailed": "Het aanmaken van de API-sleutel is mislukt.",
"apiKeyUser": "Gebruiker",
"apiKeyExpires": "Verloopt",
"apiKeyRevoked": "API-sleutel \"{{name}}\" ingetrokken",
"apiKeyRevokeFailed": "Het intrekken van de API-sleutel is mislukt.",
"passwordFieldsRequired": "Het huidige en nieuwe wachtwoord zijn vereist.",
"passwordMismatch": "De wachtwoorden komen niet overeen.",
"passwordTooShort": "Het wachtwoord moet minimaal 6 tekens lang zijn.",
"passwordUpdated": "Wachtwoord succesvol bijgewerkt",
"passwordUpdateFailed": "Wachtwoord bijwerken mislukt",
"deletePasswordRequired": "Een wachtwoord is vereist om uw account te verwijderen.",
"deleteFailed": "Account verwijderen mislukt",
"deleting": "Verwijderen...",
"colorPickerTooltip": "Kleurenkiezer openen",
"themeSystem": "Systeem",
"themeLight": "Licht",
"themeDark": "Donker",
"themeDracula": "Dracula",
"themeCatppuccin": "Catppuccin",
"themeNord": "Noord",
"themeSolarized": "Gesolariseerd",
"themeTokyoNight": "Tokio 's nachts",
"themeOneDark": "Eén Donker",
"themeGruvbox": "Gruvbox"
}
}
},
"terminalToolbar": {
"title": "Terminalwerkbalk",
"showActions": "Toon de werkbalk",
"hideToolbar": "Werkbalk verbergen",
"showToolbar": "Werkbalk uitklappen",
"moveToolbar": "Verplaats de werkbalk",
"moveToolbarHint": "Sleep om de werkbalk te verplaatsen.",
"layout": "Werkbalkweergavemodus",
"layoutIcon": "Alleen pictogram",
"layoutLabeled": "Pictogrammen en labels",
"layoutExpanded": "Uitgebreid met meetgegevens",
"image": "Acties met afbeeldingen (alleen afbeeldingen)",
"upload": "Afbeelding uploaden",
"paste": "Plak afbeelding",
"detachTmux": "Ontkoppel tmux",
"detachTmuxDescription": "Ontkoppel de tmux-sessie",
"imageActionFailed": "Afbeeldingsactie mislukt",
"retry": "Opnieuw proberen",
"dismissError": "Afbeeldingsfout negeren",
"cpu": "CPU",
"memory": "Geheugen",
"disk": "Schijf",
"statsUnavailable": "Live statistieken niet beschikbaar",
"tmuxDetach": "Ontkoppel de tmux-sessie",
"uploadImage": "Upload een afbeelding naar de host.",
"uploadingImage": "Bezig met uploaden...",
"pasteImage": "Plak een afbeelding vanuit het klembord (alleen afbeeldingen)",
"openFiles": "Open bestanden",
"openDocker": "Docker openen",
"openTunnel": "Open tunnel",
"openHostMetrics": "Open Host Metrics",
"openProxmoxStats": "Open Proxmox-statistieken",
"openTmuxMonitor": "Open Tmux Monitor"
},
"tmuxMonitor": {
"title": "Tmux Monitor",
"failedToLoadHosts": "Het laden van hosts is mislukt.",
"failedToLoad": "Het laden van tmux-sessies is mislukt.",
"tmuxUnavailable": "Tmux is niet geïnstalleerd op deze host.",
"noSessions": "Er zijn geen tmux-sessies op deze host.",
"noHostSelected": "Geen host geselecteerd",
"attached": "Bijgevoegd",
"detached": "Losgemaakt",
"attach": "Bijvoegen",
"editTags": "Labels bewerken",
"tagsHint": "Tags gescheiden door komma's (bijv. YOLO, lab, training)",
"tagsSaved": "Tags opgeslagen",
"tagsSaveFailed": "Het opslaan van tags is mislukt.",
"searchPlaceholder": "Zoekresultaten over meerdere sessies heen...",
"searchResults": "{{count}} overeenkomsten",
"searchFailed": "Zoeken mislukt",
"selectPaneHint": "Selecteer een venster om de uitvoer ervan te bekijken.",
"closePreview": "Voorbeeld sluiten",
"newSession": "Nieuwe sessie",
"newSessionHint": "Sessienaam (letters, cijfers, _ @ % + = -)",
"newSessionPlaceholder": "mijn sessie",
"create": "Creëren",
"sessionCreated": "Sessie \"{{name}}\" aangemaakt",
"sessionCreateFailed": "Het aanmaken van de sessie is mislukt.",
"splitRight": "Rechts gesplitst",
"splitDown": "Splitsen",
"splitFailed": "Het splitsen van het venster is mislukt.",
"newWindow": "Nieuw venster",
"windowCreateFailed": "Het is niet gelukt om het venster te maken.",
"attachSessionTooltip": "Bevestigen aan {{session}}",
"refresh": "Vernieuwen",
"refreshFailed": "Sessies konden niet worden vernieuwd.",
"collapseAll": "Alles inklappen",
"expandAll": "Alles uitvouwen",
"moreActions": "Meer acties",
"sessionStats": "Sessiestatistieken",
"renameSessionTitle": "Sessie hernoemen \"{{name}}\"",
"rename": "Naam wijzigen",
"sessionRenamed": "Sessie hernoemd naar \"{{name}}\"",
"sessionRenameFailed": "Het hernoemen van de sessie is mislukt.",
"editTagsTitle": "Bewerk tags voor \"{{name}}\"",
"killPane": "Doodvenster",
"resizeTree": "Sleep om het formaat aan te passen — dubbelklik om terug te zetten naar de beginpositie",
"reattach": "Opnieuw koppelen (corrigeert een vervormde weergave)",
"killWindow": "Dood venster",
"killWindowTitle": "Venster {{index}} van \"{{session}} \" verwijderen?",
"killWindowBody": "Alle vensters en processen in dit venster worden beëindigd. Het sluiten van het laatste venster beëindigt de sessie.",
"windowKillFailed": "Het is niet gelukt om het venster te sluiten.",
"statusActivity": "Activiteit",
"statusWindows": "Windows",
"statusPanes": "ruiten",
"statusTags": "Tags",
"killPaneTitle": "Kill pane {{id}}?",
"killPaneBody": "Het proces dat in dit venster wordt uitgevoerd, wordt beëindigd. Door het laatste venster te sluiten, wordt het bijbehorende venster gesloten.",
"paneKillFailed": "Het is niet gelukt om het venster te sluiten.",
"killSessionTitle": "Sessie beëindigen \"{{name}}\"?",
"killSessionBody": "Alle vensters en actieve processen in deze sessie worden beëindigd. Dit kan niet ongedaan worden gemaakt.",
"kill": "Doden",
"sessionKilled": "Sessie \"{{name}}\" is beëindigd",
"sessionKillFailed": "Sessie kon niet worden beëindigd",
"hostUnreachable": "Er kon geen verbinding met de host worden gemaakt. Controleer of deze online en bereikbaar is.",
"noServer": "Er draait geen tmux-server op deze host.",
"searchTruncated": "Gedeeltelijke resultaten — de zoekopdracht omvat de laatste {{lines}} regels van elk venster en maximaal {{panes}} vensters.",
"closeSearchResults": "Zoekresultaten sluiten",
"retry": "Opnieuw proberen",
"noHosts": "Geen SSH-hosts beschikbaar",
"noHostsHint": "Schakel de Tmux Monitor-optie in op een SSH-host (Host Manager → Terminal-tabblad) om de tmux-sessies te bewaken.",
"tmuxInstallHint": "Installeer het op de host met:",
"attachTooltip": "Open een terminal naar {{host}}",
"attachTooltipPane": "Open een terminal naar {{host}} — tmux-sessie {{session}}",
"timeJustNow": "zojuist",
"timeMinutes": "{{count}}m geleden",
"timeHours": "{{count}}uur geleden",
"timeDays": "{{count}}dagen geleden"
},
"mobileKeyboard": {
"shift": "Verschuiving",
"ctrl": "Ctrl",
"esc": "Esc",
"tab": "Tab",
"backTab": "⇥",
"arrowUp": "Pijl omhoog",
"arrowDown": "Pijl omlaag",
"arrowLeft": "Pijl naar links",
"arrowRight": "Pijl naar rechts",
"home": "Thuis",
"end": "Einde",
"pageUp": "PgUp",
"pageDown": "PgDn",
"delete": "Del",
"paste": "Plakken",
"editQuickKeys": "Sneltoetsen bewerken",
"quickKeysTitle": "Sneltoetsen",
"quickKeysDesc": "Tik op × om te verwijderen. Ondersteunt maximaal 8 tekens.",
"quickKeyPlaceholder": "bijv. sudo ",
"addQuickKey": "Toevoegen",
"removeQuickKey": "Verwijderen",
"resetDefaults": "Terugzetten naar standaardinstellingen",
"done": "Klaar"
},
"serial": {
"title": "Serieel",
"portLabel": "Haven",
"portPlaceholder": "/dev/ttyUSB0 of COM3",
"baudRateLabel": "Baudrate",
"dataBitsLabel": "Gegevens",
"stopBitsLabel": "Stop",
"parityLabel": "Pariteit",
"parityNone": "Geen",
"parityEven": "Zelfs",
"parityOdd": "Vreemd",
"connect": "Verbinden via serieel",
"disconnect": "Verbinding verbreken",
"refreshPorts": "Vernieuw poorten",
"connected": "Verbonden met {{path}} met {{baud}} baud",
"disconnected": "Seriële poort losgekoppeld",
"connectionError": "Het openen van de seriële poort is mislukt.",
"wsError": "WebSocket-fout",
"errorNoServerUrl": "Geen server-URL geconfigureerd",
"notSupportedTitle": "Serienummer niet ondersteund",
"notSupported": "Voor seriële verbindingen is een browser met Web Serial API-ondersteuning vereist (Chrome, Edge of Firefox 151+), of de Termix-desktopapp.",
"hideHint": "Je kunt het tabblad 'Serienummer' verbergen via Gebruikersprofiel > Uiterlijk > Zijbalk > Navigatie.",
"browserPickerHint": "Klik op Verbinden en uw browser opent een poortkiezer waarmee u het apparaat kunt selecteren."
},
"metricsHistory": {
"title": "Statistiekengeschiedenis",
"historySuffix": "Geschiedenis",
"cpuMemoryDisk": "CPU / Geheugen / Schijf",
"network": "Netwerk",
"download": "RX",
"upload": "TX",
"noData": "Er zijn geen historische gegevens beschikbaar voor deze periode.",
"custom": "Aangepast",
"to": "naar",
"apply": "Toepassen",
"viewHistory": "Geschiedenis bekijken"
},
"alerts": {
"tabFirings": "Waarschuwingen",
"tabRules": "Regels",
"tabChannels": "Kanalen",
"noFirings": "Geen niet-bevestigde meldingen",
"noRules": "Er zijn geen waarschuwingsregels geconfigureerd.",
"noChannels": "Er zijn geen notificatiekanalen geconfigureerd.",
"rulesDesc": "Waarschuwingsregels activeren meldingen.",
"channelsDesc": "Waar waarschuwingsmeldingen worden verzonden",
"acknowledge": "Erkennen",
"ackAll": "Bevestig alles",
"allAcknowledged": "Alle meldingen bevestigd",
"ackFailed": "Melding niet ontvangen",
"ackAllFailed": "Niet alle meldingen zijn bevestigd.",
"showAcknowledged": "Alles weergeven",
"hideAcknowledged": "Verberg Acked",
"addChannel": "Kanaal toevoegen",
"editChannel": "Bewerk kanaal",
"channelName": "Naam",
"channelType": "Type",
"channelNameRequired": "Naam is verplicht",
"webhookUrl": "URL",
"webhookUrlRequired": "De webhook-URL is vereist.",
"webhookDesc": "Verzend een JSON-payload naar deze URL bij elke waarschuwing die wordt geactiveerd.",
"ntfyServer": "Server-URL",
"ntfyTopic": "Onderwerp",
"ntfyTopicRequired": "Onderwerp is verplicht",
"ntfyToken": "Toegangstoken (optioneel)",
"channelSaveFailed": "Het opslaan van het kanaal is mislukt.",
"test": "Test",
"testSent": "Testmelding verzonden",
"testFailed": "Testmelding mislukt",
"testFailedWithReason": "Testmelding mislukt: {{reason}}",
"addRule": "Voeg een waarschuwingsregel toe",
"editRule": "Regel voor waarschuwing bewerken",
"ruleName": "Regelnaam",
"ruleNameRequired": "Naam is verplicht",
"triggerType": "Trekker",
"thresholdValue": "Drempelwaarde (%)",
"durationSeconds": "Duur (seconden, 0 = direct vuren)",
"cooldownMinutes": "Afkoeltijd (minuten)",
"channels": "Meldingskanalen",
"noChannelsHint": "Voeg eerst kanalen toe via het tabblad Kanalen.",
"ruleSaveFailed": "Het opslaan van de regel is mislukt."
},
"ai": {
"title": "Assistent",
"send": "Versturen",
"stop": "Stop",
"save": "Redden",
"cancel": "Annuleren",
"running": "rennen",
"approve": "Goedkeuren",
"reject": "Afwijzen",
"inputPlaceholder": "Vraag naar uw servers of beschrijf een voorgestelde wijziging.",
"selectProvider": "Selecteer een aanbieder",
"providerSettings": "Aanbiederinstellingen",
"addProvider": "Aanbieder toevoegen",
"editProvider": "Bewerk provider",
"removeProvider": "Verwijder provider",
"providerType": "Aanbieder",
"providerLabel": "Naam",
"providerLabelPlaceholder": "Bijvoorbeeld: Lokale Ollama",
"baseUrl": "Serveradres",
"apiKey": "API-sleutel",
"defaultModel": "Standaardmodel",
"defaultModelPlaceholder": "Bijvoorbeeld: llama3.1 of claude-opus-5",
"labelRequired": "Geef deze aanbieder een naam",
"providerSaveFailed": "De provider kon niet worden opgeslagen.",
"providerUpdated": "Aanbieder bijgewerkt",
"providerDeleteFailed": "De provider kon niet worden verwijderd.",
"privateEndpointHint": "IP-adressen op uw privénetwerk moeten eerst door een beheerder worden toegestaan.",
"providerOllama": "Ollama",
"providerAnthropic": "Antropisch",
"providerOpenai": "OpenAI",
"providerGemini": "Google Gemini",
"providerOpenaiCompatible": "OpenAI-compatibel",
"toolArguments": "Invoer",
"toolResult": "Resultaat",
"statusApplied": "Toegepast",
"statusRejected": "Afgewezen",
"proposalApplied": "Toegepaste wijziging",
"proposalApplyFailed": "De wijziging kon niet worden toegepast.",
"proposalRejectFailed": "Kon de wijziging niet afwijzen",
"enableTitle": "Schakel de AI-assistent in",
"enableDescription": "Laat de assistent je instellingen lezen en wijzigingen voorstellen die je vervolgens kunt goedkeuren.",
"readOnlyCommands": "Sta alleen-lezen diagnostische opdrachten toe.",
"readOnlyCommandsDescription": "De assistent kan een korte lijst met veilige commando's zoals df en uptime uitvoeren zonder telkens opnieuw toestemming te vragen. Alles wat een server wijzigt, wordt altijd eerst voorgesteld.",
"modelDetectFailed": "De aanbieder kon niet worden bereikt, daarom is dit een algemene lijst. U kunt elke modelnaam invoeren.",
"modelCustom": "Voer een modelnaam in",
"modelRefresh": "Vernieuw de lijst",
"modelPlaceholder": "Kies of typ een model",
"attachHint": "Typ @ om te verwijzen naar een host, codefragment of automatisering. Wijzigingen worden voorgesteld ter goedkeuring.",
"runCommandTitle": "Voer het commando uit",
"assistant": "AI-assistent",
"terminalPanelEmpty": "Vraag de assistent naar deze host. Alles wat de status wijzigt, vereist eerst uw goedkeuring.",
"terminalPanelPlaceholder": "Vraag naar deze host...",
"noProvidersConfigured": "Er is nog geen AI-provider geconfigureerd. Voeg er een toe via het tabblad AI-assistent.",
"runsInOpenTerminal": "Wordt uitgevoerd in uw geopende terminalsessie.",
"runInTerminal": "Loop"
},
"macros": {
"title": "Macro's",
"description": "Voer een opgeslagen reeks commando's uit in een terminal en reageer op wat de server terugstuurt.",
"target": "Doel",
"noTerminal": "Geen terminal geopend",
"empty": "Nog geen macro's",
"emptyHint": "Maak een macro om een terminalproces te automatiseren, zoals inloggen, een service herstarten of prompts beantwoorden.",
"create": "Nieuwe macro",
"back": "Terug naar macro's",
"name": "Naam",
"namePlaceholder": "Webserver opnieuw opstarten",
"nameRequired": "Geef de macro een naam voordat je hem opslaat.",
"descriptionLabel": "Beschrijving",
"descriptionPlaceholder": "Wat deze macro doet (optioneel)",
"unsaved": "Niet-opgeslagen wijzigingen",
"save": "Redden",
"saved": "Macro opgeslagen",
"saveFailed": "Het lukte niet om de macro op te slaan.",
"delete": "Verwijderen",
"deleteTitle": "Deze macro verwijderen?",
"deleteBody": "\"{{name}}\" wordt permanent verwijderd. Dit kan niet ongedaan gemaakt worden.",
"deleted": "Macro verwijderd",
"cancel": "Annuleren",
"run": "Loop",
"stop": "Stop",
"running": "Rennen...",
"completed": "Macro voltooid",
"failed": "Macro mislukt",
"loadFailed": "Macro's konden niet worden geladen.",
"needTerminal": "Open en verbind eerst een terminal.",
"noSteps": "Deze macro bevat nog geen stappen. Voeg er hieronder een toe.",
"addStep": "Voeg stap toe",
"stepNumber": "Stap {{number}}",
"removeStep": "Verwijder stap",
"confirmRunTitle": "Voer deze macro uit?",
"confirmRunBody": "\"{{name}}\" zal commando's naar {{host}} sturen.",
"confirmRunAction": "Macro uitvoeren",
"stepTypes": {
"send": {
"label": "Verzend commando",
"help": "Typt tekst in de terminal, net alsof je die zelf hebt ingetypt."
},
"wait": {
"label": "Wacht op uitvoer",
"help": "Het programma pauzeert totdat de server de door u opgegeven tekst afdrukt, zoals bij een wachtwoordprompt."
},
"delay": {
"label": "Pauze",
"help": "Wacht een vaste tijdsduur voordat de volgende stap wordt uitgevoerd."
},
"if": {
"label": "Als de uitvoer het volgende bevat:",
"help": "Controleert alles wat de server tot nu toe heeft afgedrukt en voert vervolgens een van de twee vertakkingen uit."
},
"repeat": {
"label": "Herhalen",
"help": "Voert de stappen binnenin een vast aantal keren uit."
}
},
"send": {
"text": "Opdracht of tekst",
"textPlaceholder": "systemctl restart nginx",
"pressEnter": "Druk op Enter na het verzenden.",
"pressEnterHelp": "Schakel deze optie uit om tekst te typen zonder deze te verzenden."
},
"wait": {
"pattern": "Wacht tot de uitvoer het volgende bevat:",
"patternPlaceholder": "wachtwoord:",
"timeout": "Geef het op na",
"onTimeout": "Als het nooit verschijnt",
"stop": "Stop de macro",
"continue": "Ga toch door."
},
"delay": {
"duration": "Wachten op"
},
"ifStep": {
"pattern": "Als de uitvoer het volgende bevat:",
"patternPlaceholder": "Actief: actief (lopend)",
"then": "Doe dan dit",
"else": "Doe anders dit",
"emptyBranch": "Geen treden"
},
"repeat": {
"count": "Aantal keren",
"times": "tijden"
},
"match": {
"useRegex": "Overeenkomst met een reguliere expressie",
"useRegexHelp": "Laat dit weg zodat de tekst exact overeenkomt met de geschreven tekst.",
"invalidRegex": "Dit is geen geldige reguliere expressie; het wordt als platte tekst herkend."
},
"seconds": "seconden",
"secondsShort": "{{count}}s"
},
"webEndpoint": {
"noHostSelected": "Geen host geselecteerd",
"notFound": "Dit eindpunt bestaat niet meer.",
"tunnelUnreachableFromBrowser": "Dit eindpunt tunnelt naar 127.0.0.1 op de machine waarop Termix draait, een adres dat uw browser niet kan bereiken. Stel de Bind Host van het eindpunt in op een adres waarop die machine reageert, bijvoorbeeld 0.0.0.0, en geef het een vaste lokale poort.",
"tunnelSharesSessionCookie": "Door deze tunnel te openen, wordt uw Termix-sessie naar de getunnelde service gestuurd, omdat uw browser deze via dezelfde hostnaam bereikt als waar Termix wordt aangeboden. Cookies negeren de poort, dus de twee zijn niet van elkaar te onderscheiden. Gebruik de Termix-desktopapp of open Termix op localhost.",
"directSharesSessionCookie": "Het openen van dit eindpunt stuurt uw Termix-sessie ernaartoe, omdat uw browser het benadert via dezelfde site waar Termix wordt aangeboden. Cookies negeren de poort, dus een andere poort betekent niet dat er een andere identiteit is. Gebruik de Termix-desktopapp of bied deze webinterface aan via een andere hostnaam.",
"retry": "Opnieuw proberen",
"reload": "Herladen",
"copyUrl": "URL kopiëren",
"urlCopied": "URL gekopieerd",
"copyFailed": "Het kopiëren van de URL is mislukt.",
"openExternally": "Extern openen",
"isolationUnavailable": "Deze browser kan web-endpoints niet isoleren van uw Termix-sessie. Gebruik een browser met ondersteuning voor iframes zonder inloggegevens.",
"isolationNotice": "Ingesloten pagina's gebruiken een geïsoleerde sessie. Voor pagina's die opslag of een pop-upaanmelding vereisen, gebruikt u een geïsoleerd venster in de desktop-app.",
"openIsolatedWindow": "Een geïsoleerd venster openen"
}
}