Files
Termix/src/ui/locales/translated/id_ID.json
T
Luke Gustafson ac24fdcba8 release-2.4.0 (#913)
* feat: continued adding features to the release.yml

* feat: added auto youtube submit

* feat: add dry run to release workflow

* feat: improve release workflow mode system with new dropdown and overwrite release mode

* fix: make credentials start collapsed

* fix: make hostname fill entire column and truncate at proper spot in dashboard

* fix: guacamole display using an incorrect height

* feat: add folder management (nested folders, folder icons, folder colors, improved folder selection, etc.)

* feat: move ssh host config outside of top tab bar and into new tab bar visible when on SSH tab

* fix: 2FA failing to disable

* feat: Proxmox guest discovery and import (#881)

* feat(db): add Proxmox host fields and schema migration

Add enableProxmox flag and proxmoxConfig JSON to the hosts table so an
SSH host can be marked as a Proxmox node and carry per-host discovery
settings (default credential, Windows/Docker name patterns, preferred
IP prefixes). Includes addColumnIfNotExists migration entries and the
matching SSHHost / HostData / Host type definitions.

* feat(api): add Proxmox guest discovery endpoint

Add POST /proxmox/discover which connects to a Proxmox node over SSH
using the host's existing stored credentials (no separate API token),
runs pvesh to enumerate cluster guests, and returns VMs and LXC
containers ready to import. Guest IPs are resolved with bounded
concurrency (LXC from net config, QEMU via guest agent) to stay within
the node's SSH MaxSessions; configured preferred prefixes pick the
address when a guest has several. Name patterns flag Windows guests as
RDP and enable Docker. Node names are validated before use in shell
commands and the SSH connection is always closed via try/finally. The
endpoint carries an OpenAPI annotation. Persists the new host fields
across host create/update/select, the normalizers (transformHostResponse)
and the bulk routes, with normalizer test coverage.

* feat(ui): add Proxmox host settings and guest import

Add a Proxmox tab to the host editor (following the Docker tab pattern)
to enable the integration and configure the default credential, name
patterns and preferred IP ranges. Proxmox-enabled hosts show a discover
action in the sidebar that opens an import dialog listing the cluster's
guests with multi-select; the import reuses the host's credential, maps
Windows guests to RDP, and groups imported guests into a folder named
after the Proxmox host. Also exposes the import via the hosts
import/export menu. All user-facing strings are added to the en.json
locale and rendered via i18n. Built with the existing shadcn Select,
dialog and section-card components to match the dark theme.

* feat(ui): add Proxmox to the bulk feature toggle

Proxmox was the only host feature missing from the multi-select
"Features" menu. Enabling it in bulk is special: unlike the other
toggles it needs a credential to be useful, so each host now defaults
its Proxmox credential to the credential already stored on that host
(host.credentialId). Discovery then works right away without picking
one by hand, and per-host settings can still be adjusted afterwards.

- SidebarTree: Enable/Disable Proxmox entries (Boxes icon) in the
  bulk Features dropdown
- host-bulk-routes: enabling Proxmox runs per-host so each host keeps
  its own default credential; existing proxmoxConfig is preserved;
  disabling stays a simple flag flip
- en.json: enableProxmoxFeature / disableProxmoxFeature

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* fix: reliable OIDC group syncing for admin roles (#882)

- always fetch from the userinfo endpoint to get extra claims (like `groups` from Authelia) instead of skipping it if the id_token was already parsed
- handle cases where the OIDC provider sends groups as a single string, a comma-separated string
- add debug logging

* fix: incorrect guacd screen height

* fix: guacd black screen on connnection

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* feat: initial server stats rewrite (renamed to host metrics)

* feat: continue renaming and improving host metrics features and UI

* fix: clipboard copy fails in Brave/non-HTTPS, dashboard total credentials stuck at 0, host username ignored when credential attached, cloned host can't switch auth method, file-manager context menu off-screen, file delete affecting inactive tabs, silent delete failure on Windows hosts, iPad host tap does nothing, OIDC custom group claim support

* chore: update dependabot for my app and add auto merge/branch update

* chore: update dependabot for my app and add auto merge/branch update

* Feat/docker release tag (#894)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* feat(docker): add version tag to production Docker image tags

---------

Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: disable hardware acceleration on Windows to prevent startup crash (#895)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* fix: disable hardware acceleration on Windows to prevent startup crash

---------

Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* chore(deps-dev): bump the dev-patch-updates group across 1 directory with 23 updates (#893)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps-dev): bump the dev-patch-updates group across 1 directory with 23 updates

Bumps the dev-patch-updates group with 22 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/autocomplete](https://github.com/codemirror/autocomplete) | `6.20.2` | `6.20.3` |
| [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `21.0.1` | `21.0.2` |
| [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) | `21.0.1` | `21.0.2` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.12` | `1.2.13` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.3` | `1.3.4` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.16` | `2.1.17` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.8` | `2.1.9` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress) | `1.1.8` | `1.1.9` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.10` | `1.2.11` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.8` | `1.1.9` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.13` | `1.1.14` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.8` | `1.2.9` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.9.1` | `25.9.2` |
| [i18next](https://github.com/i18next/i18next) | `26.3.0` | `26.3.1` |
| [lint-staged](https://github.com/lint-staged/lint-staged) | `17.0.5` | `17.0.7` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.2.6` | `19.2.7` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.2.15` | `19.2.17` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.2.6` | `19.2.7` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.0.14` | `8.0.16` |



Updates `@codemirror/autocomplete` from 6.20.2 to 6.20.3
- [Changelog](https://github.com/codemirror/autocomplete/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/autocomplete/commits)

Updates `@commitlint/cli` from 21.0.1 to 21.0.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.0.2/@commitlint/cli)

Updates `@commitlint/config-conventional` from 21.0.1 to 21.0.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.0.2/@commitlint/config-conventional)

Updates `@radix-ui/react-accordion` from 1.2.12 to 1.2.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

Updates `@radix-ui/react-alert-dialog` from 1.1.15 to 1.1.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

Updates `@radix-ui/react-checkbox` from 1.3.3 to 1.3.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

Updates `@radix-ui/react-dialog` from 1.1.15 to 1.1.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

Updates `@radix-ui/react-dropdown-menu` from 2.1.16 to 2.1.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

Updates `@radix-ui/react-label` from 2.1.8 to 2.1.9
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-popover` from 1.1.15 to 1.1.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

Updates `@radix-ui/react-progress` from 1.1.8 to 1.1.9
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/progress/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/progress)

Updates `@radix-ui/react-scroll-area` from 1.2.10 to 1.2.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

Updates `@radix-ui/react-separator` from 1.1.8 to 1.1.9
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

Updates `@radix-ui/react-slot` from 1.2.4 to 1.2.5
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot)

Updates `@radix-ui/react-tabs` from 1.1.13 to 1.1.14
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

Updates `@radix-ui/react-tooltip` from 1.2.8 to 1.2.9
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

Updates `@types/node` from 25.9.1 to 25.9.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `i18next` from 26.3.0 to 26.3.1
- [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.0...v26.3.1)

Updates `lint-staged` from 17.0.5 to 17.0.7
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.0.5...v17.0.7)

Updates `react` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react)

Updates `@types/react` from 19.2.15 to 19.2.17
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react-dom)

Updates `vite` from 8.0.14 to 8.0.16
- [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.0.16/packages/vite)

---
updated-dependencies:
- dependency-name: "@codemirror/autocomplete"
  dependency-version: 6.20.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@commitlint/cli"
  dependency-version: 21.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@commitlint/config-conventional"
  dependency-version: 21.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-progress"
  dependency-version: 1.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-slot"
  dependency-version: 1.2.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/node"
  dependency-version: 25.9.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: i18next
  dependency-version: 26.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: lint-staged
  dependency-version: 17.0.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: react
  dependency-version: 19.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@types/react"
  dependency-version: 19.2.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: react-dom
  dependency-version: 19.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: vite
  dependency-version: 8.0.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump undici from 7.26.0 to 8.4.0 (#891)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps): bump undici from 7.26.0 to 8.4.0

Bumps [undici](https://github.com/nodejs/undici) from 7.26.0 to 8.4.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.26.0...v8.4.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 8.4.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the prod-minor-updates group with 2 updates (#890)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps): bump the prod-minor-updates group with 2 updates

Bumps the prod-minor-updates group with 2 updates: [axios](https://github.com/axios/axios) and [js-yaml](https://github.com/nodeca/js-yaml).


Updates `axios` from 1.16.1 to 1.17.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.16.1...v1.17.0)

Updates `js-yaml` from 4.1.1 to 4.2.0
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/commits)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: js-yaml
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/setup-node from 4 to 6 (#887)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps): bump actions/setup-node from 4 to 6

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/checkout from 4 to 6 (#886)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps): bump actions/checkout from 4 to 6

Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/upload-artifact from 4 to 7 (#885)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps): bump actions/upload-artifact from 4 to 7

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/download-artifact from 4 to 8 (#884)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* chore(deps): bump actions/download-artifact from 4 to 8

Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: automate rebasing dependabot

* feat: add admin settings audit log feature

* feat: add customizability of app rail tabs

* fix: host metrics giving sudo password error

* feat: add terminal session logging

* feat: sso system redesign (multiple oidc, ldap support, etc.)

* feat: tailscale auth support

* feat: improve syntax highlighting system

* feat: improve nested folder system/ui

* feat: improve nested folder system/ui

* fix: move tailscale i18n and add scrollbar to ssh host manager customization

* feat: improve syntax highlighting, fix tailscale bugs and host manger UX

* fix: admin page not loading user admin information

* chore: update crowdin workflow

* fix: guacd getting passed incorrect protocol for app view

* fix: add SFTP jump-host fallback from host data (#902)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* fix: add SFTP jump-host fallback from host data

---------

Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>

* feat(tmux-monitor): add per-host tmux session monitor (#896)

* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)

* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"

This reverts commit 4d04559ca5.

* feat(tmux-monitor): add per-host tmux session monitor

New isolated feature module following the docker/server-stats pattern:

- Backend Express service on port 30010 (src/backend/ssh/tmux-monitor.ts)
  listing tmux sessions/windows/panes, pane capture, cross-session
  output search, and per-pane CPU/RAM/GPU metrics over pooled SSH
  connections. Read-only; reuses host-resolver, jump-host-chain,
  connection pool and RBAC access checks.
- tmux_session_tags table for per-user project tags on sessions.
- Frontend fullscreen app at ?view=tmux-monitor with host selector,
  session/window/pane tree, live pane preview (2s polling), search
  bar, metrics display, and tag editing.
- nginx location blocks for /tmux_monitor in Docker deployments.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): live streaming backend and shell integration

- WebSocket service on port 30011 (tmux-monitor-live.ts) bridging tmux
  control mode (-C attach-session) to the browser: subscribe per pane,
  decoded %output events streamed as JSON, structure-change and detach
  notifications. Pure control-mode parser with 17 unit tests.
- Register tmux_monitor as a singleton shell tab: AppRail entry below
  Network Graph, global Command Palette action, and per-host palette
  action (gated on enableTerminal) that opens with the host preselected.
- nginx WebSocket location /tmux_monitor/live/ for Docker deployments.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): xterm live preview and UX polish

- Pane preview is now a read-only xterm.js terminal with ANSI colors
  (capture-pane -e via new ansi=1 param) fed by the live WebSocket;
  status chip shows live/connecting/polling and the original 2s REST
  polling remains as automatic fallback.
- useTmuxLive hook: survives React StrictMode remounts (unmounted flag
  reset on mount), force-closes sockets stuck in CONNECTING after 8s so
  retry/fallback always engages, uses import.meta.env.DEV for dev
  detection.
- UX: skeleton loading, error state with retry, actionable empty states,
  persisted host/expanded-session selection, "/" and Escape shortcuts,
  search match highlighting, fresh relative timestamps.

Verified end-to-end in Chrome against a local backend: live chip goes
green and pane output streams in real time over the control-mode bridge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(tmux-monitor): replace control-mode bridge with native PTY attach

The pane preview now embeds the real Terminal component and attaches to
the selected session through the existing terminal WebSocket (new
tmuxAttachSession handshake field in ssh/terminal.ts), making the
preview fully interactive — typing, mouse scrolling and tmux copy-mode
behave exactly like a normal terminal tab. Pane clicks within a session
use the new /focus endpoint (select-window/select-pane) instead of
remounting the terminal.

This removes the entire custom live-streaming stack: the control-mode
WebSocket service on port 30011 (tmux-monitor-live.ts), the control
sequence parser and its tests, the useTmuxLive hook, the nginx
/tmux_monitor/live/ location blocks, and the now-unused live/polling
status chip locale keys.

Verified end-to-end against a dockerized SSH host (Alpine + tmux 3.6):
session tree, interactive preview with ANSI colors, cross-session
search with jump-to-pane, per-pane CPU/RAM metrics, session tags, and
attach-in-new-tab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): use printable field separator in tmux format strings

The unit separator control character (\x1f) used to delimit fields in
tmux -F output gets sanitized to "_" by tmux itself — tmux replaces
control characters (and, under non-UTF-8 locales, any multibyte
character) in expanded format output. On such hosts every list-sessions
line came back as a single unsplittable field, so the monitor showed
session names like "build_1781066459_1781066459_0" and windows/panes
failed to parse entirely.

Switch SEP to the printable ASCII token "<<TMX>>", which survives every
tmux version and locale. Reproduced and verified against tmux 3.6 on
Alpine (C locale) in a docker container.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): create sessions and split panes from the monitor

- POST /tmux_monitor/:hostId/sessions creates a detached session
  (tmux new-session -d), starting the tmux server if needed. Session
  names are validated against a conservative charset on both ends
  (tmux forbids ":" and "."), and a duplicate name returns 409 with
  tmux's own message surfaced in the toast.
- POST /tmux_monitor/:hostId/split splits the window containing a pane
  (tmux split-window -h/-v), with the new pane starting in the source
  pane's working directory via -c '#{pane_current_path}'.
- UI: a "+" button next to the host selector opens a name popover
  (Enter or Create); the pane preview header gains split-right and
  split-down buttons. Splits appear instantly in the attached preview
  terminal and a silent overview reload updates the tree; new sessions
  are auto-expanded.

Command syntax verified against tmux 3.6 in a dockerized SSH host.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): VSCode tmux-manager style tree with window actions

Restyle the session tree after the VSCode tmux manager view:

- Header toolbar: new-session (+) popover and refresh moved next to the
  panel title; the host selector row is back to a plain full-width
  select.
- Session rows gain hover actions — attach (play) and new window (+) —
  revealed with the opacity pattern used by docker's ContainerCard so
  they stay keyboard-focusable, with aria-labels on all icon buttons.
- Window rows are collapsible (chevron, "index: name" with a window
  icon); panes show "index: command" plus the pane's working directory
  in muted text with a full-path tooltip.
- New POST /tmux_monitor/:hostId/windows route runs tmux new-window
  against an exact-match ("=name") shell-escaped target; rejects names
  containing ":"/"."/newline and returns 404 for missing sessions.
- Pane preview header groups the split buttons apart from close with a
  separator.

Reviewed by SA/BA/UX subagent panel; keyboard accessibility and
aria-label findings applied.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): rename/kill sessions, collapse-all, no-flash refresh

- Session rows gain a "…" menu with Rename (dialog, validated name) and
  Kill (destructive confirmation). Rename migrates saved tags to the
  new name and re-attaches an open preview; kill closes the preview and
  drops the session's tags. Both routes use exact-match ("=name")
  shell-escaped targets and map tmux's "can't find session" /
  "duplicate session" errors to 404/409.
- Header gains a VSCode-style collapse-all / expand-all toggle for the
  session tree.
- Refresh UX: manual refresh no longer blanks the tree into skeletons —
  the skeleton is reserved for a host's first load; refresh keeps the
  tree, spins the icon (header and toolbar) and reports failures with a
  toast instead of silently keeping stale data.

tmux command syntax verified against tmux 3.6 in the docker test host.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): single-row sessions, overlay hover actions, tag dialog

UI cleanup after desktop testing showed the tree looked cluttered:

- Sessions are now a single row. The permanently visible tags row (a
  mostly empty line with a lone tag icon under every session) is gone:
  tags render as inline badges after the name (max 2, then "+n" with a
  full-list tooltip) and editing moved to the "…" menu, which opens a
  dialog like rename.
- Session metrics merged into the right-hand meta label
  ("just now · 0% · 7 MB"). Hover actions (attach, new window, …) are
  stacked over that label in a grid cell with an opacity cross-fade, so
  the row never shifts and the buttons remain keyboard-focusable
  (focus-within reveals them).
- Dropdown items no longer wrap: short labels (Rename / Edit tags /
  Kill), whitespace-nowrap, min-w-36, align="end".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): kill pane; fix session actions in the desktop app

- Kill pane: hover ✕ on pane rows and a trash button in the preview
  header, both behind a confirmation dialog (kill-pane terminates the
  pane's process; the last pane closes its window). New
  POST /tmux_monitor/:hostId/kill-pane route with pane-id validation.
- Fix attach (▷) doing nothing in the Electron build: window.open of
  internal file:// URLs is denied by the window-open handler, so on
  desktop the button now attaches inline — expands the session and
  selects its active pane in the embedded terminal. Browsers keep the
  open-in-new-tab behavior.
- Enlarge the hover-action hit areas (-m-1 p-1) so clicks land on the
  buttons instead of toggling the session row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): session hover actions were unclickable

The meta label (time · cpu · mem) fades to opacity-0 on hover, which
turns it into a stacking context painted above its plain-flow sibling —
the invisible label sat on top of the attach/new-window/menu buttons
and swallowed their clicks, so clicking them toggled the session row
instead. Give the actions overlay z-10 and make the label
pointer-events-none.

