mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 23:25:24 +00:00
* fix(macos): skip single-instance lock in Mac App Store builds (#1454)
fix(macos): skip single-instance lock in Mac App Store builds
* Fix/backend optional sharp (#1455)
Fix/backend optional sharp
* feat: issue #1218 (#1218)
https://github.com/Termix-SSH/Support/issues/1218
* feat: Add option to use saved global custom theme under Connection Defaults (#1209)
https://github.com/Termix-SSH/Support/issues/1209
* feat: Add Fleet Sharing functionality to the UI (#1228)
https://github.com/Termix-SSH/Support/issues/1228
* feat: Add a list view to the Docker management page (#1237)
https://github.com/Termix-SSH/Support/issues/1237
* feat: issue #1264 (#1264)
https://github.com/Termix-SSH/Support/issues/1264
* feat: 2FA With FortiToken (#1288)
https://github.com/Termix-SSH/Support/issues/1288
* feat: Allow to disable showing paths to folders (#1274)
https://github.com/Termix-SSH/Support/issues/1274
* feat: Sync Network Graph between Desktop and Remote Server (#1245)
https://github.com/Termix-SSH/Support/issues/1245
* feat: Version Number on offline servers (#1291)
https://github.com/Termix-SSH/Support/issues/1291
* feat: Support OrbStack Docker socket path on macOS / Fix "Docker is not installed" on mac... (#1302)
https://github.com/Termix-SSH/Support/issues/1302
* feat: Sidebar host click should focus existing tab instead of opening a new connection (#1289)
https://github.com/Termix-SSH/Support/issues/1289
* fix: Search in side bar shows overlapping hosts when grouped by tags (#1303)
https://github.com/Termix-SSH/Support/issues/1303
* fix: I can't send a file on its own. (#1304)
https://github.com/Termix-SSH/Support/issues/1304
* fix: sudo password not autofilling (#1248)
https://github.com/Termix-SSH/Support/issues/1248
* fix: node-MainThread (#1300)
https://github.com/Termix-SSH/Support/issues/1300
* fix: Tunnel authentication with shared credentials (#1295)
https://github.com/Termix-SSH/Support/issues/1295
* fix: host key updates not syncing, metrics 404 race on first connect
Host key writes never bumped updatedAt so sync never picked them up.
Also retry the first metrics fetch briefly instead of failing right away.
* chore: increment ver
* feat: add category and icon fields to plugin manifest schema
* ci(deps): bump the github-actions group with 2 updates (#1458)
Bumps the github-actions group with 2 updates: [crowdin/github-action](https://github.com/crowdin/github-action) and [actions/github-script](https://github.com/actions/github-script).
Updates `crowdin/github-action` from 2 to 3
- [Release notes](https://github.com/crowdin/github-action/releases)
- [Commits](https://github.com/crowdin/github-action/compare/v2...v3)
Updates `actions/github-script` from 7 to 9
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v9)
---
updated-dependencies:
- dependency-name: crowdin/github-action
dependency-version: '3'
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: github-actions
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: github-actions
...
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 13 updates (#1459)
Bumps the dev-patch-updates group with 13 updates:
| Package | From | To |
| --- | --- | --- |
| [@codemirror/commands](https://github.com/codemirror/commands) | `6.11.0` | `6.11.1` |
| [@codemirror/search](https://github.com/codemirror/search) | `6.7.1` | `6.7.2` |
| [@codemirror/view](https://github.com/codemirror/view) | `6.43.9` | `6.43.12` |
| [@testing-library/dom](https://github.com/testing-library/dom-testing-library) | `10.4.1` | `10.4.2` |
| [@testing-library/react](https://github.com/testing-library/react-testing-library) | `16.3.2` | `16.3.3` |
| [@testing-library/user-event](https://github.com/testing-library/user-event) | `14.6.5` | `14.6.7` |
| [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) | `1.15.5` | `1.15.6` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.1.0` | `6.1.1` |
| [cytoscape](https://github.com/cytoscape/cytoscape.js) | `3.34.1` | `3.34.3` |
| [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.5.4` | `0.5.7` |
| [i18next](https://github.com/i18next/i18next) | `26.4.0` | `26.4.2` |
| [prettier](https://github.com/prettier/prettier) | `3.9.6` | `3.9.8` |
| [react-i18next](https://github.com/i18next/react-i18next) | `17.0.12` | `17.0.14` |
Updates `@codemirror/commands` from 6.11.0 to 6.11.1
- [Changelog](https://github.com/codemirror/commands/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/commands/commits)
Updates `@codemirror/search` from 6.7.1 to 6.7.2
- [Changelog](https://github.com/codemirror/search/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/search/commits)
Updates `@codemirror/view` from 6.43.9 to 6.43.12
- [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/view/commits)
Updates `@testing-library/dom` from 10.4.1 to 10.4.2
- [Release notes](https://github.com/testing-library/dom-testing-library/releases)
- [Changelog](https://github.com/testing-library/dom-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/dom-testing-library/compare/v10.4.1...v10.4.2)
Updates `@testing-library/react` from 16.3.2 to 16.3.3
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v16.3.2...v16.3.3)
Updates `@testing-library/user-event` from 14.6.5 to 14.6.7
- [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.5...v14.6.7)
Updates `@types/ssh2` from 1.15.5 to 1.15.6
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)
Updates `@vitejs/plugin-react` from 6.1.0 to 6.1.1
- [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.1/packages/plugin-react)
Updates `cytoscape` from 3.34.1 to 3.34.3
- [Release notes](https://github.com/cytoscape/cytoscape.js/releases)
- [Commits](https://github.com/cytoscape/cytoscape.js/compare/v3.34.1...v3.34.3)
Updates `eslint-plugin-react-refresh` from 0.5.4 to 0.5.7
- [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.4...v0.5.7)
Updates `i18next` from 26.4.0 to 26.4.2
- [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.4.0...v26.4.2)
Updates `prettier` from 3.9.6 to 3.9.8
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.6...3.9.8)
Updates `react-i18next` from 17.0.12 to 17.0.14
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.12...v17.0.14)
---
updated-dependencies:
- dependency-name: "@codemirror/commands"
dependency-version: 6.11.1
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@codemirror/search"
dependency-version: 6.7.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@codemirror/view"
dependency-version: 6.43.12
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@testing-library/dom"
dependency-version: 10.4.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@testing-library/react"
dependency-version: 16.3.3
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.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@types/ssh2"
dependency-version: 1.15.6
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@vitejs/plugin-react"
dependency-version: 6.1.1
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: cytoscape
dependency-version: 3.34.3
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.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: i18next
dependency-version: 26.4.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: prettier
dependency-version: 3.9.8
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: react-i18next
dependency-version: 17.0.14
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 6 updates (#1461)
Bumps the prod-patch-updates group with 6 updates:
| Package | From | To |
| --- | --- | --- |
| [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual) | `3.14.10` | `3.14.13` |
| [compression](https://github.com/expressjs/compression) | `1.8.1` | `1.8.2` |
| [jose](https://github.com/panva/jose) | `6.2.9` | `6.2.12` |
| [jszip](https://github.com/Stuk/jszip) | `3.10.1` | `3.10.2` |
| [socks](https://github.com/JoshGlazebrook/socks) | `2.8.9` | `2.8.10` |
| [undici](https://github.com/nodejs/undici) | `8.10.0` | `8.10.2` |
Updates `@tanstack/react-virtual` from 3.14.10 to 3.14.13
- [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.13/packages/react-virtual)
Updates `compression` from 1.8.1 to 1.8.2
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/v1.8.1...v1.8.2)
Updates `jose` from 6.2.9 to 6.2.12
- [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.9...v6.2.12)
Updates `jszip` from 3.10.1 to 3.10.2
- [Changelog](https://github.com/Stuk/jszip/blob/main/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.10.1...v3.10.2)
Updates `socks` from 2.8.9 to 2.8.10
- [Release notes](https://github.com/JoshGlazebrook/socks/releases)
- [Commits](https://github.com/JoshGlazebrook/socks/compare/2.8.9...2.8.10)
Updates `undici` from 8.10.0 to 8.10.2
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v8.10.0...v8.10.2)
---
updated-dependencies:
- dependency-name: "@tanstack/react-virtual"
dependency-version: 3.14.13
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: compression
dependency-version: 1.8.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: jose
dependency-version: 6.2.12
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: jszip
dependency-version: 3.10.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: socks
dependency-version: 2.8.10
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: undici
dependency-version: 8.10.2
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>
* feat: add plugin worker protocol, bootstrap and plugin_storage table
Worker-side ctx proxy plus the message envelope it talks over, and the
per-plugin key/value table behind ctx.storage with migrations for all
three dialects. Rows cascade with the plugin so uninstalling leaves
nothing behind.
* feat: add allowlisted host view for plugins
An allowlist rather than a list of fields to strip. A blocklist rots:
the moment a new secret-bearing column lands on SSHHost it starts
leaking silently. With an allowlist a new field stays invisible to
plugins until someone adds it here on purpose.
* feat: add plugin loader with manifest validation and crash restart
Validates an unpacked plugin, spawns a worker_threads worker and manages
activate/deactivate/crash-restart with backoff, disabling after three
tries.
The crash counter clears only after a plugin stays up past a stability
window, not on activation. Clearing it on activation let a plugin that
activates cleanly and then dies restart forever, because every attempt
looked like the first.
loader.ts documents what the worker boundary does and does not buy you.
Node's permission model is process-wide, not per-worker, so it cannot be
enabled for plugin workers alone and is not claimed here.
* feat: route internal events through a shared plugin event bus
Formalises three ad-hoc publish paths that already existed:
automation-events.ts, metrics/automation-bridge.ts and the
hostSessionStatus singleton, now the host.session.status topic.
Both invariants the old code relied on are preserved. Publishing stays
fire-and-forget, so a failing subscriber cannot disturb a metrics poll or
a host delete. The automations engine subscribes to the bus at scheduler
start instead of being imported ad hoc, which keeps the edge
one-directional: automations may import repositories, hosts modules must
not import automations.
* feat: add plugin ctx broker with permission gate and audit
Every ctx call a plugin makes is checked against its granted
capabilities, performed by the main thread, then audited. A capability
must be both declared in the manifest and granted in the database, so
widening a plugin's reach always needs a new manifest the user can see,
never just a database row.
Audit attribution is set by the broker, not the plugin. The plugin
supplies only the details, so it cannot forge the actor.
fix: stop plugin workers seeing plaintext credentials in error messages
A failing ctx.ssh.connect handed the worker the raw error from deep in
the SSH stack, which embeds the connect config. The worker received, in
full:
Authentication failed for root using password <SECRET>
where <SECRET> was the host's real plaintext password. Any plugin with
ssh.exec could read it by catching the error, defeating the whole point
of the handle-based ssh API.
Errors crossing the boundary are now sanitised. Only PluginFacingError
and PluginPermissionError, both authored here, reach a plugin verbatim;
anything else becomes a generic message and the real one goes to the
log. This uses a marker class rather than matching on message text,
because matching would start leaking again the moment an upstream error
happened to contain a familiar phrase.
Covered by credential-isolation.test.ts, which plants a sentinel in
every secret-bearing field and asserts it appears in no message the
worker ever receives.
* feat: dispatch plugin HTTP routes and wire the runtime into startup
ctx.http.route now registers a real router on the /plugin-api/:pluginId
dispatcher, replacing its stub 404. A plugin never touches the Express
req/res: it gets a plain summary and returns a plain object, so sockets
and session cookies stay on this side of the boundary. Authorization and
cookie headers are not forwarded.
Plugins load last in the start-up sequence, after the server is fully
wired, and are terminated before the database on shutdown so none can
outlive it. A plugin that fails to load cannot stop the backend.
fix: correct the nginx plugin-api location regex
The pattern was ^/plugin-api/(/.*)?$, which needs a double slash and so
never matched /plugin-api/<id>/<route>. Every other block in the file
uses ^/prefix(/.*)?$. Left alone, plugin routes would work in dev and
404 only behind Docker.
* fix: update stale SFTP transfer test for single file destination paths
The test still asserted transferToHost was called with the destination
directory "/srv". Commit 7727fa09 (#1304) deliberately changed a single
file transfer to send the full destination path including the filename,
so the correct expectation is "/srv/remote-1.txt". The code was right
and the test was left behind.
* feat: ship the ssh terminal as a first-party in-process plugin
Adds a hardcoded process:transport-owner tier so the terminal can own its
WebSocket server and ssh2 clients, which cannot cross the worker boundary.
* feat: ship docker as a first-party in-process plugin
Moves docker backend and frontend into plugins/docker/, alongside
ssh-terminal. Adds a host editor tab seam, a dashboard card registry,
and a build step to compile plugin backends into dist.
* feat: ship host metrics as a first-party in-process plugin
* fix: harden plugin auth and add per-request identity for ctx calls
Require auth on /plugin-api, gate plugin enable/grant/revoke routes
behind admin.plugins.manage, and thread the calling user through
worker ctx.hosts/ctx.ssh calls instead of always using the install
owner. Also adds the plugin permissions grant/revoke UI.
* feat: ship the AI assistant as a first-party in-process plugin
Moves src/backend/ai and its routes into plugins/ai, mounted through a
small /ai dispatcher instead of its own port. Moves the ai-enabled and
ai-private-endpoints settings routes out of user-settings-routes.ts
into the plugin too, so it has no leftover core dependents.
* fix: remove compiled plugin JS left behind in plugins/ after build
copy-bundled-plugins.cjs compiled and rewrote plugin backend TS in
place, copied it to dist/plugins, but never deleted the .js it had
just emitted next to the .ts sources. Those files shadowed the real
source for vitest/tsx and had import paths rewritten for the dist
layout, so tests failed with "Cannot find module" once a local build
had run. Affects docker, host-metrics and ai, not just this one.
* feat: add a permission-gated backend service registry for plugins
* feat: add a permission-gated UI action registry and action slots for plugins
Moves the terminal toolbar's hardwired AI button into a slot the ssh-terminal
plugin offers and the ai plugin fills, gated on ai.services.use.
* feat: add cross-plugin secret references gated by the provider's RBAC permission
* feat: move proxmox discovery/import/sync into a first-party plugin
* feat: move remote desktop (RDP/VNC/Telnet) into a first-party plugin
Relocates guacamole backend/frontend source and tests into
plugins/remote-desktop, following the ssh-terminal/docker pattern.
* feat: wire remote-desktop plugin into core and rename i18n keys
Repoints core consumers (dispatcher, collab, session-sharing, tab
utils) at the plugin, adds isTabTypeAvailable gating for rdp/vnc/
telnet, widens hostCapability to accept an array, and renames the
guacamole i18n namespace to remoteDesktop.
* feat: move fleets into a first-party plugin
* feat: move automations into a first-party plugin
* feat: remove legacy alert rules, superseded by automations
Alert rules already auto-migrate into automations on boot and the old
engine stands down after. Deletes the rule/firing tables, routes, UI,
and AI tools; keeps notification channels since automations still use
them. Also fixes automations' notify step, which still called the
deleted repository.
* feat: move network topology into a first-party plugin
* feat: move tailscale device discovery and settings into a plugin
Adds plugins/tailscale/ with a devices sidebar tab, admin settings
section, and re-auth dialog. Host Metrics tailscale manager card and
SSH re-auth banner parsing stay in core.
* feat: move workspaces into a first-party plugin
* feat: move web endpoint into a first-party plugin
* feat: collapse plugin runtime to one tier behind a plugin SDK
* feat: make each plugin an npm workspace built by a termix-plugin CLI
* feat: give plugins their own tables, migrations and sync entities
* feat: serve plugin http and websockets from one mount instead of ports
* feat: namespace plugin permissions and keep them valid when a plugin is off
* feat: give plugins their own settings and one settings screen
* feat: load plugin frontends at runtime and remove plugin ids from the shell
* fix: mock the ai status fetch in its activate test
* feat: add auth extension points and one ssh connect pipeline
* feat: rebuild workspaces as the reference plugin
* fix: gate second factors after SSO/LDAP behind an admin setting
* feat: convert network-topology to a full plugin (B1)
* feat: move snippets backend and tables into a plugin (B2)
* feat: point core frontend snippets pickers at the plugin (B2)
* feat: add the snippets plugin (B2)
* feat: wire ai, automations, fleets and ssh-terminal to snippets (B2)
* feat: finish the tailscale plugin, including SSH auth (B3)
* feat: finish the fleets plugin, add ctx.hosts and host-commands SDK (B4)
* chore: update proxmox and host-metrics locale files for B5
* chore: regenerate drizzle migration journals for B5
* feat: add ctx.hosts create/update to the SDK, host-metrics drops proxmox
* feat: move proxmox node stats and collectors into the proxmox plugin
* feat: drop proxmox host columns, use plugin settings instead
* feat: finish the fleets plugin, add ctx.hosts and host-commands SDK (B4)
* feat: convert file manager into a plugin
* feat: convert ssh tunnels into a plugin
* feat: finish the web-endpoint plugin, add ctx.desktop (B8)
* feat: move the terminal fully into the ssh-terminal plugin (B9)
* feat: convert tmux monitoring into a plugin (B10)
* feat: convert serial console into the serial plugin
* feat: move session sharing and collab rooms into a plugin (B12)
* feat: turn session recording into a plugin (B13)
* feat: finish the remote-desktop plugin (B14)
* feat: finish the host-metrics plugin, move host status into core (B16)
* feat: finish the docker plugin (B15)
* feat: finish the automations plugin (B17)
* feat: finish the ai plugin (B18)
* feat: finish the homepage plugin, move service links and canvas out of core (B19)
* feat: convert wake-on-lan into a plugin (B20)
* feat: convert secret-sources into a plugin (B20)
* feat: move totp and passkeys into plugins (C1)
* feat: move sso and ldap logins into plugins (C2)
* feat: move opkssh and warpgate into plugins (C3)
* feat: move step-ca into a plugin (C4)
* feat: move vault ssh signing into a plugin (C5)
* feat: move termix identity into a plugin (C6)
* feat: move acme certificate automation into a plugin (C7)
* fix: finish 2.9.0 plugin moves and get every check green
* chore: lock the plugin boundary and remove 2.9.0 leftovers
* fix: harden the plugin runtime after the 2.9.0 security review
* feat: add plugin packing, signing, pinned trust and tmxplug bundling
* test: prove 2.8 to 2.9.0 upgrade is lossless and fix what it caught
* fix: give bundled plugin backends a real require for CJS deps
* feat: improve UI loading time and jitter
* feat: show credential sharing inline in the sidebar like host sharing
* feat: tailscale add host and copy ip, fix outbound fetch hang and plugin ESM warning
* feat: unify alerts into one plugin, channels, rules and inbox
* feat: rebuild desktop sync as linked server accounts, fix packaged plugin bundles and UI scaling
* fix: set blacksmith builder cache-key to stop broken gha cache fallback
* fix: link plugin-sdk workspace before npm ci in docker deps stage
* fix: link every plugin workspace before npm ci in docker deps stage
* fix(host-metrics): exclude image and firmware filesystems (#1469)
* fix(host-metrics): exclude image and firmware filesystems
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(hosts): normalize imported jump host references (#1470)
* fix(hosts): normalize imported jump host references
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(ci): build plugin SDK and repair MySQL settings migration (#1471)
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(file-manager): keep inline rename consistent (#1476)
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(file-manager): keep inline rename consistent
* fix(dashboard): reuse translated host status labels (#1475)
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(dashboard): reuse translated host status labels
* docs(api): clarify local and remote version fields (#1474)
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* docs(api): clarify local and remote version fields
* fix(file-manager): preserve selected backgrounds on hover (#1473)
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(file-manager): preserve selection feedback on hover
* test(ui): await dialog focus cleanup before teardown
* fix(file-manager): restore Ctrl/Cmd+F file search (#1472)
* fix(ci): build plugin SDK before dependent checks
* fix(mysql): keep plugin settings scope indexes within limits
* test(mysql): refresh reviewed plugin upgrade SQL
* fix(file-manager): focus file search with Ctrl or Cmd F
* fix: keep rounded-full circular in production builds
* fix(file-manager): cancel uploads and stop remote writes (#1477)
* fix(file-manager): cancel uploads and stop remote writes
* test(css): exercise the configured PostCSS plugin chain
* fix(file-manager): apply compact density to directory tree (#1478)
* fix(file-manager): apply compact density to directory tree
* test(css): exercise the configured PostCSS plugin chain
* fix(file-manager): preserve font sizes in compact mode (#1480)
* fix(file-manager): preserve font sizes in compact mode
* test(css): exercise the configured PostCSS plugin chain
* fix(file-manager): prioritize file names in narrow lists (#1483)
* fix(file-manager): prioritize file names in narrow lists
* test(css): exercise the configured PostCSS plugin chain
* test(identity): preserve full Ed25519 public keys in fixtures
* test(remote-desktop): always mutate ciphertext in tamper test
* fix(remote-desktop): probe the saved host guacd endpoint (#1481)
* fix(remote-desktop): probe the saved host guacd endpoint
* test(css): exercise the configured PostCSS plugin chain
* test(identity): preserve full Ed25519 public keys in fixtures
* fix(homepage): check allowlisted private service reachability (#1479)
* fix(homepage): check allowlisted private service reachability
* test(css): exercise the configured PostCSS plugin chain
* fix(remote-desktop): stop unsolicited clipboard read prompts (#1482)
* fix(remote-desktop): read clipboard only on explicit paste
* test(css): exercise the configured PostCSS plugin chain
* test(identity): preserve full Ed25519 public keys in fixtures
* test(remote-desktop): always mutate ciphertext in tamper test
* chore: simplify plugin readmes, changelogs and manifest descriptions
* fix: keep plugins loaded after signing in from the login screen
* fix(file-manager): accept OS file drops over existing rows (#1484)
* fix(file-manager): accept OS file drops over existing rows
* test(file-manager): target the file label in drop tests
* test(css): exercise the configured PostCSS plugin chain
* test(identity): preserve full Ed25519 public keys in fixtures
* test(remote-desktop): always mutate ciphertext in tamper test
* fix(file-manager): pipeline SFTP download reads (#1485)
* feat: add plugin sdk build to beta release
* fix: make link-store secret check immune to random base64 matches
* fix(ldap): preserve the directory-provided bind DN (#1486)
* fix: compute beta changes across dev branches and move the beta tag
* chore: untrack plugin sdk ARCHITECTURE.md
* chore: remove references to plugin sdk ARCHITECTURE.md
* feat: merge host editor terminal tabs into one owned by ssh-terminal
* feat: add descriptions to plugin host enable toggles
* fix(file-manager): show download progress in file viewers (#1487)
* fix(electron): signal backend readiness over IPC (#1488)
* fix(split-screen): allow layout creation without randomUUID (#1490)
* fix(split-screen): allow layout creation without randomUUID
* test(credentials): avoid flaky Ed25519 key generation
* fix(sidebar): remeasure visible rows after density changes (#1489)
* fix(sidebar): remeasure visible rows after density changes
* test(credentials): avoid flaky Ed25519 key generation
* feat(split-screen): redesign split screen with free-form panes and pane picker
* feat(sidebar): add host click behavior setting, default to always opening a new tab
* feat(snippets): redesign panel to match the host list
* fix(session-recording): stop session logs panel from refetching in a loop
* feat(snippets): bring back sharing, target hosts and drag reorder
* feat(ssh-terminal): add toolbar position, start state, display and fade host settings
* feat(ssh-terminal): add host setting to turn off password prompt auto-fill
* fix(ai): stop streams getting cut off and keep tool steps across messages
* feat: improve quick connect system using plugin api
* fix: proxmox guest sync, startup snippet sync, drop dead cloudflare ssh transport
* feat: move terminal settings, look and ssh tools into ssh-terminal plugin
* feat: move snippets, keybinding actions and macros out of core into plugins
* feat: store rdp, vnc and telnet logins in a generic per-protocol table
* feat: type the plugin host record, move plugin strings out of core and add lint checks
* feat: replace core homepage widget registry with generic extension points
* feat: plugins only see their own host settings in the browser
* feat: harden plugin api for separate repos, signed updates and generic external login
* fix: keep plugin css below core utilities and version plugin assets by their css
* fix: load and save plugin host settings in the editor and tighten settings row spacing
* feat: redesign user host defaults system
* fix(remote-desktop): release held keys on focus loss (#1498)
* fix(session-sharing): replace local presentation after takeover (#1500)
* fix(file-manager): refresh disk usage with directory listing (#1503)
* fix(ssh-terminal): preserve input order during local echo reconciliation (#1505)
* feat(remote-desktop): expose display zoom controls for RDP (#1514)
* fix(file-manager): restore text selection and copying in Markdown previews (#1518)
* fix(sidebar): keep compact host addresses visible (#1524)
* fix(hosts): preserve plugin settings when reopening the editor (#1499)
* fix(ssh-terminal): close owner sockets when presentations unmount (#1501)
* fix(session-sharing): synchronize shared SSH terminal dimensions (#1502)
* fix(session-sharing): show participant presence in member terminals (#1504)
* fix(ai): sync provider configuration and keys across linked devices (#1506)
* feat(ssh-terminal): add a duplicate tab action (#1510)
* feat(file-manager): allow disabling move-to-trash confirmation (#1511)
* feat(file-manager): default to the remote login directory (#1512)
* feat(homepage): synchronize canvas layouts across devices (#1515)
* fix(shortcuts): prevent accidental double-Shift palette activation (#1519)
* feat(tmux-monitor): add a unified multi-host view (#1520)
* fix(electron): allow explicit quit with active connections (#1522)
* feat: reconnect all disconnected terminal tabs (#1523)
* fix(hosts): preserve recording and sharing settings in the dev editor (#1509)
* fix(database): preserve RDP domain during startup backfill (#1497)
* feat(sidebar): add keyboard type-ahead search for hosts (#1516)
* feat(automations): add per-host maintenance mode and recurring schedules (#1521)
* feat(tmux): add a per-host mouse toggle and preserve remote configuration (#1513)
* fix(session-sharing): use the linked server for desktop meetings and links (#1507)
* fix(tunnels): support TOTP for client tunnels and jump hosts (#1508)
* fix: type errors and lint failures from merged plugin prs
* feat(installer): make the Windows desktop shortcut optional (#1517)
* fix: ship the plugin sdk and serialport in desktop builds
* fix: prefer ipv4 when resolving ssh host names (#1365)
* fix: readable terminal selection with the light theme (#1319)
* fix: build desktop session share links on the linked server (#1350)
* fix: show meeting guests to members and hide the roster from guests (#1353)
* fix: reliable file manager saves with sudo prompt and no base64 guessing (#1335)
* fix: show disk usage for the mount being browsed (#1347)
* fix: load the linux tray icon reliably and log tray failures (#1332)
* fix: cover the gnome close path in the desktop quit test (#1332)
* fix: prompt for jump host TOTP in terminal, file manager and metrics (#1312)
* feat: optional auto reconnect for dropped ssh sessions (#1321)
* feat: tighter compact host rows with inline tags (#1325)
* feat: bring back the alert feed homepage widget
* feat: pick target terminals for snippets again
* feat: share button on connection tabs again
* feat: recent servers list when linking the desktop app
* feat: list the fixed app shortcuts in keyboard shortcuts
* fix: translate hardcoded toasts and drop em dashes from ui text
* fix: translate leftover hardcoded ui text
* fix: toolbar files button opens at the shell directory again
* fix: show the remote desktop note under connection origin again
* chore: openapi docs for host metrics manager routes
* chore: openapi docs for undocumented routes and fix two broken doc blocks
* fix: declare terminal.listSessions use for snippet targets
* revert: drop the alert feed widget, the notification center replaces it
* feat: restore the alert feed homepage widget
* fix: quick connect fills the host address from plugin auth editors like tailscale
* fix: docker container logs use the base background color
* chore: fix dependabot alerts and apply safe npm upgrades
* fix: proxmox stats tab reads its switch from plugin host settings
* fix: count plugin ssh logins toward host status and stop showing reachable as a warning
* fix: hide the built-in source pill in the host editor
* fix: host status shows online when the port answers and only warns on a failed login
* fix: drop the top border on the split layout menu
* fix: host defaults tabs sit where the host editor puts them and skip plugins with nothing to default
* fix: remote desktop auth method labels and notes for vnc and telnet
* fix: add description to the web endpoint enable switch
* fix: crowdin sync and pretranslate for plugin locales, run plugin tests on release
* feat: move telemetry out of core into a usage statistics plugin
* fix: recent activity card no longer cuts off host names early
* fix: remove duplicate top border on split screen menu
* fix: redesign session log player controls, fix tooltip overlap and drop dot separators
* fix: file manager and sftp text showing raw i18n keys
* fix: onboarding rerunning for existing users after upgrading
* fix: fleet detail buttons overflowing the sidebar
* fix: session log player scrolling off screen horizontally
* fix: network graph lag when adding hosts and on every render
* fix: maintenance index name, shared host read only view and badge polling
* fix: meeting tabs, workspace tab merging, rail panels as tabs and general ui lag
* chore: update release notes
* fix: remote desktop tabs reconnecting on every tab switch
* fix: build plugin sdk before linting in release workflow
* chore: lint, format, and bump version to 2.9.0
* chore: skip crowdin pre-translate in release for now
* chore: sync Crowdin translations for 2.9.0
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Koi <38512047+datlt4@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
2082 lines
123 KiB
JSON
2082 lines
123 KiB
JSON
{
|
|
"connection": {
|
|
"retryingIn": "Đang thử lại sau {{seconds}}giây ({{attempt}}/{{max}})",
|
|
"retryingNow": "Đang thử lại... ({{attempt}}/{{max}})",
|
|
"disconnected": "Không thể kết nối",
|
|
"reconnect": "Kết nối lại"
|
|
},
|
|
"credentials": {
|
|
"folders": "Thư mục",
|
|
"folder": "Thư mục",
|
|
"password": "Mật khẩu",
|
|
"key": "Khóa",
|
|
"sshPrivateKey": "Khóa riêng SSH",
|
|
"upload": "Tải lên",
|
|
"keyPassword": "Mật khẩu khóa",
|
|
"sshKey": "Khóa SSH",
|
|
"uploadPrivateKeyFile": "Tải lên tệp khóa riêng",
|
|
"searchCredentials": "Tìm kiếm chứng chỉ...",
|
|
"addCredential": "Thêm chứng chỉ",
|
|
"caCertificate": "Chứng chỉ CA (-cert.pub)",
|
|
"caCertificateDescription": "Tùy chọn: Tải lên hoặc dán tệp chứng chỉ do CA ký (ví dụ: id_ed25519-cert.pub). Cần khi máy chủ SSH của bạn sử dụng xác thực dựa trên chứng chỉ.",
|
|
"uploadCertFile": "Tải lên tệp -cert.pub",
|
|
"clearCert": "Xóa",
|
|
"certLoaded": "Đã tải chứng chỉ",
|
|
"certPublicKeyLabel": "Chứng chỉ CA",
|
|
"certTypeLabel": "Loại chứng chỉ",
|
|
"pasteOrUploadCert": "Dán hoặc tải lên chứng chỉ -cert.pub...",
|
|
"hasCaCert": "Có chứng chỉ CA",
|
|
"noCaCert": "Không có chứng chỉ CA",
|
|
"noPublicKeyAvailable": "Không có khóa công khai. Hãy mở trình chỉnh sửa chứng chỉ trước.",
|
|
"deployCommandCopied": "Đã sao chép lệnh triển khai",
|
|
"sortCredentials": "Sắp xếp chứng chỉ",
|
|
"sortDefault": "Thứ tự mặc định",
|
|
"sortNameAsc": "Tên (A → Z)",
|
|
"sortNameDesc": "Tên (Z → A)",
|
|
"sortUsernameAsc": "Tên người dùng (A → Z)",
|
|
"sortUsernameDesc": "Tên người dùng (Z → A)",
|
|
"filterCredentials": "Lọc chứng chỉ",
|
|
"filterClearAll": "Xóa bộ lọc",
|
|
"filterTypeGroup": "Loại",
|
|
"filterTypePassword": "Mật khẩu",
|
|
"filterTypeKey": "Khóa SSH",
|
|
"filterTagsGroup": "Thẻ",
|
|
"copyDeployCommand": "Sao chép lệnh triển khai",
|
|
"cloneCredentialAction": "Sao chép thông tin đăng nhập",
|
|
"clonedCredential": "Đã sao chép {{name}}",
|
|
"clonedCredentialName": "{{name}} (copy)",
|
|
"shareCredentialAction": "Chia sẻ thông tin đăng nhập",
|
|
"sharedBadge": "đã chia sẻ",
|
|
"sharedBy": "Được chia sẻ bởi {{owner}}",
|
|
"share": {
|
|
"title": "Chia sẻ \"{{name}}\"",
|
|
"description": "Người nhận sẽ nhận được bản sao mã hóa riêng của các thông tin bí mật. Bản sao này được làm mới mỗi khi thông tin xác thực thay đổi và bị xóa khi quyền chia sẻ bị thu hồi.",
|
|
"levelUse": "Sử dụng",
|
|
"levelManage": "Quản lý",
|
|
"levelUseDesc": "Cách sử dụng: đính kèm thông tin xác thực vào máy chủ và kết nối. Bản thân thông tin bí mật sẽ được giữ kín.",
|
|
"levelManageDesc": "Quản lý: chỉnh sửa thông tin đăng nhập và chia sẻ với người khác.",
|
|
"noAccessEntries": "This credential has not been shared yet",
|
|
"accessRevoked": "Đã thu hồi quyền truy cập",
|
|
"shared": "Thông tin xác thực được chia sẻ"
|
|
},
|
|
"deleteCredentialAction": "Xóa thông tin đăng nhập",
|
|
"editCredentialAction": "Chỉnh sửa thông tin đăng nhập",
|
|
"failedToCloneCredential": "Không thể sao chép thông tin xác thực.",
|
|
"failedToDeleteCredential": "Không thể xóa thông tin đăng nhập",
|
|
"keyBadge": "CHÌA KHÓA",
|
|
"passwordBadge": "Người khuyết tật",
|
|
"renameFolder": "Đổi tên thư mục",
|
|
"deleteFolder": "Xóa thư mục",
|
|
"deleteCredentialConfirm": "Xóa thông tin xác thực \"{{name}}\"?",
|
|
"deletedCredential": "Đã xóa {{name}}",
|
|
"deploySSHKeyTitle": "Triển khai khóa lên máy chủ",
|
|
"loadingCredentials": "Đang tải thông tin đăng nhập...",
|
|
"noCredentialsFound": "Không tìm thấy thông tin đăng nhập.",
|
|
"noCredentialsMatchSearch": "Không có thông tin đăng nhập nào khớp với tìm kiếm của bạn.",
|
|
"addCredentialBtn": "Thêm thông tin đăng nhập",
|
|
"failedToReorder": "Không thể sắp xếp lại thông tin xác thực",
|
|
"failedToMoveCredential": "Không thể chuyển thông tin xác thực.",
|
|
"sortManual": "Hướng dẫn sử dụng (kéo để sắp xếp lại)",
|
|
"customizeSidebar": "Tùy chỉnh thanh bên",
|
|
"customizeSidebarDescription": "Chọn cách hiển thị và hoạt động của danh sách thông tin đăng nhập.",
|
|
"customizeDensityTitle": "Tỉ trọng",
|
|
"densityComfortableDesc": "Một thông tin xác thực trên mỗi dòng, kèm theo chi tiết bổ sung.",
|
|
"densityCompactDesc": "Mỗi thông tin đăng nhập tương ứng với một dòng, đối với danh sách dài hơn.",
|
|
"displayDensityComfortable": "Thoải mái",
|
|
"displayDensityCompact": "Nhỏ gọn",
|
|
"customizeBehaviorTitle": "Hành vi",
|
|
"showCredentialTags": "Hiển thị thẻ",
|
|
"showCredentialTagsDesc": "Hiển thị thẻ trong danh sách thông tin xác thực",
|
|
"actionsVisibility": "Hành động xác thực",
|
|
"actionsVisibilityDesc": "Khi các nút kết nối và quản lý trên mỗi thông tin đăng nhập hiển thị",
|
|
"actionsAlways": "Luôn hiển thị",
|
|
"actionsOnly": "Chỉ cần kết nối, phần còn lại chỉ cần nhấp chuột.",
|
|
"actionsHover": "Hiển thị khi di chuột",
|
|
"actionsClick": "Hiển thị khi nhấp chuột",
|
|
"customizeSortHint": "Tùy chọn sắp xếp nằm trong menu sắp xếp trên thanh công cụ.",
|
|
"expandActions": "Mở rộng hành động",
|
|
"collapseActions": "Hành động thu gọn",
|
|
"backToHosts": "Trở lại trang Chủ nhà",
|
|
"backToCredentials": "Trở lại trang Thông tin đăng nhập",
|
|
"searchCredentialsPlaceholder": "Thông tin đăng nhập tìm kiếm…",
|
|
"deployDialogTitle": "Triển khai khóa SSH",
|
|
"deployDialogDesc": "Triển khai {{name}} vào authorized_keys của máy chủ.",
|
|
"targetHostLabel": "Máy chủ mục tiêu",
|
|
"selectHostOption": "Chọn máy chủ...",
|
|
"deployingBtn": "Đang triển khai...",
|
|
"deployBtn": "Triển khai",
|
|
"keyDeployedSuccess": "Khóa đã được triển khai thành công",
|
|
"failedToDeployKey": "Không thể triển khai khóa.",
|
|
"folderRenamedTo": "Thư mục được đổi tên thành \"{{name}}\"",
|
|
"failedToRenameFolder": "Không thể đổi tên thư mục.",
|
|
"arrangeUnlockedSwitchedToManual": "Đã chuyển sang chế độ sắp xếp thủ công để đơn hàng của bạn được giữ nguyên.",
|
|
"arrangeUnlocked": "Mở khóa chức năng kéo để sắp xếp lại."
|
|
},
|
|
"versionCheck": {
|
|
"updateLinkLabel": "Update available. Open the release notes on GitHub"
|
|
},
|
|
"common": {
|
|
"close": "Đóng",
|
|
"minimize": "Thu nhỏ",
|
|
"online": "Trực tuyến",
|
|
"offline": "Ngoại tuyến",
|
|
"signInFailed": "Sign in failed",
|
|
"unknown": "Không xác định",
|
|
"continue": "Tiếp tục",
|
|
"maintenance": "Bảo trì",
|
|
"degraded": "Suy giảm",
|
|
"error": "Lỗi",
|
|
"warning": "Cảnh báo",
|
|
"unsavedChanges": "Thay đổi chưa lưu",
|
|
"dismiss": "Bỏ qua",
|
|
"more": "Hơn",
|
|
"loading": "Đang tải...",
|
|
"host": "Máy chủ",
|
|
"selectHost": "Chọn một máy chủ...",
|
|
"noHostConfigured": "Chưa cấu hình máy chủ",
|
|
"optional": "Tùy chọn",
|
|
"connect": "Kết nối",
|
|
"copied": "Đã sao chép",
|
|
"connecting": "Đang kết nối...",
|
|
"updateAvailable": "Có bản cập nhật",
|
|
"appName": "Termix",
|
|
"openInNewTab": "Mở trong tab mới",
|
|
"noReleases": "Không có bản phát hành",
|
|
"updatesAndReleases": "Cập nhật & Phát hành",
|
|
"newVersionAvailable": "Đã có phiên bản mới ({{version}}).",
|
|
"failedToFetchUpdateInfo": "Không thể lấy thông tin cập nhật",
|
|
"preRelease": "Tiền phát hành",
|
|
"noReleasesFound": "Không tìm thấy bản phát hành.",
|
|
"cancel": "Hủy",
|
|
"username": "Tên người dùng",
|
|
"login": "Đăng nhập",
|
|
"logout": "Đăng xuất",
|
|
"register": "Đăng ký",
|
|
"password": "Mật khẩu",
|
|
"confirmPassword": "Xác nhận mật khẩu",
|
|
"back": "Quay lại",
|
|
"save": "Lưu",
|
|
"saving": "Đang lưu...",
|
|
"delete": "Xóa",
|
|
"rename": "Đổi tên",
|
|
"edit": "Chỉnh sửa",
|
|
"confirm": "Xác nhận",
|
|
"no": "Không",
|
|
"or": "HOẶC",
|
|
"next": "Tiếp theo",
|
|
"previous": "Trước",
|
|
"refresh": "Làm mới",
|
|
"language": "Ngôn ngữ",
|
|
"checking": "Đang kiểm tra...",
|
|
"checkingDatabase": "Đang kiểm tra kết nối cơ sở dữ liệu...",
|
|
"checkingAuthentication": "Đang kiểm tra xác thực...",
|
|
"backendReconnected": "Kết nối máy chủ đã được khôi phục",
|
|
"connectionDegraded": "Mất kết nối máy chủ, đang khôi phục...",
|
|
"reload": "Tải lại",
|
|
"create": "Tạo",
|
|
"copy": "Sao chép",
|
|
"copyFailed": "Không thể sao chép vào bảng tạm",
|
|
"maximize": "Phóng to",
|
|
"restore": "Khôi phục",
|
|
"of": "trên",
|
|
"saved": "Đã lưu",
|
|
"deleted": "Đã xóa",
|
|
"deleteFailed": "Không thể xóa",
|
|
"saveFailed": "Không thể lưu",
|
|
"required": "Bắt buộc",
|
|
"remove": "Xóa",
|
|
"add": "Thêm",
|
|
"update": "Cập nhật",
|
|
"noResults": "No results found"
|
|
},
|
|
"onboarding": {
|
|
"stepCounter": "Bước {{current}} của {{total}}",
|
|
"skip": "Bỏ qua bước thiết lập",
|
|
"next": "Kế tiếp",
|
|
"finish": "Bắt đầu",
|
|
"welcomeTitle": "Chào mừng đến với Termix",
|
|
"welcomeIntro": "Termix quản lý máy chủ của bạn từ một nơi duy nhất. Quá trình thiết lập này chỉ mất khoảng một phút và không có gì là cố định cả.",
|
|
"welcome_hosts": "Hãy bảo vệ máy chủ của bạn",
|
|
"welcome_hosts_desc": "Hãy lập một danh sách duy nhất để quản lý tất cả các máy móc bạn đang sử dụng.",
|
|
"welcome_terminal": "Kết nối ngay lập tức",
|
|
"welcome_terminal_desc": "Mở cửa sổ dòng lệnh trong một tab, không cần sử dụng trình khách SSH riêng biệt.",
|
|
"welcome_files": "Duyệt và chỉnh sửa tệp",
|
|
"welcome_files_desc": "Tải lên, tải xuống và chỉnh sửa các tệp từ xa.",
|
|
"presetTitle": "Bạn muốn hiển thị bao nhiêu trên màn hình?",
|
|
"presetIntro": "Termix có thể đơn giản hoặc chi tiết tùy thích. Hãy chọn một điểm bắt đầu.",
|
|
"presetChangeLater": "Bạn có thể chuyển đổi giữa các thiết lập sẵn hoặc thay đổi bất kỳ thiết lập nào sau này trong phần Cài đặt, mục Giao diện.",
|
|
"appearanceTitle": "Hãy biến nó thành của bạn",
|
|
"appearanceIntro": "Chọn chủ đề, màu nhấn và ngôn ngữ của bạn. Bạn có thể thay đổi cả ba sau này trong phần Cài đặt.",
|
|
"featuresTitle": "Ngoài ra, Termix còn cung cấp những dịch vụ gì khác?",
|
|
"featuresIntro": "Mỗi máy chủ bạn lưu có thể được mở trong nhiều cửa sổ dòng lệnh khác nhau. Đây là những gì đang chờ đợi phía sau các biểu tượng bên trái.",
|
|
"featuresRailHint": "Không cần những biểu tượng này? Hãy ẩn bất kỳ biểu tượng nào khỏi thanh bên trong Cài đặt, mục Điều hướng.",
|
|
"workflowTitle": "Di chuyển nhanh hơn",
|
|
"workflowIntro": "Một vài thói quen giúp tiết kiệm thời gian nhất khi bạn đã có một vài máy chủ.",
|
|
"workflow_palette": "Bảng lệnh",
|
|
"workflow_palette_desc": "Bạn có thể truy cập bất kỳ máy chủ hoặc hành động nào bằng cách nhập văn bản. Nhấn Shift hai lần để mở.",
|
|
"workflow_split": "Chia màn hình",
|
|
"workflow_split_desc": "Show several tabs side by side, for example to watch logs while you work.",
|
|
"workflow_dock": "Tấm bên hông",
|
|
"workflow_dock_desc": "Nhấp chuột giữa hoặc nhấp chuột phải vào biểu tượng thanh bên để mở nó dưới dạng tab hoặc ghim nó vào bên phải.",
|
|
"securityTitle": "Bảo vệ thông tin đăng nhập của bạn",
|
|
"securityIntro": "Termix lưu trữ thông tin đăng nhập của bạn, vì vậy bạn nên dành chút thời gian tìm hiểu cách thức hoạt động của nó.",
|
|
"security_credentials": "Thông tin xác thực có thể tái sử dụng",
|
|
"security_credentials_desc": "Bạn chỉ cần lưu khóa hoặc mật khẩu một lần và gắn nó vào bao nhiêu máy chủ tùy thích.",
|
|
"security_twofa": "Xác thực hai yếu tố và mật khẩu",
|
|
"security_twofa_desc": "Thêm mã TOTP hoặc mật khẩu vào tài khoản của bạn trong phần Cài đặt, mục Bảo mật.",
|
|
"security_identity": "Mã định danh Termix",
|
|
"security_identity_desc": "Hãy cấp chứng chỉ SSH có thời hạn ngắn thay vì sao chép khóa đến từng máy chủ.",
|
|
"security_sharing": "Chia sẻ",
|
|
"security_sharing_desc": "Cấp quyền truy cập máy chủ cho người dùng khác mà không cần cung cấp mật khẩu.",
|
|
"securityEncryptionNote": "Thông tin đăng nhập được mã hóa trước khi lưu trữ và chỉ được giải mã khi cần thiết cho việc kết nối.",
|
|
"doneTitle": "Bạn đã sẵn sàng",
|
|
"doneHeading": "Cài đặt hoàn tất",
|
|
"doneDesc": "Chọn một máy chủ từ thanh bên để mở cửa sổ dòng lệnh, xem các tệp hoặc xem số liệu của nó.",
|
|
"done_settings": "Bạn có thể thay đổi bất cứ điều gì sau này",
|
|
"done_settings_desc": "Các tùy chọn về chủ đề, mật độ bố cục và biểu tượng hiển thị đều nằm trong phần Cài đặt.",
|
|
"done_rerun": "Bạn muốn gọi lại món này không?",
|
|
"done_rerun_desc": "Mở Cài đặt, vào Giao diện và chọn Chạy thiết lập để thực hiện lại các bước này.",
|
|
"done_desktop": "Ứng dụng máy tính để bàn",
|
|
"done_desktop_desc": "Termix hoạt động như một ứng dụng máy tính để bàn trên Windows, macOS và Linux.",
|
|
"done_desktop_link": "Tải ứng dụng dành cho máy tính để bàn",
|
|
"done_mobile": "Ứng dụng di động",
|
|
"done_mobile_desc": "Mang theo máy chủ của bạn trên iOS và Android.",
|
|
"done_mobile_link": "Tải ứng dụng di động",
|
|
"done_docs": "Tài liệu đầy đủ",
|
|
"done_docs_desc": "Hướng dẫn chi tiết cho mọi tính năng, bao gồm cả những tính năng không được đề cập ở đây.",
|
|
"done_docs_link": "Mở tài liệu",
|
|
"done_cli": "Công cụ dòng lệnh",
|
|
"done_cli_desc": "Quản lý máy chủ của bạn từ thiết bị đầu cuối và sử dụng Termix trong các tập lệnh của riêng bạn.",
|
|
"done_cli_link": "Mở tài liệu CLI",
|
|
"desktopTitle": "How do you want to use Termix?",
|
|
"desktopBody": "You can change this any time from Sync in the sidebar.",
|
|
"desktopLocalTitle": "On this device only",
|
|
"desktopLocalBody": "Everything is stored here. Nothing to set up.",
|
|
"desktopLinkTitle": "With my Termix server",
|
|
"desktopLinkBody": "Sign in to your server to use the same hosts and settings on every device.",
|
|
"desktopLinked": "Linked to {{server}}"
|
|
},
|
|
"nav": {
|
|
"home": "Trang chủ",
|
|
"terminal": "Terminal",
|
|
"fileManager": "Quản lý tệp",
|
|
"serverStats": "Chỉ số máy chủ",
|
|
"admin": "Quản trị",
|
|
"userProfile": "Hồ sơ người dùng",
|
|
"confirmClose": "Đóng phiên đang hoạt động?",
|
|
"close": "Đóng",
|
|
"cancel": "Hủy",
|
|
"sshManager": "Trình quản lý SSH",
|
|
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
|
|
"copyPassword": "Sao chép mật khẩu",
|
|
"copySudoPassword": "Sao chép mật khẩu Sudo",
|
|
"passwordCopied": "Đã sao chép mật khẩu",
|
|
"noPasswordAvailable": "Không có mật khẩu",
|
|
"failedToCopyPassword": "Không thể sao chép mật khẩu",
|
|
"refreshTab": "Làm mới kết nối",
|
|
"renameTab": "Đổi tên tab",
|
|
"dashboard": "Bảng điều khiển",
|
|
"quickConnect": "Kết nối nhanh",
|
|
"openAsTabHint": "Nhấn Ctrl + chuột hoặc chuột giữa để mở dưới dạng tab",
|
|
"openAsTab": "Mở dưới dạng tab",
|
|
"openInRightDock": "Mở trong thanh công cụ bên phải",
|
|
"closeRightDock": "Đóng bến tàu bên phải",
|
|
"toggleRightDock": "Bật/tắt thanh công cụ bên phải",
|
|
"multiPanelHintTitle": "Làm việc với nhiều hơn một bảng điều khiển",
|
|
"multiPanelHintBody": "Hãy giữ cho bảng điều khiển này luôn mở trong khi thanh bên được sử dụng cho mục đích khác. Có hai cách để di chuyển nó:",
|
|
"multiPanelHintTabHow": "Nhấn giữ phím Ctrl và nhấp chuột vào biểu tượng trên thanh ray, hoặc sử dụng nút ở phần tiêu đề này.",
|
|
"multiPanelHintDockHow": "Nhấp chuột phải vào biểu tượng thanh ray hoặc sử dụng biểu tượng bảng điều khiển trên thanh tab.",
|
|
"sidebarSettings": "Cài đặt thanh bên...",
|
|
"hosts": "Máy chủ",
|
|
"hostManager": "Quản lý máy chủ",
|
|
"credentials": "Thông tin đăng nhập",
|
|
"connections": "Kết nối",
|
|
"keepSideMenuOpen": "Giữ menu luôn mở",
|
|
"collapseSideMenu": "Menu thu gọn",
|
|
"roleAdministrator": "Quản trị viên",
|
|
"roleUser": "Người dùng",
|
|
"sync": "Sync",
|
|
"reconnectDisconnectedTerminals": "Reconnect all disconnected terminals",
|
|
"reconnectingTerminals_one": "Reconnecting {{count}} terminal",
|
|
"reconnectingTerminals_other": "Reconnecting {{count}} terminals",
|
|
"noDisconnectedTerminals": "No disconnected terminals are ready to reconnect",
|
|
"reconnectTerminalsFailed_one": "Could not start reconnecting {{count}} terminal",
|
|
"reconnectTerminalsFailed_other": "Could not start reconnecting {{count}} terminals",
|
|
"fullscreenUnsupported": "Fullscreen is not supported by this browser",
|
|
"fullscreenFailed": "Could not toggle fullscreen",
|
|
"resetSidebarWidth": "Reset width",
|
|
"collapseSidebar": "Collapse sidebar",
|
|
"openSidebar": "Open sidebar",
|
|
"confirmCloseHost": "Close {{host}}?",
|
|
"enterFullscreen": "Enter fullscreen (Ctrl+Shift+F)",
|
|
"exitFullscreen": "Exit fullscreen (Ctrl+Shift+F)"
|
|
},
|
|
"hosts": {
|
|
"hosts": "Máy chủ",
|
|
"noHosts": "Không có máy chủ SSH",
|
|
"retry": "Thử lại",
|
|
"refresh": "Làm mới",
|
|
"optional": "Tùy chọn",
|
|
"downloadSample": "Tải mẫu",
|
|
"failedToDeleteHost": "Xóa {{name}} thất bại",
|
|
"importSkipExisting": "Nhập (bỏ qua các mục đã có)",
|
|
"importSSHConfig": "Nhập từ cấu hình SSH",
|
|
"connectionDetails": "Chi tiết kết nối",
|
|
"ssh": "SSH",
|
|
"telnet": "Telnet",
|
|
"port": "Cổng",
|
|
"username": "Tên đăng nhập",
|
|
"folder": "Thư mục",
|
|
"tags": "Thẻ",
|
|
"pin": "Ghim",
|
|
"addHost": "Thêm máy chủ",
|
|
"editHost": "Sửa máy chủ",
|
|
"cloneHost": "Sao chép máy chủ",
|
|
"defaultPath": "Đường dẫn mặc định",
|
|
"connection": "Kết nối",
|
|
"upload": "Tải lên",
|
|
"authentication": "Xác thực",
|
|
"password": "Mật khẩu",
|
|
"passwordSaved": "Mật khẩu đã được lưu, nhập để thay đổi",
|
|
"key": "Khóa",
|
|
"credential": "Thông tin xác thực",
|
|
"sshPrivateKey": "Khóa riêng SSH",
|
|
"keyType": "Loại khóa",
|
|
"uploadFile": "Tải tệp lên",
|
|
"tabGeneral": "Chung",
|
|
"tabSsh": "SSH",
|
|
"tabStats": "Số liệu máy chủ",
|
|
"tabSharing": "Chia sẻ",
|
|
"tabAuthentication": "Xác thực",
|
|
"terminal": "Terminal",
|
|
"tunnel": "Đường hầm",
|
|
"serverStats": "Số liệu máy chủ",
|
|
"status": {
|
|
"available": "Có sẵn",
|
|
"reachable": "Up, but the last sign in failed",
|
|
"offline": "Ngoại tuyến",
|
|
"monitoringDisabled": "Chức năng giám sát đã bị vô hiệu hóa.",
|
|
"label": "Trạng thái"
|
|
},
|
|
"folderRenamed": "Đã đổi tên thư mục \"{{oldName}}\" thành \"{{newName}}\" thành công",
|
|
"failedToRenameFolder": "Không thể đổi tên thư mục",
|
|
"unsavedChangesDescription": "Các thay đổi trên máy chủ của bạn chưa được lưu. Bạn có muốn hủy bỏ chúng không?",
|
|
"keepEditing": "Tiếp tục chỉnh sửa",
|
|
"discardChanges": "Hủy bỏ các thay đổi",
|
|
"movedToFolder": "Đã chuyển {{count}} máy chủ vào thư mục \"{{folder}}\"",
|
|
"editHostTooltip": "Chỉnh sửa máy chủ",
|
|
"behavior": "Hành vi",
|
|
"scrollbackBuffer": "Bộ đệm cuộn ngược",
|
|
"sshAgentForwarding": "Chuyển tiếp SSH Agent",
|
|
"selectSnippet": "Chọn đoạn mã",
|
|
"forceKeyboardInteractive": "Buộc dùng Keyboard-Interactive",
|
|
"overrideCredentialUsername": "Ghi đè tên đăng nhập thông tin xác thực",
|
|
"overrideCredentialUsernameDesc": "Sử dụng tên đăng nhập ở trên thay vì tên trong thông tin xác thực",
|
|
"oidcUsernameHint": "Use $external.username to fill in the name you signed in with through SSO or LDAP.",
|
|
"jumpHostChain": "Chuỗi máy chủ trung gian",
|
|
"portKnocking": "Port Knocking",
|
|
"addKnock": "Thêm cổng",
|
|
"addProxyNode": "Thêm nút",
|
|
"proxyNode": "Nút proxy",
|
|
"proxyType": "Loại proxy",
|
|
"sudoPassword": "Mật khẩu Sudo",
|
|
"keepaliveInterval": "Khoảng thời gian Keepalive (ms)",
|
|
"environmentVariables": "Biến môi trường",
|
|
"addVariable": "Thêm biến",
|
|
"docker": "Docker",
|
|
"failedToConnect": "Không thể kết nối tới bảng điều khiển",
|
|
"connect": "Kết nối",
|
|
"disconnect": "Ngắt kết nối",
|
|
"start": "Khởi động",
|
|
"enableStatusCheck": "Bật kiểm tra trạng thái",
|
|
"enableMetrics": "Bật chỉ số",
|
|
"bulkUpdateFailed": "Cập nhật hàng loạt không thành công",
|
|
"selectAll": "Chọn tất cả",
|
|
"deselectAll": "Bỏ chọn tất cả",
|
|
"protocols": "Giao thức",
|
|
"secureShell": "Secure Shell",
|
|
"addressIp": "Địa chỉ / IP",
|
|
"friendlyName": "Tên hiển thị",
|
|
"folderAndAdvanced": "Thư mục & Nâng cao",
|
|
"showAdvancedSettings": "Hiển thị cài đặt nâng cao",
|
|
"hideAdvancedSettings": "Ẩn cài đặt nâng cao",
|
|
"privateNotes": "Ghi chú riêng tư",
|
|
"privateNotesPlaceholder": "Chi tiết về máy chủ này...",
|
|
"pinToTop": "Ghim lên đầu",
|
|
"pinToTopDesc": "Luôn hiển thị máy chủ này ở đầu danh sách",
|
|
"portKnockingSequence": "Chuỗi Port Knocking",
|
|
"addKnockBtn": "Thêm Knock",
|
|
"noPortKnocking": "Không có cấu hình port knocking.",
|
|
"knockPort": "Cổng knock",
|
|
"protocol": "Giao thức",
|
|
"delayAfterMs": "Độ trễ sau (ms)",
|
|
"useSocks5Proxy": "Dùng proxy SOCKS5",
|
|
"useSocks5ProxyDesc": "Định tuyến kết nối qua máy chủ proxy",
|
|
"connectionOrigin": "Nguồn gốc kết nối",
|
|
"connectionOriginDesc": "Nguồn gốc kết nối của máy chủ này. Ghi đè lên cài đặt mặc định toàn cục của ứng dụng trên máy tính để bàn.",
|
|
"connectionOriginDefault": "Sử dụng mặc định",
|
|
"connectionOriginLocal": "Thiết bị này (mạng cục bộ)",
|
|
"connectionOriginRemote": "Máy chủ từ xa",
|
|
"proxyHost": "Máy chủ proxy",
|
|
"proxyPort": "Cổng proxy",
|
|
"proxyUsername": "Tên người dùng proxy",
|
|
"proxyPassword": "Mật khẩu proxy",
|
|
"proxySingleMode": "Proxy đơn",
|
|
"proxyChainMode": "Chuỗi proxy",
|
|
"you": "Bạn",
|
|
"jumpHostChainLabel": "Chuỗi máy chủ trung gian",
|
|
"addJumpBtn": "Thêm máy trung gian",
|
|
"noJumpHosts": "Không có máy chủ trung gian nào được cấu hình.",
|
|
"selectAServer": "Chọn máy chủ...",
|
|
"sshPort": "Cổng SSH",
|
|
"authMethod": "Phương thức xác thực",
|
|
"authenticationMethod": "Phương thức xác thực",
|
|
"authenticationMethodDesc": "Hãy chọn phương thức mà Termix sẽ sử dụng để xác thực kết nối SSH này. Các phương thức khác sẽ không được thử tự động.",
|
|
"storedCredential": "Thông tin xác thực đã lưu",
|
|
"selectACredential": "Chọn thông tin xác thực...",
|
|
"keyTypeLabel": "Loại khóa",
|
|
"keyTypeAuto": "Tự động phát hiện",
|
|
"keyPasteTab": "Dán",
|
|
"keyUploadTab": "Tải lên",
|
|
"keyFileLoaded": "Đã tải tệp khóa",
|
|
"keyUploadClick": "Nhấn để tải lên .pem / .key / .ppk",
|
|
"clearKey": "Xóa khóa",
|
|
"keySaved": "Đã lưu khóa SSH",
|
|
"keyReplaceNotice": "dán khóa mới bên dưới để thay thế",
|
|
"keyPassphraseSaved": "Đã lưu cụm mật khẩu, nhập để thay đổi",
|
|
"replaceKey": "Thay khóa",
|
|
"docsLink": "Xem tài liệu",
|
|
"agentLabel": "SSH Agent",
|
|
"agentDesc": "Xác thực bằng SSH agent chạy trên máy chủ Termix (Bitwarden, 1Password, gpg-agent, KeeAgent, ssh-agent). Agent phải đang chạy trên máy chạy Termix.",
|
|
"agentAuthenticationDesc": "Sử dụng khóa từ SSH agent để xác thực kết nối này. Để trống đường dẫn socket để sử dụng SSH_AUTH_SOCK.",
|
|
"agentSocketPathLabel": "Đường dẫn socket của Agent",
|
|
"agentSocketPathPlaceholder": "Để trống để sử dụng SSH_AUTH_SOCK",
|
|
"agentSocketPathHint": "Để trống để tự động phát hiện từ biến môi trường SSH_AUTH_SOCK, hoặc nhập đường dẫn socket tùy chỉnh (ví dụ: /run/user/1000/gnupg/S.gpg-agent.ssh).",
|
|
"agentIdentityLabel": "Thông tin nhận dạng của tác nhân (Khóa công khai)",
|
|
"agentIdentityPlaceholder": "Để trống để thử tất cả các phím từ trình quản lý.",
|
|
"agentIdentityHint": "Dán khóa công khai (ví dụ: ssh-ed25519 AAAA...) để chỉ cho phép sử dụng khóa đó từ tác nhân. Cách này được khuyến nghị khi tác nhân giữ nhiều khóa, để tránh vượt quá giới hạn MaxAuthTries của máy chủ.",
|
|
"shareSshAuthLabel": "Chia sẻ xác thực SSH",
|
|
"shareSshAuthDesc": "Cung cấp cho người nhận bản sao đã mã hóa thông tin xác thực SSH của máy chủ này. Thông tin xác thực cá nhân của người nhận vẫn được ưu tiên.",
|
|
"forceKeyboardInteractiveLabel": "Bắt buộc Keyboard Interactive",
|
|
"forceKeyboardInteractiveShortDesc": "Buộc nhập mật khẩu thủ công ngay cả khi có khóa",
|
|
"allowLegacyAlgorithmsLabel": "Cho phép thuật toán cũ",
|
|
"allowLegacyAlgorithmsDesc": "Kích hoạt các thuật toán SSH đã lỗi thời (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) cho kết nối đến các thiết bị cũ không thể nâng cấp.",
|
|
"insecure": "Không an toàn",
|
|
"syntaxHighlightingCategories": "Danh mục tô sáng",
|
|
"syntaxHighlightingCategoriesDesc": "Chọn loại nội dung cần tô màu",
|
|
"sshAgentForwardingLabel": "Chuyển tiếp SSH Agent",
|
|
"sshAgentForwardingShortDesc": "Cho phép máy chủ từ xa này sử dụng tác nhân SSH cục bộ của bạn để thiết lập các kết nối tiếp theo. Điều này không bắt buộc đối với việc xác thực tác nhân.",
|
|
"sudoPasswordAutoFillShortDesc": "Tự động cung cấp mật khẩu sudo khi được yêu cầu",
|
|
"sudoPasswordLabel": "Mật khẩu sudo",
|
|
"sudoPasswordSaved": "Mật khẩu đã được lưu, nhập để thay đổi",
|
|
"environmentVariablesLabel": "Biến môi trường",
|
|
"addVariableBtn": "Thêm biến",
|
|
"noEnvVars": "Chưa cấu hình biến môi trường nào.",
|
|
"keepaliveIntervalLabel": "Khoảng thời gian Keepalive (giây)",
|
|
"maxKeepaliveMisses": "Số lần bỏ lỡ Keepalive tối đa",
|
|
"sameHost": "Máy chủ này (đường hầm trực tiếp)",
|
|
"statusChecksLabel": "Kiểm tra trạng thái",
|
|
"enableStatusChecks": "Bật Kiểm tra trạng thái",
|
|
"enableStatusChecksDesc": "Định kỳ ping máy này để xác minh tính khả dụng",
|
|
"useGlobalInterval": "Dùng khoảng thời gian toàn cục",
|
|
"useGlobalIntervalDesc": "Ghi đè bằng khoảng thời gian kiểm tra trạng thái toàn máy chủ",
|
|
"checkIntervalS": "Khoảng kiểm tra (giây)",
|
|
"checkIntervalDesc": "Số giây giữa mỗi lần ping kết nối",
|
|
"cpuUsageLabel": "Sử dụng CPU",
|
|
"cpuUsageDesc": "Phần trăm CPU, tải trung bình, biểu đồ sparkline",
|
|
"memoryLabel": "Sử dụng bộ nhớ",
|
|
"memoryDesc": "Sử dụng RAM, swap, cache",
|
|
"storageLabel": "Sử dụng đĩa",
|
|
"storageDesc": "Sử dụng đĩa theo điểm gắn kết",
|
|
"networkLabel": "Giao diện mạng",
|
|
"networkDesc": "Danh sách giao diện và băng thông",
|
|
"uptimeLabel": "Thời gian hoạt động",
|
|
"uptimeDesc": "Thời gian hoạt động và thời điểm khởi động",
|
|
"systemInfoLabel": "Thông tin hệ thống",
|
|
"systemInfoDesc": "Hệ điều hành, nhân, tên máy, kiến trúc",
|
|
"recentLoginsLabel": "Đăng nhập gần đây",
|
|
"recentLoginsDesc": "Sự kiện đăng nhập thành công và thất bại",
|
|
"topProcessesLabel": "Tiến trình hàng đầu",
|
|
"topProcessesDesc": "PID, CPU%, MEM%, lệnh",
|
|
"listeningPortsLabel": "Cổng đang lắng nghe",
|
|
"listeningPortsDesc": "Cổng mở với tiến trình và trạng thái",
|
|
"firewallLabel": "Tường lửa",
|
|
"firewallDesc": "Trạng thái tường lửa, AppArmor, SELinux",
|
|
"hostSharedSuccessfully": "Đã chia sẻ máy thành công",
|
|
"failedToShareHost": "Chia sẻ máy thất bại",
|
|
"accessRevoked": "Đã thu hồi quyền truy cập",
|
|
"failedToRevokeAccess": "Thu hồi quyền truy cập thất bại",
|
|
"cancelBtn": "Hủy",
|
|
"savingBtn": "Đang lưu...",
|
|
"addHostBtn": "Thêm máy",
|
|
"hostUpdated": "Đã cập nhật máy",
|
|
"hostCreated": "Đã tạo máy",
|
|
"failedToSave": "Lưu máy thất bại",
|
|
"credentialUpdated": "Đã cập nhật thông tin xác thực",
|
|
"credentialCreated": "Đã tạo thông tin xác thực",
|
|
"failedToSaveCredential": "Lưu thông tin xác thực thất bại",
|
|
"credentialNameRequired": "Vui lòng nhập tên cho thông tin xác thực",
|
|
"credentialAuthRequired": "Thêm mật khẩu, khóa SSH, hoặc cả hai",
|
|
"createCredentialFromHostBtn": "Tạo thông tin xác thực",
|
|
"createCredentialFromHostTitle": "Tạo thông tin xác thực từ máy chủ",
|
|
"createCredentialFromHostDesc": "Tạo một mục thông tin đăng nhập có thể tái sử dụng và chia sẻ, được điền sẵn tên người dùng, mật khẩu và/hoặc khóa SSH hiện tại của máy chủ này.",
|
|
"backToHosts": "Quay lại Máy chủ",
|
|
"pinned": "Đã ghim",
|
|
"noHostsFound": "Không tìm thấy máy chủ",
|
|
"tryDifferentTerm": "Thử từ khóa khác",
|
|
"addFirstHost": "Thêm máy chủ đầu tiên để bắt đầu",
|
|
"noCredentialsFound": "Không tìm thấy thông tin xác thực",
|
|
"addCredentialBtn": "Thêm Chứng thực",
|
|
"updateCredentialBtn": "Cập nhật Chứng thực",
|
|
"editCredentialAction": "Chỉnh sửa thông tin đăng nhập",
|
|
"backToHost": "Trở lại trang chủ",
|
|
"saveCredentialAsNewBtn": "Lưu dưới dạng mới",
|
|
"saveCredentialAsNewDesc": "Tạo một thông tin xác thực mới với những thay đổi này và gán nó cho máy chủ này. Thông tin xác thực ban đầu vẫn được giữ nguyên.",
|
|
"credentialSavedAsNew": "Đã lưu dưới dạng thông tin đăng nhập mới",
|
|
"failedToSaveCredentialAsNew": "Không thể lưu thông tin đăng nhập mới.",
|
|
"features": "Tính năng",
|
|
"noFolder": "(Không có thư mục)",
|
|
"deleteSelected": "Xóa",
|
|
"exitSelection": "Thoát chọn",
|
|
"importSkip": "Nhập (bỏ qua mục đã có)",
|
|
"importOverwrite": "Nhập (ghi đè)",
|
|
"collapseBtn": "Thu gọn",
|
|
"importExportBtn": "Nhập / Xuất",
|
|
"hostStatusesRefreshed": "Đã làm mới trạng thái máy chủ",
|
|
"failedToRefreshHosts": "Không thể làm mới máy chủ",
|
|
"movedHostTo": "Đã di chuyển {{host}} vào \"{{folder}}\"",
|
|
"failedToMoveHost": "Không thể di chuyển máy chủ",
|
|
"deletedFolder": "Đã xóa thư mục \"{{name}}\"",
|
|
"failedToDeleteFolder": "Không thể xóa thư mục",
|
|
"deleteAllInFolder": "Xóa tất cả máy chủ trong \"{{name}}\"? Hành động này không thể hoàn tác.",
|
|
"folderPickerPlaceholder": "Không có thư mục",
|
|
"folderPickerSearch": "Tìm kiếm hoặc tạo mới (dùng / cho thư mục con)...",
|
|
"folderPickerNone": "Không có thư mục",
|
|
"folderPickerCreate": "Tạo \"{{path}}\"",
|
|
"folderPickerEmpty": "Không tìm thấy thư mục phù hợp",
|
|
"parentHost": "Cha mẹ chủ trì",
|
|
"useFolderInstead": "Hãy sử dụng thư mục thay thế.",
|
|
"useParentHostInstead": "Hãy sử dụng máy chủ cha thay thế",
|
|
"parentHostPickerPlaceholder": "Không có máy chủ cha",
|
|
"parentHostPickerSearch": "Tìm kiếm máy chủ...",
|
|
"parentHostPickerNone": "Không có máy chủ cha",
|
|
"parentHostPickerEmpty": "Không tìm thấy máy chủ phù hợp",
|
|
"collapseSubHosts": "Thu gọn các máy chủ con",
|
|
"expandSubHosts": "Mở rộng máy chủ con",
|
|
"cannotNestUnderDescendant": "Không thể lồng một máy chủ vào bên trong máy chủ con của chính nó.",
|
|
"movedToParent": "Đã di chuyển {{count}} máy chủ vào \"{{parent}}\"",
|
|
"newFolder": "Thư mục mới",
|
|
"createFolderTitle": "Tạo thư mục",
|
|
"editFolderTitle": "Sửa thư mục",
|
|
"folderDialogDescription": "Chọn tên, màu sắc và biểu tượng. Dùng / để lồng thư mục.",
|
|
"folderNameLabel": "Tên thư mục",
|
|
"folderNamePlaceholder": "VD: Production/Web",
|
|
"folderNestingHint": "Sử dụng / để phân cách các cấp và tạo thư mục lồng.",
|
|
"folderNameDuplicate": "Đã có một thư mục với tên này tồn tại ở đây.",
|
|
"folderColor": "Màu",
|
|
"folderIcon": "Biểu tượng",
|
|
"folderCredential": "Chứng chỉ",
|
|
"folderCredentialNone": "Chưa được cấp chứng chỉ.",
|
|
"folderCredentialHint": "Các máy chủ trong thư mục này sử dụng phương thức xác thực \"Thông tin đăng nhập đã lưu\" mà không chọn thông tin đăng nhập riêng sẽ kế thừa thông tin đăng nhập này.",
|
|
"folderPreview": "Xem trước",
|
|
"folderNameFallback": "Thư mục không tên",
|
|
"createFolderButton": "Tạo thư mục",
|
|
"saveFolderButton": "Lưu thư mục",
|
|
"cancel": "Hủy",
|
|
"iconSearchPlaceholder": "Tìm kiếm biểu tượng...",
|
|
"openAllSessions": "Mở tất cả phiên",
|
|
"editFolder": "Chỉnh sửa thư mục",
|
|
"deleteFolder": "Xóa thư mục",
|
|
"selectFolder": "Chọn tất cả các máy chủ trong thư mục",
|
|
"deselectFolder": "Bỏ chọn tất cả máy chủ trong thư mục",
|
|
"folderSaved": "Đã lưu thư mục",
|
|
"failedToSaveFolder": "Không thể lưu thư mục",
|
|
"folderDeleted": "Đã xóa thư mục \"{{name}}\"",
|
|
"deleteFolderConfirm": "Xóa \"{{name}}\" và {{count}} máy chủ trong đó? Thao tác này không thể hoàn tác.",
|
|
"failedToMoveHosts": "Không thể di chuyển máy chủ",
|
|
"failedToReorder": "Không thể đặt hàng lại",
|
|
"expandAll": "Mở rộng tất cả thư mục",
|
|
"collapseAll": "Thu gọn tất cả thư mục",
|
|
"moreActions": "Khác",
|
|
"groupBy": "Nhóm theo",
|
|
"GroupByFolder": "Thư mục",
|
|
"GroupByTag": "Thẻ",
|
|
"GroupByStatus": "Trạng thái",
|
|
"GroupByProtocol": "Giao thức",
|
|
"GroupByAuth": "Loại xác thực",
|
|
"groupUngrouped": "Không nhóm",
|
|
"customizeSidebar": "Tùy chỉnh thanh bên",
|
|
"customizeSidebarDescription": "Chọn cách hiển thị và hoạt động của danh sách máy chủ.",
|
|
"customizeDensityTitle": "Tỉ trọng",
|
|
"customizeBehaviorTitle": "Hành vi",
|
|
"customizeSortHint": "Chức năng sắp xếp và nhóm nằm trong menu sắp xếp và nhóm trên thanh công cụ.",
|
|
"densityComfortableDesc": "Thông tin chi tiết hơn cho mỗi máy chủ: địa chỉ, thẻ và mức sử dụng tài nguyên.",
|
|
"densityCompactDesc": "Mỗi dòng tương ứng với một máy chủ, đối với danh sách dài hơn.",
|
|
"display": "Trưng bày",
|
|
"displayDensity": "Tỉ trọng",
|
|
"displayDensityComfortable": "Thoải mái",
|
|
"displayDensityCompact": "Nhỏ gọn",
|
|
"displayShowTags": "Hiển thị thẻ",
|
|
"displayTrayOnClick": "Mở các thao tác khi nhấp chuột (thay vì khi di chuột)",
|
|
"actionsVisibility": "Hiển thị hành động của máy chủ",
|
|
"actionsVisibilityDesc": "Chọn thời điểm các thao tác trên máy chủ mở rộng. Chọn nhấp chuột để khôi phục hành vi nhấp chuột để mở rộng trước đó.",
|
|
"actionsAlways": "Luôn hiển thị",
|
|
"actionsOnly": "Chỉ cần kết nối, phần còn lại chỉ cần nhấp chuột.",
|
|
"actionsHover": "Hiển thị khi di chuột",
|
|
"actionsClick": "Nhấp để mở rộng/thu gọn",
|
|
"openOnDoubleClick": "Mở bằng cách nhấp đúp chuột",
|
|
"openOnDoubleClickDesc": "Yêu cầu nhấp đúp chuột để mở phiên máy chủ thay vì chỉ nhấp chuột một lần.",
|
|
"showFolderPaths": "Show folder paths",
|
|
"showFolderPathsDesc": "Show the parent folder path above nested subfolder names. Subfolders stay indented either way.",
|
|
"hostClickBehavior": "Clicking a host",
|
|
"hostClickBehaviorDesc": "What happens when you click a host that already has an open tab. Ctrl/Cmd click, middle click, or \"Open in new tab\" always start a new one.",
|
|
"hostClickNewTab": "Always open a new tab",
|
|
"hostClickFocusExisting": "Switch to the open tab",
|
|
"hostClickFocusExistingDoubleNew": "Click to switch, double click for a new tab",
|
|
"openInNewTab": "Open in new tab",
|
|
"deletedHost": "Đã xóa {{name}}",
|
|
"copiedToClipboard": "Đã sao chép vào bộ nhớ tạm",
|
|
"remoteDesktopUrlCopied": "Đã sao chép URL Remote Desktop",
|
|
"expandActions": "Mở rộng thao tác",
|
|
"collapseActions": "Thu gọn thao tác",
|
|
"cloneHostAction": "Sao chép Host",
|
|
"copyAddress": "Sao chép địa chỉ",
|
|
"copyLink": "Sao chép liên kết",
|
|
"deleteCredentialConfirm": "Xóa thông tin xác thực \"{{name}}\"?",
|
|
"deletedCredential": "Đã xóa {{name}}",
|
|
"deleteHostsConfirm": "Xóa {{count}} host{{plural}}? Hành động này không thể hoàn tác.",
|
|
"movedToRoot": "Đã chuyển về thư mục gốc",
|
|
"addTagsPlaceholder": "Thêm thẻ...",
|
|
"authDetails": "Chi tiết xác thực",
|
|
"credType": "Loại",
|
|
"generateKeyPairDesc": "Tạo cặp khóa mới, khóa riêng tư và công khai sẽ được tự động điền.",
|
|
"generatingKey": "Đang tạo...",
|
|
"generateLabel": "Tạo {{label}}",
|
|
"uploadFileBtn": "Tải tệp lên",
|
|
"keyPassphraseOptional": "Cụm mật khẩu khóa (Tuỳ chọn)",
|
|
"sshPublicKeyOptional": "Khóa công khai SSH (Tuỳ chọn)",
|
|
"publicKeyGenerated": "Đã tạo khóa công khai",
|
|
"failedToGeneratePublicKey": "Không thể suy ra khóa công khai",
|
|
"publicKeyCopied": "Đã sao chép khóa công khai",
|
|
"keyPairGenerated": "Đã tạo cặp khóa {{label}}",
|
|
"failedToGenerateKeyPair": "Không thể tạo cặp khóa",
|
|
"searchHostsPlaceholder": "Tìm kiếm máy chủ, địa chỉ, thẻ…",
|
|
"refreshBtn": "Làm mới",
|
|
"addTag": "Thêm thẻ...",
|
|
"deleteConfirmBtn": "Xoá",
|
|
"deleteHostConfirm": "Xoá \"{{name}}\"?",
|
|
"enableAtLeastOneProtocol": "Bật ít nhất một giao thức ở trên để cấu hình cài đặt xác thực và kết nối.",
|
|
"keyPassphrase": "Cụm mật khẩu khóa",
|
|
"basicInformation": "Thông tin cơ bản",
|
|
"authDetailsSection": "Chi tiết xác thực",
|
|
"credTypeLabel": "Loại",
|
|
"hostsTab": "Máy chủ",
|
|
"credentialsTab": "Thông tin xác thực",
|
|
"selectMultiple": "Chọn nhiều",
|
|
"selectHosts": "Chọn máy chủ",
|
|
"connectionLabel": "Kết nối",
|
|
"authenticationLabel": "Xác thực",
|
|
"generateKeyPairTitle": "Tạo cặp khóa",
|
|
"generateKeyPairDescription": "Tạo cặp khóa mới, cả khóa riêng tư và khóa công khai sẽ được tự động điền.",
|
|
"generateFromPrivateKey": "Tạo từ khóa riêng tư",
|
|
"refreshBtn2": "Làm mới",
|
|
"exitSelectionTitle": "Thoát chọn",
|
|
"addHostBtn2": "Thêm máy chủ",
|
|
"addCredentialBtn2": "Thêm thông tin xác thực",
|
|
"checkingHostStatuses": "Đang kiểm tra trạng thái máy chủ...",
|
|
"pinnedSection": "Đã ghim",
|
|
"hostsExported": "Đã xuất máy chủ thành công",
|
|
"export": {
|
|
"menuItem": "Xuất khẩu...",
|
|
"title": "Máy chủ xuất khẩu",
|
|
"scope": "Phạm vi",
|
|
"scopeAll": "Tất cả",
|
|
"scopeSelected": "Đã chọn",
|
|
"searchHosts": "Tìm kiếm máy chủ...",
|
|
"include": "Bao gồm",
|
|
"groupConnection": "Sự liên quan",
|
|
"groupCredentials": "Thông tin xác thực",
|
|
"groupNotes": "Ghi chú",
|
|
"groupTags": "Thẻ & ghim",
|
|
"groupProxy": "Proxy",
|
|
"groupJumpHosts": "Người dẫn chương trình Jump",
|
|
"groupFeatureFlags": "Cờ tính năng",
|
|
"groupAdvanced": "Cấu hình nâng cao",
|
|
"preview": "Xem trước",
|
|
"moreHosts": "... {{count}} thêm máy chủ",
|
|
"summary": "{{selected}} trong số {{total}} máy chủ",
|
|
"credentialsIncluded": "bao gồm thông tin xác thực",
|
|
"credentialsExcluded": "thông tin xác thực bị loại trừ",
|
|
"noneSelected": "Chưa có máy chủ nào được chọn.",
|
|
"cancel": "Hủy bỏ",
|
|
"confirm": "Xuất khẩu",
|
|
"fetchFailed": "Không thể tải các máy chủ để xuất.",
|
|
"bulkButton": "Xuất khẩu"
|
|
},
|
|
"sampleDownloaded": "Đã tải tệp mẫu",
|
|
"failedToDeleteCredential2": "Xóa thông tin xác thực thất bại",
|
|
"noFolderOption": "(Không có thư mục)",
|
|
"nSelected": "{{count}} đã chọn",
|
|
"featuresMenu": "Tính năng",
|
|
"moveMenu": "Di chuyển",
|
|
"connectSelected": "Kết nối",
|
|
"cancelSelection": "Hủy",
|
|
"deletedCount": "Đã xóa {{count}} máy chủ",
|
|
"failedToDeleteCount": "Xóa {{count}} máy chủ thất bại",
|
|
"duplicatedHost": "Đã trùng lặp \"{{name}}\"",
|
|
"failedToDuplicateHost": "Không thể sao chép máy chủ",
|
|
"updatedCount": "Đã cập nhật {{count}} máy chủ",
|
|
"friendlyNameLabel": "Tên hiển thị",
|
|
"descriptionLabel": "Mô tả",
|
|
"loadingHosts": "Đang tải các máy chủ...",
|
|
"loadingCredentials": "Đang tải thông tin xác thực...",
|
|
"noHostsYet": "Chưa có máy chủ nào",
|
|
"noHostsYetHint": "Thêm máy chủ để mở cửa sổ dòng lệnh, duyệt tập tin và xem số liệu.",
|
|
"noHostsMatchSearch": "Không có máy chủ nào khớp với tìm kiếm của bạn",
|
|
"searchHosts": "Tìm kiếm máy chủ...",
|
|
"sortHosts": "Sắp xếp Máy chủ",
|
|
"sortDefault": "Thứ tự mặc định",
|
|
"sortNameAsc": "Tên (A → Z)",
|
|
"sortNameDesc": "Tên (Z → A)",
|
|
"sortIpAsc": "Địa chỉ IP (Tăng dần)",
|
|
"sortIpDesc": "Địa chỉ IP (Giảm dần)",
|
|
"sortOnlineFirst": "Trực tuyến trước",
|
|
"sortOfflineFirst": "Ngoại tuyến trước",
|
|
"sortManual": "Hướng dẫn sử dụng (kéo để sắp xếp lại)",
|
|
"sortPinnedFirst": "Đã ghim trước",
|
|
"filterHosts": "Lọc Máy chủ",
|
|
"filterClearAll": "Xóa bộ lọc",
|
|
"filterStatusGroup": "Trạng thái",
|
|
"filterOnline": "Trực tuyến",
|
|
"filterOffline": "Ngoại tuyến",
|
|
"filterPinned": "Đã ghim",
|
|
"filterAuthGroup": "Loại xác thực",
|
|
"filterAuthPassword": "Mật khẩu",
|
|
"filterAuthKey": "Khóa SSH",
|
|
"filterAuthCredential": "Thông tin xác thực",
|
|
"filterAuthNone": "Không",
|
|
"filterProtocolGroup": "Giao thức",
|
|
"filterProtocolSsh": "SSH",
|
|
"filterTagsGroup": "Thẻ",
|
|
"editHostAction": "Chỉnh sửa máy chủ",
|
|
"moreOptions": "Nhiều tùy chọn hơn",
|
|
"shareHost": "Chia sẻ máy chủ",
|
|
"shareHostTitle": "Chia sẻ: {{name}}",
|
|
"shareFolder": "Chia sẻ thư mục",
|
|
"shareFolderTitle": "Chia sẻ thư mục: {{name}}",
|
|
"folderSharedSuccessfully": "Máy chủ dùng chung {{count}} trong thư mục",
|
|
"failedToShareFolder": "Không thể chia sẻ thư mục",
|
|
"sharing": {
|
|
"loadError": "Không thể tải dữ liệu chia sẻ. Vui lòng thử lại.",
|
|
"shareWithSection": "Chia sẻ với",
|
|
"usersTab": "Người dùng",
|
|
"rolesTab": "Vai trò",
|
|
"searchPlaceholder": "Tìm kiếm người dùng hoặc vai trò...",
|
|
"noMatches": "Không tìm thấy kết quả phù hợp",
|
|
"permissionLevelLabel": "Cấp độ quyền",
|
|
"levels": {
|
|
"connect": {
|
|
"label": "Kết nối",
|
|
"description": "Chỉ mở phiên: terminal, remote desktop, trình quản lý file, tunnel và Docker. Không truy cập cấu hình máy chủ."
|
|
},
|
|
"view": {
|
|
"label": "Xem",
|
|
"description": "Kết nối, cùng xem cấu hình máy chủ. Bí mật không bao giờ được hiển thị."
|
|
},
|
|
"edit": {
|
|
"label": "Chỉnh sửa",
|
|
"description": "Xem và chỉnh sửa cài đặt máy chủ không yêu cầu xác thực. Thông tin xác thực SSH của chủ sở hữu vẫn được giữ kín và chỉ dành riêng cho chủ sở hữu."
|
|
},
|
|
"manage": {
|
|
"label": "Quản lý",
|
|
"description": "Chỉnh sửa, và chia sẻ máy chủ với người khác, thay đổi cấp độ quyền và thu hồi quyền truy cập."
|
|
}
|
|
},
|
|
"expiryLabel": "Hết hạn truy cập",
|
|
"expiry": {
|
|
"never": "Không bao giờ",
|
|
"oneHour": "1 giờ",
|
|
"oneDay": "24 giờ",
|
|
"sevenDays": "7 ngày",
|
|
"thirtyDays": "30 ngày",
|
|
"custom": "Tùy chỉnh"
|
|
},
|
|
"customHoursPlaceholder": "Số giờ cho đến khi hết hạn truy cập",
|
|
"shareButton": "Chia sẻ",
|
|
"shareWithCount": "Chia sẻ ({{count}})",
|
|
"currentAccess": "Truy cập hiện tại",
|
|
"noAccessEntries": "Máy chủ này chưa được chia sẻ",
|
|
"folderRulesTitle": "Áp dụng cho các máy chủ được thêm vào sau này.",
|
|
"folderRulesHint": "Các quyền truy cập này vẫn nằm trong thư mục: một máy chủ được tạo hoặc di chuyển vào thư mục đó (hoặc thư mục con) sẽ tự động có quyền truy cập tương tự. Việc xóa một quy tắc chỉ ngăn chặn việc kế thừa quyền truy cập trong tương lai.",
|
|
"folderRuleRemove": "Ngừng kế thừa",
|
|
"folderShareSummary": "Được chia sẻ {{shared}} trong số {{total}} máy chủ trong thư mục này",
|
|
"grantedBy": "Được cấp bởi",
|
|
"expires": "Hết hạn",
|
|
"expired": "Đã hết hạn",
|
|
"never": "Không bao giờ",
|
|
"revoke": "Thu hồi",
|
|
"accessUpdated": "Đã cập nhật quyền truy cập",
|
|
"accessUpdateFailed": "Cập nhật quyền truy cập thất bại",
|
|
"sharedBadge": "Đã chia sẻ",
|
|
"sharedBadgeTooltip": "Được chia sẻ bởi {{owner}} (quyền truy cập {{level}})",
|
|
"viewOnlyBanner": "Máy chủ này được {{owner}} chia sẻ cho bạn với quyền xem. Cấu hình chỉ đọc.",
|
|
"sharedEditBanner": "Máy chủ này được {{owner}} chia sẻ cho bạn với quyền chỉnh sửa. Thay đổi áp dụng cho máy chủ thực; tham chiếu xác thực chỉ có thể được thay đổi bởi chủ sở hữu.",
|
|
"ownerOnlyControl": "Chỉ chủ sở hữu máy chủ mới có thể thay đổi",
|
|
"ownerAuthPrivate": "Thông tin xác thực SSH của chủ sở hữu máy chủ là riêng tư. Sử dụng tùy chọn “Thiết lập xác thực SSH cá nhân” từ menu máy chủ để chọn thông tin đăng nhập của riêng bạn.",
|
|
"ownerAuthShared": "Chủ sở hữu máy chủ đã chia sẻ thông tin xác thực SSH cho máy chủ này. Bạn có thể sử dụng thông tin đó hoặc chọn thông tin đăng nhập của riêng mình từ mục “Thiết lập xác thực SSH cá nhân”.",
|
|
"authOverrideAction": "Thiết lập xác thực SSH cá nhân",
|
|
"authOverrideActionProtocol": "Thiết lập xác thực cá nhân {{protocol}}",
|
|
"authOverrideTitle": "Xác thực SSH cá nhân",
|
|
"authOverrideTitleProtocol": "Xác thực cá nhân {{protocol}}",
|
|
"authOverrideDescriptionPrivate": "Thông tin đăng nhập SSH của chủ sở hữu máy chủ được giữ bí mật. Hãy chọn một trong các thông tin đăng nhập đã lưu của bạn để kết nối với {{host}}.",
|
|
"authOverrideDescriptionShared": "Sử dụng thông tin xác thực do chủ sở hữu máy chủ cung cấp, hoặc thay thế nó bằng một trong những thông tin đăng nhập đã lưu của bạn để kết nối với {{host}}.",
|
|
"authOverrideCredentialLabel": "Thông tin xác thực",
|
|
"useSharedAuthentication": "Sử dụng xác thực máy chủ dùng chung",
|
|
"noPersonalCredential": "Không có giấy tờ chứng nhận cá nhân",
|
|
"authOverrideNoCredentials": "Bạn chưa lưu thông tin đăng nhập SSH nào. Hãy tạo một thông tin đăng nhập trong mục Thông tin đăng nhập để kết nối với các máy chủ yêu cầu xác thực.",
|
|
"authOverrideRequired": "Máy chủ này yêu cầu bạn nhập một trong những thông tin đăng nhập đã lưu trước khi có thể kết nối.",
|
|
"authOverridePrivateHint": "Thông tin đăng nhập này chỉ dành riêng cho bạn. Chủ sở hữu máy chủ và những người nhận khác không thể xem hoặc sử dụng nó.",
|
|
"authOverrideSaved": "Thông tin xác thực SSH cá nhân đã được lưu.",
|
|
"authOverrideCleared": "Xác thực SSH cá nhân đã bị xóa.",
|
|
"authOverrideClearedToShared": "Sử dụng xác thực máy chủ dùng chung",
|
|
"authOverrideLoadError": "Không thể tải thông tin xác thực SSH của bạn. Vui lòng thử lại.",
|
|
"authOverrideSaveError": "Không thể lưu thông tin xác thực SSH của bạn."
|
|
},
|
|
"arrangeUnlockedSwitchedToManual": "Đã chuyển sang chế độ sắp xếp thủ công để đơn hàng của bạn được giữ nguyên.",
|
|
"dragToRearrange": "Kéo để sắp xếp lại",
|
|
"arrangeUnlocked": "Mở khóa chức năng kéo để sắp xếp lại.",
|
|
"webUiBindHostUnreachable": "Trình duyệt của bạn không thể truy cập 127.0.0.1 trên máy đang chạy Termix, vì vậy điểm cuối này sẽ không tải được. Hãy sử dụng địa chỉ mà máy đó có thể trả lời, chẳng hạn như 0.0.0.0.",
|
|
"webUiBindHostSharesSessionCookie": "Từ trình duyệt này, yêu cầu chuyển tiếp sẽ được truy cập tại cùng tên máy chủ mà Termix đang được phục vụ, do đó dịch vụ đường hầm sẽ nhận được phiên Termix của bạn. Cookie bỏ qua cổng. Điểm cuối này sẽ từ chối mở ở đây; nó hoạt động từ ứng dụng Termix dành cho máy tính để bàn hoặc khi Termix được mở tại localhost.",
|
|
"webUiErrorLabelRequired": "Điểm cuối {{row}} cần một nhãn.",
|
|
"webUiErrorLabelDuplicate": "Mỗi điểm cuối cần một tên khác nhau.",
|
|
"webUiErrorPortRange": "Điểm cuối {{row}} cần một cổng nằm trong khoảng từ 1 đến 65535.",
|
|
"webUiErrorPathInvalid": "Điểm cuối {{row}} có đường dẫn không hợp lệ. Hãy sử dụng đường dẫn như /admin.",
|
|
"copyViewUrlAction": "Copy {{name}} link",
|
|
"filterAuthAgent": "SSH Agent",
|
|
"authTypeNeedsPlugin": "This host uses {{type}}, which needs {{plugin}}. It is turned off on this server.",
|
|
"authTypeUnknown": "This host uses {{type}}, which is not available on this server.",
|
|
"authFieldsAfterSave": "Save the host first, then fill in these fields.",
|
|
"enablePluginFeature": "Enable {{name}}",
|
|
"disablePluginFeature": "Disable {{name}}",
|
|
"filterFeaturesGroup": "Tính năng",
|
|
"localOnly": "Keep on this device only",
|
|
"localOnlyDesc": "This host is not sent to the server and does not appear on your other devices.",
|
|
"folderLocalOnly": "Keep on this device only",
|
|
"folderLocalOnlyDesc": "This folder and every host in it stay on this device and are not sent to the server.",
|
|
"sudoPasswordDesc": "Used when the terminal fills a sudo prompt, and by features that run commands with sudo.",
|
|
"editorCancel": "Hủy",
|
|
"editorSaving": "Đang lưu...",
|
|
"editorUpdate": "Cập nhật máy chủ",
|
|
"editorAdd": "Thêm máy chủ",
|
|
"speedSearch": "Search hosts. Arrow keys to select, Enter to connect, Esc to close",
|
|
"speedSearchList": "Host list. Type or press / to search.",
|
|
"importNoHosts": "No hosts found in the file",
|
|
"importTooMany": "You can import up to {{max}} hosts at once",
|
|
"importSummary": "Import done: {{imported}} imported, {{updated}} updated, {{failed}} failed",
|
|
"importHostsFailed": "Failed to import hosts"
|
|
},
|
|
"commandPalette": {
|
|
"searchPlaceholder": "Tìm kiếm máy chủ, lệnh hoặc cài đặt...",
|
|
"quickActions": "Hành động nhanh",
|
|
"navigation": "Điều hướng",
|
|
"orShortcut": "hoặc",
|
|
"hostManager": "Quản lý máy chủ",
|
|
"hostManagerDesc": "Quản lý, thêm hoặc sửa máy chủ",
|
|
"addNewHost": "Thêm máy chủ mới",
|
|
"addNewHostDesc": "Đăng ký máy chủ mới",
|
|
"adminSettings": "Cài đặt quản trị",
|
|
"adminSettingsDesc": "Cấu hình tùy chọn hệ thống và người dùng",
|
|
"userProfile": "Hồ sơ người dùng",
|
|
"userProfileDesc": "Quản lý tài khoản và tùy chọn của bạn",
|
|
"addCredential": "Thêm thông tin xác thực",
|
|
"addCredentialDesc": "Lưu trữ khóa SSH hoặc mật khẩu",
|
|
"recentActivity": "Hoạt động gần đây",
|
|
"serversAndHosts": "Máy chủ & Host",
|
|
"noHostsFound": "Không tìm thấy máy chủ nào khớp với \"{{search}}\"",
|
|
"links": "Liên kết",
|
|
"navigate": "Điều hướng",
|
|
"select": "Chọn",
|
|
"toggleWith": "Chuyển đổi với",
|
|
"pluginActions": "Thao tác khác",
|
|
"noTargetTab": "No terminal tab is open"
|
|
},
|
|
"splitScreen": {
|
|
"title": "Split screen",
|
|
"defaultLabel": "Split {{number}}",
|
|
"splitRight": "Chia sang phải",
|
|
"splitDown": "Chia xuống dưới",
|
|
"addToSplit": "Add to {{split}}",
|
|
"paneEmptyItem": "Pane {{index}}: empty",
|
|
"paneItem": "Pane {{index}}: {{label}}",
|
|
"paneNumber": "Khung {{index}}",
|
|
"newPaneRight": "New pane on the right",
|
|
"newPaneBelow": "New pane below",
|
|
"emptyTitle": "Empty pane",
|
|
"emptyHint": "Pick something to show here. While this pane is selected, anything you open from the sidebar also opens here.",
|
|
"openTabs": "Open tabs",
|
|
"noOpenTabs": "No other tabs are open",
|
|
"hosts": "Máy chủ",
|
|
"searchHosts": "Tìm kiếm máy chủ",
|
|
"noHosts": "No hosts match",
|
|
"newSession": "Mới",
|
|
"closePane": "Close pane",
|
|
"closeSession": "Close session",
|
|
"moveToTab": "Move to its own tab",
|
|
"swapWith": "Swap with",
|
|
"showHere": "Show in this pane",
|
|
"clearPane": "Empty this pane",
|
|
"zoom": "Zoom pane",
|
|
"unzoom": "Restore layout",
|
|
"unsplit": "Unsplit",
|
|
"layouts": "Layouts",
|
|
"applyLayout": "Change layout",
|
|
"newSplit": "New split",
|
|
"maxPanes": "A split can hold up to {{count}} panes",
|
|
"dropSplit": "Drop to split",
|
|
"dropHere": "Drop to show here",
|
|
"paneActions": "Pane actions",
|
|
"dividerHint": "Drag to resize. Double-click to even out.",
|
|
"openInSplit": "Open in split",
|
|
"openInNewSplit": "New split with the current tab",
|
|
"shortcuts": "Shortcuts",
|
|
"shortcutNavigate": "Move between panes",
|
|
"presets": {
|
|
"columns2": "Two side by side",
|
|
"rows2": "Two stacked",
|
|
"columns3": "Three side by side",
|
|
"mainLeft3": "One left, two right",
|
|
"mainBottom3": "Two top, one bottom",
|
|
"grid4": "Grid of four",
|
|
"grid5": "Three over two",
|
|
"grid6": "Grid of six"
|
|
}
|
|
},
|
|
"connections": {
|
|
"noConnections": "Không có kết nối nào",
|
|
"noConnectionsDesc": "Mở terminal, trình quản lý tệp hoặc máy tính từ xa để xem kết nối tại đây",
|
|
"connectedFor": "Đã kết nối trong {{duration}}",
|
|
"connected": "Đã kết nối",
|
|
"disconnected": "Đã ngắt kết nối",
|
|
"closeTab": "Đóng tab",
|
|
"closeConnection": "Đóng kết nối",
|
|
"forgetTab": "Quên",
|
|
"removeBackground": "Xóa",
|
|
"reconnect": "Kết nối lại",
|
|
"reopenTab": "Mở lại",
|
|
"sectionOpen": "Đang mở",
|
|
"sectionBackground": "Nền",
|
|
"backgroundDesc": "Phiên kết nối sẽ duy trì trong {{minutes}} phút sau khi ngắt kết nối và có thể được kết nối lại.",
|
|
"persisted": "Đã duy trì trong nền",
|
|
"expiresIn": "Hết hạn trong {{duration}}",
|
|
"search": "Tìm kiếm kết nối...",
|
|
"noSearchResults": "Không có kết nối nào khớp với tìm kiếm của bạn",
|
|
"rename": "Đổi tên phiên"
|
|
},
|
|
"terminal": {
|
|
"totpRequired": "Yêu cầu xác thực hai yếu tố",
|
|
"totpCodeLabel": "Mã xác minh",
|
|
"totpVerify": "Xác minh",
|
|
"mfaPromptRequired": "Yêu cầu xác thực",
|
|
"mfaPushRequired": "Yêu cầu xác thực đẩy",
|
|
"mfaMenuPlaceholder": "Nhập câu trả lời của bạn",
|
|
"mfaCodeOrPushPlaceholder": "Code or \"push\"",
|
|
"mfaWaitingApproval": "Đang chờ phê duyệt trên thiết bị của bạn...",
|
|
"mfaSendRequest": "Gửi yêu cầu",
|
|
"browserSignInCode": "Khóa bảo mật",
|
|
"browserSignInUrl": "Sign-in URL",
|
|
"browserSignInOpen": "Mở trong trình duyệt",
|
|
"browserSignInContinue": "I've Completed Sign-in",
|
|
"browserSignInRequired": "{{provider}} Sign-in Required",
|
|
"connectionLogTitle": "Nhật ký kết nối",
|
|
"connectionLogCopy": "Sao chép nhật ký vào clipboard",
|
|
"connectionLogEmpty": "Chưa có nhật ký kết nối",
|
|
"connectionLogWaiting": "Đang chờ nhật ký kết nối...",
|
|
"connectionLogCopied": "Đã sao chép nhật ký kết nối vào clipboard",
|
|
"connectionLogCopyFailed": "Sao chép nhật ký vào clipboard thất bại"
|
|
},
|
|
"cardGrid": {
|
|
"dragToMove": "Kéo để di chuyển",
|
|
"dragToResize": "Kéo để thay đổi kích thước",
|
|
"changeWidth": "Thay đổi chiều rộng",
|
|
"removeCard": "Xóa {{label}}",
|
|
"addCard": "Thêm",
|
|
"columns": "Cột",
|
|
"empty": "Không có thẻ nào. Dùng Thêm bên dưới để đặt thẻ."
|
|
},
|
|
"auth": {
|
|
"tagline": "Quản lý SSH và máy tính từ xa tự lưu trữ",
|
|
"loginTitle": "Chào mừng trở lại",
|
|
"registerTitle": "Tạo tài khoản",
|
|
"forgotPassword": "Quên mật khẩu?",
|
|
"rememberMe": "Nhớ thiết bị trong 30 ngày (bao gồm TOTP)",
|
|
"noAccount": "Chưa có tài khoản?",
|
|
"hasAccount": "Đã có tài khoản?",
|
|
"twoFactorAuth": "Xác thực hai yếu tố",
|
|
"enterCode": "Nhập mã xác minh",
|
|
"redirectingToApp": "Đang chuyển hướng đến ứng dụng...",
|
|
"sshAuthenticationRequired": "Yêu cầu xác thực SSH",
|
|
"sshNoKeyboardInteractive": "Xác thực tương tác bàn phím không khả dụng",
|
|
"sshAuthenticationFailed": "Xác thực thất bại",
|
|
"sshAuthenticationTimeout": "Hết thời gian xác thực",
|
|
"sshNoKeyboardInteractiveDescription": "Máy chủ không hỗ trợ xác thực tương tác bàn phím. Vui lòng cung cấp mật khẩu hoặc khóa SSH.",
|
|
"sshAuthFailedDescription": "Thông tin đăng nhập không chính xác. Vui lòng thử lại với thông tin hợp lệ.",
|
|
"sshTimeoutDescription": "Quá trình xác thực đã hết thời gian. Vui lòng thử lại.",
|
|
"sshProvideCredentialsDescription": "Vui lòng cung cấp thông tin SSH để kết nối đến máy chủ này.",
|
|
"sshPasswordDescription": "Nhập mật khẩu cho kết nối SSH này.",
|
|
"sshKeyPasswordDescription": "Nếu khóa SSH của bạn được mã hóa, hãy nhập cụm mật khẩu tại đây.",
|
|
"passphraseRequired": "Yêu cầu cụm mật khẩu",
|
|
"passphraseRequiredDescription": "Khóa SSH đã được mã hóa. Vui lòng nhập cụm mật khẩu để mở khóa.",
|
|
"back": "Quay lại",
|
|
"firstUser": "Người dùng đầu tiên",
|
|
"firstUserMessage": "Bạn là người dùng đầu tiên và sẽ được đặt làm quản trị viên. Bạn có thể xem cài đặt quản trị trong menu thả xuống người dùng ở thanh bên. Nếu bạn cho rằng đây là nhầm lẫn, hãy kiểm tra nhật ký Docker hoặc tạo một issue trên GitHub.",
|
|
"external": "Bên ngoài",
|
|
"loginWithExternal": "Đăng nhập bằng Nhà cung cấp Bên ngoài",
|
|
"loginWithExternalDesc": "Đăng nhập bằng nhà cung cấp danh tính bên ngoài đã được cấu hình",
|
|
"externalNotSupportedInElectron": "External sign-in is not supported in the desktop app yet. Please use the web version.",
|
|
"loginWithProvider": "Đăng nhập bằng {{name}}",
|
|
"orContinueWith": "hoặc tiếp tục với",
|
|
"resetPasswordButton": "Đặt lại mật khẩu",
|
|
"sendResetCode": "Gửi mã đặt lại",
|
|
"resetCodeDesc": "Nhập tên người dùng của bạn để nhận mã đặt lại mật khẩu. Mã sẽ được ghi trong nhật ký container Docker.",
|
|
"resetCode": "Mã đặt lại",
|
|
"verifyCodeButton": "Xác minh mã",
|
|
"enterResetCode": "Nhập mã 6 chữ số từ nhật ký container Docker cho người dùng:",
|
|
"newPassword": "Mật khẩu mới",
|
|
"confirmNewPassword": "Xác nhận mật khẩu",
|
|
"enterNewPassword": "Nhập mật khẩu mới của bạn cho người dùng:",
|
|
"signUp": "Đăng ký",
|
|
"desktopApp": "Ứng dụng máy tính",
|
|
"loggingInToDesktopApp": "Đang đăng nhập vào ứng dụng máy tính",
|
|
"loadingServer": "Đang tải máy chủ...",
|
|
"dataLossWarning": "Đặt lại mật khẩu theo cách này sẽ xóa tất cả các máy chủ SSH đã lưu, thông tin đăng nhập và dữ liệu mã hóa khác. Hành động này không thể hoàn tác. Chỉ sử dụng khi bạn đã quên mật khẩu và chưa đăng nhập.",
|
|
"authenticationDisabled": "Xác thực bị vô hiệu",
|
|
"authenticationDisabledDesc": "Tất cả các phương thức xác thực đang bị vô hiệu. Vui lòng liên hệ quản trị viên của bạn.",
|
|
"passwordLoginDisabledDesc": "Đăng nhập bằng mật khẩu bị vô hiệu. Hãy sử dụng khóa truy cập hoặc nhà cung cấp xác thực bên ngoài.",
|
|
"attemptsRemaining": "Còn {{count}} lần thử",
|
|
"confirmResetDataWipe": "Tài khoản này chưa đăng nhập kể từ khi nâng cấp mã hóa, do đó dữ liệu đã lưu không thể khôi phục nếu không có mật khẩu cũ. Việc đặt lại sẽ xóa vĩnh viễn các máy chủ, thông tin xác thực và đoạn mã. Tiếp tục?",
|
|
"password": "Mật khẩu",
|
|
"secondFactorUnavailable": "Your account uses a second factor that is not available right now. Contact an admin to reset it.",
|
|
"secondFactorNoUI": "This second factor cannot be shown on this screen. Contact an admin.",
|
|
"serverAuthentication": "Server sign-in",
|
|
"minChars": "min. {{min}} characters"
|
|
},
|
|
"hostKey": {
|
|
"verifyNewHost": "Xác minh khóa máy chủ SSH",
|
|
"keyChangedWarning": "Khóa máy chủ SSH đã thay đổi",
|
|
"firstConnectionTitle": "Lần đầu kết nối đến máy chủ này",
|
|
"firstConnectionDescription": "Không thể xác thực danh tính của máy chủ này. Xác minh dấu vân tay khớp với mong đợi.",
|
|
"keyChangedDescription": "Khóa máy chủ cho máy chủ này đã thay đổi kể từ lần kết nối trước. Điều này có thể là dấu hiệu của vấn đề bảo mật.",
|
|
"previousKey": "Khóa trước đó",
|
|
"newFingerprint": "Dấu vân tay mới",
|
|
"fingerprint": "Dấu vân tay",
|
|
"verifyInstructions": "Nếu bạn tin tưởng máy chủ này, nhấn Chấp nhận để tiếp tục và lưu dấu vân tay này cho các kết nối sau.",
|
|
"securityWarning": "Cảnh báo bảo mật",
|
|
"acceptAndContinue": "Chấp nhận & Tiếp tục",
|
|
"acceptNewKey": "Chấp nhận Khóa Mới & Tiếp tục"
|
|
},
|
|
"errors": {
|
|
"databaseConnection": "Không thể kết nối tới cơ sở dữ liệu",
|
|
"embeddedServerFailed": "Máy chủ cục bộ của Termix không thể khởi động.",
|
|
"unknownError": "Lỗi không xác định",
|
|
"loginFailed": "Đăng nhập thất bại",
|
|
"failedPasswordReset": "Không thể bắt đầu đặt lại mật khẩu",
|
|
"failedVerifyCode": "Không thể xác minh mã đặt lại",
|
|
"failedCompleteReset": "Không thể hoàn tất đặt lại mật khẩu",
|
|
"invalidTotpCode": "Mã TOTP không hợp lệ",
|
|
"failedOidcLogin": "Failed to start external sign-in",
|
|
"silentSigninOidcUnavailable": "Silent sign-in was requested, but no external sign-in is set up.",
|
|
"failedUserInfo": "Không thể lấy thông tin người dùng sau khi đăng nhập",
|
|
"oidcAuthFailed": "External sign-in failed",
|
|
"invalidAuthUrl": "URL ủy quyền không hợp lệ nhận được từ máy chủ",
|
|
"requiredField": "Trường này là bắt buộc",
|
|
"minLength": "Độ dài tối thiểu là {{min}}",
|
|
"passwordMismatch": "Mật khẩu không khớp",
|
|
"passwordLoginDisabled": "Đăng nhập bằng tên người dùng/mật khẩu hiện đang bị vô hiệu hóa",
|
|
"sessionExpired": "Phiên làm việc đã hết hạn - vui lòng đăng nhập lại",
|
|
"totpRateLimited": "Giới hạn tốc độ: Quá nhiều lần thử xác thực TOTP. Vui lòng thử lại sau.",
|
|
"totpRateLimitedWithTime": "Giới hạn tốc độ: Quá nhiều lần thử xác thực TOTP. Vui lòng đợi {{time}} giây trước khi thử lại.",
|
|
"resetCodeRateLimited": "Giới hạn tốc độ: Quá nhiều lần thử xác thực. Vui lòng thử lại sau.",
|
|
"resetCodeRateLimitedWithTime": "Hạn chế tốc độ: Quá nhiều lần xác minh. Vui lòng chờ {{time}} giây trước khi thử lại.",
|
|
"authTokenSaveFailed": "Lưu token xác thực thất bại",
|
|
"authTokenMissing": "Máy chủ không trả về mã xác thực mới. Vui lòng đăng nhập lại.",
|
|
"failedToLoadServer": "Tải máy chủ thất bại",
|
|
"sessionExpiredLogin": "Session expired. Please log in again."
|
|
},
|
|
"messages": {
|
|
"registrationDisabled": "Đăng ký tài khoản mới hiện bị quản trị viên vô hiệu hóa. Vui lòng đăng nhập hoặc liên hệ quản trị viên.",
|
|
"userNotAllowed": "Tài khoản của bạn không được phép đăng ký. Vui lòng liên hệ quản trị viên.",
|
|
"databaseConnectionFailed": "Kết nối máy chủ cơ sở dữ liệu thất bại",
|
|
"embeddedServerPortInUse": "Cổng {{port}} hiện đang được sử dụng bởi một chương trình khác. Thông thường, đây là một container Docker của Termix hoặc một tiến trình Termix còn sót lại từ phiên trước. Hãy đóng nó lại, sau đó khởi động lại Termix.",
|
|
"embeddedServerPortInUseUnknownPort": "Một trong các cổng mà Termix cần đang được một chương trình khác sử dụng. Hãy đóng chương trình đang sử dụng cổng đó, sau đó khởi động lại Termix.",
|
|
"embeddedServerCrashed": "Máy chủ cục bộ đã dừng hoạt động đột ngột. Hãy khởi động lại Termix và kiểm tra nhật ký trên máy tính để bàn nếu sự cố này tiếp diễn.",
|
|
"resetCodeSent": "Mã đặt lại đã được gửi đến nhật ký Docker",
|
|
"codeVerified": "Xác minh mã thành công",
|
|
"passwordResetSuccess": "Đặt lại mật khẩu thành công",
|
|
"loginSuccess": "Đăng nhập thành công",
|
|
"registrationSuccess": "Đăng ký thành công"
|
|
},
|
|
"placeholders": {
|
|
"language": "Ngôn ngữ",
|
|
"keyPassword": "mật khẩu khóa",
|
|
"pastePrivateKey": "Dán khóa riêng tư của bạn vào đây...",
|
|
"enterPassword": "Nhập mật khẩu của bạn"
|
|
},
|
|
"dashboard": {
|
|
"title": "Bảng điều khiển",
|
|
"loading": "Đang tải bảng điều khiển...",
|
|
"github": "GitHub",
|
|
"support": "Hỗ trợ",
|
|
"discord": "Discord",
|
|
"docs": "Tài liệu",
|
|
"donate": "Ủng hộ",
|
|
"serverOverview": "Tổng quan máy chủ",
|
|
"version": "Phiên bản",
|
|
"upToDate": "Đã cập nhật",
|
|
"updateAvailable": "Có bản cập nhật",
|
|
"beta": "Beta",
|
|
"uptime": "Thời gian hoạt động",
|
|
"database": "Cơ sở dữ liệu",
|
|
"healthy": "Ổn định",
|
|
"error": "Lỗi",
|
|
"totalHosts": "Tổng số máy chủ",
|
|
"totalCredentials": "Tổng số thông tin xác thực",
|
|
"recentActivity": "Hoạt động gần đây",
|
|
"reset": "Đặt lại",
|
|
"loadingRecentActivity": "Đang tải hoạt động gần đây...",
|
|
"noRecentActivity": "Không có hoạt động gần đây",
|
|
"quickActions": "Hành động nhanh",
|
|
"addHost": "Thêm máy chủ",
|
|
"addCredential": "Thêm thông tin xác thực",
|
|
"adminSettings": "Cài đặt quản trị",
|
|
"userProfile": "Hồ sơ người dùng",
|
|
"serverStats": "Thống kê máy chủ",
|
|
"loadingServerStats": "Đang tải thống kê máy chủ...",
|
|
"noServerData": "Không có dữ liệu máy chủ",
|
|
"customizeLayout": "Tùy chỉnh Bảng điều khiển",
|
|
"dashboardSettings": "Cài đặt Bảng điều khiển",
|
|
"enableDisableCards": "Bật/Tắt Thẻ",
|
|
"resetLayout": "Đặt lại về mặc định",
|
|
"serverOverviewCard": "Tổng quan Máy chủ",
|
|
"recentActivityCard": "Hoạt động Gần đây",
|
|
"quickActionsCard": "Thao tác nhanh",
|
|
"serverStatsCard": "Thống kê máy chủ",
|
|
"panelMain": "Chính",
|
|
"panelSide": "Bên",
|
|
"justNow": "vừa xong",
|
|
"activityFileManager": "File manager"
|
|
},
|
|
"donation": {
|
|
"title": "Bạn thích Termix chứ?",
|
|
"body": "Termix là phần mềm miễn phí và mã nguồn mở, được xây dựng và duy trì bởi một nhóm hai người trong thời gian rảnh. Nếu nó đã thay thế một công cụ thương mại mà bạn đáng lẽ phải trả tiền, một khoản quyên góp sẽ giúp trang trải chi phí hosting và duy trì phát triển. Hiện tại, quyên góp chỉ chấp nhận tiền mã hóa.",
|
|
"milestones": "Quyên góp cũng giúp tài trợ thời gian nghiên cứu và học hỏi những gì cần thiết để xây dựng các tính năng như hỗ trợ SAML và Kubernetes. Xem tiến độ trên trang quyên góp.",
|
|
"cta": "Quyên góp",
|
|
"dismiss": "Để sau"
|
|
},
|
|
"dashboardTab": {
|
|
"stable": "ỔN ĐỊNH",
|
|
"hostsOnline": "Máy chủ Trực tuyến",
|
|
"registerNewServer": "Đăng ký máy chủ mới",
|
|
"storeSshKeysOrPasswords": "Lưu trữ khóa SSH hoặc mật khẩu",
|
|
"manageUsersAndRoles": "Quản lý người dùng và vai trò",
|
|
"manageYourAccount": "Quản lý tài khoản của bạn",
|
|
"hostStatus": "Trạng thái Máy chủ",
|
|
"noHostsConfigured": "Chưa cấu hình máy chủ nào",
|
|
"online": "TRỰC TUYẾN",
|
|
"offline": "NGOẠI TUYẾN",
|
|
"checking": "ĐANG KIỂM TRA",
|
|
"onlineLower": "Trực tuyến",
|
|
"add": "Thêm:",
|
|
"commandPalette": "Bảng lệnh",
|
|
"done": "Xong",
|
|
"editModeInstructions": "Drag cards to reorder. Drag the column divider to resize columns. Drag the bottom edge of a card to change its height. Use the trash button to remove a card.",
|
|
"empty": "Trống",
|
|
"clear": "Xóa",
|
|
"viewServerDetails": "Xem chi tiết máy chủ",
|
|
"dragToResizeColumns": "Drag to resize columns",
|
|
"hostsAvailable": "Hosts Available"
|
|
},
|
|
"admin": {
|
|
"sectionGeneral": "Chung",
|
|
"sectionUsers": "Người dùng",
|
|
"sectionSessions": "Phiên",
|
|
"sectionRoles": "Vai trò",
|
|
"sectionDatabase": "Cơ sở dữ liệu",
|
|
"sectionApiKeys": "Khóa API",
|
|
"sectionAuditLog": "Nhật ký kiểm tra",
|
|
"sectionSsl": "HTTPS certificate",
|
|
"sectionBranding": "Nhãn trắng",
|
|
"brandingAppName": "Tên ứng dụng",
|
|
"brandingAppNameDesc": "Hiển thị trên màn hình đăng nhập và tab trình duyệt. Để trống để sử dụng \"Termix\".",
|
|
"brandingTagline": "Khẩu hiệu",
|
|
"brandingTaglineDesc": "Hiển thị bên dưới tên ứng dụng trên màn hình đăng nhập. Để trống để sử dụng khẩu hiệu mặc định.",
|
|
"brandingLogo": "Logo",
|
|
"brandingLogoDesc": "Định dạng PNG, JPEG hoặc WEBP, dung lượng tối đa 750 KB. Thay thế biểu tượng mặc định trên màn hình đăng nhập và tab trình duyệt.",
|
|
"brandingLogoUpload": "Tải lên logo",
|
|
"brandingLogoReset": "Khôi phục về mặc định",
|
|
"brandingLogoInvalid": "Hình ảnh không hợp lệ. Vui lòng sử dụng tệp PNG, JPEG hoặc WEBP có dung lượng tối đa 750 KB.",
|
|
"brandingSaved": "Cài đặt thương hiệu đã được lưu",
|
|
"brandingSaveFailed": "Không thể lưu cài đặt thương hiệu.",
|
|
"sslDescription": "The certificate Termix serves over HTTPS. Upload your own here, or get and renew one from Let's Encrypt in the ACME Certificates section.",
|
|
"sslDocsLink": "Xem tài liệu SSL",
|
|
"sslCertStatus": "Trạng thái chứng chỉ",
|
|
"sslCertStatusNone": "Không có chứng chỉ",
|
|
"sslCertStatusValid": "Hợp lệ",
|
|
"sslCertStatusExpiring": "Sắp hết hạn",
|
|
"sslCertStatusExpired": "Đã hết hạn",
|
|
"sslCertExpiresAt": "Hết hạn {{date}}",
|
|
"sslInfoNote": "Sau khi cấp hoặc tải lên chứng chỉ, Termix sẽ tự động bật HTTPS trên SSL_PORT (mặc định là 8443) bên cạnh cổng HTTP hiện có. Hãy đảm bảo rằng cổng đó đã được công bố/ánh xạ tới vùng chứa này để có thể truy cập được.",
|
|
"sslManualCert": "Chứng chỉ (PEM)",
|
|
"sslManualCertPlaceholder": "-----BẮT ĐẦU GIẤY CHỨNG NHẬN-----",
|
|
"sslManualKey": "Khóa riêng tư (PEM)",
|
|
"sslManualKeyPlaceholder": "-----BEGIN PRIVATE KEY-----",
|
|
"sslManualDesc": "Hãy dán chứng chỉ và khóa riêng hiện có của bạn, bao gồm cả chuỗi chứng chỉ đầy đủ nếu CA yêu cầu.",
|
|
"sslManualUpload": "Tải lên và cài đặt chứng chỉ",
|
|
"sslManualUploadLoading": "Đang tải chứng chỉ lên...",
|
|
"sslManualUploadSuccess": "Chứng chỉ đã được tải lên và cài đặt thành công.",
|
|
"sslManualUploadFailed": "Tải lên chứng chỉ không thành công",
|
|
"sslManualRequiresFields": "Cần có chứng chỉ và khóa riêng.",
|
|
"auditLogTotal": "Tổng số {{total}} mục",
|
|
"auditLogEmpty": "Không tìm thấy mục nhật ký kiểm tra",
|
|
"auditLogSuccess": "Thành công",
|
|
"auditLogFailed": "Thất bại",
|
|
"auditLogClearFilters": "Xóa bộ lọc",
|
|
"auditLogPage": "Trang {{page}} / {{totalPages}} (tổng {{total}})",
|
|
"auditLogIp": "IP",
|
|
"auditLogResourceId": "ID tài nguyên",
|
|
"auditLogFilterUser": "Người dùng",
|
|
"auditLogFilterAction": "Hành động",
|
|
"auditLogFilterResourceType": "Loại tài nguyên",
|
|
"auditLogFilterStatus": "Trạng thái",
|
|
"auditLogFilterFrom": "Từ",
|
|
"auditLogFilterTo": "Đến",
|
|
"auditLogFilterAll": "Tất cả",
|
|
"allowRegistration": "Cho phép đăng ký người dùng",
|
|
"allowRegistrationDesc": "Cho phép người dùng mới tự đăng ký bằng tên người dùng và mật khẩu",
|
|
"allowPasswordLogin": "Cho phép đăng nhập bằng mật khẩu",
|
|
"allowPasswordLoginDesc": "Đăng nhập bằng tên người dùng/mật khẩu",
|
|
"oidcAutoProvision": "Auto-create external accounts",
|
|
"oidcAutoProvisionDesc": "Create an account the first time someone signs in through an external login such as SSO or LDAP, even when registration is off",
|
|
"secondFactorAfterExternalLogin": "Ask for a second factor after external logins (SSO, GitHub, Google, LDAP)",
|
|
"secondFactorAfterExternalLoginDesc": "Off, an enrolled second factor is only asked for after password and other local logins, same as before. On, it is asked for after every login method, including SSO and LDAP.",
|
|
"allowPasswordReset": "Cho phép đặt lại mật khẩu",
|
|
"allowPasswordResetDesc": "Mã đặt lại qua nhật ký Docker",
|
|
"auditForwardingTitle": "Chuyển tiếp đến SIEM",
|
|
"auditForwardingDesc": "Gửi một bản sao của mỗi mục kiểm toán đến một đơn vị thu thập dữ liệu bên ngoài dưới dạng NDJSON. Nhật ký cục bộ vẫn là nguồn thông tin chính xác.",
|
|
"auditForwardingEnvNotice": "Một biến môi trường cũng cấu hình việc chuyển tiếp; URL được lưu ở đây sẽ được ưu tiên.",
|
|
"auditForwardingToken": "Thẻ người mang (tùy chọn)",
|
|
"auditForwardingTokenStored": "Mã thông báo người mang (đã lưu trữ)",
|
|
"auditForwardingSaved": "Cài đặt chuyển tiếp kiểm toán đã được lưu",
|
|
"auditForwardingSaveError": "Không thể lưu cài đặt chuyển tiếp kiểm toán.",
|
|
"sessionTimeout": "Thời gian chờ phiên",
|
|
"hours": "giờ",
|
|
"sessionTimeoutRange": "Min 1h, max 720h",
|
|
"monitoringDefaults": "Mặc định giám sát",
|
|
"statusCheck": "Kiểm tra trạng thái",
|
|
"sec": "giây",
|
|
"logLevel": "Mức nhật ký",
|
|
"usersCount": "{{count}} người dùng",
|
|
"searchUsers": "Tìm kiếm người dùng...",
|
|
"noUsers": "Không có người dùng",
|
|
"noUsersMatch": "Không có người dùng nào phù hợp với tìm kiếm của bạn.",
|
|
"pageOf": "Trang {{page}} trên {{total}}",
|
|
"createUser": "Tạo",
|
|
"newRole": "Vai trò mới",
|
|
"roleName": "Tên",
|
|
"roleDisplayName": "Tên hiển thị",
|
|
"roleDescription": "Mô tả",
|
|
"rolesCount": "{{count}} vai trò",
|
|
"createRole": "Tạo",
|
|
"creating": "Đang tạo...",
|
|
"exportDatabase": "Xuất cơ sở dữ liệu",
|
|
"exportDatabaseDesc": "Tải xuống bản sao lưu SQLite di động chứa tất cả máy chủ, thông tin đăng nhập và cài đặt.",
|
|
"export": "Xuất",
|
|
"exporting": "Đang xuất...",
|
|
"importDatabase": "Nhập cơ sở dữ liệu",
|
|
"importDatabaseDesc": "Khôi phục từ bản sao lưu .sqlite di động trên bất kỳ hệ thống cơ sở dữ liệu nào.",
|
|
"importDatabaseSelected": "Đã chọn: {{name}}",
|
|
"selectFile": "Chọn tệp",
|
|
"changeFile": "Đổi tệp",
|
|
"import": "Nhập",
|
|
"importing": "Đang nhập...",
|
|
"apiKeysCount": "{{count}} khóa",
|
|
"apiKeysDocsLink": "Xem tài liệu",
|
|
"apiKeysCliHint": "Sử dụng khóa API với Termix CLI để quản lý máy chủ từ thiết bị đầu cuối của bạn.",
|
|
"apiKeysCliLink": "Xem tài liệu CLI",
|
|
"newApiKey": "Khóa API mới",
|
|
"apiKeyCreatedWarning": "Khóa đã tạo - sao chép ngay, sẽ không hiển thị lại.",
|
|
"apiKeyName": "Tên",
|
|
"apiKeyUser": "Người dùng",
|
|
"apiKeySelectUser": "Chọn người dùng...",
|
|
"apiKeyExpiresAt": "Hết hạn lúc",
|
|
"createKey": "Tạo khóa",
|
|
"apiKeyNoExpiry": "Không hết hạn",
|
|
"revokedBadge": "ĐÃ THU HỒI",
|
|
"authTypeDual": "Xác thực kép",
|
|
"authTypeOidc": "Bên ngoài",
|
|
"authTypeLocal": "Cục bộ",
|
|
"adminStatusAdministrator": "Quản trị viên",
|
|
"adminStatusRegularUser": "Người dùng thông thường",
|
|
"adminBadge": "QUẢN TRỊ VIÊN",
|
|
"systemBadge": "HỆ THỐNG",
|
|
"customBadge": "TÙY CHỈNH",
|
|
"youBadge": "BẠN",
|
|
"sessionsActive": "{{count}} đang hoạt động",
|
|
"sessionActive": "Hoạt động: {{time}}",
|
|
"sessionExpires": "Hết hạn: {{time}}",
|
|
"revokeAll": "Tất cả",
|
|
"revokeAllSessionsSuccess": "Đã thu hồi tất cả phiên của người dùng",
|
|
"revokeAllSessionsFailed": "Không thể thu hồi phiên",
|
|
"revokeSessionFailed": "Không thể thu hồi phiên",
|
|
"addRole": "Thêm vai trò",
|
|
"noCustomRoles": "Chưa định nghĩa vai trò tùy chỉnh",
|
|
"removeRoleFailed": "Không thể xóa vai trò",
|
|
"assignRoleFailed": "Không thể gán vai trò",
|
|
"deleteRoleFailed": "Không thể xóa vai trò",
|
|
"userAdminAccess": "Quản trị viên",
|
|
"userAdminAccessDesc": "Toàn quyền truy cập tất cả cài đặt quản trị",
|
|
"userRoles": "Vai trò",
|
|
"revokeAllUserSessions": "Thu hồi tất cả phiên",
|
|
"revokeAllUserSessionsDesc": "Buộc đăng nhập lại trên tất cả thiết bị",
|
|
"revoke": "Thu hồi",
|
|
"deleteUserWarning": "Việc xóa người dùng này là vĩnh viễn.",
|
|
"deleteUser": "Xóa {{username}}",
|
|
"deleting": "Đang xóa...",
|
|
"deleteUserFailed": "Không thể xóa người dùng",
|
|
"deleteUserSuccess": "Đã xóa người dùng \"{{username}}\"",
|
|
"deleteRoleSuccess": "Đã xóa vai trò \"{{name}}\"",
|
|
"revokeKeySuccess": "Đã thu hồi khóa \"{{name}}\"",
|
|
"revokeKeyFailed": "Không thể thu hồi khóa",
|
|
"copiedToClipboard": "Đã sao chép vào bộ nhớ tạm",
|
|
"done": "Hoàn tất",
|
|
"createUserTitle": "Tạo người dùng",
|
|
"createUserDesc": "Tạo tài khoản cục bộ mới.",
|
|
"createUserUsername": "Tên đăng nhập",
|
|
"createUserPassword": "Mật khẩu",
|
|
"createUserPasswordHint": "Tối thiểu 6 ký tự.",
|
|
"createUserEnterUsername": "Nhập tên đăng nhập",
|
|
"createUserEnterPassword": "Nhập mật khẩu",
|
|
"createUserSubmit": "Tạo người dùng",
|
|
"editUserTitle": "Quản lý người dùng: {{username}}",
|
|
"editUserDesc": "Chỉnh sửa vai trò, trạng thái quản trị, phiên và cài đặt tài khoản.",
|
|
"editUserUsername": "Tên đăng nhập",
|
|
"editUserAuthType": "Loại xác thực",
|
|
"editUserAdminStatus": "Trạng thái quản trị",
|
|
"editUserUserId": "ID người dùng",
|
|
"linkAccountTitle": "Liên kết tài khoản",
|
|
"linkAccountDesc": "Merge the external account {{username}} with an existing local account.",
|
|
"linkAccountDescLocal": "Link a local account {{username}} with an existing external-only account.",
|
|
"linkAccountWarningTitle": "Hành động này sẽ:",
|
|
"linkAccountEffect1": "Delete the external-only account",
|
|
"linkAccountEffect2": "Add its external sign-in to the target account",
|
|
"linkAccountEffect3": "Allow both external and password sign-in",
|
|
"linkAccountTargetUsername": "Tên đăng nhập tài khoản cục bộ",
|
|
"linkAccountTargetPlaceholder": "Nhập tên đăng nhập tài khoản cục bộ để liên kết",
|
|
"linkAccountOidcUsername": "External Account Username",
|
|
"linkAccountOidcPlaceholder": "Enter the external-only account username to merge in",
|
|
"linkAccountOidcNotFound": "No external-only account found with that username",
|
|
"linkAccounts": "Liên kết tài khoản",
|
|
"linkAccountSuccess": "Liên kết tài khoản thành công",
|
|
"linkAccountFailed": "Liên kết tài khoản thất bại",
|
|
"linkAccountInProgress": "Đang liên kết...",
|
|
"unlinkAccountTitle": "Unlink External Sign-in",
|
|
"unlinkAccountDesc": "Remove external sign-in from {{username}}. They will only be able to log in with their password.",
|
|
"unlinkAccountWarning": "This will remove external sign-in from this account. The user must have a password set to keep logging in.",
|
|
"unlinkAccount": "Unlink External Sign-in",
|
|
"unlinkAccountInProgress": "Đang hủy liên kết...",
|
|
"unlinkAccountSuccess": "External sign-in unlinked",
|
|
"unlinkAccountFailed": "Failed to unlink external sign-in",
|
|
"saving": "Đang lưu...",
|
|
"updateRegistrationFailed": "Cập nhật cài đặt đăng ký thất bại",
|
|
"updatePasswordLoginFailed": "Cập nhật cài đặt đăng nhập bằng mật khẩu thất bại",
|
|
"updateOidcAutoProvisionFailed": "Failed to update the auto-create setting",
|
|
"updateSecondFactorAfterExternalLoginFailed": "Failed to update second factor setting",
|
|
"updatePasswordResetFailed": "Cập nhật cài đặt đặt lại mật khẩu thất bại",
|
|
"sessionTimeoutRange2": "Thời gian chờ phiên phải từ 1 đến 720 giờ",
|
|
"sessionTimeoutSaved": "Thời gian chờ phiên đã được lưu",
|
|
"sessionTimeoutSaveFailed": "Lưu thời gian chờ phiên thất bại",
|
|
"monitoringIntervalInvalid": "Giá trị khoảng thời gian không hợp lệ",
|
|
"monitoringSaved": "Cài đặt giám sát đã được lưu",
|
|
"monitoringSaveFailed": "Lưu cài đặt giám sát thất bại",
|
|
"logLevelUpdateFailed": "Cập nhật mức ghi nhật ký thất bại",
|
|
"createUserRequired": "Tên đăng nhập và mật khẩu là bắt buộc",
|
|
"createUserPasswordTooShort": "Mật khẩu phải có ít nhất 6 ký tự",
|
|
"createUserSuccess": "Người dùng \"{{username}}\" đã được tạo",
|
|
"createUserFailed": "Tạo người dùng thất bại",
|
|
"updateAdminStatusFailed": "Cập nhật trạng thái quản trị viên thất bại",
|
|
"allSessionsRevoked": "Tất cả các phiên đã bị thu hồi",
|
|
"revokeSessionsFailed": "Thu hồi phiên thất bại",
|
|
"manageUserData": "Quản lý dữ liệu người dùng",
|
|
"backToUsers": "Quay lại danh sách người dùng",
|
|
"manageTabAccount": "Tài khoản",
|
|
"manageTabHosts": "Máy chủ",
|
|
"manageTabCredentials": "Thông tin xác thực",
|
|
"manageTabSessions": "Phiên",
|
|
"manageTabDanger": "Nguy hiểm",
|
|
"manageEditorBack": "Quay lại dữ liệu của {{username}}",
|
|
"dataLockedBadge": "ĐÃ KHÓA",
|
|
"dataLockedNotice": "Dữ liệu của {{username}} vẫn bị khóa cho đến khi họ đăng nhập lần tiếp theo. Máy chủ, thông tin đăng nhập và đoạn mã của họ không thể xem hoặc chỉnh sửa cho đến lúc đó.",
|
|
"resetPasswordTitle": "Đặt lại mật khẩu",
|
|
"resetPasswordOidcOnly": "Người dùng này đăng nhập qua nhà cung cấp bên ngoài và không có mật khẩu.",
|
|
"resetPasswordPlaceholder": "Mật khẩu mới",
|
|
"resetPasswordBtn": "Đặt lại",
|
|
"resetPasswordWorking": "Đang đặt lại...",
|
|
"resetPasswordSuccess": "Đã đặt lại mật khẩu",
|
|
"resetPasswordSuccessWiped": "Đã đặt lại mật khẩu. Dữ liệu mã hóa của người dùng đã bị xóa.",
|
|
"resetPasswordFailed": "Không thể đặt lại mật khẩu",
|
|
"resetPasswordConfirmWipe": "{{username}} chưa đăng nhập kể từ khi nâng cấp mã hóa, do đó dữ liệu của họ không thể khôi phục. Đặt lại ngay bây giờ sẽ xóa máy chủ, thông tin đăng nhập và đoạn mã của họ. Tiếp tục?",
|
|
"manageApiKeys": "Khóa API",
|
|
"apiKeyNamePlaceholder": "Tên khóa",
|
|
"apiKeyCopyNotice": "Sao chép khóa này ngay, sẽ không hiển thị lại.",
|
|
"noApiKeysForUser": "Không có khóa API",
|
|
"apiKeyDeleteFailed": "Không thể xóa khóa API",
|
|
"exportUserData": "Xuất dữ liệu",
|
|
"exportUserDataDesc": "Tải xuống máy chủ, thông tin đăng nhập và dữ liệu quản lý tệp của người dùng này dưới dạng JSON. Các bí mật được giải mã.",
|
|
"exportUserDataSuccess": "Đã xuất dữ liệu người dùng",
|
|
"exportUserDataFailed": "Không thể xuất dữ liệu người dùng",
|
|
"hostsCount": "{{count}} máy chủ",
|
|
"addHostForUser": "Thêm máy chủ",
|
|
"noHostsForUser": "Người dùng này không có máy chủ nào",
|
|
"connectToHost": "Kết nối",
|
|
"deleteHostConfirm": "Xóa máy chủ \"{{name}}\" thuộc về {{username}}?",
|
|
"hostDeletedSuccess": "Đã xóa máy chủ",
|
|
"hostDeleteFailed": "Không thể xóa máy chủ",
|
|
"credentialsCount": "{{count}} thông tin đăng nhập",
|
|
"addCredentialForUser": "Thêm thông tin đăng nhập",
|
|
"noCredentialsForUser": "Người dùng này không có thông tin xác thực",
|
|
"deleteCredentialConfirm": "Xóa thông tin xác thực \"{{name}}\" của {{username}}?",
|
|
"credentialDeletedSuccess": "Đã xóa thông tin xác thực",
|
|
"credentialDeleteFailed": "Xóa thông tin xác thực thất bại",
|
|
"noSessionsForUser": "Không có phiên làm việc đang hoạt động",
|
|
"deleteSuccessorLabel": "Hãy chuyển giao máy chủ và thông tin đăng nhập cho",
|
|
"deleteSuccessorMe": "Tôi (người quản trị xóa)",
|
|
"deleteSuccessorNone": "Nobody, delete them",
|
|
"deleteSuccessorDesc": "Mọi thứ người dùng này chia sẻ vẫn hoạt động bình thường dưới quyền sở hữu mới; việc chọn \"không ai\" sẽ xóa máy chủ, thông tin đăng nhập và các thư mục chia sẻ của họ.",
|
|
"deleteUserDangerDesc": "Xóa vĩnh viễn {{username}} và toàn bộ dữ liệu (máy chủ, thông tin xác thực, đoạn mã, lịch sử). Không thể hoàn tác.",
|
|
"deleteUserConfirm": "Xóa vĩnh viễn {{username}} và toàn bộ dữ liệu?",
|
|
"deleteUserAdminBlocked": "Hãy bỏ quyền quản trị trước khi xóa người dùng này.",
|
|
"createRoleRequired": "Cần tên và tên hiển thị",
|
|
"createRoleSuccess": "Đã tạo vai trò \"{{name}}\"",
|
|
"createRoleFailed": "Tạo vai trò thất bại",
|
|
"apiKeyNameRequired": "Cần tên khóa",
|
|
"apiKeyUserRequired": "Cần ID người dùng",
|
|
"apiKeyCreatedSuccess": "Đã tạo khóa API \"{{name}}\"",
|
|
"apiKeyCreateFailed": "Tạo khóa API thất bại",
|
|
"exportSuccess": "Đã xuất cơ sở dữ liệu thành công",
|
|
"exportFailed": "Xuất cơ sở dữ liệu thất bại",
|
|
"importSelectFile": "Vui lòng chọn tệp trước",
|
|
"importCompleted": "Đã nhập xong: đã nhập {{total}} mục, bỏ qua {{skipped}}",
|
|
"importFailed": "Nhập thất bại: {{error}}",
|
|
"importError": "Nhập cơ sở dữ liệu thất bại",
|
|
"sectionHostDefaults": "Mặc định máy chủ",
|
|
"minutes": "phút",
|
|
"rolePermissions": {
|
|
"count": "{{count}} quyền",
|
|
"editAction": "Chỉnh sửa quyền",
|
|
"loadError": "Không tải được danh mục quyền",
|
|
"saved": "Đã lưu quyền vai trò",
|
|
"saveError": "Không lưu được quyền vai trò",
|
|
"save": "Lưu",
|
|
"saving": "Đang lưu...",
|
|
"pluginDisabled": "Feature disabled",
|
|
"groups": {
|
|
"hosts": "Máy chủ",
|
|
"credentials": "Thông tin xác thực",
|
|
"admin": "Administration"
|
|
}
|
|
},
|
|
"notificationPrivateEndpoints": "Cho phép máy chủ thông báo riêng tư",
|
|
"notificationPrivateEndpointsDesc": "Liệt kê chính xác các máy chủ riêng mà kênh thông báo có thể liên hệ. Phân tách chúng bằng dấu phẩy.",
|
|
"updateNotificationEndpointsFailed": "Không thể cập nhật danh sách cho phép điểm cuối thông báo.",
|
|
"secondFactorsSectionTitle": "Second factors",
|
|
"secondFactorsNone": "No second factors enrolled",
|
|
"secondFactorUnavailable": "Unavailable",
|
|
"resetSecondFactors": "Reset second factors",
|
|
"resetSecondFactorsConfirm": "Remove every second factor for {{username}}? They can sign in with their password or SSO and enrol again.",
|
|
"secondFactorsResetSuccess": "Second factors reset",
|
|
"secondFactorsResetFailed": "Failed to reset second factors",
|
|
"passwordLoginForced": "Password login is turned off, but no other login method is enabled, so it stays on for now. Nobody gets locked out.",
|
|
"sslNotRenewed": "Nothing renews this certificate. It expires {{date}}. Turn on automatic renewal in the ACME Certificates section, or upload a new one before then.",
|
|
"sslSelfSigned": "Self-signed certificate made by Termix. Browsers will warn about it.",
|
|
"sslRenewedBy": "Renewed automatically by {{plugin}}",
|
|
"sslIssuer": "Issued by {{issuer}}",
|
|
"sslNames": "Covers {{names}}",
|
|
"sslManualTitle": "Upload a certificate",
|
|
"updateExternalAutoProvisionFailed": "Failed to update the auto-create setting"
|
|
},
|
|
"newUi": {
|
|
"sidebar": {
|
|
"quickConnect": {
|
|
"hostLabel": "Máy chủ",
|
|
"hostPlaceholder": "192.168.1.1 or example.com",
|
|
"portLabel": "Cổng",
|
|
"portPlaceholder": "22",
|
|
"usernameLabel": "Tên đăng nhập",
|
|
"usernamePlaceholder": "tên đăng nhập",
|
|
"authLabel": "Xác thực",
|
|
"passwordLabel": "Mật khẩu",
|
|
"passwordPlaceholder": "mật khẩu",
|
|
"privateKeyLabel": "Khóa riêng",
|
|
"privateKeyPlaceholder": "Dán khóa riêng...",
|
|
"credentialLabel": "Thông tin đăng nhập",
|
|
"credentialPlaceholder": "Chọn thông tin đăng nhập đã lưu",
|
|
"protocolLabel": "Giao thức",
|
|
"domainLabel": "Lãnh địa",
|
|
"domainPlaceholder": "không bắt buộc",
|
|
"connectToAction": "Connect to {{name}}",
|
|
"sshProtocol": "SSH",
|
|
"noTarget": "Nothing installed can connect to this host type"
|
|
},
|
|
"keybindings": {
|
|
"title": "Phím tắt",
|
|
"description": "Bind keys to actions in the terminal and the app, or change the built-in shortcuts.",
|
|
"defaultsHeading": "Phím tắt tích hợp sẵn",
|
|
"fixedHeading": "App Shortcuts",
|
|
"fixed": {
|
|
"splitRight": "Chia sang phải",
|
|
"splitDown": "Chia xuống dưới",
|
|
"zoomPane": "Zoom the focused pane",
|
|
"navigatePane": "Move between panes",
|
|
"nextTab": "Tab tiếp theo",
|
|
"previousTab": "Tab trước",
|
|
"jumpTab": "Jump to tab",
|
|
"previousView": "Back to the previous sidebar view",
|
|
"fullscreen": "Toggle fullscreen"
|
|
},
|
|
"customHeading": "Phím tắt tùy chỉnh",
|
|
"addBinding": "Thêm lối tắt",
|
|
"addBindingTitle": "Thêm lối tắt",
|
|
"editBindingTitle": "Chỉnh sửa phím tắt",
|
|
"loading": "Đang tải...",
|
|
"noCustomBindings": "Chưa có phím tắt tùy chỉnh nào.",
|
|
"defaultBadge": "Mặc định",
|
|
"customizedBadge": "Tùy chỉnh",
|
|
"customize": "Tùy chỉnh",
|
|
"resetToDefault": "Khôi phục về mặc định",
|
|
"resetAllToDefaults": "Khôi phục tất cả về cài đặt mặc định",
|
|
"close": "Đóng",
|
|
"cancel": "Hủy bỏ",
|
|
"saveBinding": "Lưu lối tắt",
|
|
"saveError": "Không thể lưu các phím tắt",
|
|
"pressKeysToRecord": "Tổ hợp phím",
|
|
"pressKeysPlaceholder": "Nhấp chuột và nhấn phím",
|
|
"recording": "Nhấn các phím...",
|
|
"comboRequiredError": "Trước tiên, hãy nhấn tổ hợp phím.",
|
|
"conflictWarning": "Sự kết hợp này đã được liên kết với {{combo}}. Lưu lại sẽ khiến cả hai đều bốc cháy.",
|
|
"actionLabel": "Hoạt động",
|
|
"actionNextTab": "Chuyển sang tab tiếp theo",
|
|
"actionPreviousTab": "Chuyển về tab trước",
|
|
"actionOpenCommandPalette": "Mở tìm kiếm nhanh",
|
|
"actionReconnectSession": "Reconnect current session",
|
|
"unavailableAction": "{{type}} (not available)",
|
|
"actionRequiredError": "Pick an action first"
|
|
},
|
|
"userProfile": {
|
|
"donateTitle": "Duy trì Termix",
|
|
"donateDescription": "Termix là phần mềm miễn phí, tự lưu trữ, và được xây dựng bởi một vài người trong thời gian rảnh. Nếu nó giúp bạn tiết kiệm thời gian hoặc tiền bạc, một khoản quyên góp tiền mã hóa sẽ giúp duy trì dự án.",
|
|
"donateMilestones": "Các khoản quyên góp giúp tài trợ thời gian nghiên cứu và học hỏi để xây dựng hỗ trợ SAML, Kubernetes và Agent. Xem tiến độ và quyên góp.",
|
|
"donateButton": "Quyên góp tiền mã hóa",
|
|
"storageModeLocal": "Trình duyệt",
|
|
"storageModeCloud": "Cơ sở dữ liệu",
|
|
"storageModeDescription": "Trình duyệt chỉ lưu cài đặt trong trình duyệt này. Cơ sở dữ liệu đồng bộ với máy chủ và tải trên mọi thiết bị.",
|
|
"resetToDefaults": "Đặt lại mặc định",
|
|
"resetToDefaultsSuccess": "Đã đặt lại cài đặt về mặc định.",
|
|
"storageModeSwitch": "Lưu trữ tùy chọn",
|
|
"sectionAccount": "Tài khoản",
|
|
"desktopProfileTitle": "This device only",
|
|
"desktopProfileDescription": "This profile lives on this device and signs in by itself. Link it to a Termix server to use the same hosts and settings on every device.",
|
|
"sectionInterface": "Giao diện",
|
|
"interfacePresetDesc": "Termix hiển thị rất nhiều chi tiết. Mọi tính năng đều được giữ nguyên.",
|
|
"preset_simple": "Đơn giản",
|
|
"preset_simple_desc": "Chỉ những thứ thiết yếu.",
|
|
"preset_balanced": "Cân bằng",
|
|
"preset_balanced_desc": "Bố cục tiêu chuẩn.",
|
|
"preset_advanced": "Trình độ cao",
|
|
"preset_advanced_desc": "Mọi thứ đều được bật, sắp xếp dày đặc.",
|
|
"presetClearOverrides": "Đặt lại tất cả",
|
|
"presetOverridesTitle": "Tùy chỉnh",
|
|
"presetRevertArea": "Hoàn tác",
|
|
"presetConfirmTitle": "Chuyển sang {{preset}}?",
|
|
"presetConfirmDesc": "Thao tác này sẽ đặt lại thanh bên, điều hướng, bố cục bảng điều khiển, thanh công cụ thiết bị đầu cuối và chế độ xem trình quản lý tập tin của bạn. Thông tin máy chủ, thông tin đăng nhập và trang chủ của bạn không bị thay đổi.",
|
|
"presetConfirmApply": "Áp dụng cài đặt sẵn",
|
|
"runSetupAgainDesc": "Hãy thực hiện lại các bước thiết lập ban đầu.",
|
|
"runSetupAgainButton": "Chạy thiết lập",
|
|
"uiArea_chrome": "Ứng dụng Chrome",
|
|
"uiArea_hostList": "Danh sách máy chủ",
|
|
"uiArea_credentialList": "Danh sách thông tin xác thực",
|
|
"uiArea_rail": "Điều hướng",
|
|
"uiArea_dashboard": "Bảng điều khiển",
|
|
"uiArea_terminal": "Phần cuối",
|
|
"uiArea_fileManager": "Trình quản lý tập tin",
|
|
"uiArea_hostEditor": "Biên tập viên chủ trì",
|
|
"sectionAppearance": "Giao diện",
|
|
"sectionSecurity": "Bảo mật",
|
|
"sectionApiKeys": "Khóa API",
|
|
"sectionData": "Dữ liệu",
|
|
"usernameLabel": "Tên người dùng",
|
|
"roleLabel": "Vai trò",
|
|
"roleAdministrator": "Quản trị viên",
|
|
"authMethodLabel": "Phương thức xác thực",
|
|
"authMethodLocal": "Cục bộ",
|
|
"twoFaLabel": "2FA",
|
|
"twoFaOn": "Bật",
|
|
"twoFaOff": "Tắt",
|
|
"versionLabel": "Phiên bản",
|
|
"betaProgramTitle": "Chương trình Beta",
|
|
"betaProgramDescription": "Dùng thử sớm các tính năng sắp ra mắt với thẻ Docker :beta cập nhật hàng tuần. Chưa ổn định, không dùng cho môi trường thực tế.",
|
|
"betaProgramFeedback": "Tìm thấy lỗi? Báo cáo tại đây.",
|
|
"betaProgramLearnMore": "Tìm hiểu thêm",
|
|
"cliTitle": "Công cụ dòng lệnh Termix",
|
|
"cliDescription": "Mở cửa sổ dòng lệnh, chạy các lệnh và di chuyển tập tin từ trình shell của riêng bạn.",
|
|
"cliLearnMore": "Tìm hiểu thêm",
|
|
"deleteAccount": "Xóa tài khoản",
|
|
"deleteAccountDescription": "Xóa vĩnh viễn tài khoản của bạn",
|
|
"changeServerDescription": "Chuyển sang máy chủ backend Termix khác",
|
|
"deleteButton": "Xóa",
|
|
"deleteAccountPermanent": "Hành động này là vĩnh viễn và không thể hoàn tác.",
|
|
"deleteAccountWarning": "Tất cả phiên, máy chủ, thông tin xác thực và cài đặt sẽ bị xóa vĩnh viễn.",
|
|
"confirmPasswordDeletePlaceholder": "Nhập mật khẩu để xác nhận",
|
|
"languageLabel": "Ngôn ngữ",
|
|
"themeLabel": "Giao diện",
|
|
"fontSizeLabel": "Cỡ chữ",
|
|
"interfaceFontLabel": "Phông chữ giao diện",
|
|
"interfaceFontDescription": "Thay đổi phông chữ giao diện ứng dụng. Các cấu hình thiết bị đầu cuối giữ nguyên cài đặt phông chữ riêng của chúng.",
|
|
"accentColorLabel": "Màu nhấn",
|
|
"keyboardShortcuts": "Phím tắt",
|
|
"keyboardShortcutsDescription": "Tùy chỉnh các phím tắt sao chép, dán và lệnh trong terminal.",
|
|
"manageShortcuts": "Quản lý",
|
|
"historyTracking": "Theo dõi lịch sử",
|
|
"historyTrackingDesc": "Theo dõi các lệnh đã nhập",
|
|
"commandPalette": "Bảng lệnh",
|
|
"commandPaletteDesc": "Bật phím tắt",
|
|
"reopenTabsOnLogin": "Mở lại các tab khi đăng nhập",
|
|
"reopenTabsOnLoginDesc": "Khôi phục các tab đang mở khi đăng nhập hoặc tải lại trang, kể cả từ thiết bị khác",
|
|
"confirmTabClose": "Xác nhận đóng tab",
|
|
"confirmTabCloseDesc": "Hỏi trước khi đóng tab terminal",
|
|
"showTabNumbers": "Show Tab Numbers",
|
|
"showTabNumbersDesc": "Display a number on each tab to help tell them apart",
|
|
"settingsAppRail": "Đường ray ứng dụng",
|
|
"sidebarSettingsMoved": "Các cài đặt hiển thị thanh bên của máy chủ đã được chuyển sang bảng Tùy chỉnh thanh bên, được mở từ thanh công cụ Máy chủ.",
|
|
"showHostTags": "Hiển thị thẻ máy chủ",
|
|
"showHostTagsDesc": "Hiển thị thẻ trong danh sách máy chủ",
|
|
"hostTrayOnClick": "Nhấp để mở rộng hành động máy chủ",
|
|
"hostTrayOnClickDesc": "Luôn hiển thị nút kết nối; nhấp để mở rộng tùy chọn quản lý thay vì di chuột",
|
|
"compactHostView": "Chế độ xem máy chủ thu gọn",
|
|
"compactHostViewDesc": "Thu gọn mỗi máy chủ thành một dòng chỉ hiển thị tên và địa chỉ",
|
|
"statusColors": "Màu trạng thái thực",
|
|
"statusColorsDesc": "Dùng màu xanh/đỏ cho trạng thái trực tuyến/ngoại tuyến thay vì màu nhấn",
|
|
"pinAppRail": "Ghim thanh ứng dụng",
|
|
"pinAppRailDesc": "Giữ thanh ứng dụng bên trái luôn mở rộng thay vì chỉ mở khi di chuột",
|
|
"openFullscreenSettings": "Mở cài đặt ở chế độ toàn màn hình",
|
|
"exitFullscreenSettings": "Thoát khỏi chế độ toàn màn hình",
|
|
"expandAppRailOnHover": "Mở rộng thanh ứng dụng khi di chuột",
|
|
"expandAppRailOnHoverDesc": "Cho phép thanh ứng dụng bên trái mở rộng khi con trỏ di chuyển qua",
|
|
"showPinAppRailButton": "Hiển thị nút Pin App Rail",
|
|
"showPinAppRailButtonDesc": "Hiển thị nút ở thanh ứng dụng để ghim ứng dụng luôn mở. Mặc định là tắt.",
|
|
"settingsNavigation": "Điều hướng",
|
|
"navigationTabsDesc": "Chọn các tab sẽ hiển thị trên thanh bên",
|
|
"showSnippetCommands": "Hiển thị lệnh",
|
|
"showSnippetCommandsDesc": "Hiển thị lệnh của mỗi đoạn mã ngay bên dưới tên của nó. Tắt tùy chọn này để có danh sách gọn gàng hơn.",
|
|
"foldersCollapsed": "Thu gọn thư mục",
|
|
"foldersCollapsedDesc": "Mặc định thu gọn thư mục",
|
|
"confirmExecution": "Xác nhận thực thi",
|
|
"confirmExecutionDesc": "Xác nhận trước khi chạy đoạn mã",
|
|
"settingsUpdates": "Cập nhật",
|
|
"disableUpdateChecks": "Tắt kiểm tra cập nhật",
|
|
"disableUpdateChecksDesc": "Ngừng kiểm tra cập nhật",
|
|
"changePassword": "Đổi mật khẩu",
|
|
"currentPasswordLabel": "Mật khẩu hiện tại",
|
|
"currentPasswordPlaceholder": "Mật khẩu hiện tại",
|
|
"newPasswordLabel": "Mật khẩu mới",
|
|
"newPasswordPlaceholder": "Mật khẩu mới",
|
|
"confirmPasswordLabel": "Xác nhận mật khẩu mới",
|
|
"confirmPasswordPlaceholder": "Xác nhận mật khẩu mới",
|
|
"updatePassword": "Cập nhật mật khẩu",
|
|
"createApiKeyTitle": "Tạo khóa API",
|
|
"createApiKeyDescription": "Tạo khóa API mới để truy cập lập trình.",
|
|
"apiKeyNameLabel": "Tên",
|
|
"apiKeyNamePlaceholder": "ví dụ: CI Pipeline",
|
|
"expiryDateLabel": "Ngày hết hạn",
|
|
"optional": "tùy chọn",
|
|
"cancel": "Hủy",
|
|
"createKey": "Tạo khóa",
|
|
"apiKeyCreatedWarning": "Mã khóa đã được tạo - hãy sao chép ngay, mã này sẽ không hiển thị lại nữa.",
|
|
"copyApiKey": "Sao chép khóa API",
|
|
"copiedToClipboard": "Đã sao chép vào clipboard",
|
|
"apiKeyCount": "{{count}} khóa",
|
|
"newKey": "Tạo khóa mới",
|
|
"noApiKeys": "Chưa có khóa API nào.",
|
|
"apiKeyActive": "Đang hoạt động",
|
|
"apiKeyUsageHint": "Thêm khóa của bạn vào",
|
|
"apiKeyUsageHintHeader": "tiêu đề.",
|
|
"apiKeyPermissionsHint": "Khóa kế thừa quyền của người dùng tạo.",
|
|
"exportData": "Xuất dữ liệu của tôi",
|
|
"exportDataDesc": "Tải xuống bản sao lưu máy chủ, thông tin đăng nhập và cài đặt của bạn để chuyển sang thiết bị khác.",
|
|
"export": "Xuất khẩu",
|
|
"exporting": "Đang xuất khẩu...",
|
|
"importData": "Nhập dữ liệu của tôi",
|
|
"importDataDesc": "Khôi phục máy chủ, thông tin đăng nhập và cài đặt của bạn từ tệp sao lưu .sqlite.",
|
|
"importDataSelected": "Đã chọn: {{name}}",
|
|
"selectFile": "Chọn tệp",
|
|
"changeFile": "Thay đổi",
|
|
"import": "Nhập khẩu",
|
|
"importing": "Đang nhập khẩu...",
|
|
"exportSuccess": "Dữ liệu đã được xuất thành công.",
|
|
"exportFailed": "Xuất dữ liệu thất bại",
|
|
"importSelectFile": "Vui lòng chọn tệp trước",
|
|
"importCompleted": "Quá trình nhập khẩu hoàn tất: {{total}} mục đã được nhập, {{skipped}} mục bị bỏ qua",
|
|
"importFailed": "Nhập khẩu thất bại: {{error}}",
|
|
"roleUser": "Người dùng",
|
|
"authMethodDual": "Xác thực kép",
|
|
"authMethodOidc": "Bên ngoài",
|
|
"done": "Xong",
|
|
"apiKeyNameRequired": "Tên khóa là bắt buộc",
|
|
"apiKeyCreated": "Đã tạo khóa API \"{{name}}\"",
|
|
"apiKeyCreateFailed": "Tạo khóa API thất bại",
|
|
"apiKeyUser": "Người dùng",
|
|
"apiKeyExpires": "Hết hạn",
|
|
"apiKeyRevoked": "Đã thu hồi khóa API \"{{name}}\"",
|
|
"apiKeyRevokeFailed": "Thu hồi khóa API thất bại",
|
|
"passwordFieldsRequired": "Cần nhập mật khẩu hiện tại và mật khẩu mới",
|
|
"passwordMismatch": "Mật khẩu không khớp",
|
|
"passwordTooShort": "Mật khẩu phải có ít nhất 6 ký tự",
|
|
"passwordUpdated": "Cập nhật mật khẩu thành công",
|
|
"passwordUpdateFailed": "Cập nhật mật khẩu thất bại",
|
|
"deletePasswordRequired": "Cần mật khẩu để xóa tài khoản",
|
|
"deleteFailed": "Xóa tài khoản thất bại",
|
|
"deleting": "Đang xóa...",
|
|
"colorPickerTooltip": "Mở bảng chọn màu",
|
|
"themeSystem": "Hệ thống",
|
|
"themeLight": "Sáng",
|
|
"themeDark": "Tối",
|
|
"themeDracula": "Dracula",
|
|
"themeCatppuccin": "Catppuccin",
|
|
"themeNord": "Nord",
|
|
"themeSolarized": "Solarized",
|
|
"themeTokyoNight": "Tokyo Night",
|
|
"themeOneDark": "One Dark",
|
|
"themeGruvbox": "Gruvbox",
|
|
"linkedProfileTitle": "Signed in to {{server}}",
|
|
"linkedProfileDescription": "This device uses your account on the server and keeps a copy of your data, so it still works offline.",
|
|
"manageSync": "Manage sync",
|
|
"setUpSync": "Link to a server",
|
|
"settingsTabsAndShortcuts": "Tabs and Shortcuts"
|
|
}
|
|
}
|
|
},
|
|
"terminalToolbar": {},
|
|
"plugins": {
|
|
"capabilities": {
|
|
"credentials:read": {
|
|
"title": "See your passwords and keys",
|
|
"consequence": "It can read the stored secret for any host you can reach."
|
|
},
|
|
"ssh:connect": {
|
|
"title": "Run commands on your servers",
|
|
"consequence": "Any command, on hosts you connect it to, with your access."
|
|
},
|
|
"process:spawn": {
|
|
"title": "Run programs on this machine",
|
|
"consequence": "Programs run on the Termix server itself, not on your hosts."
|
|
},
|
|
"users:write": {
|
|
"title": "Create and change user accounts",
|
|
"consequence": "It can add users and change their roles."
|
|
},
|
|
"auth:provide": {
|
|
"title": "Handle sign in",
|
|
"consequence": "It can add a login method, a second factor or an SSH sign-in type."
|
|
},
|
|
"system:tls": {
|
|
"title": "Manage certificates",
|
|
"consequence": "It can replace the certificate Termix serves over HTTPS and answer domain checks from certificate authorities."
|
|
},
|
|
"device:serial": {
|
|
"title": "Access serial and USB devices",
|
|
"consequence": "It can open a physical serial port on the machine running Termix."
|
|
},
|
|
"hosts:write": {
|
|
"title": "Create and change hosts",
|
|
"consequence": "It can add hosts and edit the ones you already have."
|
|
},
|
|
"credentials:use": {
|
|
"title": "Connect to your servers",
|
|
"consequence": "It cannot see your passwords or keys."
|
|
},
|
|
"credentials:write": {
|
|
"title": "Save new credentials",
|
|
"consequence": "It can add passwords and keys to your saved credentials."
|
|
},
|
|
"network:outbound": {
|
|
"title": "Reach the internet",
|
|
"consequence": "It can send requests to outside services."
|
|
},
|
|
"network:serve": {
|
|
"title": "Accept connections",
|
|
"consequence": "It opens a port on the Termix server."
|
|
},
|
|
"network:broadcast": {
|
|
"title": "Send network broadcasts",
|
|
"consequence": "It can send packets to devices on the local network, such as a Wake-on-LAN signal."
|
|
},
|
|
"users:read": {
|
|
"title": "See usernames and roles",
|
|
"consequence": "Never password hashes, never two factor state."
|
|
},
|
|
"events:core": {
|
|
"title": "Watch everything happening",
|
|
"consequence": "Including activity from other users, not just yours."
|
|
},
|
|
"notify:send": {
|
|
"title": "Send alerts",
|
|
"consequence": "To you or other users, and through the channels they set up."
|
|
},
|
|
"notify:hub": {
|
|
"title": "Receive every alert",
|
|
"consequence": "Stores and delivers the alerts all plugins send, including their contents."
|
|
},
|
|
"audit:read": {
|
|
"title": "Read the audit log",
|
|
"consequence": "It can see who did what and when."
|
|
},
|
|
"desktop:window": {
|
|
"title": "Open desktop windows",
|
|
"consequence": "Only in the Termix desktop app."
|
|
},
|
|
"users:impersonate": {
|
|
"title": "Act as other users",
|
|
"consequence": "Runs background work with another user's access, such as scheduled jobs. Every use is written to the audit log."
|
|
},
|
|
"db:core-refs": {
|
|
"title": "Read core account tables",
|
|
"consequence": "Can query users, roles and hosts directly from the database."
|
|
},
|
|
"hosts:read": {
|
|
"title": "See your host list",
|
|
"consequence": "Names and addresses for hosts you can already see."
|
|
},
|
|
"db:own": {
|
|
"title": "Store its own data",
|
|
"consequence": "Kept in its own tables, separate from other plugins."
|
|
},
|
|
"kv:own": {
|
|
"title": "Remember small settings",
|
|
"consequence": "Kept separate from other plugins."
|
|
},
|
|
"files:own": {
|
|
"title": "Store its own files",
|
|
"consequence": "In its own folder on disk, separate from other plugins."
|
|
},
|
|
"secrets:own": {
|
|
"title": "Store its own secrets",
|
|
"consequence": "Encrypted by Termix. The plugin never holds the key."
|
|
},
|
|
"settings:read-core": {
|
|
"title": "Read Termix settings",
|
|
"consequence": "Server settings, not your hosts or credentials."
|
|
},
|
|
"plugins:read": {
|
|
"title": "See installed features",
|
|
"consequence": "It can see which features are installed and running."
|
|
},
|
|
"ui:surface": {
|
|
"title": "Add its own screens",
|
|
"consequence": "Tabs, panels and settings you can hide later."
|
|
}
|
|
},
|
|
"runtime": {
|
|
"needsPlugin": "{{name}} is not available",
|
|
"needsUnknownPlugin": "This feature is not available",
|
|
"disabledHint": "It is turned off on this server.",
|
|
"missingHint": "The feature it came from has been removed.",
|
|
"failed": "{{name}} could not start",
|
|
"failedHint": "An admin can check the server logs for details.",
|
|
"loading": "Loading {{name}}",
|
|
"crashed": "Something went wrong in {{name}}",
|
|
"retry": "Try again"
|
|
}
|
|
},
|
|
"settings": {
|
|
"secretSet": "Set",
|
|
"secretNotSet": "Not set",
|
|
"secretReplace": "Thay thế",
|
|
"pluginSettingsSaved": "Settings saved",
|
|
"pluginSettingsInvalid": "Some settings could not be saved. Check the highlighted fields.",
|
|
"pluginSettingsSaveFailed": "Failed to save settings",
|
|
"pluginSettingsLoadFailed": "Failed to load settings",
|
|
"featureUnavailable": "{{name}} is unavailable right now. These settings are saved but will not take effect."
|
|
},
|
|
"managerCard": {
|
|
"refresh": "Làm mới",
|
|
"retry": "Thử lại",
|
|
"sudoHint": "Đặt mật khẩu sudo cho máy chủ này trong trình chỉnh sửa máy chủ để kích hoạt các hành động đặc quyền.",
|
|
"noData": "Không có dữ liệu",
|
|
"filter": "Lọc..."
|
|
},
|
|
"sync": {
|
|
"server": "Termix server",
|
|
"account": "Tài khoản",
|
|
"status": "Trạng thái",
|
|
"never": "chưa bao giờ",
|
|
"justNow": "vừa xong",
|
|
"minutesAgo_one": "{{count}} minute ago",
|
|
"minutesAgo_other": "{{count}} minutes ago",
|
|
"hoursAgo_one": "{{count}} hour ago",
|
|
"hoursAgo_other": "{{count}} hours ago",
|
|
"actionFailed": "That did not work. Try again.",
|
|
"unlinkedTitle": "This device only",
|
|
"unlinkedBody": "Termix works on its own on this device. Link it to your Termix server to keep everything in step.",
|
|
"unlinkedPointHosts": "Your hosts, credentials, snippets and settings follow you to every device.",
|
|
"unlinkedPointOffline": "Everything still works when the server cannot be reached, and catches up later.",
|
|
"unlinkedPointAccount": "You sign in with your server account, and hosts people shared with you show up here too.",
|
|
"linkButton": "Link to a server",
|
|
"state": {
|
|
"syncing": "Syncing",
|
|
"offline": "Server not reachable",
|
|
"error": "Sync stopped",
|
|
"signedOut": "Signed out",
|
|
"synced": "Synced {{time}}"
|
|
},
|
|
"pending_one": "{{count}} change waiting to sync",
|
|
"pending_other": "{{count}} changes waiting to sync",
|
|
"signInAgain": "Sign in again",
|
|
"syncNow": "Sync now",
|
|
"unlink": "Unlink",
|
|
"unlinked": "This device is no longer linked",
|
|
"unlinkTitle": "Unlink this device?",
|
|
"unlinkDescription": "It stops syncing and signs out of the server. Hosts shared with you by others are removed from this device either way.",
|
|
"unlinkKeepTitle": "Keep my data here",
|
|
"unlinkKeepBody": "Your hosts, credentials and settings stay on this device and keep working on their own.",
|
|
"unlinkRemoveTitle": "Remove synced data",
|
|
"unlinkRemoveBody": "Everything that came from the server is removed from this device. Hosts kept on this device only stay.",
|
|
"conflictsTitle": "Conflicts",
|
|
"conflictsDescription": "These were changed here and on the server at the same time. The server version is in use. Keep yours to send it to the server instead.",
|
|
"keepMine": "Keep mine",
|
|
"keepServer": "Keep server",
|
|
"errorsTitle": "Not synced",
|
|
"errorsDescription": "The server did not accept these changes. They stay on this device.",
|
|
"errorPermission": "Your account on the server is not allowed to make this change.",
|
|
"retry": "Try again",
|
|
"whatSyncs": "What syncs",
|
|
"whatSyncsDescription": "Turn off anything you want to keep on this device only.",
|
|
"coreGroup": "Termix",
|
|
"notOnServer": "The server does not have this",
|
|
"notOnDevice": "Not on this device yet",
|
|
"localOnlyHint": "You can also keep single hosts or folders on this device from their settings.",
|
|
"originTitle": "Where connections start",
|
|
"originDescription": "Connect to hosts from this device, or through the server. You can change this per host.",
|
|
"originLocal": "This device",
|
|
"originRemote": "The server",
|
|
"entities": {
|
|
"hosts": "Máy chủ",
|
|
"sshCredentials": "Thông tin xác thực",
|
|
"sshFolders": "Thư mục",
|
|
"userPreferences": "Preferences",
|
|
"pluginUserSettings": "Feature settings",
|
|
"sharedHosts": "Hosts shared with you",
|
|
"sharedCredentials": "Credentials shared with you",
|
|
"vaultProfiles": "Vault profiles",
|
|
"snippetFolders": "Snippet folders",
|
|
"snippets": "Đoạn mã",
|
|
"dashboardServiceLinks": "Service links",
|
|
"homepageItems": "Homepage items",
|
|
"networkTopology": "Network map",
|
|
"workspaces": "Workspaces"
|
|
},
|
|
"proxy": {
|
|
"title": "Reverse proxy",
|
|
"description": "Only needed when something like Cloudflare Access or a login page sits in front of your server.",
|
|
"headersTitle": "Extra headers",
|
|
"headersHint": "Sent with every request to the server, for example a Cloudflare Access service token.",
|
|
"headerName": "Header name",
|
|
"headerValue": "Value",
|
|
"savedValue": "Saved, type to change",
|
|
"addHeader": "Add header",
|
|
"removeHeader": "Remove header",
|
|
"basicAuthTitle": "Username and password",
|
|
"basicAuthHint": "For a proxy that asks for a username and password before Termix.",
|
|
"username": "Tên đăng nhập",
|
|
"password": "Mật khẩu",
|
|
"allowInvalidCertificate": "Trust a self-signed certificate",
|
|
"allowInvalidCertificateHint": "Only for your own server, when its certificate is not from a known authority.",
|
|
"saved": "Đã lưu"
|
|
},
|
|
"problems": {
|
|
"invalidUrl": "That does not look like a web address.",
|
|
"unreachable": "Could not reach the server. Check the address and that the server is running.",
|
|
"unreachableWithReason": "Could not reach the server: {{reason}}",
|
|
"tlsUntrusted": "The server certificate is not trusted. If this is your own server with a self-signed certificate, turn on the option below.",
|
|
"basicAuthRequired": "Something in front of the server asks for a username and password. Enter them below.",
|
|
"proxyLogin": "A login page or proxy answered instead of Termix. Add the headers it needs below, or check the address.",
|
|
"notTermix": "There is no Termix server at that address. If it runs under a path, include it, like https://example.com/termix.",
|
|
"versionMismatch": "That server runs an older Termix. Update it to 2.9 or newer to link.",
|
|
"differentAccount": "You signed in to a different account. Sign in to the account this device is linked to, or unlink first."
|
|
},
|
|
"wizard": {
|
|
"title": "Link to a Termix server",
|
|
"reloginTitle": "Sign in again",
|
|
"savedServers": "Recent servers",
|
|
"removeServer": "Remove from the list",
|
|
"serverDescription": "Enter the address you use to open Termix in your browser.",
|
|
"signinDescription": "Sign in to {{url}}",
|
|
"chooseDescription": "This device already has data. What should happen to it?",
|
|
"finishingDescription": "Linking this device.",
|
|
"serverUrl": "Server address",
|
|
"serverUrlHint": "For example https://termix.example.com",
|
|
"showProxySettings": "Reverse proxy settings",
|
|
"hideProxySettings": "Hide reverse proxy settings",
|
|
"continue": "Tiếp tục",
|
|
"back": "Quay lại",
|
|
"mergeTitle": "Add it to my account",
|
|
"mergeBody": "The {{count}} items on this device are added to your account. Items your account already has stay as they are on the server.",
|
|
"replaceTitle": "Replace it with my account",
|
|
"replaceBody": "The {{count}} items on this device are removed, and this device takes everything from your account. Hosts kept on this device only stay.",
|
|
"link": "Link",
|
|
"linking": "Linking and running the first sync...",
|
|
"linked": "Linked. Your data is syncing now.",
|
|
"signedInAgain": "Signed in. Sync is running again."
|
|
}
|
|
},
|
|
"hostDefaults": {
|
|
"source": {
|
|
"folder": "Folder {{name}}",
|
|
"user": "My defaults",
|
|
"admin": "Server",
|
|
"builtin": "Built-in"
|
|
},
|
|
"custom": "Tùy chỉnh",
|
|
"setHere": "Set here",
|
|
"notSet": "Not set",
|
|
"notSetTitle": "No default is set for this",
|
|
"resetTitle": "This host sets its own value. Click to use the default from {{source}} again",
|
|
"clearTitle": "Set at this level. Click to clear it and use {{source}} instead",
|
|
"inheritedTitle": "Follows the default from {{source}}",
|
|
"titleAdmin": "Server host defaults",
|
|
"titleUser": "My host defaults",
|
|
"titleFolder": "Folder defaults: {{name}}",
|
|
"descriptionAdmin": "Defaults for every host on this server. A user's own defaults, a folder's defaults or the host itself can still set a different value. Change a field to set it here, or clear it to leave it unset.",
|
|
"descriptionUser": "Defaults for all of your hosts, over the server's. A folder or the host itself can still set a different value. Change a field to set it here, or clear it to leave it unset.",
|
|
"descriptionFolder": "Defaults for the hosts in this folder and its subfolders, over your own. A host can still set a different value. Change a field to set it here, or clear it to leave it unset.",
|
|
"save": "Save defaults",
|
|
"saved_one": "Defaults saved. {{count}} host was updated.",
|
|
"saved_other": "Defaults saved. {{count}} hosts were updated.",
|
|
"savedInBackground": "Defaults saved. Hosts are being updated in the background.",
|
|
"appliedToHosts_one": "{{count}} host was updated with the new defaults.",
|
|
"appliedToHosts_other": "{{count}} hosts were updated with the new defaults.",
|
|
"saveFailed": "Could not save the defaults",
|
|
"loadFailed": "Could not load the defaults",
|
|
"confirmTitle": "Save defaults?",
|
|
"confirmChanges_one": "{{count}} host follows these defaults and will change.",
|
|
"confirmChanges_other": "{{count}} hosts follow these defaults and will change.",
|
|
"confirmNoChanges": "No existing host changes. New hosts will start with these defaults.",
|
|
"menuMyDefaults": "My host defaults",
|
|
"folderDefaultsAction": "Folder defaults",
|
|
"adminSectionDescription": "Set the defaults every host on this server follows, for every setting a host has, including each feature's. Users and folders can set their own on top, and any host can still use its own value.",
|
|
"editServerDefaults": "Edit server defaults",
|
|
"resetMenu": "Đặt lại",
|
|
"resetAll": "Everything to defaults",
|
|
"resetCore": "Connection and SSH to defaults",
|
|
"resetDone_one": "{{count}} host now follows its defaults.",
|
|
"resetDone_other": "{{count}} hosts now follow their defaults."
|
|
}
|
|
}
|