Files
Termix/src/ui/locales/translated/ja_JP.json
T
+16 fef8a5f28a release-2.8.0 (#1456)
* Fix private AI custom endpoints (#1299)

* Fix Proxmox credential guest imports (#1300)

* Fix Fleet command results layout (#1301)

* Fix synced client tunnel endpoints (#1302)

* Fix Proxmox sync jump host persistence (#1303)

* Fix command palette keyboard navigation (#1304)

* Add accessible interface font choices (#1306)

* Add selectable host temperature sensors (#1307)

* Improve file manager navigation and compact layout (#1308)

* Add configurable global hotkeys (#1305)

* fix: restore split layout selection (#1310)

* fix: support macOS VNC connections (#1311)

* fix: use matching Undici fetch for private AI providers (#1309)

Co-authored-by: Angad Singh <angad@singhangad.in>

* feat: support additional TOTP authenticators (#1312)

* feat: add VNC display zoom controls (#1314)

* feat: add host context menu actions (#1315)

* fix: force classic auth for macOS VNC (#1313)

* fix: harden HTTP trust boundaries (#1316)

* fix: harden application trust boundaries (#1317)

* fix: verify OPKSSH binary integrity (#1318)

* Fix remote desktop connection timeout (#1319)

* chore(deps): bump node in /docker in the docker-major-updates group (#1321)

Bumps the docker-major-updates group in /docker with 1 update: node.


Updates `node` from 24-slim to 26-slim

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-slim
  dependency-type: direct:production
  dependency-group: docker-major-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-patch-updates group with 15 updates (#1322)

Bumps the dev-patch-updates group with 15 updates:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/view](https://github.com/codemirror/view) | `6.43.7` | `6.43.9` |
| [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `21.2.1` | `21.2.2` |
| [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) | `21.2.0` | `21.2.2` |
| [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) | `7.0.0` | `7.0.1` |
| [@testing-library/user-event](https://github.com/testing-library/user-event) | `14.6.1` | `14.6.5` |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `4.1.10` | `4.1.11` |
| [@vitest/ui](https://github.com/vitest-dev/vitest/tree/HEAD/packages/ui) | `4.1.10` | `4.1.11` |
| [concurrently](https://github.com/open-cli-tools/concurrently) | `10.0.4` | `10.0.5` |
| [cytoscape](https://github.com/cytoscape/cytoscape.js) | `3.34.0` | `3.34.1` |
| [eslint](https://github.com/eslint/eslint) | `10.8.0` | `10.8.1` |
| [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.5.3` | `0.5.4` |
| [react-i18next](https://github.com/i18next/react-i18next) | `17.0.11` | `17.0.12` |
| [sonner](https://github.com/emilkowalski/sonner) | `2.0.7` | `2.0.8` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.2.0` | `8.2.2` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.10` | `4.1.11` |


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

Updates `@commitlint/cli` from 21.2.1 to 21.2.2
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.2.2/@commitlint/cli)

Updates `@commitlint/config-conventional` from 21.2.0 to 21.2.2
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.2.2/@commitlint/config-conventional)

Updates `@testing-library/jest-dom` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v7.0.0...v7.0.1)

Updates `@testing-library/user-event` from 14.6.1 to 14.6.5
- [Release notes](https://github.com/testing-library/user-event/releases)
- [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/user-event/compare/v14.6.1...v14.6.5)

Updates `@vitest/coverage-v8` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/coverage-v8)

Updates `@vitest/ui` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/ui)

Updates `concurrently` from 10.0.4 to 10.0.5
- [Release notes](https://github.com/open-cli-tools/concurrently/releases)
- [Commits](https://github.com/open-cli-tools/concurrently/compare/v10.0.4...v10.0.5)

Updates `cytoscape` from 3.34.0 to 3.34.1
- [Release notes](https://github.com/cytoscape/cytoscape.js/releases)
- [Commits](https://github.com/cytoscape/cytoscape.js/compare/v3.34.0...v3.34.1)

Updates `eslint` from 10.8.0 to 10.8.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.8.0...v10.8.1)

Updates `eslint-plugin-react-refresh` from 0.5.3 to 0.5.4
- [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases)
- [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/compare/v0.5.3...v0.5.4)

Updates `react-i18next` from 17.0.11 to 17.0.12
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.11...v17.0.12)

Updates `sonner` from 2.0.7 to 2.0.8
- [Release notes](https://github.com/emilkowalski/sonner/releases)
- [Commits](https://github.com/emilkowalski/sonner/compare/v2.0.7...v2.0.8)

Updates `vite` from 8.2.0 to 8.2.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.2.2/packages/vite)

Updates `vitest` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/vitest)

---
updated-dependencies:
- dependency-name: "@codemirror/view"
  dependency-version: 6.43.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@commitlint/cli"
  dependency-version: 21.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@commitlint/config-conventional"
  dependency-version: 21.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 7.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@testing-library/user-event"
  dependency-version: 14.6.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@vitest/ui"
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: concurrently
  dependency-version: 10.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: cytoscape
  dependency-version: 3.34.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: eslint
  dependency-version: 10.8.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: eslint-plugin-react-refresh
  dependency-version: 0.5.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: react-i18next
  dependency-version: 17.0.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: sonner
  dependency-version: 2.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: vite
  dependency-version: 8.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: vitest
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the prod-patch-updates group with 5 updates (#1324)

Bumps the prod-patch-updates group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual) | `3.14.9` | `3.14.10` |
| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | `13.0.2` | `13.0.3` |
| [jose](https://github.com/panva/jose) | `6.2.8` | `6.2.9` |
| [mysql2](https://github.com/sidorares/node-mysql2) | `3.23.2` | `3.23.4` |
| [ws](https://github.com/websockets/ws) | `8.21.1` | `8.21.3` |


Updates `@tanstack/react-virtual` from 3.14.9 to 3.14.10
- [Release notes](https://github.com/TanStack/virtual/releases)
- [Changelog](https://github.com/TanStack/virtual/blob/main/packages/react-virtual/CHANGELOG.md)
- [Commits](https://github.com/TanStack/virtual/commits/@tanstack/react-virtual@3.14.10/packages/react-virtual)

Updates `better-sqlite3` from 13.0.2 to 13.0.3
- [Release notes](https://github.com/WiseLibs/better-sqlite3/releases)
- [Commits](https://github.com/WiseLibs/better-sqlite3/compare/v13.0.2...v13.0.3)

Updates `jose` from 6.2.8 to 6.2.9
- [Release notes](https://github.com/panva/jose/releases)
- [Changelog](https://github.com/panva/jose/blob/main/CHANGELOG.md)
- [Commits](https://github.com/panva/jose/compare/v6.2.8...v6.2.9)

Updates `mysql2` from 3.23.2 to 3.23.4
- [Release notes](https://github.com/sidorares/node-mysql2/releases)
- [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md)
- [Commits](https://github.com/sidorares/node-mysql2/compare/v3.23.2...v3.23.4)

Updates `ws` from 8.21.1 to 8.21.3
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.21.1...8.21.3)

---
updated-dependencies:
- dependency-name: "@tanstack/react-virtual"
  dependency-version: 3.14.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: better-sqlite3
  dependency-version: 13.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: jose
  dependency-version: 6.2.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: mysql2
  dependency-version: 3.23.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: ws
  dependency-version: 8.21.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump motion in the major-updates group (#1326)

Bumps the major-updates group with 1 update: [motion](https://github.com/motiondivision/motion).


Updates `motion` from 12.43.0 to 13.1.1
- [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md)
- [Commits](https://github.com/motiondivision/motion/compare/v12.43.0...v13.1.1)

---
updated-dependencies:
- dependency-name: motion
  dependency-version: 13.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: major-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: add semantic motion system (#1320)

* feat: add semantic motion system

* feat: animate session workspace transitions

* feat: refine motion accessibility and transfer feedback

* feat: enforce RBAC and harden collaboration features (#1327)

* feat: enforce RBAC and harden collaboration features

- Mount requirePermission on hosts/snippets/credentials/automations/AI routes
- Seed and backfill system role permissions on every dialect at startup
- Support personal credential overrides for RDP/VNC/Telnet shared hosts
- Broadcast participant presence in shared terminal sessions
- Make audit log forwarding configurable from the admin panel
- Add role members endpoint and snippet folder sharing

* fix: enforce RBAC across split routes

* fix: reject malformed Guacamole tokens safely (#1329)

* fix: allow approved private notification hosts (#1330)

* feat: collaboration rooms with switchable presenter (#1328)

* feat: add collaboration rooms with switchable presenter

Rooms are a group of members watching one stage - the live SSH/RDP/VNC
session the current presenter shares. Any member can take over the
stage; the host can invite, force-stop and end the meeting. Stages
reuse session_shares (new room share type), so gating, recording,
expiry and the global sharing toggle all apply unchanged.

* feat: add stage control handoff to collaboration rooms

The presenter or host can grant any member write access to the live
stage and take it back; members can raise a hand to ask. SSH flips the
participant's permission on the live gate; RDP/VNC re-mint the viewer's
join token. Control clears on every stage switch.

* feat: guest links, role invites and invite awareness for collab rooms

- Anonymous guest link per room (host toggles/rotates), followed by
  polling the public resolve endpoint; SSH guests join over the terminal
  WS with roomGuestToken, guac guests get read-only join tokens
- Invite by role (expands to current members, snapshot semantics)
- Toast when a room you were invited to appears
- Stale stages are cleared lazily when the presenter is gone
- Telnet presenting, expired-tab fallback, documented single-instance
  and guac-kick limits
- Tests for the collab routes, room hub, share access and control flip

* fix: keep remote desktop collaboration read-only

* fix: restore RDP clipboard paste across browsers (#1331)

* fix: show the full command line in the process inspector (#1334)

The CMD column rendered ps's comm field, which the kernel caps at 15
characters, so anything longer looked truncated no matter how wide the
column was. The full args were already collected; show them.

* fix: harden collaboration room access (#1332)

* fix: harden collaboration room access

* fix: confirm guest link lifecycle changes

* fix: make RDP drive redirection writable on the stock deployment (#1333)

* fix: make RDP drive redirection writable on the stock deployment

The default drive-path was /drive on the guacd side, which the official
guacd image cannot create as its non-root user, so every upload was
refused with guacd's raw "FAIL (CANNOT OPEN)" ack. Default to
GUACD_DRIVE_PATH (set to the shared termix-data volume in compose) with
one folder per user, and explain guacd's refusal in the file browser.

* style: format RDP drive settings

* feat: quick connect for RDP and VNC (#1335)

The Quick Connect panel gets a protocol switch. RDP/VNC quick hosts are
built like SSH ones (never saved) and opened as regular remote desktop
tabs; GuacamoleApp mints their token from the typed fields through the
existing /guacamole/token endpoint instead of a host-row lookup.

* fix: authenticate unwatched hosts during the status probe (#1337)

With metrics enabled, the status probe left SSH authentication to the
metrics poll - which only runs while someone is viewing the host. An
unwatched host therefore never left "reachable", while a host with
metrics disabled (whose probe always authenticates) showed online. The
probe now authenticates whenever no metrics poll will.

* feat: compact snippet list option (#1339)

A "Show Commands" toggle in the snippets settings menu hides the command
text under each snippet name, for people who dock the panel on the
narrow right rail and only need the names. Local preference, on by
default.

* fix: guide users to Auto-Tmux when a persisted session expires (#1336)

* fix: guide users to Auto-Tmux when a persisted session expires

A timed-out terminal session silently reconnected to a fresh shell, so
people running long jobs lost them with no explanation and never learned
about Auto-Tmux. Explain the expiry with a one-click Enable Auto-Tmux
action, let admins default it for new hosts and tune the persistence
timeout from the UI, and move the setting up with copy that says what it
does. The global default stays off.

* style: format terminal expiry notice

* feat: improve collaboration rooms (#1338)

* feat: Step CA SSH certificates as a host authentication type (#1340)

* feat: Step CA SSH certificates as a host authentication type

Issue short-lived SSH user certificates from a smallstep CA through its
OIDC provisioner, over the CA's HTTP API rather than the step binary.
Everything after issuance reuses the OPKSSH plumbing: the same encrypted
per-user/host token store, WebSocket dialog and ssh2 certificate
injection, with the connect paths branching on a shared
usesIssuedCertificate() predicate. Instance-wide CA settings live in the
admin panel, with a private-host allowlist for the SSRF guard.

* fix: harden Step CA callback flow

* style: format Step CA changes

* feat: 1Password Connect secret sources for SSH credentials (#1341)

* feat: 1Password Connect secret sources for SSH credentials

Hosts and credentials can hold op://vault/item/field references instead
of secrets; they are resolved at connect time from the user's secret
source (1Password Connect) at the single point where every subsystem
receives plaintext credentials, so terminal, SFTP, Docker, metrics and
tunnels all work without per-subsystem changes. Sources are per user,
optionally shared, with the access token encrypted under the owner's
data key; resolved values are cached briefly in memory.

* style: format secret source changes

* feat: share credentials with users and roles, inherit data on account deletion (#1342)

* feat: share credentials with users and roles, inherit data on account deletion

Credentials can be shared at "use" or "manage" level. Recipients get
a copy re-encrypted under their own data key (shared_credential_secrets),
kept in step with the owner's row through the same lifecycle hooks as
shared host secrets. One gate, findUsableCredential(), replaces the
private-namespace lookups so a shared credential works wherever a
private one does. Deleting a user now hands their hosts and credentials
to a successor (the deleting admin by default) instead of revoking
everything they shared.

* fix: harden credential ownership transfer

* feat: folder shares apply to hosts added later (#1343)

* feat: folder shares apply to hosts added later

Sharing a folder only fanned grants out to the hosts in it at the time.
The share is now also kept as a standing rule on the folder, and a host
created in or moved into it (or a subfolder) inherits the same access
and secret snapshots. Rules follow folder renames and can be stopped
from the share dialog.

* fix: stabilize folder access migrations

* fix: package sharp for both macOS architectures (#1344)

* fix: prompt shared RDP users for credentials (#1345)

* feat: add terminal copy-on-select option (#1346)

* fix: retry protected file reads with sudo (#1349)

* fix: stop SSH-authenticating hosts during routine status polling (#1347)

* fix: preserve omitted host protocol settings (#1350)

* fix: surface remote sync reauthentication failures (#1351)

* fix: harden file reads and timer cleanup (#1352)

* fix: harden file reads and timer cleanup

* fix: preserve literal file path escapes

* fix: enforce SSH pool connection limits (#1353)

* fix: enforce SSH pool connection limits

* fix: discard stale pooled connections

* fix: harden connection, payload, and persisted state handling (#1354)

* fix: clean up Cloudflare tunnel timeouts

* fix: couple tunnel socket lifecycle

* fix: validate Docker console messages

* fix: bound homepage proxy responses

* fix: bound reconnect and response failures

* fix: harden persisted and socket state

* fix: support local connections to shared hosts

* fix: recover expired dashboard metrics sessions (#1355)

* fix: upload files to redirected RDP drives (#1356)

* fix: unify connection toolbar visibility (#1357)

* fix: reset host virtualizer after editing (#1358)

* test: update Guacamole toolbar display mock (#1360)

* fix: reflect live SSH sessions in host status (#1359)

* fix: support Vault auth in file manager (#1361)

* fix: allow exec on shared hosts (#1362)

* fix(file-manager): align chunked upload contract (#1371)

* fix(file-manager): make bulk uploads resilient (#1373)

* fix(terminal): disable local echo on alternate screen (#1372)

* fix(homepage): validate clock widget timezones (#1374)

An invalid timezone in a clock widget's config reached toLocaleTimeString
unchecked, throwing RangeError during render and taking the homepage canvas
down with it. The edit dialog accepted any string, so "America/New York" - a
space where IANA wants an underscore - was easy to save, and the homepage
stayed broken on every later load because the value is reloaded from the
database.

The edit dialog now flags an unusable zone the way FolderMetadataDialog flags
a duplicate folder name: inline message, aria-invalid, and a disabled Save.
Whitespace is normalized to underscores on save, so the space spelling is
stored as America/New_York rather than rejected. ClockWidget falls back to
local time for any config already holding an invalid zone.

Related to Termix-SSH/Support#1238

* fix(hosts): preserve connection origin in editor (#1376)

* fix(remote-sync): expose local login notification (#1375)

* fix(auth): allow passkeys in desktop login (#1378)

* fix(proxmox): elevate guest discovery commands (#1379)

* Fix permanent file-transfer completion toasts (#1383)

* fix(file-manager): expire completed progress toasts

* test(file-manager): use valid transfer status

* fix(hosts): allow clearing SSH key type (#1384)

* fix(terminal): suppress local echo for contextual password prompts (#1387)

* fix(desktop): surface a failed embedded backend start (#1382)

* fix(desktop): surface a failed embedded backend start

When the embedded backend's HTTP port was already taken, the desktop app
sat on the "Loading..." spinner forever with nothing in the UI to say
why. The backend logged the conflict and exited 1, and startBackendServer
resolved false, but that verdict never reached the renderer: the
get-embedded-server-status channel was not exposed in preload and nothing
called it.

The renderer, by design, treats every connection failure as "the embedded
backend is still booting" and retries indefinitely -- in main.tsx's
verifying phase, in Auth's desktop auto-session, and in
FullScreenAppWrapper. That holds while the backend is merely slow to boot,
but not once the process has exited, and nothing distinguished the two.

Classify why the child died from its exit code and a bounded tail of its
stderr, report it through get-embedded-server-status, and have each retry
loop keep waiting only while no failure is reported. A port conflict names
the port, since that is what the user has to act on -- most often a Termix
container on the same ports, or a backend orphaned by a hard-kill that
reapOrphanedBackendProcess could not claim.

A deliberate shutdown is not reported as a crash, and a backend that is
only slow to start still gets retried as before.

Fixes Termix-SSH/Support#1254

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

* fix(desktop): treat every unrequested backend exit as a failure

The classifier exempted a clean exit and SIGTERM/SIGINT, calling those a
deliberate shutdown. It has no evidence for that: its only caller already
sits behind backendStopRequested, so it is reached only for exits
stopBackendServer() did not ask for. A backend that exited 0 on its own,
or was terminated by the OS or an external signal, therefore reported no
failure at all -- leaving all three renderer loops waiting forever for a
process that is gone, which is the exact hang this change set exists to
remove.

Every exit reaching the classifier is now a failure, port-in-use when
stderr carries EADDRINUSE and crashed otherwise, with backendStopRequested
left as the sole deliberate-shutdown guard. That makes the exit code and
signal irrelevant to the verdict, so the classifier now takes only the
stderr tail rather than carrying two parameters it no longer reads.

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* Add white label branding settings (#1386)

* feat(admin): add white label branding settings

Admins can configure a custom app name, logo and tagline from the
Admin Settings panel. The values apply to the login screen and the
browser tab title/favicon at runtime.

* fix(admin): restore default icons on logo reset, validate upload MIME type

Resetting the logo now restores the bundled favicon/apple-touch-icon
instead of leaving the previous custom one until a reload. The admin
upload also validates file.type up front instead of only failing
later on save.

* fix(admin): restore default favicons and reject invalid logo types

Capture bundled icon hrefs before the first custom logo is applied so a
reset does not leave the previous upload in the tab, and reject
non-image uploads before they are read into branding state.

* test(admin): cover branding routes and logo validation

Add backend tests for the public GET, admin-only PATCH, unknown-field
rejection, and parseBrandingLogoDataUrl so invalid images cannot land
in settings without a failing test.

* fix(backend): report port conflicts on the service ports (#1388)

Express's app.listen(port, host, callback) registers that callback as the
server's error handler as well as its listening handler:

    if (typeof args[args.length - 1] === 'function') {
      var done = args[args.length - 1] = once(args[args.length - 1])
      server.once('error', done)
    }

so a bind failure invoked the service's "started" callback with an
EADDRINUSE error as its only argument and emitted nothing. None of the
services read that argument, which made a failed bind indistinguishable
from a successful one: the service logged that it had started, ran its
initialisation, and served nothing. With one of 30003-30012 occupied the
backend still reported backend_init_complete, the app loaded, and the
affected feature was dead for the session with no error anywhere in the
logs -- searching the backend log, the Electron main log and stdout for
EADDRINUSE returned nothing, as did uncaughtException and
unhandledRejection probes.

This is also why only the main port behaved sensibly: database.ts does
not use app.listen(), it builds the server and attaches a real error
handler, so 30001 was the one port whose conflict was ever detected.

listenOnServicePort() builds the server so that listening and error stay
separate, and treats a conflict the way database.ts already does -- name
the port, then exit -- rather than running on with one feature missing.
Exiting also hands the desktop app the classified failure it already
surfaces, so the user is told which port to free. Services that must own
their server, such as the tunnel service with its WebSocket upgrade
handler, get the same handler via attachServicePortConflictHandler().

Note that adding .on("error") to the services would not have worked:
express consumes the event through once('error', done) before any later
handler runs. The callback has to stop being passed to listen() at all.

Fixes Termix-SSH/Support#1260

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* feat(desktop): allow RDP/VNC/Telnet to originate from this device (#1389)

The desktop pinned rdp/vnc/telnet to the remote server, so a host the
user's own machine could reach but the Termix server could not was
impossible to open: the app answered "Remote server required" even when
no remote server was wanted. The embedded backend already runs the
Guacamole websocket server and guacd's address is already configurable
globally and per host, so what was missing was the choice.

resolveConnectionOrigin now honours an explicit per-host origin for
these protocols. Left on Default they still resolve to remote: they need
a guacd, which the desktop does not ship, so originating locally only
works once the user has pointed Termix at one of their own. Keeping that
opt-in means an upgrade never moves a working connection onto a guacd
that is not there. Serial and non-Electron behaviour are unchanged.

Three call paths had the same assumption baked in and would have quietly
ignored the setting:

- The Guacamole call sites resolved the origin without passing the
  host's own override, so it could never take effect.
- guacamole-api sent every token, connect-host and status call to the
  remote server whenever running under Electron, and remapped the host
  id onto the remote server's id -- which would address the wrong row,
  or fail outright with no server configured.
- GuacamoleDisplay minted its token before resolving the origin, so the
  token could come from a different backend than the socket dialled.

The origin is a required parameter on those API functions rather than a
defaulted one. A default silently sent a missed call site to the remote
server: the guacd status check in fetchToken was one, and it failed with
a bare "Network Error" on a desktop with no server configured. Making it
required means the compiler names every caller instead. That also
covers CollabRoomTab, which now resolves from the host it already holds,
so a locally-originated host stays local when presented into a room.

Finally, the Connection Origin control was gated on SSH alone, so a host
enabling only these protocols could never reach the setting. That gate
is now a named predicate covering every protocol the control applies to.

Verified end to end on Linux against a local guacd: with a host set to
"This device", guacd accepted the connection and reached the target,
which answered for itself. With guacd stopped, the guacd status check
that has run before every connection since v2.3.0 -- now asking the
backend the session will actually use -- reports it clearly before a
socket is opened.

Refs Termix-SSH/Support#1240

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* feat(local-terminal): add copy/paste support (#1391)

* feat(local-terminal): add copy/paste support

Local terminal had no clipboard wiring, so selected text couldn't be
copied. Extracted the SSH terminal's copy/paste shortcut and
right-click handling into a shared terminal-clipboard module and wired
it into both terminals, removing duplicated logic in the process.

* fix(local-terminal): stop language changes from restarting the shell session

The session effect that starts the local PTY depended on `t`, whose
identity changes on every language switch (react-i18next). That tore
down the running shell and spawned a new one just from changing the UI
language. Read translations through a ref instead so localization
stays decoupled from the PTY lifecycle.

Also adds regression coverage for the extracted terminal-clipboard.ts
helpers: copy with/without selection, explicit vs native paste,
right-click preference, and Ctrl+right-click passthrough.

* fix(file-manager): keep name column visible on narrow viewports in list view (#1402)

Rebased onto dev-2.8.0 (the density refactor kept the same 3
list-view grid patterns). Use minmax(140px, 1fr) for the name track
so it cannot collapse to 0px on narrow viewports; the table scrolls
horizontally instead of hiding names and icons.

Co-authored-by: inontz <inontz@users.noreply.github.com>

* feat(desktop): local filesystem and transfer bridge for the file manager (#1392)

* feat(desktop): local filesystem and transfer bridge for the file manager

Adds the Electron main-process side of the upcoming Local | Remote dual-pane
file manager, with no UI yet:

- electron/local-files.cjs: IPC handlers to browse the local disk (home,
  list, mkdir, createFile, rename, trash, ensureDir, walk, reveal, open) and
  to stream files between the local disk and the file-manager backend
  (uploadLocalFile / downloadToLocal with progress events and cancellation).
  Streams go through Electron's `net` so the session cookie / remembered JWT
  is attached the same way as the renderer's own requests.
- electron/preload.js: exposes them as `window.electronAPI.localFs` and
  `window.electronAPI.localTransfer`; the existing `invoke` allowlist is
  untouched.
- src/types/electron.d.ts: typings for the new surface.
- electron/main.cjs: registers the handlers.

Follow-up PRs add the renderer side (local pane, drag-and-drop transfers,
context menu).

* fix(desktop): harden the local transfer bridge (origin allowlist, collision policy)

Addresses the review on the transfer boundary:

- The renderer no longer supplies a URL or headers. It sends
  `{ origin: "local" | "remote", route, deviceId }` and the main process
  resolves the target itself: fixed route allowlist (`uploadFileStream`,
  `downloadFileStream`), local = the embedded backend base, remote = the
  remote-sync config's URL (http/https only) with the stored JWT. Anything
  else is rejected before a request is made. `deviceId` is validated.
- Downloads never rename or replace silently. The destination is checked
  first and `EEXIST` is returned unless the caller passes `overwrite: true`.
  Each transfer writes to its own `<dest>.<transferId>.termix-part` opened
  with `wx`, and publishes with `fs.link` / `COPYFILE_EXCL` (rename only when
  overwriting), so concurrent transfers to the same path cannot share or
  clobber a partial (`EBUSY` for the second). Partials are removed on
  failure or cancel.
- New `local-fs:exists` handler so the renderer can ask before starting.
- `createLocalFileHandlers` / `createTargetResolver` take their
  dependencies (net, shell, remote-sync getters) as parameters so the
  boundary is unit-testable without Electron.
- src/backend/tests/electron/local-files.test.ts: target resolution and
  off-origin refusal, EEXIST / EBUSY / overwrite paths, unique partials and
  cleanup, upload multipart integrity (parsed with Busboy).

* fix(desktop): Windows-safe replace for overwrite downloads

`publishDownload()` used `rename(partial, dest)` for the explicit overwrite
path. POSIX replaces the destination, but on Windows rename() onto an
existing name commonly fails (EEXIST / EPERM, always while the file is
open), so "Replace" did not actually work there.

The overwrite path no longer renames onto an occupied name:

1. the current file is moved aside to a transfer-unique sibling
   (`<dest>.<transferId>.termix-replaced`) - renaming to a fresh name is
   safe on every platform;
2. the partial is published exclusively under the now-free name (the same
   `link` / `COPYFILE_EXCL` primitive the non-overwrite path uses);
3. the aside copy is deleted (retried once; if another process still holds
   it open on Windows it is left in place and logged rather than failing
   the transfer).

Failure handling preserves the original: if step 1 fails (file in use)
nothing has changed and the caller gets `EBUSY`; if step 2 fails the aside
copy is moved back under its name and the error propagates. Replacing a
folder with a file is refused with `EISDIR`; a destination that vanished
mid-transfer falls back to the exclusive publish.

The publish primitives take their filesystem operations as an injectable
`publishFs` (default: real fs), and the tests drive them with a
Windows-like fs whose rename() refuses to overwrite - so the strategy is
verified without relying on POSIX rename-over-existing semantics:
successful swap with no rename ever targeting an occupied name, original
restored byte-for-byte when publishing fails, EBUSY with nothing touched
when the file cannot be moved aside, EISDIR for folders, vanished
destination, and the end-to-end overwrite through the download handler.

---------

Co-authored-by: Max <maxim@cogitate.ai>

* chore: update package lock

* feat(file-manager): Termius-style Local | Remote dual pane with drag-and-drop transfers (desktop)

Renderer side of the dual-pane file manager, built on the local filesystem
bridge added in the previous PR. Desktop app only; the web build is
unchanged (the toggle is hidden when `window.electronAPI.localFs` is absent).

- New Local pane (LocalFilePane) next to the remote grid, toggled from the
  toolbar (Laptop icon); path, visibility and width are remembered in
  localStorage (`termix:file-manager:local-pane:*`). Grid and list views,
  hidden files toggle, breadcrumb navigation, New Folder.
- Drag files/folders from the Local pane onto the remote grid to upload,
  and from the remote grid onto the Local pane to download. Both directions
  stream through the main process (`useLocalTransfers`) with a single
  progress toast per batch (speed, ETA, cancel). Finder drops onto the
  remote grid keep working as before.
- Collision policy for downloads: destinations are checked first; if any
  exist the user is asked Replace / Skip for the batch. Skip, dismiss and
  timeout all mean skip - nothing is ever replaced without an explicit
  click, and the main process enforces the same rule (`EEXIST` unless
  `overwrite` is set).
- Drag MIME contract: `application/x-termix-local-files` for local drags,
  `application/x-termix-remote-files` marker on the remote grid's internal
  drags, so each pane can tell the two apart from Finder drops.
- Transfer targets are described as `{ origin, route, deviceId }`
  (`getSessionOrigin` in main-axios) - the renderer never hands the main
  process a URL.
- i18n: new `fileManager.local*` keys in en.json only (other locales via
  Crowdin).
- Tests: LocalFilePane rendering/navigation, local-transfer-utils
  (relative-path planning, size formatting).
- Modified column uses the same `Mon DD HH:MM` / `Mon DD  YYYY` (ls -l style)
  format as the remote grid, so both panes read alike.

* docs: point security note to the docs root (old /security page is gone) (#1400)

* chore: sync Crowdin translations

* chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325)

Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg).


Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0
- [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0)

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

Updates `pg` from 8.22.0 to 8.23.0
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg)

---
updated-dependencies:
- dependency-name: "@anthropic-ai/sdk"
  dependency-version: 0.120.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: js-yaml
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: pg
  dependency-version: 8.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323)

Bumps the dev-minor-updates group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` |
| [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` |
| [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` |
| [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` |
| [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` |



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

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

Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react)

Updates `electron` from 43.2.0 to 43.4.1
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1)

Updates `globals` from 17.9.0 to 17.11.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0)

Updates `i18next` from 26.3.6 to 26.4.0
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0)

Updates `lucide-react` from 1.28.0 to 1.33.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react)

Updates `react-hook-form` from 7.84.0 to 7.85.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0)

Updates `react-pdf` from 10.4.1 to 10.5.0
- [Release notes](https://github.com/wojtekmaj/react-pdf/releases)
- [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf)

Updates `typescript-eslint` from 8.66.0 to 8.67.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@codemirror/commands"
  dependency-version: 6.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 26.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: electron
  dependency-version: 43.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: globals
  dependency-version: 17.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: i18next
  dependency-version: 26.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: lucide-react
  dependency-version: 1.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.85.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-pdf
  dependency-version: 10.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: sync Crowdin translations

* Update redirect-issues workflow configuration

Updated the workflow to change the runner and modify the issue response message.

* chore: sync Crowdin translations

* Add Hetzner logo and referral link to README

Added Hetzner logo with a referral link to README.

* Fix Hetzner logo URL in README.md

* docs: point security note to the feature security page

The old /security page is gone and the docs root redirects to /install/,
which loses the encryption context the sentence promises. Point the
per-user secret and database encryption note at the canonical
docs.termix.site/features/authentication/security/ page instead.
Applied across all README locales.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: ssmurfgg04-gif <232103099+ssmurfgg04-gif@users.noreply.github.com>
Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com>

* fix: use i18n for host status tooltip labels (#1403)

* chore: sync Crowdin translations

* chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325)

Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg).


Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0
- [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0)

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

Updates `pg` from 8.22.0 to 8.23.0
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg)

---
updated-dependencies:
- dependency-name: "@anthropic-ai/sdk"
  dependency-version: 0.120.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: js-yaml
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: pg
  dependency-version: 8.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323)

Bumps the dev-minor-updates group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` |
| [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` |
| [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` |
| [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` |
| [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` |



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

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

Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react)

Updates `electron` from 43.2.0 to 43.4.1
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1)

Updates `globals` from 17.9.0 to 17.11.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0)

Updates `i18next` from 26.3.6 to 26.4.0
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0)

Updates `lucide-react` from 1.28.0 to 1.33.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react)

Updates `react-hook-form` from 7.84.0 to 7.85.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0)

Updates `react-pdf` from 10.4.1 to 10.5.0
- [Release notes](https://github.com/wojtekmaj/react-pdf/releases)
- [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf)

Updates `typescript-eslint` from 8.66.0 to 8.67.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@codemirror/commands"
  dependency-version: 6.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 26.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: electron
  dependency-version: 43.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: globals
  dependency-version: 17.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: i18next
  dependency-version: 26.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: lucide-react
  dependency-version: 1.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.85.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-pdf
  dependency-version: 10.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: sync Crowdin translations

* Update redirect-issues workflow configuration

Updated the workflow to change the runner and modify the issue response message.

* chore: sync Crowdin translations

* fix: use i18n for host status tooltip labels (#1265)

* fix: add missing hosts.status.* locale keys (fixes #1265)

* fix: add hosts.status.* translation keys for i18n tooltip

The buildStatusTooltip function calls t("hosts.status.available"), t("hosts.status.reachable"), t("hosts.status.offline"), and t("hosts.status.monitoringDisabled"), but the locale file only had "status": "Status" as a flat string.

Replaced with a status object containing all four keys plus a "label" key preserving the original "Status" string.

* fix: restore final newline in en.json

Requested by ZacharyZcR in review feedback.

* test: assert translated labels in buildStatusTooltip

Per review feedback from ZacharyZcR: add focused tests that exercise
buildStatusTooltip with a translator and assert the rendered labels
rather than key paths. Covers all three status values, monitoring
disabled, protocol list, and the no-key-path regression guard.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com>

* fix(workspaces): fall back when randomUUID is unavailable (#1397)

* fix(terminal): preserve macOS Alt digit characters (#1398)

* fix(ssh): verify resolved server host identity (#1419)

* fix: add principals to Termix ID certificates (#1421)

* chore: sync Crowdin translations

* chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325)

Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg).


Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0
- [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0)

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

Updates `pg` from 8.22.0 to 8.23.0
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg)

---
updated-dependencies:
- dependency-name: "@anthropic-ai/sdk"
  dependency-version: 0.120.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: js-yaml
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: pg
  dependency-version: 8.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323)

Bumps the dev-minor-updates group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` |
| [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` |
| [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` |
| [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` |
| [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` |



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

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

Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react)

Updates `electron` from 43.2.0 to 43.4.1
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1)

Updates `globals` from 17.9.0 to 17.11.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0)

Updates `i18next` from 26.3.6 to 26.4.0
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0)

Updates `lucide-react` from 1.28.0 to 1.33.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react)

Updates `react-hook-form` from 7.84.0 to 7.85.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0)

Updates `react-pdf` from 10.4.1 to 10.5.0
- [Release notes](https://github.com/wojtekmaj/react-pdf/releases)
- [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf)

Updates `typescript-eslint` from 8.66.0 to 8.67.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@codemirror/commands"
  dependency-version: 6.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 26.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: electron
  dependency-version: 43.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: globals
  dependency-version: 17.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: i18next
  dependency-version: 26.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: lucide-react
  dependency-version: 1.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.85.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-pdf
  dependency-version: 10.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: sync Crowdin translations

* Update redirect-issues workflow configuration

Updated the workflow to change the runner and modify the issue response message.

* chore: sync Crowdin translations

* Add Hetzner logo and referral link to README

Added Hetzner logo with a referral link to README.

* Fix Hetzner logo URL in README.md

* chore: pull sponsor logos from the docs site

* fix: add principals to Termix ID certificates

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com>

* fix(deps): resolve transitive security advisories (#1412)

* chore: sync Crowdin translations

* chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325)

Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg).


Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0
- [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0)

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

Updates `pg` from 8.22.0 to 8.23.0
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg)

---
updated-dependencies:
- dependency-name: "@anthropic-ai/sdk"
  dependency-version: 0.120.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: js-yaml
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: pg
  dependency-version: 8.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323)

Bumps the dev-minor-updates group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` |
| [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` |
| [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` |
| [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` |
| [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` |



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

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

Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react)

Updates `electron` from 43.2.0 to 43.4.1
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1)

Updates `globals` from 17.9.0 to 17.11.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0)

Updates `i18next` from 26.3.6 to 26.4.0
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0)

Updates `lucide-react` from 1.28.0 to 1.33.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react)

Updates `react-hook-form` from 7.84.0 to 7.85.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0)

Updates `react-pdf` from 10.4.1 to 10.5.0
- [Release notes](https://github.com/wojtekmaj/react-pdf/releases)
- [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf)

Updates `typescript-eslint` from 8.66.0 to 8.67.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@codemirror/commands"
  dependency-version: 6.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 26.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: electron
  dependency-version: 43.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: globals
  dependency-version: 17.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: i18next
  dependency-version: 26.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: lucide-react
  dependency-version: 1.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.85.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-pdf
  dependency-version: 10.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: sync Crowdin translations

* Update redirect-issues workflow configuration

Updated the workflow to change the runner and modify the issue response message.

* chore: sync Crowdin translations

* Add Hetzner logo and referral link to README

Added Hetzner logo with a referral link to README.

* Fix Hetzner logo URL in README.md

* chore: pull sponsor logos from the docs site

* fix(deps): resolve transitive security advisories

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix(sync): map nested host parent references (#1418)

* fix(metrics): surface SSH host key changes (#1404)

* fix(guacamole): coalesce VNC wheel floods and label meta keys by device (#1385)

High-latency proxies like Cloudflare queue guacamole-common-js scroll
clicks so the desktop keeps crawling after the user stops. Cap in-flight
wheel buttons, and show Super/Cmd in the VNC toolbar on non-Windows clients.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>

* fix(file-manager): keep downloaded files inside the selected local folder

Remote file names were turned into local destinations by splitting the
relative remote path on "/" and concatenating each name with the platform
separator. A POSIX file name may contain "\", ":" or end in a dot, so on
Windows a remote "..\outside.txt" downloaded into C:\Downloads\selected was
normalised to C:\Downloads\outside.txt - outside the folder the user picked,
even with overwrite disabled. The main process only normalised destPath and
never checked it against the selected root.

Two independent layers now enforce containment:

Renderer (local-transfer-utils.ts)
- `assertSafeLocalComponent(name, separator)` validates each remote path
  component for the destination platform: never empty, "." or "..", never
  "/" or NUL; on Windows (separator "\") additionally no "\ : * ? " < > |",
  no control characters, no trailing dot/space, no reserved device names
  (CON, NUL, COM1...). Backslashes stay legal on macOS/Linux, where they are
  ordinary file-name characters and the result remains inside the folder.
- `buildLocalDestination(localDir, relativePath, separator)` joins the
  validated components and asserts the result is strictly under localDir
  (case-insensitive on Windows).
- useLocalTransfers builds every file and directory destination through it.
  Items that fail are skipped before any filesystem call and reported
  ("Skipped N item(s) whose names cannot be used on this computer").

Main process (electron/local-files.cjs)
- `assertWithinRoot(rootPath, candidate, pathImpl)` resolves + normalises
  both paths and refuses anything that is the root itself, escapes it
  (".." after normalisation), is absolute relative to it (another drive,
  UNC) or contains empty/".." segments. `pathImpl` is injectable so the
  Windows rules run in tests on any OS.
- downloadToLocal requires `rootPath` (the selected folder) and checks the
  destination before the request is made or any file is created; the
  ensure-dir handler applies the same check when a root is passed (used for
  the directory skeleton of downloaded trees).
- LocalDownloadRequest / downloadSessionFileToLocal / ensureLocalDirectory
  carry the root.

Tests
- Renderer: ordinary nested folders on Windows; backslash traversal in a
  POSIX name; absolute, drive-qualified and UNC names; reserved names,
  trailing dots/spaces, control chars; POSIX traversal rejected while a
  POSIX-legal backslash name is kept inside the folder.
- Main process (path.win32): nested destinations accepted incl. case
  differences; "selected\..\outside.txt" refused; other drive / UNC /
  sibling folder refused; missing root refused; end-to-end handler test that
  a POSIX "../outside.txt" download and an escaping ensure-dir are refused
  before any network traffic or disk write.

* feat(file-manager): right-click context menu for the local pane

Mirrors the remote grid's menu for the user's own disk. On an entry (or
the current multi-selection): Open / Open folder, Upload to server,
Reveal in Finder/Explorer, Rename (inline, F2), Copy Path, Move to Trash
(confirmation toast, Del). On the background: New Folder, New File,
Reveal, Show/Hide hidden files, Refresh (F5). Enter opens, Cmd/Ctrl+A
selects all, Escape clears the selection.

Deletion goes through shell.trashItem so it lands in the OS Trash and is
recoverable; rename and create refuse names containing path separators
and never overwrite an existing entry.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W

* feat(file-manager): resizable list-view columns in both panes

Drag the boundary at the left edge of a column header (Modified, Owner,
Size, Permissions on the remote grid; Modified, Size, Kind in the local
pane) to change its width; the Name column takes whatever is left.
Double-click a handle to reset that column. Widths are remembered per
pane in localStorage. Finishing a drag over a sortable header no longer
toggles the sort.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W

* feat(file-manager): pinned ".." parent entry in both panes

Both the remote grid (list, grid and empty-folder states) and the local
pane show a Termius-style ".." row pinned above the entries whenever the
current folder has a parent. Double-clicking it goes up one level. It is
also a drop target: local files dropped on it upload into the parent
folder, remote rows dragged onto it move there, and remote items dropped
on the local pane's ".." download into the parent folder.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W

* feat(file-manager): show/hide list-view columns from the header

Right-click a list-view header (remote grid or local pane) to open a
Columns menu and tick/untick Modified, Owner, Size, Permissions (remote)
or Modified, Size, Kind (local). Hidden columns leave the grid template
entirely so the Name column gets the space back; at least one optional
column always stays on. The choice is remembered per pane alongside the
column widths.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W

* feat(file-manager): sidebar toggle works on desktop too

The toolbar's sidebar button now shows/hides the directories panel on
desktop (persisted), while below md it still opens the mobile overlay.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W

* feat(file-manager): resizable directories sidebar

The Trash/Directories sidebar can now be resized by dragging its right
edge (160px minimum, up to 40% of the row); double-click the handle to
restore the default 224px. The width is remembered. The same handle and
persisted-width hook now also drive the local pane divider, replacing the
inline implementation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Bn6K6xNAihgWZ5fMVWt1W

* fix(metrics): support macOS/WIN hosts in stats collection (#1430)

* fix(metrics): support macOS hosts in stats collection

Host metrics collectors only ever ran Linux commands (/proc/*, ip,
GNU df flags), so any macOS host always reported 0%/null for
cpu, memory, uptime, network and disk. Detect the host platform
once per poll and use vm_stat, sysctl, top, ifconfig and netstat
on Darwin hosts instead.

* fix(metrics): support Windows hosts in stats collection

RDP/VNC hosts running Windows hit the same problem as macOS did:
no /proc, no BSD tools, not even uname. Route CPU, memory, uptime,
network and disk through PowerShell (WMI/CIM) when the host is
detected as Windows, using -EncodedCommand so there's no cmd.exe
quoting to fight with.

* fix(metrics): use real macOS df/mount for disk collection

BSD df's -T flag filters by filesystem type instead of printing one
like GNU df does, so the previous macOS disk path was still running
a GNU-only command and coming back empty. Now uses df -Pk plus mount
output to build the filesystem type/percent list, filtering out the
noisy APFS system volumes and devfs/autofs mounts. Verified on an
M4 MacBook running the latest macOS - disk usage now reports correctly.

* feat(file-manager): Termius-style Local | Remote dual pane with drag-and-drop transfers (desktop) (#1413)

Integrate the reviewed change and its maintainer fixes into dev-2.8.0.

Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs.

* fix(terminal): persist Ctrl+/- font zoom so it survives option refreshes (#1399)

Integrate the reviewed change and its maintainer fixes into dev-2.8.0.

Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs.

* Fix macOS terminal packaging and keyboard shortcuts. (#1417)

Integrate the reviewed change and its maintainer fixes into dev-2.8.0.

Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs.

* fix(auth): skip TOTP only after verified WebAuthn user verification (#1420)

Integrate the reviewed change and its maintainer fixes into dev-2.8.0.

Validated with focused regression tests, type-check, lint, formatting, build, and the PR Check database jobs.

* feat(hosts): add per-host Web Endpoints (direct or SSH-tunnelled web UIs) (#1416)

* test: provide an in-memory localStorage for the vitest environment

jsdom in this project ships without a localStorage global, so every suite
that touched storage threw "Cannot read properties of undefined" during
setup and failed wholesale -- 119 tests across 15 files, none of them
actual product defects.

Node only supplies localStorage with --localstorage-file, which persists to
disk and is shared across test files. A per-process in-memory Storage is
what tests want, so define one (plus sessionStorage) when the global is
absent, alongside the existing matchMedia shim.

Full suite goes from 15 failed files / 119 failed tests to 400 files and
2888 tests passing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fdjjsdaz6aFMyJr4h3Y6qj

* feat(web-endpoints): add endpoint types and URL resolution

First step of per-host Web Endpoints: a host declares web UIs it serves and
opens them either directly at the host's address or through an SSH forward
Termix establishes on demand.

This commit is pure logic with no I/O, so it needs no mocks to test.

resolveWebEndpointUrl expects an already-normalized path -- normalization is
the storage boundary's job (a later commit), and duplicating it here would
invite the two copies to drift.

separatedTunnelHost is the one part that is a security control rather than a
convenience. Cookies are keyed by host and ignore the port, and SameSite
computes "site" as scheme + registrable domain -- also ignoring the port. A
forward reached at the host string serving Termix is therefore same-site with
Termix, which leaks the session both ways: the framed service receives the jwt
cookie, and a Set-Cookie it returns lands in the jar Termix's own API calls
read from. So a tunnel URL resolves to a different loopback spelling than the
page's, and refuses outright when no alias exists. Only loopback literals
qualify -- a same-registrable-domain alias could still answer Set-Cookie with
a Domain attribute that reaches Termix.

The cookie-separation tests were verified to fail against a resolver that
returns the page host (4 failures), so they cannot pass vacuously.

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

* feat(web-endpoints): validate and normalize endpoint config

normalizeWebEndpoints is the enforcement point for values that reach an href
and an iframe src, so the editor's constraints are UX rather than security.
It drops any row it refuses instead of rejecting the whole host -- one bad
endpoint must not make a host unsaveable or unlistable.

Paths are checked for C0 controls and DEL by codepoint rather than by regex
character class: "\t//evil.example" defeats a startsWith("//") guard, because
the browser strips the control character and then follows the authority.

bindHost lands both in a TCP listener and in a URL authority, so it is
restricted to a bare host literal -- nothing carrying a scheme, port, path or
credentials survives. bindHost and localPort are ignored on a direct endpoint,
which never creates a forward.

parseWebUiConfig never throws. A malformed stored value yields an empty
endpoint list, so a half-written config cannot take out the whole host
listing -- which is what dockerConfig's bare JSON.parse does today.

The editor validator is a second implementation in a layer that cannot import
backend route modules. Its accompanying test runs BOTH implementations over
the same path and port samples, because drift here is invisible in the worst
way: the editor accepts a row, the normalizer silently drops it, and the
endpoint disappears on reload with no error. That agreement test was verified
to fail (4 cases) when the editor's control-character check is removed.

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

* chore(db): migrate the shared_credential_secrets foreign key rename

Running `npm run schema:migrations` on an UNCHANGED schema emits these, so
they are pre-existing drift between schema.ts and drizzle/, not something this
branch introduced. Landing them alone, before the web-endpoint columns, so the
feature's own migration is reviewable without an unrelated table rebuild
sitting in the middle of it.

Both forms are a foreign-key constraint rename only. Postgres drops and
re-adds the constraint under a shorter name. SQLite has no ALTER for that, so
drizzle emits the standard table rebuild -- verified data-preserving: CREATE
lists 14 columns, INSERT...SELECT copies the same 14 in the same order, and
both indexes are recreated.

The SQLite file is in practice dead code: runRemoteMigrations throws for
sqlite, which builds its schema from db/index.ts instead. It is kept rather
than hand-trimmed because drizzle derives the meta snapshot from schema.ts
regardless, so trimming the .sql while the snapshot advances would make the
drift permanently invisible -- no future `generate` would re-emit it.

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

* feat(db): add enable_web_ui and web_ui_config columns

Two columns on ssh_data mirroring the Docker pair. No show_web_ui_in_sidebar:
every existing showXInSidebar column is vestigial -- they appear only in
defaults, the export payload and tests, and gate no rendering -- so a fourth
dead column plus a migration buys nothing.

web_ui_config stores an object rather than a bare array so host-level web
settings can be added later without a second migration.

The column has to be declared in FOUR places, not one. SQLite never runs the
drizzle migrations at all (runRemoteMigrations throws for sqlite), so the live
default-dialect schema comes from hand-written DDL:

  1. db/schema.ts, then the two generated dialect schemas and the migrations
  2. db/index.ts CREATE TABLE -- fresh databases
  3. db/index.ts addColumnIfNotExists -- existing databases
  4. database.ts CREATE TABLE and its positional INSERT -- encrypted export

Missing 2 or 3 breaks every host write on the default dialect while the
migration file sits there looking correct.

Two guards, both watched failing first. bootstrap-matches-schema-columns boots
a real database and compares PRAGMA table_info against the drizzle definition
for every table -- it reported ssh_data.enable_web_ui and ssh_data.web_ui_config
missing before item 2/3 landed. A grep-based guard could not: db/index.ts
names columns as snake_case strings, never the camelCase the schema uses.

export-ddl-matches-schema-columns covers database.ts, which no booted database
reaches. It caught a real defect while being written: the two new columns went
into the INSERT list but the VALUES list still held 53 placeholders for 55
columns. Being positional, that shifts every later value by one. The
placeholder-count assertion is now permanent.

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

* feat(hosts): thread web endpoint config through host read and write paths

A host field has to be enumerated by hand in nine places here, and "added a
column, missed one update path" is this codebase's most repeated bug -- during
the first attempt at this feature a field was missed at one of these points
six separate times, each surfacing as a different mystery: endpoints that
saved but never appeared, config that vanished on reload.

Backend: host-normalizers (input type, CONNECT_LEVEL_FIELDS, boolean
normalization, parse block), host.ts (create, update, both read paths,
quick-connect defaults), host-bulk-routes (bulk update, import, reset).
Renderer: host-export-payload, HostManagerData's sshHostToHost, tabUtils'
hostToSSHHost, HostEditorData's form seed and payload builder. The three
renderer mappers copy field by field, so an unlisted field is silently
dropped -- which is how endpoints saved correctly and never appeared.

webUiConfig is parsed with parseWebUiConfig rather than a bare JSON.parse.
dockerConfig on the adjacent line uses a bare one, so a single malformed value
takes out the whole host listing; that is a bug to avoid copying, not a
convention to follow.

All three write paths now clear webUiConfig when the feature is disabled. They
disagreed before, and the export payload ships the config unconditionally -- so
a host disabled without clearing still exported its endpoint list (internal
hostnames, ports, paths) while the UI read as off, and re-enabling resurrected
stale endpoints.

webUiConfig is shared with connect-level recipients, unlike dockerConfig. A
connect-level recipient is already authorized to open these tunnels, so
withholding the config only breaks discovery while the flag advertises the
feature. Docker's precedent does not transfer: its tab works without its
config, whereas a web endpoint IS its config.

The enumeration guard asserts every one of the nine files mentions the web
endpoint field beside its Docker counterpart, and checks the Docker anchor is
present too so it cannot pass vacuously if a file is restructured.

The clear-on-disable assertion was rewritten after the first version passed
with the guard deleted -- a loose regex matched unrelated sites. Both halves
are now anchored on exact text and were watched failing.

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

* feat(tunnel): report the real bound port, support idle close, reserve web:

Three changes the web endpoint open route depends on, plus the name
reservation that makes the scheme safe.

Real bound port. Under sourcePort 0 the kernel assigns the port, but the
runtime recorded the requested value -- so it advertised 0 and any caller
reusing it failed. It now records tcpServer.address().port.

Idle close, behind the new tunnelConfig.idleTimeoutMs. Web endpoint tunnels
are opened on demand and must not outlive their use. The timer lives inside
establishDirectTunnel because the socket set is only visible from that
closure, polls at min(30s, timeout) so "empty for N" means roughly that rather
than "empty at the instant of one N-spaced tick", and unrefs so it cannot hold
the process open. It calls cleanupTunnelResources rather than close(): close()
stops the listener but leaves the entry in activeTunnelRuntimes, so the open
route would keep handing out a port nothing is listening on.

Reserved names skip retry. handleDisconnect returns early for a "web:" name
after a forced cleanup. maxRetries: 0 would NOT achieve this -- the retry path
reads `maxRetries || 3`, so 0 falls through to 3. The cleanup is forced
because cleanupTunnelResources no-ops while tunnelConnecting holds the name,
and a web tunnel has no retry pass to self-heal a leaked runtime.

That early return carries an identity guard, which is the subtle one.
sourceClient.end() only STARTS an async teardown, so the SSH "close" event
lands after a reopen may already have registered a NEW runtime under the same
name. Acting by name alone would tear down the successor rather than the stale
tunnel -- surfacing as a 200 with a good port followed by a silent connection
reset and no error anywhere. handleDisconnect now takes the closing Client and
returns early when the registered runtime belongs to someone else. The idle
timer carries the same guard for the same reason.

/ssh/tunnel/connect now rejects a user-supplied "web:" name with 400.
validateTunnelConfig is no defence here: it returns true unconditionally for
any name that is not the legacy 6-part format, so an authenticated user could
otherwise create a real retry-configured tunnel that collides with a live web
endpoint forward and silently loses its own reconnect behaviour.

The manager tests run against a real TCP listener and real timers -- mixing
fake timers with real socket I/O is a known route to a hanging test. Both were
watched failing: reverting the bound port fails the port test, and swapping
cleanupTunnelResources for close() fails the idle test, which asserts the
ENTRY is gone rather than merely that the listener stopped.

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

* feat(tunnel): add the web endpoint open route

POST /ssh/tunnel/web-endpoint/open { hostId, endpointId } -> { port }.

The host is resolved through the user-scoped resolveHostById, so an
authenticated user cannot obtain a forward to a host id they do not own. The
endpoint is re-normalized out of storage rather than trusted: the stored value
predates any later tightening of the rules, and this is what a forward gets
built from. An enabled flag is required as well as a present endpoint -- a
bulk update that sends only { webUiConfig } can leave a configured endpoint on
a host whose UI reads as off everywhere.

Not gated to the desktop. The forward binds wherever this backend runs, as the
server tunnels feature does, and the endpoint's own bindHost decides whether
that is reachable from a browser.

endpointHost: "127.0.0.1" is load-bearing, not cosmetic. connectSSHTunnel
picks its strategy via shouldEstablishDirectTunnel -> isSingleHostTunnel, which
keys on endpointHost -- setting only targetHost selects a different path and
the forward never binds locally.

connectSSHTunnel never rejects, and its promise resolves right after
conn.connect() -- long before the SSH "ready" event populates
activeTunnelRuntimes. Awaited is not connected, so waitForTunnelSettled polls
the maps the manager already exports. Polling rather than adding a
promise-returning variant: every existing caller is fire-and-forget by design,
and changing that contract for one new caller is the larger blast radius.

A probe forwardOut runs before returning 200. Without it the route succeeds the
moment listen() does, and forwardOut is only attempted per inbound socket where
failure is swallowed -- so the likeliest real error, nothing listening on the
endpoint's port, reached the user as a blank frame and no message.

Staleness is validated at open, never on save: host save lives in the database
service and the runtimes live in the tunnel service, with no push between them.
On reuse the route compares a fingerprint covering the endpoint's target AND
the host's SSH identity, and reopens when it differs. An absent fingerprint
means reuse, not staleness -- a reserved-prefixed runtime can only have been
created here. Deletion, disabling and host removal then need no handling:
nothing reopens the tunnel, so it idles out.

Also closes an authorization gap this feature would otherwise have created.
/ssh/tunnel/disconnect and /ssh/tunnel/cancel checked ownership only inside
`if (config && config.sourceHostId)`, and web tunnels are deliberately absent
from tunnelConfigs -- so the check never ran for them. Host ids are small
sequential integers and endpoint ids are client-supplied, so the name is
guessable and any authenticated user could force-close another user's tunnel.
authorizeTunnelAction recovers the host id from the name and fails closed when
it cannot; the tests were watched failing against the old behaviour.

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

* feat(hosts): add the web endpoint client and per-origin certificate allowance

The client posts a path relative to tunnelApi's base, which already includes
/ssh -- a leading "/ssh" here resolves to /ssh/ssh/... and 404s on every call.
The test asserts that on the captured runtime argument rather than by scanning
source, so quoting style and indirection cannot fool it.

Backend error messages are preserved rather than collapsed. 502 is this
route's likeliest real failure and carries the actionable cause -- SSH auth
rejected, host unreachable, nothing listening on the target port -- and
handleApiError would replace all three with "Server error occurred". It stays
as the fallback for bodies that carry no string reason, so a body shaped
{ error: <object> } cannot reach the user as "[object Object]".

openWebEndpointExternally applies the same refusal gate as the embedded tab.
Opening in the real browser is not the safer path: the cookie jar is the
browser's either way, so a tunnel URL on the page's own host string leaks the
session exactly as a frame would. The refusal happens before the forward is
opened -- binding the port and then declining to navigate would be no
protection.

Certificate allowance covers the one case Electron's existing handling misses:
direct access to a HOSTNAME over https. isPrivateNetworkHost matches IP
literals only and sshData.ip has no IP validation, so https://nas.local:8006
fails the check and renders blank inside an iframe with no click-through --
Chromium offers no proceed option for subframes.

Three properties of that allowance are deliberate and now pinned by tests,
because each would otherwise be undone by a reasonable-looking simplification:

  - it is NOT wired into isInvalidCertificateAllowedForUrl, which also governs
    this process's own outbound TLS via getTlsVerificationOptions;
  - it is https-only, in both the check and the IPC handler, since a non-TLS
    origin in a TLS-error allowlist is meaningless and file:/ftp: must never
    be storable; and
  - entries carry a five-minute TTL refreshed on each registration. Main has
    no host-database access and cannot verify the renderer's claim that an
    origin is a configured endpoint, so the residual risk has to be a
    momentary window rather than one lasting until the app restarts.

The handler stores the parsed origin, never the caller's string, so a path or
wildcard cannot widen the allowance.

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

* feat(hosts): add the Web UI editor tab

Mounted as a Web UI sub-tab inside the SSH group, beside Docker, Tunnels,
Files and Host Metrics, and laid out as two SectionCards following the tunnels
editor: settings first, then the list it governs.

There is a deliberate asymmetry with the sidebar here. The sidebar entry will
appear on enableWebUi alone, because a direct endpoint needs no SSH -- but Web
UI is an SSH sub-tab, so a host with SSH disabled cannot configure endpoints at
all. That is the accepted behaviour and both halves are pinned by tests, so
neither gets "fixed" into agreement later.

tunnelAvailable is enableSsh && originIsLocal, resolved inside HostWebUiTab
rather than in HostEditor.tsx, which is already ~2600 lines. It is NOT gated on
isElectron(): the forward binds wherever the backend runs, exactly as the
server tunnels feature does. resolveConnectionOrigin is called with
connectionType "ssh" deliberately -- a tunnel endpoint always rides SSH, and
"ssh" avoids the guacamole special case that forces "remote" for
RDP/VNC/Telnet.

Three input details that each prevent a silent data loss:

  - the id generator falls back off crypto.randomUUID, which is undefined
    outside a secure context -- a plain-http web deployment is a first-class
    target for direct+external and would otherwise throw on "Add endpoint";
  - a new row gets a de-duplicated label, since labels are what identify an
    endpoint in the sidebar picker; and
  - the port field commits only a value the normalizer would keep. Number("")
    is 0, which the normalizer rejects, so clearing the field would otherwise
    write an endpoint that vanishes on save with no error.

The tunnel fields carry three warnings: a non-loopback bind exposes the
target's web UI unauthenticated to anyone who can reach the port; a loopback
bind on a remote backend cannot be reached from a browser at all; and a tunnel
reached at Termix's own hostname would hand the tunnelled service this
session. All three are shown while configuring rather than only when the tab
fails to load.

The unavailable-tunnel reason is shown whenever tunnelling is unavailable, not
only once a row asks for it -- a disabled dropdown option with no stated reason
reads as the control being broken.

Copy is reused verbatim from the previous iteration's reviewed strings rather
than reworded.

One test was written and then removed rather than kept: its name promised that
switching to tunnel access clears ignoreCert, but Radix Select needs pointer
APIs jsdom lacks, so the body only asserted the control existed. The clearing
is covered where it is enforced, in the normalizer.

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

* feat(hosts): open web endpoints from the sidebar and in a tab

One sidebar entry per host, never one per endpoint: a host may declare up to
16, and a row of 16 identical globes is unusable. With a single endpoint the
entry wears its label and acts directly; with several it carries no endpointId
and the click opens a picker -- a DropdownMenu in the tray, a DropdownMenuSub
in the Connect submenu.

The entry is gated on enableWebUi ALONE, unlike every neighbouring action,
which requires enableSsh. A direct endpoint needs no SSH; SSH matters only
per-endpoint, for tunnel access, which the open route enforces.

openTab gains a fourth optional parameter rather than overloading `restore`,
which means something else. What was actually broken for two endpoints on one
host was the LABEL -- tab ids are already `${name}-${type}-${Date.now()}`, so
they never collided. All existing call sites keep working.

The tab is passed the endpoint ID, not the endpoint object, so one deleted
while its tab is open renders a plain message instead of throwing.

Reload re-resolves and REMOUNTS. A direct endpoint's URL never changes and a
live tunnel returns the same port on every open, so setUrl(resolved) would be
a same-value setState that React bails out of, leaving the frame untouched --
Reload would silently do nothing in the two most common cases. A generation
counter folded into the iframe key fixes that and doubles as the staleness
guard for two resolutions landing out of order. The test captures the DOM node
before and after, and was watched failing against a url-only key.

PERSISTENT_TAB_TYPES is hoisted to module scope and exported so it can be
asserted on -- it was a local const inside the component and therefore
untestable. web-endpoint is deliberately excluded: an idle tunnel re-binds a
fresh kernel-assigned port, so a restored tab could never hold a valid URL.

Two notes on verification. `tsc -p tsconfig.json` passes vacuously in this
repo -- tsconfig.json is a solution file with project references and does
nothing without -b -- so `npm run type-check` (tsc -b --force) is the real
check; it caught two insertions that had landed in the wrong function. And the
one full-suite failure seen along the way was vault-signer-core, which passes
in isolation and on re-run, is untouched by this branch, and is a flake under
parallel load.

Lint: 0 errors, 102 warnings, identical to the baseline on a clean tree.

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

* fix(tunnel): register the web endpoint route under its /ssh path

Every route in routes.ts registers the full "/ssh/tunnel/..." path -- nginx
proxies /ssh through with the path intact -- and the client resolves
"/tunnel/web-endpoint/open" against a baseURL that already ends in /ssh. The
unprefixed registration therefore 404'd every call.

No handler unit test could catch this: they call handleWebEndpointOpen
directly and never touch registration. It surfaced only on opening a real
tunnel against a deployed build, which is why that step exists.

Added a registration test that captures the paths passed to app.post, so the
invariant is checked without needing a server.

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

* fix(hosts): apply session-cookie isolation to direct web endpoints

The cookie guard only covered tunnel access. `unreachableTunnelReason`
returned null for every `access: direct` endpoint, so WebEndpointTab framed
the host's own address unconditionally. With Termix served at
https://termix.example/ and a direct endpoint at https://termix.example:8443/,
the browser attaches Termix's `jwt` to the framed request -- cookies are keyed
by host and ignore the port -- and a `Set-Cookie` from that service lands in
the jar both auth middlewares read before the Authorization header.

Renames the helper to `webEndpointRefusalReason` so its scope is no longer
tunnel-only, and gives it the endpoint's target host. A direct endpoint is now
refused in a browser when that host shares Termix's cookie site, checked
BEFORE any navigation in both open paths (embedded tab and external window) --
refusing after framing would leak on the first request.

`sharesCookieSiteWithPage` treats an equal host as same-site (the jwt is set
host-only, so the port is irrelevant) and also a parent/sub domain, which a
`Set-Cookie: Domain=` from the target crosses. The suffix test is anchored on a
dot boundary so `eviltermix.example` does not pass as `termix.example`. A
precise eTLD+1 test would also catch sibling subdomains, but needs a public
suffix list this app does not bundle.

The desktop stays exempt: its session is Bearer-only with no `jwt` in the jar.

Also drops "or change this endpoint to Direct" from the tunnel refusal copy,
which pointed at the path that had this same leak.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com>

* fix(tunnel): preserve local status when remote names collide (#1431)

* fix(desktop): honor remote sync certificate setting (#1432)

* fix(file-manager): interpolate preview download filename (#1433)

* fix(automations): dispatch SSH login events to triggers (#1434)

* fix(hosts): preserve imported settings and remap jump hosts (#1435)

* fix(hosts): preserve terminal switches across JSON transfer

* fix(hosts): remap imported jump-host dependencies

* fix(ssh): preserve agent framing after unsupported extensions (#1436)

* fix(guacamole): return tokens before awaiting the client handshake (#1437)

* fix(sidebar): unmount the host tree while its panel is hidden (#1438)

* fix(terminal): leave macOS Option characters enabled by default (#1439)

* fix(dashboard): open the enabled remote desktop protocol (#1440)

* fix(version): preserve local version when update checks fail (#1441)

* fix(sftp): create uploaded directories without shell access (#1442)

* fix(desktop): honor explicit GPU acceleration opt-out (#1443)

* fix(desktop): exclude remote-only host IDs from local tab persistence (#1444)

* Enhance SFTP and terminal flows, stabilize desktop sync (#1377)

* feat: add electron sftp c2s and terminal ai flows

* fix: stabilize desktop sync and c2s tunnels

* Improve remote tunnels and SFTP transfer feedback

* chore: sync Crowdin translations

* chore(deps): bump the prod-minor-updates group across 1 directory with 3 updates (#1325)

Bumps the prod-minor-updates group with 3 updates in the / directory: [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript), [js-yaml](https://github.com/nodeca/js-yaml) and [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg).


Updates `@anthropic-ai/sdk` from 0.116.0 to 0.120.0
- [Release notes](https://github.com/anthropics/anthropic-sdk-typescript/releases)
- [Changelog](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md)
- [Commits](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.116.0...sdk-v0.120.0)

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

Updates `pg` from 8.22.0 to 8.23.0
- [Changelog](https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianc/node-postgres/commits/pg@8.23.0/packages/pg)

---
updated-dependencies:
- dependency-name: "@anthropic-ai/sdk"
  dependency-version: 0.120.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: js-yaml
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
- dependency-name: pg
  dependency-version: 8.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-minor-updates group across 1 directory with 10 updates (#1323)

Bumps the dev-minor-updates group with 10 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@codemirror/commands](https://github.com/codemirror/commands) | `6.10.4` | `6.11.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` |
| [electron](https://github.com/electron/electron) | `43.2.0` | `43.4.1` |
| [globals](https://github.com/sindresorhus/globals) | `17.9.0` | `17.11.0` |
| [i18next](https://github.com/i18next/i18next) | `26.3.6` | `26.4.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.28.0` | `1.33.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` |
| [react-pdf](https://github.com/wojtekmaj/react-pdf/tree/HEAD/packages/react-pdf) | `10.4.1` | `10.5.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.66.0` | `8.67.0` |



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

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

Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react)

Updates `electron` from 43.2.0 to 43.4.1
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v43.2.0...v43.4.1)

Updates `globals` from 17.9.0 to 17.11.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.9.0...v17.11.0)

Updates `i18next` from 26.3.6 to 26.4.0
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.0)

Updates `lucide-react` from 1.28.0 to 1.33.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react)

Updates `react-hook-form` from 7.84.0 to 7.85.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0)

Updates `react-pdf` from 10.4.1 to 10.5.0
- [Release notes](https://github.com/wojtekmaj/react-pdf/releases)
- [Commits](https://github.com/wojtekmaj/react-pdf/commits/v10.5.0/packages/react-pdf)

Updates `typescript-eslint` from 8.66.0 to 8.67.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@codemirror/commands"
  dependency-version: 6.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@types/node"
  dependency-version: 26.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: electron
  dependency-version: 43.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: globals
  dependency-version: 17.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: i18next
  dependency-version: 26.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: lucide-react
  dependency-version: 1.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-hook-form
  dependency-version: 7.85.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-pdf
  dependency-version: 10.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: sync Crowdin translations

* Update redirect-issues workflow configuration

Updated the workflow to change the runner and modify the issue response message.

* test(sftp): verify local collection limit boundaries

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com>

* chore: increment ver

* fix: allow any origin by default when CORS_ALLOWED_ORIGINS is unset

* feat(file-manager): parallel local transfers (#1446)

Uploads from the Local pane (and downloads to it) ran strictly one file
after another. Batches of many small files were bound by per-file latency
rather than bandwidth.

- `runWithConcurrency(items, limit, worker, shouldStop)`: a bounded worker
  pool that dispatches in order, keeps at most `limit` transfers in flight,
  and stops dispatching once cancelled while letting in-flight items
  finish. Worker errors are handled by the worker (one failure never aborts
  the batch).
- useLocalTransfers: both directions go through the pool. Remote / local
  directory skeletons are still created up front, so file order does not
  matter. The batch runner now tracks a set of in-flight transfer ids
  (Cancel cancels all of them), sums bytes across in-flight transfers plus
  settled ones for the progress bar / speed, and shows how many files are
  moving at once.
- New preference "Simultaneous File Transfers" (1-8, default 4) in the
  profile settings, stored in localStorage
  (`termix:file-manager:transfer-concurrency`) and part of the storage
  snapshot. 1 restores the previous sequential behaviour; the hint suggests
  lowering it for servers that limit SFTP channels.
- Remote directories are created with the now-idempotent mkdir (#1442)
  without swallowing its errors, so a real failure stops the batch up
  front instead of surfacing as N per-file failures. When files do fail,
  the summary toast carries the first underlying reason (e.g. the
  backend's 401 message) instead of a bare "Upload failed".
- Tests: pool never exceeds the limit and drains everything, stops on
  cancel, tolerates a failing item, handles empty input; preference
  clamping and persistence; bridge-level concurrent uploads/downloads
  with a mid-flight cancel leave every other file intact and no partials.

Co-authored-by: Max <maxim@cogitate.ai>

* fix(sftp): complete streamed uploads and stop pre-parsing chunk bodies

* fix(desktop): stop setting Content-Length on local download requests

* fix(file-manager): keep drop overlays in view when the list is scrolled

* fix(file-manager): let remote rows be dropped on the local pane

* fix(desktop): authenticate local transfers with the renderer's token

* chore: update release notes

* chore: remove unused gitlab ci and argocd deploy configs

* chore: remove unused files

* feat: improve loading animation

* fix(shell): stop tab reorder from resetting terminals and tab indicator

Keep the tab-content portal order stable so reordering tabs doesn't
retrigger React's offscreen pass and dispose live terminals. Also stop
the active tab indicator from teleporting during a drag, and fix the
drag ghost's size/border mismatch.

* fix(shell): hand-roll the tab indicator instead of a shared layoutId

Framer's layoutId could measure the wrong tab's rect during a reorder
and land on an inactive tab, or leave a stray line visible mid-drag.
Now it reads the active tab's own DOM rect directly and hides while
dragging.

* fix(hosts): fix right-click menu position and unwanted tray expand

* chore: update release notes

* fix(terminal): stop autosuggestion ghost text overlapping typed input

Position was computed from cursorX before server echo landed, causing
a stale read that overlapped just-typed characters on fast local input.

* chore: update release notes for v2.8.0

* fix(sftp): rebuild transfer tab for web, fix menu offset bug

Drop the electron-only local mode and dead code, i18n all strings,
fix double progress toasts and a wrong pane refresh on move.
Fix context menus rendering offset due to a lingering CSS transform
from the tab-switch animation. Move SFTP next to SSH Tools in the rail.

* fix(file-manager): shrink oversized .. entry, navigate on single click

* fix: make select2 component use rounded corners

* fix: rebuild terminal AI assistant on the real backend

Removes the Electron-only Agent Mode/AI Command Helper that bypassed
admin/user gating and ran commands with no approval step. Replaces it
with a terminal-docked panel on the same gated backend as the AI tab,
adds a per-host toggle (off by default), moves it into the toolbar,
and fixes proposal ordering and run-in-terminal execution.

* fix(file-manager): remove duplicate borders in toolbar view toggle

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

* fix: separate registration toggle from step ca settings

* fix: collab room bugs and add room deletion

Accent-colored new room button, fix fullscreen guest view layout and
duplicate view-only badges, self-heal stale presenter state, add
delete room for persistent rooms.

* refactor: move host-identity helpers to hosts core

Used by docker, file-manager, and terminal alike, so it belongs
at the hosts root instead of under terminal/.

* refactor: move host-session-status singleton to hosts core

metrics subscribed to terminal's private online/offline pub-sub
module. Moved to hosts core so both sides depend on a shared
module instead of metrics reaching into terminal. Marked the
subscribe call with PLUGIN-EVENT for the future event bus.

* refactor: split generic automation event notify out of metrics

notifyAutomationInternalEvent was in hosts/metrics/automation-bridge.ts
but is used by tunnel, host routes, user routes, and automations
engine itself, not just metrics. Moved it to hosts/automation-events.ts
so those callers depend on a shared module instead of metrics
internals. Left the metrics-specific notifiers in place.

* feat: add plugin system schema and repositories

Adds plugins, plugin_permission_grants, plugin_registries, and
plugin_install_counts tables plus their repositories. No routes or UI yet.

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

* feat: add runtime rail item and tab component registries for plugins

* feat: support runtime-registered permission groups

Adds register/unregister for plugin permission groups so the RBAC
catalog and validation can grow beyond the static list.

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

* feat: add plugin-api nginx route and dispatcher stub

* feat: add plugin manifest schema and validator

* chore: update release notes

* chore: update i18n for local/remote file manager

* feat: add toggle to show/hide app rail pin button

* feat(host-metrics): add NVIDIA GPU metrics card (#1452)

* feat(host-metrics): add NVIDIA GPU metrics card

Collect per-GPU utilization, VRAM, temperature, power, fan speed and
the processes using each GPU over SSH with nvidia-smi. The collector
exits immediately when nvidia-smi is missing, so hosts without a GPU
pay almost nothing per poll.

The GPU card is opt-in: it is available from the Add card tray but is
not part of new-host defaults or any UI preset. It shows live
sparklines for utilization and VRAM per GPU.

Adaptive polling now also watches GPU readings and the GPU process
count, so it no longer backs off on hosts where only the GPU is busy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2ctuPwiesLzhF6XQiozm8

* fix(host-metrics): draw sparklines from the first metrics sample

The first sample fetched when the tab connects was shown but never
added to the sparkline history, so every sparkline (CPU, memory, disk,
GPU) stayed empty until the second poll, a full metrics interval later
(about 35 s with the default 30 s interval). Record the first sample
like every later one, so the lines appear as soon as the tab loads.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2ctuPwiesLzhF6XQiozm8

* Fix logical condition for memory percentage calculation

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: annotate local transfer plan type to fix CI type-check

* fix: move connection toolbar settings to bottom of host editor general tab

* chore: add debug logging for macOS sharp packaging failure

Temporary diagnostic to find which phase drops @img/sharp-darwin-x64
from the packaged app. Revert once root cause is found.

* fix: correct macOS sharp verify script for universal build layout

electron-builder uses mergeASARs: false, so universal builds ship
app-x64.asar.unpacked and app-arm64.asar.unpacked side by side instead
of a single app.asar.unpacked. The verify script only checked the
single-asar path, so it always failed on universal/mas artifacts even
when packaging was correct.

* fix: update sharp verify test fixtures for universal build layout

The test built fake apps using the single app.asar.unpacked layout,
which doesn't match how universal builds are actually packaged now
(app-x64.asar.unpacked / app-arm64.asar.unpacked side by side).

* chore: update readme

* fix: guard against missing rooms array in collab list response

* fix: distinct guac connection log stages, RDP black screen before failure

* fix: proxy /collab routes in nginx configs

* fix: stop tab-switch flash and host metrics/proxmox reconnect

Tab DOM visibility now syncs before paint instead of after, and
switching tabs no longer tears down live metrics connections.

* fix: tab bar flashing, growing, and merged separators

Terminal tabs no longer flash when switching, the enter animation no
longer nudges layout size, and a stray transform on resting tabs no
longer causes the border between tabs to vanish at some zoom levels.

* fix: match select trigger height to inputs in web UI editor

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

* chore: sync Crowdin translations for 2.8.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Angad Singh <7099405+singhangadin@users.noreply.github.com>
Co-authored-by: Angad Singh <angad@singhangad.in>
Co-authored-by: Neo <54811660+neooriginal@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Wali Lambert <98448225+YatoVoid@users.noreply.github.com>
Co-authored-by: Nasif Rahman <44437976+nasif-naseef@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: vietanhtwdk <vietanhtruongwdk@gmail.com>
Co-authored-by: inontz <inontz@icloud.com>
Co-authored-by: inontz <inontz@users.noreply.github.com>
Co-authored-by: Max Serov <133950708+maxser0v@users.noreply.github.com>
Co-authored-by: Max <maxim@cogitate.ai>
Co-authored-by: ssmurfgg04-gif <ssmurfgg04@gmail.com>
Co-authored-by: ssmurfgg04-gif <232103099+ssmurfgg04-gif@users.noreply.github.com>
Co-authored-by: ZacharyZcR <payasonorahc@protonmail.com>
Co-authored-by: slsgzs-cloud <slsgzs@gmail.com>
Co-authored-by: anshtsolanki-sketch <anshtsolanki@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: tcezarl <tomescu.cezar.laurentiu@gmail.com>
Co-authored-by: Anton Priestley <anton@priestley.me>
Co-authored-by: Hakim M <hakimmarsudi@outlook.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Adel Alzubeir <14052842+Adelzu@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-09-20 14:56:39 -05:00

5105 lines
320 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"connection": {
"retryingIn": "{{seconds}}秒後に再試行します({{attempt}}/{{max}})",
"retryingNow": "再試行中... ({{attempt}}/{{max}})",
"disconnected": "接続できません",
"reconnect": "再接続"
},
"termixId": {
"title": "Termix ID",
"loadFailed": "Termix IDのロードに失敗しました",
"claimTitle": "Termix IDを取得",
"claimIntro": "一意のハンドルを選択します。SSH公開鍵が公開URLで公開され、任意のサーバーのauthorized_keysファイルに追加できます。",
"handleLabel": "ハンドル",
"handlePlaceholder": "alice",
"checking": "確認中…",
"available": "利用可能",
"taken": "既に使用されています",
"invalidHandle": "英小文字、数字、ハイフン(-)、アンダースコア(_)のみ使用できます",
"descriptionLabel": "説明(任意)",
"descriptionPlaceholder": "仕事用ラップトップとスマートフォンのキー",
"create": "Termix IDを作成",
"created": "Termix IDが作成されました",
"createFailed": "Termix IDの作成に失敗しました",
"deleteConfirm": "Termix IDと公開されたすべてのキーを削除しますか?プロビジョニングしたサーバーでは、手動で削除するまでキーが保持されます。",
"deleted": "Termix IDが削除されました",
"deleteFailed": "Termix IDの削除に失敗しました",
"copyFailed": "コピーに失敗しました",
"resolverUrlLabel": "公開リゾルバーURL",
"provisionLabel": "サーバーをプロビジョニング",
"publishTitle": "公開鍵を公開",
"generate": "生成",
"generateTooltip": "Ed25519キーペアを生成 — 公開鍵を公開し、秘密鍵をデバイスにダウンロードします",
"saveToVault": "認証情報に保存",
"keyPlaceholder": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@host",
"labelPlaceholder": "ラベル(任意)",
"add": "追加",
"importFromCredential": "または保存済みの認証情報からインポート",
"keyPublished": "キーが公開されました",
"addKeyFailed": "キーの追加に失敗しました",
"generatedSaved": "キーペアが生成され、認証情報ボールトに保存されました。秘密鍵もダウンロードされました。",
"generatedOnly": "キーペアが生成されました — 秘密鍵がダウンロードされました(一度だけ表示されます)。",
"generateFailed": "キーの生成に失敗しました",
"imported": "キーが認証情報からインポートされました",
"importFailed": "鍵のインポートに失敗しました",
"noKeys": "まだ公開鍵は公開されていません。",
"keysTitle": "公開鍵",
"published": "公開済み",
"hidden": "非表示",
"keyRemoved": "鍵が削除されました",
"removeKeyFailed": "鍵の削除に失敗しました",
"updateKeyFailed": "鍵の更新に失敗しました",
"fromVault": "認証情報ボールトから",
"linkedToTermixId": "Termix ID 経由で公開",
"selectCredential": "認証情報を選択...",
"import": "インポート",
"caTitle": "認証局",
"caIntro": "このCAをサーバーで信頼すると、署名した証明書が受け入れられます。ローテーションで一度にすべてを失効させることができ、証明書自体も有効期限が切れます。",
"caEnable": "CA を有効化",
"caEnabled": "CA 有効",
"caCreateFailed": "CA の有効化に失敗しました",
"caPublicKeyLabel": "CA 公開鍵",
"caTrustLabel": "サーバーで信頼する(root で実行)",
"caRotate": "ローテーション",
"caRotateConfirm": "CA をローテーションしますか?署名されたすべての証明書の受け入れが停止され、再発行が必要になります。",
"caRotated": "CA がローテーションされました — 以前の証明書は失効しました",
"caRotateFailed": "CA のローテーションに失敗しました",
"caDelete": "CA を削除",
"caDeleteConfirm": "認証局を削除しますか?",
"caDeleted": "CA が削除されました",
"caDeleteFailed": "CA の削除に失敗しました",
"caValidityLabel": "証明書の有効期間(日)",
"issueCert": "証明書",
"issueCertTooltip": "この鍵に対して、CA が署名した SSH 証明書を発行します",
"certIssued": "証明書が発行され、ダウンロードされました",
"certIssueFailed": "証明書の発行に失敗しました"
},
"credentials": {
"folders": "フォルダー",
"folder": "フォルダー",
"password": "パスワード",
"key": "キー",
"sshPrivateKey": "SSH 秘密鍵",
"upload": "アップロード",
"keyPassword": "鍵のパスワード",
"sshKey": "SSH 鍵",
"uploadPrivateKeyFile": "秘密鍵ファイルをアップロード",
"searchCredentials": "認証情報を検索...",
"addCredential": "認証情報を追加",
"caCertificate": "CA 証明書 (-cert.pub)",
"caCertificateDescription": "任意: CA署名済み証明書ファイルをアップロードまたは貼り付けてください (例: id_ed25519-cert.pub)。SSHサーバーが証明書ベースの認証を使用する場合に必要です。",
"uploadCertFile": "-cert.pub ファイルをアップロード",
"clearCert": "クリア",
"certLoaded": "証明書が読み込まれました",
"certPublicKeyLabel": "CA 証明書",
"certTypeLabel": "証明書の種類",
"pasteOrUploadCert": "-cert.pub 証明書を貼り付けまたはアップロード...",
"hasCaCert": "CA 証明書あり",
"noCaCert": "CA 証明書なし",
"noPublicKeyAvailable": "公開鍵がありません。最初に認証情報エディタを開いてください。",
"deployCommandCopied": "デプロイコマンドがコピーされました",
"sortCredentials": "認証情報の並べ替え",
"sortDefault": "デフォルトの並び順",
"sortNameAsc": "名前 (A → Z)",
"sortNameDesc": "名前 (Z → A)",
"sortUsernameAsc": "ユーザー名 (A → Z)",
"sortUsernameDesc": "ユーザー名 (Z → A)",
"filterCredentials": "認証情報の絞り込み",
"filterClearAll": "フィルターをクリア",
"filterTypeGroup": "タイプ",
"filterTypePassword": "パスワード",
"filterTypeKey": "SSH 鍵",
"filterTagsGroup": "タグ",
"copyDeployCommand": "デプロイコマンドをコピーする",
"cloneCredentialAction": "クローン認証情報",
"clonedCredential": "クローン {{name}}",
"clonedCredentialName": "{{name}} (コピー)",
"shareCredentialAction": "認証情報を共有する",
"sharedBadge": "共有",
"sharedBy": "{{owner}} によって共有されました",
"share": {
"title": "「{{name}} を共有する」",
"description": "受信者は、秘密情報の暗号化されたコピーをそれぞれ受け取ります。認証情報が変更されるたびにコピーは更新され、共有が取り消されると削除されます。",
"users": "ユーザー",
"roles": "役割",
"searchPlaceholder": "検索...",
"permission": "許可",
"levelUse": "使用",
"levelManage": "管理",
"levelUseDesc": "使用方法:認証情報をホストに添付して接続します。秘密情報自体は隠されたままです。",
"levelManageDesc": "管理:認証情報を編集したり、他のユーザーと共有したりすることもできます。",
"expires": "有効期限切れ",
"expiry": {
"never": "一度もない",
"oneDay": "1日",
"sevenDays": "7日間",
"thirtyDays": "30日間"
},
"currentAccess": "共有先",
"revoke": "取り消す",
"shared": "認証情報が共有されました",
"shareButton": "共有"
},
"deleteCredentialAction": "認証情報を削除します",
"editCredentialAction": "認証情報を編集する",
"failedToCloneCredential": "認証情報の複製に失敗しました",
"failedToDeleteCredential": "認証情報の削除に失敗しました",
"idBadge": "ID",
"keyBadge": "鍵",
"passwordBadge": "障害者",
"renameFolder": "フォルダの名前を変更する",
"deleteFolder": "フォルダを削除する",
"deleteCredentialConfirm": "認証情報「{{name}}」を削除しますか?",
"deletedCredential": "削除済み {{name}}",
"deploySSHKeyTitle": "ホストにキーをデプロイします",
"loadingCredentials": "認証情報を読み込んでいます...",
"noCredentialsFound": "認証情報が見つかりません",
"noCredentialsMatchSearch": "検索条件に一致する認証情報が見つかりませんでした。",
"addCredentialBtn": "認証情報を追加",
"failedToReorder": "認証情報の再注文に失敗しました",
"failedToMoveCredential": "認証情報の移動に失敗しました",
"sortManual": "手動(ドラッグして並べ替え)",
"customizeSidebar": "サイドバーをカスタマイズする",
"customizeSidebarDescription": "認証情報リストの表示方法と動作方法を選択します。",
"customizeDensityTitle": "密度",
"densityComfortableDesc": "1行につき1つの認証情報、詳細情報付き。",
"densityCompactDesc": "長いリストの場合は、資格情報1つにつき1行に記入してください。",
"displayDensityComfortable": "快適",
"displayDensityCompact": "コンパクト",
"customizeBehaviorTitle": "行動",
"showCredentialTags": "タグを表示",
"showCredentialTagsDesc": "認証情報リストにタグを表示する",
"actionsVisibility": "認証情報操作",
"actionsVisibilityDesc": "各認証情報に「接続」ボタンと「管理」ボタンが表示されたら",
"actionsAlways": "常に見える",
"actionsOnly": "接続のみ、クリックで終了",
"actionsHover": "マウスオーバー時に表示",
"actionsClick": "クリックで表示",
"customizeSortHint": "並べ替え順序は、ツールバーの並べ替えメニューにあります。",
"expandActions": "アクションを展開する",
"collapseActions": "折りたたみアクション",
"backToHosts": "ホスト一覧に戻る",
"backToCredentials": "認証情報に戻る",
"searchCredentialsPlaceholder": "検索資格情報…",
"deployDialogTitle": "SSHキーをデプロイする",
"deployDialogDesc": "ホストの authorized_keys に {{name}} をデプロイします。",
"targetHostLabel": "ターゲットホスト",
"selectHostOption": "ホストを選択してください...",
"deployingBtn": "展開中...",
"deployBtn": "展開する",
"keyDeployedSuccess": "キーの展開に成功しました",
"failedToDeployKey": "キーのデプロイに失敗しました",
"folderRenamedTo": "フォルダ名が「{{name}}」に変更されました",
"failedToRenameFolder": "フォルダ名の変更に失敗しました",
"arrangeUnlockedSwitchedToManual": "手動ソートに切り替えたので、注文内容が保持されます。",
"arrangeUnlocked": "ロックを解除してドラッグして並べ替える"
},
"homepage": {
"title": "ホームページ",
"addWidget": "ウィジェットを追加",
"editWidget": "ウィジェットを編集",
"deleteWidget": "削除",
"widgetTypes": "ウィジェットタイプ",
"serviceLink": "サービスリンク",
"folder": "フォルダー",
"clock": "時計",
"notes": "メモ",
"hostStatus": "ホストステータス",
"bookmarkList": "ブックマーク",
"zoomIn": "拡大",
"zoomOut": "縮小",
"resetView": "表示をリセット",
"lockLayout": "レイアウトをロック",
"unlockLayout": "レイアウトのロックを解除",
"noWidgets": "右クリックまたは「+」をクリックして最初のウィジェットを追加してください",
"openFullView": "全画面表示を開く",
"previewTitle": "ホームページプレビュー",
"cancel": "キャンセル",
"save": "保存",
"title_label": "タイトル",
"widgetTitlePlaceholder": "ウィジェットのタイトル(任意)",
"url": "URL",
"imageUrl": "カスタム画像URL",
"imageUrlHint": "空白のままにすると、サイトのファビコンが自動的に使用されます",
"showImage": "画像を表示",
"description": "説明",
"color": "色",
"icon": "アイコン",
"expanded": "デフォルトで展開",
"timezone": "タイムゾーン",
"invalidTimezone": "無効なタイムゾーンです。IANA名(例:America/New_York)を使用してください。",
"showSeconds": "秒を表示",
"format12h": "12時間表示",
"format24h": "24時間表示",
"content": "内容",
"backgroundColor": "背景色",
"host": "ホスト",
"showMetrics": "メトリクス表示",
"links": "リンク",
"addLink": "リンクを追加",
"linkLabel": "ラベル",
"linkUrl": "URL",
"removeLink": "削除",
"categoryLinks": "リンク",
"categoryInfo": "情報",
"categorySystem": "システム",
"widgetServiceLinkDesc": "サービスURLへリンクするクリック可能なタイル",
"widgetFolderDesc": "関連するウィジェットをグループ化するコンテナ",
"widgetClockDesc": "設定可能なタイムゾーンを備えた現在時刻の時計",
"widgetNotesDesc": "Markdownメモウィジェット",
"widgetHostStatusDesc": "SSHホストのCPU、メモリ、ディスク使用状況をライブ表示",
"widgetBookmarkListDesc": "クイックリンクのリスト",
"copyLink": "リンクをコピー",
"linkCopied": "リンクがコピーされました!",
"location": "場所",
"temperatureUnit": "温度単位",
"showForecast": "3日間の予報を表示",
"scrolling": "スクロール許可",
"feedUrl": "フィードURL",
"maxItems": "最大アイテム数",
"showDescription": "説明を表示",
"widgetWeatherName": "天気",
"widgetWeatherDesc": "任意の場所の現在の天気",
"widgetIframeName": "iFrame埋め込み",
"widgetIframeDesc": "任意のURLをiFrameで埋め込み",
"widgetRssName": "RSSフィード",
"widgetRssDesc": "RSSまたはAtomフィードのアイテムを表示",
"dragToFolder": "ウィジェットをここにドラッグ、または+で追加",
"showDisk": "ディスク使用量を表示",
"addToFolder": "ウィジェットをフォルダに追加",
"noHostSelected": "ホストが選択されていません",
"metricsNotAvailable": "メトリクスは利用できません",
"selectHost": "ホストを選択...",
"displayedMetrics": "表示メトリクス",
"metricCpu": "CPU",
"metricMemory": "メモリ",
"metricDisk": "ディスク",
"metricUptime": "稼働時間",
"metricSystem": "システム",
"metricOs": "OS",
"metricKernel": "カーネル",
"metricHostname": "ホスト名",
"metricNetwork": "ネットワーク",
"metricProcesses": "プロセス",
"metricProcessesTotal": "合計",
"metricProcessesRunning": "実行中",
"categoryMonitoring": "モニタリング",
"loading": "読み込み中...",
"noData": "利用可能なデータはありません",
"allClear": "すべて正常",
"acknowledgeAlert": "確認",
"noPingUrls": "URLが設定されていません",
"pingLabel": "ラベル",
"addPingUrl": "URLを追加",
"showLatency": "レイテンシを表示",
"refreshInterval": "更新間隔",
"seconds": "秒",
"filterActivityTypes": "アクティビティタイプフィルター",
"filterTypesHint": "すべてを表示するには空のままにします",
"showTimestamp": "タイムスタンプを表示",
"uptimeUnavailable": "稼働時間は利用できません",
"uptimeLabel": "稼働時間",
"overviewVersion": "バージョン",
"overviewUpdate": "最新",
"overviewUpdateLabel": "アップデート",
"overviewUpdateAvailable": "アップデートあり",
"overviewDatabase": "データベース",
"overviewUptime": "稼働時間",
"noHosts": "ホストが設定されていません",
"hostGridHosts": "ホスト",
"hostGridAllHint": "空のままにするとすべてのホストを表示します",
"columns": "列",
"showIp": "IPアドレスを表示",
"connectionType": "接続タイプ",
"layout": "レイアウト",
"showStatus": "ステータスを表示",
"showHostName": "ホスト名を表示",
"noDockerActivity": "Dockerアクティビティはありません",
"noActivity": "アクティビティはありません",
"showAcknowledged": "確認済みを表示",
"showCurrentValue": "現在の値を表示",
"chartMetric": "メトリック",
"metricRange": "範囲",
"widgetMetricsChartName": "メトリックチャート",
"widgetMetricsChartDesc": "ホストのCPU、メモリ、ディスク、またはネットワークの履歴チャート",
"widgetHostGridName": "ホストグリッド",
"widgetHostGridDesc": "SSHホストステータスのグリッドビュー",
"widgetAlertFeedName": "アラートフィード",
"widgetAlertFeedDesc": "確認機能付きのライブアラート通知",
"widgetPingStatusName": "Pingステータス",
"widgetPingStatusDesc": "1つ以上のURLのHTTP pingステータス",
"widgetRecentActivityName": "最近のアクティビティ",
"widgetRecentActivityDesc": "スクロール可能なTermixの最近のアクティビティフィード",
"widgetTermixUptimeName": "Termixアップタイム",
"widgetTermixUptimeDesc": "Termixサーバーのライブアップタイムカウンター",
"widgetSystemOverviewName": "システム概要",
"widgetSystemOverviewDesc": "Termixバージョン、データベースの状態、アップタイムを一目で",
"widgetSshQuickConnectName": "SSHクイック接続",
"widgetSshQuickConnectDesc": "SSHセッションを開くワンクリックボタン",
"widgetDockerActivityName": "Dockerアクティビティ",
"widgetDockerActivityDesc": "すべてのホストにわたる最近のDockerコンテナイベント",
"widgetCalendarName": "カレンダー",
"widgetCalendarDesc": "今日が強調表示された月間カレンダー",
"widgetCountdownName": "カウントダウン",
"widgetCountdownDesc": "目標日までのカウントダウンタイマー",
"widgetSearchBarName": "検索バー",
"widgetSearchBarDesc": "クイックウェブ検索ウィジェット",
"widgetTextBannerName": "テキストバナー",
"widgetTextBannerDesc": "キャンバス上の見出しや強調ラベル",
"widgetImageWidgetName": "画像",
"widgetImageWidgetDesc": "URLから画像を表示",
"widgetMarkdownNotesName": "Markdownノート",
"widgetMarkdownNotesDesc": "Markdownをインラインで表示できるリッチなノート",
"widgetCustomApiName": "カスタムAPI",
"widgetCustomApiDesc": "任意のJSON APIからデータを取得して表示",
"widgetServiceGridName": "サービスグリッド",
"widgetServiceGridDesc": "設定可能なサービスリンクのタイルグリッド",
"widgetDashboardLinksName": "ダッシュボードリンク",
"widgetDashboardLinksDesc": "ダッシュボードで設定したサービスリンクを表示",
"widgetSearchLinksName": "検索ショートカット",
"widgetSearchLinksDesc": "インライン入力対応のクイック検索ショートカット",
"widgetLinkTreeName": "リンクツリー",
"widgetLinkTreeDesc": "見出し付きのリンクグループ",
"calMon": "月",
"calTue": "火",
"calWed": "水",
"calThu": "木",
"calFri": "金",
"calSat": "土",
"calSun": "日",
"startOnMonday": "週の始まりを月曜に",
"countdownNoDate": "目標日が設定されていません",
"countdownPast": "イベントは終了しました",
"countdownDays": "日",
"countdownHours": "時間",
"countdownMinutes": "分",
"countdownSeconds": "秒",
"countdownLabel": "ラベル",
"countdownLabelPlaceholder": "例: リリース日",
"countdownShowDays": "日数を表示",
"countdownShowHours": "時間を表示",
"targetDate": "目標日",
"searchEngine": "検索エンジン",
"customSearchUrl": "カスタム検索URL",
"searchPlaceholder": "検索...",
"searchGo": "検索",
"searchPlaceholderLabel": "プレースホルダーテキスト",
"searchPlaceholderHint": "検索入力欄に表示されるテキスト",
"openInNewTab": "新しいタブで開く",
"searchQueryPlaceholder": "クエリを入力...",
"noSearchShortcuts": "設定済みのショートカットはありません",
"addSearchShortcut": "ショートカットを追加",
"fontSize": "フォントサイズ",
"textAlign": "テキスト配置",
"fontWeight": "フォントの太さ",
"clearColor": "色をクリア",
"imageFit": "画像フィット",
"imageLinkUrl": "リンクURL",
"noImage": "画像URLが設定されていません",
"altText": "代替テキスト",
"altTextPlaceholder": "画像の説明を入力",
"renderMarkdown": "Markdownをレンダリング",
"displayMode": "表示モード",
"displayField": "表示フィールド",
"jsonPath": "JSONパス",
"customApiLabel": "ラベル",
"customApiLabelPlaceholder": "例: 温度",
"customApiUnit": "単位",
"customApiNoUrl": "API URLが設定されていません",
"customApiError": "取得に失敗しました",
"customApiNotArray": "レスポンスが配列ではありません",
"addService": "サービスを追加",
"showLabels": "ラベルを表示",
"iconSize": "アイコンサイズ",
"noDashboardLinks": "ダッシュボードリンクが設定されていません",
"noLimit": "制限なし",
"sectionHeading": "セクション見出し",
"addSection": "セクションを追加",
"compactMode": "コンパクトモード",
"showDetailed": "詳細を表示",
"selectHosts": "ホストを選択",
"allHosts": "すべてのホスト",
"listLayout": "リスト",
"gridLayout": "グリッド",
"terminal": "ターミナル",
"files": "ファイル",
"docker": "Docker",
"range15m": "15分",
"range1h": "1時間",
"range6h": "6時間",
"range24h": "24時間",
"metricNetRx": "ネットワーク受信",
"metricNetTx": "ネットワーク送信",
"severityFilter": "重要度フィルター",
"filterAll": "すべて",
"accentColor": "アクセントカラー",
"widgetSshTerminalName": "SSHターミナル",
"widgetSshTerminalDesc": "設定済みホストに接続するインラインSSHターミナル",
"sshTerminalNoHost": "ホストが設定されていません",
"sshTerminalConnect": "接続",
"sshTerminalAutoConnect": "読み込み時に自動接続",
"widgetQuickConnectName": "クイック接続",
"widgetQuickConnectDesc": "ホスト上のあらゆる接続タイプをワンクリックで起動するボタン",
"connectionTypes": "接続タイプ",
"connType_terminal": "ターミナル",
"connType_files": "ファイルマネージャー",
"connType_docker": "Docker",
"connType_tunnel": "トンネル",
"connType_host-metrics": "ホストメトリクス",
"connType_rdp": "RDP",
"connType_vnc": "VNC",
"connType_telnet": "Telnet",
"widgetFileManagerName": "ファイルマネージャー",
"widgetFileManagerDesc": "設定済みホスト用の組み込みSFTPファイルマネージャー",
"widgetDockerName": "Dockerマネージャー",
"widgetDockerDesc": "設定済みホスト用の組み込みDockerコンテナマネージャー",
"widgetTunnelName": "トンネルマネージャー",
"widgetTunnelDesc": "設定済みホスト用の組み込みSSHトンネルマネージャー",
"widgetNoHostSelected": "ホストが設定されていません"
},
"serverConfig": {
"title": "サーバー設定",
"description": "TermixサーバーのURLを設定してバックエンドサービスに接続します",
"serverUrl": "サーバーURL",
"enterServerUrl": "サーバーURLを入力してください",
"saveFailed": "設定の保存に失敗しました",
"saveError": "設定の保存中にエラーが発生しました",
"saving": "保存中...",
"saveConfig": "設定を保存",
"helpText": "Termixサーバーが実行されているURLを入力してください (例: http://localhost:30001 または https://your-server.com)",
"changeServer": "サーバー変更",
"mustIncludeProtocol": "サーバーURLはhttp://またはhttps://で始まる必要があります",
"allowInvalidCertificate": "無効な証明書を許可",
"allowInvalidCertificateDesc": "自己署名証明書やIPアドレス証明書を使った信頼できる自己ホストサーバーにのみ使用してください。",
"useEmbedded": "ローカルサーバーを使用",
"embeddedDesc": "組み込みのローカルサーバーでTermixを実行します(リモートサーバー不要)",
"embeddedConnecting": "ローカルサーバーに接続中...",
"embeddedNotReady": "ローカルサーバーの準備ができていません。しばらく待ってからやり直してください。",
"localServer": "ローカルサーバー",
"savedServers": "保存済みサーバー",
"noSavedServers": "保存されたサーバーはありません",
"removeServer": "削除"
},
"migrationNotice": {
"title": "Termix Desktopがスタンドアロンで動作するようになりました",
"body1": "このアプリは以前はTermixサーバーに直接接続していましたが、完全に独立して動作するように改良され、ホスト名と認証情報をローカルに保存することでオフラインでも動作し続けます。セルフホスト型のTermixサーバーとの双方向同期はオプションになりました。",
"body2": "既存のホストと認証情報はまだ {{url}}にあります。リモート同期を有効にして、そのサーバーに再接続すると、それらが復元され、今後両方のサーバーが同期された状態になります。",
"dismiss": "今じゃない",
"setUpSync": "リモート同期の設定"
},
"remoteSync": {
"title": "リモート同期",
"description": "オプションとして、このデスクトップアプリをセルフホスト型のTermixサーバーに接続することで、ホスト、認証情報、およびスニペットをデバイス間で同期できます。アプリは接続の有無に関わらず、常に完全にオフラインで動作します。",
"notConnected": "接続されていません",
"connected": "接続済み",
"connectedTo": "{{url}}に接続しました",
"lastSynced": "最終同期日時 {{time}}",
"neverSynced": "同期されたことはありません",
"syncError": "同期エラー: {{message}}",
"needsReauth": "ログイン期限が切れました",
"connectButton": "サーバーに接続",
"disconnectButton": "切断",
"syncNowButton": "今すぐ同期",
"syncing": "同期中...",
"syncSuccess": "リモート同期が完了しました",
"syncUnavailable": "リモート同期を開始できませんでした",
"serverUrl": "サーバーURL",
"enterServerUrl": "サーバーのURLを入力してください",
"mustIncludeProtocol": "サーバーURLはhttp://またはhttps://で始まる必要があります。",
"connectionTestFailed": "そのURLのTermixサーバーに接続できませんでした",
"allowInvalidCertificate": "無効な証明書を許可する",
"allowInvalidCertificateDesc": "自己署名証明書またはIPアドレス証明書を使用する、信頼できる自己ホスト型サーバーでのみ使用してください。",
"savedServers": "保存済みサーバー",
"removeServer": "取り除く",
"continueButton": "続く",
"cancelButton": "キャンセル",
"signInTitle": "{{url}}にサインインしてください。",
"originTitle": "接続元",
"originDescription": "SSH接続のデフォルトの発信元を選択します。この設定はホストごとに変更できます。",
"originLocal": "このデバイス(ローカルネットワーク)",
"originRemote": "リモートサーバー",
"bannerReconnect": "再接続",
"bannerMessage": "リモート同期には再認証が必要です"
},
"versionCheck": {
"error": "バージョン確認エラー",
"checkFailed": "更新の確認に失敗しました",
"upToDate": "アプリは最新です",
"currentVersion": "バージョン {{version}} を実行中です",
"updateAvailable": "アップデートがあります",
"updateLinkLabel": "アップデートが利用可能です — GitHubのリリースノートをご覧ください",
"newVersionAvailable": "新しいバージョンが利用可能です。現在 {{current}} を使用中ですが、{{latest}} が利用可能です。",
"betaVersion": "ベータ版",
"betaVersionDesc": "{{current}} を実行中です。これは最新安定版 {{latest}} よりも新しいバージョンです。",
"releasedOn": "リリース日: {{date}}",
"downloadUpdate": "アップデートをダウンロード",
"checking": "アップデートを確認中...",
"checkUpdates": "アップデートを確認",
"checkingUpdates": "アップデートを確認中...",
"updateRequired": "アップデートが必要です"
},
"common": {
"close": "閉じる",
"minimize": "最小化",
"online": "オンライン",
"offline": "オフライン",
"unknown": "不明",
"continue": "続行",
"maintenance": "メンテナンス",
"degraded": "低下",
"error": "エラー",
"warning": "警告",
"unsavedChanges": "保存されていない変更があります",
"dismiss": "閉じる",
"more": "もっと",
"loading": "読み込み中...",
"optional": "任意",
"connect": "接続",
"copied": "コピーしました",
"connecting": "接続中...",
"updateAvailable": "アップデートがあります",
"appName": "Termix",
"openInNewTab": "新しいタブで開く",
"noReleases": "リリースはありません",
"updatesAndReleases": "アップデートとリリース",
"newVersionAvailable": "新しいバージョン ({{version}}) が利用可能です。",
"failedToFetchUpdateInfo": "アップデート情報の取得に失敗しました",
"preRelease": "プレリリース",
"noReleasesFound": "リリースが見つかりません。",
"cancel": "キャンセル",
"username": "ユーザー名",
"login": "ログイン",
"logout": "ログアウト",
"register": "登録",
"password": "パスワード",
"confirmPassword": "パスワードの確認",
"back": "戻る",
"save": "保存",
"saving": "保存中...",
"delete": "削除",
"rename": "名前の変更",
"edit": "編集",
"add": "追加",
"confirm": "確認",
"no": "いいえ",
"or": "または",
"next": "次へ",
"previous": "前へ",
"refresh": "更新",
"language": "言語",
"checking": "確認中...",
"checkingDatabase": "データベース接続を確認中...",
"checkingAuthentication": "認証を確認中...",
"backendReconnected": "サーバー接続が復旧しました",
"connectionDegraded": "サーバー接続が切断されました。再接続中…",
"reload": "再読み込み",
"remove": "削除",
"create": "作成",
"update": "更新",
"copy": "コピー",
"copyFailed": "クリップボードへのコピーに失敗しました",
"maximize": "最大化",
"restore": "復元",
"of": "の",
"saved": "保存しました",
"deleted": "削除しました",
"deleteFailed": "削除に失敗しました",
"saveFailed": "保存に失敗しました",
"required": "必須"
},
"onboarding": {
"stepCounter": "ステップ {{current}} / {{total}}",
"skip": "セットアップをスキップ",
"next": "次",
"finish": "さあ始めましょう",
"welcomeTitle": "Termixへようこそ",
"welcomeIntro": "Termixを使えば、サーバーを1か所で管理できます。この設定は約1分で完了し、ここにある設定はすべて変更可能です。",
"welcome_hosts": "サーバーを保存",
"welcome_hosts_desc": "管理しているすべてのマシンを1つのリストにまとめておきましょう。",
"welcome_terminal": "すぐに接続できます",
"welcome_terminal_desc": "ターミナルをタブで開き、別のSSHクライアントは使用しないでください。",
"welcome_files": "ファイルを閲覧および編集する",
"welcome_files_desc": "リモートファイルのアップロード、ダウンロード、編集が可能です。",
"presetTitle": "画面にどれくらい表示させたいですか?",
"presetIntro": "Termixは、シンプルにも詳細にも、お好みに合わせて設定できます。まずは出発点を選んでください。",
"presetChangeLater": "プリセットの切り替えや個々の設定の変更は、後で「設定」の「インターフェース」から行うことができます。",
"appearanceTitle": "あなただけのものにしよう",
"appearanceIntro": "テーマ、アクセントカラー、言語を選択してください。これら3つは後から設定画面で変更できます。",
"featuresTitle": "Termixは他にどんなことをしているのでしょうか?",
"featuresIntro": "保存したサーバーは、ターミナル以外のアプリケーションでも開くことができます。左側のアイコンをクリックすると、以下の機能が利用できます。",
"feature_files": "ファイルマネージャー",
"feature_files_desc": "アプリを離れることなく、SFTP経由でファイルの閲覧、アップロード、ダウンロード、編集が可能です。",
"feature_desktop": "リモートデスクトップ",
"feature_desktop_desc": "RDP、VNC、Telnetのセッションは、SSHと同様にタブで開きます。",
"feature_tunnels": "トンネル",
"feature_tunnels_desc": "公開されていないサービスにアクセスできるように、サーバー経由でポートを転送します。",
"feature_docker": "ドッカー",
"feature_docker_desc": "Dockerを実行している任意のホスト上で、コンテナの表示、ログの読み取り、統計情報の監視が可能です。",
"feature_snippets": "断片",
"feature_snippets_desc": "よく使うコマンドを保存して、ワンクリックでターミナルに送信できます。",
"feature_automations": "自動化",
"feature_automations_desc": "何かが発生した際に自動的に手順を実行し、通知を受け取ります。",
"feature_metrics": "指標とアラート",
"feature_metrics_desc": "CPU、メモリ、ディスクの使用状況を長期的に監視し、異常が発生した際にアラートを受け取ることができます。",
"featuresRailHint": "これらのアイコンが不要な場合は、設定の「ナビゲーション」からサイドバーのアイコンを非表示にできます。",
"workflowTitle": "もっと速く動く",
"workflowIntro": "サーバーが数台ある場合、最も時間を節約できる習慣をいくつかご紹介します。",
"workflow_palette": "コマンドパレット",
"workflow_palette_desc": "入力して任意のサーバーまたはアクションにジャンプします。Shiftキーを2回押すと開きます。",
"workflow_split": "画面分割",
"workflow_split_desc": "作業中にログを確認するために、最大4つのタブを並べて表示できます。",
"workflow_dock": "サイドパネル",
"workflow_dock_desc": "サイドバーのアイコンをミドルクリックまたは右クリックすると、タブとして開くか、右側に固定できます。",
"workflow_workspaces": "ワークスペース",
"workflow_workspaces_desc": "開いているタブのセットを保存し、後でレイアウト全体を再度開くことができます。",
"securityTitle": "ログイン情報を安全に保つ",
"securityIntro": "Termixは認証情報を保存してくれるので、その仕組みを少し確認しておくと良いでしょう。",
"security_credentials": "再利用可能な認証情報",
"security_credentials_desc": "キーまたはパスワードを一度保存すれば、好きなだけ多くのサーバーに紐付けることができます。",
"security_twofa": "二段階認証とパスキー",
"security_twofa_desc": "設定の「セキュリティ」で、アカウントにTOTPまたはパスキーを追加してください。",
"security_identity": "ターミックスID",
"security_identity_desc": "すべてのサーバーに鍵をコピーする代わりに、有効期限の短いSSH証明書を発行する。",
"security_sharing": "共有",
"security_sharing_desc": "パスワードを渡すことなく、他のユーザーにサーバーへのアクセス権を付与する。",
"securityEncryptionNote": "認証情報は保存前に暗号化され、接続に必要な場合にのみ復号化されます。",
"doneTitle": "準備完了です",
"doneHeading": "セットアップ完了",
"doneDesc": "サイドバーからサーバーを選択すると、ターミナルが開いたり、ファイルの閲覧やメトリクスの確認ができます。",
"done_settings": "後で変更する",
"done_settings_desc": "テーマ、レイアウトの密度、表示するアイコンなどはすべて設定画面で変更できます。",
"done_rerun": "もう一度欲しいですか?",
"done_rerun_desc": "設定を開き、「インターフェース」に移動して「セットアップの実行」を選択すると、これらの手順をもう一度実行できます。",
"done_desktop": "デスクトップアプリ",
"done_desktop_desc": "Termixは、Windows、macOS、Linux上でデスクトップアプリとして動作します。",
"done_desktop_link": "デスクトップアプリを入手",
"done_mobile": "モバイルアプリ",
"done_mobile_desc": "iOSとAndroidでサーバーを持ち運びましょう。",
"done_mobile_link": "モバイルアプリを入手",
"done_docs": "完全なドキュメント",
"done_docs_desc": "本書で取り上げていない機能も含め、すべての機能に関するガイドを提供しています。",
"done_docs_link": "ドキュメントを開く",
"done_cli": "コマンドラインツール",
"done_cli_desc": "ターミナルからサーバーを管理し、Termixを独自のスクリプトで使用できます。",
"done_cli_link": "CLIドキュメントを開く",
"aiTitle": "AIアシスタント",
"aiIntro": "TermixにはオプションでAIアシスタントを搭載できます。これは後で設定画面で変更できます。",
"aiEnableTitle": "電源を入れる",
"aiEnableDesc": "設定内容を読み取り、承認した上で変更案を提案するアシスタント機能を追加します。ローカルのOllamaなど、お客様ご自身で手配するプロバイダーが必要です。",
"aiSkipTitle": "オフにしておく",
"aiSkipDesc": "Termixは現状のまま動作します。アシスタントは非表示のままです。",
"aiNote": "プロバイダーを追加してメッセージを送信するまで、データはどこにも送信されません。"
},
"nav": {
"collab": "会議",
"home": "ホーム",
"terminal": "ターミナル",
"localTerminal": "ローカル端末",
"docker": "Docker",
"tunnels": "トンネル",
"fileManager": "ファイルマネージャー",
"serverStats": "ホストメトリクス",
"hostMetrics": "ホストメトリクス",
"admin": "管理",
"termixId": "ID",
"userProfile": "ユーザープロファイル",
"splitScreen": "画面分割",
"confirmClose": "このアクティブセッションを閉じますか?",
"close": "閉じる",
"cancel": "キャンセル",
"sshManager": "SSHマネージャー",
"cannotSplitTab": "このタブは分割できません",
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
"copyPassword": "パスワードをコピー",
"copySudoPassword": "sudoパスワードをコピー",
"passwordCopied": "パスワードをクリップボードにコピーしました",
"noPasswordAvailable": "利用可能なパスワードがありません",
"failedToCopyPassword": "パスワードのコピーに失敗しました",
"refreshTab": "接続をリフレッシュ",
"renameTab": "タブ名を変更",
"openFileManager": "ファイルマネージャーを開く",
"dashboard": "ダッシュボード",
"networkGraph": "ネットワークグラフ",
"tmuxMonitor": "tmuxモニター",
"homepage": "ホームページ",
"quickConnect": "クイック接続",
"sshTools": "SSHツール",
"history": "履歴",
"sessionLogs": "セッションログ",
"openAsTabHint": "タブとして開くには、Ctrlキーを押しながらクリックするか、マウスの中央ボタンをクリックしてください。",
"openAsTab": "タブとして開く",
"openInRightDock": "右側のドックで開く",
"closeRightDock": "右側の桟橋を閉じる",
"toggleRightDock": "右側のドックを切り替える",
"multiPanelHintTitle": "複数のパネルを操作する",
"multiPanelHintBody": "サイドバーを他の用途に使用している間は、このパネルを開いたままにしておきます。移動する方法は2つあります。",
"multiPanelHintTabHow": "Ctrlキーを押しながらレールアイコンをクリックするか、このヘッダーにあるボタンを使用してください。",
"multiPanelHintDockHow": "レールアイコンを右クリックするか、タブバーのパネルアイコンを使用してください。",
"sidebarSettings": "サイドバーの設定...",
"hosts": "ホスト",
"snippets": "スニペット",
"macros": "マクロ",
"fleets": "艦隊",
"automations": "自動化",
"workspaces": "ワークスペース",
"hostManager": "ホストマネージャー",
"credentials": "認証情報",
"portForwarding": "転送",
"sftp": "SFTP",
"connections": "接続",
"alerts": "アラート",
"serial": "シリアル",
"keepSideMenuOpen": "メニューを開いたままにする",
"collapseSideMenu": "メニューを折りたたむ",
"roleAdministrator": "管理者",
"roleUser": "ユーザー",
"ai": "AI"
},
"hosts": {
"hosts": "ホスト",
"noHosts": "SSHホストがありません",
"retry": "再試行",
"refresh": "更新",
"optional": "任意",
"downloadSample": "サンプルをダウンロード",
"failedToDeleteHost": "{{name}}の削除に失敗しました",
"importSkipExisting": "インポート(既存をスキップ)",
"importSSHConfig": "SSH設定からインポート",
"connectionDetails": "接続の詳細",
"ssh": "SSH",
"telnet": "Telnet",
"remoteDesktop": "リモートデスクトップ",
"port": "ポート",
"username": "ユーザー名",
"folder": "フォルダー",
"tags": "タグ",
"pin": "ピン留め",
"addHost": "ホストを追加",
"editHost": "ホストを編集",
"cloneHost": "ホストを複製",
"enableTerminal": "ターミナルを有効にする",
"enableTunnel": "トンネルを有効にする",
"enableFileManager": "ファイルマネージャーを有効にする",
"enableDocker": "Dockerを有効にする",
"defaultPath": "デフォルトパス",
"connection": "接続",
"upload": "アップロード",
"authentication": "認証",
"password": "パスワード",
"passwordSaved": "パスワードが保存されました。変更するには入力してください。",
"key": "鍵",
"credential": "認証情報",
"none": "なし",
"sshPrivateKey": "SSH秘密鍵",
"keyType": "鍵の種類",
"uploadFile": "ファイルをアップロード",
"tabGeneral": "一般",
"tabSsh": "SSH",
"tabTerminal": "ターミナル",
"tabRdp": "RDP",
"tabVnc": "VNC",
"tabTunnels": "トンネル",
"tabDocker": "Docker",
"tabFiles": "ファイル",
"tabStats": "ホストメトリクス",
"tabHostMetrics": "ホストメトリクス",
"tabTelnet": "Telnet",
"tabSharing": "共有",
"tabAuthentication": "認証",
"terminal": "ターミナル",
"tunnel": "トンネル",
"fileManager": "ファイルマネージャー",
"serverStats": "ホストメトリクス",
"status": {
"available": "利用可能",
"reachable": "アクセス可能だが、認証されていない",
"offline": "オフライン",
"monitoringDisabled": "監視が無効になっています",
"label": "状態"
},
"folderRenamed": "フォルダ「{{oldName}}」を「{{newName}}」に正常にリネームしました",
"failedToRenameFolder": "フォルダの名前変更に失敗しました",
"unsavedChangesDescription": "ホストの変更が保存されませんでした。破棄しますか?",
"keepEditing": "編集を続ける",
"discardChanges": "変更を破棄する",
"movedToFolder": "{{count}} 個のホストを \"{{folder}}\" に移動しました",
"editHostTooltip": "ホストを編集",
"statusChecks": "ステータスチェック",
"metricsCollection": "メトリクス収集",
"metricsInterval": "メトリクス収集間隔",
"metricsIntervalDesc": "サーバー統計を収集する頻度 (5秒〜1時間)",
"behavior": "動作",
"themePreview": "テーマプレビュー",
"theme": "テーマ",
"fontFamily": "フォントファミリー",
"fontSize": "フォントサイズ",
"letterSpacing": "文字間隔",
"lineHeight": "行の高さ",
"cursorStyle": "カーソルスタイル",
"cursorBlink": "カーソル点滅",
"scrollbackBuffer": "スクロールバックバッファ",
"bellStyle": "ベルスタイル",
"rightClickSelectsWord": "右クリックで単語選択",
"fastScrollModifier": "高速スクロール修飾キー",
"fastScrollSensitivity": "高速スクロール感度",
"sshAgentForwarding": "SSHエージェント転送",
"backspaceMode": "バックスペースモード",
"startupSnippet": "起動時スニペット",
"selectSnippet": "スニペットを選択",
"forceKeyboardInteractive": "Keyboard-Interactive を強制",
"overrideCredentialUsername": "認証情報のユーザー名を上書き",
"overrideCredentialUsernameDesc": "認証情報のユーザー名の代わりに上記で指定したユーザー名を使用します",
"oidcUsernameHint": "$oidc.preferred_username を使用してOIDCログイン名を置き換えます。",
"tailscaleUsernameHint": "これは、tailnetのSSH ACLでTailscaleのIDが付与されているUnixユーザーである必要があり、必ずしもrootである必要はありません。",
"jumpHostChain": "ジャンプホストチェーン",
"portKnocking": "ポートノッキング",
"addKnock": "ポートを追加",
"addProxyNode": "ノードを追加",
"proxyNode": "プロキシノード",
"proxyType": "プロキシタイプ",
"quickActions": "クイックアクション",
"sudoPasswordAutoFill": "Sudo パスワードの自動入力",
"sudoPassword": "Sudo パスワード",
"keepaliveInterval": "キープアライブ間隔 (ms)",
"moshCommand": "Mosh コマンド",
"environmentVariables": "環境変数",
"addVariable": "変数を追加",
"docker": "Docker",
"copyTerminalUrl": "ターミナル URL をコピー",
"copyFileManagerUrl": "ファイルマネージャー URL をコピー",
"copyRemoteDesktopUrl": "リモートデスクトップ URL をコピー",
"failedToConnect": "コンソールに接続できませんでした",
"connect": "接続",
"disconnect": "切断",
"start": "開始",
"enableStatusCheck": "ステータスチェックを有効にする",
"enableMetrics": "メトリクスを有効にする",
"bulkUpdateFailed": "一括更新に失敗しました",
"selectAll": "すべて選択",
"deselectAll": "すべて選択解除",
"protocols": "プロトコル",
"secureShell": "セキュアシェル",
"virtualNetwork": "仮想ネットワーク",
"unencryptedShell": "暗号化されていないシェル",
"addressIp": "アドレス / IP",
"friendlyName": "表示名",
"macAddress": "MAC アドレス",
"wolBroadcastAddress": "WoL ブロードキャストアドレス",
"wolBroadcastAddressDesc": "Docker/ルーテッドネットワーク用のオプションの直接ブロードキャスト (例: 192.168.1.255)。空のままにすると 255.255.255.255 を使用します。",
"folderAndAdvanced": "フォルダーと詳細設定",
"showAdvancedSettings": "詳細設定を表示する",
"hideAdvancedSettings": "詳細設定を非表示にする",
"privateNotes": "非公開メモ",
"privateNotesPlaceholder": "このサーバーの詳細...",
"pinToTop": "トップに固定",
"pinToTopDesc": "このホストを常にリストの一番上に表示する",
"portKnockingSequence": "ポートノッキングシーケンス",
"addKnockBtn": "ノックを追加",
"noPortKnocking": "ポートノッキングは設定されていません",
"knockPort": "ノックポート",
"protocol": "プロトコル",
"delayAfterMs": "遅延 (ms)",
"useSocks5Proxy": "SOCKS5 プロキシを使用する",
"useSocks5ProxyDesc": "プロキシサーバーを経由して接続します",
"connectionOrigin": "接続元",
"connectionOriginDesc": "このホストの接続元を指定します。デスクトップアプリのグローバルデフォルト設定を上書きします。",
"connectionOriginGuacamoleNote": "RDP、VNC、Telnetは、リモートサーバーを使用します。「このデバイス」を選択した場合は、このマシンがアクセスできるguacdが必要です。guacd URL設定で設定するか、guacdプロキシでホストごとに設定してください。",
"connectionOriginDefault": "デフォルトを使用する",
"connectionOriginLocal": "このデバイス(ローカルネットワーク)",
"connectionOriginRemote": "リモートサーバー",
"proxyHost": "プロキシホスト",
"proxyPort": "プロキシポート",
"proxyUsername": "プロキシユーザー名",
"proxyPassword": "プロキシパスワード",
"proxySingleMode": "単一プロキシ",
"proxyChainMode": "プロキシチェーン",
"you": "自分",
"jumpHostChainLabel": "ジャンプホストチェーン",
"addJumpBtn": "ジャンプを追加",
"noJumpHosts": "ジャンプホストは設定されていません",
"selectAServer": "サーバーを選択...",
"sshPort": "SSH ポート",
"authMethod": "認証方式",
"authenticationMethod": "認証方法",
"authenticationMethodDesc": "TermixがこのSSH接続を認証するために使用する方法を1つ選択してください。他の方法は自動的には試行されません。",
"storedCredential": "保存済み認証情報",
"selectACredential": "認証情報を選択...",
"vaultProfile": "Vault 署名者プロファイル",
"selectAVaultProfile": "Vault プロファイルを選択...",
"vaultProfileHint": "設定は共有プロファイルから取得され、接続時に OIDC で Vault にサインインします。シークレットは保存されません。",
"vaultNewProfile": "新規プロファイル",
"secretRefHint": "シークレットの代わりに1Passwordの参照(op://vault/item/field)を貼り付けることもできます。これは接続時にシークレットソースから取得されます。",
"secretSourcesManage": "秘密情報源の管理",
"secretSourcesTitle": "秘密の情報源",
"secretSourcesDesc": "Termixは、接続時に外部パスワードマネージャーから秘密情報を読み取ります。現在、1Password Connect(セルフホスト型)に対応しています。アクセストークンは、お客様のデータキーで暗号化されて保存されます。",
"secretSourceNew": "新しい情報源",
"secretSourceUrlLabel": "接続サーバーURL",
"secretSourceTokenLabel": "接続アクセストークン",
"secretSourceTokenKeep": "現在のトークンを保持するには空欄のままにしてください。",
"secretSourceSharedLabel": "すべてのユーザーと共有(管理者のみ。ログイン中に解決されます)",
"secretSourceShared": "共有",
"secretSourceTest": "テスト",
"secretSourceTestOk": "接続済み — {{count}} 個の保管庫が表示されています",
"secretSourceTestFailed": "接続テストに失敗しました",
"secretSourceRequired": "名前、サーバーURL、トークンは必須です。",
"secretSourceSaved": "秘密の情報源が保存されました",
"secretSourceDeleted": "秘密情報源を削除",
"vaultManageProfiles": "Vault プロファイルの管理",
"vaultAddrLabel": "Vault アドレス",
"vaultNamespaceLabel": "名前空間",
"vaultOidcMountLabel": "OIDC 認証マウント",
"vaultOidcRoleLabel": "OIDC ロール",
"vaultSshMountLabel": "SSH シークレットマウント",
"vaultSshRoleLabel": "SSH 署名者ロール",
"vaultValidPrincipalsLabel": "有効なプリンシパル",
"vaultKeyTypeLabel": "エフェメラルキータイプ",
"vaultSharedLabel": "すべてのユーザーと共有",
"vaultCreateProfile": "プロファイルを作成",
"vaultProfileCreated": "Vaultプロファイルが作成されました",
"vaultProfileSaved": "Vaultプロファイルが保存されました",
"vaultProfileDeleted": "Vaultプロファイルが削除されました",
"vaultProfileSaveFailed": "Vaultプロファイルの保存に失敗しました",
"vaultProfileDeleteFailed": "Vaultプロファイルの削除に失敗しました",
"vaultSaveProfile": "プロファイルを保存",
"vaultProfileValidationError": "名前、Vaultアドレス、SSH署名ロールは必須です",
"vaultNoProfiles": "まだVaultプロファイルがありません。",
"vaultSharedBadge": "共有",
"keyTypeLabel": "鍵の種類",
"keyTypeAuto": "自動検出",
"keyPasteTab": "貼り付け",
"keyUploadTab": "アップロード",
"keyFileLoaded": "鍵ファイルが読み込まれました",
"keyUploadClick": "クリックして .pem / .key / .ppk をアップロード",
"clearKey": "鍵をクリア",
"keySaved": "SSH鍵が保存されました",
"keyReplaceNotice": "置き換えるには、下に新しい鍵を貼り付けてください",
"keyPassphraseSaved": "パスフレーズが保存されました。変更するには入力してください",
"replaceKey": "鍵を置き換え",
"docsLink": "ドキュメントを表示",
"stepcaLabel": "ステップCA",
"stepcaDesc": "IDプロバイダー経由でサインインし、Step CAにこのホスト用の有効期限の短いSSH証明書を発行させてください。CAのURL、ルートフィンガープリント、およびOIDCプロビジョナーは、管理者が「管理設定」で設定します。",
"authTypeStepca": "ステップCA",
"opksshLabel": "OPKSSH",
"opksshDesc": "パスワードや鍵の代わりに、IDプロバイダーを使用してこのホストにサインインします。サーバーにOPKSSHのセットアップが必要です。",
"warpgateLabel": "Warpgateゲートウェイ",
"warpgateDesc": "このホストはWarpgate SSHプロキシ経由で接続します。認証後、Termixがブラウザベースの承認フローを自動的に処理します。",
"agentLabel": "SSHエージェント",
"agentDesc": "Termixサーバー上で動作しているSSHエージェント(Bitwarden、1Password、gpg-agent、KeeAgent、ssh-agent)を使用して認証します。エージェントはTermixがホストされているマシン上で実行されている必要があります。",
"agentAuthenticationDesc": "この接続を認証するには、SSHエージェントのキーを使用します。SSH_AUTH_SOCKを使用する場合は、ソケットパスを空欄にしてください。",
"agentSocketPathLabel": "エージェントソケットパス",
"agentSocketPathPlaceholder": "SSH_AUTH_SOCKを使用するには空のままにしてください",
"agentSocketPathHint": "SSH_AUTH_SOCK環境変数から自動検出するには空のままにするか、カスタムソケットパスを入力してください(例: /run/user/1000/gnupg/S.gpg-agent.ssh)。",
"agentIdentityLabel": "エージェントID(公開鍵)",
"agentIdentityPlaceholder": "エージェントからのすべてのキーを試す場合は空欄のままにしてください。",
"agentIdentityHint": "エージェントから提供される鍵のみを指定するには、公開鍵(例:ssh-ed25519 AAAA...)を貼り付けてください。エージェントが多数の鍵を保持している場合に、サーバーの MaxAuthTries を超えないようにするために推奨されます。",
"shareSshAuthLabel": "SSH認証を共有する",
"shareSshAuthDesc": "受信者には、このホストのSSH認証情報を暗号化して送信します。受信者の個人認証情報が優先されます。",
"tailscaleDeviceSelect": "Tailscaleデバイスを選択",
"tailscaleDeviceSelectPlaceholder": "デバイスを選択...",
"tailscaleNoApiKey": "Tailscale APIキーが設定されていません。デバイス検出を有効にするには、管理者設定で追加してください。",
"tailscaleDocsLink": "ドキュメントを表示",
"tailscaleLoadingDevices": "デバイスを読み込み中...",
"tailscaleDeviceLoadFailed": "Tailscaleデバイスの読み込みに失敗しました。API URLとネットワーク接続を確認してください。",
"tailscaleNoDevices": "テールネットにデバイスが見つかりません。",
"tailscaleDeviceAutoFill": "デバイスを選択するとホストIPアドレスが自動入力されます。",
"forceKeyboardInteractiveLabel": "キーボードインタラクティブを強制",
"forceKeyboardInteractiveShortDesc": "キーが存在する場合でも手動パスワード入力を強制します",
"allowLegacyAlgorithmsLabel": "レガシーアルゴリズムを許可",
"allowLegacyAlgorithmsDesc": "アップグレードできない古いデバイスへの接続用に、非推奨のSSHアルゴリズム (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) を有効にします。",
"insecure": "安全でない",
"terminalAppearance": "ターミナルの外観",
"colorTheme": "カラーテーマ",
"fontFamilyLabel": "フォントファミリー",
"fontFamilyCustomOption": "カスタム...",
"fontFamilyCustomPlaceholder": "正確なフォント名(例:MesloLGS NF)",
"fontFamilyCustomHint": "同梱のフォントを選択するか、「カスタム」を選択して、システムに既にインストールされているフォントの正確な名前を入力してください(例:MesloLGS NF、Noto Sans Mono)。Termixはフォントをインストールできませんので、まずTermixをOSにインストールしてください。",
"fontSizeLabel": "フォントサイズ",
"cursorStyleLabel": "カーソルスタイル",
"letterSpacingPx": "文字間隔 (px)",
"lineHeightLabel": "行の高さ",
"bellStyleLabel": "ベルスタイル",
"backspaceModeLabel": "バックスペースモード",
"cursorBlinking": "カーソル点滅",
"cursorBlinkingDesc": "ターミナルカーソルの点滅アニメーションを有効にします",
"rightClickSelectsWordLabel": "右クリックで単語選択",
"rightClickSelectsWordShortDesc": "右クリック時にカーソル下の単語を選択します",
"macOptionIsMetaLabel": "Optionキーでメタデータを送信",
"macOptionIsMetaShortDesc": "macOSで特殊文字(@や|など)を入力する際に、Metaを送信する代わりにOption/Altキーを使用するのを無効にする",
"backgroundImageLabel": "背景画像 URL",
"backgroundImageDesc": "ターミナルの背景画像のオプションURL",
"backgroundImageOpacityLabel": "背景画像の不透明度",
"customThemeColors": "カスタムカラー",
"customThemeBackground": "背景",
"customThemeForeground": "前景",
"customThemeCursor": "カーソル",
"customThemeCursorAccent": "カーソルアクセント",
"customThemeSelection": "選択",
"customThemeAnsiColors": "ANSIカラー",
"customThemeBlack": "黒",
"customThemeRed": "赤",
"customThemeGreen": "緑",
"customThemeYellow": "黄",
"customThemeBlue": "ブルー",
"customThemeMagenta": "マゼンタ",
"customThemeCyan": "シアン",
"customThemeWhite": "ホワイト",
"customThemeBrightBlack": "ブライトブラック",
"customThemeBrightRed": "ブライトレッド",
"customThemeBrightGreen": "ブライトグリーン",
"customThemeBrightYellow": "ブライトイエロー",
"customThemeBrightBlue": "ブライトブルー",
"customThemeBrightMagenta": "ブライトマゼンタ",
"customThemeBrightCyan": "ブライトシアン",
"customThemeBrightWhite": "ブライトホワイト",
"customThemeResetTooltip": "デフォルトにリセット",
"savedThemesLabel": "保存済みテーマ",
"saveAsGlobalTheme": "グローバルテーマとして保存",
"saveGlobalThemeNamePrompt": "このテーマの名前を入力してください",
"saveGlobalThemeSuccess": "テーマが保存されました",
"saveGlobalThemeError": "テーマの保存に失敗しました",
"applyGlobalThemeTooltip": "このテーマを適用する",
"deleteGlobalThemeTooltip": "このテーマを削除",
"noSavedThemes": "まだテーマは保存されていません",
"syntaxHighlightingLabel": "シンタックスハイライト",
"syntaxHighlightingDesc": "ターミナル出力に色を付ける(エラー、パス、IP、タイムスタンプ)",
"syntaxHighlightingCategories": "ハイライトカテゴリ",
"syntaxHighlightingCategoriesDesc": "色を付けるコンテンツの種類を選択",
"syntaxCategoryLogLevels": "ログレベル",
"syntaxCategoryLogLevelsDesc": "error, warn, info, debug, fatal",
"syntaxCategoryPaths": "ファイルパス",
"syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt",
"syntaxCategoryTimestamps": "タイムスタンプ",
"syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15",
"syntaxCategoryIpAddresses": "IPアドレス",
"syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080",
"syntaxCategoryUrls": "URL",
"syntaxCategoryUrlsDesc": "https://example.com",
"syntaxCategoryNumbers": "ラベル付き数値",
"syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404",
"behaviorAndAdvanced": "動作と詳細設定",
"scrollbackBufferLabel": "スクロールバッファ",
"scrollbackMaxLines": "履歴に保持する最大行数",
"sshAgentForwardingLabel": "SSHエージェント転送",
"sshAgentForwardingShortDesc": "このリモートホストが、接続の転送にローカルのSSHエージェントを使用することを許可します。これはエージェント認証には必須ではありません。",
"useSSHTitleLabel": "SSHウィンドウタイトルを使用する",
"useSSHTitleDesc": "タブのタイトルをホスト名ではなくシェルのウィンドウタイトルから更新する",
"enableAutoMosh": "Auto-Mosh を有効にする",
"enableAutoMoshDesc": "利用可能な場合、SSH よりも Mosh を優先します",
"enableAutoTmux": "Auto-Tmux を有効にする",
"enableAutoTmuxDesc": "tmux内で実行することで、接続切断やブラウザの再起動後もシェルとその中で実行されているすべての処理を正常に実行状態に保つことができます(ホストにtmuxがインストールされている必要があります)。",
"enableSessionLogging": "セッションログ",
"enableSessionLoggingDesc": "後で確認できるようにターミナルセッションの出力を記録します",
"allowSessionSharing": "セッション共有を許可する",
"allowSessionSharingDesc": "このホスト上のライブセッションをリンクまたは他のユーザーと共有できるようにします。",
"enableCommandHistory": "コマンド履歴",
"enableCommandHistoryDesc": "このターミナルで実行されたコマンドを履歴とオートコンプリート用に記録します",
"localEchoLabel": "ローカルエコー",
"localEchoDesc": "低速回線でも、印刷可能な安全なキー入力をローカルで予測します。パスワード入力や制御入力はエコーバックされません。",
"localEchoDefault": "グローバル設定を使用する",
"localEchoOff": "オフ",
"localEchoAuto": "自動",
"localEchoOn": "常時接続",
"linkClickBehaviorLabel": "リンククリック時の動作",
"linkClickBehaviorDesc": "ターミナル内のリンクをクリックしたときの動作を制御します。「デフォルト」を選択することで、アプリ全体の設定に従います。",
"linkClickBehaviorDefault": "デフォルト(アプリ設定に従う)",
"linkClickBehaviorConfirm": "開くまたはコピーするポップアップを表示",
"linkClickBehaviorDirect": "直接開く",
"sudoPasswordAutoFillLabel": "sudo パスワードの自動入力",
"sudoPasswordAutoFillShortDesc": "プロンプトが表示されたときに自動的にsudo パスワードを入力します",
"sudoPasswordAutoFillDesc": "sudo パスワードを保存して、ホストメトリクス、ターミナルプロンプトなどが自動的に特権コマンドを実行できるようにします",
"sudoPasswordLabel": "sudo パスワード",
"sudoPasswordSaved": "パスワードが保存されました。変更するには入力してください。",
"environmentVariablesLabel": "環境変数",
"addVariableBtn": "変数を追加",
"noEnvVars": "環境変数が設定されていません",
"fastScrollModifierLabel": "高速スクロールの修飾キー",
"fastScrollSensitivityLabel": "高速スクロールの感度",
"moshCommandLabel": "Mosh コマンド",
"startupSnippetLabel": "起動時スニペット",
"keepaliveIntervalLabel": "キープアライブ間隔(秒)",
"maxKeepaliveMisses": "最大キープアライブミス回数",
"tunnelSettings": "トンネル設定",
"enableTunneling": "トンネリングを有効にする",
"enableTunnelingDesc": "このホストのSSHトンネル機能を有効にします",
"serverTunnelsSection": "サーバートンネル",
"addTunnelBtn": "トンネルを追加",
"noTunnelsConfigured": "トンネルが設定されていません",
"tunnelLabel": "トンネル {{number}}",
"tunnelType": "トンネルの種類",
"tunnelModeLocalDesc": "ローカルポートをリモートサーバー(またはそこから到達可能なホスト)のポートに転送します。",
"tunnelModeRemoteDesc": "リモートサーバーのポートをローカルマシンのポートに転送します。",
"tunnelModeDynamicDesc": "動的ポート転送用にローカルポートにSOCKS5プロキシを作成します。",
"sameHost": "このホスト(直接トンネル)",
"endpointHost": "エンドポイントホスト",
"endpointHostPlaceholder": "同じホスト、SSHホスト、または到達可能なホスト/IP",
"endpointPort": "エンドポイントポート",
"bindHost": "バインドホスト",
"sourcePort": "ソースポート",
"maxRetries": "最大再試行回数",
"retryIntervalS": "再試行間隔(秒)",
"autoStartLabel": "自動起動",
"autoStartDesc": "ホスト読み込み時にこのトンネルを自動接続します。",
"tunnelConnecting": "トンネル接続中...",
"tunnelDisconnected": "トンネル切断",
"failedToConnectTunnel": "接続に失敗しました",
"failedToDisconnectTunnel": "切断に失敗しました",
"dockerIntegration": "Docker統合",
"enableDockerMonitor": "Docker有効化",
"enableDockerMonitorDesc": "Docker経由でこのホスト上のコンテナを監視・管理します。",
"containerRuntime": "コンテナランタイム",
"containerRuntimeDesc": "このホストのコンテナ管理に使用するCLIを選択します。",
"containerRuntimeDocker": "Docker",
"containerRuntimePodman": "Podman",
"enableTmuxMonitor": "Tmuxモニターを有効にする",
"enableTmuxMonitorDesc": "Tmuxモニターにこのホストを表示し、tmuxアクションをサイドバーに追加します。",
"enableTerminalToolbar": "ターミナルツールバーを有効にする",
"enableTerminalToolbarDesc": "このホストのツールとリアルタイム統計情報に素早くアクセスできるツールバーを、アクティブなターミナルにドッキングして表示します。",
"connectionToolbar": "接続ツールバー",
"showConnectionToolbar": "接続ツールバーを表示する",
"showConnectionToolbarDesc": "このホストのSSH、RDP、VNC、およびTelnetセッションでツールバーを表示します。ツールバー自体から一時的に非表示にすることもできます。",
"enableAiAssistant": "AIアシスタントを有効にする",
"enableAiAssistantDesc": "このホストのターミナルでAIアシスタントによる支援を許可します。デフォルトでは無効になっており、アカウントでAIを有効にする必要があります。",
"tabProxmox": "Proxmox",
"proxmoxIntegration": "Proxmox統合",
"enableProxmox": "Proxmoxを有効にする",
"enableProxmoxDesc": "このホストをProxmoxノードとしてマークします。ゲストの検出とインポートをこのホストから直接行えるようにします。",
"proxmoxDefaultAuthType": "デフォルト認証タイプ",
"proxmoxDefaultAuthTypeDesc": "インポートされたゲストホストに適用される認証方式です。ゲストへの接続方法に合わせて認証タイプを選択してください。",
"authTypePassword": "パスワード",
"authTypeKey": "SSH鍵",
"authTypeCredential": "クレデンシャル",
"authTypeOpkssh": "OPKSSH",
"authTypeNone": "なし",
"proxmoxDefaultCredential": "デフォルト認証情報",
"proxmoxDefaultCredentialDesc": "認証タイプが「Credential」に設定されている場合に、インポートされたゲストホストに使用される認証情報。",
"proxmoxWindowsDetection": "Windows / RDP 検出",
"proxmoxWindowsDetectionDesc": "SSH の代わりに RDP をトリガーする、カンマ区切りの名前パターン(大文字と小文字を区別しない)",
"proxmoxDockerDetection": "Docker 検出",
"proxmoxDockerDetectionDesc": "一致するゲストに対して Docker を有効にする、カンマ区切りの名前パターン",
"proxmoxPreferredRanges": "優先 IP 範囲",
"proxmoxPreferredRangesDesc": "ゲストが複数のインターフェースを持つ場合の IP 選択の優先順位で指定する、カンマ区切りのプレフィックス",
"proxmoxAutoSync": "ゲストの自動同期",
"proxmoxAutoSyncDesc": "セッションがロックされていないときに、この Proxmox ノードを定期的に検出し、インポートされたゲストホストを作成または更新します。",
"proxmoxSyncInterval": "同期間隔(分)",
"proxmoxSyncIntervalDesc": "最小 5 分。スケジューラーはロックされたユーザーセッションをスキップします。",
"proxmoxMarkMissing": "欠落ゲストをマーク",
"proxmoxMarkMissingDesc": "以前にインポートされたゲストが消えたときに、削除する代わりに proxmox-missing タグを追加します。",
"proxmoxLastSync": "最終同期",
"proxmoxLastSyncNever": "未同期",
"proxmoxLastSyncNoResult": "結果の詳細なし",
"proxmoxLastSyncSummary": "{{created}} 作成、{{updated}} 更新、{{markedMissing}} 欠落、{{skipped}} スキップ",
"proxmoxLastSyncStatus": {
"success": "成功",
"error": "失敗",
"pending": "保留中"
},
"proxmoxDiscoverAction": "Proxmox ゲストの検出とインポート",
"proxmoxImportTitle": "Proxmox からインポート",
"proxmoxSelectHost": "Proxmox ホストを選択…",
"proxmoxDiscover": "検出",
"proxmoxDiscovering": "検出中…",
"proxmoxDiscoverGuests": "ゲストを検出",
"proxmoxGuestsSelected_one": "{{count}} ゲスト — {{selected}} 選択中",
"proxmoxGuestsSelected_other": "{{count}} ゲスト — {{selected}} 選択中",
"proxmoxSelectAll": "すべて選択",
"proxmoxDeselectAll": "すべて選択解除",
"proxmoxNoGuests": "この Proxmox ノードにゲストが見つかりません。",
"proxmoxImportButton_one": "{{count}} ホストをインポート",
"proxmoxImportButton_other": "{{count}} 台のホストをインポート",
"proxmoxResultImported": "{{count}} インポート済み",
"proxmoxResultUpdated": "{{count}} 更新済み",
"proxmoxResultFailed": "{{count}} 失敗",
"proxmoxResultSkippedNoIp": "{{count}} スキップしました(IPアドレスが見つかりませんでした)",
"proxmoxImportComplete": "Proxmox インポート完了: {{summary}}",
"proxmoxDiscoveryFailed": "検出に失敗しました",
"proxmoxImportFailed": "インポートに失敗しました",
"enableProxmoxStats": "Proxmox Statsを有効にする",
"enableProxmoxStatsDesc": "SSH経由で収集された、このホストのリアルタイムのノード、ゲスト、ストレージ、およびクラスタの統計情報を表示するProxmox統計タブを表示します。",
"proxmoxStatsPollInterval": "ポーリング間隔(秒)",
"proxmoxStatsPollIntervalDesc": "最低15秒。Proxmoxノードの統計情報を更新する頻度。",
"proxmoxStatsNodeOverride": "ノード名の上書き",
"proxmoxStatsNodeOverrideDesc": "Proxmoxノード名の自動検出(デフォルトではホスト名で検出)を上書きします。",
"proxmoxStatsNodeOverridePlaceholder": "ホスト名から自動検出",
"proxmoxStatsUrlCopied": "Proxmox Stats URL がクリップボードにコピーされました",
"copyProxmoxStatsUrlAction": "Proxmox統計情報のURLをコピーする",
"enableFileManagerMonitor": "ファイルマネージャーを有効にする",
"enableFileManagerMonitorDesc": "このホストのファイルを SFTP で閲覧・管理します",
"scpLegacyLabel": "SCP レガシーモード",
"scpLegacyDesc": "SFTP サブシステムをサポートしないサーバー(組み込みや最小構成の SSH サーバーなど)に対してレガシーファイル転送を使用します",
"defaultPathLabel": "デフォルトパス",
"fileManagerPathHint": "このホストのファイルマネージャー起動時に開くディレクトリ",
"statusChecksLabel": "ステータスチェック",
"enableStatusChecks": "ステータスチェックを有効にする",
"enableStatusChecksDesc": "定期的にこのホストに ping を送信して可用性を確認します",
"useGlobalInterval": "グローバル間隔を使用する",
"useGlobalIntervalDesc": "サーバー全体のステータスチェック間隔で上書きします",
"checkIntervalS": "チェック間隔 (秒)",
"checkIntervalDesc": "接続確認 ping の間隔 (秒)",
"metricsCollectionLabel": "メトリクス収集",
"enableMetricsLabel": "メトリクスを有効にする",
"enableMetricsDesc": "このホストから CPU、RAM、ディスクなどのメトリクスを収集します",
"useGlobalMetrics": "グローバル間隔を使用する",
"useGlobalMetricsDesc": "サーバー全体のメトリクス収集間隔で上書きします",
"metricsIntervalS": "メトリクス間隔 (秒)",
"metricsIntervalDesc2": "メトリクススナップショットの間隔 (秒)",
"excludedMountsLabel": "除外されるマウント",
"monitoredMountsLabel": "カスタム監視パス",
"monitoredMountsDesc": "/config などのバインドマウントされた Home Assistant パスを含め、個別のマウントとして公開されていないパスを追加します。",
"monitoredMountPathPlaceholder": "パス(/config、/mnt/data)",
"monitoredMountLabelPlaceholder": "ラベル(任意)",
"addMonitoredMount": "パスを追加",
"excludedMountsDesc": "このホストのディスク使用量とアラートから、特定のマウントポイントまたはファイルシステムの種類(例:NFS、CIFS)を非表示にします。",
"excludedMountsPlaceholder": "マウントパス(/mnt/nas)またはファイルシステムの種類(nfs、cifs)",
"excludedMountsEmpty": "マウントポイントは除外されません。検出されたすべてのファイルシステムが表示されます。",
"addExcludedMount": "追加",
"visibleWidgets": "表示するウィジェット",
"widgetsMovedToHostMetrics": "カードは、ホストメトリクスタブで直接追加、配置、サイズ変更できるようになりました。このホストのホストメトリクスを開き、カスタマイズを使用して表示するカードを選択してください。",
"cpuUsageLabel": "CPU 使用率",
"cpuUsageDesc": "CPU 使用率、ロードアベレージ、スパークライングラフ",
"memoryLabel": "メモリ使用率",
"memoryDesc": "RAM 使用率、スワップ、キャッシュ",
"storageLabel": "ディスク使用率",
"storageDesc": "マウントポイントごとのディスク使用率",
"networkLabel": "ネットワークインターフェース",
"networkDesc": "インターフェース一覧と帯域幅",
"uptimeLabel": "アップタイム",
"uptimeDesc": "システム稼働時間と起動時刻",
"systemInfoLabel": "システム情報",
"systemInfoDesc": "OS、カーネル、ホスト名、アーキテクチャ",
"recentLoginsLabel": "最近のログイン",
"recentLoginsDesc": "成功/失敗ログインイベント",
"topProcessesLabel": "トッププロセス",
"topProcessesDesc": "PID、CPU使用率、メモリ使用率、コマンド",
"listeningPortsLabel": "リスニングポート",
"listeningPortsDesc": "プロセスと状態を含むオープンポート",
"firewallLabel": "ファイアウォール",
"firewallDesc": "ファイアウォール、AppArmor、SELinuxの状態",
"quickActionsLabel": "クイックアクション",
"quickActionsToolbar": "クイックアクションはホストメトリクスツールバーにボタンとして表示され、ワンクリックでコマンドを実行できます。",
"noQuickActions": "クイックアクションはまだありません",
"buttonLabel": "ボタンラベル",
"selectSnippetPlaceholder": "スニペットを選択...",
"addActionBtn": "アクションを追加",
"hostSharedSuccessfully": "ホストの共有に成功しました",
"failedToShareHost": "ホストの共有に失敗しました",
"accessRevoked": "アクセスが取り消されました",
"failedToRevokeAccess": "アクセスの取り消しに失敗しました",
"cancelBtn": "キャンセル",
"savingBtn": "保存中...",
"addHostBtn": "ホストを追加",
"hostUpdated": "ホストが更新されました",
"hostCreated": "ホストが作成されました",
"failedToSave": "ホストの保存に失敗しました",
"credentialUpdated": "認証情報が更新されました",
"credentialCreated": "認証情報が作成されました",
"failedToSaveCredential": "認証情報の保存に失敗しました",
"credentialNameRequired": "認証情報の名前を入力してください",
"credentialAuthRequired": "パスワード、SSHキー、またはその両方を追加してください",
"createCredentialFromHostBtn": "認証情報を作成する",
"createCredentialFromHostTitle": "ホストから認証情報を作成する",
"createCredentialFromHostDesc": "このホストの現在のユーザー名、パスワード、および/またはSSHキーがあらかじめ入力された、再利用可能で共有可能な認証情報エントリを作成します。",
"backToHosts": "ホストに戻る",
"pinned": "ピン留め",
"noHostsFound": "ホストが見つかりません",
"tryDifferentTerm": "別の語句で試してください",
"addFirstHost": "最初のホストを追加して開始しましょう",
"noCredentialsFound": "認証情報が見つかりません",
"addCredentialBtn": "認証情報を追加",
"updateCredentialBtn": "認証情報を更新",
"editCredentialAction": "認証情報を編集する",
"backToHost": "ホストに戻る",
"saveCredentialAsNewBtn": "新規として保存",
"saveCredentialAsNewDesc": "これらの変更を加えた新しい認証情報を作成し、このホストに割り当てます。元の認証情報は変更されません。",
"credentialSavedAsNew": "新しい認証情報として保存されました",
"failedToSaveCredentialAsNew": "新しい認証情報として保存できませんでした",
"features": "機能",
"noFolder": "(フォルダなし)",
"deleteSelected": "削除",
"exitSelection": "選択解除",
"importSkip": "インポート (既存をスキップ)",
"importOverwrite": "インポート (上書き)",
"collapseBtn": "折りたたむ",
"importExportBtn": "インポート / エクスポート",
"hostStatusesRefreshed": "ホストの状態が更新されました",
"failedToRefreshHosts": "ホストの更新に失敗しました",
"movedHostTo": "{{host}} を \"{{folder}}\" に移動しました",
"failedToMoveHost": "ホストの移動に失敗しました",
"deletedFolder": "フォルダ \"{{name}}\" を削除しました",
"failedToDeleteFolder": "フォルダの削除に失敗しました",
"deleteAllInFolder": "\"{{name}}\" 内の全ホストを削除しますか? この操作は元に戻せません。",
"folderPickerPlaceholder": "フォルダなし",
"folderPickerSearch": "検索または作成 (サブフォルダには / を使用)...",
"folderPickerNone": "フォルダなし",
"folderPickerCreate": "\"{{path}}\" を作成",
"folderPickerEmpty": "一致するフォルダがありません",
"parentHost": "親ホスト",
"useFolderInstead": "代わりにフォルダーを使用してください",
"useParentHostInstead": "親ホストを使用する",
"parentHostPickerPlaceholder": "親ホストなし",
"parentHostPickerSearch": "ホストを検索...",
"parentHostPickerNone": "親ホストなし",
"parentHostPickerEmpty": "一致するホストはありません",
"collapseSubHosts": "サブホストを折りたたむ",
"expandSubHosts": "サブホストを展開する",
"cannotNestUnderDescendant": "ホストを自身のサブホストの下にネストすることはできません",
"movedToParent": "{{count}} ホストを \"{{parent}} \" の下に移動しました",
"newFolder": "新規フォルダ",
"createFolderTitle": "フォルダの作成",
"editFolderTitle": "フォルダの編集",
"folderDialogDescription": "名前、色、アイコンを選択してください。フォルダを入れ子にするには / を使用します。",
"folderNameLabel": "フォルダ名",
"folderNamePlaceholder": "例: Production/Web",
"folderNestingHint": "/ で区切ってネストフォルダーを作成します",
"folderNameDuplicate": "この名前のフォルダは既にここに存在します。",
"folderColor": "色",
"folderIcon": "アイコン",
"folderCredential": "資格証明書",
"folderCredentialNone": "認証情報が割り当てられていません",
"folderCredentialHint": "このフォルダ内のホストで、独自の認証情報を選択せずに「保存済み認証情報」認証を使用する場合は、この認証情報が継承されます。",
"folderPreview": "プレビュー",
"folderNameFallback": "無題のフォルダー",
"createFolderButton": "フォルダーを作成",
"saveFolderButton": "フォルダーを保存",
"cancel": "キャンセル",
"iconSearchPlaceholder": "アイコンを検索...",
"openAllSessions": "すべてのセッションを開く",
"editFolder": "フォルダーを編集",
"deleteFolder": "フォルダーを削除",
"selectFolder": "フォルダ内のすべてのホストを選択します",
"deselectFolder": "フォルダ内のすべてのホストの選択を解除します",
"folderSaved": "フォルダーを保存しました",
"failedToSaveFolder": "フォルダーの保存に失敗しました",
"folderDeleted": "フォルダー \"{{name}}\" を削除しました",
"deleteFolderConfirm": "フォルダー \"{{name}}\" とその {{count}} 件のホストを削除しますか? この操作は元に戻せません。",
"failedToMoveHosts": "ホストの移動に失敗しました",
"failedToReorder": "再注文に失敗しました",
"expandAll": "すべてのフォルダーを展開",
"collapseAll": "すべてのフォルダーを折りたたむ",
"moreActions": "その他",
"groupBy": "グループ化",
"GroupByFolder": "フォルダー",
"GroupByTag": "タグ",
"GroupByStatus": "ステータス",
"GroupByProtocol": "プロトコル",
"GroupByAuth": "認証タイプ",
"groupUngrouped": "グループなし",
"customizeSidebar": "サイドバーをカスタマイズする",
"customizeSidebarDescription": "ホストリストの表示方法と動作方法を選択します。",
"customizeDensityTitle": "密度",
"customizeBehaviorTitle": "行動",
"customizeSortHint": "並べ替え順序とグループ化は、ツールバーの並べ替えメニューとグループ化メニューで設定できます。",
"densityComfortableDesc": "ホストごとの詳細情報:アドレス、タグ、リソース使用量。",
"densityCompactDesc": "リストが長い場合は、ホストごとに1行ずつ記入してください。",
"display": "画面",
"displayDensity": "密度",
"displayDensityComfortable": "快適",
"displayDensityCompact": "コンパクト",
"displayShowTags": "タグを表示",
"displayTrayOnClick": "クリック時にアクションを開く(ホバー時ではなく)",
"actionsVisibility": "ホストアクションの表示",
"actionsVisibilityDesc": "ホストアクションを展開するタイミングを選択します。クリックを選択すると、以前のクリックして展開する動作に戻ります。",
"actionsAlways": "常に見える",
"actionsOnly": "接続のみ、クリックで終了",
"actionsHover": "マウスオーバー時に表示",
"actionsClick": "クリックして展開/折りたたみ",
"openOnDoubleClick": "ダブルクリックで開く",
"openOnDoubleClickDesc": "ホストセッションを開く際に、シングルクリックではなくダブルクリックを要求する。",
"deletedHost": "{{name}} を削除しました",
"copiedToClipboard": "クリップボードにコピーしました",
"terminalUrlCopied": "ターミナルURLをコピーしました",
"fileManagerUrlCopied": "ファイルマネージャーURLをコピーしました",
"tunnelUrlCopied": "トンネルURLをコピーしました",
"dockerUrlCopied": "Docker URLをコピーしました",
"hostMetricsUrlCopied": "ホストメトリクスURLをコピーしました",
"tmuxMonitorUrlCopied": "Tmux Monitor URL をコピーしました",
"rdpUrlCopied": "RDP URL をコピーしました",
"openNativeRdp": "Windowsリモートデスクトップで開く",
"nativeRdpOpened": "Windowsリモートデスクトップで開きました",
"nativeRdpFailed": "Windowsリモートデスクトップを開くことができませんでした",
"vncUrlCopied": "VNC URL をコピーしました",
"telnetUrlCopied": "Telnet URL をコピーしました",
"remoteDesktopUrlCopied": "リモートデスクトップ URL をコピーしました",
"expandActions": "アクションを展開",
"collapseActions": "アクションを折りたたむ",
"wakeOnLanAction": "Wake on LAN",
"wakeOnLanSuccess": "{{name}} にマジックパケットを送信しました",
"wakeOnLanError": "マジックパケットの送信に失敗しました",
"cloneHostAction": "ホストを複製",
"copyAddress": "アドレスをコピー",
"copyLink": "リンクをコピー",
"copyTerminalUrlAction": "ターミナル URL をコピー",
"copyFileManagerUrlAction": "ファイルマネージャー URL をコピー",
"copyTunnelUrlAction": "トンネル URL をコピー",
"copyDockerUrlAction": "Docker URL をコピー",
"copyHostMetricsUrlAction": "ホストメトリクス URL をコピー",
"copyTmuxMonitorUrlAction": "Tmux Monitor URL をコピー",
"copyRdpUrlAction": "RDP URL をコピー",
"copyVncUrlAction": "VNC URL をコピー",
"copyTelnetUrlAction": "Telnet URL をコピー",
"copyRemoteDesktopUrlAction": "リモートデスクトップ URL をコピー",
"deleteCredentialConfirm": "認証情報 \"{{name}}\" を削除しますか?",
"deletedCredential": "{{name}} を削除しました",
"deleteHostsConfirm": "{{count}} 台のホスト{{plural}}を削除しますか?元に戻せません。",
"movedToRoot": "ルートに移動しました",
"enableTerminalFeature": "ターミナルを有効化",
"disableTerminalFeature": "ターミナルを無効化",
"enableFilesFeature": "ファイルを有効化",
"disableFilesFeature": "ファイルを無効化",
"enableTunnelsFeature": "トンネルを有効化",
"disableTunnelsFeature": "トンネルを無効化",
"enableDockerFeature": "Dockerを有効化",
"disableDockerFeature": "Dockerを無効化",
"enableProxmoxFeature": "Proxmoxを有効化",
"disableProxmoxFeature": "Proxmoxを無効化",
"addTagsPlaceholder": "タグを追加...",
"authDetails": "認証の詳細",
"credType": "タイプ",
"generateKeyPairDesc": "新しい鍵ペアを生成します。秘密鍵と公開鍵の両方が自動的に入力されます。",
"generatingKey": "生成中...",
"generateLabel": "{{label}}を生成",
"uploadFileBtn": "ファイルをアップロード",
"keyPassphraseOptional": "鍵パスフレーズ (オプション)",
"sshPublicKeyOptional": "SSH公開鍵 (オプション)",
"publicKeyGenerated": "公開鍵が生成されました",
"failedToGeneratePublicKey": "公開鍵の導出に失敗しました",
"publicKeyCopied": "公開鍵がコピーされました",
"keyPairGenerated": "{{label}}鍵ペアが生成されました",
"failedToGenerateKeyPair": "鍵ペアの生成に失敗しました",
"searchHostsPlaceholder": "ホスト、アドレス、タグを検索…",
"refreshBtn": "更新",
"addTag": "タグを追加...",
"deleteConfirmBtn": "削除",
"tunnelRequirementsText": "SSHサーバーの/etc/ssh/sshd_configに、GatewayPorts yes、AllowTcpForwarding yes、PermitRootLogin yesが設定されている必要があります。",
"deleteHostConfirm": "\"{{name}}\"を削除しますか?",
"enableAtLeastOneProtocol": "認証と接続の設定を行うには、上記のプロトコルを少なくとも1つ有効にしてください。",
"keyPassphrase": "鍵パスフレーズ",
"connectBtn": "接続",
"disconnectBtn": "切断",
"basicInformation": "基本情報",
"authDetailsSection": "認証の詳細",
"credTypeLabel": "タイプ",
"hostsTab": "ホスト",
"credentialsTab": "認証情報",
"selectMultiple": "複数選択",
"selectHosts": "ホストを選択",
"connectionLabel": "接続",
"authenticationLabel": "認証",
"generateKeyPairTitle": "キーペアを生成",
"generateKeyPairDescription": "新しいキーペアを生成します。秘密鍵と公開鍵が自動的に入力されます。",
"generateFromPrivateKey": "秘密鍵から生成",
"refreshBtn2": "更新",
"exitSelectionTitle": "選択を終了",
"addHostBtn2": "ホストを追加",
"addCredentialBtn2": "認証情報を追加",
"checkingHostStatuses": "ホストの状態を確認しています...",
"pinnedSection": "ピン留め",
"hostsExported": "ホストを正常にエクスポートしました",
"export": {
"menuItem": "輸出...",
"title": "エクスポートホスト",
"scope": "範囲",
"scopeAll": "全て",
"scopeSelected": "選ばれた",
"searchHosts": "ホストを検索...",
"include": "含む",
"groupConnection": "繋がり",
"groupCredentials": "資格",
"groupNotes": "注記",
"groupTags": "タグとピン",
"groupTunnels": "トンネル",
"groupJumpHosts": "ジャンプホスト",
"groupQuickActions": "クイックアクション",
"groupFeatureFlags": "機能フラグ",
"groupAdvanced": "詳細設定",
"preview": "プレビュー",
"moreHosts": "... {{count}} その他のホスト",
"summary": "{{selected}} の {{total}} ホスト",
"credentialsIncluded": "認証情報が含まれています",
"credentialsExcluded": "認証情報は除外されています",
"noneSelected": "ホストは選択されていません",
"cancel": "キャンセル",
"confirm": "輸出",
"fetchFailed": "エクスポート用のホストの読み込みに失敗しました",
"bulkButton": "輸出"
},
"sampleDownloaded": "サンプルファイルをダウンロードしました",
"failedToDeleteCredential2": "認証情報の削除に失敗しました",
"noFolderOption": "(フォルダーなし)",
"nSelected": "{{count}} 件選択中",
"featuresMenu": "機能",
"moveMenu": "移動",
"connectSelected": "接続",
"cancelSelection": "キャンセル",
"deletedCount": "{{count}} 件のホストを削除しました",
"failedToDeleteCount": "{{count}} 件のホストの削除に失敗しました",
"duplicatedHost": "\"{{name}}\" を複製しました",
"failedToDuplicateHost": "ホストの複製に失敗しました",
"updatedCount": "{{count}} ホストを更新しました",
"friendlyNameLabel": "表示名",
"descriptionLabel": "説明",
"loadingHost": "ホストを読み込み中...",
"loadingHosts": "ホストを読み込み中...",
"loadingCredentials": "資格情報を読み込み中...",
"noHostsYet": "ホストがまだありません",
"noHostsYetHint": "サーバーを追加して、ターミナルを開いたり、ファイルを参照したり、メトリクスを確認したりできるようにします。",
"noHostsMatchSearch": "検索に一致するホストはありません",
"hostNotFound": "ホストが見つかりません",
"searchHosts": "ホストを検索...",
"sortHosts": "ホストの並べ替え",
"sortDefault": "デフォルトの順序",
"sortNameAsc": "名前 (A → Z)",
"sortNameDesc": "名前 (Z → A)",
"sortIpAsc": "IPアドレス (昇順)",
"sortIpDesc": "IPアドレス (降順)",
"sortOnlineFirst": "オンラインを先頭に",
"sortOfflineFirst": "オフラインを先頭に",
"sortManual": "手動(ドラッグして並べ替え)",
"sortPinnedFirst": "ピン留めを先頭に",
"filterHosts": "ホストの絞り込み",
"filterClearAll": "すべてのフィルターをクリア",
"filterStatusGroup": "状態",
"filterOnline": "オンライン",
"filterOffline": "オフライン",
"filterPinned": "ピン留め",
"filterAuthGroup": "認証タイプ",
"filterAuthPassword": "パスワード",
"filterAuthKey": "SSHキー",
"filterAuthCredential": "資格情報",
"filterAuthNone": "なし",
"filterAuthOpkssh": "OPKSSH",
"filterAuthStepca": "ステップCA",
"filterProtocolGroup": "プロトコル",
"filterProtocolSsh": "SSH",
"filterProtocolRdp": "RDP",
"filterProtocolVnc": "VNC",
"filterProtocolTelnet": "Telnet",
"filterFeaturesGroup": "機能",
"filterFeatureTerminal": "ターミナル",
"filterFeatureFileManager": "ファイルマネージャー",
"filterFeatureTunnel": "トンネル",
"filterFeatureDocker": "Docker",
"filterTagsGroup": "タグ",
"connectRdp": "RDP",
"connectVnc": "VNC",
"connectTelnet": "Telnet",
"editHostAction": "ホストを編集",
"moreOptions": "その他のオプション",
"shareHost": "ホストを共有",
"shareHostTitle": "共有: {{name}}",
"shareFolder": "フォルダを共有する",
"shareFolderTitle": "共有フォルダ: {{name}}",
"folderSharedSuccessfully": "フォルダー内の共有ホスト {{count}} 個",
"failedToShareFolder": "フォルダの共有に失敗しました",
"sharing": {
"loadError": "共有データの読み込みに失敗しました。もう一度お試しください。",
"shareWithSection": "共有相手",
"usersTab": "ユーザー",
"rolesTab": "ロール",
"searchPlaceholder": "ユーザーまたはロールを検索...",
"noMatches": "一致する結果がありません",
"permissionLevelLabel": "権限レベル",
"levels": {
"connect": {
"label": "接続",
"description": "セッションのみ開く: ターミナル、リモートデスクトップ、ファイルマネージャー、トンネル、Docker。ホスト設定へのアクセスはありません。"
},
"view": {
"label": "表示",
"description": "接続に加え、ホスト設定を表示できます。シークレットは表示されません。"
},
"edit": {
"label": "編集",
"description": "認証不要のホスト設定を表示および変更できます。所有者のSSH認証情報は非公開で、所有者のみがアクセスできます。"
},
"manage": {
"label": "管理",
"description": "編集に加え、ホストを他者と共有し、権限レベルを変更、アクセスを取り消すことができます。"
}
},
"expiryLabel": "アクセス期限",
"expiry": {
"never": "無期限",
"oneHour": "1時間",
"oneDay": "24時間",
"sevenDays": "7日間",
"thirtyDays": "30日間",
"custom": "カスタム"
},
"customHoursPlaceholder": "アクセス期限までの時間数",
"shareButton": "共有",
"shareWithCount": "共有 ({{count}})",
"currentAccess": "現在のアクセス",
"noAccessEntries": "このホストはまだ共有されていません",
"folderRulesTitle": "後から追加されたホストに適用されます",
"folderRulesHint": "これらの共有はフォルダ上に保持されます。フォルダ内(またはサブフォルダ内)に作成されたホスト、あるいは移動されたホストは、自動的に同じアクセス権を取得します。ルールを削除しても、将来の継承が停止するだけです。",
"folderRuleRemove": "相続をやめる",
"folderShareSummary": "Shared {{shared}} of {{total}} host(s) in this folder",
"grantedBy": "付与者",
"expires": "有効期限",
"expired": "期限切れ",
"never": "無期限",
"revoke": "取り消し",
"accessUpdated": "アクセスが更新されました",
"accessUpdateFailed": "アクセスの更新に失敗しました",
"sharedBadge": "共有済み",
"sharedBadgeTooltip": "{{owner}} により共有 ({{level}}アクセス)",
"viewOnlyBanner": "このホストは{{owner}}によりビューアクセスで共有されています。設定は読み取り専用です。",
"sharedEditBanner": "このホストは{{owner}}により編集アクセスで共有されています。変更は実際のホストに適用されます。認証情報は所有者のみ変更できます。",
"ownerOnlyControl": "ホスト所有者のみ変更できます",
"ownerAuthPrivate": "ホスト所有者のSSH認証は非公開です。ホストメニューから「個人用SSH認証の設定」を選択して、独自の認証情報を選択してください。",
"ownerAuthShared": "ホストの所有者はこのホストのSSH認証情報を共有しています。それを使用するか、「個人用SSH認証情報の設定」から独自の認証情報を選択できます。",
"authOverrideAction": "個人用SSH認証を設定する",
"authOverrideActionProtocol": "個人認証を設定する {{protocol}}",
"authOverrideTitle": "個人用SSH認証",
"authOverrideTitleProtocol": "個人認証 {{protocol}}",
"authOverrideDescriptionPrivate": "ホスト所有者の SSH 認証情報は非公開です。 {{host}} への接続には、保存済みの認証情報のいずれかを選択してください。",
"authOverrideDescriptionShared": "ホスト所有者と共有されている認証情報を使用するか、 {{host}} への接続のために保存されている認証情報のいずれかに置き換えてください。",
"authOverrideCredentialLabel": "認証資格情報",
"useSharedAuthentication": "共有ホスト認証を使用する",
"noPersonalCredential": "個人認証情報なし",
"authOverrideNoCredentials": "SSH認証情報がまだ保存されていません。認証が必要なホストに接続するには、「認証情報」で認証情報を作成してください。",
"authOverrideRequired": "このホストに接続するには、保存済みの認証情報のいずれかが必要です。",
"authOverridePrivateHint": "この認証情報はあなた専用のものです。ホストの所有者やその他の受信者は、この認証情報を見たり使用したりすることはできません。",
"authOverrideSaved": "個人用SSH認証が保存されました",
"authOverrideCleared": "個人用SSH認証が削除されました",
"authOverrideClearedToShared": "共有ホスト認証を使用する",
"authOverrideLoadError": "SSH認証情報の読み込みに失敗しました。もう一度お試しください。",
"authOverrideSaveError": "SSH認証情報の保存に失敗しました"
},
"guac": {
"connection": "接続",
"authentication": "認証",
"storedCredential": "保存された認証情報",
"noCredential": "認証情報なし (直接入力は以下)",
"authMethod": "認証方法",
"authTypeDirect": "直接",
"authTypeCredential": "認証情報",
"authTypeNone": "なし",
"authTypeNoneDesc": "認証情報は保存されません。接続するたびにユーザー名とパスワードの入力を求められますが、それらは保存されません。",
"selectCredential": "認証情報を選択...",
"connectionSettings": "接続設定",
"displaySettings": "表示設定",
"audioSettings": "オーディオ設定",
"rdpPerformance": "RDP パフォーマンス",
"deviceRedirection": "デバイスリダイレクト",
"session": "セッション",
"gateway": "ゲートウェイ",
"remoteApp": "RemoteApp",
"clipboard": "クリップボード",
"sessionRecording": "セッション記録",
"wakeOnLan": "Wake-on-LAN",
"vncSettings": "VNC設定",
"terminalSettings": "ターミナル設定",
"rdpPort": "RDPポート",
"username": "ユーザー名",
"password": "パスワード",
"passwordSaved": "パスワードが保存されました。変更するには入力してください。",
"domain": "ドメイン",
"securityMode": "セキュリティモード",
"colorDepth": "色深度",
"width": "幅",
"height": "高さ",
"dpi": "DPI",
"resizeMethod": "リサイズ方法",
"clientName": "クライアント名",
"initialProgram": "初期プログラム",
"serverLayout": "サーバーレイアウト",
"timezone": "タイムゾーン",
"loadBalanceInfo": "負荷分散情報 / Cookie",
"loadBalanceInfoDesc": "RDSファームの負荷分散用RD接続ブローカーCookie (例: tsv://MS Terminal Services Plugin.1.CollectionName)",
"guacdProxy": "guacdプロキシ",
"guacdHostname": "guacdホスト",
"guacdHostnamePlaceholder": "全体のデフォルト",
"guacdPort": "guacdポート",
"guacdProxyDesc": "この接続に対してグローバル guacd インスタンスを上書きします。空白にするとグローバルに設定された guacd を使用します。",
"gatewayHostname": "ゲートウェイホスト名",
"gatewayPort": "ゲートウェイポート",
"gatewayUsername": "ゲートウェイユーザー名",
"gatewayPassword": "ゲートウェイパスワード",
"gatewayDomain": "ゲートウェイドメイン",
"remoteAppProgram": "RemoteAppプログラム",
"workingDirectory": "作業ディレクトリ",
"arguments": "引数",
"normalizeLineEndings": "改行コードの正規化",
"recordingPath": "録画パス",
"recordingName": "録画名",
"macAddress": "MACアドレス",
"broadcastAddress": "ブロードキャストアドレス",
"udpPort": "UDPポート",
"waitTimeS": "待機時間(秒)",
"driveName": "ドライブ名",
"drivePath": "ドライブパス",
"ignoreCertificate": "証明書を無視",
"ignoreCertificateDesc": "自己署名証明書を持つホストへの接続を許可する",
"forceLossless": "ロスレスを強制",
"forceLosslessDesc": "ロスレス画像エンコーディングを強制する(高品質だが帯域幅を多く消費)",
"disableAudio": "オーディオを無効化",
"disableAudioDesc": "リモートセッションの音声をすべてミュートする",
"enableAudioInput": "音声入力(マイク)を有効化",
"enableAudioInputDesc": "ローカルマイクをリモートセッションに転送する",
"wallpaper": "壁紙",
"wallpaperDesc": "デスクトップ壁紙を表示する(無効にするとパフォーマンスが向上)",
"theming": "テーマ",
"themingDesc": "ビジュアルテーマとスタイルを有効にする",
"fontSmoothing": "フォントスムージング",
"fontSmoothingDesc": "ClearTypeフォントレンダリングを有効にする",
"fullWindowDrag": "フルウィンドウドラッグ",
"fullWindowDragDesc": "ウィンドウドラッグ中に内容を表示する",
"desktopComposition": "デスクトップコンポジション",
"desktopCompositionDesc": "Aero Glass効果を有効にする",
"menuAnimations": "メニューアニメーション",
"menuAnimationsDesc": "メニューのフェードおよびスライドアニメーションを有効にする",
"disableBitmapCaching": "ビットマップキャッシュを無効化",
"disableBitmapCachingDesc": "ビットマップキャッシュをオフにする(不具合の解決に役立つ場合がある)",
"disableOffscreenCaching": "オフスクリーンキャッシュを無効化",
"disableOffscreenCachingDesc": "オフスクリーンキャッシュをオフにする",
"disableGlyphCaching": "グリフキャッシュを無効化",
"disableGlyphCachingDesc": "グリフキャッシュをオフにする",
"enableGfx": "GFXを有効化",
"enableGfxDesc": "RemoteFXグラフィックスパイプラインを使用する",
"enablePrinting": "印刷を有効化",
"enablePrintingDesc": "ローカルプリンターをリモートセッションにリダイレクトする",
"enableDriveRedirection": "ドライブリダイレクションを有効化",
"enableDriveRedirectionDesc": "リモートセッションでローカルフォルダーをドライブとしてマッピングする",
"createDrivePath": "ドライブパスを作成",
"createDrivePathDesc": "フォルダが存在しない場合に自動的に作成します",
"disableDownload": "ダウンロードを無効にする",
"disableDownloadDesc": "リモートセッションからファイルをダウンロードできないようにします",
"disableUpload": "アップロードを無効にする",
"disableUploadDesc": "リモートセッションにファイルをアップロードできないようにします",
"enableTouch": "タッチを有効にする",
"enableTouchDesc": "タッチ入力転送を有効にします",
"consoleSession": "コンソールセッション",
"consoleSessionDesc": "新しいセッションではなくコンソール(セッション0)に接続します",
"sendWolPacket": "WOLパケットを送信",
"sendWolPacketDesc": "接続前にこのホストを起動するためのマジックパケットを送信します",
"disableCopy": "コピーを無効にする",
"disableCopyDesc": "リモートセッションからのテキストコピーを禁止します",
"disablePaste": "貼り付けを無効にする",
"disablePasteDesc": "リモートセッションへのテキスト貼り付けを禁止します",
"createPathIfMissing": "パスが存在しない場合に作成",
"createPathIfMissingDesc": "レコーディングディレクトリが存在しない場合に自動的に作成します",
"excludeOutput": "出力を除外",
"excludeOutputDesc": "画面出力を記録しません(メタデータのみ)",
"excludeMouse": "マウスを除外",
"excludeMouseDesc": "マウスの動きを記録しません",
"includeKeystrokes": "キーストロークを含める",
"includeKeystrokesDesc": "画面出力に加えて生のキーストロークを記録します",
"vncPort": "VNCポート",
"vncPassword": "VNCパスワード",
"vncUsernameOptional": "ユーザー名(オプション)",
"vncLeaveBlank": "必要ない場合は空白のままにしてください",
"cursorMode": "カーソルモード",
"swapRedBlue": "赤/青を入れ替え",
"swapRedBlueDesc": "赤と青の色チャネルを入れ替えます(色の問題を修正)",
"readOnly": "読み取り専用",
"readOnlyDesc": "入力を送信せずにリモート画面を表示します",
"telnetPort": "Telnetポート",
"terminalType": "端末タイプ",
"fontName": "フォント名",
"fontSize": "フォントサイズ",
"colorScheme": "カラースキーム",
"backspaceKey": "バックスペースキー",
"saveHostFirst": "最初にホストを保存してください。",
"sharingOptionsAfterSave": "共有オプションはホストの保存後に利用可能です。",
"permissionLevel": "権限レベル",
"typeHeader": "タイプ",
"targetHeader": "ターゲット",
"permissionHeader": "権限",
"cancelBtn": "キャンセル",
"savingBtn": "保存中...",
"updateHostBtn": "ホストを更新",
"addHostBtn": "ホストを追加"
},
"arrangeUnlockedSwitchedToManual": "手動ソートに切り替えたので、注文内容が保持されます。",
"dragToRearrange": "ドラッグして並べ替える",
"arrangeUnlocked": "ロックを解除してドラッグして並べ替える",
"tabWebUi": "Web UI",
"webUiEndpointLabel": "エンドポイント {{number}}",
"webUiIntegration": "Web UI",
"webUiEndpointsSection": "エンドポイント",
"webUiRequirementsText": "ブラウザによって直接エンドポイントが開かれるため、そのポートはブラウザからアクセス可能である必要があります。一方、TermixはこのホストのSSH接続を介してSSHトンネルを開くため、ポートはホストからのみアクセス可能であればよいのです。",
"enableWebUi": "Webエンドポイントを有効にする",
"enableWebUiDesc": "サイドバーからこのホストのウェブインターフェースを開いてください。",
"webUiAddEndpoint": "エンドポイントを追加する",
"webUiAddress": "住所",
"webUiOpening": "オープニング",
"webUiBindHostDesc": "バックエンドがフォワードをバインドする場所です。Termixを実行しているマシンのみがアクセスできる127.0.0.1の場合は空白のままにしてください。",
"webUiBindHostExposed": "このアドレスはTermixマシン以外からもアクセスできるため、このポートにアクセスできる人であれば誰でもログインなしでこのWeb UIにアクセスできます。",
"webUiBindHostUnreachable": "お使いのブラウザはTermixを実行しているマシン上の127.0.0.1にアクセスできないため、このエンドポイントは読み込まれません。マシンが応答するアドレス(例:0.0.0.0)を使用してください。",
"webUiBindHostSharesSessionCookie": "このブラウザから転送すると、Termixが提供されるホスト名と同じホスト名でアクセスできるため、トンネル化されたサービスがTermixセッションを受信します。Cookieはポートを無視します。このエンドポイントはここでは開きませんが、Termixデスクトップアプリ、またはTermixがlocalhostで開かれている場合は動作します。",
"webUiLocalPort": "地元の港",
"webUiLocalPortAuto": "自動",
"webUiLocalPortDesc": "フォワーディングがリッスンするポートを指定します。システムに選択させる場合は空欄のままにし、ポートを事前に知っておく必要がある場合(例えば、ポートを公開するコンテナなど)はポート番号を指定してください。",
"webUiNewEndpointLabel": "新しいエンドポイント",
"webUiErrorLabelRequired": "エンドポイント {{row}} にはラベルが必要です。",
"webUiErrorLabelDuplicate": "各エンドポイントには異なる名前が必要です。",
"webUiErrorPortRange": "エンドポイント {{row}} には 1 ~ 65535 のポートが必要です。",
"webUiErrorPathInvalid": "エンドポイント {{row}} のパスが無効です。/admin のようなパスを使用してください。",
"webUiLabel": "ラベル",
"webUiScheme": "スキーム",
"webUiPort": "ポート",
"webUiPath": "パス",
"webUiAccess": "アクセス",
"webUiAccessDirect": "直接",
"webUiAccessTunnel": "SSHトンネル",
"webUiAccessTunnelUnavailable": "SSHトンネルには、このホストでSSHが有効になっており、接続元がこのデバイスである必要があります。",
"webUiRender": "開く",
"webUiRenderExternal": "分離されたデスクトップウィンドウ",
"webUiRenderEmbedded": "テルミックス錠",
"webUiRenderEmbeddedDesc": "埋め込みはベストエフォート型です。一部のWebインターフェースはフレーム内での読み込みを拒否し、同一サイトCookieに依存するログイン処理はループする可能性があります。外部ブラウザは常に正常に動作します。",
"webUiIgnoreCert": "無効な証明書を許可する",
"webUiIgnoreCertDesc": "直接エンドポイントのみが対象です。ループバックは既に対象外となっているため、トンネルエンドポイントには影響しません。",
"webUiRemoveEndpoint": "エンドポイントを削除",
"webUiOpenFailed": "ウェブエンドポイントを開くのに失敗しました"
},
"commandPalette": {
"searchPlaceholder": "ホスト、コマンド、設定を検索...",
"quickActions": "クイック操作",
"navigation": "ナビゲーション",
"orShortcut": "または",
"hostManager": "ホストマネージャー",
"hostManagerDesc": "ホストの管理、追加、編集",
"addNewHost": "新規ホストを追加",
"addNewHostDesc": "新しいホストを登録",
"adminSettings": "管理設定",
"adminSettingsDesc": "システム設定とユーザーを構成",
"userProfile": "ユーザープロファイル",
"userProfileDesc": "アカウントと設定を管理",
"addCredential": "認証情報を追加",
"addCredentialDesc": "SSH鍵やパスワードを保存",
"tmuxMonitor": "Tmux モニター",
"tmuxMonitorDesc": "ホスト間の tmux セッションを監視",
"snippets": "断片",
"runSnippetDesc": "アクティブなターミナルタブで実行します",
"noSnippetsFound": "「{{search}}」に一致するスニペットは見つかりませんでした",
"recentActivity": "最近のアクティビティ",
"serversAndHosts": "サーバー & ホスト",
"noHostsFound": "\"{{search}}\" に一致するホストは見つかりませんでした",
"links": "リンク",
"navigate": "移動",
"select": "選択",
"toggleWith": "切り替え",
"localTerminal": "ローカル端末",
"localTerminalDesc": "このコンピュータでシェルを開く"
},
"splitScreen": {
"paneEmpty": "ペイン {{index}} - 空",
"noTabAssigned": "タブが割り当てられていません",
"focusedPane": "アクティブペイン"
},
"connections": {
"noConnections": "接続がありません",
"noConnectionsDesc": "ここに接続を表示するには、ターミナル、ファイルマネージャー、またはリモートデスクトップを開いてください",
"connectedFor": "接続時間 {{duration}}",
"connected": "接続済み",
"disconnected": "切断済み",
"closeTab": "タブを閉じる",
"closeConnection": "接続を閉じる",
"forgetTab": "忘れる",
"removeBackground": "削除",
"reconnect": "再接続",
"reopenTab": "再開",
"sectionOpen": "開く",
"sectionBackground": "バックグラウンド",
"backgroundDesc": "セッションは切断後 {{minutes}} 分間維持され、再接続できます。",
"persisted": "バックグラウンドで保持中",
"expiresIn": "{{duration}} 後に期限切れ",
"search": "接続を検索...",
"noSearchResults": "検索条件に一致する接続はありません",
"rename": "セッション名を変更",
"sectionSharedWithMe": "私と共有しました",
"sharedBy": "{{username}} によって共有されました",
"join": "参加する",
"sharedSessionLabel": "{{hostName}} (共有)"
},
"collab": {
"createRoom": "新しい部屋",
"roomName": "部屋名",
"persistentRoom": "永続的な部屋",
"persistentRoomHint": "永続的な会議室は、会議終了後もリストに表示され、再利用できます。",
"noRooms": "まだ会議室がありません。会議室を作成して会議を開始してください。",
"openRoom": "開ける",
"endRoom": "会議終了",
"leaveRoom": "離れる",
"deleteMember": "取り除く",
"removeMember": "{{name}} を削除",
"removeMemberTitle": "このメンバーを削除しますか?",
"removeMemberDescription": "{{name}} は直ちにこのルームへのアクセス権を失います。アクティブな SSH ビューアはすべて切断されます。",
"invite": "招待する",
"inviteTitle": "メンバーを招待する",
"members": "メンバー",
"membersPanel": "ルームメンバーと制御リクエスト",
"membersWithCount": "メンバー({{count}})",
"online": "オンライン",
"offline": "オフライン",
"you": "(あなた)",
"hostBadge": "ホスト",
"presenterBadge": "発表します",
"present": "現在",
"presentTitle": "ステージに立つ",
"presentHost": "ホスト",
"searchHosts": "ホストを検索",
"noHostsFound": "利用可能なホストが見つかりませんでした。",
"presentProtocol": "プロトコル",
"stopPresenting": "プレゼンテーションをやめる",
"takeOver": "引き継ぐ",
"takeOverConfirmTitle": "現在のプレゼンテーションを置き換えますか?",
"takeOverDescription": "{{name}} が現在プレゼンテーションを行っています。引き継ぐと、そのステージから全員が切断されます。",
"emptyStage": "発表者はいません。ステージに上がってセッションを共有してください。",
"stageLoading": "ステージに接続中…",
"stageEnded": "プレゼンテーションは終了しました",
"roomEnded": "この会議は終了しました。",
"presenterLabel": "{{name}} がプレゼンテーションを行っています",
"guestLink": "ゲストリンク",
"guestLinkOn": "ゲストリンクが有効になっています。リンクを知っている人なら誰でもステージを視聴できます。",
"guestLinkOff": "ゲストリンクが無効になっています。",
"copyLink": "リンクをコピー",
"rotateLink": "リンクを回転させる",
"disableLink": "リンクを無効にする",
"rotateLinkConfirmTitle": "ゲストリンクを回転させますか?",
"rotateLinkDescription": "現在の接続は直ちに停止します。接続中のSSHゲストは切断されます。",
"disableLinkConfirmTitle": "ゲストリンクを無効にしますか?",
"disableLinkDescription": "匿名SSHビューアは直ちに切断され、現在の接続は機能しなくなります。",
"linkCopied": "リンクをコピーしました",
"roles": "役割",
"users": "ユーザー",
"searchUsers": "ユーザーを検索",
"endConfirmTitle": "この会議を終了しますか?",
"endDescription": "{{name}} は全員に対して終了し、再開することはできません。",
"endPersistentDescription": "{{name}} で現在行われているプレゼンテーションは終了します。この部屋は引き続きご利用いただけます。",
"deleteRoom": "ルームを削除",
"deleteConfirmTitle": "この部屋を削除しますか?",
"deleteDescription": "{{name}} は全員に対して完全に削除され、元に戻すことはできません。",
"invitedTo": "あなたは「{{name}}」に招待されました。",
"guest": {
"title": "ミーティング",
"waiting": "プレゼンターをお待ちしています…",
"linkInvalid": "このゲストリンクは無効であるか、ミーティングが終了しています"
},
"reopenFromPanel": "この会議タブの有効期限が切れました。会議パネルから会議室を再度開いてください。",
"requestControl": "リクエスト制御",
"cancelControlRequest": "キャンセルリクエスト",
"controlQueue": "制御要求",
"noControlRequests": "保留中のリクエストはありません。",
"grantControlTo": "{{name}}に制御権を与える",
"dismissControlRequest": "{{name}}の制御要求を却下します",
"releaseControl": "リリース制御",
"grantControl": "コントロールを与える",
"revokeControl": "主導権を取り戻す",
"controlRequestedBy": "{{name}} が制御を要求しました",
"grant": "付与",
"controlBadge": "制御する",
"youArePresenting": "あなたは別のタブでプレゼンテーションを行っています。プレゼンテーションを中断して、ステージを譲ってください。",
"created": "ルームが作成されました",
"invited": "会員の皆様を招待いたします",
"roomTab": "ミーティング"
},
"sessionSharing": {
"guestView": {
"loading": "共有セッションに接続しています...",
"linkInvalid": "この共有リンクは無効、期限切れ、または取り消されています。",
"rateLimited": "試行回数が多すぎます。しばらくしてからもう一度お試しください。",
"sessionEnded": "このセッションは終了しました",
"readOnlyBadge": "閲覧のみ",
"ownerLabel": "ホストオーナー"
},
"modalTitle": "セッションを共有する",
"shareButton": "共有",
"notReadyToShare": "セッションはまだ共有できません",
"modeTab": {
"link": "リンク",
"user": "ユーザー"
},
"linkModeDescription": "このリンクを知っている人なら誰でも参加できます。アカウントは必要ありません。",
"userModeDescription": "このホストへのアクセス権を既に持っている特定のユーザーと共有します。まだアクセス権がない場合は、まずホストを共有するか、代わりにリンクを使用してください。共有が完了すると、セッションはユーザーの「接続」タブに表示されます。",
"permissionLevel": {
"label": "権限レベル",
"readOnly": "読み取り専用",
"readOnlyDescription": "セッションをライブで視聴することはできますが、文字入力やインタラクションはできません。",
"readWrite": "読み書き",
"readWriteDescription": "所有者と同様に、セッション内で文字を入力したり操作したりできます。"
},
"expiryLabel": "リンクの有効期限",
"createLinkButton": "リンクを作成する",
"createShareButton": "ユーザーと共有する",
"searchUsersPlaceholder": "ユーザーを検索...",
"noUsersFound": "ユーザーが見つかりませんでした",
"linkCreated": "共有リンクが作成されました",
"linkCopied": "リンクがクリップボードにコピーされました",
"copyLink": "リンクをコピー",
"shareCreated": "セッションが共有されました。相手の「接続」タブに表示されます。",
"shareFailed": "共有の作成に失敗しました",
"userLacksHostAccess": "そのユーザーはまだこのホストへのアクセス権を持っていません。まずホストを共有するか、代わりにリンクを使用してください。",
"activeShares": "アクティブなシェア",
"noActiveShares": "今セッションで有効な株式はありません",
"revoke": "取り消す",
"revokeConfirmTitle": "この共有を取り消しますか?",
"revokeConfirmDescription": "この共有ファイルを使用している人は、即座にアクセス権を失います。",
"revoked": "シェアが取り消されました",
"revokeFailed": "シェアの取り消しに失敗しました",
"joinCount": "{{count}} 参加する",
"joinCount_other": "{{count}} が参加します",
"expiresAt": "有効期限 {{date}}",
"linkShareBadge": "リンク",
"userShareBadge": "ユーザー: {{username}}",
"loadSharesFailed": "アクティブな共有の読み込みに失敗しました"
},
"guacamole": {
"connecting": "{{type}} セッションに接続中...",
"checkingGuacd": "リモートデスクトップサービスを確認しています...",
"requestingToken": "{{type}} 接続トークンを要求しています...",
"openingSession": "{{type}} セッションを開始しています...",
"negotiating": "交渉中 {{type}} 握手...",
"sessionReady": "{{type}} セッション準備完了",
"connectionError": "接続エラー",
"connectionFailed": "接続失敗",
"failedToConnect": "接続トークンの取得に失敗しました",
"hostNotFound": "ホストが見つかりません",
"noHostSelected": "ホストが選択されていません",
"reconnect": "再接続",
"retry": "再試行",
"guacdUnavailable": "リモートデスクトップサービス (guacd) が利用できません。guacd が実行中でアクセス可能であり、管理者設定で正しく構成されていることを確認してください。",
"credentialPromptTitle": "RDP認証情報を入力してください",
"credentialPromptDescription": "このホストは、接続時に認証情報の入力を求めるように設定されています。認証情報は今回のセッションのみで使用され、保存されません。",
"connect": "接続する",
"ctrlAltDel": "Ctrl+Alt+Del",
"files": {
"title": "ドライブファイル",
"parent": "親ディレクトリ",
"refresh": "更新",
"empty": "このフォルダは空です",
"listFailed": "このフォルダの読み取りに失敗しました",
"download": "ダウンロード",
"downloadFailed": "ダウンロードに失敗しました {{name}}",
"upload": "ファイルをアップロードする",
"uploading": "{{name}} をアップロード中...",
"uploaded": "アップロード済み {{name}}",
"uploadFailed": "アップロードに失敗しました {{name}}",
"uploadDisabled": "この接続ではアップロードが無効になっています。",
"driveUnavailable": "ファイルをアップロードする前に、RDPドライブリダイレクトを有効にしてください。",
"driveNotWritable": "guacd はドライブフォルダに書き込むことができません。GUACD_DRIVE_PATH(またはホストのドライブパス)とそのアクセス許可を確認してください。",
"dropToUpload": "アップロードするファイルをドロップしてください"
},
"toolbar": {
"ctrlAltDel": "Ctrl+Alt+Del",
"winL": "Win+L (画面ロック)",
"winKey": "Windows キー",
"superL": "Super+L(ロック画面)",
"superKey": "スーパーキー",
"super": "素晴らしい",
"cmdL": "Cmd+L(画面ロック)",
"cmdKey": "コマンドキー",
"cmd": "コマンド",
"ctrl": "Ctrl",
"alt": "Alt",
"shift": "Shift",
"win": "Win",
"stickyActive": "{{key}}(ラッチ中 - クリックで解除)",
"stickyInactive": "{{key}}(クリックでラッチ)",
"esc": "Escape",
"tab": "Tab",
"home": "Home",
"end": "End",
"pageUp": "Page Up",
"pageDown": "Page Down",
"arrowUp": "Arrow Up",
"arrowDown": "Arrow Down",
"arrowLeft": "Arrow Left",
"arrowRight": "Arrow Right",
"fnToggle": "ファンクションキー",
"reconnect": "セッション再接続",
"collapse": "ツールバーを折りたたむ",
"expand": "ツールバーを展開",
"dragHandle": "ドラッグで位置変更",
"hide": "このセッション中は非表示にします。完全に無効にするには、ホスト設定 → 一般 → 接続ツールバーを開いてください。",
"zoomIn": "ズームイン",
"zoomOut": "ズームアウト",
"resetZoom": "ズームをリセット",
"fitToScreen": "画面に合わせる",
"switchToTrackpad": "トラックパッドモードに切り替える(ドラッグでカーソルを移動、タップでクリック)",
"switchToTouch": "タッチモードに切り替える(クリックしたい場所を直接タップする)"
}
},
"terminal": {
"sessionExpiredNotice": "{{host}} での前回のセッションは {{minutes}} 分後に切断され、シェルおよびそこで実行されていたすべてのものが失われました。セッションを維持するには、このホストで Auto-Tmux を有効にしてください。",
"sessionExpiredNoticeNoMinutes": "{{host}} での前回のセッションは、接続が切断された状態で期限切れになりました。シェルおよびシェル内で実行されていたすべてのプロセスは失われています。セッションを維持するには、このホストで Auto-Tmux を有効にしてください。",
"enableAutoTmuxAction": "Auto-Tmuxを有効にする",
"autoTmuxEnabled": "{{host}}に対して Auto-Tmux が有効になりました。これは次回の接続時に適用されます。",
"autoTmuxEnableFailed": "Auto-Tmux の有効化に失敗しました",
"connect": "ホストに接続",
"clear": "クリア",
"paste": "貼り付け",
"reconnect": "再接続",
"connectionLost": "接続切断",
"connected": "接続中",
"clipboardWriteFailed": "クリップボードへのコピーに失敗しました。ページがHTTPSまたはlocalhostで提供されていることを確認してください。",
"clipboardReadFailed": "クリップボードからの読み取りに失敗しました。クリップボードのアクセス許可が付与されていることを確認してください。",
"clipboardHttpWarning": "クリップボードを読み取れませんでした。一部のブラウザはHTTPS接続以外でのクリップボードへのアクセスを制限しています。代わりにCtrl+Vを試すか、TermixをHTTPS経由で提供してみてください。",
"passwordPromptFillTitle": "保存されたパスワードをこのプロンプトに入力しますか?",
"unknownError": "不明なエラーが発生しました",
"websocketError": "WebSocket接続エラー",
"connecting": "接続中...",
"noHostSelected": "ホストが選択されていません",
"reconnecting": "再接続中... ({{attempt}}/{{max}})",
"reconnected": "再接続完了",
"tmuxSessionCreated": "tmuxセッションが作成されました: {{name}}",
"tmuxSessionAttached": "tmuxセッションに接続しました: {{name}}",
"tmuxUnavailable": "リモートホストにtmuxがインストールされていません。標準シェルにフォールバックします。",
"tmuxSessionPickerTitle": "tmuxセッション",
"tmuxSessionPickerDesc": "このホストに既存のtmuxセッションがあります。再アタッチするか、新しいセッションを作成してください。",
"tmuxWindows": "ウィンドウ",
"tmuxWindowCount": "{{count}} ウィンドウ",
"tmuxAttached": "接続クライアント",
"tmuxAttachedCount": "{{count}} 接続",
"tmuxLastActivity": "最終アクティビティ",
"tmuxTimeJustNow": "たった今",
"tmuxTimeMinutes": "{{count}}分前",
"tmuxTimeHours": "{{count}}時間前",
"tmuxTimeDays": "{{count}}日前",
"tmuxCreateNew": "新規セッションを開始",
"tmuxCopyHint": "選択範囲を調整してEnterでクリップボードにコピー",
"tmuxDetach": "tmuxセッションからデタッチ",
"tmuxDetached": "tmuxセッションからデタッチしました",
"searchPlaceholder": "探す",
"searchCaseSensitive": "マッチケース",
"searchWholeWord": "単語全体を一致させる",
"searchRegex": "正規表現を使用する",
"searchNoResults": "検索結果なし",
"searchResultCount": "{{index}} / {{count}}",
"searchNext": "次の試合(入場)",
"searchPrevious": "前の試合 (Shift+Enter)",
"searchClose": "閉じる(Escキー)",
"maxReconnectAttemptsReached": "再接続の最大試行回数に達しました",
"closeTab": "閉じる",
"connectionTimeout": "接続タイムアウト",
"terminalTitle": "ターミナル - {{host}}",
"terminalWithPath": "ターミナル - {{host}}:{{path}}",
"runTitle": "{{command}} 実行中 - {{host}}",
"totpRequired": "二要素認証が必要です",
"totpCodeLabel": "確認コード",
"totpVerify": "確認",
"mfaPromptRequired": "認証が必要です",
"mfaPushRequired": "プッシュ認証が必要です",
"mfaMenuPlaceholder": "回答を入力してください",
"mfaWaitingApproval": "お使いのデバイスでの承認をお待ちしています...",
"mfaSendRequest": "リクエストを送信",
"warpgateAuthRequired": "Warpgate認証が必要です",
"warpgateSecurityKey": "セキュリティキー",
"warpgateAuthUrl": "認証URL",
"warpgateOpenBrowser": "ブラウザで開く",
"warpgateContinue": "認証が完了しました",
"certAuthRequired": "{{provider}} サインインが必要です",
"opksshAuthRequired": "OPKSSH認証が必要です",
"opksshAuthDescription": "ブラウザで認証を完了して続行してください。このセッションは24時間有効です。",
"opksshOpenBrowser": "ブラウザを開いて認証",
"opksshWaitingForAuth": "ブラウザでの認証を待機中...",
"opksshAuthenticating": "認証を処理中...",
"opksshTimeout": "認証がタイムアウトしました。もう一度お試しください。",
"opksshAuthFailed": "認証に失敗しました。資格情報を確認して再試行してください。",
"opksshSignInWith": "{{provider}} でサインイン",
"tailscaleCheckRequired": "テールスケール認証が必要です",
"tailscaleCheckDescription": "TailscaleのSSH接続には追加の認証が必要です。ブラウザで認証を行ってから続行してください。",
"tailscaleCheckOpenBrowser": "認証のためにブラウザを開く",
"tailscaleCheckWaiting": "Tailscaleの認証を待っています...",
"tailscaleCheckTimeout": "Tailscaleの認証がタイムアウトしました。もう一度お試しください。",
"vaultAuthTitle": "Vault サインインが必要です",
"vaultAuthDescription": "HashiCorp Vaultへのサインイン用のウィンドウが開きました。そこでサインインを完了すると、この接続は自動的に続行されます。",
"vaultAuthFailed": "Vault 認証に失敗しました。もう一度お試しください。",
"vaultReopen": "サインインウィンドウを再表示",
"sudoPasswordPopupTitle": "パスワードを入力しますか?",
"linkDialogTitle": "リンクを開く",
"linkDialogOpen": "開く",
"linkDialogCopy": "コピー",
"websocketAbnormalClose": "接続が予期せず切断されました。リバースプロキシまたはSSLの設定に問題がある可能性があります。サーバーログを確認してください。",
"connectionLogTitle": "接続ログ",
"connectionLogCopy": "ログをクリップボードにコピー",
"connectionLogEmpty": "まだ接続ログはありません",
"connectionLogWaiting": "接続ログを待機中...",
"connectionLogCopied": "接続ログがクリップボードにコピーされました",
"connectionLogCopyFailed": "ログのクリップボードへのコピーに失敗しました",
"connectionRejected": "サーバーによって接続が拒否されました。認証設定とネットワーク構成を確認してください。",
"hostKeyRejected": "SSHホストキーの検証が拒否されました。接続がキャンセルされました。",
"sessionTakenOver": "セッションが別のタブで開かれました。再接続中...",
"split": {
"splitTab": "タブを分割",
"addToSplit": "分割に追加",
"removeFromSplit": "分割から削除"
}
},
"fileManager": {
"noHostSelected": "ホストが選択されていません",
"initializingEditor": "エディターを初期化中...",
"file": "ファイル",
"folder": "フォルダー",
"uploadFile": "ファイルをアップロード",
"downloadFile": "ダウンロード",
"extractArchive": "アーカイブを展開",
"extractingArchive": "{{name}} を展開中...",
"archiveExtractedSuccessfully": "{{name}} の展開が完了しました",
"extractFailed": "展開に失敗しました",
"compressFile": "ファイルを圧縮",
"compressFiles": "ファイルを圧縮",
"compressFilesDesc": "{{count}} 個の項目をアーカイブに圧縮",
"archiveName": "アーカイブ名",
"enterArchiveName": "アーカイブ名を入力...",
"compressionFormat": "圧縮形式",
"selectedFiles": "選択したファイル",
"andMoreFiles": "他 {{count}} 件...",
"compress": "圧縮",
"compressingFiles": "{{count}} 個の項目を {{name}} に圧縮中...",
"filesCompressedSuccessfully": "{{name}} が正常に作成されました",
"compressFailed": "圧縮に失敗しました",
"edit": "編集",
"preview": "プレビュー",
"previous": "前へ",
"next": "次へ",
"pageXOfY": "{{current}} / {{total}} ページ",
"zoomOut": "縮小",
"zoomIn": "拡大",
"newFile": "新規ファイル",
"newFolder": "新規フォルダ",
"rename": "名前を変更",
"uploading": "アップロード中...",
"uploadingFile": "{{name}} をアップロード中...",
"fileName": "ファイル名",
"folderName": "フォルダ名",
"fileUploadedSuccessfully": "ファイル \"{{name}}\" のアップロードが完了しました",
"failedToUploadFile": "ファイルのアップロードに失敗しました",
"uploadingFolderFiles": "{{count}} 個のファイルをアップロードしています...",
"uploadedFolderFiles": "{{count}} 個のファイルが正常にアップロードされました",
"uploadedFolderPartial": "Uploaded {{uploaded}} file(s), {{failed}} failed",
"fileDownloadedSuccessfully": "ファイル \"{{name}}\" のダウンロードが完了しました",
"failedToDownloadFile": "ファイルのダウンロードに失敗しました",
"fileCreatedSuccessfully": "ファイル \"{{name}}\" が正常に作成されました",
"folderCreatedSuccessfully": "フォルダ \"{{name}}\" が正常に作成されました",
"failedToCreateItem": "アイテムの作成に失敗しました",
"operationFailed": "{{name}} の {{operation}} 操作が失敗しました: {{error}}",
"failedToResolveSymlink": "シンボリックリンクの解決に失敗しました",
"itemsDeletedSuccessfully": "{{count}} 個のアイテムが正常に削除されました",
"failedToDeleteItems": "アイテムの削除に失敗しました",
"sudoPasswordRequired": "管理者パスワードが必要です",
"enterSudoPassword": "操作を続行するには sudo パスワードを入力してください",
"sudoPassword": "Sudo パスワード",
"sudoOperationFailed": "Sudo 操作に失敗しました",
"sudoAuthFailed": "Sudo 認証に失敗しました",
"dragFilesToUpload": "ここにファイルをドロップしてアップロード",
"dropToUploadHere": "ここにアップロードしてください",
"dropToDownloadHere": "ここからダウンロードしてください",
"localFiles": "地元",
"showLocalFiles": "ローカルファイルを表示する(分割表示)",
"hideLocalFiles": "ローカルファイルを非表示にする",
"localHome": "ホームフォルダ",
"localPathPlaceholder": "ローカルフォルダパス",
"localShowHidden": "隠しファイルを表示する",
"localHideHidden": "隠しファイルを隠す",
"localRevealInFileManager": "システムファイルマネージャで表示",
"localCannotOpenFolder": "フォルダーを開けません",
"localItemCount": "{{count}} アイテム",
"localSelectedCount": "{{count}} 選択済み",
"back": "戻る",
"forward": "フォワード",
"up": "上",
"kind": "親切",
"localUploadingProgress": "{{current}} / {{total}} をアップロード中",
"localDownloadingProgress": "{{current}} をダウンロード中 {{total}}",
"localTransferInFlight": "{{count}} すぐに",
"localPreparingDownload": "ダウンロード準備中...",
"localTransferCancelled": "転送がキャンセルされました",
"localNothingToTransfer": "譲渡するものはありません",
"localUploadComplete": "{{count}} 個のファイルをアップロードしました",
"localUploadFailed": "アップロードに失敗しました",
"localUploadPartial": "Uploaded {{done}} file(s), {{failed}} failed",
"localDownloadComplete": "{{count}} 個のファイルをダウンロードしました",
"localDownloadFailed": "ダウンロードに失敗しました",
"localDownloadPartial": "{{done}} 個のファイルをダウンロードしましたが、 {{failed}} 失敗しました。",
"localReplaceExistingPrompt": "このフォルダには既に{{count}} 個のアイテムが存在します。置き換えますか?",
"localReplace": "交換する",
"localSkipExisting": "スキップ",
"localSkippedExisting": "既存のアイテムをスキップしました {{count}}",
"localUnsafeNamesSkipped": "このコンピューターでは名前を使用できない {{count}} 個のアイテムをスキップしました",
"localOpen": "開ける",
"localOpenFolder": "フォルダーを開く",
"localUploadToRemote": "サーバーにアップロード",
"localUploadToRemoteMany": "{{count}} 個のアイテムをサーバーにアップロードします",
"localMoveToTrash": "ゴミ箱に移動",
"localMoveToTrashMany": "{{count}} 個のアイテムをゴミ箱に移動します",
"localTrashConfirmSingle": "\"{{name}}\" をゴミ箱に移動しますか?",
"localTrashConfirmFolder": "フォルダ「{{name}}」とその中のすべての内容をゴミ箱に移動しますか?",
"localTrashConfirmMany": "{{count}} 個のアイテムをゴミ箱に移動しますか?",
"localTrashed": "{{count}} 個のアイテムをゴミ箱に移動しました",
"localTrashFailed": "ゴミ箱に移動できませんでした",
"localRenameFailed": "名前変更に失敗しました",
"localCreateFailed": "アイテムを作成できませんでした",
"goToParentFolder": "親フォルダへ移動",
"resizeSidebar": "サイドバーのサイズを変更するにはドラッグしてください(ダブルクリックでリセットできます)。",
"resizeLocalPane": "ローカルペインのサイズを変更するにはドラッグしてください(ダブルクリックでリセットできます)。",
"columns": "コラム",
"columnsHint": "右クリックして列を選択",
"emptyFolder": "このフォルダーは空です",
"searchFiles": "ファイルを検索...",
"upload": "アップロード",
"selectHostToStart": "ファイル管理を開始するホストを選択してください",
"sshRequiredForFileManager": "ファイルマネージャーには SSH が必要です。このホストでは SSH が有効になっていません。",
"failedToConnect": "SSH への接続に失敗しました",
"failedToLoadDirectory": "ディレクトリの読み込みに失敗しました",
"noSSHConnection": "利用可能な SSH 接続がありません",
"copy": "コピー",
"cut": "切り取り",
"paste": "貼り付け",
"copyPath": "パスをコピー",
"copyPaths": "パスをコピー",
"delete": "削除",
"properties": "プロパティ",
"refresh": "更新",
"downloadFiles": "{{count}} 個のファイルをブラウザにダウンロード",
"copyFiles": "{{count}} 個のアイテムをコピー",
"cutFiles": "{{count}} 個のアイテムを切り取り",
"deleteFiles": "{{count}} 個のアイテムを削除",
"filesCopiedToClipboard": "{{count}} 個のアイテムがクリップボードにコピーされました",
"filesCutToClipboard": "{{count}} 個のアイテムがクリップボードに切り取られました",
"pathCopiedToClipboard": "パスがクリップボードにコピーされました",
"pathsCopiedToClipboard": "{{count}} 個のパスがクリップボードにコピーされました",
"failedToCopyPath": "パスをクリップボードにコピーできませんでした",
"copyFolderLink": "フォルダへのリンクをコピー",
"copyCurrentFolderLink": "現在のフォルダへのリンクをコピー",
"folderLinkCopied": "フォルダリンクをクリップボードにコピーしました",
"failedToCopyFolderLink": "フォルダリンクをコピーできませんでした",
"movedItems": "{{count}} 個のアイテムを移動しました",
"failedToDeleteItem": "アイテムを削除できませんでした",
"itemRenamedSuccessfully": "{{type}} の名前を変更しました",
"failedToRenameItem": "アイテムの名前を変更できませんでした",
"download": "ダウンロード",
"openExternalEditor": "外部エディタで開く",
"chooseExternalEditor": "外部エディタを選択",
"externalEditorSelected": "外部エディタを選択しました",
"externalEditorDesktopOnly": "外部エディタはデスクトップアプリでのみ利用可能です",
"externalEditorOpened": "外部エディタで開きました。保存すると変更がサーバーにアップロードされます。",
"failedToOpenExternalEditor": "外部エディタを開けませんでした",
"failedToSelectExternalEditor": "外部エディタを選択できませんでした",
"permissions": "アクセス権限",
"size": "サイズ",
"modified": "更新日時",
"path": "パス",
"confirmDelete": "本当に {{name}} を削除しますか?",
"permissionDenied": "アクセスが拒否されました",
"serverError": "サーバーエラー",
"fileSavedSuccessfully": "ファイルを保存しました",
"failedToSaveFile": "ファイルを保存できませんでした",
"confirmDeleteSingleItem": "\"{{name}}\" を完全に削除してもよろしいですか?",
"confirmDeleteMultipleItems": "{{count}} 個のアイテムを完全に削除してもよろしいですか?",
"confirmDeleteMultipleItemsWithFolders": "{{count}} 個のアイテムを完全に削除してもよろしいですか?フォルダとその内容も含まれます。",
"confirmDeleteFolder": "フォルダ \"{{name}}\" とその内容をすべて完全に削除してもよろしいですか?",
"permanentDeleteWarning": "この操作は元に戻せません。アイテムはサーバーから完全に削除されます。",
"moveToTrashWarning": "該当品はTermixのゴミ箱に移動され、保管期間が終了する前に復元することができます。",
"itemsMovedToTrash": "{{count}} 個のアイテムがゴミ箱に移動されました",
"trash": "ごみ",
"trashDescription": "削除されたアイテムは、このホスト上で {{days}} 日間保持されます。",
"trashLoadFailed": "ゴミ箱の読み込みに失敗しました",
"trashEmpty": "ゴミ箱は空です",
"trashRestore": "復元する",
"trashRestored": "復元済み {{name}}",
"trashRestoreFailed": "アイテムの復元に失敗しました。元のパスが既に存在している可能性があります。",
"trashDeletePermanently": "完全に削除する",
"trashDeleteConfirm": "{{name}}を完全に削除しますか?これは元に戻せません。",
"trashPermanentlyDeleted": "完全に削除されました {{name}}",
"trashDeleteFailed": "アイテムの完全削除に失敗しました",
"trashEmptyAction": "空のゴミ箱",
"trashEmptyConfirm": "ゴミ箱内のすべてのアイテムを完全に削除しますか?この操作は元に戻せません。",
"trashEmptied": "ゴミを空にする",
"trashRetention": "(日数)後に自動クリーンアップ",
"trashRetentionSaved": "ゴミ保持に関する最新情報",
"trashRetentionFailed": "ゴミ箱の保持期間の更新に失敗しました",
"trashUnavailableConfirm": "このアイテムはゴミ箱に移動できません。通常、別のファイルシステム上にあるか、管理者権限が必要なためです。代わりに完全に削除しますか?",
"recent": "最近使用した項目",
"pinned": "ピン留め",
"folderShortcuts": "フォルダショートカット",
"failedToReconnectSSH": "SSH セッションに再接続できませんでした",
"openTerminalHere": "ここでターミナルを開く",
"run": "実行",
"openTerminalInFolder": "このフォルダでターミナルを開く",
"openTerminalInFileLocation": "ファイルの場所でターミナルを開く",
"runningFile": "実行中 - {{file}}",
"onlyRunExecutableFiles": "実行可能ファイルのみ実行できます",
"directories": "ディレクトリ",
"removedFromRecentFiles": "最近使用したファイルから \"{{name}}\" を削除しました",
"removeFailed": "削除に失敗しました",
"unpinnedSuccessfully": "\"{{name}}\" のピン留めを解除しました",
"unpinFailed": "ピン留め解除に失敗しました",
"removedShortcut": "ショートカット \"{{name}}\" を削除しました",
"removeShortcutFailed": "ショートカットの削除に失敗しました",
"clearedAllRecentFiles": "最近使用したファイルをすべて消去しました",
"clearFailed": "消去に失敗しました",
"removeFromRecentFiles": "最近使用したファイルから削除",
"clearAllRecentFiles": "最近使用したファイルをすべて消去",
"unpinFile": "ファイルのピン留めを解除",
"removeShortcut": "ショートカットを削除",
"pinFile": "ファイルをピン留め",
"addToShortcuts": "ショートカットに追加",
"pasteFailed": "貼り付けに失敗しました",
"noUndoableActions": "元に戻せる操作はありません",
"undoCopySuccess": "コピー操作を元に戻しました: {{count}} 個のコピーファイルを削除しました",
"undoCopyFailedDelete": "元に戻せませんでした: コピーファイルを削除できませんでした",
"undoCopyFailedNoInfo": "元に戻せませんでした: コピーファイル情報が見つかりませんでした",
"undoMoveSuccess": "移動操作を元に戻しました: {{count}} 個のファイルを元の場所に戻しました",
"undoMoveFailedMove": "元に戻せませんでした: ファイルを元の場所に戻せませんでした",
"undoMoveFailedNoInfo": "元に戻せませんでした: 移動ファイル情報が見つかりませんでした",
"undoDeleteNotSupported": "削除操作は元に戻せません: ファイルはサーバーから完全に削除されました",
"undoTypeNotSupported": "元に戻せない操作タイプです",
"undoOperationFailed": "元に戻す操作に失敗しました",
"unknownError": "不明なエラー",
"confirm": "確認",
"find": "検索...",
"replace": "置換",
"downloadInstead": "代わりにダウンロード",
"keyboardShortcuts": "キーボードショートカット",
"searchAndReplace": "検索と置換",
"editing": "編集",
"search": "検索",
"findNext": "次を検索",
"findPrevious": "前を検索",
"save": "保存",
"selectAll": "すべて選択",
"undo": "元に戻す",
"redo": "やり直し",
"moveLineUp": "行を上に移動",
"moveLineDown": "行を下に移動",
"toggleComment": "コメント行の切り替え",
"autoComplete": "自動補完",
"imageLoadError": "画像の読み込みに失敗しました",
"startTyping": "入力を開始...",
"unknownSize": "サイズ不明",
"fileIsEmpty": "ファイルは空です",
"largeFileWarning": "大きなファイルの警告",
"largeFileWarningDesc": "このファイルのサイズは{{size}}で、テキストとして開くとパフォーマンスの問題が発生する可能性があります。",
"fileNotFoundAndRemoved": "ファイル \"{{name}}\" が見つからないため、最近使ったファイル/ピン留めから削除されました。",
"failedToLoadFile": "ファイルの読み込みに失敗しました: {{error}}",
"serverErrorOccurred": "サーバーエラーが発生しました。後でもう一度お試しください。",
"autoSaveFailed": "自動保存に失敗しました",
"fileAutoSaved": "ファイルを自動保存しました",
"moveFileFailed": "{{name}} の移動に失敗しました",
"moveOperationFailed": "移動操作に失敗しました",
"canOnlyCompareFiles": "2つのファイルのみ比較できます",
"comparingFiles": "ファイルを比較中: {{file1}} と {{file2}}",
"dragFailed": "ドラッグ操作に失敗しました",
"filePinnedSuccessfully": "ファイル \"{{name}}\" をピン留めしました",
"pinFileFailed": "ファイルのピン留めに失敗しました",
"fileUnpinnedSuccessfully": "ファイル \"{{name}}\" のピン留めを解除しました",
"unpinFileFailed": "ファイルのピン留め解除に失敗しました",
"shortcutAddedSuccessfully": "フォルダショートカット \"{{name}}\" を追加しました",
"addShortcutFailed": "ショートカットの追加に失敗しました",
"operationCompletedSuccessfully": "{{count}} アイテムを正常に{{operation}}しました",
"operationCompleted": "{{count}} アイテムを{{operation}}しました",
"downloadFileSuccess": "ファイル {{name}} のダウンロードが完了しました",
"downloadFileFailed": "ダウンロードに失敗しました",
"downloadingFile": "ダウンロード中 {{name}}…",
"downloadProgressBytes": "{{transferred}} / {{total}}",
"moveTo": "{{name}} に移動",
"diffCompareWith": "{{name}} と差分比較",
"dragOutsideToDownload": "ウィンドウ外にドラッグしてダウンロード ({{count}} ファイル)",
"newFolderDefault": "新規フォルダ",
"newFileDefault": "新規ファイル.txt",
"successfullyMovedItems": "{{count}} アイテムを {{target}} に移動しました",
"move": "移動",
"searchInFile": "ファイル内検索 (Ctrl+F)",
"showKeyboardShortcuts": "キーボードショートカットを表示",
"decreaseFontSize": "フォントサイズを縮小",
"increaseFontSize": "フォントサイズを拡大",
"startWritingMarkdown": "マークダウンコンテンツの作成を開始...",
"loadingFileComparison": "ファイル比較を読み込み中...",
"reload": "再読み込み",
"compare": "比較",
"sideBySide": "横並び表示",
"inline": "インライン表示",
"fileComparison": "ファイル比較: {{file1}} 対 {{file2}}",
"fileTooLarge": "ファイルが大きすぎます: {{error}}",
"sshConnectionFailed": "SSH接続に失敗しました。 {{name}} ({{ip}}:{{port}}) への接続を確認してください",
"loadFileFailed": "ファイルの読み込みに失敗しました: {{error}}",
"connecting": "接続中...",
"connectedSuccessfully": "接続しました",
"totpVerificationFailed": "TOTP検証に失敗しました",
"warpgateVerificationFailed": "Warpgate認証に失敗しました",
"authenticationFailed": "認証に失敗しました",
"incorrectPassphrase": "パスフレーズが間違っています。もう一度お試しください。",
"verificationCodePrompt": "認証コード:",
"changePermissions": "パーミッション変更",
"currentPermissions": "現在のパーミッション",
"owner": "所有者",
"group": "グループ",
"others": "その他",
"read": "読み取り",
"write": "書き込み",
"execute": "実行",
"permissionsChangedSuccessfully": "パーミッションが正常に変更されました",
"failedToChangePermissions": "パーミッションの変更に失敗しました",
"name": "名前",
"sortByName": "名前",
"sortByDate": "更新日時",
"sortBySize": "サイズ",
"ascending": "昇順",
"descending": "降順",
"root": "ルート",
"new": "新規",
"sortBy": "並べ替え",
"items": "アイテム",
"selected": "選択中",
"editor": "エディター",
"octal": "8進数",
"storage": "ストレージ",
"disk": "ディスク",
"used": "使用量",
"of": "の",
"toggleSidebar": "サイドバー切り替え",
"compactLayout": "コンパクトなレイアウトを使用する",
"comfortableLayout": "快適なレイアウトを使用する",
"cannotLoadPdf": "PDFを読み込めません",
"pdfLoadError": "このPDFファイルの読み込み中にエラーが発生しました。",
"loadingPdf": "PDFを読み込み中...",
"loadingPage": "ページを読み込み中..."
},
"transfer": {
"copyToHost": "ホストにコピー...",
"moveToHost": "ホストに移動...",
"copyItemsToHost": "{{count}}個のアイテムをホストにコピー...",
"moveItemsToHost": "{{count}} アイテムをホストへ移動…",
"noHostsConnected": "利用可能な他のファイルマネージャホストがありません。",
"noHostsConnectedHint": "ホストマネージャでファイルマネージャが有効なSSHホストを追加してください。",
"selectDestinationHost": "転送先ホストを選択",
"destinationPath": "転送先パス",
"recentDestinations": "最近の転送先",
"collapseRecentDestinations": "最近の転送先を折りたたむ",
"expandRecentDestinations": "最近の転送先を展開する",
"browseFolders": "転送先フォルダを参照",
"browseDestination": "パスを参照または入力",
"confirmCopy": "コピー",
"confirmMove": "移動",
"transferring": "転送中…",
"progressVerifying": "ファイルの整合性を検証中…",
"progressBenchmarking": "最速の転送ルートを選択…",
"compressing": "圧縮中…",
"extracting": "展開中…",
"transferringItems": "{{total}} 個中 {{current}} 個のアイテムを転送中…",
"transferSuccess": "転送が完了しました",
"transferError": "転送に失敗しました",
"transferPartial": "{{count}} 件のエラーで転送が完了しました",
"transferPartialHint": "転送できませんでした: {{paths}}",
"itemsSummary": "{{count}} アイテム",
"destMustBeDirectory": "複数アイテムの転送では転送先はディレクトリである必要があります",
"selectThisFolder": "このフォルダを選択",
"browsePathWillBeCreated": "このフォルダはまだ存在しません。転送開始時に作成されます。",
"browsePathError": "転送先ホストでこのパスを開けませんでした。",
"goUp": "上へ",
"copyFolderToHost": "フォルダをホストにコピー…",
"moveFolderToHost": "フォルダをホストに移動…",
"hostReady": "準備完了",
"hostConnecting": "接続中…",
"hostDisconnected": "未接続",
"hostAuthRequired": "認証が必要です — まずこのホストでファイルマネージャを開いてください",
"hostConnectionFailed": "接続に失敗しました",
"metricsTitle": "転送タイミング",
"metricsPrepare": "転送先の準備: {{duration}}",
"metricsCompress": "送信元での圧縮: {{duration}}",
"metricsHopSourceRead": "送信元 → サーバー: {{throughput}}",
"metricsHopDestSftpWrite": "サーバー → 送信先 (SFTP): {{throughput}}",
"metricsHopDestLocalWrite": "サーバー → 送信先 (ローカル): {{throughput}}",
"metricsTransfer": "エンドツーエンド: {{throughput}} ({{duration}})",
"metricsExtract": "送信先で展開: {{duration}}",
"metricsVerify": "SHA-256検証済み: {{duration}}",
"metricsRouteBenchmark": "ルートプローブ — 直接: {{direct}}、リレー: {{relay}}",
"metricsSourceDelete": "送信元から削除: {{duration}}",
"metricsTotal": "合計: {{duration}}",
"progressCompressing": "ソースホストで圧縮中…",
"progressExtracting": "送信先で展開中…",
"progressTransferring": "データ転送中…",
"progressReconnecting": "再接続中…",
"parallelSegmentsLabel": "並列転送レーン",
"parallelSegmentsOption": "{{count}} レーン",
"parallelSegmentsHint": "大きなファイルは 256 MB のチャンクに分割されます。複数レーンでは個別の接続を使用し (複数の転送を開始するように)、合計スループットが向上します。",
"progressTotalSpeed": "合計 {{speed}} ({{lanes}} レーン)",
"progressTransferringItems": "ファイル転送中 ({{current}} / {{total}})…",
"progressBytes": "{{transferred}} / {{total}}",
"progressItems": "{{current}} / {{total}} ファイル",
"sourceNotDeletedPartial": "ソースファイルを保持 (部分転送)",
"jumpHostLimitation": "両方のホストが Termix サーバーから到達可能である必要があります。ホスト間直接ルーティングはサポートされていません。",
"cancel": "キャンセル",
"methodLabel": "転送方式",
"methodAuto": "自動",
"methodTar": "Tar アーカイブ",
"methodItemSftp": "ファイル単位 SFTP",
"methodAutoHint": "ファイル数、サイズ、圧縮可能性に基づいて tar またはファイル単位 SFTP を選択します。単一ファイルは常にストリーミング SFTP を使用します。",
"methodTarHint": "ソースで圧縮し、1つのアーカイブを転送し、送信先で展開します。両方の Unix ホストに tar が必要です。",
"methodItemSftpHint": "各ファイルを個別に SFTP で転送します。Windows を含むすべてのホストで動作します。",
"methodPreviewLoading": "転送方式を計算中…",
"methodPreviewError": "転送方式をプレビューできませんでした。開始時にサーバーが方式を選択します。",
"methodPreviewWillUseTar": "使用方式: Tar アーカイブ",
"methodPreviewWillUseItemSftp": "使用方式: ファイル単位 SFTP",
"methodPreviewScanSummary": "{{fileCount}} ファイル、合計 {{totalSize}} (ソースホストでスキャン)。",
"methodItemSftpLimitation": "各ファイルは単一ファイルコピーと同じ SFTP ストリームを順次使用します。進捗は全ファイルで統合されるため、大きなファイルではバーの動きが遅くなります。",
"methodReason": {
"user_item_sftp": "ファイルごとのSFTPを選択しました。",
"user_tar": "tarアーカイブを選択しました。",
"tar_unavailable": "一方または両方のホストでtarが利用できないため、代わりにファイルごとのSFTPが使用されます。",
"windows_host": "Windows ホストが含まれているため、tar は使用されません。",
"auto_multi_large": "自動: 複数ファイルに大きな圧縮可能なファイル ({{largestSize}}) が含まれるため、tarで1回の転送にまとめます。",
"auto_single_large_in_archive": "自動: このセットに1つの大きなファイル ({{largestSize}}) があるため、ファイルごとのSFTPです。",
"auto_many_incompressible": "自動: ほとんど圧縮不可能なデータのため、ファイルごとのSFTPです。",
"auto_many_files": "自動: 多数のファイル ({{fileCount}}) があるため、tarでファイルごとのオーバーヘッドを削減します。",
"auto_default": "自動: このセットではファイルごとのSFTPです。"
},
"progressCancel": "キャンセル",
"progressCancelling": "キャンセル中…",
"progressStalled": "停滞中",
"resumedHint": "別のウィンドウで開始されたアクティブな転送に再接続しました。",
"transferCancelled": "転送がキャンセルされました",
"transferCancelledCopyHint": "部分的なファイルが宛先に残る可能性があります。",
"transferCancelledMoveHint": "部分的なファイルが宛先に残る可能性があります。ソースファイルは削除されていません。",
"cleanupDestFiles": "宛先をクリーンアップ",
"cleanupDestFilesSuccess": "宛先から部分的なファイルを削除しました",
"cleanupDestFilesPartial": "一部の部分的なファイルを削除できませんでした",
"cleanupDestFilesNothing": "宛先にクリーンアップするものはありません",
"cleanupDestFilesError": "クリーンアップに失敗しました",
"retryTransfer": "再試行",
"retryTransferError": "再試行に失敗しました",
"transferFailedRetryHint": "部分的なデータが宛先に保持されました。接続が復旧したら再試行が再開されます。"
},
"sftpTransfer": {
"title": "SFTP",
"description": "2つのSSHホスト間でファイルを転送します。",
"sourceServer": "ソースサーバー",
"destinationServer": "宛先サーバー",
"selectHost": "ホストを選択",
"noHostSelected": "ホストが選択されていません",
"move": "動く",
"copy": "コピー",
"upload": "アップロード",
"itemsSelected": "{{count}} アイテムが選択されました",
"itemsSelected_other": "{{count}} 個のアイテムが選択されました",
"ready": "準備ができて",
"loadingHosts": "ホストを読み込んでいます...",
"name": "名前",
"modified": "修正済み",
"size": "サイズ",
"noFiles": "ファイルなし",
"open": "開ける",
"up": "上",
"refresh": "更新",
"copyToTarget": "ターゲットディレクトリにコピー",
"rename": "名前を変更する",
"delete": "消去",
"editPermissions": "権限の編集",
"createNewFolder": "新しいフォルダーを作成する",
"deleteSelectedItems": "選択したアイテムを削除",
"deleteConfirm": "選択した項目 {{count}} を削除しますか?",
"deleteConfirm_other": "選択した項目 {{count}} を削除しますか?",
"cancel": "キャンセル",
"save": "保存",
"folderCreated": "フォルダが作成されました",
"itemRenamed": "アイテム名が変更されました",
"actionFailed": "アクションが失敗しました",
"itemsDeleted": "{{count}} アイテムが削除されました",
"itemsDeleted_other": "{{count}} 個のアイテムが削除されました",
"deleteFailed": "削除に失敗しました",
"permissionsUpdated": "権限が更新されました",
"noRemoteSessionConnected": "リモートセッションが接続されていません",
"failedToListFiles": "ファイルの一覧表示に失敗しました",
"failedToRefresh": "更新に失敗しました",
"destinationInsideSource": "宛先は、選択したソースパス内にあってはなりません。",
"sameHostNoOp": "ソースと宛先は同じフォルダです。"
},
"tunnels": {
"noSshTunnels": "SSHトンネルがありません",
"createFirstTunnelMessage": "まだSSHトンネルが作成されていません。開始するにはホストマネージャーでトンネル接続を設定してください。",
"connected": "接続済み",
"disconnected": "切断済み",
"connecting": "接続中...",
"error": "エラー",
"canceling": "キャンセル中...",
"connect": "接続",
"disconnect": "切断",
"cancel": "キャンセル",
"port": "ポート",
"localPort": "ローカルポート",
"remotePort": "リモートポート",
"destinationPort": "目的地港",
"currentHostPort": "現在のホストポート",
"endpointPort": "エンドポイントポート",
"bindIp": "ローカルIP",
"localAddress": "現地住所",
"remoteAddress": "リモートアドレス",
"destinationAddress": "宛先住所",
"remoteBindAddress": "リモートバインドアドレス",
"intermediateHost": "中間宿主",
"endpointSshConfig": "エンドポイントSSH設定",
"endpointSshHost": "エンドポイントSSHホスト",
"endpointSshHostPlaceholder": "設定済みのホストを選択",
"endpointSshHostRequired": "各クライアントトンネルにエンドポイントSSHホストを選択してください。",
"attempt": "試行 {{current}} / {{max}}",
"nextRetryIn": "{{seconds}} 秒後に再試行",
"clientTunnels": "クライアントトンネル",
"clientTunnel": "クライアントトンネル",
"addClientTunnel": "クライアントトンネルを追加",
"noClientTunnels": "このデスクトップにはクライアントトンネルが設定されていません。",
"tunnelName": "トンネル名",
"remoteHost": "リモートホスト",
"autoStart": "自動起動",
"clientAutoStartDesc": "デスクトップクライアントが起動すると自動的に接続し、接続を維持します。",
"clientManualStartDesc": "この行の開始/停止を使用します。Termixは自動的に起動しません。",
"clientRemoteServerNote": "リモート転送にはエンドポイントSSHサーバーでAllowTcpForwardingとGatewayPortsが必要な場合があります。このデスクトップが切断されるとリモートポートは閉じます。",
"clientTunnelStarted": "クライアントトンネルが起動しました",
"clientTunnelStopped": "クライアントトンネルが停止しました",
"tunnelTestSucceeded": "トンネルテストが成功しました",
"tunnelTestFailed": "トンネルテストが失敗しました",
"localSaved": "クライアントトンネルを保存しました",
"localSaveError": "クライアントトンネルの保存に失敗しました",
"invalidBindIp": "ローカルIPは有効なIPv4アドレスでなければなりません。",
"invalidLocalTargetIp": "ローカルターゲットIPは有効なIPv4アドレスでなければなりません。",
"invalidRemoteAddress": "リモートアドレスが必要です。",
"invalidLocalPort": "ローカルポートは1~65535の間でなければなりません。",
"invalidRemotePort": "リモートポートは1~65535の間でなければなりません。",
"invalidLocalTargetPort": "ローカルターゲットポートは1~65535の間でなければなりません。",
"invalidEndpointPort": "エンドポイントポートは1~65535の間でなければなりません。",
"duplicateAutoStartBind": "自動起動クライアントトンネルで同じ{{bind}}を使用できるのは1つだけです。",
"manualControlError": "トンネル状態の更新に失敗しました。",
"active": "アクティブ",
"start": "開始",
"stop": "停止",
"test": "テスト",
"type": "トンネルタイプ",
"typeLocal": "ローカル (-L)",
"typeRemote": "リモート (-R)",
"typeDynamic": "ダイナミック (-D)",
"typeServerLocalDesc": "現在のホストからエンドポイントへ。",
"typeServerRemoteDesc": "エンドポイントから現在のホストへ。",
"typeClientLocalDesc": "ローカルコンピューターからエンドポイントへ。",
"typeClientRemoteDesc": "エンドポイントからローカルコンピューターへ。",
"typeClientDynamicDesc": "ローカルコンピューター上のSOCKS。",
"typeDynamicDesc": "SSH経由でSOCKS5 CONNECTトラフィックを転送",
"forwardDescriptionServerLocal": "現在のホスト {{sourcePort}} → エンドポイント {{endpointPort}}。",
"forwardDescriptionServerRemote": "エンドポイント {{endpointPort}} → 現在のホスト {{sourcePort}}。",
"forwardDescriptionServerDynamic": "現在のホスト上のSOCKS {{sourcePort}}。",
"forwardDescriptionClientLocal": "ローカル {{sourcePort}} → リモート {{endpointPort}}。",
"forwardDescriptionClientRemote": "リモート {{sourcePort}} → ローカル {{endpointPort}}。",
"forwardDescriptionClientDynamic": "ローカルポート {{sourcePort}} 上のSOCKS。",
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{remoteHost}}:{{remotePort}} 経由 {{endpoint}}",
"summaryClientRemote": "{{remoteHost}}:{{remotePort}} を {{endpoint}} 上で → {{localHost}}:{{localPort}}",
"summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}",
"autoNameClientLocal": "ローカル {{localPort}} → {{endpoint}} {{remotePort}}",
"autoNameClientRemote": "{{endpoint}} {{remotePort}} → ローカル {{localPort}}",
"autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}",
"route": "ルート:",
"lastStarted": "最終起動日時",
"lastTested": "最終テスト日時",
"lastError": "最終エラー",
"maxRetries": "最大再試行回数",
"maxRetriesDescription": "再試行の最大試行回数。",
"retryInterval": "再試行間隔 (秒)",
"retryIntervalDescription": "再試行の間隔。",
"local": "ローカル",
"remote": "リモート",
"destination": "宛先",
"host": "ホスト",
"mode": "モード",
"noHostSelected": "ホストが選択されていません",
"working": "処理中..."
},
"cardGrid": {
"dragToMove": "ドラッグして移動",
"dragToResize": "ドラッグしてサイズ変更",
"changeWidth": "幅を変更",
"removeCard": "{{label}}を削除",
"addCard": "追加",
"columns": "列",
"empty": "カードがありません。下の「追加」を使ってカードを配置してください。"
},
"hostMetrics": {
"cpu": "CPU",
"memory": "メモリ",
"disk": "ディスク",
"network": "ネットワーク",
"uptime": "稼働時間",
"processes": "プロセス",
"available": "利用可能",
"free": "空き",
"connecting": "接続中...",
"connectionFailed": "サーバーへの接続に失敗しました",
"naCpus": "N/A CPU",
"cpuCores_one": "{{count}} コア",
"cpuCores_other": "{{count}} コア",
"cpuUsage": "CPU使用率",
"memoryUsage": "メモリ使用率",
"diskUsage": "ディスク使用率",
"selectFilesystem": "ファイルシステムを選択",
"temperature": "温度",
"highestTemperature": "最高温度",
"primaryTemperatureSensor": "プライマリーセンサー",
"gpu": {
"title": "GPU",
"noDevice": "NVIDIA GPUが検出されませんでした。GPUのメトリックを表示するには、NVIDIAドライバーをインストールしてください(ドライバーにはnvidia-smiが含まれています)。",
"driver": "ドライバー {{version}}",
"utilization": "利用",
"memory": "VRAM",
"temperature": "温度",
"power": "力",
"fan": "ファン",
"processes": "GPUプロセス",
"noProcesses": "GPUを使用しているプロセスはありません"
},
"failedToFetchHostConfig": "ホスト設定の取得に失敗しました",
"serverOffline": "サーバーオフライン",
"cannotFetchMetrics": "オフラインのサーバーからメトリクスを取得できません。",
"totpFailed": "TOTP検証に失敗しました",
"noneAuthNotSupported": "ホストメトリクスは「none」認証タイプをサポートしていません。",
"noHostSelected": "ホストが選択されていません",
"load": "負荷",
"systemInfo": "システム情報",
"hostname": "ホスト名",
"operatingSystem": "オペレーティングシステム",
"kernel": "カーネル",
"seconds": "秒",
"networkInterfaces": "ネットワークインターフェース",
"noInterfacesFound": "ネットワークインターフェースが見つかりません",
"noProcessesFound": "プロセスが見つかりません",
"processesTotal": "合計",
"processesRunning": "実行中",
"loginStats": "SSHログイン統計",
"noRecentLoginData": "最近のログインデータがありません",
"executingQuickAction": "{{name}} を実行中...",
"quickActionSuccess": "{{name}} が正常に完了しました",
"quickActionFailed": "{{name}} が失敗しました",
"quickActionError": "{{name}} の実行に失敗しました",
"ports": {
"title": "リスニングポート",
"protocol": "プロトコル",
"port": "ポート",
"address": "アドレス",
"process": "プロセス",
"search": "ポートを検索...",
"allProtocols": "すべて",
"noData": "リスニングポートのデータがありません"
},
"firewall": {
"title": "ファイアウォール",
"inactive": "非アクティブ",
"policy": "ポリシー",
"rules": "ルール",
"noRules": "このチェーンにルールはありません",
"noData": "利用可能なファイアウォールデータがありません",
"action": "アクション",
"protocol": "プロトコル",
"port": "ポート",
"source": "ソース",
"anywhere": "任意",
"chains": "チェーン"
},
"loadAvg": "ロードアベレージ",
"swap": "スワップ",
"architecture": "アーキテクチャ",
"refresh": "更新",
"retry": "再試行",
"customize": "レイアウトをカスタマイズ",
"reset": "リセット",
"tabLive": "ライブ",
"editModeInstructions": "カードをドラッグして並べ替え、下辺をドラッグしてサイズを変更し、幅ボタンでカードのスパンを変更します。下のボタンでカードを追加または削除してください。",
"managers": {
"services": "サービス",
"processInspector": "プロセスインスペクタ",
"logViewer": "ログビューア",
"cron": "Cronジョブ",
"packages": "パッケージ",
"ssl": "SSL証明書",
"firewall": "ファイアウォール",
"users": "ユーザーと権限",
"healthCheck": "ヘルスチェック",
"diskBreakdown": "ディスク内訳",
"systemdTimers": "タイマー",
"topMemory": "メモリ使用量トップ",
"noData": "データなし",
"sudoHint": "特権アクションを有効にするには、ホストエディタでこのホストのsudoパスワードを設定してください。",
"filter": "フィルター...",
"start": "起動",
"stop": "停止",
"restart": "再起動",
"actionDone": "{{name}} が更新されました",
"actionFailed": "アクションに失敗しました",
"signalSent": "PID {{pid}} にシグナルが送信されました",
"killHint": "クリック: 終了 (SIGTERM)。右クリック: 強制終了 (SIGKILL)。",
"working": "処理中...",
"update": "更新",
"upgradeAll": "すべてアップグレード",
"allUpToDate": "すべて最新です",
"save": "保存",
"command": "コマンド",
"enabled": "有効",
"cronSaved": "crontab を更新しました",
"clients": "クライアント",
"dryRun": "ドライラン",
"renew": "更新",
"noAcmeClient": "このホストに ACME クライアント (certbot または acme.sh) が見つかりません。",
"addInputRule": "INPUT ルールを追加",
"firewallWarning": "変更は永続化されるまで実行中のみ有効です。自分をロックアウトしないよう注意してください。",
"ruleApplied": "ルールを適用しました",
"invalidPort": "有効なポート番号 (1-65535) を入力してください",
"newUsername": "新しいユーザー名",
"addUser": "追加",
"deleteUser": "ユーザーを削除",
"noHealthChecks": "ヘルスチェックはまだ設定されていません。",
"follow": "フォロー",
"noLogData": "ログ出力がありません。",
"tree": "ツリー",
"enableDisable": "起動時に有効/無効",
"grantSudo": "sudo 権限を付与",
"revokeSudo": "sudo 権限を剥奪",
"sslIssueCert": "証明書を発行",
"sslExpired": "期限切れ",
"sslInDays": "あと {{days}} 日",
"sslNeedDomain": "少なくとも1つのドメインを入力してください",
"sslIssued": "証明書が発行されました",
"sslDomainsPlaceholder": "example.com, www.example.com",
"sslHttpStandalone": "HTTP (スタンドアロン)",
"sslHttpWebroot": "HTTP (webroot)",
"sslDns": "DNS",
"sslDnsProvider": "DNSプロバイダ(例: cloudflare)",
"sslIssueHint": "DNSプロバイダの認証情報はホストに設定済みである必要があります。",
"sslRevoke": "証明書を失効",
"sslRevoked": "証明書が失効しました",
"sslRevokeConfirm": "証明書 \"{{name}}\"を失効して削除しますか?この操作は取り消せません。",
"healthRun": "実行",
"healthName": "名前",
"healthTarget": "ホスト / アドレス",
"healthAddCheck": "チェックを追加",
"healthSaved": "ヘルスチェックが保存されました",
"healthMissingFields": "各チェックには名前とターゲットが必要です",
"logFile": "ファイル",
"logUnit": "ユニット",
"logCustomPath": "/var/log 以下のカスタムパス (任意)",
"logGrep": "行をフィルタ...",
"firewallPersist": "ルールを永続化",
"firewallPersisted": "ファイアウォールルールが永続化されました",
"wireguard": "WireGuard",
"tailscale": "Tailscale",
"wgNotInstalled": "このホストにWireGuardがインストールされていません",
"wgNoInterfaces": "WireGuardインターフェースが設定されていません",
"wgInterfaceUp": "起動",
"wgInterfaceDown": "停止",
"wgBringingUp": "{{name}}を起動中...",
"wgBringingDown": "{{name}}を停止中...",
"wgInterfaceUpDone": "{{name}}が起動しました",
"wgInterfaceDownDone": "{{name}}が停止しました",
"wgListenPort": "ポート",
"wgPublicKey": "公開鍵",
"wgEndpoint": "エンドポイント",
"wgAllowedIPs": "許可されたIP",
"wgLastHandshake": "最終ハンドシェイク",
"wgHandshakeNever": "なし",
"wgTransfer": "転送量",
"tsNotInstalled": "このホストにTailscaleがインストールされていません",
"tsRunning": "実行中",
"tsStopped": "停止中",
"tsEnable": "接続",
"tsDisable": "切断",
"tsEnabling": "Tailscaleに接続中...",
"tsDisabling": "Tailscaleから切断中...",
"tsEnabled": "Tailscale接続済み",
"tsDisabled": "Tailscale切断済み",
"tsIPs": "Tailscale IP",
"tsPeers": "ピア",
"tsOnline": "オンライン",
"tsOffline": "オフライン",
"tsExitNode": "Exitノード",
"tsExitNodeActive": "Exitノード有効",
"tsHostname": "ホスト名"
}
},
"proxmoxStats": {
"tabTitle": "Proxmox統計情報",
"cpuUsage": "CPU使用率",
"memoryUsage": "メモリ使用量",
"diskUsage": "ディスク使用量",
"networkInterfaces": "ネットワークインターフェース",
"uptime": "稼働時間",
"systemInfo": "システム情報",
"guestsSummary": "ゲスト",
"storagePools": "ストレージプール",
"clusterHealth": "クラスターヘルス",
"cpuCores_one": "{{count}} コア",
"cpuCores_other": "{{count}} コア",
"used": "使用済み",
"total": "合計",
"hostname": "ホスト名",
"kernel": "カーネル",
"pveVersion": "PVEバージョン",
"name": "名前",
"status": "状態",
"type": "タイプ",
"cpu": "CPU",
"mem": "メモリ",
"disk": "ディスク",
"running": "ランニング",
"stopped": "停止しました",
"guestCounts": "{{running}}/{{total}} 実行中",
"inactive": "非アクティブ",
"notClustered": "スタンドアロンノード(クラスタの一部ではない)",
"quorate": "引用",
"notQuorate": "定足数に満たない",
"nodeOnline": "オンライン",
"nodeOffline": "オフライン",
"noHostSelected": "ホストが選択されていません",
"pveshNotFound": "pveshが見つかりません - これはProxmoxノードですか?",
"nodeDetectionFailed": "有効な Proxmox ノード名を特定できません",
"connecting": "接続中...",
"connectionFailed": "Proxmoxノードへの接続に失敗しました",
"refresh": "更新",
"searchGuests": "ゲストを検索...",
"filterAll": "全て",
"filterVm": "VM",
"filterLxc": "LXC",
"noGuests": "このノード上にはVMまたはLXCコンテナは見つかりませんでした。",
"noGuestsMatch": "現在の検索条件に一致するゲストはいません。"
},
"auth": {
"tagline": "セルフホストのSSH & リモートデスクトップ管理",
"loginTitle": "おかえりなさい",
"registerTitle": "アカウント作成",
"forgotPassword": "パスワードをお忘れですか?",
"rememberMe": "30日間このデバイスを記憶(TOTPを含む)",
"noAccount": "アカウントをお持ちでないですか?",
"hasAccount": "すでにアカウントをお持ちですか?",
"twoFactorAuth": "二要素認証",
"enterCode": "認証コードを入力",
"backupCode": "またはバックアップコードを使用",
"verifyCode": "認証コードを確認",
"redirectingToApp": "アプリにリダイレクト中...",
"sshAuthenticationRequired": "SSH認証が必要です",
"sshNoKeyboardInteractive": "キーボードインタラクティブ認証は利用できません",
"sshAuthenticationFailed": "認証に失敗しました",
"sshAuthenticationTimeout": "認証タイムアウト",
"sshNoKeyboardInteractiveDescription": "サーバーはキーボードインタラクティブ認証をサポートしていません。パスワードまたはSSH鍵を入力してください。",
"sshAuthFailedDescription": "入力された認証情報が正しくありません。有効な認証情報でもう一度お試しください。",
"sshTimeoutDescription": "認証試行がタイムアウトしました。もう一度お試しください。",
"sshProvideCredentialsDescription": "このサーバーに接続するためにSSH認証情報を入力してください。",
"sshPasswordDescription": "このSSH接続のパスワードを入力してください。",
"sshKeyPasswordDescription": "SSHキーが暗号化されている場合、パスフレーズを入力してください。",
"passphraseRequired": "パスフレーズが必要です",
"passphraseRequiredDescription": "SSHキーは暗号化されています。パスフレーズを入力してロックを解除してください。",
"back": "戻る",
"firstUser": "最初のユーザー",
"firstUserMessage": "あなたは最初のユーザーで、管理者になります。管理者設定はサイドバーのユーザードロップダウンから確認できます。これが誤りだと思われる場合は、Dockerログを確認するか、GitHub issueを作成してください。",
"external": "外部",
"loginWithExternal": "外部プロバイダーでログイン",
"loginWithExternalDesc": "設定された外部IDプロバイダーを使用してログイン",
"externalNotSupportedInElectron": "Electronアプリではまだ外部認証はサポートされていません。OIDCログインにはWeb版をご利用ください。",
"loginWithProvider": "{{name}}でログイン",
"orContinueWith": "または次で続行",
"ldapUsername": "LDAPユーザー名",
"ldapPassword": "LDAPパスワード",
"ldapSignIn": "サインイン",
"ldapLoginFailed": "LDAPログインに失敗しました",
"resetPasswordButton": "パスワードをリセット",
"sendResetCode": "リセットコードを送信",
"resetCodeDesc": "ユーザー名を入力して、パスワードリセットコードを受け取ります。コードはDockerコンテナログに記録されます。",
"resetCode": "リセットコード",
"verifyCodeButton": "コードを確認",
"enterResetCode": "Dockerコンテナログから、ユーザーの6桁のコードを入力してください:",
"newPassword": "新しいパスワード",
"confirmNewPassword": "パスワードを確認",
"enterNewPassword": "ユーザーの新しいパスワードを入力してください:",
"signUp": "サインアップ",
"desktopApp": "デスクトップアプリ",
"loggingInToDesktopApp": "デスクトップアプリにログインしています",
"loadingServer": "サーバーを読み込み中...",
"dataLossWarning": "この方法でパスワードをリセットすると、保存されているSSHホスト、認証情報、その他の暗号化データがすべて削除されます。この操作は元に戻せません。パスワードを忘れ、ログインしていない場合にのみ使用してください。",
"authenticationDisabled": "認証が無効です",
"authenticationDisabledDesc": "現在、すべての認証方法が無効になっています。管理者に連絡してください。",
"passwordLoginDisabledDesc": "パスワードログインは無効です。パスキーまたは外部認証プロバイダーを使用してください。",
"signInWithPasskey": "パスキーでサインイン",
"passkeyLoginFailed": "パスキーログインに失敗しました",
"attemptsRemaining": "残り{{count}}回",
"confirmResetDataWipe": "このアカウントは暗号化アップグレード以降ログインしていないため、旧パスワードがないと保存データを復旧できません。リセットすると、ホスト、認証情報、スニペットが完全に削除されます。続行しますか?"
},
"hostKey": {
"verifyNewHost": "SSHホストキーを確認",
"keyChangedWarning": "SSHホストキーが変更されました",
"firstConnectionTitle": "このホストへの初回接続",
"firstConnectionDescription": "このホストの真正性を確認できません。フィンガープリントが想定したものと一致するか確認してください。",
"keyChangedDescription": "このサーバーのホストキーが前回接続時から変更されています。これはセキュリティ上の問題の可能性があります。",
"previousKey": "以前のキー",
"newFingerprint": "新しいフィンガープリント",
"fingerprint": "フィンガープリント",
"verifyInstructions": "このホストを信頼する場合は、[承諾] をクリックして続行し、このフィンガープリントを今後の接続用に保存してください。",
"securityWarning": "セキュリティ警告",
"acceptAndContinue": "承諾して続行",
"acceptNewKey": "新しいキーを承諾して続行"
},
"errors": {
"databaseConnection": "データベースに接続できませんでした",
"embeddedServerFailed": "Termixのローカルサーバーを起動できませんでした",
"unknownError": "不明なエラー",
"loginFailed": "ログインに失敗しました",
"failedPasswordReset": "パスワードリセットの開始に失敗しました",
"failedVerifyCode": "リセットコードの検証に失敗しました",
"failedCompleteReset": "パスワードリセットの完了に失敗しました",
"invalidTotpCode": "無効なTOTPコードです",
"failedOidcLogin": "OIDCログインの開始に失敗しました",
"silentSigninOidcUnavailable": "サイレントサインインが要求されましたが、OIDCログインが利用できません。",
"failedUserInfo": "ログイン後のユーザー情報の取得に失敗しました",
"oidcAuthFailed": "OIDC認証に失敗しました",
"invalidAuthUrl": "バックエンドから無効な認証URLを受信しました",
"requiredField": "この項目は必須です",
"minLength": "最小{{min}}文字です",
"passwordMismatch": "パスワードが一致しません",
"passwordLoginDisabled": "ユーザー名/パスワードログインは現在無効になっています",
"sessionExpired": "セッションの有効期限が切れました。再度ログインしてください。",
"totpRateLimited": "レート制限: TOTP検証の試行が多すぎます。しばらくしてから再試行してください。",
"totpRateLimitedWithTime": "レート制限: TOTP検証の試行が多すぎます。{{time}}秒待ってから再試行してください。",
"resetCodeRateLimited": "レート制限: 検証の試行が多すぎます。後でもう一度お試しください。",
"resetCodeRateLimitedWithTime": "レート制限: 認証試行が多すぎます。{{time}}秒待ってから再試行してください。",
"authTokenSaveFailed": "認証トークンの保存に失敗しました",
"authTokenMissing": "サーバーから新しい認証トークンが返されませんでした。再度ログインしてください。",
"authTokenRejected": "リモートサーバーが新しい認証トークンを拒否しました",
"keyringUnavailable": "ログインしましたが、セッションを保存できませんでした。このシステムには、セッションを暗号化するためのキーリングがありません。シークレットサービス(gnome-keyringやKWalletなど)を起動して、再度ログインしてください。",
"failedToLoadServer": "サーバーの読み込みに失敗しました",
"remoteServerRequired": "リモートサーバーが必要です。この接続タイプを使用するには、設定でリモートサーバーを接続してください。"
},
"messages": {
"registrationDisabled": "現在、管理者が新規アカウント登録を無効にしています。ログインするか、管理者にお問い合わせください。",
"userNotAllowed": "アカウントは登録を許可されていません。管理者にお問い合わせください。",
"databaseConnectionFailed": "データベースサーバーへの接続に失敗しました",
"embeddedServerPortInUse": "ポート {{port}} は既に別のプログラムによって使用されています。これは通常、TermixのDockerコンテナ、または前回のセッションから残っているTermixプロセスが原因です。それを閉じてから、Termixを再起動してください。",
"embeddedServerPortInUseUnknownPort": "Termixが必要とするポートの1つが、すでに別のプログラムによって使用されています。そのポートを使用しているプログラムを閉じてから、Termixを再起動してください。",
"embeddedServerCrashed": "ローカルサーバーが予期せず停止しました。Termixを再起動し、この問題が続く場合はデスクトップログを確認してください。",
"resetCodeSent": "リセットコードをDockerログに出力しました",
"codeVerified": "コードの検証に成功しました",
"passwordResetSuccess": "パスワードのリセットに成功しました",
"loginSuccess": "ログインに成功しました",
"registrationSuccess": "登録に成功しました"
},
"profile": {
"c2sTunnelConfigDesc": "設定されたSSHホストを対象とするローカルデスクトップトンネル。",
"c2sTunnelPresets": "クライアントトンネルプリセット",
"c2sTunnelPresetsDesc": "このデスクトップクライアントのローカルトンネルリストを名前付きのサーバープリセットとして保存するか、プリセットをこのクライアントに読み込みます。",
"c2sTunnelPresetsUnavailable": "クライアントトンネルプリセットはデスクトップクライアントでのみ利用可能です。",
"c2sPresetName": "プリセット名",
"c2sPresetNamePlaceholder": "クライアントプリセット名",
"c2sPresetToLoad": "読み込むプリセット",
"c2sNoPresetSelected": "プリセットが選択されていません",
"c2sNoPresets": "保存されたプリセットはありません",
"c2sLoadPreset": "読み込み",
"c2sCurrentLocalConfig": "このデスクトップに{{count}}個のローカルクライアントトンネルが設定されています。",
"c2sPresetSyncNote": "プリセットは明示的なスナップショットです。読み込むと、このデスクトップクライアントのローカルクライアントトンネルリストが置き換えられます。",
"c2sPresetSaved": "クライアントトンネルプリセットを保存しました",
"c2sPresetLoaded": "クライアントトンネルプリセットをローカルに読み込みました",
"c2sPresetRenamed": "クライアントトンネルプリセットの名前を変更しました",
"c2sPresetDeleted": "クライアントトンネルプリセットを削除しました",
"c2sPresetLoadError": "クライアントトンネルプリセットの読み込みに失敗しました"
},
"placeholders": {
"maxRetries": "3",
"retryInterval": "10",
"language": "言語",
"keyPassword": "キーパスワード",
"pastePrivateKey": "秘密鍵をここに貼り付け...",
"localListenerHost": "127.0.0.1(ローカルでリッスン)",
"localTargetHost": "127.0.0.1(このコンピューターのターゲット)",
"remoteTargetHost": "127.0.0.1(エンドポイントからのターゲット)",
"remoteBindHost": "127.0.0.1(エンドポイントでリッスン)",
"socksListenerHost": "127.0.0.1 (SOCKSリスナー)",
"enterPassword": "パスワードを入力",
"defaultPort": "22",
"defaultEndpointPort": "224"
},
"dashboard": {
"title": "ダッシュボード",
"loading": "ダッシュボードを読み込み中...",
"github": "GitHub",
"support": "サポート",
"discord": "Discord",
"docs": "ドキュメント",
"donate": "寄付",
"serverOverview": "サーバー概要",
"version": "バージョン",
"upToDate": "最新",
"updateAvailable": "更新あり",
"beta": "ベータ",
"uptime": "アップタイム",
"database": "データベース",
"healthy": "正常",
"error": "エラー",
"totalHosts": "合計ホスト数",
"totalTunnels": "合計トンネル数",
"totalCredentials": "合計認証情報数",
"recentActivity": "最近のアクティビティ",
"reset": "リセット",
"loadingRecentActivity": "最近のアクティビティを読み込み中...",
"noRecentActivity": "最近のアクティビティはありません",
"quickActions": "クイックアクション",
"addHost": "ホストを追加",
"addCredential": "認証情報を追加",
"adminSettings": "管理者設定",
"userProfile": "ユーザープロファイル",
"serverStats": "サーバー統計",
"loadingServerStats": "サーバー統計を読み込み中...",
"noServerData": "サーバーデータがありません",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "ダッシュボードのカスタマイズ",
"dashboardSettings": "ダッシュボード設定",
"enableDisableCards": "カードの表示/非表示",
"resetLayout": "デフォルトにリセット",
"serverOverviewCard": "サーバー概要",
"recentActivityCard": "最近のアクティビティ",
"networkGraphCard": "ネットワークグラフ",
"networkGraph": "ネットワークグラフ",
"quickActionsCard": "クイックアクション",
"serverStatsCard": "サーバー統計",
"panelMain": "メイン",
"panelSide": "サイド",
"justNow": "たった今",
"serviceLinks": "サービスリンク",
"homepagePreview": "ホームページプレビュー"
},
"donation": {
"title": "Termixをお楽しみいただけていますか?",
"body": "Termixは無料のオープンソースソフトウェアで、2人のチームが余暇を使って開発・保守しています。もし商用ツールを置き換えてすでにお使いいただいているなら、寄付によりホスティング費用のカバーと開発の継続が可能になります。現在のところ、寄付は暗号通貨のみでの受付となっております。",
"milestones": "寄付は、SAMLやKubernetesサポートなどの機能構築に必要な調査や学習の時間を確保するためにも役立ちます。進捗状況は寄付ページでご確認ください。",
"cta": "寄付する",
"dismiss": "後で"
},
"dashboardTab": {
"stable": "安定版",
"hostsOnline": "オンラインホスト",
"activeTunnels": "アクティブトンネル",
"registerNewServer": "新しいサーバーを登録",
"storeSshKeysOrPasswords": "SSHキーまたはパスワードを保存",
"manageUsersAndRoles": "ユーザーとロールを管理",
"manageYourAccount": "アカウントを管理",
"hostStatus": "ホストステータス",
"noHostsConfigured": "設定済みホストなし",
"online": "オンライン",
"offline": "オフライン",
"checking": "チェック中",
"onlineLower": "オンライン",
"nodes": "{{count}} ノード",
"add": "追加:",
"commandPalette": "コマンドパレット",
"done": "完了",
"editModeInstructions": "カードをドラッグして並べ替え · 列の仕切りをドラッグして列幅を調整 · カードの下端をドラッグして高さを調整 · ゴミ箱にドラッグして削除",
"empty": "空",
"clear": "クリア",
"serviceLinksTitle": "サービスリンク",
"serviceLinksEmpty": "サービスリンクはまだありません",
"serviceLinksAddLabel": "ラベル",
"serviceLinksAddUrl": "URL",
"serviceLinksAdd": "追加",
"serviceLinksLabelPlaceholder": "マイサービス",
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "有効なWebアドレスを入力してください",
"serviceLinksAddFailed": "サービスリンクの追加に失敗しました",
"disk": "ディスク",
"viewServerDetails": "サーバーの詳細を表示"
},
"sessionLogs": {
"title": "セッションログ",
"noLogs": "セッションログはまだありません",
"noLogsDesc": "ホストでセッションログを有効にして記録を開始してください",
"duration": "所要時間",
"viewLog": "ログを表示",
"downloadLog": "ダウンロード",
"downloadAsText": "テキストとしてダウンロード",
"deleteLog": "削除",
"confirmDelete": "このセッションログを削除しますか?",
"confirmDeleteDesc": "この操作は元に戻せません。",
"copyContent": "コピー",
"copied": "コピーしました!",
"loadError": "セッションログの読み込みに失敗しました",
"deleteError": "セッションログの削除に失敗しました",
"filterByHost": "ホストでフィルター..."
},
"networkGraph": {
"addHost": "ホストを追加",
"addGroup": "グループを追加",
"addLink": "リンクを追加",
"zoomIn": "拡大",
"zoomOut": "縮小",
"resetView": "表示をリセット",
"selectHost": "ホストを選択",
"chooseHost": "ホストを選択...",
"parentGroup": "親グループ",
"noGroup": "グループなし",
"groupName": "グループ名",
"color": "色",
"source": "ソース",
"target": "ターゲット",
"moveToGroup": "グループに移動",
"selectGroup": "グループを選択...",
"addConnection": "接続を追加",
"hostDetails": "ホスト詳細",
"removeFromGroup": "グループから削除",
"addHostHere": "ここにホストを追加",
"editGroup": "グループを編集",
"delete": "削除",
"add": "追加",
"create": "作成",
"move": "移動",
"connect": "接続",
"createGroup": "グループを作成",
"selectSourcePlaceholder": "ソースを選択...",
"selectTargetPlaceholder": "ターゲットを選択...",
"invalidFile": "無効なファイル",
"hostAlreadyExists": "ホストはトポロジーに既に存在します",
"connectionExists": "接続は既に存在しています",
"unknown": "不明",
"name": "名前",
"ip": "IP",
"status": "ステータス",
"failedToAddNode": "ノードの追加に失敗しました",
"sourceDifferentFromTarget": "ソースとターゲットは異なる必要があります",
"exportJSON": "JSON エクスポート",
"importJSON": "JSON インポート",
"terminal": "ターミナル",
"fileManager": "ファイルマネージャー",
"tunnel": "トンネル",
"docker": "Docker",
"serverStats": "ホストメトリクス",
"hostMetrics": "ホストメトリクス",
"noNodes": "ノードはまだありません"
},
"docker": {
"notEnabled": "このホストではDockerが有効になっていません",
"validating": "Dockerを検証中...",
"connecting": "接続中...",
"error": "エラー",
"version": "{{runtime}} {{version}}",
"connectionFailed": "Dockerへの接続に失敗しました",
"containerStarted": "コンテナ {{name}} が起動しました",
"failedToStartContainer": "コンテナ {{name}} の起動に失敗しました",
"containerStopped": "コンテナ {{name}} が停止しました",
"failedToStopContainer": "コンテナ {{name}} の停止に失敗しました",
"containerRestarted": "コンテナ {{name}} が再起動しました",
"failedToRestartContainer": "コンテナ {{name}} の再起動に失敗しました",
"containerPaused": "コンテナ {{name}} が一時停止しました",
"containerUnpaused": "コンテナ {{name}} の一時停止が解除されました",
"failedToTogglePauseContainer": "コンテナ {{name}} の一時停止状態の切り替えに失敗しました",
"containerRemoved": "コンテナ {{name}} が削除されました",
"failedToRemoveContainer": "コンテナ {{name}} の削除に失敗しました",
"image": "イメージ",
"ports": "ポート",
"noPorts": "ポートなし",
"start": "起動",
"confirmRemoveContainer": "コンテナ '{{name}}' を削除してもよろしいですか? この操作は元に戻せません。",
"runningContainerWarning": "警告: このコンテナは現在実行中です。削除すると、まずコンテナが停止されます。",
"loadingContainers": "コンテナを読み込み中...",
"manager": "Docker マネージャー",
"autoRefresh": "自動更新",
"timestamps": "タイムスタンプ",
"lines": "行数",
"filterLogs": "ログをフィルター...",
"refresh": "再読み込み",
"download": "ダウンロード",
"clear": "クリア",
"logsDownloaded": "ログのダウンロードに成功しました",
"last50": "直近50件",
"last100": "直近100件",
"last500": "直近500件",
"last1000": "直近1000件",
"allLogs": "すべてのログ",
"noLogsMatching": "検索条件 \"{{query}}\" に一致するログはありません",
"noLogsAvailable": "利用可能なログはありません",
"noContainersFound": "コンテナが見つかりません",
"noContainersFoundHint": "このホストには利用可能なDockerコンテナがありません",
"searchPlaceholder": "コンテナを検索...",
"allStatuses": "すべての状態",
"stateRunning": "実行中",
"statePaused": "一時停止中",
"stateExited": "終了済み",
"stateRestarting": "再起動中",
"noContainersMatchFilters": "条件に一致するコンテナはありません",
"noContainersMatchFiltersHint": "検索条件またはフィルター条件を調整してください",
"failedToFetchStats": "コンテナの統計情報の取得に失敗しました",
"containerNotRunning": "コンテナが実行されていません",
"startContainerToViewStats": "統計情報を表示するにはコンテナを起動してください",
"loadingStats": "統計情報を読み込み中...",
"errorLoadingStats": "統計情報の読み込みエラー",
"noStatsAvailable": "利用可能な統計情報はありません",
"cpuUsage": "CPU使用率",
"current": "現在",
"memoryUsage": "メモリ使用量",
"networkIo": "ネットワークI/O",
"input": "受信",
"output": "出力",
"blockIo": "ブロック I/O",
"read": "読み取り",
"write": "書き込み",
"pids": "PIDs",
"containerInformation": "コンテナ情報",
"name": "名前",
"id": "ID",
"state": "状態",
"containerMustBeRunning": "コンソールにアクセスするにはコンテナが実行中である必要があります",
"verificationCodePrompt": "認証コードを入力してください",
"totpVerificationFailed": "TOTP認証に失敗しました。もう一度お試しください。",
"warpgateVerificationFailed": "Warpgate認証に失敗しました。もう一度お試しください。",
"connectedTo": "{{containerName}}に接続しました",
"disconnected": "切断されました",
"consoleError": "コンソールエラー",
"errorMessage": "エラー: {{message}}",
"failedToConnect": "コンテナに接続できませんでした",
"console": "コンソール",
"selectShell": "シェルを選択",
"bash": "Bash",
"sh": "sh",
"ash": "ash",
"connect": "接続",
"disconnect": "切断",
"notConnected": "未接続",
"clickToConnect": "接続ボタンをクリックしてシェルセッションを開始",
"connectingTo": "{{containerName}}に接続中...",
"containerNotFound": "コンテナが見つかりません",
"backToList": "一覧に戻る",
"logs": "ログ",
"stats": "統計",
"consoleTab": "コンソール",
"startContainerToAccess": "コンテナを起動してコンソールにアクセスしてください"
},
"admin": {
"sectionGeneral": "全般",
"sectionOidc": "OIDC",
"sectionSso": "SSOプロバイダー",
"ssoAddProvider": "追加",
"ssoDocsLink": "ドキュメントを表示",
"ssoProviderDocsLink": "ドキュメントを表示",
"ssoNoProviders": "SSOプロバイダーが設定されていません。",
"ssoProviderName": "表示名",
"ssoProviderType": "プロバイダータイプ",
"ssoDeleteProvider": "削除",
"ssoDeleteConfirm": "このプロバイダーを削除しますか?関連付けられているユーザーはログインできなくなります。",
"ssoTypeOidc": "OIDC",
"ssoTypeLdap": "LDAP",
"ssoTypeGithub": "GitHub",
"ssoTypeGoogle": "Google",
"ssoEnabled": "有効",
"ssoDisabled": "無効",
"ssoSaveProvider": "保存",
"ssoTestConnection": "接続テスト",
"ssoEditProvider": "編集",
"ldapHost": "LDAPホスト",
"ldapPort": "ポート",
"ldapUseTls": "TLS (LDAPS) を使用",
"ldapBindDn": "バインドDN",
"ldapBindPassword": "バインドパスワード",
"ldapUserSearchBase": "ユーザー検索ベース",
"ldapUserSearchFilter": "ユーザー検索フィルター",
"ldapUsernameAttr": "ユーザー名属性",
"ldapDisplayNameAttr": "表示名属性",
"ldapGroupSearchBase": "グループ検索ベース",
"ldapAdminGroup": "管理者グループ",
"ldapAllowedUsers": "許可ユーザー",
"sectionUsers": "ユーザー",
"sectionSessions": "セッション",
"sectionRoles": "ロール",
"sectionDatabase": "データベース",
"sectionApiKeys": "APIキー",
"sectionAuditLog": "監査ログ",
"sectionSsl": "SSL / Let's Encrypt",
"sectionTouchInput": "タッチ入力",
"touchEnabled": "タッチ入力を有効にする",
"touchEnabledDesc": "端末で指一本でのスクロールを可能にする",
"touchMomentumEnabled": "勢いを加速させる",
"touchMomentumEnabledDesc": "スワイプ後、少しスクロールを続ける",
"touchAdvanced": "高度な",
"touchDragThreshold": "ドラッグしきい値",
"touchMaxWheelDelta": "最大ホイールデルタ",
"touchMomentumSampleWindow": "モメンタムサンプルウィンドウ",
"touchReleaseGracePeriod": "釈放猶予期間",
"touchMinimumVelocity": "最小速度",
"touchMaximumVelocity": "最大速度",
"touchMaximumDuration": "最大持続時間",
"touchMaximumTravel": "最大移動距離",
"touchDecayTime": "減衰時間",
"touchPixelsPerTick": "ピクセル/ティック",
"touchMaximumFrameInterval": "最大フレーム間隔",
"touchMaximumTicksPerFrame": "フレームあたりの最大ティック数",
"touchResetDefaults": "初期設定に戻す",
"touchSaved": "タッチ入力設定が保存されました",
"touchSaveFailed": "タッチ入力設定の保存に失敗しました",
"sectionImageStorage": "画像ストレージ",
"imageStorageMode": "ストレージモード",
"imageStorageModeDesc": "貼り付けおよびアップロードされた端末イメージが書き込まれる場所。接続による自動選択、ローカルおよびリモート(SFTP)が固定されています。",
"imageStorageModeAuto": "自動",
"imageStorageModeLocal": "地元",
"imageStorageModeRemoteSftp": "リモート(SFTP)",
"imageStorageLocalDir": "ローカルディレクトリ",
"imageStorageLocalDirDesc": "Termixバックエンド上の絶対パス。セキュリティ上の理由から、保存後は表示されません。",
"imageStorageLocalDirPlaceholder": "最新情報を維持するには空欄のままにしてください",
"imageStorageHostPath": "ホストパス",
"imageStorageHostPathDesc": "端末エージェントが受信するローカルディレクトリのホスト側ビュー。",
"imageStorageTtl": "TTL(ミリ秒)",
"imageStorageMaxCount": "最大画像数",
"imageStorageMaxBytes": "最大ストレージバイト数",
"imageStorageSaved": "画像保存設定が保存されました",
"imageStorageSaveFailed": "画像保存設定の保存に失敗しました",
"imageStorageInstanceId": "端末セッションインスタンスID",
"imageStorageInstanceIdDesc": "表示されている可視性をテストするために使用される、接続されているターミナルタブのいずれかのインスタンスID。",
"imageStorageInstanceIdRequired": "まず、ターミナルセッションインスタンスIDを入力してください。",
"imageStorageTest": "テスト",
"imageStorageTesting": "テスト中...",
"imageStorageTestFailed": "画像ストレージのテストに失敗しました",
"imageStorageTestConnected": "端末セッションが接続されました。",
"imageStorageTestNotConnected": "このインスタンスIDで接続されている端末セッションはありません。",
"imageStorageTestSelectedMode": "アップロードには以下を使用します: {{mode}}",
"imageStorageSelectedModeUnavailable": "利用不可",
"imageStorageTestLocalVisible": "ローカルディレクトリは、接続されているホストから参照可能です。",
"imageStorageTestLocalNotVisible": "ローカルディレクトリは、接続されているホストからアクセスできません。",
"sectionBranding": "ホワイトラベル",
"brandingAppName": "アプリケーション名",
"brandingAppNameDesc": "ログイン画面とブラウザタブに表示されます。「Termix」を使用する場合は空欄のままにしてください。",
"brandingTagline": "タグライン",
"brandingTaglineDesc": "ログイン画面のアプリケーション名の下に表示されます。空欄のままにすると、デフォルトのキャッチフレーズが使用されます。",
"brandingLogo": "ロゴ",
"brandingLogoDesc": "PNG、JPEG、またはWEBP形式、最大750KB。ログイン画面とブラウザタブのデフォルトアイコンを置き換えます。",
"brandingLogoUpload": "ロゴをアップロード",
"brandingLogoReset": "初期設定に戻す",
"brandingLogoInvalid": "無効な画像です。750KB以下のPNG、JPEG、またはWEBPファイルを使用してください。",
"brandingSaved": "ブランド設定が保存されました",
"brandingSaveFailed": "ブランド設定の保存に失敗しました",
"sslDescription": "Let's Encryptから信頼できるSSL証明書を自動的に発行・更新します。公開ドメインとポート80、またはDNSアクセスが必要です。",
"sslDocsLink": "SSLドキュメントを表示",
"sslDomain": "ドメイン",
"sslDomainPlaceholder": "termix.example.com",
"sslDomainDesc": "証明書の公開ドメイン名。",
"sslEmail": "メールアドレス",
"sslEmailPlaceholder": "admin@example.com",
"sslEmailDesc": "Let's Encryptの通知およびアカウント用の連絡先メールアドレス。",
"sslChallengeType": "チャレンジタイプ",
"sslChallengeTypeDesc": "Let's Encryptにドメイン所有権を証明する方法。",
"sslChallengeHttp": "HTTP(webroot)- インターネットからポート80にアクセスできる必要があります",
"sslChallengeDns": "DNS(Cloudflare)- Cloudflare APIトークンが必要です",
"sslCloudflareToken": "Cloudflare APIトークン",
"sslCloudflareTokenPlaceholder": "トークンを入力...",
"sslCloudflareTokenDesc": "ドメインに対するZone:DNS:Edit権限を持つスコープ付きトークン。",
"sslCertStatus": "証明書ステータス",
"sslCertStatusNone": "証明書なし",
"sslCertStatusValid": "有効",
"sslCertStatusExpiring": "間もなく期限切れ",
"sslCertStatusExpired": "期限切れ",
"sslCertExpiresAt": "有効期限 {{date}}",
"sslLastIssued": "最終発行日 {{date}}",
"sslRequestCert": "証明書を発行/更新",
"sslRequestCertLoading": "証明書をリクエスト中...",
"sslRequestCertSuccess": "証明書が正常に発行され、インストールされました",
"sslRequestCertFailed": "証明書リクエストに失敗しました",
"sslSave": "設定を保存",
"sslSaved": "SSL設定が保存されました",
"sslSaveFailed": "SSL設定の保存に失敗しました",
"sslRequiresDomain": "ドメインとメールアドレスが必要です",
"sslInfoNote": "証明書の発行またはアップロード後、Termixは既存のHTTPポートに加えて、SSL_PORT(デフォルトは8443)でHTTPSを自動的に有効にします。このポートがコンテナに公開/マッピングされ、アクセス可能であることを確認してください。",
"sslManualOption": "手動(証明書のアップロード)",
"sslManualCert": "証明書(PEM)",
"sslManualCertPlaceholder": "-----証明書開始-----",
"sslManualKey": "秘密鍵(PEM形式)",
"sslManualKeyPlaceholder": "-----秘密鍵開始-----",
"sslManualDesc": "既存の証明書と秘密鍵を貼り付けてください。認証局(CA)が必要とする場合は、証明書チェーン全体も添付してください。",
"sslManualUpload": "証明書のアップロードとインストール",
"sslManualUploadLoading": "証明書をアップロードしています...",
"sslManualUploadSuccess": "証明書のアップロードとインストールが正常に完了しました。",
"sslManualUploadFailed": "証明書のアップロードに失敗しました",
"sslManualRequiresFields": "証明書と秘密鍵が必要です",
"auditLogTotal": "全{{total}}件",
"auditLogEmpty": "監査ログエントリが見つかりません",
"auditLogSuccess": "成功",
"auditLogFailed": "失敗",
"auditLogClearFilters": "フィルターをクリア",
"auditLogPage": "{{page}} / {{totalPages}} ページ (全 {{total}} 件)",
"auditLogIp": "IP",
"auditLogResourceId": "リソースID",
"auditLogFilterUser": "ユーザー",
"auditLogFilterAction": "アクション",
"auditLogFilterResourceType": "リソース種別",
"auditLogFilterStatus": "ステータス",
"auditLogFilterFrom": "開始",
"auditLogFilterTo": "終了",
"auditLogFilterAll": "すべて",
"allowRegistration": "ユーザー登録を許可",
"allowRegistrationDesc": "新規ユーザーがユーザー名とパスワードで自己登録できます",
"allowPasswordLogin": "パスワードログインを許可",
"allowPasswordLoginDesc": "ユーザー名/パスワードログイン",
"oidcAutoProvision": "OIDC自動プロビジョニング",
"oidcAutoProvisionDesc": "初回ログイン時にOIDC/SSOユーザーのアカウントを自動作成します(登録のトグルとは独立)",
"oidcSilentLoginDefault": "デフォルトでサイレントOIDCログイン",
"oidcSilentLoginDefaultDesc": "アクセス時に自動でOIDCログインにリダイレクトし、ログインフォームを完全にスキップします",
"oidcSilentLoginDefaultLockedDesc": "この設定は環境変数 OIDC_SILENT_LOGIN_DEFAULT によってロックされているため、ここで変更することはできません。",
"allowPasswordReset": "パスワードリセットを許可",
"allowPasswordResetDesc": "リセットコードをDockerログから取得",
"commandHistoryEnabled": "コマンド履歴",
"commandHistoryEnabledDesc": "コマンド履歴の記録を許可します。無効にすると、ホストごとの設定に関わらず履歴は保存されません。",
"updateCommandHistoryFailed": "コマンド履歴設定の更新に失敗しました",
"analyticsEnabled": "匿名利用統計を共有する",
"analyticsEnabledDesc": "Termixの改善に役立てるため、ユーザー数、ホスト数、機能使用状況に関する匿名データを毎日送信します。個人データや接続情報は一切含まれません。",
"analyticsEnabledLockedDesc": "この設定は環境変数ENABLE_TELEMETRYによってロックされているため、ここで変更することはできません。",
"updateAnalyticsFailed": "分析設定の更新に失敗しました",
"sessionSharingGloballyEnabled": "セッション共有を許可する",
"auditForwardingTitle": "SIEMへ転送",
"auditForwardingDesc": "すべての監査エントリのコピーをNDJSON形式で外部の収集業者に送信します。ローカルログは真の情報源として保持されます。",
"auditForwardingEnvNotice": "環境変数でも転送設定を行うことができます。ここに保存されたURLが優先されます。",
"auditForwardingToken": "ベアラートークン(任意)",
"auditForwardingTokenStored": "ベアラートークン(保存済み)",
"auditForwardingSaved": "監査転送設定が保存されました",
"auditForwardingSaveError": "監査転送設定の保存に失敗しました",
"sessionSharingGloballyEnabledDesc": "ライブターミナル、RDP、VNC、およびTelnetセッションをインスタンス全体で共有できるようにします。無効にすると、ホストごとの共有設定がすべて上書きされます。",
"updateSessionSharingFailed": "セッション共有設定の更新に失敗しました",
"sessionTimeout": "セッションタイムアウト",
"hours": "時間",
"sessionTimeoutRange": "最小1時間・最大720時間",
"monitoringDefaults": "監視のデフォルト",
"statusCheck": "ステータスチェック",
"metrics": "メトリクス",
"sec": "秒",
"logLevel": "ログレベル",
"enableGuacamole": "Guacamoleを有効にする",
"enableGuacamoleDesc": "RDP/VNCリモートデスクトップ",
"enableGuacamoleDocsLink": "ドキュメントを見る",
"guacdUrl": "guacd URL",
"tailscaleApiKey": "Tailscale APIキー",
"tailscaleApiKeyDescription": "ホストエディタでのデバイス検出に使用されます。Tailscale (tskey-) および Headscale (hskey-) キーをサポートしています。キーは tailscale.com/admin/settings/keys または Headscale インスタンスから生成できます。",
"tailscaleApiKeyDocsLink": "ドキュメントを見る",
"tailscaleApiBaseUrl": "APIベースURL",
"tailscaleApiBaseUrlDescription": "オプション。api.tailscale.comの代わりに、自己ホスト型のHeadscaleインスタンスを指定します。空欄のままにすると、Tailscaleのデフォルト設定が使用されます。",
"oidcDescription": "SSO用のOpenID Connectを設定します。*マークのフィールドは必須です。",
"oidcDocsLink": "ドキュメントを見る",
"oidcClientId": "クライアントID",
"oidcClientSecret": "クライアントシークレット",
"oidcAuthUrl": "認証URL",
"oidcIssuerUrl": "発行者URL",
"oidcTokenUrl": "トークンURL",
"oidcUserIdentifier": "ユーザー識別子パス",
"oidcDisplayName": "表示名パス",
"oidcScopes": "スコープ",
"oidcUserinfoUrl": "Userinfo URLの上書き",
"oidcAllowedUsers": "許可ユーザー",
"oidcAllowedUsersDesc": "1行に1つのメールアドレス。空の場合は全員許可。",
"oidcAdminGroup": "管理者グループ",
"oidcAdminGroupDesc": "このグループのユーザーは管理者権限が付与されます。空にするとグループ同期は無効です。",
"oidcGroupClaim": "グループクレーム",
"oidcGroupClaimDesc": "オプション。ユーザーのグループを含むクレームパス。デフォルトは groups, roles, group の順。カスタムクレームを使うプロバイダー用 (例: Zitadel)。",
"oidcCaCert": "カスタムCA証明書",
"oidcCaCertDesc": "オプション。プライベートまたは自己署名CAを使用するOIDCプロバイダー用のPEMエンコードCA証明書。空の場合はシステムの信頼ストアを使用。",
"removeOidc": "削除",
"usersCount": "{{count}}人のユーザー",
"searchUsers": "ユーザーを検索...",
"noUsers": "ユーザーなし",
"noUsersMatch": "検索条件に一致するユーザーは見つかりませんでした。",
"pageOf": "ページ {{page}} / {{total}}",
"createUser": "作成",
"newRole": "新しいロール",
"roleName": "名前",
"roleDisplayName": "表示名",
"roleDescription": "説明",
"rolesCount": "{{count}}個のロール",
"createRole": "作成",
"creating": "作成中...",
"exportDatabase": "データベースをエクスポート",
"exportDatabaseDesc": "すべてのホスト、認証情報、および設定のポータブルな SQLite バックアップをダウンロードします",
"export": "エクスポート",
"exporting": "エクスポート中...",
"importDatabase": "データベースをインポート",
"importDatabaseDesc": "任意のデータベースバックエンド上のポータブルな.sqliteバックアップから復元します。",
"importDatabaseSelected": "選択済み: {{name}}",
"selectFile": "ファイルを選択",
"changeFile": "変更",
"import": "インポート",
"importing": "インポート中...",
"apiKeysCount": "{{count}} キー",
"apiKeysDocsLink": "ドキュメントを表示",
"apiKeysCliHint": "Termix CLIでAPIキーを使用すると、ターミナルからサーバーを管理できます。",
"apiKeysCliLink": "CLIドキュメントを見る",
"newApiKey": "新規APIキー",
"apiKeyCreatedWarning": "キーが作成されました。すぐにコピーしてください。再度表示されません。",
"apiKeyName": "名前",
"apiKeyUser": "ユーザー",
"apiKeySelectUser": "ユーザーを選択...",
"apiKeyExpiresAt": "有効期限",
"createKey": "キーを作成",
"apiKeyNoExpiry": "期限なし",
"revokedBadge": "失効",
"authTypeDual": "二要素認証",
"authTypeOidc": "OIDC",
"authTypeLocal": "ローカル",
"adminStatusAdministrator": "管理者",
"adminStatusRegularUser": "一般ユーザー",
"adminBadge": "管理者",
"systemBadge": "システム",
"customBadge": "カスタム",
"youBadge": "自分",
"sessionsActive": "{{count}} 件アクティブ",
"sessionActive": "アクティブ: {{time}}",
"sessionExpires": "有効期限: {{time}}",
"revokeAll": "すべて",
"revokeAllSessionsSuccess": "ユーザーの全セッションを無効化しました",
"revokeAllSessionsFailed": "セッションの無効化に失敗しました",
"revokeSessionFailed": "セッションの無効化に失敗しました",
"addRole": "ロール追加",
"noCustomRoles": "カスタムロールが定義されていません",
"removeRoleFailed": "ロールの削除に失敗しました",
"assignRoleFailed": "ロールの割り当てに失敗しました",
"deleteRoleFailed": "ロールの削除に失敗しました",
"userAdminAccess": "管理者",
"userAdminAccessDesc": "すべての管理設定への完全なアクセス権",
"userRoles": "ロール",
"revokeAllUserSessions": "すべてのセッションを無効化",
"revokeAllUserSessionsDesc": "すべてのデバイスで再ログインを強制します",
"revoke": "無効化",
"deleteUserWarning": "このユーザーを削除すると元に戻せません。",
"deleteUser": "{{username}} を削除",
"deleting": "削除中...",
"deleteUserFailed": "ユーザーの削除に失敗しました",
"deleteUserSuccess": "ユーザー \"{{username}}\" を削除しました",
"deleteRoleSuccess": "ロール \"{{name}}\" を削除しました",
"revokeKeySuccess": "キー \"{{name}}\" を無効化しました",
"revokeKeyFailed": "キーの無効化に失敗しました",
"copiedToClipboard": "クリップボードにコピーしました",
"done": "完了",
"createUserTitle": "ユーザー作成",
"createUserDesc": "新しいローカルアカウントを作成します。",
"createUserUsername": "ユーザー名",
"createUserPassword": "パスワード",
"createUserPasswordHint": "6文字以上",
"createUserEnterUsername": "ユーザー名を入力",
"createUserEnterPassword": "パスワードを入力",
"createUserSubmit": "ユーザーを作成",
"editUserTitle": "ユーザー管理: {{username}}",
"editUserDesc": "ロール、管理者ステータス、セッション、アカウント設定を編集します。",
"editUserUsername": "ユーザー名",
"editUserAuthType": "認証タイプ",
"editUserAdminStatus": "管理者ステータス",
"editUserUserId": "ユーザーID",
"linkAccountTitle": "アカウントのリンク",
"linkAccountDesc": "OIDCアカウント {{username}} を既存のローカルアカウントに統合します。",
"linkAccountDescLocal": "ローカルアカウント {{username}} を既存のOIDC専用アカウントにリンクします。",
"linkAccountWarningTitle": "以下の処理が実行されます:",
"linkAccountEffect1": "OIDC専用アカウントを削除",
"linkAccountEffect2": "対象アカウントにOIDCログインを追加",
"linkAccountEffect3": "OIDCとパスワードの両方でログイン可能にする",
"linkAccountTargetUsername": "ローカルアカウントのユーザー名",
"linkAccountTargetPlaceholder": "リンク先のローカルアカウントのユーザー名を入力",
"linkAccountOidcUsername": "OIDCアカウントのユーザー名",
"linkAccountOidcPlaceholder": "統合するOIDC専用アカウントのユーザー名を入力",
"linkAccountOidcNotFound": "そのユーザー名のOIDC専用アカウントは見つかりませんでした",
"linkAccounts": "アカウントをリンク",
"linkAccountSuccess": "アカウントのリンクに成功しました",
"linkAccountFailed": "アカウントのリンクに失敗しました",
"linkAccountInProgress": "リンク中...",
"unlinkAccountTitle": "OIDCリンク解除",
"unlinkAccountDesc": "{{username}} からOIDC認証を削除します。パスワードでのみログイン可能になります。",
"unlinkAccountWarning": "このアカウントからOIDCログインが削除されます。引き続きログインするにはパスワードが設定されている必要があります。",
"unlinkAccount": "OIDCリンク解除",
"unlinkAccountInProgress": "リンク解除中...",
"unlinkAccountSuccess": "OIDCリンク解除に成功しました",
"unlinkAccountFailed": "OIDCリンク解除に失敗しました",
"saving": "保存中...",
"updateRegistrationFailed": "登録設定の更新に失敗しました",
"updatePasswordLoginFailed": "パスワードログイン設定の更新に失敗しました",
"cannotDisablePasswordLoginWithTotp": "1人以上のユーザーで2FAが有効な間はパスワードログインを無効にできません。最初に2FAを無効にしてください。",
"updateOidcAutoProvisionFailed": "OIDC自動プロビジョニング設定の更新に失敗しました",
"updateOidcSilentLoginDefaultFailed": "サイレントOIDCログイン設定の更新に失敗しました",
"updatePasswordResetFailed": "パスワードリセット設定の更新に失敗しました",
"sessionTimeoutRange2": "セッションタイムアウトは1時間から720時間の間である必要があります",
"sessionTimeoutSaved": "セッションタイムアウトを保存しました",
"sessionTimeoutSaveFailed": "セッションタイムアウトの保存に失敗しました",
"monitoringIntervalInvalid": "無効な間隔値です",
"monitoringSaved": "監視設定を保存しました",
"monitoringSaveFailed": "監視設定の保存に失敗しました",
"metricsHistoryRetention": "メトリクス履歴保持期間",
"metricsHistoryRetentionRange": "1〜90日",
"days": "日",
"guacamoleSaved": "Guacamole設定を保存しました",
"guacamoleSaveFailed": "Guacamole設定の保存に失敗しました",
"guacamoleUpdateFailed": "Guacamole設定の更新に失敗しました",
"tailscaleSettingsSaved": "Tailscale設定を保存しました",
"tailscaleSettingsSaveFailed": "Tailscale設定の保存に失敗しました",
"logLevelUpdateFailed": "ログレベルの更新に失敗しました",
"oidcSaved": "OIDC設定を保存しました",
"oidcSaveFailed": "OIDC設定の保存に失敗しました",
"oidcRemoved": "OIDC設定を削除しました",
"oidcRemoveFailed": "OIDC設定の削除に失敗しました",
"createUserRequired": "ユーザー名とパスワードが必要です",
"createUserPasswordTooShort": "パスワードは6文字以上必要です",
"createUserSuccess": "ユーザー \"{{username}}\" を作成しました",
"createUserFailed": "ユーザーの作成に失敗しました",
"updateAdminStatusFailed": "管理者権限の更新に失敗しました",
"allSessionsRevoked": "すべてのセッションを破棄しました",
"revokeSessionsFailed": "セッションの破棄に失敗しました",
"manageUserData": "ユーザーデータの管理",
"backToUsers": "ユーザー一覧に戻る",
"manageTabAccount": "アカウント",
"manageTabHosts": "ホスト",
"manageTabCredentials": "認証情報",
"manageTabSnippets": "スニペット",
"manageTabSessions": "セッション",
"manageTabDanger": "危険",
"manageEditorBack": "{{username}}のデータに戻る",
"dataLockedBadge": "ロック済み",
"dataLockedNotice": "{{username}} のデータは次回ログインまでロックされたままです。それまで、ホスト、認証情報、スニペットの閲覧や編集はできません。",
"resetPasswordTitle": "パスワードをリセット",
"resetPasswordOidcOnly": "このユーザーは外部プロバイダー経由でサインインしており、パスワードはありません。",
"resetPasswordPlaceholder": "新しいパスワード",
"resetPasswordBtn": "リセット",
"resetPasswordWorking": "リセット中...",
"resetPasswordSuccess": "パスワードがリセットされました",
"resetPasswordSuccessWiped": "パスワードがリセットされました。ユーザーの暗号化データは消去されました。",
"resetPasswordFailed": "パスワードのリセットに失敗しました",
"resetPasswordConfirmWipe": "{{username}} は暗号化アップグレード以降にログインしていないため、データを復旧できません。今リセットするとホスト、認証情報、スニペットが削除されます。続行しますか?",
"totpSectionTitle": "二要素認証",
"totpStatusEnabled": "このユーザーはTOTPが有効です",
"totpStatusDisabled": "このユーザーはTOTPが無効です",
"disableTotp": "無効化",
"disableTotpConfirm": "{{username}} の二要素認証を無効にしますか? パスワードのみでログインできるようになります。",
"totpDisabledSuccess": "TOTPが無効化されました",
"totpDisableFailed": "TOTPの無効化に失敗しました",
"manageApiKeys": "APIキー",
"apiKeyNamePlaceholder": "キー名",
"apiKeyCopyNotice": "このキーを今コピーしてください。再度表示されません。",
"noApiKeysForUser": "APIキーがありません",
"apiKeyDeleteFailed": "APIキーの削除に失敗しました",
"exportUserData": "データエクスポート",
"exportUserDataDesc": "このユーザーのホスト、認証情報、ファイルマネージャーデータをJSONでダウンロードします。シークレットは復号化されます。",
"exportUserDataSuccess": "ユーザーデータがエクスポートされました",
"exportUserDataFailed": "ユーザーデータのエクスポートに失敗しました",
"hostsCount": "{{count}} ホスト",
"addHostForUser": "ホストを追加",
"noHostsForUser": "このユーザーにはホストがありません",
"connectToHost": "接続",
"deleteHostConfirm": "{{username}} のホスト \"{{name}}\" を削除しますか?",
"hostDeletedSuccess": "ホストが削除されました",
"hostDeleteFailed": "ホストの削除に失敗しました",
"credentialsCount": "{{count}} 認証情報",
"addCredentialForUser": "認証情報を追加",
"noCredentialsForUser": "このユーザーには資格情報がありません",
"deleteCredentialConfirm": "{{username}} に属する資格情報 \"{{name}}\" を削除しますか?",
"credentialDeletedSuccess": "資格情報を削除しました",
"credentialDeleteFailed": "資格情報の削除に失敗しました",
"snippetsCount": "{{count}} 個のスニペット",
"addSnippetForUser": "スニペットを追加",
"noSnippetsForUser": "このユーザーはスニペットを持っていません",
"snippetRequiredFields": "スニペット名と内容は必須です",
"snippetNamePlaceholder": "スニペット名",
"snippetContentPlaceholder": "コマンドの内容",
"snippetFolderPlaceholder": "フォルダー (任意)",
"snippetSaved": "スニペットを保存しました",
"snippetSaveFailed": "スニペットの保存に失敗しました",
"deleteSnippetConfirm": "{{username}} に属するスニペット \"{{name}}\" を削除しますか?",
"snippetDeletedSuccess": "スニペットを削除しました",
"snippetDeleteFailed": "スニペットの削除に失敗しました",
"noSessionsForUser": "アクティブなセッションはありません",
"deleteSuccessorLabel": "ホストと認証情報を渡す",
"deleteSuccessorMe": "私(削除担当管理者)",
"deleteSuccessorNone": "誰もいない — 削除してください",
"deleteSuccessorDesc": "このユーザーが共有したすべてのコンテンツは、新しい所有者の下でも引き続き機能します。「nobody」を選択すると、ホスト、認証情報、共有フォルダがすべて削除されます。",
"deleteUserDangerDesc": "{{username}} とそのすべてのデータ (ホスト、資格情報、スニペット、履歴) を完全に削除します。この操作は元に戻せません。",
"deleteUserConfirm": "{{username}} とそのすべてのデータを完全に削除しますか?",
"deleteUserAdminBlocked": "このユーザーを削除する前に管理者権限を解除してください。",
"createRoleRequired": "名前と表示名は必須です",
"createRoleSuccess": "ロール \"{{name}}\" が作成されました",
"createRoleFailed": "ロールの作成に失敗しました",
"apiKeyNameRequired": "キー名は必須です",
"apiKeyUserRequired": "ユーザー ID は必須です",
"apiKeyCreatedSuccess": "API キー \"{{name}}\" が作成されました",
"apiKeyCreateFailed": "API キーの作成に失敗しました",
"exportSuccess": "データベースのエクスポートに成功しました",
"exportFailed": "データベースのエクスポートに失敗しました",
"importSelectFile": "最初にファイルを選択してください",
"importCompleted": "インポートが完了しました: {{total}} 件をインポートし、{{skipped}} 件をスキップしました",
"importFailed": "インポートに失敗しました: {{error}}",
"importError": "データベースのインポートに失敗しました",
"sectionHostDefaults": "ホストのデフォルト設定",
"hostDefaultsDesc": "新しいホストを作成するときに自動的に適用される設定です。個別のホストで上書き可能です。",
"hostDefaultsSocks5": "SOCKS5 プロキシ",
"hostDefaultsUseSocks5": "SOCKS5 プロキシを有効にする",
"hostDefaultsUseSocks5Desc": "すべての新規ホストで SOCKS5 プロキシを事前入力する",
"hostDefaultsSocks5Host": "プロキシホスト / ポート",
"hostDefaultsSocks5Username": "プロキシユーザー名",
"hostDefaultsSocks5Password": "プロキシパスワード",
"hostDefaultsMetrics": "ホストメトリクス",
"hostDefaultsMetricsEnabled": "メトリクスを有効にする",
"hostDefaultsMetricsEnabledDesc": "デフォルトで新規ホストのCPU、メモリなどの統計情報を収集する",
"hostDefaultsStatusCheckEnabled": "ステータスチェックを有効にする",
"hostDefaultsStatusCheckEnabledDesc": "デフォルトで新規ホストのオンライン/オフライン状態をポーリングする",
"hostDefaultsTerminal": "ターミナル",
"hostDefaultsAutoTmux": "Auto-Tmux",
"hostDefaultsAutoTmuxDesc": "tmux内で新しいホストのターミナルを実行することで、セッションが切断後も維持されます(ホストにtmuxがインストールされている必要があります)。",
"terminalSessionTimeout": "端末セッションの永続性",
"terminalSessionTimeoutDesc": "切断された端末がサーバー上で閉じられるまでの時間。最小1分、最大1440分。この時間を超えてセッションを継続する必要がある場合は、ホスト上でAuto-Tmuxを有効にしてください。",
"terminalSessionTimeoutRange": "1~1440分の間の値を入力してください。",
"terminalSessionTimeoutSaved": "端末セッションの永続性が保存されました",
"terminalSessionTimeoutSaveFailed": "端末セッションの永続化を保存できませんでした",
"minutes": "分",
"hostDefaultsSessionLogging": "セッションロギング",
"hostDefaultsSessionLoggingDesc": "デフォルトで新規ホストのターミナルセッションを記録する",
"hostDefaultsCommandHistory": "コマンド履歴",
"hostDefaultsCommandHistoryDesc": "デフォルトで新規ホストのコマンド履歴を追跡する",
"hostDefaultsSaved": "ホストのデフォルト設定を保存しました",
"hostDefaultsSaveFailed": "ホストのデフォルト設定の保存に失敗しました",
"rolePermissions": {
"count": "{{count}} 件の権限",
"editAction": "権限を編集",
"loadError": "権限カタログの読み込みに失敗しました",
"saved": "ロールの権限を保存しました",
"saveError": "ロールの権限の保存に失敗しました",
"save": "保存",
"saving": "保存中..."
},
"aiGloballyEnabled": "AIアシスタント",
"aiGloballyEnabledDesc": "ユーザーがAIアシスタントをオンにできるようにします。オフになっている間は、アシスタントは非表示になり、誰からも利用できなくなります。",
"aiPrivateEndpoints": "プライベートAIホストを許可",
"aiPrivateEndpointsDesc": "ユーザーがプロバイダに指定できる、プライベートネットワーク上のホスト(自己ホスト型のOllamaなど)を指定します。カンマで区切ってください。",
"stepCa": "ステップCA",
"stepCaDesc": "smallstep CA から有効期限の短い SSH 証明書を発行します。CA の URL、ルートフィンガープリント (step ca bootstrap で表示されるもの)、および OIDC プロビジョナーの名前を入力し、ホストの認証タイプとして「Step CA」を選択します。3 つの項目すべてを空欄にすると無効になります。",
"stepCaFingerprint": "ルートフィンガープリント(SHA-256)",
"stepCaProvisioner": "OIDCプロビジョナー名",
"stepCaSaved": "ステップCAの設定が保存されました",
"stepCaSaveFailed": "ステップCAの設定を保存できませんでした",
"secretSourcePrivateEndpoints": "許可されたプライベートシークレットソースホスト",
"secretSourcePrivateEndpointsDesc": "秘密情報源(1Password Connectなど)が連絡を取る可能性のあるプライベートホスト。カンマで区切ってください。",
"updateSecretSourceEndpointsFailed": "シークレットソースエンドポイントの許可リストの更新に失敗しました",
"stepCaPrivateEndpoints": "許可されたプライベートStep CAホスト",
"stepCaPrivateEndpointsDesc": "プライベートホストの場合、Step CA 証明書フローは、認証局自体、および内部の場合は ID プロバイダーと連絡を取ることができます。これらはカンマで区切ってください。",
"updateStepCaEndpointsFailed": "Step CAエンドポイントの許可リストの更新に失敗しました",
"notificationPrivateEndpoints": "許可されたプライベート通知ホスト",
"notificationPrivateEndpointsDesc": "通知チャネルが接続する可能性のあるプライベートホストを正確に指定します。カンマで区切ってください。",
"updateNotificationEndpointsFailed": "通知エンドポイントの許可リストの更新に失敗しました",
"updateAiEnabledFailed": "AI設定を更新できませんでした",
"updateAiEndpointsFailed": "許可されたホストを更新できませんでした"
},
"newUi": {
"sidebar": {
"quickConnect": {
"hostLabel": "ホスト",
"hostPlaceholder": "192.168.1.1 または example.com",
"portLabel": "ポート",
"portPlaceholder": "22",
"usernameLabel": "ユーザー名",
"usernamePlaceholder": "ユーザー名",
"authLabel": "認証",
"passwordLabel": "パスワード",
"passwordPlaceholder": "パスワード",
"privateKeyLabel": "秘密鍵",
"privateKeyPlaceholder": "プライベートキーを貼り付け...",
"credentialLabel": "認証情報",
"credentialPlaceholder": "保存済み認証情報を選択",
"protocolLabel": "プロトコル",
"domainLabel": "ドメイン",
"domainPlaceholder": "オプション",
"connectToRdp": "RDP経由で接続する",
"connectToVnc": "VN経由で接続",
"connectToTerminal": "ターミナルに接続",
"connectToFiles": "ファイルに接続"
},
"history": {
"noTerminalSelected": "ターミナルが選択されていません",
"noTerminalSelectedHint": "SSH ターミナルタブを開いてコマンド履歴を表示",
"searchPlaceholder": "履歴を検索...",
"clearAll": "すべてクリア",
"noHistoryEntries": "履歴エントリがありません",
"trackingDisabled": "履歴の追跡が無効です",
"trackingDisabledHint": "ホストのターミナル設定で有効にしてください。"
},
"sshTools": {
"keyRecordingTitle": "キー記録",
"recordToTerminals": "ターミナルに記録",
"selectAll": "すべて",
"selectNone": "なし",
"noTerminalTabsOpen": "ターミナルタブが開いていません",
"selectTerminalsAbove": "上のターミナルを選択",
"broadcastInputPlaceholder": "ここに入力してキーをブロードキャスト...",
"fillPassword": "パスワードを自動入力",
"fillPasswordSuccess": "{{count}} 個のターミナルにパスワードを入力しました",
"fillPasswordMissing": "選択した {{count}} 個のターミナルに保存されたパスワードがありません",
"stopRecording": "記録停止",
"startRecording": "記録開始",
"settingsTitle": "設定",
"enableRightClickCopyPaste": "右クリックでのコピー/貼り付けを有効にする",
"copyOnSelect": "選択したテキストを自動的にコピーします"
},
"splitScreen": {
"layoutTitle": "レイアウト",
"selectLayoutAbove": "上のレイアウトを選択",
"selectLayoutHint": "表示するペインの数を選択",
"panesTitle": "ペイン",
"openTabsTitle": "開いているタブ",
"dragTabsHint": "タブを上のペインにドラッグするか、クイック割り当てを使用します",
"dropHere": "ここにドロップ",
"emptyPane": "空",
"dashboard": "ダッシュボード",
"clearSplitScreen": "分割画面をクリア",
"quickAssign": "クイック割り当て",
"alreadyAssigned": "ペイン {{index}}",
"splitTab": "タブを分割",
"addToSplit": "分割に追加",
"removeFromSplit": "分割から削除",
"assignToPane": "ペインに割り当て",
"hotkeysTitle": "キーボードショートカット",
"hotkeysSplitRight": "2分割表示の切り替え",
"hotkeysSplitBelow": "3分割表示の切り替え",
"hotkeysNavigatePane": "ペイン間の移動",
"hotkeysNextTab": "次のタブ",
"hotkeysPrevTab": "前のタブ",
"hotkeysJumpTab": "タブにジャンプ"
},
"snippets": {
"title": "スニペット",
"createSnippetTitle": "スニペットを作成",
"createSnippetDescription": "クイック実行用の新しいコマンドスニペットを作成します",
"nameLabel": "名前",
"namePlaceholder": "例: Nginxの再起動",
"descriptionLabel": "説明",
"descriptionPlaceholder": "任意の説明",
"optional": "任意",
"folderLabel": "フォルダ",
"noFolder": "フォルダなし (未分類)",
"commandLabel": "コマンド",
"commandPlaceholder": "例: sudo systemctl restart nginx",
"typeLabel": "タイプ",
"typeCommand": "指示",
"typeNote": "注記",
"noteLabel": "注記",
"notePlaceholder": "例えば、再利用可能なプロンプトまたはリマインダーテキスト",
"cancel": "キャンセル",
"createSnippetButton": "スニペットを作成",
"createFolderTitle": "フォルダを作成",
"createFolderDescription": "スニペットをフォルダに整理します",
"folderNameLabel": "フォルダ名",
"folderNamePlaceholder": "例: システムコマンド, Dockerスクリプト",
"folderColorLabel": "フォルダの色",
"folderIconLabel": "フォルダアイコン",
"previewLabel": "プレビュー",
"folderNameFallback": "フォルダ名",
"createFolderButton": "フォルダを作成",
"targetTerminals": "対象端末",
"selectAll": "すべて選択",
"selectNone": "すべて解除",
"noTerminalTabsOpen": "開いている端末タブはありません",
"searchPlaceholder": "スニペットを検索...",
"newSnippet": "新規スニペット",
"newFolder": "新規フォルダ",
"run": "実行",
"noSnippetsInFolder": "このフォルダにスニペットはありません",
"uncategorized": "未分類",
"editSnippetTitle": "スニペットの編集",
"editSnippetDescription": "このコマンドスニペットを更新",
"saveSnippetButton": "変更を保存",
"createSuccess": "スニペットが正常に作成されました",
"createFailed": "スニペットの作成に失敗しました",
"updateSuccess": "スニペットが正常に更新されました",
"updateFailed": "スニペットの更新に失敗しました",
"deleteFailed": "スニペットの削除に失敗しました",
"folderCreateSuccess": "フォルダが正常に作成されました",
"folderCreateFailed": "フォルダの作成に失敗しました",
"editFolderTitle": "フォルダの編集",
"editFolderDescription": "フォルダの名前や外観を変更",
"saveFolderButton": "変更を保存",
"editFolder": "フォルダを編集",
"deleteFolder": "フォルダを削除",
"folderDeleteSuccess": "フォルダ「{{name}}」を削除しました",
"folderDeleteFailed": "フォルダの削除に失敗しました",
"folderEditSuccess": "フォルダが正常に更新されました",
"folderEditFailed": "フォルダの更新に失敗しました",
"confirmRunMessage": "「{{name}}」を実行しますか?",
"confirmRunButton": "実行",
"runSuccess": "{{count}}個の端末で「{{name}}」を実行しました",
"pasteSuccess": "「{{name}}」を {{count}} 端末に貼り付けました",
"pasteToTerminal": "ペースト",
"copySuccess": "「{{name}}」をクリップボードにコピーしました",
"shareTitle": "スニペットを共有",
"shareUser": "ユーザー",
"shareRole": "ロール",
"selectUser": "ユーザーを選択...",
"selectRole": "ロールを選択...",
"shareSuccess": "スニペットが正常に共有されました",
"shareFailed": "スニペットの共有に失敗しました",
"revokeSuccess": "アクセスが取り消されました",
"revokeFailed": "アクセスの取り消しに失敗しました",
"currentAccess": "現在のアクセス権",
"shareLoadError": "共有データの読み込みに失敗しました",
"loading": "読み込み中...",
"close": "閉じる",
"reorderFailed": "スニペットの並び順の保存に失敗しました",
"importExport": "インポート / エクスポート",
"exportBtn": "JSONをエクスポート",
"importBtn": "JSONをインポート",
"exportSuccess": "スニペットが正常にエクスポートされました",
"exportFailed": "スニペットのエクスポートに失敗しました",
"importTitle": "スニペットのインポート",
"importDescription": "Termix がエクスポートした JSON ファイルからスニペットとフォルダーをインポートします",
"importDropOrClick": "JSON ファイルをここにドロップするか、クリックして参照",
"importSelectedFile": "選択中: {{name}}",
"importOverwrite": "同じ名前とフォルダーの既存スニペットを上書きする",
"importStartBtn": "インポート",
"importSuccess": "インポート完了: {{snippets}} 件のスニペット追加、{{updated}} 件更新、{{skipped}} 件スキップ、{{folders}} 件のフォルダー追加",
"importFailed": "スニペットのインポートに失敗しました",
"importInvalidFile": "無効なファイルです: snippets または folders 配列を含む JSON オブジェクトが必要です",
"targetHostsLabel": "ターゲットホスト",
"targetHostsHint": "このスニペットを端末を開かずに直接実行するホストを割り当てます。",
"noHostsAvailable": "設定されたホストがありません",
"clearTargetHosts": "すべてクリア",
"hasTargetHosts": "ターゲットホストあり",
"runOnTargets": "ターゲットで実行",
"directRunSuccess": "\"{{name}}\" を {{count}} 台のホストで実行しました",
"directRunPartialFail": "\"{{name}}\" が1つ以上のホストで失敗しました",
"executionResultTitle": "実行結果: {{name}}",
"executionResultDescription": "各ターゲットホストでスニペットを実行した結果の出力です。",
"executionSuccess": "成功",
"executionFailed": "失敗",
"expandAll": "すべてのフォルダーを展開する",
"collapseAll": "すべてのフォルダーを折りたたむ",
"settings": "スニペット設定",
"variablesHint": "変数: $HOST、 $USER、 $PORT、 $NAME、 ${INPUT_1:Label}",
"variablesDialogTitle": "「{{name}} を実行」",
"variablesDialogDescription": "このコードスニペットを実行する前に、必要な値を入力してください。",
"variablesPreviewLabel": "プレビュー",
"variablesConfirmButton": "走る"
},
"automations": {
"title": "自動化",
"tabAutomations": "自動化",
"tabRuns": "走る",
"tabChannels": "チャンネル",
"createAutomation": "新しい自動化",
"backToAutomations": "自動化に戻る",
"createTitle": "新しい自動化",
"editTitle": "編集自動化",
"empty": "自動化はまだ設定されていません。指標、スケジュール、またはイベントに応じて自動化を設定してください。",
"emptyRuns": "まだ得点はありません。",
"emptyChannels": "まだチャンネルがありません。通知を送信するチャンネルを追加してください。",
"noChannelsHint": "チャンネルがまだ設定されていません。チャンネルタブで追加してください。",
"addChannel": "チャンネルを追加",
"testChannel": "テスト",
"channelTestSent": "テスト通知が送信されました",
"channelTestFailed": "テスト通知が失敗しました",
"channelDeleted": "チャンネルが削除されました",
"deleteChannelConfirm": "このチャンネルを削除しますか?このチャンネルを使用している自動化機能は通知を停止します。",
"nameLabel": "名前",
"namePlaceholder": "例:/data がいっぱいになったらクリーンアップする",
"nameRequired": "名前は必須です",
"descriptionLabel": "説明",
"descriptionPlaceholder": "オプションの説明",
"enabledLabel": "有効",
"concurrencyLabel": "既に実行中の場合",
"concurrencyHint": "前回の実行が終了する前に、これが再び発生した場合の対処法。",
"concurrency": {
"skip": "新しいランをスキップ",
"queue": "待ってから追いかける",
"allow": "両方を同時に実行する"
},
"save": "保存",
"created": "自動化が作成しました",
"updated": "自動化が保存されました",
"deleted": "自動化が削除されました",
"deleteConfirm": "この自動化を削除すると、実行履歴も削除されます。",
"runNow": "今すぐ実行",
"testRun": "試運転",
"testRunHint": "すべてのステップを実行しますが、Termix以外のものには一切触れません。",
"runStarted": "ランニング開始",
"runFinished": "実行完了: {{status}}",
"trigger": "トリガー",
"steps": "手順",
"addStep": "ステップを追加する",
"removeStep": "削除手順",
"moveUp": "上へ進む",
"moveDown": "下へ移動",
"noSteps": "まだ手順がありません。何が起こるべきかを記述する手順を追加してください。",
"webhookTokenTitle": "Webhook URL",
"webhookTokenDescription": "これは一度しか表示されません。今すぐ保存してください。後で取り出すことはできません。",
"copy": "コピー",
"copied": "コピーしました",
"viewJson": "JSON",
"viewBuilder": "ビルダー",
"viewGraph": "グラフ",
"lastRun": "最後の走行",
"never": "一度もない",
"duration": "{{seconds}}s",
"stepOutput": "出力",
"stepError": "エラー",
"dryRunBadge": "試運転",
"hostSelector": {
"trigger": "トリガーホスト",
"host": "特定の宿主",
"fleet": "艦隊",
"all": "すべてのホスト"
},
"triggerKinds": {
"metric_threshold": "メトリックしきい値",
"host_status": "ホストが起動または停止する",
"health_check": "健康チェックの変更点",
"schedule": "スケジュール通りに",
"docker_event": "コンテナイベント",
"internal_event": "ターミックスイベント",
"webhook": "受信ウェブフック"
},
"stepTypes": {
"notify": "通知を送信する",
"http": "URLを呼び出す",
"run_snippet": "スニペットを実行する",
"run_command": "コマンドを実行する",
"docker": "コンテナを制御する",
"tunnel": "トンネルを制御する",
"wol": "ホストを起こす",
"wait": "待って",
"set_var": "変数を設定する",
"if": "もし/そうでなければ",
"run_automation": "別の自動化を実行する",
"stop": "停止"
},
"statuses": {
"running": "ランニング",
"success": "成功",
"failed": "失敗した",
"timeout": "タイムアウト",
"skipped": "スキップしました",
"cancelled": "キャンセル"
},
"fields": {
"host": "ホスト",
"metric": "メトリック",
"mount": "取り付けポイント",
"operator": "は",
"value": "価値",
"forSeconds": "(秒)の間持続",
"cooldown": "クールダウン時間(分)",
"cron": "Cron発現",
"intervalSeconds": "(秒)ごとに",
"timezone": "タイムゾーン",
"timezoneServer": "サーバー時間",
"timezoneHint": "このゾーンでは、cronの実行時間が読み取られます。インターバルスケジュールには適用されません。",
"container": "容器",
"command": "指示",
"url": "URL",
"method": "方法",
"body": "体",
"channels": "チャンネル",
"title": "タイトル",
"message": "メッセージ",
"snippet": "抜粋",
"seconds": "秒",
"conditionLeftPlaceholder": "チェックすべき値",
"conditionRightPlaceholder": "比較対象",
"variableName": "変数名",
"variableValue": "価値",
"elevated": "sudo を付けて実行",
"onError": "これが失敗した場合",
"allowPrivateNetwork": "ローカルネットワークアドレスを許可する",
"allowPrivateNetworkHint": "LAN上でセルフホスト型サービスを実行する場合に必要です。内部アドレスへのリクエストを防ぐため、デフォルトでは無効になっています。"
},
"onError": {
"stop": "走るのをやめろ",
"continue": "続ける"
}
},
"fleets": {
"title": "艦隊",
"createFleet": "艦隊を作成する",
"createFleetTitle": "艦隊を作成する",
"editFleetTitle": "艦隊を編集",
"createFleetDescription": "フリートとは、複数のホストをまとめてグループ化し、それらを一つの単位としてアクションを実行できるグループです。",
"nameLabel": "名前",
"namePlaceholder": "例:Webサーバー",
"nameRequired": "艦隊名は必須です",
"descriptionLabel": "説明",
"descriptionPlaceholder": "オプションの説明",
"colorLabel": "色",
"tagRulesLabel": "タグルール",
"tagRulesPlaceholder": "プロダクションウェブ、エッジ",
"tagRulesHint": "これらのタグのいずれかが付いているホストは、手動で追加されたホストに加えて、自動的に含まれます。",
"fleetCreated": "艦隊が創設されました",
"fleetUpdated": "艦隊情報更新",
"fleetDeleted": "艦隊削除",
"saveFailed": "艦隊の救出に失敗しました",
"deleteFailed": "艦隊の削除に失敗しました",
"loadFailed": "艦隊の読み込みに失敗しました",
"deleteFleetTitle": "艦隊を削除",
"deleteFleetDescription": "「{{name}}」を削除してもよろしいですか?これはメンバーホスト自体を削除するものではありません。",
"searchFleets": "艦隊を検索...",
"noFleets": "まだ艦隊がありません。まずは艦隊を作成してください。",
"memberCount": "{{count}} ホスト",
"memberCount_other": "{{count}} ホスト",
"manageMembers": "メンバーの管理",
"manageMembersTitle": "フリートメンバーの管理",
"manageMembersDescription": "このフリートの静的メンバーシップにホストを追加または削除する切り替えを行います。タグルールに一致するホストは常に含まれます。",
"searchHosts": "ホストを検索...",
"noHostsFound": "ホストが見つかりませんでした",
"noMembers": "この艦隊にはまだメンバーがいません。ホストを追加するか、タグルールを設定してください。",
"membersLoadFailed": "艦隊メンバーの読み込みに失敗しました",
"memberUpdateFailed": "艦隊メンバーシップの更新に失敗しました",
"tabRun": "コマンドを実行する",
"tabTransfer": "ファイルの転送",
"tabInventory": "在庫",
"openInventoryTab": "全画面表示",
"tabPackages": "パッケージ",
"runOnFleet": "ラン・オン・フリート",
"commandPlaceholder": "uptime && df -h",
"commandRequired": "コマンドが必要です",
"commandInputsLabel": "コマンド入力",
"commandSucceeded": "コマンドはすべてのホストで正常に実行されました。",
"commandPartialFailure": "{{failed}} の {{total}} ホストが失敗しました",
"commandFailed": "コマンドの実行に失敗しました",
"resultSuccess": "成功",
"resultFailed": "失敗した",
"push": "押す",
"pull": "引く",
"remotePathLabel": "リモートパス",
"remotePathRequired": "遠隔経路が必要です",
"fileLabel": "ファイル",
"fileRequired": "ファイルが必要です",
"pushHint": "選択されたファイルは、艦隊内のすべてのホスト上のこの正確なパスに書き込まれます。",
"pullHint": "このパスにあるファイルは、すべてのホストから読み込まれ、ホストごとに1つのフォルダ、つまり単一のzipファイルとしてダウンロードされます。",
"transferComplete": "転送完了",
"transferFailed": "転送に失敗しました",
"refreshInventory": "在庫を更新",
"inventoryLoadFailed": "在庫の読み込みに失敗しました",
"inventoryRefreshed": "在庫が更新されました",
"inventoryRefreshFailed": "在庫の更新に失敗しました",
"inventoryNoData": "在庫データがまだありません。更新して取得してください。",
"inventoryHost": "ホスト",
"inventoryCollectedCount": "{{count}}/{{total}} が収集されました",
"inventoryOs": "OS",
"inventoryKernel": "カーネル",
"inventoryArch": "アーチ",
"inventoryUptime": "稼働時間",
"inventoryPackageManager": "パッケージマネージャー",
"inventoryCollectedAt": "収集済み",
"packageActionLabel": "アクション",
"packageInstall": "インストール",
"packageRemove": "取り除く",
"packageUpgradeAll": "すべてのパッケージをアップグレードする",
"packageNameLabel": "パッケージ名",
"packageNameRequired": "パッケージ名は必須です。",
"packageHint": "ホストごとに管理者レベルのアクセス権限が必要で、ホストに保存されているsudoパスワードを使用して権限を昇格します。"
},
"workspaces": {
"title": "ワークスペース",
"saveCurrent": "現在の状態を保存",
"saveCurrentTitle": "現在のワークスペースを保存",
"saveCurrentDescription": "開いているすべてのタブ、分割レイアウト、ペイン配置を、新しい名前付きワークスペースとして保存します。",
"nameLabel": "名前",
"namePlaceholder": "例:本番環境のデバッグ",
"nameRequired": "ワークスペース名は必須です。",
"colorLabel": "色",
"workspaceCreated": "ワークスペースが保存されました",
"workspaceUpdated": "ワークスペースが更新されました",
"workspaceDeleted": "ワークスペースが削除されました",
"workspaceDuplicated": "ワークスペースが複製されました",
"saveFailed": "ワークスペースの保存に失敗しました",
"updateFailed": "ワークスペースの更新に失敗しました",
"deleteFailed": "ワークスペースの削除に失敗しました",
"duplicateFailed": "ワークスペースの複製に失敗しました",
"loadFailed": "ワークスペースの読み込みに失敗しました",
"applyFailed": "ワークスペースの適用に失敗しました",
"deleteWorkspaceTitle": "ワークスペースを削除",
"deleteWorkspaceDescription": "「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。",
"noWorkspaces": "まだワークスペースが保存されていません。まずは現在のタブの配置を保存してください。",
"tabCount": "{{count}} タブ",
"tabCount_other": "{{count}} タブ",
"apply": "適用する",
"applyConfirmTitle": "ワークスペースを適用する",
"applyConfirmDescription": "\"{{name}}\" を適用すると、現在のタブが閉じられ、このワークスペースに保存されているレイアウトに置き換えられます。現在のレイアウトに対する未保存の変更は失われます。",
"applyConfirmButton": "ワークスペースを適用する",
"updateWithCurrent": "最新情報に更新",
"updateWithCurrentConfirm": "「{{name}}」を現在のタブ配列で上書きしますか?",
"rename": "名前を変更する",
"duplicate": "重複",
"duplicateNameSuffix": "{{name}} (コピー)",
"setDefault": "デフォルトとして設定",
"unsetDefault": "デフォルトから削除",
"defaultBadge": "デフォルト",
"lastSession": "最終セッション",
"lastSessionDescription": "最新のタブ配置に合わせて自動的に更新されます。適用すると、以前開いていたウィンドウが復元されます。",
"lastUsed": "最後に使用されたのは {{time}} です。",
"neverUsed": "一度も応募したことがない",
"tabsSkipped": "ワークスペースが適用されました — {{count}} タブがスキップされました (ホストが存在しなくなりました): {{names}}"
},
"keybindings": {
"title": "キーボードショートカット",
"description": "ターミナルのコピー、ペースト、コントロールのショートカットをカスタマイズしたり、テキストの送信やスニペットの実行にキーを割り当てたりできます。",
"defaultsHeading": "組み込みショートカット",
"customHeading": "カスタムショートカット",
"addBinding": "ショートカットを追加",
"addBindingTitle": "ショートカットを追加",
"editBindingTitle": "編集ショートカット",
"loading": "読み込み中…",
"noCustomBindings": "カスタムショートカットはまだありません",
"defaultBadge": "デフォルト",
"customizedBadge": "カスタマイズされた",
"customize": "カスタマイズ",
"resetToDefault": "初期設定に戻す",
"resetAllToDefaults": "すべてをデフォルト設定に戻す",
"close": "近い",
"cancel": "キャンセル",
"saveBinding": "ショートカットを保存",
"saveError": "キーボードショートカットの保存に失敗しました",
"pressKeysToRecord": "キーの組み合わせ",
"pressKeysPlaceholder": "クリックしてキーを押す",
"recording": "キーを押してください...",
"comboRequiredError": "まずキーの組み合わせを押してください",
"textRequiredError": "送信するテキストを入力してください",
"controlCodeRequiredError": "制御コードとして1文字を入力してください",
"snippetRequiredError": "抜粋を選択してください",
"conflictWarning": "この組み合わせは既に {{combo}}にバインドされています。保存すると両方とも発火します。",
"actionLabel": "アクション",
"actionCopy": "選択範囲をコピー",
"actionPaste": "ペースト",
"actionSendControlCode": "Ctrlキーと文字キーを同時に押して信号を送る",
"actionSendText": "テキストを送信",
"actionRunSnippet": "既存のスニペットを実行する",
"actionNextTab": "次のタブに切り替える",
"actionPreviousTab": "前のタブに切り替える",
"actionOpenCommandPalette": "クイック検索を開く",
"controlCodeLabel": "手紙",
"textLabel": "送信するテキスト",
"appendEnterLabel": "送信後にEnterキーを押してください。",
"snippetLabel": "抜粋",
"selectSnippetPlaceholder": "抜粋を選択してください",
"orphanedSnippetWarning": "スニペットが見つかりません",
"clipboardPermissionNote": "一部のブラウザでは、初回使用時にクリップボードのアクセス許可を求められる場合があります。"
},
"connectionDefaults": {
"title": "接続のデフォルト設定",
"description": "すべてのホストが継承する値を設定します。ただし、ホストが上書きする場合は除きます。",
"manage": "管理",
"dialogDescription": "これは、設定が未設定のホストに適用されます。ホストで設定されている内容が優先されます。",
"tabTerminal": "ターミナル",
"tabRemoteDesktop": "リモートデスクトップ",
"inherit": "継承する",
"on": "の上",
"off": "オフ",
"resizeDisplayUpdate": "ディスプレイの更新",
"resizeReconnect": "再接続",
"clearAll": "すべてクリア",
"saved": "接続のデフォルト設定が保存されました",
"saveFailed": "接続設定の保存に失敗しました"
},
"userProfile": {
"donateTitle": "Termixを支援する",
"donateDescription": "Termixは無料で自己ホスト型、少数の開発者が余暇に開発しています。時間や費用の節約になったなら、仮想通貨による寄付が継続の助けになります。",
"donateMilestones": "寄付は、SAML、Kubernetes、Agentサポートの構築に必要な調査や学習の時間を賄うのに役立ちます。進捗を見て寄付してください。",
"donateButton": "仮想通貨で寄付",
"storageModeLocal": "ブラウザ",
"storageModeCloud": "データベース",
"storageModeDescription": "ブラウザは設定をこのブラウザにのみ保存します。データベースはサーバーと同期し、任意のデバイスで読み込めます。",
"resetToDefaults": "デフォルトにリセット",
"resetToDefaultsSuccess": "設定がデフォルトにリセットされました。",
"storageModeSwitch": "設定の保存先",
"sectionAccount": "アカウント",
"desktopProfileTitle": "自動ローカルデスクトッププロファイル",
"desktopProfileDescription": "このプロファイルは組み込みバックエンドに限定されており、自動的にサインインします。ログインパスワードは不要です。下記のリモート同期は別のサーバーアカウントを使用します。",
"sectionInterface": "インタフェース",
"interfacePresetDesc": "Termixはどれほど詳細な情報を表示するのか。すべての機能が利用可能です。",
"preset_simple": "単純",
"preset_simple_desc": "必要最低限のものだけ。",
"preset_balanced": "バランスの取れた",
"preset_balanced_desc": "標準レイアウト。",
"preset_advanced": "高度な",
"preset_advanced_desc": "すべてがぎっしりと詰まっている。",
"presetClearOverrides": "すべてリセット",
"presetOverridesTitle": "カスタマイズされた",
"presetRevertArea": "元に戻す",
"presetConfirmTitle": "{{preset}} に切り替えますか?",
"presetConfirmDesc": "これにより、サイドバー、ナビゲーション、ダッシュボードのレイアウト、ターミナルツールバー、ファイルマネージャーの表示がリセットされます。ホスト、認証情報、ホームページは変更されません。",
"presetConfirmApply": "プリセットを適用する",
"runSetupAgainDesc": "初回起動時のセットアップ手順をもう一度確認してください。",
"runSetupAgainButton": "セットアップを実行します",
"uiArea_chrome": "アプリ Chrome",
"uiArea_hostList": "ホストリスト",
"uiArea_credentialList": "資格情報一覧",
"uiArea_rail": "ナビゲーション",
"uiArea_dashboard": "ダッシュボード",
"uiArea_terminal": "ターミナル",
"uiArea_fileManager": "ファイルマネージャー",
"uiArea_docker": "ドッカー",
"uiArea_hostMetrics": "ホストメトリクス",
"uiArea_hostEditor": "ホストエディター",
"uiArea_homepage": "ホームページ",
"sectionAppearance": "外観",
"sectionSecurity": "セキュリティ",
"sectionApiKeys": "APIキー",
"sectionData": "データ",
"sectionC2sTunnels": "C2Sトンネル",
"usernameLabel": "ユーザー名",
"roleLabel": "役割",
"roleAdministrator": "管理者",
"authMethodLabel": "認証方式",
"authMethodLocal": "ローカル",
"twoFaLabel": "2FA",
"twoFaOn": "オン",
"twoFaOff": "オフ",
"versionLabel": "バージョン",
"betaProgramTitle": "ベータプログラム",
"betaProgramDescription": "週次更新の:beta Dockerタグで先行機能をいち早くお試しください。不安定なため、本番環境では使用しないでください。",
"betaProgramFeedback": "バグを見つけましたか?こちらから報告してください。",
"betaProgramLearnMore": "詳細を見る",
"cliTitle": "Termix CLI",
"cliDescription": "自分のシェルからターミナルを開き、コマンドを実行し、ファイルを移動できます。",
"cliLearnMore": "もっと詳しく知る",
"deleteAccount": "アカウントを削除",
"deleteAccountDescription": "アカウントを完全に削除します",
"changeServerDescription": "別のTermixバックエンドサーバーに切り替える",
"deleteButton": "削除",
"deleteAccountPermanent": "この操作は永続的で元に戻せません。",
"deleteAccountWarning": "すべてのセッション、ホスト、資格情報、設定が完全に削除されます。",
"confirmPasswordDeletePlaceholder": "確認のためパスワードを入力",
"languageLabel": "言語",
"themeLabel": "テーマ",
"fontSizeLabel": "フォントサイズ",
"interfaceFontLabel": "インターフェースフォント",
"interfaceFontDescription": "アプリケーションのインターフェースフォントを変更します。端末プロファイルは独自のフォント設定を保持します。",
"accentColorLabel": "アクセントカラー",
"settingsTerminal": "ターミナル",
"commandAutocomplete": "コマンド補完",
"commandAutocompleteDesc": "タブキーを押すと入力中にオートコンプリートを表示する",
"localEcho": "ローカルエコー",
"localEchoDesc": "安全なローカルキーストローク予測を使用して、体感入力遅延を低減する",
"keyboardShortcuts": "キーボードショートカット",
"keyboardShortcutsDescription": "ターミナルのコピー、貼り付け、コマンドのショートカットをカスタマイズする",
"manageShortcuts": "管理",
"terminalLinkBehavior": "ターミナルリンククリック",
"terminalLinkBehaviorDesc": "ターミナル内のリンクをクリックしたときのデフォルト動作",
"historyTracking": "履歴追跡",
"historyTrackingDesc": "ターミナルコマンドの履歴を追跡",
"commandPalette": "コマンドパレット",
"commandPaletteDesc": "キーボードショートカットを有効化",
"reopenTabsOnLogin": "ログイン時にタブを再表示",
"reopenTabsOnLoginDesc": "ログイン時またはページ更新時に、別のデバイスからでも開いていたタブを復元します",
"confirmTabClose": "タブを閉じる前に確認",
"confirmTabCloseDesc": "ターミナルタブを閉じる前に確認を表示",
"transferConcurrency": "同時ファイル転送",
"transferConcurrencyDesc": "ローカル/リモートマネージャーが同時にアップロードまたはダウンロードできるファイルの数を指定します。サーバーがSFTPチャネルを制限している場合は、この値を小さくしてください。",
"settingsAppRail": "アプリレール",
"sidebarSettingsMoved": "ホストサイドバーの表示設定は、ホストツールバーから開く「サイドバーのカスタマイズ」パネルに移動しました。",
"showHostTags": "ホストタグを表示",
"showHostTagsDesc": "ホスト一覧でタグを表示",
"hostTrayOnClick": "クリックでホストアクションを展開",
"hostTrayOnClickDesc": "接続ボタンを常に表示し、ホバーではなくクリックで管理オプションを展開します",
"compactHostView": "コンパクトなホスト表示",
"compactHostViewDesc": "各ホストを名前とアドレスのみの1行に折りたたみます",
"statusColors": "実際のステータスカラー",
"statusColorsDesc": "オンライン/オフラインのステータスにアクセントカラーではなく緑/赤を使用します",
"pinAppRail": "アプリレールを固定",
"pinAppRailDesc": "左側のサイドバーアプリレールを常に展開状態に保ち、ホバーで展開しないようにします",
"openFullscreenSettings": "設定を全画面で開く",
"exitFullscreenSettings": "全画面表示設定を終了する",
"expandAppRailOnHover": "ホバーでアプリレールを展開",
"expandAppRailOnHoverDesc": "ポインターが上に移動したときに左側のサイドバーアプリレールを展開できるようにします",
"showPinAppRailButton": "Pin App Rail ボタンを表示",
"showPinAppRailButtonDesc": "アプリのレールにボタンを表示して、開いた状態に固定します。デフォルトでは無効になっています。",
"settingsNavigation": "ナビゲーション",
"navigationTabsDesc": "アプリレールに表示するタブを選択",
"showSnippetCommands": "コマンドの表示",
"showSnippetCommandsDesc": "各スニペットのコマンドをその名前の下に表示します。コンパクトなリスト表示にするには、このオプションをオフにしてください。",
"foldersCollapsed": "フォルダを折りたたむ",
"foldersCollapsedDesc": "デフォルトでフォルダを折りたたむ",
"confirmExecution": "実行確認",
"confirmExecutionDesc": "スニペット実行前に確認する",
"settingsUpdates": "アップデート",
"disableUpdateChecks": "アップデートチェックを無効化",
"disableUpdateChecksDesc": "アップデートの確認を停止する",
"totpAuthenticator": "TOTP認証",
"totpEnabled": "2FAが有効です",
"totpDisabled": "ログインのセキュリティを強化",
"totpAddAuthenticator": "デバイスを追加する",
"totpAddTitle": "認証デバイスを追加する",
"totpAddDescription": "本人確認を行うことで、同じ安全なTOTPキーを持つ別の認証アプリを登録できます。",
"totpAddInputRequired": "TOTPコードまたはパスワードを入力してください",
"totpAddFailed": "認証システムの追加に失敗しました",
"totpAddScanInstructions": "追加の認証デバイスでこのQRコードをスキャンしてください。既存の認証デバイスは引き続きご利用いただけます。",
"totpAddSuccess": "追加の認証デバイスを登録しました",
"disable": "無効にする",
"enable": "有効にする",
"setupTotp": "TOTPを設定",
"qrCode": "QRコード",
"totpInstructions": "QRコードをスキャンするか、認証アプリにシークレットを入力し、6桁のコードを入力してください",
"totpCodePlaceholder": "000000",
"verify": "確認",
"changePassword": "パスワード変更",
"currentPasswordLabel": "現在のパスワード",
"currentPasswordPlaceholder": "現在のパスワード",
"newPasswordLabel": "新しいパスワード",
"newPasswordPlaceholder": "新しいパスワード",
"confirmPasswordLabel": "新しいパスワードの確認",
"confirmPasswordPlaceholder": "新しいパスワードの確認",
"updatePassword": "パスワードを更新",
"createApiKeyTitle": "APIキーを作成",
"createApiKeyDescription": "プログラムからのアクセス用に新しいAPIキーを生成します。",
"apiKeyNameLabel": "名前",
"apiKeyNamePlaceholder": "e.g. CI Pipeline",
"expiryDateLabel": "有効期限",
"optional": "任意",
"cancel": "キャンセル",
"createKey": "キーを作成",
"apiKeyCreatedWarning": "キーが作成されました。今すぐコピーしてください。二度と表示されません。",
"copyApiKey": "APIキーをコピー",
"copiedToClipboard": "クリップボードにコピーされました",
"apiKeyCount": "{{count}}件のキー",
"newKey": "新規キー",
"noApiKeys": "APIキーがまだありません。",
"apiKeyActive": "有効",
"apiKeyUsageHint": "APIキーを",
"apiKeyUsageHintHeader": "ヘッダーに含めてください",
"apiKeyPermissionsHint": "キーは作成したユーザーの権限を引き継ぎます。",
"exportData": "データをエクスポートする",
"exportDataDesc": "ホスト、認証情報、設定のバックアップをダウンロードして、別のデバイスに転送してください。",
"export": "輸出",
"exporting": "エクスポート中...",
"importData": "データのインポート",
"importDataDesc": ".sqliteバックアップファイルからホスト、認証情報、設定を復元します。",
"importDataSelected": "選択済み: {{name}}",
"selectFile": "ファイルを選択",
"changeFile": "変化",
"import": "輸入",
"importing": "インポート中...",
"exportSuccess": "データのエクスポートに成功しました。",
"exportFailed": "データのエクスポートに失敗しました",
"importSelectFile": "まずファイルを選択してください",
"importCompleted": "インポート完了: {{total}} 個のアイテムがインポートされ、 {{skipped}} 個がスキップされました。",
"importFailed": "インポートに失敗しました: {{error}}",
"roleUser": "ユーザー",
"authMethodDual": "二要素認証",
"authMethodOidc": "OIDC",
"totpSetupFailed": "TOTPのセットアップを開始できませんでした",
"totpEnter6Digits": "6桁のコードを入力してください",
"totpEnabledSuccess": "二要素認証が有効になりました",
"totpInvalidCode": "コードが無効です。もう一度お試しください",
"totpDisableInputRequired": "TOTPコードまたはパスワードを入力してください",
"totpDisabledSuccess": "二要素認証が無効になりました",
"totpDisableFailed": "2FAの無効化に失敗しました",
"totpDisableTitle": "2FAを無効にする",
"totpDisablePlaceholder": "TOTPコードまたはパスワードを入力",
"totpDisableConfirm": "2FAを無効にする",
"totpContinueVerify": "確認に進む",
"totpVerifyTitle": "コードの確認",
"totpBackupTitle": "バックアップコード",
"totpDownloadBackup": "バックアップコードをダウンロード",
"passkeys": "パスキー",
"passkeysDesc": "WebAuthn/FIDO2認証情報を使用してパスワードなしでサインインできます",
"passkeyName": "パスキー名",
"passkeyUvPreferred": "優先",
"passkeyUvRequired": "必須",
"passkeyUvDiscouraged": "非推奨",
"addPasskey": "パスキーを追加",
"noPasskeys": "登録されたパスキーはありません。",
"passkeyAdded": "パスキーが追加されました",
"passkeyAddFailed": "パスキーの追加に失敗しました",
"passkeyDeleted": "パスキーが削除されました",
"passkeyDeleteFailed": "パスキーの削除に失敗しました",
"done": "完了",
"secretCopied": "シークレットをクリップボードにコピーしました",
"apiKeyNameRequired": "キー名は必須です",
"apiKeyCreated": "APIキー「{{name}}」が作成されました",
"apiKeyCreateFailed": "APIキーの作成に失敗しました",
"apiKeyUser": "ユーザー",
"apiKeyExpires": "有効期限",
"apiKeyRevoked": "APIキー「{{name}}」は失効されました",
"apiKeyRevokeFailed": "APIキーの失効に失敗しました",
"passwordFieldsRequired": "現在のパスワードと新しいパスワードが必要です",
"passwordMismatch": "パスワードが一致しません",
"passwordTooShort": "パスワードは6文字以上でなければなりません",
"passwordUpdated": "パスワードが正常に更新されました",
"passwordUpdateFailed": "パスワードの更新に失敗しました",
"deletePasswordRequired": "アカウント削除にはパスワードが必要です",
"deleteFailed": "アカウントの削除に失敗しました",
"deleting": "削除中...",
"colorPickerTooltip": "カラーピッカーを開く",
"themeSystem": "システム",
"themeLight": "ライト",
"themeDark": "ダーク",
"themeDracula": "Dracula",
"themeCatppuccin": "Catppuccin",
"themeNord": "Nord",
"themeSolarized": "Solarized",
"themeTokyoNight": "Tokyo Night",
"themeOneDark": "One Dark",
"themeGruvbox": "Gruvbox"
}
}
},
"terminalToolbar": {
"title": "ターミナルツールバー",
"showActions": "ツールバーを表示",
"hideToolbar": "ツールバーを非表示にする",
"showToolbar": "ツールバーを展開する",
"moveToolbar": "ツールバーを移動",
"moveToolbarHint": "ツールバーをドラッグして位置を変更します",
"layout": "ツールバー表示モード",
"layoutIcon": "アイコンのみ",
"layoutLabeled": "アイコンとラベル",
"layoutExpanded": "指標を追加して拡張",
"image": "画像アクション(画像のみ)",
"upload": "画像をアップロード",
"paste": "画像を貼り付ける",
"detachTmux": "tmuxをデタッチする",
"detachTmuxDescription": "tmuxセッションをデタッチする",
"imageActionFailed": "画像操作が失敗しました",
"retry": "リトライ",
"dismissError": "画像エラーを非表示にする",
"cpu": "CPU",
"memory": "メモリ",
"disk": "ディスク",
"statsUnavailable": "ライブ統計は利用できません",
"tmuxDetach": "tmuxセッションをデタッチする",
"uploadImage": "ホストに画像をアップロードする",
"uploadingImage": "アップロード中...",
"pasteImage": "クリップボードから画像を貼り付ける(画像のみ)",
"openFiles": "ファイルを開く",
"openDocker": "Open Docker",
"openTunnel": "オープントンネル",
"openHostMetrics": "オープンホストメトリクス",
"openProxmoxStats": "Proxmox統計を開く",
"openTmuxMonitor": "Tmux Monitorを開く"
},
"tmuxMonitor": {
"title": "Tmux モニター",
"failedToLoadHosts": "ホストの読み込みに失敗しました",
"failedToLoad": "Tmux セッションの読み込みに失敗しました",
"tmuxUnavailable": "このホストに tmux がインストールされていません",
"noSessions": "このホストに tmux セッションがありません",
"noHostSelected": "ホストが選択されていません",
"attached": "アタッチ済み",
"detached": "デタッチ済み",
"attach": "アタッチ",
"editTags": "タグを編集",
"tagsHint": "カンマ区切りのタグ (例: YOLO, lab, training)",
"tagsSaved": "タグを保存しました",
"tagsSaveFailed": "タグの保存に失敗しました",
"searchPlaceholder": "セッション間で出力を検索...",
"searchResults": "{{count}}件の一致",
"searchFailed": "検索に失敗しました",
"selectPaneHint": "出力をプレビューするには、ペインを選択してください",
"closePreview": "プレビューを閉じる",
"newSession": "新規セッション",
"newSessionHint": "セッション名 (英数字, _ @ % + = -)",
"newSessionPlaceholder": "my-session",
"create": "作成",
"sessionCreated": "セッション \"{{name}}\" を作成しました",
"sessionCreateFailed": "セッションの作成に失敗しました",
"splitRight": "右に分割",
"splitDown": "下に分割",
"splitFailed": "ペインの分割に失敗しました",
"newWindow": "新規ウィンドウ",
"windowCreateFailed": "ウィンドウの作成に失敗しました",
"attachSessionTooltip": "{{session}}にアタッチ",
"refresh": "更新",
"refreshFailed": "セッションの更新に失敗しました",
"collapseAll": "すべて折りたたむ",
"expandAll": "すべて展開",
"moreActions": "その他の操作",
"sessionStats": "セッション統計",
"renameSessionTitle": "セッション \"{{name}}\" の名前変更",
"rename": "名前変更",
"sessionRenamed": "セッション名を \"{{name}}\" に変更しました",
"sessionRenameFailed": "セッションの名前変更に失敗しました",
"editTagsTitle": "\"{{name}}\" のタグを編集",
"killPane": "ペインを終了",
"resizeTree": "ドラッグでリサイズ — ダブルクリックでリセット",
"reattach": "再接続 (表示の乱れを修正)",
"killWindow": "ウィンドウを終了",
"killWindowTitle": "ウィンドウ {{index}} (\"{{session}}\") を終了しますか?",
"killWindowBody": "このウィンドウ内のすべてのペインとプロセスが終了されます。最後のウィンドウを終了するとセッションが終了します。",
"windowKillFailed": "ウィンドウの終了に失敗しました",
"statusActivity": "アクティビティ",
"statusWindows": "ウィンドウ",
"statusPanes": "ペイン",
"statusTags": "タグ",
"killPaneTitle": "ペイン {{id}} を終了しますか?",
"killPaneBody": "このペインで実行中のプロセスが終了されます。最後のペインを終了するとウィンドウが閉じます。",
"paneKillFailed": "ペインの終了に失敗しました",
"killSessionTitle": "セッション \"{{name}}\" を終了しますか?",
"killSessionBody": "このセッション内のすべてのウィンドウと実行中のプロセスが終了されます。この操作は取り消せません。",
"kill": "終了",
"sessionKilled": "セッション \"{{name}}\" を終了しました",
"sessionKillFailed": "セッションの終了に失敗しました",
"hostUnreachable": "ホストに接続できませんでした。オンラインで到達可能か確認してください。",
"noServer": "このホストで tmux サーバーが実行されていません。",
"searchTruncated": "一部の結果 — 各ペインの直近 {{lines}} 行と最大 {{panes}} ペインを検索対象としています。",
"closeSearchResults": "検索結果を閉じる",
"retry": "再試行",
"noHosts": "利用可能な SSH ホストがありません",
"noHostsHint": "SSH ホストで Tmux モニターオプションを有効にすると(ホストマネージャー → 端末タブ)、tmux セッションを監視できます。",
"tmuxInstallHint": "ホストにインストールするには:",
"attachTooltip": "{{host}} にターミナルを開く",
"attachTooltipPane": "{{host}} にターミナルを開く — tmux セッション {{session}}",
"timeJustNow": "たった今",
"timeMinutes": "{{count}}分前",
"timeHours": "{{count}}時間前",
"timeDays": "{{count}}日前"
},
"mobileKeyboard": {
"shift": "Shift",
"ctrl": "Ctrl",
"esc": "Esc",
"tab": "Tab",
"backTab": "⇥",
"arrowUp": "↑",
"arrowDown": "↓",
"arrowLeft": "←",
"arrowRight": "→",
"home": "ホーム",
"end": "エンド",
"pageUp": "PgUp",
"pageDown": "PgDn",
"delete": "Del",
"paste": "ペースト",
"editQuickKeys": "クイックキー編集",
"quickKeysTitle": "クイックキー",
"quickKeysDesc": "× をタップして削除します。最大8文字まで対応。",
"quickKeyPlaceholder": "例: sudo ",
"addQuickKey": "追加",
"removeQuickKey": "削除",
"resetDefaults": "デフォルトにリセット",
"done": "完了"
},
"serial": {
"title": "シリアル",
"portLabel": "ポート",
"portPlaceholder": "/dev/ttyUSB0 または COM3",
"baudRateLabel": "ボーレート",
"dataBitsLabel": "データ",
"stopBitsLabel": "ストップ",
"parityLabel": "パリティ",
"parityNone": "なし",
"parityEven": "偶数",
"parityOdd": "奇数",
"connect": "シリアルに接続",
"disconnect": "切断",
"refreshPorts": "ポートを更新",
"connected": "{{path}} に {{baud}} ボーで接続しました",
"disconnected": "シリアルポートが切断されました",
"connectionError": "シリアルポートを開けませんでした",
"wsError": "WebSocket エラー",
"errorNoServerUrl": "サーバー URL が設定されていません",
"notSupportedTitle": "シリアル非対応",
"notSupported": "シリアル接続には Web Serial API をサポートするブラウザ (Chrome, Edge, Firefox 151+) または Termix デスクトップアプリが必要です。",
"hideHint": "シリアルタブは「ユーザープロファイル > 外観 > サイドバー > ナビゲーション」で非表示にできます。",
"browserPickerHint": "接続をクリックすると、ブラウザがポートピッカーを開き、デバイスを選択できます。"
},
"metricsHistory": {
"title": "メトリクス履歴",
"historySuffix": "履歴",
"cpuMemoryDisk": "CPU / メモリ / ディスク",
"network": "ネットワーク",
"download": "受信",
"upload": "送信",
"noData": "この期間の履歴データはありません。",
"custom": "カスタム",
"to": "~",
"apply": "適用",
"viewHistory": "履歴を表示"
},
"alerts": {
"tabFirings": "アラート",
"tabRules": "ルール",
"tabChannels": "チャンネル",
"noFirings": "未確認のアラートはありません",
"noRules": "アラートルールが設定されていません",
"noChannels": "通知チャンネルが設定されていません",
"rulesDesc": "アラートルールは通知をトリガーします",
"channelsDesc": "アラート通知の送信先です",
"acknowledge": "確認",
"ackAll": "すべて確認",
"allAcknowledged": "すべてのアラートが確認済みです",
"ackFailed": "アラートの確認に失敗しました",
"ackAllFailed": "すべてのアラートの確認に失敗しました",
"showAcknowledged": "すべて表示",
"hideAcknowledged": "確認済みを非表示",
"addChannel": "チャンネルを追加",
"editChannel": "チャンネルを編集",
"channelName": "名前",
"channelType": "タイプ",
"channelNameRequired": "名前は必須です",
"webhookUrl": "URL",
"webhookUrlRequired": "Webhook URLは必須です",
"webhookDesc": "各アラートの発生時にこのURLにJSONペイロードをPOSTします",
"ntfyServer": "サーバーURL",
"ntfyTopic": "トピック",
"ntfyTopicRequired": "トピックは必須です",
"ntfyToken": "アクセストークン(任意)",
"channelSaveFailed": "チャンネルの保存に失敗しました",
"test": "テスト",
"testSent": "テスト通知を送信しました",
"testFailed": "テスト通知に失敗しました",
"testFailedWithReason": "テスト通知が失敗しました: {{reason}}",
"addRule": "アラートルールを追加",
"editRule": "アラートルールを編集",
"ruleName": "ルール名",
"ruleNameRequired": "ルール名は必須です",
"triggerType": "トリガー",
"thresholdValue": "しきい値 (%)",
"durationSeconds": "継続時間(秒、0は即時発火)",
"cooldownMinutes": "クールダウン(分)",
"channels": "通知チャンネル",
"noChannelsHint": "先にチャンネルタブでチャンネルを追加してください",
"ruleSaveFailed": "ルールの保存に失敗しました"
},
"ai": {
"title": "アシスタント",
"send": "送信",
"stop": "停止",
"save": "保存",
"cancel": "キャンセル",
"running": "ランニング",
"approve": "承認する",
"reject": "拒否する",
"inputPlaceholder": "サーバーについて質問するか、変更案を説明する",
"selectProvider": "プロバイダーを選択してください",
"providerSettings": "プロバイダー設定",
"addProvider": "プロバイダーを追加",
"editProvider": "プロバイダーを編集",
"removeProvider": "プロバイダーを削除",
"providerType": "プロバイダー",
"providerLabel": "名前",
"providerLabelPlaceholder": "例えば:地元のオラマ",
"baseUrl": "サーバーアドレス",
"apiKey": "APIキー",
"defaultModel": "デフォルトモデル",
"defaultModelPlaceholder": "例えば、llama3.1 や claude-opus-5 など。",
"labelRequired": "このプロバイダーに名前を付けてください",
"providerSaveFailed": "プロバイダーを保存できませんでした",
"providerUpdated": "プロバイダーが更新されました",
"providerDeleteFailed": "プロバイダーを削除できませんでした",
"privateEndpointHint": "プライベートネットワーク上のアドレスを使用するには、まず管理者がホストを許可する必要があります。",
"providerOllama": "オラマ",
"providerAnthropic": "人間",
"providerOpenai": "OpenAI",
"providerGemini": "Google Gemini",
"providerOpenaiCompatible": "OpenAI対応",
"toolArguments": "入力",
"toolResult": "結果",
"statusApplied": "適用済み",
"statusRejected": "拒否されました",
"proposalApplied": "変更が適用されました",
"proposalApplyFailed": "変更を適用できませんでした",
"proposalRejectFailed": "変更を拒否できませんでした",
"enableTitle": "AIアシスタントを有効にする",
"enableDescription": "アシスタントにあなたの設定を読み取らせ、承認が必要な変更案を提案させましょう。",
"readOnlyCommands": "読み取り専用の診断コマンドを許可する",
"readOnlyCommandsDescription": "アシスタントは、dfやuptimeといった安全なコマンドを毎回確認することなく実行する場合があります。サーバーに変更を加える操作は、常に最初に提案されます。",
"modelDetectFailed": "プロバイダーに連絡が取れなかったため、これは一般的なリストです。任意のモデル名を入力してください。",
"modelCustom": "モデル名を入力してください",
"modelRefresh": "リストを更新",
"modelPlaceholder": "モデルを選択または入力してください",
"attachHint": "ホスト、スニペット、またはオートメーションを参照するには、「@」を入力してください。変更案が表示され、承認が必要となります。",
"runCommandTitle": "コマンドを実行する",
"assistant": "AIアシスタント",
"terminalPanelEmpty": "このホストについてアシスタントにお問い合わせください。状態変更を伴う変更はすべて、事前にあなたの承認が必要です。",
"terminalPanelPlaceholder": "このホストについて質問する...",
"noProvidersConfigured": "AIプロバイダーがまだ設定されていません。AIアシスタントタブで追加してください。",
"runsInOpenTerminal": "開いているターミナルセッションで実行されます。",
"runInTerminal": "走る"
},
"macros": {
"title": "マクロ",
"description": "ターミナルで保存済みのコマンド系列を実行し、サーバーからの応答に応じて処理を行います。",
"target": "ターゲット",
"noTerminal": "端末が開いていません",
"empty": "マクロはまだありません",
"emptyHint": "ログイン、サービスの再起動、プロンプトへの応答など、ターミナル操作の流れを自動化するマクロを作成します。",
"create": "新しいマクロ",
"back": "マクロに戻る",
"name": "名前",
"namePlaceholder": "ウェブサーバーを再起動します",
"nameRequired": "保存する前にマクロに名前を付けてください。",
"descriptionLabel": "説明",
"descriptionPlaceholder": "このマクロの機能(オプション)",
"unsaved": "保存されていない変更",
"save": "保存",
"saved": "マクロが保存されました",
"saveFailed": "マクロを保存できませんでした",
"delete": "消去",
"deleteTitle": "このマクロを削除しますか?",
"deleteBody": "\"{{name}}\" は完全に削除されます。元に戻すことはできません。",
"deleted": "マクロが削除されました",
"cancel": "キャンセル",
"run": "走る",
"stop": "停止",
"running": "実行中...",
"completed": "マクロ撮影終了",
"failed": "マクロが失敗しました",
"loadFailed": "マクロを読み込めませんでした",
"needTerminal": "まずターミナルを開いて接続します。",
"noSteps": "このマクロにはまだ手順がありません。以下に手順を追加してください。",
"addStep": "ステップを追加する",
"stepNumber": "ステップ {{number}}",
"removeStep": "削除手順",
"confirmRunTitle": "このマクロを実行しますか?",
"confirmRunBody": "\"{{name}}\" は {{host}} にコマンドを送信します。",
"confirmRunAction": "マクロを実行する",
"stepTypes": {
"send": {
"label": "コマンドを送信",
"help": "端末にテキストを入力します。まるで手入力したかのように表示されます。"
},
"wait": {
"label": "出力を待つ",
"help": "サーバーが指定したテキスト(パスワード入力画面など)を表示するまで一時停止します。"
},
"delay": {
"label": "一時停止",
"help": "次のステップに進む前に、一定時間待機します。"
},
"if": {
"label": "出力に以下が含まれる場合",
"help": "サーバーがこれまでに出力したすべての内容を確認し、その後、2つの分岐のうちいずれか1つを実行します。"
},
"repeat": {
"label": "繰り返す",
"help": "指定された回数だけ、その中の手順を実行します。"
}
},
"send": {
"text": "コマンドまたはテキスト",
"textPlaceholder": "systemctl restart nginx",
"pressEnter": "送信後にEnterキーを押してください。",
"pressEnterHelp": "テキストを送信せずに入力する場合は、これをオフにしてください。"
},
"wait": {
"pattern": "出力に以下の内容が含まれるまで待機してください",
"patternPlaceholder": "パスワード:",
"timeout": "諦めた後",
"onTimeout": "それが決して現れない場合",
"stop": "マクロを停止する",
"continue": "とにかく続けて"
},
"delay": {
"duration": "待って"
},
"ifStep": {
"pattern": "出力に以下が含まれる場合",
"patternPlaceholder": "アクティブ:アクティブ(実行中)",
"then": "次にこれを実行してください",
"else": "そうでなければ、これを実行してください。",
"emptyBranch": "階段なし"
},
"repeat": {
"count": "回数",
"times": "タイムズ"
},
"match": {
"useRegex": "正規表現で一致させる",
"useRegexHelp": "原文と完全に一致させるには、この部分を削除してください。",
"invalidRegex": "有効な正規表現ではないため、プレーンテキストとしてマッチします。"
},
"seconds": "秒",
"secondsShort": "{{count}}s"
},
"webEndpoint": {
"noHostSelected": "ホストが選択されていません",
"notFound": "このエンドポイントは既に存在しません。",
"tunnelUnreachableFromBrowser": "このエンドポイントは、Termixを実行しているマシン上の127.0.0.1にトンネル接続しますが、このアドレスにはブラウザからアクセスできません。エンドポイントのバインドホストを、そのマシンが応答するアドレス(例:0.0.0.0)に設定し、固定のローカルポートを指定してください。",
"tunnelSharesSessionCookie": "このトンネルを開くと、ブラウザがTermixと同じホスト名でアクセスするため、Termixセッションはトンネル化されたサービスに送信されます。Cookieはポート番号を無視するため、両者を区別することはできません。Termixデスクトップアプリを使用するか、localhostでTermixを開いてください。",
"directSharesSessionCookie": "このエンドポイントを開くと、ブラウザがTermixと同じサイトからアクセスするため、Termixセッションがそこに送信されます。Cookieはポート番号を無視するため、ポート番号が異なっても別のIDとはみなされません。Termixデスクトップアプリを使用するか、別のホスト名からこのWeb UIを提供してください。",
"retry": "リトライ",
"reload": "リロード",
"copyUrl": "URLをコピー",
"urlCopied": "URLがコピーされました",
"copyFailed": "URLのコピーに失敗しました",
"openExternally": "外部に開く",
"isolationUnavailable": "このブラウザでは、WebエンドポイントをTermixセッションから分離できません。認証情報不要のiframeをサポートするブラウザを使用してください。",
"isolationNotice": "埋め込みページは独立したセッションを使用します。ストレージが必要なページやポップアップによるサインインが必要な場合は、デスクトップアプリで独立したウィンドウを使用してください。",
"openIsolatedWindow": "隔離されたウィンドウを開く"
}
}