Reproduced and verified in Chrome with elementFromPoint before/after;
create → rename → kill all work end-to-end through the UI now.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): resizable session tree panel

The tree panel was fixed at w-72; long session names and pane paths had
no room. Its right edge is now a drag handle (200–520px, same pattern
and styling as the AppShell host sidebar), double-click resets to the
default width, and the width persists in localStorage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): split buttons on pane rows

Pane rows' hover actions gain split-right and split-down next to the
kill button, so a pane can be split straight from the tree. splitPane
now takes the target pane id instead of implicitly using the selected
pane; the preview header passes its own pane through.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): repair garbled preview after layout changes

External split / kill-pane / new-window actions can leave the attached
preview client with stale borders (the redraw races the xterm size).
Two-part fix:

- After any layout-changing action the monitor nudges the embedded
  terminal (fit + notifyResize + refresh) — the PTY resize forces tmux
  to fully redraw the client.
- The preview header gains a re-attach button that remounts the
  terminal with a fresh PTY as a one-click rescue when the view is
  garbled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): kill window, compact mode, session status tooltip

- Kill window: hover ✕ on window rows behind a confirmation dialog
  (kills every pane; the last window ends the session). New
  POST /tmux_monitor/:hostId/kill-window route with exact-match target
  and 404 mapping.
- Narrow tree panel (<280px) hides the inline "time · cpu · mem" label,
  which used to crush long session names into "bui…".
- Hovering a session row now shows a status board tooltip (attached
  state, activity, window/pane counts, CPU/RAM/GPU, tags) — the numbers
  stay reachable in compact mode and richer in normal mode.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): keep preview attached after killing the viewed pane

Killing the selected pane (or its window) dumped the user back to the
"select a pane" empty state even though the session was still alive and
the attached terminal had already focused a sibling pane. After the
kill the monitor now refetches the overview and selects the session's
new active pane, so the preview stays on the same attach connection
(same session key → no remount); the empty state only appears when the
whole session died with the pane.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): require execute permission, audit destructive actions, persist tag mutations

- Mutating endpoints (kill/kill-window/kill-pane/rename/split/focus,
  create session/window) now require "execute" host access like docker;
  read-only shared hosts could previously kill sessions and spawn shells
- Log kill/rename actions to the audit log (same pattern as host.ts)
- Trigger a DB save after tag updates in rename/kill handlers; the dirty
  flag was never set, so a crash could lose or resurrect tags
- Add host_id -> ssh_data FK with ON DELETE CASCADE to tmux_session_tags
  (drizzle schema + SQL migration), with a rebuild migration for
  pre-release tables created without the FK

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): stop polling and key handling while the tab is hidden, guard stale host responses

- Pass isVisible into TmuxMonitor (like DockerManager/HostMetricsTab);
  the global "/"+Escape keydown listener and both SSH polling loops now
  pause while the tab is mounted but hidden
- Split the overview polling interval out of the host-change effect so
  resuming a tab does not reset state or flash the skeleton
- Ignore overview responses for a host the user has switched away from;
  a slow response could overwrite the selected host's tree
- Format SearchResults/SessionTree/TmuxMonitorApp/SidebarTree with
  prettier (pr-check was failing on these)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): show an empty state when no SSH hosts exist

With zero hosts the host dropdown opened an empty popover and the
preview area showed the unrelated "select a pane" hint. Disable the
select (its placeholder now says no hosts are available) and show a
central no-hosts message with a pointer to the Host Manager.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): refresh the host list when hosts change elsewhere

The list was fetched once on mount, but the tab stays mounted forever,
so adding the first host in Host Manager left the monitor stuck on
"no hosts" until the tab was closed and reopened. Listen to the
app-wide termix:hosts-changed event (same as AppShell/HostManager),
keep the current selection when still valid, auto-select the first
host when one appears, and clear the session tree when the selected
host is deleted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): keep pane/window actions reachable on a narrow tree

Pane rows kept the split/kill buttons and the "index: command" label at
fixed width, so dragging the panel toward the 200px minimum pushed the
buttons past the right edge; Radix ScrollArea's display:table viewport
wrapper made it worse by stretching every row to the widest pane path,
clipping the window kill button too.

Stack the cpu label and the hover actions in one grid cell (the same
overlay pattern as the session rows), let the command and path labels
truncate, and force the viewport wrapper back to display:block.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): reskin the session status tooltip as a popover card

The base TooltipContent is the inverted one-line chip (bg-foreground,
sharp corners, arrow), so the multi-row session board inherited a light
surface that washed out its muted-foreground labels and clashed with
every other floating card in the app. Restyle this one instance with the
popover surface tokens and hide the chip arrow (important is needed
because Radix sets display on the arrow svg inline).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): disable new-session and search when tmux is missing

On a host without tmux the + button still opened the create popover
(submitting just surfaced the backend TMUX_NOT_INSTALLED toast) and
search silently returned "0 matches". Gate both on overview.available
like the neighboring refresh/expand buttons; the search input carries
the unavailable message as its tooltip.

Verified against a real no-tmux host (alpine+sshd container): both
controls disable on it and stay enabled on a host with tmux.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): restyle floating surfaces to match the square UI

Review feedback on #896: the host selector, the new-session popover,
the session status tooltip and the three kill confirmations rendered
with the stock rounded shadcn look while the rest of the app moved to
square corners, ring borders and blurred dialog overlays. Convert the
kill confirmations from AlertDialog to the already-restyled Dialog and
override the remaining surfaces with rounded-none + ring-border.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* style(host-editor): format the tailscale device options with project prettier

The block arrived unformatted in the dev-2.4.0 merge; committing the
reformat separately keeps the tmux-monitor commits free of unrelated
churn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(tmux-monitor): per-host opt-in flag, disabled by default

Review feedback on #896: the tmux actions appeared on every SSH host's
sidebar entry even though most users do not use tmux. Add an
enable_tmux_monitor column (default off) mirroring the enableDocker
plumbing, expose it as an "Enable Tmux Monitor" toggle in the host
editor's Terminal tab, and gate every per-host tmux surface on it:
the sidebar hover action and copy-URL menu item, the command palette
entry, the monitor's host selector, and the tmux-monitor API itself
(refusing like docker.ts does when the feature is off).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): drop the redundant navbar rail entry

The monitor is per-host opt-in, so the global rail item opened a
host-less view. Hosts with enableTmuxMonitor still expose it via the
host action in the sidebar tree and the command palette.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tmux-monitor): fill the status popover card width

TooltipContent is an inline-flex container, so the inner block sized
to its natural content width and left a dead gutter on the right of
the w-56 card. Stretch it with w-full so the values align to the edge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: remove unused dropdown, seperate 3 line menu, and fix a few small UI bugs

---------

Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix: add i18n for tmux

* feat: continue improving terminal highlighint with more options and more consistency

* feat: add per host configuration of history tracking with overarching admin toggle

* feat: add storage preference to user profile settings (local or DB)

* chore: update release notes

* fix: return user password reset code to logs

* fix: missing tailscale errors and i18n

* fix: sso/browser preference fixes

* fix: remove SSL_ENABLED references

* feat: add filter/sort to credentials list and fixed some JSDoc comments

* chore: update release notes

* chore: update readmes

* chore: update readmes and add docs links

* feat: continue improving SSO system

* fix: host metrics bugs

* fix: session logging api endpoint fail

* chore: make electron.yml auto deliver to macos app store

* chore: fix linting issues

* chore: fix linting issues

* chore: lint, format, and bump version to 2.4.0

* chore: crowdin using incorrect api key name

* chore: sync Crowdin translations for 2.4.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: XtraLarge <eMail@WilliWerres.de>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: verybadsoldier <364469+verybadsoldier@users.noreply.github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: Félix MARQUET <72651575+BreizhHardware@users.noreply.github.com>
Co-authored-by: Rabindra Kumar Meher <rabindrameher116@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jose Tenggren <kf16el42@students.muetkhp.edu.pk>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Kang <78076796+khengyun@users.noreply.github.com>
2026-06-16 15:59:53 -05:00

2584 lines
117 KiB
JSON

{
"credentials": {
"folders": "Folders",
"folder": "Folder",
"password": "Password",
"key": "Key",
"sshPrivateKey": "SSH Private Key",
"upload": "Upload",
"keyPassword": "Key Password",
"sshKey": "SSH Key",
"uploadPrivateKeyFile": "Upload Private Key File",
"searchCredentials": "Search credentials...",
"addCredential": "Add Credential",
"caCertificate": "CA Certificate (-cert.pub)",
"caCertificateDescription": "Optional: Upload or paste the CA-signed certificate file (e.g. id_ed25519-cert.pub). Required when your SSH server uses certificate-based authorization.",
"uploadCertFile": "Upload -cert.pub File",
"clearCert": "Clear",
"certLoaded": "Certificate loaded",
"certPublicKeyLabel": "CA Certificate",
"certTypeLabel": "Certificate type",
"pasteOrUploadCert": "Paste or upload a -cert.pub certificate...",
"hasCaCert": "Has CA Certificate",
"noCaCert": "No CA Certificate",
"noPublicKeyAvailable": "No public key available. Open the credential editor first.",
"deployCommandCopied": "Deploy command copied",
"sortCredentials": "Sort Credentials",
"sortDefault": "Default Order",
"sortNameAsc": "Name (A → Z)",
"sortNameDesc": "Name (Z → A)",
"sortUsernameAsc": "Username (A → Z)",
"sortUsernameDesc": "Username (Z → A)",
"filterCredentials": "Filter Credentials",
"filterClearAll": "Clear Filters",
"filterTypeGroup": "Type",
"filterTypePassword": "Password",
"filterTypeKey": "SSH Key",
"filterTagsGroup": "Tags"
},
"homepage": {
"failedToLoadAlerts": "Failed to load alerts",
"failedToDismissAlert": "Failed to dismiss alert"
},
"serverConfig": {
"title": "Server Configuration",
"description": "Configure the Termix server URL to connect to your backend services",
"serverUrl": "Server URL",
"enterServerUrl": "Please enter a server URL",
"saveFailed": "Failed to save configuration",
"saveError": "Error saving configuration",
"saving": "Saving...",
"saveConfig": "Save Configuration",
"helpText": "Enter the URL where your Termix server is running (e.g., http://localhost:30001 or https://your-server.com)",
"changeServer": "Change Server",
"mustIncludeProtocol": "Server URL must start with http:// or https://",
"allowInvalidCertificate": "Allow invalid certificate",
"allowInvalidCertificateDesc": "Use only for trusted self-hosted servers with self-signed or IP-address certificates.",
"useEmbedded": "Use Local Server",
"embeddedDesc": "Run Termix with the built-in local server (no remote server needed)",
"embeddedConnecting": "Connecting to local server...",
"embeddedNotReady": "Local server is not ready yet. Please wait a moment and try again.",
"localServer": "Local Server"
},
"versionCheck": {
"error": "Version Check Error",
"checkFailed": "Failed to check for updates",
"upToDate": "App is Up to Date",
"currentVersion": "You are running version {{version}}",
"updateAvailable": "Update Available",
"newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.",
"betaVersion": "Beta Version",
"betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.",
"releasedOn": "Released on {{date}}",
"downloadUpdate": "Download Update",
"checking": "Checking for updates...",
"checkUpdates": "Check for Updates",
"checkingUpdates": "Checking for updates...",
"updateRequired": "Update Required"
},
"common": {
"close": "Close",
"minimize": "Minimize",
"online": "Online",
"offline": "Offline",
"continue": "Continue",
"maintenance": "Maintenance",
"degraded": "Degraded",
"error": "Error",
"warning": "Warning",
"unsavedChanges": "Unsaved changes",
"dismiss": "Dismiss",
"loading": "Loading...",
"optional": "Optional",
"connect": "Connect",
"copied": "Copied",
"connecting": "Connecting...",
"updateAvailable": "Update Available",
"appName": "Termix",
"openInNewTab": "Open in New Tab",
"noReleases": "No Releases",
"updatesAndReleases": "Updates & Releases",
"newVersionAvailable": "A new version ({{version}}) is available.",
"failedToFetchUpdateInfo": "Failed to fetch update information",
"preRelease": "Pre-release",
"noReleasesFound": "No releases found.",
"cancel": "Cancel",
"username": "Username",
"login": "Login",
"register": "Register",
"password": "Password",
"confirmPassword": "Confirm Password",
"back": "Back",
"save": "Save",
"saving": "Saving...",
"delete": "Delete",
"rename": "Rename",
"edit": "Edit",
"add": "Add",
"confirm": "Confirm",
"no": "No",
"or": "OR",
"next": "Next",
"previous": "Previous",
"refresh": "Refresh",
"language": "Language",
"checking": "Checking...",
"checkingDatabase": "Checking database connection...",
"checkingAuthentication": "Checking authentication...",
"backendReconnected": "Server connection restored",
"connectionDegraded": "Server connection lost, recovering…",
"reload": "Reload",
"remove": "Remove",
"create": "Create",
"update": "Update",
"copy": "Copy",
"copyFailed": "Failed to copy to clipboard",
"maximize": "Maximize",
"restore": "Restore",
"of": "of",
"saved": "Saved",
"deleted": "Deleted",
"deleteFailed": "Failed to delete",
"saveFailed": "Failed to save",
"required": "Required"
},
"nav": {
"home": "Home",
"terminal": "Terminal",
"docker": "Docker",
"tunnels": "Tunnels",
"fileManager": "File Manager",
"serverStats": "Host Metrics",
"hostMetrics": "Host Metrics",
"admin": "Admin",
"userProfile": "User Profile",
"splitScreen": "Split Screen",
"confirmClose": "Close this active session?",
"close": "Close",
"cancel": "Cancel",
"sshManager": "SSH Manager",
"cannotSplitTab": "Cannot split this tab",
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
"copyPassword": "Copy Password",
"copySudoPassword": "Copy Sudo Password",
"passwordCopied": "Password copied to clipboard",
"noPasswordAvailable": "No password available",
"failedToCopyPassword": "Failed to copy password",
"refreshTab": "Refresh connection",
"openFileManager": "Open File Manager",
"dashboard": "Dashboard",
"networkGraph": "Network Graph",
"tmuxMonitor": "Tmux Monitor",
"quickConnect": "Quick Connect",
"sshTools": "SSH Tools",
"history": "History",
"sessionLogs": "Session Logs",
"hosts": "Hosts",
"snippets": "Snippets",
"hostManager": "Host Manager",
"credentials": "Credentials",
"connections": "Connections",
"roleAdministrator": "Administrator",
"roleUser": "User"
},
"hosts": {
"hosts": "Hosts",
"noHosts": "No SSH Hosts",
"retry": "Retry",
"refresh": "Refresh",
"optional": "Optional",
"downloadSample": "Download Sample",
"failedToDeleteHost": "Failed to delete {{name}}",
"importSkipExisting": "Import (skip existing)",
"connectionDetails": "Connection Details",
"ssh": "SSH",
"telnet": "Telnet",
"remoteDesktop": "Remote Desktop",
"port": "Port",
"username": "Username",
"folder": "Folder",
"tags": "Tags",
"pin": "Pin",
"addHost": "Add Host",
"editHost": "Edit Host",
"cloneHost": "Clone Host",
"enableTerminal": "Enable Terminal",
"enableTunnel": "Enable Tunnel",
"enableFileManager": "Enable File Manager",
"enableDocker": "Enable Docker",
"defaultPath": "Default Path",
"connection": "Connection",
"upload": "Upload",
"authentication": "Authentication",
"password": "Password",
"key": "Key",
"credential": "Credential",
"none": "None",
"sshPrivateKey": "SSH Private Key",
"keyType": "Key Type",
"uploadFile": "Upload File",
"tabGeneral": "General",
"tabSsh": "SSH",
"tabTerminal": "Terminal",
"tabRdp": "RDP",
"tabVnc": "VNC",
"tabTunnels": "Tunnels",
"tabDocker": "Docker",
"tabFiles": "Files",
"tabStats": "Host Metrics",
"tabHostMetrics": "Host Metrics",
"tabTelnet": "Telnet",
"tabSharing": "Sharing",
"tabAuthentication": "Authentication",
"terminal": "Terminal",
"tunnel": "Tunnel",
"fileManager": "File Manager",
"serverStats": "Host Metrics",
"status": "Status",
"folderRenamed": "Folder \"{{oldName}}\" renamed to \"{{newName}}\" successfully",
"failedToRenameFolder": "Failed to rename folder",
"movedToFolder": "Moved {{count}} host(s) to \"{{folder}}\"",
"editHostTooltip": "Edit host",
"statusChecks": "Status Checks",
"metricsCollection": "Metrics Collection",
"metricsInterval": "Metrics Collection Interval",
"metricsIntervalDesc": "How often to collect server statistics (5s - 1h)",
"behavior": "Behavior",
"themePreview": "Theme Preview",
"theme": "Theme",
"fontFamily": "Font Family",
"fontSize": "Font Size",
"letterSpacing": "Letter Spacing",
"lineHeight": "Line Height",
"cursorStyle": "Cursor Style",
"cursorBlink": "Cursor Blink",
"scrollbackBuffer": "Scrollback Buffer",
"bellStyle": "Bell Style",
"rightClickSelectsWord": "Right Click Selects Word",
"fastScrollModifier": "Fast Scroll Modifier",
"fastScrollSensitivity": "Fast Scroll Sensitivity",
"sshAgentForwarding": "SSH Agent Forwarding",
"backspaceMode": "Backspace Mode",
"startupSnippet": "Startup Snippet",
"selectSnippet": "Select snippet",
"forceKeyboardInteractive": "Force Keyboard-Interactive",
"overrideCredentialUsername": "Override Credential Username",
"overrideCredentialUsernameDesc": "Use the username specified above instead of the credential's username",
"jumpHostChain": "Jump Host Chain",
"portKnocking": "Port Knocking",
"addKnock": "Add Port",
"addProxyNode": "Add Node",
"proxyNode": "Proxy Node",
"proxyType": "Proxy Type",
"quickActions": "Quick Actions",
"sudoPasswordAutoFill": "Sudo Password Auto-Fill",
"sudoPassword": "Sudo Password",
"keepaliveInterval": "Keepalive Interval (ms)",
"moshCommand": "MOSH Command",
"environmentVariables": "Environment Variables",
"addVariable": "Add Variable",
"docker": "Docker",
"copyTerminalUrl": "Copy Terminal URL",
"copyFileManagerUrl": "Copy File Manager URL",
"copyRemoteDesktopUrl": "Copy Remote Desktop URL",
"failedToConnect": "Failed to connect to console",
"connect": "Connect",
"disconnect": "Disconnect",
"start": "Start",
"enableStatusCheck": "Enable Status Check",
"enableMetrics": "Enable Metrics",
"bulkUpdateFailed": "Bulk update failed",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"protocols": "Protocols",
"secureShell": "Secure Shell",
"virtualNetwork": "Virtual Network",
"unencryptedShell": "Unencrypted shell",
"addressIp": "Address / IP",
"friendlyName": "Friendly Name",
"macAddress": "MAC Address",
"folderAndAdvanced": "Folder & Advanced",
"privateNotes": "Private Notes",
"privateNotesPlaceholder": "Details about this server...",
"pinToTop": "Pin to Top",
"pinToTopDesc": "Always show this host at the top of the list",
"portKnockingSequence": "Port Knocking Sequence",
"addKnockBtn": "Add Knock",
"noPortKnocking": "No port knocking configured.",
"knockPort": "Knock Port",
"protocol": "Protocol",
"delayAfterMs": "Delay After (ms)",
"useSocks5Proxy": "Use SOCKS5 Proxy",
"useSocks5ProxyDesc": "Route connection through a proxy server",
"proxyHost": "Proxy Host",
"proxyPort": "Proxy Port",
"proxyUsername": "Proxy Username",
"proxyPassword": "Proxy Password",
"proxySingleMode": "Single Proxy",
"proxyChainMode": "Proxy Chain",
"you": "You",
"jumpHostChainLabel": "Jump Host Chain",
"addJumpBtn": "Add Jump",
"noJumpHosts": "No jump hosts configured.",
"selectAServer": "Select a server...",
"sshPort": "SSH Port",
"authMethod": "Auth Method",
"storedCredential": "Stored Credential",
"selectACredential": "Select a credential...",
"keyTypeLabel": "Key Type",
"keyTypeAuto": "Auto Detect",
"keyPasteTab": "Paste",
"keyUploadTab": "Upload",
"keyFileLoaded": "Key file loaded",
"keyUploadClick": "Click to upload .pem / .key / .ppk",
"clearKey": "Clear key",
"keySaved": "SSH key saved",
"keyReplaceNotice": "paste a new key below to replace it",
"keyPassphraseSaved": "Passphrase saved, type to change",
"replaceKey": "Replace key",
"docsLink": "View docs",
"opksshLabel": "OPKSSH",
"opksshDesc": "Sign in to this host using your identity provider instead of a password or key. Requires OPKSSH set up on the server.",
"tailscaleDeviceSelect": "Select Tailscale device",
"tailscaleDeviceSelectPlaceholder": "Select a device...",
"tailscaleNoApiKey": "No Tailscale API key configured. Add one in Admin Settings to enable device discovery.",
"tailscaleDocsLink": "View docs",
"tailscaleLoadingDevices": "Loading devices...",
"tailscaleNoDevices": "No devices found in your tailnet.",
"tailscaleDeviceAutoFill": "Selecting a device will auto-fill the host IP address.",
"forceKeyboardInteractiveLabel": "Force Keyboard Interactive",
"forceKeyboardInteractiveShortDesc": "Force manual password entry even if keys are present",
"terminalAppearance": "Terminal Appearance",
"colorTheme": "Color Theme",
"fontFamilyLabel": "Font Family",
"fontSizeLabel": "Font Size",
"cursorStyleLabel": "Cursor Style",
"letterSpacingPx": "Letter Spacing (px)",
"lineHeightLabel": "Line Height",
"bellStyleLabel": "Bell Style",
"backspaceModeLabel": "Backspace Mode",
"cursorBlinking": "Cursor Blinking",
"cursorBlinkingDesc": "Enable blinking animation for the terminal cursor",
"rightClickSelectsWordLabel": "Right-click Selects Word",
"rightClickSelectsWordShortDesc": "Select the word under cursor on right-click",
"syntaxHighlightingLabel": "Syntax Highlighting",
"syntaxHighlightingDesc": "Colorize terminal output (errors, paths, IPs, timestamps)",
"syntaxHighlightingCategories": "Highlight Categories",
"syntaxHighlightingCategoriesDesc": "Choose which types of content to colorize",
"syntaxCategoryLogLevels": "Log Levels",
"syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal",
"syntaxCategoryPaths": "File Paths",
"syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt",
"syntaxCategoryTimestamps": "Timestamps",
"syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15",
"syntaxCategoryIpAddresses": "IP Addresses",
"syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080",
"syntaxCategoryUrls": "URLs",
"syntaxCategoryUrlsDesc": "https://example.com",
"syntaxCategoryNumbers": "Labeled Numbers",
"syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404",
"behaviorAndAdvanced": "Behavior & Advanced",
"scrollbackBufferLabel": "Scrollback Buffer",
"scrollbackMaxLines": "Maximum number of lines kept in history",
"sshAgentForwardingLabel": "SSH Agent Forwarding",
"sshAgentForwardingShortDesc": "Pass your local SSH keys to this host",
"enableAutoMosh": "Enable Auto-Mosh",
"enableAutoMoshDesc": "Prefer Mosh over SSH if available",
"enableAutoTmux": "Enable Auto-Tmux",
"enableAutoTmuxDesc": "Automatically launch or attach to tmux session",
"enableSessionLogging": "Session Logging",
"enableSessionLoggingDesc": "Record terminal session output for later review",
"enableCommandHistory": "Command History",
"enableCommandHistoryDesc": "Record commands run in this terminal for history and autocomplete",
"sudoPasswordAutoFillLabel": "Sudo Password Auto-fill",
"sudoPasswordAutoFillShortDesc": "Automatically provide sudo password when prompted",
"sudoPasswordAutoFillDesc": "Store a sudo password so host metrics, terminal prompts, and others can run privileged commands automatically.",
"sudoPasswordLabel": "Sudo Password",
"environmentVariablesLabel": "Environment Variables",
"addVariableBtn": "Add Variable",
"noEnvVars": "No environment variables configured.",
"fastScrollModifierLabel": "Fast Scroll Modifier",
"fastScrollSensitivityLabel": "Fast Scroll Sensitivity",
"moshCommandLabel": "Mosh Command",
"startupSnippetLabel": "Startup Snippet",
"keepaliveIntervalLabel": "Keepalive Interval (seconds)",
"maxKeepaliveMisses": "Max Keepalive Misses",
"tunnelSettings": "Tunnel Settings",
"enableTunneling": "Enable Tunneling",
"enableTunnelingDesc": "Enable SSH tunnel functionality for this host",
"serverTunnelsSection": "Server Tunnels",
"addTunnelBtn": "Add Tunnel",
"noTunnelsConfigured": "No tunnels configured.",
"tunnelLabel": "Tunnel {{number}}",
"tunnelType": "Tunnel Type",
"tunnelModeLocalDesc": "Forward a local port to a port on the remote server (or a host reachable from it).",
"tunnelModeRemoteDesc": "Forward a port on the remote server back to a local port on your machine.",
"tunnelModeDynamicDesc": "Create a SOCKS5 proxy on a local port for dynamic port forwarding.",
"sameHost": "This host (direct tunnel)",
"endpointHost": "Endpoint Host",
"endpointPort": "Endpoint Port",
"bindHost": "Bind Host",
"sourcePort": "Source Port",
"maxRetries": "Max Retries",
"retryIntervalS": "Retry Interval (s)",
"autoStartLabel": "Auto-start",
"autoStartDesc": "Automatically connect this tunnel when the host is loaded",
"tunnelConnecting": "Tunnel connecting...",
"tunnelDisconnected": "Tunnel disconnected",
"failedToConnectTunnel": "Failed to connect",
"failedToDisconnectTunnel": "Failed to disconnect",
"dockerIntegration": "Docker Integration",
"enableDockerMonitor": "Enable Docker",
"enableDockerMonitorDesc": "Monitor and manage containers on this host via Docker",
"enableTmuxMonitor": "Enable Tmux Monitor",
"enableTmuxMonitorDesc": "Show this host in the Tmux Monitor and add its tmux actions to the sidebar",
"tabProxmox": "Proxmox",
"proxmoxIntegration": "Proxmox Integration",
"enableProxmox": "Enable Proxmox",
"enableProxmoxDesc": "Mark this host as a Proxmox node. Enables guest discovery and import directly from this host.",
"proxmoxDefaultCredential": "Default Credential",
"proxmoxDefaultCredentialDesc": "Credential used for imported guest hosts. The credential's username is applied to all guests.",
"proxmoxWindowsDetection": "Windows / RDP detection",
"proxmoxWindowsDetectionDesc": "Comma-separated name patterns that trigger RDP instead of SSH (case-insensitive)",
"proxmoxDockerDetection": "Docker detection",
"proxmoxDockerDetectionDesc": "Comma-separated name patterns that enable Docker for matching guests",
"proxmoxPreferredRanges": "Preferred IP ranges",
"proxmoxPreferredRangesDesc": "Comma-separated prefixes in priority order for IP selection when a guest has multiple interfaces",
"proxmoxDiscoverAction": "Discover & import Proxmox guests",
"proxmoxImportTitle": "Import from Proxmox",
"proxmoxSelectHost": "Select a Proxmox host…",
"proxmoxDiscover": "Discover",
"proxmoxDiscovering": "Discovering…",
"proxmoxDiscoverGuests": "Discover guests",
"proxmoxGuestsSelected_one": "{{count}} guest — {{selected}} selected",
"proxmoxGuestsSelected_other": "{{count}} guests — {{selected}} selected",
"proxmoxSelectAll": "Select all",
"proxmoxDeselectAll": "Deselect all",
"proxmoxNoGuests": "No guests found on this Proxmox node.",
"proxmoxImportButton_one": "Import {{count}} host",
"proxmoxImportButton_other": "Import {{count}} hosts",
"proxmoxResultImported": "{{count}} imported",
"proxmoxResultUpdated": "{{count}} updated",
"proxmoxResultFailed": "{{count}} failed",
"proxmoxImportComplete": "Proxmox import complete: {{summary}}",
"proxmoxDiscoveryFailed": "Discovery failed",
"proxmoxImportFailed": "Import failed",
"enableFileManagerMonitor": "Enable File Manager",
"enableFileManagerMonitorDesc": "Browse and manage files on this host over SFTP",
"defaultPathLabel": "Default Path",
"fileManagerPathHint": "The directory to open when the file manager launches for this host.",
"statusChecksLabel": "Status Checks",
"enableStatusChecks": "Enable Status Checks",
"enableStatusChecksDesc": "Periodically ping this host to verify availability",
"useGlobalInterval": "Use Global Interval",
"useGlobalIntervalDesc": "Override with the server-wide status check interval",
"checkIntervalS": "Check Interval (s)",
"checkIntervalDesc": "Seconds between each connectivity ping",
"metricsCollectionLabel": "Metrics Collection",
"enableMetricsLabel": "Enable Metrics",
"enableMetricsDesc": "Collect CPU, RAM, disk, and network usage from this host",
"useGlobalMetrics": "Use Global Interval",
"useGlobalMetricsDesc": "Override with the server-wide metrics interval",
"metricsIntervalS": "Metrics Interval (s)",
"metricsIntervalDesc2": "Seconds between metric snapshots",
"visibleWidgets": "Visible Widgets",
"widgetsMovedToHostMetrics": "Cards are now added, arranged, and resized directly in the Host Metrics tab. Open Host Metrics for this host and use Customize to choose which cards are shown.",
"cpuUsageLabel": "CPU Usage",
"cpuUsageDesc": "CPU percent, load averages, sparkline graph",
"memoryLabel": "Memory Usage",
"memoryDesc": "RAM usage, swap, cached",
"storageLabel": "Disk Usage",
"storageDesc": "Disk usage per mount point",
"networkLabel": "Network Interfaces",
"networkDesc": "Interface list and bandwidth",
"uptimeLabel": "Uptime",
"uptimeDesc": "System uptime and boot time",
"systemInfoLabel": "System Info",
"systemInfoDesc": "OS, kernel, hostname, architecture",
"recentLoginsLabel": "Recent Logins",
"recentLoginsDesc": "Successful and failed login events",
"topProcessesLabel": "Top Processes",
"topProcessesDesc": "PID, CPU%, MEM%, command",
"listeningPortsLabel": "Listening Ports",
"listeningPortsDesc": "Open ports with process and state",
"firewallLabel": "Firewall",
"firewallDesc": "Firewall, AppArmor, SELinux status",
"quickActionsLabel": "Quick Actions",
"quickActionsToolbar": "Quick actions appear as buttons in the Host Metrics toolbar for one-click command execution.",
"noQuickActions": "No quick actions yet.",
"buttonLabel": "Button label",
"selectSnippetPlaceholder": "Select snippet...",
"addActionBtn": "Add Action",
"hostSharedSuccessfully": "Host shared successfully",
"failedToShareHost": "Failed to share host",
"accessRevoked": "Access revoked",
"failedToRevokeAccess": "Failed to revoke access",
"cancelBtn": "Cancel",
"savingBtn": "Saving...",
"addHostBtn": "Add Host",
"hostUpdated": "Host updated",
"hostCreated": "Host created",
"failedToSave": "Failed to save host",
"credentialUpdated": "Credential updated",
"credentialCreated": "Credential created",
"failedToSaveCredential": "Failed to save credential",
"backToHosts": "Back to Hosts",
"backToCredentials": "Back to Credentials",
"pinned": "Pinned",
"noHostsFound": "No hosts found",
"tryDifferentTerm": "Try a different term",
"addFirstHost": "Add your first host to get started",
"noCredentialsFound": "No credentials found",
"addCredentialBtn": "Add Credential",
"updateCredentialBtn": "Update Credential",
"features": "Features",
"noFolder": "(No folder)",
"deleteSelected": "Delete",
"exitSelection": "Exit selection",
"importSkip": "Import (skip existing)",
"importOverwrite": "Import (overwrite)",
"collapseBtn": "Collapse",
"importExportBtn": "Import / Export",
"hostStatusesRefreshed": "Host statuses refreshed",
"failedToRefreshHosts": "Failed to refresh hosts",
"movedHostTo": "Moved {{host}} to \"{{folder}}\"",
"failedToMoveHost": "Failed to move host",
"folderRenamedTo": "Folder renamed to \"{{name}}\"",
"deletedFolder": "Deleted folder \"{{name}}\"",
"failedToDeleteFolder": "Failed to delete folder",
"deleteAllInFolder": "Delete all hosts in \"{{name}}\"? This cannot be undone.",
"folderPickerPlaceholder": "No folder",
"folderPickerSearch": "Search or create (use / for subfolders)...",
"folderPickerNone": "No folder",
"folderPickerCreate": "Create \"{{path}}\"",
"folderPickerEmpty": "No matching folders",
"newFolder": "New folder",
"createFolderTitle": "Create folder",
"editFolderTitle": "Edit folder",
"folderDialogDescription": "Choose a name, color, and icon. Use / to nest folders.",
"folderNameLabel": "Folder name",
"folderNamePlaceholder": "e.g. Production/Web",
"folderNestingHint": "Use / to separate levels and create nested folders.",
"folderColor": "Color",
"folderIcon": "Icon",
"folderPreview": "Preview",
"folderNameFallback": "Untitled folder",
"createFolderButton": "Create folder",
"saveFolderButton": "Save folder",
"cancel": "Cancel",
"iconSearchPlaceholder": "Search icons...",
"editFolder": "Edit folder",
"deleteFolder": "Delete folder",
"folderSaved": "Folder saved",
"failedToSaveFolder": "Failed to save folder",
"folderDeleted": "Deleted folder \"{{name}}\"",
"deleteFolderConfirm": "Delete \"{{name}}\" and its {{count}} host(s)? This cannot be undone.",
"failedToMoveHosts": "Failed to move hosts",
"expandAll": "Expand all folders",
"collapseAll": "Collapse all folders",
"moreActions": "More",
"groupBy": "Group by",
"GroupByFolder": "Folder",
"GroupByTag": "Tag",
"GroupByStatus": "Status",
"GroupByProtocol": "Protocol",
"GroupByAuth": "Auth type",
"groupUngrouped": "Ungrouped",
"deletedHost": "Deleted {{name}}",
"copiedToClipboard": "Copied to clipboard",
"terminalUrlCopied": "Terminal URL copied",
"fileManagerUrlCopied": "File Manager URL copied",
"tunnelUrlCopied": "Tunnel URL copied",
"dockerUrlCopied": "Docker URL copied",
"hostMetricsUrlCopied": "Host Metrics URL copied",
"tmuxMonitorUrlCopied": "Tmux Monitor URL copied",
"rdpUrlCopied": "RDP URL copied",
"vncUrlCopied": "VNC URL copied",
"telnetUrlCopied": "Telnet URL copied",
"remoteDesktopUrlCopied": "Remote Desktop URL copied",
"expandActions": "Expand actions",
"collapseActions": "Collapse actions",
"wakeOnLanAction": "Wake on LAN",
"wakeOnLanSuccess": "Magic packet sent to {{name}}",
"wakeOnLanError": "Failed to send magic packet",
"cloneHostAction": "Clone Host",
"copyAddress": "Copy Address",
"copyLink": "Copy Link",
"copyTerminalUrlAction": "Copy Terminal URL",
"copyFileManagerUrlAction": "Copy File Manager URL",
"copyTunnelUrlAction": "Copy Tunnel URL",
"copyDockerUrlAction": "Copy Docker URL",
"copyHostMetricsUrlAction": "Copy Host Metrics URL",
"copyTmuxMonitorUrlAction": "Copy Tmux Monitor URL",
"copyRdpUrlAction": "Copy RDP URL",
"copyVncUrlAction": "Copy VNC URL",
"copyTelnetUrlAction": "Copy Telnet URL",
"copyRemoteDesktopUrlAction": "Copy Remote Desktop URL",
"deleteCredentialConfirm": "Delete credential \"{{name}}\"?",
"deletedCredential": "Deleted {{name}}",
"deploySSHKeyTitle": "Deploy SSH Key",
"deployingBtn": "Deploying...",
"deployBtn": "Deploy",
"failedToDeployKey": "Failed to deploy key",
"deleteHostsConfirm": "Delete {{count}} host{{plural}}? This cannot be undone.",
"movedToRoot": "Moved to root",
"enableTerminalFeature": "Enable Terminal",
"disableTerminalFeature": "Disable Terminal",
"enableFilesFeature": "Enable Files",
"disableFilesFeature": "Disable Files",
"enableTunnelsFeature": "Enable Tunnels",
"disableTunnelsFeature": "Disable Tunnels",
"enableDockerFeature": "Enable Docker",
"disableDockerFeature": "Disable Docker",
"enableProxmoxFeature": "Enable Proxmox",
"disableProxmoxFeature": "Disable Proxmox",
"addTagsPlaceholder": "Add tags...",
"authDetails": "Authentication Details",
"credType": "Type",
"generateKeyPairDesc": "Generate a new key pair, both private and public keys will be filled automatically.",
"generatingKey": "Generating...",
"generateLabel": "Generate {{label}}",
"uploadFileBtn": "Upload file",
"keyPassphraseOptional": "Key Passphrase (Optional)",
"sshPublicKeyOptional": "SSH Public Key (Optional)",
"publicKeyGenerated": "Public key generated",
"failedToGeneratePublicKey": "Failed to derive public key",
"publicKeyCopied": "Public key copied",
"keyPairGenerated": "{{label}} key pair generated",
"failedToGenerateKeyPair": "Failed to generate key pair",
"searchHostsPlaceholder": "Search hosts, addresses, tags…",
"searchCredentialsPlaceholder": "Search credentials…",
"refreshBtn": "Refresh",
"addTag": "Add tags...",
"deleteConfirmBtn": "Delete",
"tunnelRequirementsText": "The SSH server must have GatewayPorts yes, AllowTcpForwarding yes, and PermitRootLogin yes set in /etc/ssh/sshd_config.",
"deleteHostConfirm": "Delete \"{{name}}\"?",
"enableAtLeastOneProtocol": "Enable at least one protocol above to configure authentication and connection settings.",
"keyPassphrase": "Key Passphrase",
"connectBtn": "Connect",
"disconnectBtn": "Disconnect",
"basicInformation": "Basic Information",
"authDetailsSection": "Authentication Details",
"credTypeLabel": "Type",
"hostsTab": "Hosts",
"credentialsTab": "Credentials",
"selectMultiple": "Select multiple",
"selectHosts": "Select hosts",
"connectionLabel": "Connection",
"authenticationLabel": "Authentication",
"generateKeyPairTitle": "Generate Key Pair",
"generateKeyPairDescription": "Generate a new key pair, both private and public keys will be filled automatically.",
"generateFromPrivateKey": "Generate from Private Key",
"refreshBtn2": "Refresh",
"exitSelectionTitle": "Exit selection",
"exportAll": "Export All",
"addHostBtn2": "Add Host",
"addCredentialBtn2": "Add Credential",
"checkingHostStatuses": "Checking host statuses...",
"pinnedSection": "Pinned",
"hostsExported": "Hosts exported successfully",
"exportFailed": "Failed to export hosts",
"sampleDownloaded": "Sample file downloaded",
"failedToDeleteCredential2": "Failed to delete credential",
"noFolderOption": "(No folder)",
"nSelected": "{{count}} selected",
"featuresMenu": "Features",
"moveMenu": "Move",
"cancelSelection": "Cancel",
"deployDialogDesc": "Deploy {{name}} to a host's authorized_keys.",
"targetHostLabel": "Target Host",
"selectHostOption": "Select a host...",
"keyDeployedSuccess": "Key deployed successfully",
"failedToDeployKey2": "Failed to deploy key",
"deletedCount": "Deleted {{count}} hosts",
"failedToDeleteCount": "Failed to delete {{count}} hosts",
"duplicatedHost": "Duplicated \"{{name}}\"",
"failedToDuplicateHost": "Failed to duplicate host",
"updatedCount": "Updated {{count}} hosts",
"friendlyNameLabel": "Friendly Name",
"descriptionLabel": "Description",
"loadingHost": "Loading host...",
"loadingHosts": "Loading hosts...",
"loadingCredentials": "Loading credentials...",
"noHostsYet": "No hosts yet",
"noHostsMatchSearch": "No hosts match your search",
"hostNotFound": "Host not found",
"searchHosts": "Search hosts...",
"sortHosts": "Sort Hosts",
"sortDefault": "Default Order",
"sortNameAsc": "Name (A → Z)",
"sortNameDesc": "Name (Z → A)",
"sortIpAsc": "IP Address (Asc)",
"sortIpDesc": "IP Address (Desc)",
"sortOnlineFirst": "Online First",
"sortOfflineFirst": "Offline First",
"sortPinnedFirst": "Pinned First",
"filterHosts": "Filter Hosts",
"filterClearAll": "Clear Filters",
"filterStatusGroup": "Status",
"filterOnline": "Online",
"filterOffline": "Offline",
"filterPinned": "Pinned",
"filterAuthGroup": "Auth Type",
"filterAuthPassword": "Password",
"filterAuthKey": "SSH Key",
"filterAuthCredential": "Credential",
"filterAuthNone": "None",
"filterAuthOpkssh": "OPKSSH",
"filterProtocolGroup": "Protocol",
"filterProtocolSsh": "SSH",
"filterProtocolRdp": "RDP",
"filterProtocolVnc": "VNC",
"filterProtocolTelnet": "Telnet",
"filterFeaturesGroup": "Features",
"filterFeatureTerminal": "Terminal",
"filterFeatureFileManager": "File Manager",
"filterFeatureTunnel": "Tunnel",
"filterFeatureDocker": "Docker",
"filterTagsGroup": "Tags",
"shareHost": "Share Host",
"shareHostTitle": "Share: {{name}}",
"sharing": {
"requiresCredential": "This host must use a credential to enable sharing. Edit the host and assign a credential first."
},
"guac": {
"connection": "Connection",
"authentication": "Authentication",
"connectionSettings": "Connection Settings",
"displaySettings": "Display Settings",
"audioSettings": "Audio Settings",
"rdpPerformance": "RDP Performance",
"deviceRedirection": "Device Redirection",
"session": "Session",
"gateway": "Gateway",
"remoteApp": "RemoteApp",
"clipboard": "Clipboard",
"sessionRecording": "Session Recording",
"wakeOnLan": "Wake-on-LAN",
"vncSettings": "VNC Settings",
"terminalSettings": "Terminal Settings",
"rdpPort": "RDP Port",
"username": "Username",
"password": "Password",
"domain": "Domain",
"securityMode": "Security Mode",
"colorDepth": "Color Depth",
"width": "Width",
"height": "Height",
"dpi": "DPI",
"resizeMethod": "Resize Method",
"clientName": "Client Name",
"initialProgram": "Initial Program",
"serverLayout": "Server Layout",
"timezone": "Timezone",
"gatewayHostname": "Gateway Hostname",
"gatewayPort": "Gateway Port",
"gatewayUsername": "Gateway Username",
"gatewayPassword": "Gateway Password",
"gatewayDomain": "Gateway Domain",
"remoteAppProgram": "RemoteApp Program",
"workingDirectory": "Working Directory",
"arguments": "Arguments",
"normalizeLineEndings": "Normalize Line Endings",
"recordingPath": "Recording Path",
"recordingName": "Recording Name",
"macAddress": "MAC Address",
"broadcastAddress": "Broadcast Address",
"udpPort": "UDP Port",
"waitTimeS": "Wait Time (s)",
"driveName": "Drive Name",
"drivePath": "Drive Path",
"ignoreCertificate": "Ignore Certificate",
"ignoreCertificateDesc": "Allow connections to hosts with self-signed certificates",
"forceLossless": "Force Lossless",
"forceLosslessDesc": "Force lossless image encoding (higher quality, more bandwidth)",
"disableAudio": "Disable Audio",
"disableAudioDesc": "Mute all audio from the remote session",
"enableAudioInput": "Enable Audio Input (Microphone)",
"enableAudioInputDesc": "Forward local microphone to the remote session",
"wallpaper": "Wallpaper",
"wallpaperDesc": "Show desktop wallpaper (disabling improves performance)",
"theming": "Theming",
"themingDesc": "Enable visual themes and styles",
"fontSmoothing": "Font Smoothing",
"fontSmoothingDesc": "Enable ClearType font rendering",
"fullWindowDrag": "Full Window Drag",
"fullWindowDragDesc": "Show window contents while dragging",
"desktopComposition": "Desktop Composition",
"desktopCompositionDesc": "Enable Aero glass effects",
"menuAnimations": "Menu Animations",
"menuAnimationsDesc": "Enable menu fade and slide animations",
"disableBitmapCaching": "Disable Bitmap Caching",
"disableBitmapCachingDesc": "Turn off bitmap cache (may help with glitches)",
"disableOffscreenCaching": "Disable Offscreen Caching",
"disableOffscreenCachingDesc": "Turn off offscreen cache",
"disableGlyphCaching": "Disable Glyph Caching",
"disableGlyphCachingDesc": "Turn off glyph cache",
"enableGfx": "Enable GFX",
"enableGfxDesc": "Use RemoteFX graphics pipeline",
"enablePrinting": "Enable Printing",
"enablePrintingDesc": "Redirect local printers to the remote session",
"enableDriveRedirection": "Enable Drive Redirection",
"enableDriveRedirectionDesc": "Map a local folder as a drive in the remote session",
"createDrivePath": "Create Drive Path",
"createDrivePathDesc": "Automatically create the folder if it does not exist",
"disableDownload": "Disable Download",
"disableDownloadDesc": "Prevent downloading files from the remote session",
"disableUpload": "Disable Upload",
"disableUploadDesc": "Prevent uploading files to the remote session",
"enableTouch": "Enable Touch",
"enableTouchDesc": "Enable touch input forwarding",
"consoleSession": "Console Session",
"consoleSessionDesc": "Connect to the console (session 0) instead of a new session",
"sendWolPacket": "Send WOL Packet",
"sendWolPacketDesc": "Send a magic packet to wake this host before connecting",
"disableCopy": "Disable Copy",
"disableCopyDesc": "Prevent copying text from the remote session",
"disablePaste": "Disable Paste",
"disablePasteDesc": "Prevent pasting text into the remote session",
"createPathIfMissing": "Create Path if Missing",
"createPathIfMissingDesc": "Automatically create the recording directory",
"excludeOutput": "Exclude Output",
"excludeOutputDesc": "Do not record screen output (metadata only)",
"excludeMouse": "Exclude Mouse",
"excludeMouseDesc": "Do not record mouse movements",
"includeKeystrokes": "Include Keystrokes",
"includeKeystrokesDesc": "Record raw keystrokes in addition to screen output",
"vncPort": "VNC Port",
"vncPassword": "VNC Password",
"vncUsernameOptional": "Username (optional)",
"vncLeaveBlank": "Leave blank if not required",
"cursorMode": "Cursor Mode",
"swapRedBlue": "Swap Red/Blue",
"swapRedBlueDesc": "Swap the red and blue color channels (fixes some colour issues)",
"readOnly": "Read-only",
"readOnlyDesc": "View the remote screen without sending any input",
"telnetPort": "Telnet Port",
"terminalType": "Terminal Type",
"fontName": "Font Name",
"fontSize": "Font Size",
"colorScheme": "Color Scheme",
"backspaceKey": "Backspace Key",
"saveHostFirst": "Save the host first.",
"sharingOptionsAfterSave": "Sharing options are available after the host has been saved.",
"sharingLoadError": "Failed to load sharing data. Check your connection and try again.",
"shareHostSection": "Share Host",
"shareWithUser": "Share with User",
"shareWithRole": "Share with Role",
"selectUser": "Select User",
"selectRole": "Select Role",
"selectUserOption": "Select a user...",
"selectRoleOption": "Select a role...",
"permissionLevel": "Permission Level",
"expiresInHours": "Expires in (hours)",
"noExpiryPlaceholder": "Leave empty for no expiry",
"shareBtn": "Share",
"currentAccess": "Current Access",
"typeHeader": "Type",
"targetHeader": "Target",
"permissionHeader": "Permission",
"grantedByHeader": "Granted By",
"expiresHeader": "Expires",
"noAccessEntries": "No access entries yet.",
"expiredLabel": "Expired",
"neverLabel": "Never",
"revokeBtn": "Revoke",
"cancelBtn": "Cancel",
"savingBtn": "Saving...",
"updateHostBtn": "Update Host",
"addHostBtn": "Add Host"
}
},
"commandPalette": {
"searchPlaceholder": "Search hosts, commands, or settings...",
"quickActions": "Quick Actions",
"hostManager": "Host Manager",
"hostManagerDesc": "Manage, add, or edit hosts",
"addNewHost": "Add New Host",
"addNewHostDesc": "Register a new host",
"adminSettings": "Admin Settings",
"adminSettingsDesc": "Configure system preferences and users",
"userProfile": "User Profile",
"userProfileDesc": "Manage your account and preferences",
"addCredential": "Add Credential",
"addCredentialDesc": "Store SSH keys or passwords",
"tmuxMonitor": "Tmux Monitor",
"tmuxMonitorDesc": "Monitor tmux sessions across your hosts",
"recentActivity": "Recent Activity",
"serversAndHosts": "Servers & Hosts",
"noHostsFound": "No hosts found matching \"{{search}}\"",
"links": "Links",
"navigate": "Navigate",
"select": "Select",
"toggleWith": "Toggle with"
},
"splitScreen": {
"paneEmpty": "Pane {{index}} - empty",
"noTabAssigned": "No tab assigned",
"focusedPane": "Active pane"
},
"connections": {
"noConnections": "No connections",
"noConnectionsDesc": "Open a terminal, file manager, or remote desktop to see connections here",
"connectedFor": "Connected for {{duration}}",
"connected": "Connected",
"disconnected": "Disconnected",
"closeTab": "Close tab",
"closeConnection": "Close connection",
"forgetTab": "Forget",
"removeBackground": "Remove",
"reconnect": "Reconnect",
"reopenTab": "Reopen",
"sectionOpen": "Open",
"sectionBackground": "Background",
"backgroundDesc": "Sessions persist for 30 minutes after disconnect and can be reconnected.",
"persisted": "Persisted in background",
"expiresIn": "Expires in {{duration}}",
"search": "Search connections...",
"noSearchResults": "No connections match your search"
},
"guacamole": {
"connecting": "Connecting to {{type}} session...",
"connectionError": "Connection error",
"connectionFailed": "Connection failed",
"failedToConnect": "Failed to get connection token",
"hostNotFound": "Host not found",
"noHostSelected": "No host selected",
"reconnect": "Reconnect",
"retry": "Retry",
"guacdUnavailable": "Remote desktop service (guacd) is not available. Please ensure guacd is running and accessible and configured properly in admin settings.",
"ctrlAltDel": "Ctrl+Alt+Del",
"toolbar": {
"ctrlAltDel": "Ctrl+Alt+Del",
"winL": "Win+L (Lock Screen)",
"winKey": "Windows Key",
"ctrl": "Ctrl",
"alt": "Alt",
"shift": "Shift",
"win": "Win",
"stickyActive": "{{key}} (latched - click to release)",
"stickyInactive": "{{key}} (click to latch)",
"esc": "Escape",
"tab": "Tab",
"home": "Home",
"end": "End",
"pageUp": "Page Up",
"pageDown": "Page Down",
"arrowUp": "Arrow Up",
"arrowDown": "Arrow Down",
"arrowLeft": "Arrow Left",
"arrowRight": "Arrow Right",
"fnToggle": "Function Keys",
"reconnect": "Reconnect Session",
"collapse": "Collapse toolbar",
"expand": "Expand toolbar",
"dragHandle": "Drag to reposition"
}
},
"terminal": {
"connect": "Connect to Host",
"clear": "Clear",
"paste": "Paste",
"reconnect": "Reconnect",
"connectionLost": "Connection lost",
"connected": "Connected",
"clipboardWriteFailed": "Failed to copy to clipboard. Make sure the page is served over HTTPS or localhost.",
"clipboardReadFailed": "Failed to read from clipboard. Make sure clipboard permissions are granted.",
"clipboardHttpWarning": "Paste requires HTTPS. Use Ctrl+Shift+V or serve Termix over HTTPS.",
"unknownError": "Unknown error occurred",
"websocketError": "WebSocket connection error",
"connecting": "Connecting...",
"noHostSelected": "No host selected",
"reconnecting": "Reconnecting... ({{attempt}}/{{max}})",
"reconnected": "Reconnected successfully",
"tmuxSessionCreated": "tmux session created: {{name}}",
"tmuxSessionAttached": "tmux session attached: {{name}}",
"tmuxUnavailable": "tmux is not installed on the remote host, falling back to standard shell",
"tmuxSessionPickerTitle": "tmux Sessions",
"tmuxSessionPickerDesc": "Existing tmux sessions found on this host. Select one to reattach or create a new session.",
"tmuxWindows": "Windows",
"tmuxWindowCount": "{{count}} window",
"tmuxAttached": "Attached clients",
"tmuxAttachedCount": "{{count}} attached",
"tmuxLastActivity": "Last activity",
"tmuxTimeJustNow": "just now",
"tmuxTimeMinutes": "{{count}}m ago",
"tmuxTimeHours": "{{count}}h ago",
"tmuxTimeDays": "{{count}}d ago",
"tmuxCreateNew": "Start new session",
"tmuxCopyHint": "Adjust selection and press Enter to copy to clipboard",
"tmuxDetach": "Detach from tmux session",
"tmuxDetached": "Detached from tmux session",
"maxReconnectAttemptsReached": "Maximum reconnection attempts reached",
"closeTab": "Close",
"connectionTimeout": "Connection timeout",
"terminalTitle": "Terminal - {{host}}",
"terminalWithPath": "Terminal - {{host}}:{{path}}",
"runTitle": "Running {{command}} - {{host}}",
"totpRequired": "Two-Factor Authentication Required",
"totpCodeLabel": "Verification Code",
"totpVerify": "Verify",
"warpgateAuthRequired": "Warpgate Authentication Required",
"warpgateSecurityKey": "Security Key",
"warpgateAuthUrl": "Authentication URL",
"warpgateOpenBrowser": "Open in Browser",
"warpgateContinue": "I've Completed Authentication",
"opksshAuthRequired": "OPKSSH Authentication Required",
"opksshAuthDescription": "Complete authentication in your browser to continue. This session will remain valid for 24 hours.",
"opksshOpenBrowser": "Open Browser to Authenticate",
"opksshWaitingForAuth": "Waiting for authentication in browser...",
"opksshAuthenticating": "Processing authentication...",
"opksshTimeout": "Authentication timed out. Please try again.",
"opksshAuthFailed": "Authentication failed. Please check your credentials and try again.",
"opksshSignInWith": "Sign in with {{provider}}",
"sudoPasswordPopupTitle": "Insert Password?",
"websocketAbnormalClose": "Connection closed unexpectedly. This may be due to a reverse proxy or SSL configuration issue. Please check server logs.",
"connectionLogTitle": "Connection Log",
"connectionLogCopy": "Copy logs to clipboard",
"connectionLogEmpty": "No connection logs yet",
"connectionLogWaiting": "Waiting for connection logs...",
"connectionLogCopied": "Connection logs copied to clipboard",
"connectionLogCopyFailed": "Failed to copy logs to clipboard",
"connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.",
"hostKeyRejected": "SSH host key verification rejected. Connection cancelled.",
"sessionTakenOver": "Session was opened in another tab. Reconnecting..."
},
"fileManager": {
"noHostSelected": "No host selected",
"initializingEditor": "Initializing editor...",
"file": "File",
"folder": "Folder",
"uploadFile": "Upload File",
"downloadFile": "Download",
"extractArchive": "Extract Archive",
"extractingArchive": "Extracting {{name}}...",
"archiveExtractedSuccessfully": "{{name}} extracted successfully",
"extractFailed": "Extract failed",
"compressFile": "Compress File",
"compressFiles": "Compress Files",
"compressFilesDesc": "Compress {{count}} items into an archive",
"archiveName": "Archive Name",
"enterArchiveName": "Enter archive name...",
"compressionFormat": "Compression Format",
"selectedFiles": "Selected files",
"andMoreFiles": "and {{count}} more...",
"compress": "Compress",
"compressingFiles": "Compressing {{count}} items into {{name}}...",
"filesCompressedSuccessfully": "{{name}} created successfully",
"compressFailed": "Compression failed",
"edit": "Edit",
"preview": "Preview",
"previous": "Previous",
"next": "Next",
"pageXOfY": "Page {{current}} of {{total}}",
"zoomOut": "Zoom Out",
"zoomIn": "Zoom In",
"newFile": "New File",
"newFolder": "New Folder",
"rename": "Rename",
"uploading": "Uploading...",
"uploadingFile": "Uploading {{name}}...",
"fileName": "File Name",
"folderName": "Folder Name",
"fileUploadedSuccessfully": "File \"{{name}}\" uploaded successfully",
"failedToUploadFile": "Failed to upload file",
"fileDownloadedSuccessfully": "File \"{{name}}\" downloaded successfully",
"failedToDownloadFile": "Failed to download file",
"fileCreatedSuccessfully": "File \"{{name}}\" created successfully",
"folderCreatedSuccessfully": "Folder \"{{name}}\" created successfully",
"failedToCreateItem": "Failed to create item",
"operationFailed": "{{operation}} operation failed for {{name}}: {{error}}",
"failedToResolveSymlink": "Failed to resolve symlink",
"itemsDeletedSuccessfully": "{{count}} items deleted successfully",
"failedToDeleteItems": "Failed to delete items",
"sudoPasswordRequired": "Administrator Password Required",
"enterSudoPassword": "Enter sudo password to continue this operation",
"sudoPassword": "Sudo password",
"sudoOperationFailed": "Sudo operation failed",
"sudoAuthFailed": "Sudo authentication failed",
"dragFilesToUpload": "Drop files here to upload",
"emptyFolder": "This folder is empty",
"searchFiles": "Search files...",
"upload": "Upload",
"selectHostToStart": "Select a host to start file management",
"sshRequiredForFileManager": "File manager requires SSH. This host does not have SSH enabled.",
"failedToConnect": "Failed to connect to SSH",
"failedToLoadDirectory": "Failed to load directory",
"noSSHConnection": "No SSH connection available",
"copy": "Copy",
"cut": "Cut",
"paste": "Paste",
"copyPath": "Copy Path",
"copyPaths": "Copy Paths",
"delete": "Delete",
"properties": "Properties",
"refresh": "Refresh",
"downloadFiles": "Download {{count}} files to Browser",
"copyFiles": "Copy {{count}} items",
"cutFiles": "Cut {{count}} items",
"deleteFiles": "Delete {{count}} items",
"filesCopiedToClipboard": "{{count}} items copied to clipboard",
"filesCutToClipboard": "{{count}} items cut to clipboard",
"pathCopiedToClipboard": "Path copied to clipboard",
"pathsCopiedToClipboard": "{{count}} paths copied to clipboard",
"failedToCopyPath": "Failed to copy path to clipboard",
"movedItems": "Moved {{count}} items",
"failedToDeleteItem": "Failed to delete item",
"itemRenamedSuccessfully": "{{type}} renamed successfully",
"failedToRenameItem": "Failed to rename item",
"download": "Download",
"permissions": "Permissions",
"size": "Size",
"modified": "Modified",
"path": "Path",
"confirmDelete": "Are you sure you want to delete {{name}}?",
"permissionDenied": "Permission denied",
"serverError": "Server Error",
"fileSavedSuccessfully": "File saved successfully",
"failedToSaveFile": "Failed to save file",
"confirmDeleteSingleItem": "Are you sure you want to permanently delete \"{{name}}\"?",
"confirmDeleteMultipleItems": "Are you sure you want to permanently delete {{count}} items?",
"confirmDeleteMultipleItemsWithFolders": "Are you sure you want to permanently delete {{count}} items? This includes folders and their contents.",
"confirmDeleteFolder": "Are you sure you want to permanently delete the folder \"{{name}}\" and all its contents?",
"permanentDeleteWarning": "This action cannot be undone. The item(s) will be permanently deleted from the server.",
"recent": "Recent",
"pinned": "Pinned",
"folderShortcuts": "Folder Shortcuts",
"failedToReconnectSSH": "Failed to reconnect SSH session",
"openTerminalHere": "Open Terminal Here",
"run": "Run",
"openTerminalInFolder": "Open Terminal in This Folder",
"openTerminalInFileLocation": "Open Terminal at File Location",
"runningFile": "Running - {{file}}",
"onlyRunExecutableFiles": "Can only run executable files",
"directories": "Directories",
"removedFromRecentFiles": "Removed \"{{name}}\" from recent files",
"removeFailed": "Remove failed",
"unpinnedSuccessfully": "Unpinned \"{{name}}\" successfully",
"unpinFailed": "Unpin failed",
"removedShortcut": "Removed shortcut \"{{name}}\"",
"removeShortcutFailed": "Remove shortcut failed",
"clearedAllRecentFiles": "Cleared all recent files",
"clearFailed": "Clear failed",
"removeFromRecentFiles": "Remove from recent files",
"clearAllRecentFiles": "Clear all recent files",
"unpinFile": "Unpin file",
"removeShortcut": "Remove shortcut",
"pinFile": "Pin file",
"addToShortcuts": "Add to shortcuts",
"pasteFailed": "Paste failed",
"noUndoableActions": "No undoable actions",
"undoCopySuccess": "Undid copy operation: Deleted {{count}} copied files",
"undoCopyFailedDelete": "Undo failed: Could not delete any copied files",
"undoCopyFailedNoInfo": "Undo failed: Could not find copied file information",
"undoMoveSuccess": "Undid move operation: Moved {{count}} files back to original location",
"undoMoveFailedMove": "Undo failed: Could not move any files back",
"undoMoveFailedNoInfo": "Undo failed: Could not find moved file information",
"undoDeleteNotSupported": "Delete operation cannot be undone: Files have been permanently deleted from server",
"undoTypeNotSupported": "Unsupported undo operation type",
"undoOperationFailed": "Undo operation failed",
"unknownError": "Unknown error",
"confirm": "Confirm",
"find": "Find...",
"replace": "Replace",
"downloadInstead": "Download Instead",
"keyboardShortcuts": "Keyboard Shortcuts",
"searchAndReplace": "Search & Replace",
"editing": "Editing",
"search": "Search",
"findNext": "Find Next",
"findPrevious": "Find Previous",
"save": "Save",
"selectAll": "Select All",
"undo": "Undo",
"redo": "Redo",
"moveLineUp": "Move Line Up",
"moveLineDown": "Move Line Down",
"toggleComment": "Toggle Comment",
"autoComplete": "Auto Complete",
"imageLoadError": "Failed to load image",
"startTyping": "Start typing...",
"unknownSize": "Unknown size",
"fileIsEmpty": "File is empty",
"largeFileWarning": "Large File Warning",
"largeFileWarningDesc": "This file is {{size}} in size, which may cause performance issues when opened as text.",
"fileNotFoundAndRemoved": "File \"{{name}}\" not found and has been removed from recent/pinned files",
"failedToLoadFile": "Failed to load file: {{error}}",
"serverErrorOccurred": "Server error occurred. Please try again later.",
"autoSaveFailed": "Auto-save failed",
"fileAutoSaved": "File auto-saved",
"moveFileFailed": "Failed to move {{name}}",
"moveOperationFailed": "Move operation failed",
"canOnlyCompareFiles": "Can only compare two files",
"comparingFiles": "Comparing files: {{file1}} and {{file2}}",
"dragFailed": "Drag operation failed",
"filePinnedSuccessfully": "File \"{{name}}\" pinned successfully",
"pinFileFailed": "Failed to pin file",
"fileUnpinnedSuccessfully": "File \"{{name}}\" unpinned successfully",
"unpinFileFailed": "Failed to unpin file",
"shortcutAddedSuccessfully": "Folder shortcut \"{{name}}\" added successfully",
"addShortcutFailed": "Failed to add shortcut",
"operationCompletedSuccessfully": "{{operation}} {{count}} items successfully",
"operationCompleted": "{{operation}} {{count}} items",
"downloadFileSuccess": "File {{name}} downloaded successfully",
"downloadFileFailed": "Download failed",
"moveTo": "Move to {{name}}",
"diffCompareWith": "Diff compare with {{name}}",
"dragOutsideToDownload": "Drag outside window to download ({{count}} files)",
"newFolderDefault": "NewFolder",
"newFileDefault": "NewFile.txt",
"successfullyMovedItems": "Successfully moved {{count}} items to {{target}}",
"move": "Move",
"searchInFile": "Search in file (Ctrl+F)",
"showKeyboardShortcuts": "Show keyboard shortcuts",
"startWritingMarkdown": "Start writing your markdown content...",
"loadingFileComparison": "Loading file comparison...",
"reload": "Reload",
"compare": "Compare",
"sideBySide": "Side by Side",
"inline": "Inline",
"fileComparison": "File Comparison: {{file1}} vs {{file2}}",
"fileTooLarge": "File too large: {{error}}",
"sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})",
"loadFileFailed": "Failed to load file: {{error}}",
"connecting": "Connecting...",
"connectedSuccessfully": "Connected successfully",
"totpVerificationFailed": "TOTP verification failed",
"warpgateVerificationFailed": "Warpgate authentication failed",
"authenticationFailed": "Authentication failed",
"verificationCodePrompt": "Verification code:",
"changePermissions": "Change Permissions",
"currentPermissions": "Current Permissions",
"owner": "Owner",
"group": "Group",
"others": "Others",
"read": "Read",
"write": "Write",
"execute": "Execute",
"permissionsChangedSuccessfully": "Permissions changed successfully",
"failedToChangePermissions": "Failed to change permissions",
"name": "Name",
"sortByName": "Name",
"sortByDate": "Date Modified",
"sortBySize": "Size",
"ascending": "Ascending",
"descending": "Descending",
"root": "Root",
"new": "New",
"sortBy": "Sort By",
"items": "Items",
"selected": "Selected",
"editor": "Editor",
"octal": "Octal",
"storage": "Storage",
"disk": "Disk",
"used": "Used",
"of": "of",
"toggleSidebar": "Toggle Sidebar",
"cannotLoadPdf": "Cannot load PDF",
"pdfLoadError": "There was an error loading this PDF file.",
"loadingPdf": "Loading PDF...",
"loadingPage": "Loading page..."
},
"transfer": {
"copyToHost": "Copy to host…",
"moveToHost": "Move to host…",
"copyItemsToHost": "Copy {{count}} items to host…",
"moveItemsToHost": "Move {{count}} items to host…",
"noHostsConnected": "No other file-manager hosts available.",
"noHostsConnectedHint": "Add another SSH host with File Manager enabled in Host Manager.",
"selectDestinationHost": "Select destination host",
"destinationPath": "Destination path",
"recentDestinations": "Recent destinations",
"collapseRecentDestinations": "Collapse recent destinations",
"expandRecentDestinations": "Expand recent destinations",
"browseFolders": "Browse destination folders",
"browseDestination": "Browse or enter path",
"confirmCopy": "Copy",
"confirmMove": "Move",
"transferring": "Transferring…",
"compressing": "Compressing…",
"extracting": "Extracting…",
"transferringItems": "Transferring {{current}} of {{total}} items…",
"transferSuccess": "Transfer complete",
"transferError": "Transfer failed",
"transferPartial": "Transfer completed with {{count}} errors",
"transferPartialHint": "Could not transfer: {{paths}}",
"itemsSummary": "{{count}} items",
"destMustBeDirectory": "Destination must be a directory for multi-item transfers",
"selectThisFolder": "Select this folder",
"browsePathWillBeCreated": "This folder does not exist yet. It will be created when the transfer starts.",
"browsePathError": "Could not open this path on the destination host.",
"goUp": "Go up",
"copyFolderToHost": "Copy folder to host…",
"moveFolderToHost": "Move folder to host…",
"hostReady": "Ready",
"hostConnecting": "Connecting…",
"hostDisconnected": "Not connected",
"hostAuthRequired": "Authentication required — open File Manager on this host first",
"hostConnectionFailed": "Connection failed",
"metricsTitle": "Transfer timings",
"metricsPrepare": "Prepare destination: {{duration}}",
"metricsCompress": "Compress on source: {{duration}}",
"metricsHopSourceRead": "Source → server: {{throughput}}",
"metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}",
"metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}",
"metricsTransfer": "End-to-end: {{throughput}} ({{duration}})",
"metricsExtract": "Extract on destination: {{duration}}",
"metricsSourceDelete": "Remove from source: {{duration}}",
"metricsTotal": "Total: {{duration}}",
"progressCompressing": "Compressing on source host…",
"progressExtracting": "Extracting on destination…",
"progressTransferring": "Transferring data…",
"progressReconnecting": "Reconnecting…",
"parallelSegmentsLabel": "Parallel transfer lanes",
"parallelSegmentsOption": "{{count}} lanes",
"parallelSegmentsHint": "Large files are split into 256 MB chunks. Multiple lanes use separate connections (like starting several transfers) for higher total throughput.",
"progressTotalSpeed": "{{speed}} total ({{lanes}} lanes)",
"progressTransferringItems": "Transferring files ({{current}} of {{total}})…",
"progressBytes": "{{transferred}} / {{total}}",
"progressItems": "{{current}} / {{total}} files",
"sourceNotDeletedPartial": "Source files kept (partial transfer)",
"jumpHostLimitation": "Both hosts must be reachable from the Termix server. Direct host-to-host routing is not supported.",
"cancel": "Cancel",
"methodLabel": "Transfer method",
"methodAuto": "Auto",
"methodTar": "Tar archive",
"methodItemSftp": "Per-file SFTP",
"methodAutoHint": "Picks tar or per-file SFTP based on file count, size, and compressibility. Single files always use streaming SFTP.",
"methodTarHint": "Compress on source, transfer one archive, extract on destination. Requires tar on both Unix hosts.",
"methodItemSftpHint": "Transfer each file individually over SFTP. Works on all hosts including Windows.",
"methodPreviewLoading": "Calculating transfer method…",
"methodPreviewError": "Could not preview transfer method. The server will still pick a method when you start.",
"methodPreviewWillUseTar": "Will use: Tar archive",
"methodPreviewWillUseItemSftp": "Will use: Per-file SFTP",
"methodPreviewScanSummary": "{{fileCount}} files, {{totalSize}} total (scanned on source host).",
"methodItemSftpLimitation": "Each file uses the same SFTP stream as a single-file copy, one after another. Progress is combined across all files, so the bar moves slowly during large files.",
"methodReason": {
"user_item_sftp": "You chose per-file SFTP.",
"user_tar": "You chose tar archive.",
"tar_unavailable": "Tar is not available on one or both hosts — per-file SFTP will be used instead.",
"windows_host": "A Windows host is involved — tar is not used.",
"auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data — tar bundles into one transfer.",
"auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set — per-file SFTP.",
"auto_many_incompressible": "Auto: mostly incompressible data — per-file SFTP.",
"auto_many_files": "Auto: many files ({{fileCount}}) — tar reduces per-file overhead.",
"auto_default": "Auto: per-file SFTP for this set."
},
"progressCancel": "Cancel",
"progressCancelling": "Cancelling…",
"progressStalled": "Stalled",
"resumedHint": "Reconnected to an active transfer started in another window.",
"transferCancelled": "Transfer cancelled",
"transferCancelledCopyHint": "Partial files may remain on the destination.",
"transferCancelledMoveHint": "Partial files may remain on the destination. Source files were not removed.",
"cleanupDestFiles": "Clean up destination",
"cleanupDestFilesSuccess": "Removed partial files from the destination",
"cleanupDestFilesPartial": "Some partial files could not be removed",
"cleanupDestFilesNothing": "Nothing to clean up on the destination",
"cleanupDestFilesError": "Cleanup failed",
"retryTransfer": "Retry",
"retryTransferError": "Retry failed",
"transferFailedRetryHint": "Partial data was kept on the destination. Retry will resume when the connection is back."
},
"tunnels": {
"noSshTunnels": "No SSH Tunnels",
"createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.",
"connected": "Connected",
"disconnected": "Disconnected",
"connecting": "Connecting...",
"error": "Error",
"canceling": "Canceling...",
"connect": "Connect",
"disconnect": "Disconnect",
"cancel": "Cancel",
"port": "Port",
"localPort": "Local Port",
"remotePort": "Remote Port",
"currentHostPort": "Current Host Port",
"endpointPort": "Endpoint Port",
"bindIp": "Local IP",
"endpointSshConfig": "Endpoint SSH Configuration",
"endpointSshHost": "Endpoint SSH Host",
"endpointSshHostPlaceholder": "Select a configured host",
"endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.",
"attempt": "Attempt {{current}} of {{max}}",
"nextRetryIn": "Next retry in {{seconds}} seconds",
"clientTunnels": "Client Tunnels",
"clientTunnel": "Client Tunnel",
"addClientTunnel": "Add Client Tunnel",
"noClientTunnels": "No client tunnels configured on this desktop.",
"tunnelName": "Tunnel Name",
"remoteHost": "Remote Host",
"autoStart": "Auto Start",
"clientAutoStartDesc": "Starts when this desktop client opens and stays connected.",
"clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.",
"clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.",
"clientTunnelStarted": "Client tunnel started",
"clientTunnelStopped": "Client tunnel stopped",
"tunnelTestSucceeded": "Tunnel test succeeded",
"tunnelTestFailed": "Tunnel test failed",
"localSaved": "Client tunnels saved",
"localSaveError": "Failed to save local client tunnels",
"invalidBindIp": "Local IP must be a valid IPv4 address.",
"invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.",
"invalidLocalPort": "Local port must be between 1 and 65535.",
"invalidRemotePort": "Remote port must be between 1 and 65535.",
"invalidLocalTargetPort": "Local target port must be between 1 and 65535.",
"invalidEndpointPort": "Endpoint port must be between 1 and 65535.",
"duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.",
"manualControlError": "Failed to update tunnel state.",
"active": "Active",
"start": "Start",
"stop": "Stop",
"test": "Test",
"type": "Tunnel Type",
"typeLocal": "Local (-L)",
"typeRemote": "Remote (-R)",
"typeDynamic": "Dynamic (-D)",
"typeServerLocalDesc": "Current host to endpoint.",
"typeServerRemoteDesc": "Endpoint back to current host.",
"typeClientLocalDesc": "Local computer to endpoint.",
"typeClientRemoteDesc": "Endpoint back to local computer.",
"typeClientDynamicDesc": "SOCKS on local computer.",
"typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH",
"forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.",
"forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.",
"forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.",
"forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.",
"forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.",
"forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.",
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}",
"summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}",
"summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}",
"autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}",
"autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}",
"autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}",
"route": "Route:",
"lastStarted": "Last started",
"lastTested": "Last tested",
"lastError": "Last error",
"maxRetries": "Max Retries",
"maxRetriesDescription": "Maximum amount of retry attempts.",
"retryInterval": "Retry Interval (seconds)",
"retryIntervalDescription": "Time to wait between retry attempts.",
"local": "Local",
"remote": "Remote",
"destination": "Destination",
"host": "Host",
"mode": "Mode",
"noHostSelected": "No host selected",
"working": "Working..."
},
"cardGrid": {
"dragToMove": "Drag to move",
"dragToResize": "Drag to resize",
"changeWidth": "Change width",
"removeCard": "Remove {{label}}",
"addCard": "Add",
"columns": "Columns",
"empty": "No cards. Use Add below to place cards."
},
"hostMetrics": {
"cpu": "CPU",
"memory": "Memory",
"disk": "Disk",
"network": "Network",
"uptime": "Uptime",
"processes": "Processes",
"available": "Available",
"free": "Free",
"connecting": "Connecting...",
"connectionFailed": "Failed to connect to server",
"naCpus": "N/A CPU(s)",
"cpuCores_one": "{{count}} Core",
"cpuCores_other": "{{count}} Cores",
"cpuUsage": "CPU Usage",
"memoryUsage": "Memory Usage",
"diskUsage": "Disk Usage",
"failedToFetchHostConfig": "Failed to fetch host configuration",
"serverOffline": "Server Offline",
"cannotFetchMetrics": "Cannot fetch metrics from offline server",
"totpFailed": "TOTP verification failed",
"noneAuthNotSupported": "Host Metrics does not support 'none' authentication type.",
"noHostSelected": "No host selected",
"load": "Load",
"systemInfo": "System Information",
"hostname": "Hostname",
"operatingSystem": "Operating System",
"kernel": "Kernel",
"seconds": "seconds",
"networkInterfaces": "Network Interfaces",
"noInterfacesFound": "No network interfaces found",
"noProcessesFound": "No processes found",
"processesTotal": "total",
"processesRunning": "running",
"loginStats": "SSH Login Statistics",
"noRecentLoginData": "No recent login data",
"executingQuickAction": "Executing {{name}}...",
"quickActionSuccess": "{{name}} completed successfully",
"quickActionFailed": "{{name}} failed",
"quickActionError": "Failed to execute {{name}}",
"ports": {
"title": "Listening Ports",
"protocol": "Protocol",
"port": "Port",
"address": "Address",
"process": "Process",
"search": "Search ports...",
"allProtocols": "All",
"noData": "No listening ports data"
},
"firewall": {
"title": "Firewall",
"inactive": "Inactive",
"policy": "Policy",
"rules": "rules",
"noRules": "No rules in this chain",
"noData": "No firewall data available",
"action": "Action",
"protocol": "Proto",
"port": "Port",
"source": "Source",
"anywhere": "Anywhere",
"chains": "chains"
},
"loadAvg": "Load Avg",
"swap": "Swap",
"architecture": "Architecture",
"refresh": "Refresh",
"retry": "Retry",
"customize": "Customize layout",
"reset": "Reset",
"editModeInstructions": "Drag cards to rearrange, drag the bottom edge to resize, and use the width button to change a card's span. Add or remove cards below.",
"managers": {
"services": "Services",
"processInspector": "Process Inspector",
"logViewer": "Log Viewer",
"cron": "Cron Jobs",
"packages": "Packages",
"ssl": "SSL Certificates",
"firewall": "Firewall",
"users": "Users & Permissions",
"healthCheck": "Health Checks",
"diskBreakdown": "Disk Breakdown",
"systemdTimers": "Timers",
"topMemory": "Top by Memory",
"noData": "No data",
"sudoHint": "Set a sudo password for this host in the host editor to enable privileged actions.",
"filter": "Filter...",
"start": "Start",
"stop": "Stop",
"restart": "Restart",
"actionDone": "{{name}} updated",
"actionFailed": "Action failed",
"signalSent": "Signal sent to PID {{pid}}",
"killHint": "Click: terminate (SIGTERM). Right-click: force kill (SIGKILL).",
"working": "Working...",
"update": "Update",
"upgradeAll": "Upgrade all",
"allUpToDate": "Everything is up to date",
"save": "Save",
"command": "Command",
"enabled": "Enabled",
"cronSaved": "Crontab updated",
"clients": "Clients",
"dryRun": "Dry run",
"renew": "Renew",
"noAcmeClient": "No ACME client (certbot or acme.sh) found on this host.",
"addInputRule": "Add INPUT rule",
"firewallWarning": "Changes are runtime-only until persisted. Be careful not to lock yourself out.",
"ruleApplied": "Rule applied",
"invalidPort": "Enter a valid port (1-65535)",
"newUsername": "New username",
"addUser": "Add",
"deleteUser": "Delete user",
"noHealthChecks": "No health checks configured yet.",
"follow": "Follow",
"noLogData": "No log output.",
"tree": "Tree",
"enableDisable": "Enable / disable at boot",
"grantSudo": "Grant sudo",
"revokeSudo": "Revoke sudo",
"sslIssueCert": "Issue certificate",
"sslExpired": "Expired",
"sslInDays": "in {{days}}d",
"sslNeedDomain": "Enter at least one domain",
"sslIssued": "Certificate issued",
"sslDomainsPlaceholder": "example.com, www.example.com",
"sslHttpStandalone": "HTTP (standalone)",
"sslHttpWebroot": "HTTP (webroot)",
"sslDns": "DNS",
"sslDnsProvider": "DNS provider (e.g. cloudflare)",
"sslIssueHint": "DNS provider credentials must already be configured on the host.",
"sslRevoke": "Revoke certificate",
"sslRevoked": "Certificate revoked",
"sslRevokeConfirm": "Revoke and remove the certificate \"{{name}}\"? This cannot be undone.",
"healthRun": "Run",
"healthName": "Name",
"healthTarget": "Host / address",
"healthAddCheck": "Add check",
"healthSaved": "Health checks saved",
"healthMissingFields": "Each check needs a name and target",
"logFile": "File",
"logUnit": "Unit",
"logCustomPath": "Custom path under /var/log (optional)",
"logGrep": "Filter lines...",
"firewallPersist": "Persist rules",
"firewallPersisted": "Firewall rules persisted"
}
},
"auth": {
"tagline": "Self-hosted SSH and remote desktop management",
"loginTitle": "Login to Termix",
"registerTitle": "Create Account",
"forgotPassword": "Forgot Password?",
"rememberMe": "Remember Device for 30 Days (includes TOTP)",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"twoFactorAuth": "Two-Factor Authentication",
"enterCode": "Enter verification code",
"backupCode": "Or use backup code",
"verifyCode": "Verify Code",
"redirectingToApp": "Redirecting to app...",
"sshAuthenticationRequired": "SSH Authentication Required",
"sshNoKeyboardInteractive": "Keyboard-Interactive Authentication Unavailable",
"sshAuthenticationFailed": "Authentication Failed",
"sshAuthenticationTimeout": "Authentication Timeout",
"sshNoKeyboardInteractiveDescription": "The server does not support keyboard-interactive authentication. Please provide your password or SSH key.",
"sshAuthFailedDescription": "The provided credentials were incorrect. Please try again with valid credentials.",
"sshTimeoutDescription": "The authentication attempt timed out. Please try again.",
"sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.",
"sshPasswordDescription": "Enter the password for this SSH connection.",
"sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.",
"passphraseRequired": "Passphrase Required",
"passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.",
"back": "Back",
"firstUser": "First User",
"firstUserMessage": "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.",
"external": "External",
"loginWithExternal": "Login with External Provider",
"loginWithExternalDesc": "Login using your configured external identity provider",
"externalNotSupportedInElectron": "External authentication is not supported in the Electron app yet. Please use the web version for OIDC login.",
"loginWithProvider": "Login with {{name}}",
"orContinueWith": "or continue with",
"ldapUsername": "LDAP Username",
"ldapPassword": "LDAP Password",
"ldapSignIn": "Sign In",
"ldapLoginFailed": "LDAP login failed",
"resetPasswordButton": "Reset Password",
"sendResetCode": "Send Reset Code",
"resetCodeDesc": "Enter your username to receive a password reset code. The code will be logged in the docker container logs.",
"resetCode": "Reset Code",
"verifyCodeButton": "Verify Code",
"enterResetCode": "Enter the 6-digit code from the docker container logs for user:",
"newPassword": "New Password",
"confirmNewPassword": "Confirm Password",
"enterNewPassword": "Enter your new password for user:",
"signUp": "Sign Up",
"desktopApp": "Desktop App",
"loggingInToDesktopApp": "Logging in to the desktop app",
"loadingServer": "Loading server...",
"dataLossWarning": "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.",
"authenticationDisabled": "Authentication Disabled",
"authenticationDisabledDesc": "All authentication methods are currently disabled. Please contact your administrator.",
"attemptsRemaining": "{{count}} attempts remaining"
},
"hostKey": {
"verifyNewHost": "Verify SSH Host Key",
"keyChangedWarning": "SSH Host Key Changed",
"firstConnectionTitle": "First time connecting to this host",
"firstConnectionDescription": "The authenticity of this host cannot be established. Verify the fingerprint matches what you expect.",
"keyChangedDescription": "The host key for this server has changed since your last connection. This could indicate a security issue.",
"previousKey": "Previous Key",
"newFingerprint": "New Fingerprint",
"fingerprint": "Fingerprint",
"verifyInstructions": "If you trust this host, click Accept to continue and save this fingerprint for future connections.",
"securityWarning": "Security Warning",
"acceptAndContinue": "Accept & Continue",
"acceptNewKey": "Accept New Key & Continue"
},
"errors": {
"databaseConnection": "Could not connect to the database",
"unknownError": "Unknown error",
"loginFailed": "Login failed",
"failedPasswordReset": "Failed to initiate password reset",
"failedVerifyCode": "Failed to verify reset code",
"failedCompleteReset": "Failed to complete password reset",
"invalidTotpCode": "Invalid TOTP code",
"failedOidcLogin": "Failed to start OIDC login",
"silentSigninOidcUnavailable": "Silent sign-in was requested, but OIDC login is not available.",
"failedUserInfo": "Failed to get user info after login",
"oidcAuthFailed": "OIDC authentication failed",
"invalidAuthUrl": "Invalid authorization URL received from backend",
"requiredField": "This field is required",
"minLength": "Minimum length is {{min}}",
"passwordMismatch": "Passwords do not match",
"passwordLoginDisabled": "Username/password login is currently disabled",
"sessionExpired": "Session expired - please log in again",
"totpRateLimited": "Rate limited: Too many TOTP verification attempts. Please try again later.",
"totpRateLimitedWithTime": "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.",
"resetCodeRateLimited": "Rate limited: Too many verification attempts. Please try again later.",
"resetCodeRateLimitedWithTime": "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.",
"authTokenSaveFailed": "Failed to save authentication token",
"failedToLoadServer": "Failed to load server"
},
"messages": {
"registrationDisabled": "New account registration is currently disabled by an admin. Please log in or contact an administrator.",
"userNotAllowed": "Your account is not authorized to register. Please contact an administrator.",
"databaseConnectionFailed": "Failed to connect to the database server",
"resetCodeSent": "Reset code sent to Docker logs",
"codeVerified": "Code verified successfully",
"passwordResetSuccess": "Password reset successfully",
"loginSuccess": "Login successful",
"registrationSuccess": "Registration successful"
},
"profile": {
"c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.",
"c2sTunnelPresets": "Client Tunnel Presets",
"c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.",
"c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.",
"c2sPresetName": "Preset Name",
"c2sPresetNamePlaceholder": "Client preset name",
"c2sPresetToLoad": "Preset To Load",
"c2sNoPresetSelected": "No preset selected",
"c2sNoPresets": "No presets saved",
"c2sLoadPreset": "Load",
"c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.",
"c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.",
"c2sPresetSaved": "Client tunnel preset saved",
"c2sPresetLoaded": "Client tunnel preset loaded locally",
"c2sPresetRenamed": "Client tunnel preset renamed",
"c2sPresetDeleted": "Client tunnel preset deleted",
"c2sPresetLoadError": "Failed to load client tunnel presets"
},
"placeholders": {
"maxRetries": "3",
"retryInterval": "10",
"language": "Language",
"keyPassword": "key password",
"pastePrivateKey": "Paste your private key here...",
"localListenerHost": "127.0.0.1 (listen locally)",
"localTargetHost": "127.0.0.1 (target on this computer)",
"socksListenerHost": "127.0.0.1 (SOCKS listener)",
"enterPassword": "Enter your password",
"defaultPort": "22",
"defaultEndpointPort": "224"
},
"dashboard": {
"title": "Dashboard",
"loading": "Loading dashboard...",
"github": "GitHub",
"support": "Support",
"discord": "Discord",
"docs": "Docs",
"serverOverview": "Server Overview",
"version": "Version",
"upToDate": "Up to Date",
"updateAvailable": "Update Available",
"beta": "Beta",
"uptime": "Uptime",
"database": "Database",
"healthy": "Healthy",
"error": "Error",
"totalHosts": "Total Hosts",
"totalTunnels": "Total Tunnels",
"totalCredentials": "Total Credentials",
"recentActivity": "Recent Activity",
"reset": "Reset",
"loadingRecentActivity": "Loading recent activity...",
"noRecentActivity": "No recent activity",
"quickActions": "Quick Actions",
"addHost": "Add Host",
"addCredential": "Add Credential",
"adminSettings": "Admin Settings",
"userProfile": "User Profile",
"serverStats": "Server Stats",
"loadingServerStats": "Loading server stats...",
"noServerData": "No server data available",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Customize Dashboard",
"dashboardSettings": "Dashboard Settings",
"enableDisableCards": "Enable/Disable Cards",
"resetLayout": "Reset to Default",
"serverOverviewCard": "Server Overview",
"recentActivityCard": "Recent Activity",
"networkGraphCard": "Network Graph",
"networkGraph": "Network Graph",
"quickActionsCard": "Quick Actions",
"serverStatsCard": "Server Stats",
"panelMain": "Main",
"panelSide": "Side",
"justNow": "just now"
},
"dashboardTab": {
"stable": "STABLE",
"hostsOnline": "Hosts Online",
"activeTunnels": "Active Tunnels",
"registerNewServer": "Register a new server",
"storeSshKeysOrPasswords": "Store SSH keys or passwords",
"manageUsersAndRoles": "Manage users and roles",
"manageYourAccount": "Manage your account",
"hostStatus": "Host Status",
"noHostsConfigured": "No hosts configured",
"online": "ONLINE",
"offline": "OFFLINE",
"onlineLower": "Online",
"nodes": "{{count}} nodes",
"add": "Add:",
"commandPalette": "Command Palette",
"done": "Done",
"editModeInstructions": "Drag cards to reorder · Drag the column divider to resize columns · Drag the bottom edge of a card to resize its height · Trash to remove",
"empty": "Empty",
"clear": "Clear"
},
"sessionLogs": {
"title": "Session Logs",
"noLogs": "No session logs yet",
"noLogsDesc": "Enable session logging on a host to start recording",
"duration": "Duration",
"viewLog": "View log",
"downloadLog": "Download",
"deleteLog": "Delete",
"confirmDelete": "Delete this session log?",
"confirmDeleteDesc": "This action cannot be undone.",
"copyContent": "Copy",
"copied": "Copied!",
"loadError": "Failed to load session logs",
"deleteError": "Failed to delete session log",
"filterByHost": "Filter by host..."
},
"networkGraph": {
"addHost": "Add Host",
"addGroup": "Add Group",
"addLink": "Add Link",
"zoomIn": "Zoom In",
"zoomOut": "Zoom Out",
"resetView": "Reset View",
"selectHost": "Select Host",
"chooseHost": "Choose a host...",
"parentGroup": "Parent Group",
"noGroup": "No Group",
"groupName": "Group Name",
"color": "Color",
"source": "Source",
"target": "Target",
"moveToGroup": "Move to Group",
"selectGroup": "Select group...",
"addConnection": "Add Connection",
"hostDetails": "Host Details",
"removeFromGroup": "Remove from Group",
"addHostHere": "Add Host Here",
"editGroup": "Edit Group",
"delete": "Delete",
"add": "Add",
"create": "Create",
"move": "Move",
"connect": "Connect",
"createGroup": "Create Group",
"selectSourcePlaceholder": "Select Source...",
"selectTargetPlaceholder": "Select Target...",
"invalidFile": "Invalid File",
"hostAlreadyExists": "Host is already in the topology",
"connectionExists": "Connection already exists",
"unknown": "Unknown",
"name": "Name",
"ip": "IP",
"status": "Status",
"failedToAddNode": "Failed to add node",
"sourceDifferentFromTarget": "Source and target must be different",
"exportJSON": "Export JSON",
"importJSON": "Import JSON",
"terminal": "Terminal",
"fileManager": "File Manager",
"tunnel": "Tunnel",
"docker": "Docker",
"serverStats": "Host Metrics",
"hostMetrics": "Host Metrics",
"noNodes": "No nodes yet"
},
"docker": {
"notEnabled": "Docker is not enabled for this host",
"validating": "Validating Docker...",
"connecting": "Connecting...",
"error": "Error",
"version": "Docker {{version}}",
"connectionFailed": "Failed to connect to Docker",
"containerStarted": "Container {{name}} started",
"failedToStartContainer": "Failed to start container {{name}}",
"containerStopped": "Container {{name}} stopped",
"failedToStopContainer": "Failed to stop container {{name}}",
"containerRestarted": "Container {{name}} restarted",
"failedToRestartContainer": "Failed to restart container {{name}}",
"containerPaused": "Container {{name}} paused",
"containerUnpaused": "Container {{name}} unpaused",
"failedToTogglePauseContainer": "Failed to toggle pause state for container {{name}}",
"containerRemoved": "Container {{name}} removed",
"failedToRemoveContainer": "Failed to remove container {{name}}",
"image": "Image",
"ports": "Ports",
"noPorts": "No ports",
"start": "Start",
"confirmRemoveContainer": "Are you sure you want to remove the container '{{name}}'? This action cannot be undone.",
"runningContainerWarning": "Warning: This container is currently running. Removing it will stop the container first.",
"loadingContainers": "Loading containers...",
"manager": "Docker Manager",
"autoRefresh": "Auto Refresh",
"timestamps": "Timestamps",
"lines": "Lines",
"filterLogs": "Filter logs...",
"refresh": "Refresh",
"download": "Download",
"clear": "Clear",
"logsDownloaded": "Logs downloaded successfully",
"last50": "Last 50",
"last100": "Last 100",
"last500": "Last 500",
"last1000": "Last 1000",
"allLogs": "All Logs",
"noLogsMatching": "No logs matching \"{{query}}\"",
"noLogsAvailable": "No logs available",
"noContainersFound": "No containers found",
"noContainersFoundHint": "No Docker containers are available on this host",
"searchPlaceholder": "Search containers...",
"allStatuses": "All Statuses",
"stateRunning": "Running",
"statePaused": "Paused",
"stateExited": "Exited",
"stateRestarting": "Restarting",
"noContainersMatchFilters": "No containers match your filters",
"noContainersMatchFiltersHint": "Try adjusting your search or filter criteria",
"failedToFetchStats": "Failed to fetch container statistics",
"containerNotRunning": "Container not running",
"startContainerToViewStats": "Start the container to view statistics",
"loadingStats": "Loading statistics...",
"errorLoadingStats": "Error loading statistics",
"noStatsAvailable": "No statistics available",
"cpuUsage": "CPU Usage",
"current": "Current",
"memoryUsage": "Memory Usage",
"networkIo": "Network I/O",
"input": "Input",
"output": "Output",
"blockIo": "Block I/O",
"read": "Read",
"write": "Write",
"pids": "PIDs",
"containerInformation": "Container Information",
"name": "Name",
"id": "ID",
"state": "State",
"containerMustBeRunning": "Container must be running to access console",
"verificationCodePrompt": "Enter verification code",
"totpVerificationFailed": "TOTP verification failed. Please try again.",
"warpgateVerificationFailed": "Warpgate authentication failed. Please try again.",
"connectedTo": "Connected to {{containerName}}",
"disconnected": "Disconnected",
"consoleError": "Console error",
"errorMessage": "Error: {{message}}",
"failedToConnect": "Failed to connect to container",
"console": "Console",
"selectShell": "Select shell",
"bash": "Bash",
"sh": "sh",
"ash": "ash",
"connect": "Connect",
"disconnect": "Disconnect",
"notConnected": "Not connected",
"clickToConnect": "Click connect to start a shell session",
"connectingTo": "Connecting to {{containerName}}...",
"containerNotFound": "Container not found",
"backToList": "Back to List",
"logs": "Logs",
"stats": "Stats",
"consoleTab": "Console",
"startContainerToAccess": "Start the container to access the console"
},
"admin": {
"sectionGeneral": "General",
"sectionOidc": "OIDC",
"sectionSso": "SSO Providers",
"ssoAddProvider": "Add Provider",
"ssoDocsLink": "View docs",
"ssoProviderDocsLink": "View docs",
"ssoNoProviders": "No SSO providers configured.",
"ssoProviderName": "Display Name",
"ssoProviderType": "Provider Type",
"ssoDeleteProvider": "Delete Provider",
"ssoDeleteConfirm": "Delete this provider? Associated users will be unable to login.",
"ssoTypeOidc": "OIDC",
"ssoTypeLdap": "LDAP",
"ssoTypeGithub": "GitHub",
"ssoTypeGoogle": "Google",
"ssoEnabled": "Enabled",
"ssoDisabled": "Disabled",
"ssoSaveProvider": "Save Provider",
"ssoTestConnection": "Test Connection",
"ssoEditProvider": "Edit Provider",
"ldapHost": "LDAP Host",
"ldapPort": "Port",
"ldapUseTls": "Use TLS (LDAPS)",
"ldapBindDn": "Bind DN",
"ldapBindPassword": "Bind Password",
"ldapUserSearchBase": "User Search Base",
"ldapUserSearchFilter": "User Search Filter",
"ldapUsernameAttr": "Username Attribute",
"ldapDisplayNameAttr": "Display Name Attribute",
"ldapGroupSearchBase": "Group Search Base",
"ldapAdminGroup": "Admin Group",
"ldapAllowedUsers": "Allowed Users",
"sectionUsers": "Users",
"sectionSessions": "Sessions",
"sectionRoles": "Roles",
"sectionDatabase": "Database",
"sectionApiKeys": "API Keys",
"sectionAuditLog": "Audit Log",
"auditLogTotal": "{{total}} total entries",
"auditLogEmpty": "No audit log entries found",
"auditLogSuccess": "Success",
"auditLogFailed": "Failed",
"auditLogClearFilters": "Clear Filters",
"auditLogPage": "Page {{page}} of {{totalPages}} ({{total}} total)",
"auditLogIp": "IP",
"auditLogResourceId": "Resource ID",
"auditLogFilterUser": "User",
"auditLogFilterAction": "Action",
"auditLogFilterResourceType": "Resource Type",
"auditLogFilterStatus": "Status",
"auditLogFilterFrom": "From",
"auditLogFilterTo": "To",
"auditLogFilterAll": "All",
"allowRegistration": "Allow User Registration",
"allowRegistrationDesc": "Let new users self-register",
"allowPasswordLogin": "Allow Password Login",
"allowPasswordLoginDesc": "Username/password login",
"oidcAutoProvision": "OIDC Auto-Provision",
"oidcAutoProvisionDesc": "Auto-create accounts for OIDC users even when registration is disabled",
"allowPasswordReset": "Allow Password Reset",
"allowPasswordResetDesc": "Reset code via Docker logs",
"commandHistoryEnabled": "Command History",
"commandHistoryEnabledDesc": "Allow command history recording. When disabled, history is not saved regardless of per-host settings.",
"updateCommandHistoryFailed": "Failed to update command history setting",
"sessionTimeout": "Session Timeout",
"hours": "hours",
"sessionTimeoutRange": "Min 1h · Max 720h",
"monitoringDefaults": "Monitoring Defaults",
"statusCheck": "Status Check",
"metrics": "Metrics",
"sec": "sec",
"logLevel": "Log Level",
"enableGuacamole": "Enable Guacamole",
"enableGuacamoleDesc": "RDP/VNC remote desktop",
"enableGuacamoleDocsLink": "View docs",
"guacdUrl": "guacd URL",
"tailscaleApiKey": "Tailscale API Key",
"tailscaleApiKeyDescription": "Used for device discovery in the host editor. Generate a key at tailscale.com/admin/settings/keys.",
"tailscaleApiKeyDocsLink": "View docs",
"oidcDescription": "Configure OpenID Connect for SSO. Fields marked * are required.",
"oidcDocsLink": "View docs",
"oidcClientId": "Client ID",
"oidcClientSecret": "Client Secret",
"oidcAuthUrl": "Authorization URL",
"oidcIssuerUrl": "Issuer URL",
"oidcTokenUrl": "Token URL",
"oidcUserIdentifier": "User Identifier Path",
"oidcDisplayName": "Display Name Path",
"oidcScopes": "Scopes",
"oidcUserinfoUrl": "Override Userinfo URL",
"oidcAllowedUsers": "Allowed Users",
"oidcAllowedUsersDesc": "One email per line. Leave empty to allow all.",
"oidcAdminGroup": "Admin Group",
"oidcAdminGroupDesc": "Users in this group are granted admin. Leave empty to disable group sync.",
"oidcGroupClaim": "Group Claim",
"oidcGroupClaimDesc": "Optional. The claim path that contains the user's groups. Defaults to groups, roles, then group. Use this for providers with a custom claim (e.g. Zitadel).",
"removeOidc": "Remove",
"usersCount": "{{count}} users",
"createUser": "Create",
"newRole": "New Role",
"roleName": "Name",
"roleDisplayName": "Display Name",
"roleDescription": "Description",
"rolesCount": "{{count}} roles",
"createRole": "Create",
"creating": "Creating...",
"exportDatabase": "Export Database",
"exportDatabaseDesc": "Download a backup of all hosts, credentials, and settings",
"export": "Export",
"exporting": "Exporting...",
"importDatabase": "Import Database",
"importDatabaseDesc": "Restore from a .sqlite backup file",
"importDatabaseSelected": "Selected: {{name}}",
"selectFile": "Select File",
"changeFile": "Change",
"import": "Import",
"importing": "Importing...",
"apiKeysCount": "{{count}} keys",
"apiKeysDocsLink": "View docs",
"newApiKey": "New API Key",
"apiKeyCreatedWarning": "Key created - copy it now, it won't be shown again.",
"apiKeyName": "Name",
"apiKeyUser": "User",
"apiKeySelectUser": "Select a user...",
"apiKeyExpiresAt": "Expires At",
"createKey": "Create Key",
"apiKeyNoExpiry": "No expiry",
"revokedBadge": "REVOKED",
"authTypeDual": "Dual Auth",
"authTypeOidc": "OIDC",
"authTypeLocal": "Local",
"adminStatusAdministrator": "Administrator",
"adminStatusRegularUser": "Regular User",
"adminBadge": "ADMIN",
"systemBadge": "SYS",
"customBadge": "CUSTOM",
"youBadge": "YOU",
"sessionsActive": "{{count}} active",
"sessionActive": "Active: {{time}}",
"sessionExpires": "Exp: {{time}}",
"revokeAll": "All",
"revokeAllSessionsSuccess": "All sessions for user revoked",
"revokeAllSessionsFailed": "Failed to revoke sessions",
"revokeSessionFailed": "Failed to revoke session",
"addRole": "Add role",
"noCustomRoles": "No custom roles defined",
"removeRoleFailed": "Failed to remove role",
"assignRoleFailed": "Failed to assign role",
"deleteRoleFailed": "Failed to delete role",
"userAdminAccess": "Administrator",
"userAdminAccessDesc": "Full access to all admin settings",
"userRoles": "Roles",
"revokeAllUserSessions": "Revoke All Sessions",
"revokeAllUserSessionsDesc": "Force re-login on all devices",
"revoke": "Revoke",
"deleteUserWarning": "Deleting this user is permanent.",
"deleteUser": "Delete {{username}}",
"deleting": "Deleting...",
"deleteUserFailed": "Failed to delete user",
"deleteUserSuccess": "User \"{{username}}\" deleted",
"deleteRoleSuccess": "Role \"{{name}}\" deleted",
"revokeKeySuccess": "Key \"{{name}}\" revoked",
"revokeKeyFailed": "Failed to revoke key",
"copiedToClipboard": "Copied to clipboard",
"done": "Done",
"createUserTitle": "Create User",
"createUserDesc": "Create a new local account.",
"createUserUsername": "Username",
"createUserPassword": "Password",
"createUserPasswordHint": "Minimum 6 characters.",
"createUserEnterUsername": "Enter username",
"createUserEnterPassword": "Enter password",
"createUserSubmit": "Create User",
"editUserTitle": "Manage User: {{username}}",
"editUserDesc": "Edit roles, admin status, sessions, and account settings.",
"editUserUsername": "Username",
"editUserAuthType": "Auth Type",
"editUserAdminStatus": "Admin Status",
"editUserUserId": "User ID",
"linkAccountTitle": "Link Accounts",
"linkAccountDesc": "Merge the OIDC account {{username}} with an existing local account.",
"linkAccountDescLocal": "Link a local account {{username}} with an existing OIDC-only account.",
"linkAccountWarningTitle": "This will:",
"linkAccountEffect1": "Delete the OIDC-only account",
"linkAccountEffect2": "Add OIDC login to the target account",
"linkAccountEffect3": "Allow both OIDC and password login",
"linkAccountTargetUsername": "Local Account Username",
"linkAccountTargetPlaceholder": "Enter the local account username to link to",
"linkAccountOidcUsername": "OIDC Account Username",
"linkAccountOidcPlaceholder": "Enter the OIDC-only account username to merge in",
"linkAccountOidcNotFound": "No OIDC-only account found with that username",
"linkAccounts": "Link Accounts",
"linkAccountSuccess": "Accounts linked successfully",
"linkAccountFailed": "Failed to link accounts",
"linkAccountInProgress": "Linking...",
"saving": "Saving...",
"updateRegistrationFailed": "Failed to update registration setting",
"updatePasswordLoginFailed": "Failed to update password login setting",
"updateOidcAutoProvisionFailed": "Failed to update OIDC auto-provision setting",
"updatePasswordResetFailed": "Failed to update password reset setting",
"sessionTimeoutRange2": "Session timeout must be between 1 and 720 hours",
"sessionTimeoutSaved": "Session timeout saved",
"sessionTimeoutSaveFailed": "Failed to save session timeout",
"monitoringIntervalInvalid": "Invalid interval values",
"monitoringSaved": "Monitoring settings saved",
"monitoringSaveFailed": "Failed to save monitoring settings",
"guacamoleSaved": "Guacamole settings saved",
"guacamoleSaveFailed": "Failed to save Guacamole settings",
"guacamoleUpdateFailed": "Failed to update Guacamole setting",
"tailscaleSettingsSaved": "Tailscale settings saved",
"tailscaleSettingsSaveFailed": "Failed to save Tailscale settings",
"logLevelUpdateFailed": "Failed to update log level",
"oidcSaved": "OIDC configuration saved",
"oidcSaveFailed": "Failed to save OIDC config",
"oidcRemoved": "OIDC configuration removed",
"oidcRemoveFailed": "Failed to remove OIDC config",
"createUserRequired": "Username and password are required",
"createUserPasswordTooShort": "Password must be at least 6 characters",
"createUserSuccess": "User \"{{username}}\" created",
"createUserFailed": "Failed to create user",
"updateAdminStatusFailed": "Failed to update admin status",
"allSessionsRevoked": "All sessions revoked",
"revokeSessionsFailed": "Failed to revoke sessions",
"createRoleRequired": "Name and display name are required",
"createRoleSuccess": "Role \"{{name}}\" created",
"createRoleFailed": "Failed to create role",
"apiKeyNameRequired": "Key name is required",
"apiKeyUserRequired": "User ID is required",
"apiKeyCreatedSuccess": "API key \"{{name}}\" created",
"apiKeyCreateFailed": "Failed to create API key",
"exportSuccess": "Database exported successfully",
"exportFailed": "Database export failed",
"importSelectFile": "Please select a file first",
"importCompleted": "Import completed: {{total}} items imported, {{skipped}} skipped",
"importFailed": "Import failed: {{error}}",
"importError": "Database import failed"
},
"newUi": {
"sidebar": {
"quickConnect": {
"hostLabel": "Host",
"hostPlaceholder": "192.168.1.1 or example.com",
"portLabel": "Port",
"portPlaceholder": "22",
"usernameLabel": "Username",
"usernamePlaceholder": "username",
"authLabel": "Auth",
"passwordLabel": "Password",
"passwordPlaceholder": "password",
"privateKeyLabel": "Private Key",
"privateKeyPlaceholder": "Paste private key...",
"credentialLabel": "Credential",
"credentialPlaceholder": "Select a saved credential",
"connectToTerminal": "Connect to Terminal",
"connectToFiles": "Connect to Files"
},
"history": {
"noTerminalSelected": "No terminal selected",
"noTerminalSelectedHint": "Open an SSH terminal tab to view its command history",
"searchPlaceholder": "Search history...",
"clearAll": "Clear All",
"noHistoryEntries": "No history entries",
"trackingDisabled": "History tracking is disabled",
"trackingDisabledHint": "Enable it in the host's terminal settings."
},
"sshTools": {
"keyRecordingTitle": "Key Recording",
"recordToTerminals": "Record to terminals",
"selectAll": "All",
"selectNone": "None",
"noTerminalTabsOpen": "No terminal tabs open",
"selectTerminalsAbove": "Select terminals above",
"broadcastInputPlaceholder": "Type here to broadcast keystrokes...",
"stopRecording": "Stop Recording",
"startRecording": "Start Recording",
"settingsTitle": "Settings",
"enableRightClickCopyPaste": "Enable right-click copy/paste"
},
"splitScreen": {
"layoutTitle": "Layout",
"selectLayoutAbove": "Select a layout above",
"selectLayoutHint": "Choose how many panes to display",
"panesTitle": "Panes",
"openTabsTitle": "Open Tabs",
"dragTabsHint": "Drag tabs into panes above, or use Quick Assign",
"dropHere": "Drop here",
"emptyPane": "Empty",
"dashboard": "Dashboard",
"clearSplitScreen": "Clear Split Screen",
"quickAssign": "Quick Assign",
"alreadyAssigned": "Pane {{index}}",
"splitTab": "Split Tab",
"addToSplit": "Add to Split",
"removeFromSplit": "Remove from Split",
"assignToPane": "Assign to pane"
},
"snippets": {
"title": "Snippets",
"createSnippetTitle": "Create Snippet",
"createSnippetDescription": "Create a new command snippet for quick execution",
"nameLabel": "Name",
"namePlaceholder": "e.g., Restart Nginx",
"descriptionLabel": "Description",
"descriptionPlaceholder": "Optional description",
"optional": "Optional",
"folderLabel": "Folder",
"noFolder": "No folder (Uncategorized)",
"commandLabel": "Command",
"commandPlaceholder": "e.g., sudo systemctl restart nginx",
"cancel": "Cancel",
"createSnippetButton": "Create Snippet",
"createFolderTitle": "Create Folder",
"createFolderDescription": "Organize your snippets into folders",
"folderNameLabel": "Folder Name",
"folderNamePlaceholder": "e.g., System Commands, Docker Scripts",
"folderColorLabel": "Folder Color",
"folderIconLabel": "Folder Icon",
"previewLabel": "Preview",
"folderNameFallback": "Folder Name",
"createFolderButton": "Create Folder",
"targetTerminals": "Target Terminals",
"selectAll": "All",
"selectNone": "None",
"noTerminalTabsOpen": "No terminal tabs open",
"searchPlaceholder": "Search snippets...",
"newSnippet": "New Snippet",
"newFolder": "New Folder",
"run": "Run",
"noSnippetsInFolder": "No snippets in this folder",
"uncategorized": "Uncategorized",
"editSnippetTitle": "Edit Snippet",
"editSnippetDescription": "Update this command snippet",
"saveSnippetButton": "Save Changes",
"createSuccess": "Snippet created successfully",
"createFailed": "Failed to create snippet",
"updateSuccess": "Snippet updated successfully",
"updateFailed": "Failed to update snippet",
"deleteFailed": "Failed to delete snippet",
"folderCreateSuccess": "Folder created successfully",
"folderCreateFailed": "Failed to create folder",
"editFolderTitle": "Edit Folder",
"editFolderDescription": "Rename or change the appearance of this folder",
"saveFolderButton": "Save Changes",
"editFolder": "Edit folder",
"deleteFolder": "Delete folder",
"folderDeleteSuccess": "Folder \"{{name}}\" deleted",
"folderDeleteFailed": "Failed to delete folder",
"folderEditSuccess": "Folder updated successfully",
"folderEditFailed": "Failed to update folder",
"confirmRunMessage": "Run \"{{name}}\"?",
"confirmRunButton": "Run",
"runSuccess": "Ran \"{{name}}\" in {{count}} terminal(s)",
"copySuccess": "Copied \"{{name}}\" to clipboard",
"shareTitle": "Share Snippet",
"shareUser": "User",
"shareRole": "Role",
"selectUser": "Select a user...",
"selectRole": "Select a role...",
"shareSuccess": "Snippet shared successfully",
"shareFailed": "Failed to share snippet",
"revokeSuccess": "Access revoked",
"revokeFailed": "Failed to revoke access",
"currentAccess": "Current Access",
"shareLoadError": "Failed to load share data",
"loading": "Loading...",
"close": "Close",
"reorderFailed": "Failed to save snippet order"
},
"userProfile": {
"storageModeLocal": "Browser",
"storageModeCloud": "Database",
"storageModeDescription": "Browser stores settings in this browser only. Database syncs to the server and loads on any device.",
"resetToDefaults": "Reset to Defaults",
"resetToDefaultsSuccess": "Settings reset to defaults.",
"storageModeSwitch": "Preference Storage",
"sectionAccount": "Account",
"sectionAppearance": "Appearance",
"sectionSecurity": "Security",
"sectionApiKeys": "API Keys",
"sectionC2sTunnels": "C2S Tunnels",
"usernameLabel": "Username",
"roleLabel": "Role",
"roleAdministrator": "Administrator",
"authMethodLabel": "Auth Method",
"authMethodLocal": "Local",
"twoFaLabel": "2FA",
"twoFaOn": "On",
"twoFaOff": "Off",
"versionLabel": "Version",
"deleteAccount": "Delete Account",
"deleteAccountDescription": "Permanently delete your account",
"deleteButton": "Delete",
"deleteAccountPermanent": "This action is permanent and cannot be undone.",
"deleteAccountWarning": "All sessions, hosts, credentials, and settings will be permanently deleted.",
"confirmPasswordDeletePlaceholder": "Enter your password to confirm",
"languageLabel": "Language",
"themeLabel": "Theme",
"fontSizeLabel": "Font Size",
"accentColorLabel": "Accent Color",
"settingsTerminal": "Terminal",
"commandAutocomplete": "Command Autocomplete",
"commandAutocompleteDesc": "Show autocomplete while typing",
"historyTracking": "History Tracking",
"historyTrackingDesc": "Track terminal commands",
"commandPalette": "Command Palette",
"commandPaletteDesc": "Enable keyboard shortcut",
"reopenTabsOnLogin": "Reopen Tabs on Login",
"reopenTabsOnLoginDesc": "Restore your open tabs when you log in or refresh the page, even from another device",
"confirmTabClose": "Confirm Tab Close",
"confirmTabCloseDesc": "Ask before closing terminal tabs",
"settingsSidebar": "Sidebar",
"showHostTags": "Show Host Tags",
"showHostTagsDesc": "Display tags in host list",
"hostTrayOnClick": "Click to Expand Host Actions",
"hostTrayOnClickDesc": "Always show connection buttons; click to expand management options instead of hover",
"pinAppRail": "Pin App Rail",
"pinAppRailDesc": "Keep the left sidebar app rail always expanded instead of expanding on hover",
"settingsNavigation": "Navigation",
"navigationTabsDesc": "Choose which tabs appear in the app rail",
"settingsSnippets": "Snippets",
"foldersCollapsed": "Folders Collapsed",
"foldersCollapsedDesc": "Collapse folders by default",
"confirmExecution": "Confirm Execution",
"confirmExecutionDesc": "Confirm before running snippets",
"settingsUpdates": "Updates",
"disableUpdateChecks": "Disable Update Checks",
"disableUpdateChecksDesc": "Stop checking for updates",
"totpAuthenticator": "TOTP Authenticator",
"totpEnabled": "2FA is enabled",
"totpDisabled": "Add extra login security",
"disable": "Disable",
"enable": "Enable",
"setupTotp": "Setup TOTP",
"qrCode": "QR Code",
"totpInstructions": "Scan QR code or enter secret in your authenticator app, then enter the 6-digit code",
"totpCodePlaceholder": "000000",
"verify": "Verify",
"changePassword": "Change Password",
"currentPasswordLabel": "Current Password",
"currentPasswordPlaceholder": "Current password",
"newPasswordLabel": "New Password",
"newPasswordPlaceholder": "New password",
"confirmPasswordLabel": "Confirm New Password",
"confirmPasswordPlaceholder": "Confirm new password",
"updatePassword": "Update Password",
"createApiKeyTitle": "Create API Key",
"createApiKeyDescription": "Generate a new API key for programmatic access.",
"apiKeyNameLabel": "Name",
"apiKeyNamePlaceholder": "e.g. CI Pipeline",
"expiryDateLabel": "Expiry Date",
"optional": "optional",
"cancel": "Cancel",
"createKey": "Create Key",
"apiKeyCount": "{{count}} keys",
"newKey": "New Key",
"noApiKeys": "No API keys yet.",
"apiKeyActive": "Active",
"apiKeyUsageHint": "Include your key in the",
"apiKeyUsageHintHeader": "header.",
"apiKeyPermissionsHint": "Keys inherit the permissions of the creating user.",
"roleUser": "User",
"authMethodDual": "Dual Auth",
"authMethodOidc": "OIDC",
"totpSetupFailed": "Failed to start TOTP setup",
"totpEnter6Digits": "Enter a 6-digit code",
"totpEnabledSuccess": "Two-factor authentication enabled",
"totpInvalidCode": "Invalid code, please try again",
"totpDisableInputRequired": "Enter your TOTP code or password",
"totpDisabledSuccess": "Two-factor authentication disabled",
"totpDisableFailed": "Failed to disable 2FA",
"totpDisableTitle": "Disable 2FA",
"totpDisablePlaceholder": "Enter TOTP code or password",
"totpDisableConfirm": "Disable 2FA",
"totpContinueVerify": "Continue to Verify",
"totpVerifyTitle": "Verify Code",
"totpBackupTitle": "Backup Codes",
"totpDownloadBackup": "Download Backup Codes",
"done": "Done",
"secretCopied": "Secret copied to clipboard",
"apiKeyNameRequired": "Key name is required",
"apiKeyCreated": "API key \"{{name}}\" created",
"apiKeyCreateFailed": "Failed to create API key",
"apiKeyUser": "User",
"apiKeyExpires": "Expires",
"apiKeyRevoked": "API key \"{{name}}\" revoked",
"apiKeyRevokeFailed": "Failed to revoke API key",
"passwordFieldsRequired": "Current and new passwords are required",
"passwordMismatch": "Passwords do not match",
"passwordTooShort": "Password must be at least 6 characters",
"passwordUpdated": "Password updated successfully",
"passwordUpdateFailed": "Failed to update password",
"deletePasswordRequired": "Password is required to delete your account",
"deleteFailed": "Failed to delete account",
"deleting": "Deleting...",
"colorPickerTooltip": "Open color picker",
"themeSystem": "System",
"themeLight": "Light",
"themeDark": "Dark",
"themeDracula": "Dracula",
"themeCatppuccin": "Catppuccin",
"themeNord": "Nord",
"themeSolarized": "Solarized",
"themeTokyoNight": "Tokyo Night",
"themeOneDark": "One Dark",
"themeGruvbox": "Gruvbox"
}
}
},
"tmuxMonitor": {
"title": "Tmux Monitor",
"failedToLoadHosts": "Failed to load hosts",
"failedToLoad": "Failed to load tmux sessions",
"tmuxUnavailable": "tmux is not installed on this host",
"noSessions": "No tmux sessions on this host",
"noHostSelected": "No host selected",
"attached": "Attached",
"detached": "Detached",
"attach": "Attach",
"editTags": "Edit tags",
"tagsHint": "Comma-separated tags (e.g. YOLO, lab, training)",
"tagsSaved": "Tags saved",
"tagsSaveFailed": "Failed to save tags",
"searchPlaceholder": "Search output across sessions...",
"searchResults": "{{count}} matches",
"searchFailed": "Search failed",
"selectPaneHint": "Select a pane to preview its output",
"closePreview": "Close preview",
"newSession": "New session",
"newSessionHint": "Session name (letters, digits, _ @ % + = -)",
"newSessionPlaceholder": "my-session",
"create": "Create",
"sessionCreated": "Session \"{{name}}\" created",
"sessionCreateFailed": "Failed to create session",
"splitRight": "Split right",
"splitDown": "Split down",
"splitFailed": "Failed to split pane",
"newWindow": "New window",
"windowCreateFailed": "Failed to create window",
"attachSessionTooltip": "Attach to {{session}}",
"refresh": "Refresh",
"refreshFailed": "Failed to refresh sessions",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"moreActions": "More actions",
"sessionStats": "Session stats",
"renameSessionTitle": "Rename session \"{{name}}\"",
"rename": "Rename",
"sessionRenamed": "Session renamed to \"{{name}}\"",
"sessionRenameFailed": "Failed to rename session",
"editTagsTitle": "Edit tags for \"{{name}}\"",
"killPane": "Kill pane",
"resizeTree": "Drag to resize — double-click to reset",
"reattach": "Re-attach (fixes a garbled view)",
"killWindow": "Kill window",
"killWindowTitle": "Kill window {{index}} of \"{{session}}\"?",
"killWindowBody": "Every pane and process in this window will be terminated. Killing the last window ends the session.",
"windowKillFailed": "Failed to kill window",
"statusActivity": "Activity",
"statusWindows": "Windows",
"statusPanes": "panes",
"statusTags": "Tags",
"killPaneTitle": "Kill pane {{id}}?",
"killPaneBody": "The process running in this pane will be terminated. Killing the last pane closes its window.",
"paneKillFailed": "Failed to kill pane",
"killSessionTitle": "Kill session \"{{name}}\"?",
"killSessionBody": "All windows and running processes in this session will be terminated. This cannot be undone.",
"kill": "Kill",
"sessionKilled": "Session \"{{name}}\" killed",
"sessionKillFailed": "Failed to kill session",
"hostUnreachable": "Could not connect to the host. Check that it is online and reachable.",
"noServer": "No tmux server is running on this host.",
"searchTruncated": "Partial results — search covers the last {{lines}} lines of each pane and at most {{panes}} panes.",
"closeSearchResults": "Close search results",
"retry": "Retry",
"noHosts": "No SSH hosts available",
"noHostsHint": "Enable the Tmux Monitor option on an SSH host (Host Manager → Terminal tab) to monitor its tmux sessions.",
"tmuxInstallHint": "Install it on the host with:",
"attachTooltip": "Open a terminal to {{host}}",
"attachTooltipPane": "Open a terminal to {{host}} — tmux session {{session}}",
"timeJustNow": "just now",
"timeMinutes": "{{count}}m ago",
"timeHours": "{{count}}h ago",
"timeDays": "{{count}}d ago"
}
}