mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-08-30 02:41:34 +00:00
+3





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


a64c956c5b
* fix: preserve remote sync references (#1092) * fix: centralize outbound address validation (#1093) * fix: preserve architecture in unpacked ASAR path (#1094) * fix: allow sharing empty folders (#1096) * fix: preserve WoL broadcast address (#1097) * fix: deduplicate shared hosts (#1098) * fix snippet execution result handling (#1099) * fix SSH login alert delivery (#1100) * fix outbound DNS lookup callback shape (#1101) * fix OIDC verification for JWKs without alg (#1102) * fix file manager navigation after permission errors (#1103) * fix database persistence during container shutdown (#1104) * fix: persist host command history setting (#1107) * fix: recognize Windows terminal Tab events (#1109) * fix: recognize Windows terminal Tab events * style: format terminal key event test * fix: export repository user record (#1111) * fix: keep localhost database export same-origin (#1112) * fix: support Tailscale auth in tmux monitor (#1113) * fix: forward Android hardware keyboard keys (#1114) * fix: expose jump tunnels to guacd (#1115) * fix OIDC login with unverifiable ID tokens (#1117) verifyOIDCToken passed the raw id_token straight to jose's jwtVerify, which throws JWSInvalid when the token is not a three-segment compact JWS. Authentik issues an encrypted JWE id_token when the provider has an encryption key set, so the callback threw and every OIDC login failed with 'Invalid Compact JWS'. 2.5.0 hid this behind a catch-all that decoded the unverified payload; removing that fallback fixed the trust bug but turned the pre-existing verification failure into a hard login failure. Check the segment count before verifying and raise a distinct OIDCTokenFormatError, which the callback treats as 'no usable claims here' and falls through to the userinfo endpoint. Signature and claim failures still reject the login. Fixes Termix-SSH/Support#1016 Fixes Termix-SSH/Support#1018 * refuse to start with an empty database when data exists elsewhere (#1118) When the data directory holds no database, startup treats it as a first run and silently creates an empty one. A deployment that loses DATA_DIR — an .env file the service no longer loads, a volume that did not mount — lands in exactly that state, so the user is asked to register an admin account again while the real database sits untouched one directory over. It is indistinguishable from the upgrade having deleted everything. Check the known data locations before creating a new database and refuse to start when one of them already holds a database, naming both directories. ALLOW_EMPTY_DATA_DIR=true starts anyway for anyone deliberately starting over. This matches how a failed decryption already behaves: it throws rather than falling back to an empty database. Closes Termix-SSH/Support#1006 * stop read-only shared hosts from being dragged into folders (#1119) Shared hosts hide their edit, share and delete actions based on the recipient's permission level, but the sidebar row stays draggable regardless. Dropping one on a folder issues a bulk folder update the server rejects, so a recipient without edit rights gets a failure toast for an action the UI offered them. Gate draggable on canEditHost, and skip hosts the recipient cannot edit in the move handler so a mixed selection moves what it can instead of failing whole. Closes Termix-SSH/Support#1011 * apply the configured RDP resolution to the session (#1120) The host editor stores width and height in guacamoleConfig, and the backend passes them to guacd in the connection token. The renderer then appends its own width and height query parameters measured from the container, which take precedence, so a configured resolution never reached the session — only dpi did, because that was the one display field GuacamoleApp read back. Pass the configured width and height alongside dpi, and skip the container-driven sendSize on connect and on resize when a resolution is pinned. rescaleDisplay still fits the fixed display into the available space. Closes Termix-SSH/Support#1039 * honour per-host recording flags and explain a missing recording (#1121) The session recording section offers a recording path, a filename template and four content toggles, but the backend overwrote five of the six on every connection. A host could set none of them and get no indication why. Location and filename genuinely are not the host's to choose — recordings are indexed by them for playback and the backend refuses to read outside its recordings directory — so drop those two inputs rather than keep pretending they apply. The content flags are a host-level decision, so default them instead of forcing them. That still leaves the reported case, where guacd writes the file somewhere the backend cannot see it. The warning now reports both paths and names the two env vars that align them, which is otherwise guesswork for a split-container setup. Closes Termix-SSH/Support#1041 * route desktop guacd calls to the connected remote server (#1122) resolveConnectionOrigin() pins RDP/VNC/Telnet to "remote" because the embedded desktop backend does not bundle guacd, and the Guacamole websocket already follows that. The status check and both token calls did not: they use the shared authApi, which in Electron is hard-coded to the embedded backend. So the desktop app asked the backend without guacd whether guacd was available, got "disconnected", and refused to connect — while the connected server it would actually have used reports it as connected and serves the same host fine from the web client. Send those three calls through a remote-origin instance in Electron, alongside the existing file-manager, tunnel and stats ones. Closes Termix-SSH/Support#1043 * move the Homebrew cask to where a tap looks for it (#1123) A tap discovers casks in a top-level Casks/ directory. The cask sat in packaging/Casks/, so tapping the repository succeeded and every subsequent brew install --cask termix reported that no cask with that name exists. Move it and repoint the five workflow references. The release job still rewrites the version and checksum in place, and the electron job still copies it into the generated and submission trees. Closes Termix-SSH/Support#1044 * stop highlighting inside a split control string (#1124) A control string (OSC/DCS/APC/PM) carries text that must never be displayed — an OSC 0 title holds the user, host and path, and PROMPT_COMMAND emits one on every prompt. Its opener and its terminator routinely land in different websocket frames, and the continuation frame contains no escape byte at all, so every guard in the highlighter misses it: TUI_SEQUENCE, CONTROL_STRING_SEQUENCE and hasIncompleteAnsiSequence all only look at one chunk. Highlighting that continuation injects an SGR sequence into the middle of the open string, which aborts it early in xterm.js and prints the remainder as ordinary text — the stray ~/path glued to the prompt, and the cursor arithmetic drift behind the duplicate prompts and Ctrl+R corruption. Track the state across chunks the way alternate-screen mode already is, and skip any chunk that starts or ends inside a control string. A trailing lone ESC counts as inside, since its meaning only arrives with the next chunk. Closes Termix-SSH/Support#1025 * stop session-log route test importing the real repository layer (#1125) The test mocks db, logger and AuthManager, but the route module also calls PermissionManager.getInstance() at import time and pulls in the repository factory, which loads the drizzle schema and the better-sqlite3 native binding. Importing that costs seconds when the full suite runs its projects concurrently, and the test times out at 5s. On its own it passes, so it read as flaky rather than as a missing mock. Mock both. None of it is under test here, and the file now imports in milliseconds regardless of load. * fail the guacamole-lite patch when an anchor is gone (#1126) Each patch bails out with a console.log and process.exit(0) when its anchor string is missing. The write-back happens at the end of the file, so an upstream release that moves any one anchor drops every patch, exits successfully, and leaves postinstall reporting nothing wrong. Termix then builds and starts normally and drops VNC/RDP sessions at runtime — with no signal pointing at the patch. Every patch here is required for correctness: protocol negotiation, the guacd 1.6.0 name handshake, dynamic argument answering, UTF-8 tokens, read-only joins. A missing anchor means the patch no longer applies, so exit non-zero and say which one and what to do. Unchanged: a missing guacamole-lite still skips quietly, and an already-patched tree still exits 0. * fix: clarify desktop local profile (#1095) * fix: clarify desktop local profile * cover the AccordionSection hidden branch The desktop build hides the Security section because the embedded profile signs in automatically and has no login password, so the controls there would imply a protection that does not exist. Nothing asserted that hidden actually keeps the children out of the DOM rather than merely collapsing them. Export the component and cover both states, including that an expanded hidden section still renders nothing. * fix: show remote sync account identity (#1110) * fix: show remote sync account identity * cover getRemoteSyncUserInfo and make its null contract hold Nothing asserted the renderer-side gate: browser builds must not reach for the IPC bridge, and a missing bridge, an unconfigured server, an expired JWT or a failed channel all have to degrade to no identity rather than throw. Writing that turned up a mismatch — with no preload bridge the optional chain resolved to undefined while the signature promises null. The only caller uses ??, so nothing is broken today, but the type was not telling the truth. The main-process half (token expiry, /users/me, the roles fallback) stays uncovered: remote-sync.cjs requires electron at load, so exercising it means stubbing safeStorage and the filesystem, which is a bigger change than this PR warrants. * improve settings navigation and legal disclosure (#1105) * fix desktop preference synchronization (#1106) * fix: use jump host SOCKS proxy settings (#1116) * ci(deps): bump the github-actions group with 2 updates (#1086) Bumps the github-actions group with 2 updates: [actions/setup-node](https://github.com/actions/setup-node) and [useblacksmith/setup-docker-builder](https://github.com/useblacksmith/setup-docker-builder). Updates `actions/setup-node` from 6 to 7 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v6...v7) Updates `useblacksmith/setup-docker-builder` from 1 to 2 - [Release notes](https://github.com/useblacksmith/setup-docker-builder/releases) - [Commits](https://github.com/useblacksmith/setup-docker-builder/compare/v1...v2) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: useblacksmith/setup-docker-builder dependency-version: '2' 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 23 updates (#1087) Bumps the dev-patch-updates group with 23 updates: | Package | From | To | | --- | --- | --- | | [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.5.4` | `2.5.5` | | [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.17` | `1.2.20` | | [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.20` | `1.1.23` | | [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.8` | `1.3.11` | | [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.20` | `1.1.23` | | [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.21` | `2.1.24` | | [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.12` | `2.1.15` | | [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.20` | `1.1.23` | | [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress) | `1.1.13` | `1.1.16` | | [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.15` | `1.2.18` | | [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.4` | `2.3.7` | | [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.12` | `1.1.15` | | [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.4` | `1.4.7` | | [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot) | `1.3.0` | `1.3.3` | | [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.4` | `1.3.7` | | [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.18` | `1.1.21` | | [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.13` | `1.2.16` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.3` | `6.0.4` | | [concurrently](https://github.com/open-cli-tools/concurrently) | `10.0.3` | `10.0.4` | | [radix-ui](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/radix-ui) | `1.6.3` | `1.6.7` | | [react](https://github.com/react/react/tree/HEAD/packages/react) | `19.2.7` | `19.2.8` | | [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) | `19.2.7` | `19.2.8` | | [react-i18next](https://github.com/i18next/react-i18next) | `17.0.10` | `17.0.11` | Updates `@biomejs/biome` from 2.5.4 to 2.5.5 - [Release notes](https://github.com/biomejs/biome/releases) - [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md) - [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.5/packages/@biomejs/biome) Updates `@radix-ui/react-accordion` from 1.2.17 to 1.2.20 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion) Updates `@radix-ui/react-alert-dialog` from 1.1.20 to 1.1.23 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog) Updates `@radix-ui/react-checkbox` from 1.3.8 to 1.3.11 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox) Updates `@radix-ui/react-dialog` from 1.1.20 to 1.1.23 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog) Updates `@radix-ui/react-dropdown-menu` from 2.1.21 to 2.1.24 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu) Updates `@radix-ui/react-label` from 2.1.12 to 2.1.15 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label) Updates `@radix-ui/react-popover` from 1.1.20 to 1.1.23 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover) Updates `@radix-ui/react-progress` from 1.1.13 to 1.1.16 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/progress/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/progress) Updates `@radix-ui/react-scroll-area` from 1.2.15 to 1.2.18 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area) Updates `@radix-ui/react-select` from 2.3.4 to 2.3.7 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select) Updates `@radix-ui/react-separator` from 1.1.12 to 1.1.15 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator) Updates `@radix-ui/react-slider` from 1.4.4 to 1.4.7 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider) Updates `@radix-ui/react-slot` from 1.3.0 to 1.3.3 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot) Updates `@radix-ui/react-switch` from 1.3.4 to 1.3.7 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch) Updates `@radix-ui/react-tabs` from 1.1.18 to 1.1.21 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs) Updates `@radix-ui/react-tooltip` from 1.2.13 to 1.2.16 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip) Updates `@vitejs/plugin-react` from 6.0.3 to 6.0.4 - [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.0.4/packages/plugin-react) Updates `concurrently` from 10.0.3 to 10.0.4 - [Release notes](https://github.com/open-cli-tools/concurrently/releases) - [Commits](https://github.com/open-cli-tools/concurrently/compare/v10.0.3...v10.0.4) Updates `radix-ui` from 1.6.3 to 1.6.7 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/radix-ui/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/1.6.7/packages/react/radix-ui) Updates `react` from 19.2.7 to 19.2.8 - [Release notes](https://github.com/react/react/releases) - [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/react/react/commits/v19.2.8/packages/react) Updates `react-dom` from 19.2.7 to 19.2.8 - [Release notes](https://github.com/react/react/releases) - [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-dom) Updates `react-i18next` from 17.0.10 to 17.0.11 - [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/react-i18next/compare/v17.0.10...v17.0.11) --- updated-dependencies: - dependency-name: "@biomejs/biome" dependency-version: 2.5.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-accordion" dependency-version: 1.2.20 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-alert-dialog" dependency-version: 1.1.23 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-checkbox" dependency-version: 1.3.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-dialog" dependency-version: 1.1.23 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-dropdown-menu" dependency-version: 2.1.24 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-label" dependency-version: 2.1.15 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-popover" dependency-version: 1.1.23 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-progress" dependency-version: 1.1.16 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-scroll-area" dependency-version: 1.2.18 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-select" dependency-version: 2.3.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-separator" dependency-version: 1.1.15 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-slider" dependency-version: 1.4.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-slot" dependency-version: 1.3.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-switch" dependency-version: 1.3.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-tabs" dependency-version: 1.1.21 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@radix-ui/react-tooltip" dependency-version: 1.2.16 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@vitejs/plugin-react" dependency-version: 6.0.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: concurrently dependency-version: 10.0.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: radix-ui dependency-version: 1.6.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: react dependency-version: 19.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: react-dom dependency-version: 19.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: react-i18next dependency-version: 17.0.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the prod-patch-updates group with 3 updates (#1088) Bumps the prod-patch-updates group with 3 updates: [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual), [jose](https://github.com/panva/jose) and [js-yaml](https://github.com/nodeca/js-yaml). Updates `@tanstack/react-virtual` from 3.14.6 to 3.14.8 - [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.8/packages/react-virtual) Updates `jose` from 6.2.3 to 6.2.4 - [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.3...v6.2.4) Updates `js-yaml` from 5.2.1 to 5.2.2 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/5.2.1...5.2.2) --- updated-dependencies: - dependency-name: "@tanstack/react-virtual" dependency-version: 3.14.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: jose dependency-version: 6.2.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: js-yaml dependency-version: 5.2.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> * chore(deps): bump undici in the prod-minor-updates group (#1089) Bumps the prod-minor-updates group with 1 update: [undici](https://github.com/nodejs/undici). Updates `undici` from 8.7.0 to 8.9.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v8.7.0...v8.9.0) --- updated-dependencies: - dependency-name: undici dependency-version: 8.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the major-updates group with 4 updates (#1090) Bumps the major-updates group with 4 updates: [better-sqlite3](https://github.com/WiseLibs/better-sqlite3), [chalk](https://github.com/chalk/chalk), [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) and [typescript](https://github.com/microsoft/TypeScript). Updates `better-sqlite3` from 12.11.1 to 13.0.1 - [Release notes](https://github.com/WiseLibs/better-sqlite3/releases) - [Commits](https://github.com/WiseLibs/better-sqlite3/compare/v12.11.1...v13.0.1) Updates `chalk` from 5.6.2 to 6.0.0 - [Release notes](https://github.com/chalk/chalk/releases) - [Commits](https://github.com/chalk/chalk/compare/v5.6.2...v6.0.0) Updates `@testing-library/jest-dom` from 6.9.1 to 7.0.0 - [Release notes](https://github.com/testing-library/jest-dom/releases) - [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/jest-dom/compare/v6.9.1...v7.0.0) Updates `typescript` from 6.0.3 to 7.0.2 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Commits](https://github.com/microsoft/TypeScript/commits) --- updated-dependencies: - dependency-name: better-sqlite3 dependency-version: 13.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: major-updates - dependency-name: chalk dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: major-updates - dependency-name: "@testing-library/jest-dom" dependency-version: 7.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: major-updates - dependency-name: typescript dependency-version: 7.0.2 dependency-type: direct:development update-type: version-update:semver-major dependency-group: major-updates ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * restore lint by pinning typescript below 7 (#1131) #1090 bumped typescript to 7.0.2. typescript-eslint declares `typescript: >=4.8.4 <6.1.0`, and TypeScript 7 removed `ts.Extension`, which @typescript-eslint/typescript-estree dereferences at import time: node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js:59 ts.Extension.Cjs, TypeError: Cannot read properties of undefined (reading 'Cjs') ESLint hits that while loading eslint.config.mjs, so `npm run lint` fails before linting anything. Node reports it as ERR_INTERNAL_ASSERTION, which hides the cause. Every open PR fails this check, not just new ones. Even the latest typescript-eslint prerelease still caps at <6.1.0, so there is nothing to upgrade to yet. Pin back to ~6.0.3 and tell dependabot to hold major typescript bumps until the ecosystem catches up. Also fixes biome.json pointing vcs.defaultBranch at dev-2.5.0, a branch that no longer exists. * make the repository layer engine-agnostic (#1127) DatabaseContext handed every repository a raw better-sqlite3 handle alongside drizzle, and three of them used it for retention queries built on datetime('now', ?) — a SQLite-only function. That handle is the one thing standing between the repository layer and a second engine. Drop it. The two time-based prunes compute their cutoff in JS against the CURRENT_TIMESTAMP text format, which every engine writes the same way and which compares correctly as a string; the health-history prune becomes a select of the rows to keep followed by a NOT IN delete. All three turn async, so their two callers await them. Name the dialect rather than repeating a string literal, so adding an engine is one edit instead of a search. Tests built their schema through context.sqlite?.exec(). Optional chaining meant removing the field type-checked cleanly and then silently created no tables, so the fixture now owns exec() and a raw handle for direct assertions — schema setup belongs to the test harness, not to the interface repositories consume. No behaviour change, and no Postgres yet: this only removes the coupling that would have to be undone first. * keep audit trails and recordings when a user is deleted (#1128) audit_logs and session_recordings both referenced users with ON DELETE CASCADE, so removing an account erased everything it had ever done. An audit trail that disappears with the account it recorded cannot answer the question it exists for, and a recording is evidence about a host as much as about a person. Both foreign keys become ON DELETE SET NULL. audit_logs already denormalises username, so an entry still names who acted once the reference is gone. session_recordings did not, so the column is added and backfilled first — otherwise relaxing the constraint would only trade deleted evidence for anonymous evidence. SQLite cannot alter a foreign key in place, so existing databases are migrated by copy-and-swap, guarded by a PRAGMA check that makes it idempotent. Fresh databases are created in the target shape and skip it. Recordings still cascade from their host. * audit the remaining remote access paths (#1129) Only SSH terminal sessions were audited. Opening a file manager session, an RDP, VNC or Telnet desktop, a Docker session or an SSH tunnel left no audit entry at all — which covers most of the ways data leaves a host or a foothold is established. Each of those four now writes an entry when the session is established, matching the existing ssh_connect: who, which host, from what address, and for tunnels the endpoint and local port being forwarded. Audit writes are fire-and-forget so they cannot delay or fail the connection, consistent with logAudit already swallowing its own errors. getAuditUsername was defined identically in two route files and is needed in four more, so it moves next to logAudit. * fix: honor lookupOptions.all in custom DNS lookup hook (#1084) Node's happy-eyeballs autoSelectFamily calls custom dns lookup functions with all:true and expects the full address array back. Always replying with a single (address, family) pair corrupted net's internal state, surfacing as "Invalid IP address: undefined" instead of a real connect error, breaking outbound notification delivery (webhook/ntfy). Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com> * fix: SSH-login alerts silently dropped (channel load + auth middleware ordering) (#1083) * fix: load notification channels on mount in AlertsPanel Channels only loaded when the Channels tab was visited, so opening Edit Alert Rule before ever switching to that tab showed the channel picker as empty even when channels existed. (cherry picked from commit caed913ee91990a853f5a048849c67ed3f7c329e) * fix: register login-alert route before auth middleware Global JWT auth middleware ran before this internal service-to-service route, rejecting it with 401 before its own IP+token check ever ran — silently dropped every SSH-login alert. Also surface non-OK responses instead of swallowing them. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * test: add coverage for alert-notification fixes Channel-load-on-mount, login-alert non-OK handling, and a source-order guard for the route/auth-middleware regression. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * format AlertsPanel test with prettier --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com> * stop deleting audit trails, and say when they are dropped (#1132) Two ways audit evidence still disappeared silently. Deleting an account removed its audit entries and session recordings outright. #1128 relaxed those foreign keys to ON DELETE SET NULL, but deleteUserAndRelatedData deletes the rows explicitly, so the schema change had no effect on the path that actually matters. Both repositories gain anonymizeByUserId, which nulls the reference and leaves the row; username is already denormalised on both tables, so entries stay attributable to whoever acted. Separately, the log pruned itself at a hard-coded 10000 rows with no signal. Entries well inside any retention window were discarded and nothing recorded it. Retention is now configurable by age via AUDIT_LOG_RETENTION_DAYS, the row cap via AUDIT_LOG_MAX_ENTRIES, and the two are reported differently: expiring an old entry is routine and logged at info, while hitting the cap means the ceiling is too low for how much this install audits and is logged at warn, naming the range discarded and how to stop it. * let the audit log leave the box (#1133) Retention became configurable in #1132, which only helps if entries can be moved somewhere before they expire. Until now the only way out was two GET endpoints built for the UI. Adds GET /audit-logs/export, taking the same filters as the list endpoint and streaming the whole matching set as CSV or NDJSON in batches, so an export is not bounded by the 200-row page cap and does not buffer the result set. Reading the entire trail is itself recorded as export_audit_logs. CSV fields starting with =, +, - or @ are prefixed with a quote. Audit rows carry attacker-influenced values like resource names, and spreadsheet software treats those as formulas on open. Adds optional live forwarding to a collector via AUDIT_LOG_FORWARD_URL, with an optional bearer token. Delivery goes through safeOutboundFetch so a misconfigured URL cannot be turned into an internal network probe, and it is fire-and-forget: the local write stays the source of truth and a dead SIEM must never delay or fail the operation being audited. Repeated failures are reported five times and then suppressed until delivery recovers, so an outage does not bury the logs it is supposed to appear in. * encrypt SSO secrets instead of base64-encoding them (#1135) The OIDC client secret and LDAP bind password were stored behind an encoded: prefix that is base64, not encryption. Anyone reading the database read the secrets. A second path wrote the same thing behind an encrypted: prefix, which was also base64 — and the reader even documented that it could not decrypt it. These belong to the installation rather than to a user: sso_providers has no userId, and the values must be readable during login, before anyone has authenticated, so the per-user DEK used elsewhere does not apply. They are now sealed with AES-256-GCM under the system encryption key, which already protects other installation-level material. Reading handles both legacy prefixes so an existing install is not locked out of SSO login, and a legacy value is upgraded the next time the provider is saved. The three scattered encode/decode sites are replaced by one module. * remove the unwired field encryption boundary (#1136) FieldEncryptionBoundary declared a full sensitive/plaintext policy for six tables and was referenced only by its own test. Nothing in production used it. Its policy is byte-for-byte the same as FieldCrypto.ENCRYPTED_FIELDS, which is the copy that actually runs, so nothing is lost by deleting it. Keeping a second list is the real risk: someone adds a field to this one, sees it classified as sensitive, and ships something that was never encrypted. The one apparent improvement it had — requiring an explicit recordId instead of DataCrypto's temp-${Date.now()} fallback — turns out to guard against nothing. decryptField derives its context from the recordId stored inside the ciphertext, not from the argument, so a temporary id at encryption time still decrypts. * load the database file when encryption is off (#1137) * Groundwork for Postgres and MySQL backends (#1134) * groundwork for postgres and mysql backends #1127 made the repository layer dialect-agnostic. This adds the pieces needed to actually target a second engine, as a foundation only — nothing is wired up and sqlite remains the sole runtime path. - DatabaseDialect covers sqlite, postgres and mysql, resolved from DATABASE_DIALECT and defaulting to sqlite so nothing changes for existing deployments or the desktop build - a column kit holding the per-dialect type choices in one file: booleans are integers on sqlite and native elsewhere, autoincrement differs three ways, and MySQL cannot index unbounded TEXT so key columns need varchar - settings and users declared for all three dialects as a proof slice, chosen because between them they use every construct the real schema does - pg and mysql2 added as dependencies The tests build real queries for all three engines without a server, asserting identifier quoting, placeholder style and boolean storage, so the property the repositories depend on is verified rather than assumed. * verify foreign keys and unique constraints port across dialects The first slice only covered plain columns. The real schema also has 92 foreign keys (80 cascade, 12 set null) and 14 unique columns, so the approach is only viable if those survive the port. Adds audit_logs and ssh_folders to the proof slice: one nullable reference with ON DELETE SET NULL, one required reference with ON DELETE CASCADE, a unique column, and an autoincrement surrogate key — which is spelled three different ways underneath (integer primary key autoincrement, serial, int auto_increment). All of it holds. Worth noting for whoever picks this up: getTableConfig is dialect-specific and silently fails on a table from another dialect, so the test uses each engine's own. * generate the postgres and mysql schemas instead of hand-writing them The proof slice showed the constructs port, but left the maintenance question open. Three hand-written copies of 52 tables is the wrong answer: with foreign keys the copies cross-reference each other, so a renamed table has to land in three places consistently or a key silently points at the wrong one. The mapping is mechanical, so a script does it. schema.ts stays the single source of truth and schema.pg.ts / schema.mysql.ts are derived, covering all 52 tables — the column kit and the two-table portable slice are gone, since the generator now holds those decisions. The transforms are the ones the kit enumerated: integer-backed booleans become native, autoincrement keys become serial or int auto_increment, real becomes double precision or double, and any column that is a primary key, is unique, or sits on either end of a foreign key becomes varchar because MySQL cannot index unbounded TEXT. > termix@2.6.0 lint > node scripts/generate-dialect-schema.cjs --check && eslint . /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/database/routes/homepage-favicon-routes.ts 99:12 warning 'err' is defined but never used unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/database/routes/homepage-ping-routes.ts 123:12 warning 'err' is defined but never used unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/database/routes/homepage-rss-routes.ts 144:12 warning 'err' is defined but never used unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/database/routes/session-log-routes.ts 46:16 warning 'canAccessRecording' is defined but never used. Allowed unused vars must match /^_/u unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/hosts/vault-signer-core.ts 55:12 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 75:13 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/tests/hosts/auth-manager.test.ts 18:73 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/tests/utils/shared-host-secrets-manager.test.ts 7:6 warning 'SecretRow' is defined but never used. Allowed unused vars must match /^_/u unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/utils/auth-manager.ts 510:13 warning 'affectedUsers' is assigned a value but never used. Allowed unused vars must match /^_/u unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/utils/notification-sender.ts 48:12 warning 'firstErr' is defined but never used unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/api/ssh-file-operations-api.ts 35:10 warning 'buildFileManagerUrl' is defined but never used. Allowed unused vars must match /^_/u unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/components/folder-style.tsx 61:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components 116:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components 121:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components 149:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/components/proxmox/ProxmoxDiscoverDialog.tsx 109:19 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any 190:19 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/HomepageCanvas.tsx 345:15 warning Empty block statement no-empty 388:15 warning Empty block statement no-empty 415:15 warning Empty block statement no-empty /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/dialogs/SingleHostEditForm.tsx 24:6 warning React Hook useEffect has a missing dependency: 'filter'. Either include it or remove the dependency array. If 'setHosts' needs the current value of 'filter', you can also switch to useReducer instead of useState and read 'filter' in the reducer react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/AlertFeedWidget.tsx 93:6 warning React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/CustomApiWidget.tsx 77:6 warning React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/DockerActivityWidget.tsx 50:6 warning React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/DockerWidget.tsx 16:10 warning Fast refresh only works when a file has exports. Move your component(s) to a separate file react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/FileManagerWidget.tsx 16:10 warning Fast refresh only works when a file has exports. Move your component(s) to a separate file react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/HostGridWidget.tsx 61:6 warning React Hook useCallback has a missing dependency: 'hostIds'. Either include it or remove the dependency array react-hooks/exhaustive-deps 61:7 warning React Hook useCallback has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/MetricsChartWidget.tsx 168:6 warning React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/PingStatusWidget.tsx 79:6 warning React Hook useEffect has a missing dependency: 'fetchAll'. Either include it or remove the dependency array react-hooks/exhaustive-deps 79:7 warning React Hook useEffect has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/QuickConnectWidget.tsx 64:10 warning Fast refresh only works when a file has exports. Move your component(s) to a separate file react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/RecentActivityWidget.tsx 82:6 warning React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps 82:17 warning React Hook useEffect has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/SshQuickConnectWidget.tsx 67:6 warning React Hook useCallback has a missing dependency: 'hostIds'. Either include it or remove the dependency array react-hooks/exhaustive-deps 67:7 warning React Hook useCallback has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked react-hooks/exhaustive-deps 99:17 warning 'online' is assigned a value but never used. Allowed unused vars must match /^_/u unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/SshTerminalWidget.tsx 17:10 warning Fast refresh only works when a file has exports. Move your component(s) to a separate file react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/SystemOverviewWidget.tsx 72:6 warning React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array react-hooks/exhaustive-deps /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/homepage/widgets/TunnelWidget.tsx 15:10 warning Fast refresh only works when a file has exports. Move your component(s) to a separate file react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/features/host-metrics/cards/CpuCard.tsx 14:10 warning 'computeChartData' is defined but never used. Allowed unused vars must match /^_/u unused-imports/no-unused-vars /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/sidebar/FolderPathPicker.tsx 15:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components 22:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components /mnt/c/Users/29037/WebstormProjects/Termix/src/ui/sidebar/HostsPanel.tsx 601:52 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any ✖ 44 problems (0 errors, 44 warnings) now fails if the generated files are out of date, so editing the schema without regenerating cannot reach main. * select durability behaviour per dialect, and document the backends The onWrite hook every repository receives exists to serialise the in-memory SQLite database back to its encrypted file. On a client-server engine a committed write is already durable and there is nothing to flush, so the factory now installs no hook at all rather than one that does nothing. Repositories call it as this.onWrite?.(), so none of the 43 of them change. Also adds docs/database-backends.md, mostly to be explicit about encryption, which is the part most likely to be misread. Field-level encryption is identical on all three engines and covers every credential. Whole-file encryption has no equivalent on Postgres or MySQL, so host names, snippet contents, audit entries and backups are only as protected as the storage underneath them — that is the operator's responsibility and the docs should not imply otherwise. * generate DDL with drizzle-kit, and give settings a synchronous path Two of the three remaining blockers. DDL: db/index.ts hand-writes 67 CREATE TABLE statements and 122 ADD COLUMN migrations, all in SQLite dialect. Rather than port them, drizzle-kit now generates migrations from the schema modules — 817 lines for Postgres, 869 for MySQL, with the type mapping already correct because the schemas it reads are themselves generated. > termix@2.6.0 schema:migrations > drizzle-kit generate --config=drizzle.config.pg.ts && drizzle-kit generate --config=drizzle.config.mysql.ts Reading config file '/mnt/c/Users/29037/WebstormProjects/Termix/drizzle.config.pg.ts' 52 tables alert_firings 11 columns 0 indexes 2 fks alert_rule_channels 3 columns 0 indexes 2 fks alert_rules 11 columns 0 indexes 2 fks api_keys 9 columns 0 indexes 1 fks audit_logs 13 columns 0 indexes 1 fks c2s_tunnel_presets 8 columns 0 indexes 1 fks command_history 5 columns 0 indexes 2 fks dashboard_service_links 8 columns 0 indexes 1 fks dismissed_alerts 4 columns 0 indexes 1 fks file_manager_pinned 6 columns 0 indexes 2 fks file_manager_recent 6 columns 0 indexes 2 fks file_manager_shortcuts 6 columns 0 indexes 2 fks homepage_items 9 columns 0 indexes 1 fks homepage_layouts 4 columns 0 indexes 1 fks host_access 11 columns 0 indexes 5 fks host_health_checks 7 columns 0 indexes 2 fks host_health_history 8 columns 0 indexes 2 fks host_metrics_history 8 columns 0 indexes 1 fks host_metrics_preferences 6 columns 0 indexes 2 fks ssh_data 94 columns 0 indexes 6 fks network_topology 5 columns 0 indexes 1 fks notification_channels 7 columns 0 indexes 1 fks opkssh_tokens 12 columns 0 indexes 2 fks recent_activity 6 columns 0 indexes 2 fks roles 8 columns 0 indexes 0 fks session_recordings 15 columns 0 indexes 3 fks session_share_participants 6 columns 0 indexes 2 fks session_shares 15 columns 0 indexes 3 fks sessions 11 columns 0 indexes 1 fks settings 2 columns 0 indexes 0 fks shared_host_secrets 15 columns 0 indexes 3 fks snippet_access 8 columns 0 indexes 4 fks snippet_folders 8 columns 0 indexes 1 fks snippets 11 columns 0 indexes 1 fks ssh_credential_usage 5 columns 0 indexes 3 fks ssh_credentials 21 columns 0 indexes 1 fks ssh_folders 9 columns 0 indexes 2 fks sso_providers 8 columns 0 indexes 0 fks sync_tombstones 5 columns 0 indexes 1 fks termix_identities 6 columns 0 indexes 1 fks termix_identity_ca 8 columns 0 indexes 2 fks termix_identity_keys 12 columns 0 indexes 3 fks tmux_session_tags 6 columns 0 indexes 2 fks transfer_recent 7 columns 0 indexes 3 fks trusted_devices 8 columns 0 indexes 1 fks user_open_tabs 9 columns 0 indexes 2 fks user_preferences 23 columns 0 indexes 1 fks user_roles 5 columns 0 indexes 3 fks users 20 columns 0 indexes 0 fks vault_profiles 18 columns 0 indexes 1 fks vault_tokens 8 columns 0 indexes 2 fks webauthn_credentials 12 columns 0 indexes 1 fks No schema changes, nothing to migrate 😴 Reading config file '/mnt/c/Users/29037/WebstormProjects/Termix/drizzle.config.mysql.ts' Reading schema files: /mnt/c/Users/29037/WebstormProjects/Termix/src/backend/database/db/schema.mysql.ts 52 tables alert_firings 11 columns 0 indexes 2 fks alert_rule_channels 3 columns 0 indexes 2 fks alert_rules 11 columns 0 indexes 2 fks api_keys 9 columns 0 indexes 1 fks audit_logs 13 columns 0 indexes 1 fks c2s_tunnel_presets 8 columns 0 indexes 1 fks command_history 5 columns 0 indexes 2 fks dashboard_service_links 8 columns 0 indexes 1 fks dismissed_alerts 4 columns 0 indexes 1 fks file_manager_pinned 6 columns 0 indexes 2 fks file_manager_recent 6 columns 0 indexes 2 fks file_manager_shortcuts 6 columns 0 indexes 2 fks homepage_items 9 columns 0 indexes 1 fks homepage_layouts 4 columns 0 indexes 1 fks host_access 11 columns 0 indexes 5 fks host_health_checks 7 columns 0 indexes 2 fks host_health_history 8 columns 0 indexes 2 fks host_metrics_history 8 columns 0 indexes 1 fks host_metrics_preferences 6 columns 0 indexes 2 fks ssh_data 94 columns 0 indexes 6 fks network_topology 5 columns 0 indexes 1 fks notification_channels 7 columns 0 indexes 1 fks opkssh_tokens 12 columns 0 indexes 2 fks recent_activity 6 columns 0 indexes 2 fks roles 8 columns 0 indexes 0 fks session_recordings 15 columns 0 indexes 3 fks session_share_participants 6 columns 0 indexes 2 fks session_shares 15 columns 0 indexes 3 fks sessions 11 columns 0 indexes 1 fks settings 2 columns 0 indexes 0 fks shared_host_secrets 15 columns 0 indexes 3 fks snippet_access 8 columns 0 indexes 4 fks snippet_folders 8 columns 0 indexes 1 fks snippets 11 columns 0 indexes 1 fks ssh_credential_usage 5 columns 0 indexes 3 fks ssh_credentials 21 columns 0 indexes 1 fks ssh_folders 9 columns 0 indexes 2 fks sso_providers 8 columns 0 indexes 0 fks sync_tombstones 5 columns 0 indexes 1 fks termix_identities 6 columns 0 indexes 1 fks termix_identity_ca 8 columns 0 indexes 2 fks termix_identity_keys 12 columns 0 indexes 3 fks tmux_session_tags 6 columns 0 indexes 2 fks transfer_recent 7 columns 0 indexes 3 fks trusted_devices 8 columns 0 indexes 1 fks user_open_tabs 9 columns 0 indexes 2 fks user_preferences 23 columns 0 indexes 1 fks user_roles 5 columns 0 indexes 3 fks users 20 columns 0 indexes 0 fks vault_profiles 18 columns 0 indexes 1 fks vault_tokens 8 columns 0 indexes 2 fks webauthn_credentials 12 columns 0 indexes 1 fks No schema changes, nothing to migrate 😴 regenerates both. Settings: 27 call sites read settings synchronously, during startup and inside request handlers. better-sqlite3 can do that; Postgres and MySQL cannot, and making all 27 async would push await through code that has no reason to be asynchronous. Settings are a handful of rarely-changing rows read constantly, so they are cached in full — primed at startup, kept in step by SettingsRepository on every set/delete/deleteLike. SQLite keeps reading the database directly and stays authoritative; only the other engines use the cache. Opening a connection is still not done. DatabaseContext.drizzle is typed as BetterSQLite3Database and 43 repositories depend on that inference; the three drizzle instance types are not interchangeable, so widening it is a design decision rather than a mechanical change. * exclude drizzle-kit output from prettier The generated migrations and snapshots are tool output; their formatting is drizzle-kit's to decide, and prettier cannot parse the .sql files at all. * absorb the RETURNING gap so mysql stays reachable MySQL has no RETURNING clause and drizzle's mysql-core does not expose the method, while 156 call sites here read the result of a write. That is the real blocker for MySQL, not the connection layer. Classifying those call sites showed the split is favourable: 92 of them only read .length, which every engine reports — as a returned array on sqlite and postgres, as affectedRows on MySQL. rowsAffected() reads both shapes, so those sites need no change in query shape. insertedId() does the same for the autoincrement key, which MySQL reports as insertId. What is left is the ~34 sites that genuinely consume the returned rows. Those cannot be emulated without reading first, which needs a transaction to stay correct under concurrency, so they will be handled individually rather than behind a helper that quietly adds a round trip. supportsReturning() is the seam for that. Identifying the mysql2 result by its own fields rather than by array shape matters: it hands back [ResultSetHeader, fields], which is an array, so shape alone cannot tell it apart from a returning() result. * name the portable database type, and open remote connections Two pieces of the connection layer. drizzle's three Database classes share no base class and their signatures are incompatible, so there is no honest type that covers all three: a union is not callable and a generic would have to be threaded through 43 repositories and every method on them. DatabaseContext.drizzle is now PortableDatabase, still the SQLite type underneath, but named and documented as the deliberate approximation it is. What makes it safe is that the equivalence is asserted in multi-dialect.test.ts rather than assumed, and the one place the surfaces truly differ — RETURNING — is handled explicitly in mutation-result.ts. connect.ts opens Postgres and MySQL from DATABASE_URL, with the schema module and driver imported lazily so neither is loaded on a SQLite deployment. The URL scheme is checked against the configured dialect first: a postgres:// URL with DATABASE_DIALECT=mysql otherwise surfaces as a driver error deep in a stack that never mentions the actual misconfiguration. * open postgres and mysql at startup * count writes without RETURNING * read affected rows without RETURNING on mysql * insert without RETURNING, and split the sync transactions * stop pretending the generated schemas are used at runtime * run the dialect checks in CI * mysql rejects a bare CURRENT_TIMESTAMP default on text * make the read-back mismatch loud, and stop the next bare returning() * run the repository tests on the real schema * skip the byte-level assertions off sqlite * move generated ids past the seeded ones * keep the export order the same on every engine * stop reading better-sqlite3 fields off every write * read counts as numbers, not whatever the driver returns * make the fixture usable against a live server * upsert on the engine that has no ON CONFLICT * run the repository suite on all three engines in CI * mysql cannot index a text column without a length * document how to actually run on postgres or mysql * keep the sqlite-era migrations off the other engines * concat strings in a way mysql agrees with * run every repository test on every engine * bound how long replicas can disagree about settings * generate the sqlite migrations alongside the others * Bump version from 2.6.0 to 2.6.1 * resolve the dialect in the repository factory instead of assuming sqlite (#1143) createCurrentRepositoryContext() hardcoded `dialect: "sqlite"` while the runtime already carried all three engines. That field is not decoration: returning.ts reads it to decide whether it can ask for RETURNING, and whether an upsert spells itself onConflictDoUpdate or onDuplicateKeyUpdate. Reporting sqlite while connected to MySQL means the first upsert calls onConflictDoUpdate on a mysql2 insert builder, which does not have it -- a TypeError, not a rejected query, as the note in returning.ts warned. So MySQL never worked outside the tests, and Postgres worked only because it also supports RETURNING and shares the conflict syntax. Three things were supposed to catch this and none could. The repository suite builds its own DatabaseContext in test-support.ts, verify-dialects.mjs builds its own, and the CI matrix runs both against real Postgres and MySQL containers -- all of them bypassing the one function the application calls. Green on three engines, broken on two. Resolve it from the environment, and test the factory itself rather than a hand-built context: the default, each configured dialect, the write hook it installs only for sqlite, and that an unsupported value throws rather than falling back. Reverting the fix fails two of them. Fixes Termix-SSH/Support#282 * fix remote sync stalling after the first pass and never propagating deletions (#1140) The incremental cursor never matched. updated_at/deleted_at are TEXT columns written by CURRENT_TIMESTAMP ("2026-07-29 10:11:21"), while the client sends an ISO 8601 since ("2026-07-29T10:06:55.172Z"). Both comparisons are lexical and ' ' sorts below 'T', so a newer row lost at position 10 and every ?since= query came back empty. Pass 1 syncs everything (since is null) and persists a cursor; every pass after it returns nothing with lastError: null and reports success. Normalize since into the stored shape on the way in, leaving an already-normalized value alone -- parsing that would treat it as local time and, west of UTC, push the cursor past unsynced rows. POST /sync/tombstones was unreachable. It was registered after POST /:entityType, and "tombstones" is a valid :entityType, so the wildcard answered it with 400 "Unknown entity type" and the handler never ran. The pass has no per-entity error handling, so that 400 also discarded the state of every entity type already synced in the same pass. Move it ahead of the wildcards. The tombstone guard consulted the incremental window. A row deleted on one side and untouched on the other -- the shape every ordinary deletion takes once the two sides converge -- is not in that window, so the tombstone was skipped, and skipped again on each later pass as it slid out of its own window. The guard cannot just be dropped: recording a tombstone for a row that was already gone hands the sender a fresh one to push back, and the two trade the same deletion forever. So only a delete that removed something records a tombstone, which makes the endpoint idempotent and lets the client push every tombstone unconditionally. Deletions missed while the cursor was broken stay missed -- their tombstones predate the persisted cursor. Ordinary edits do come through, since the row's updatedAt is still newer than it. Fixes Termix-SSH/Support#1050 Fixes Termix-SSH/Support#1051 * report why every JWKS fetch failed instead of swallowing the reason (#1142) An OIDC login that cannot reach the provider's keys ends in "Failed to fetch JWKS from any URL" and nothing else. Getting there discards everything worth knowing: a non-2xx response hit an empty else branch, a thrown request hit a bare `continue`, and discovery only logged when it threw -- a 404 or a document without jwks_uri passed in silence. An administrator cannot tell an issuer URL typo from a proxy, a private CA, or an outage at the provider, and neither can anyone reading the report. Collect each attempt with its reason and put them in the thrown error. It reaches the log through the existing "OIDC callback failed" handler; the browser still gets the same generic message it did before. Unwrapping the cause is the part that matters: undici reports every transport failure as "fetch failed" and hangs the real reason -- ENOTFOUND, ECONNREFUSED, a certificate that will not verify -- off error.cause. An attempt list built from the outer messages would be as useless as the single line it replaces. Also require jwks_uri to be a string before using it, so a malformed discovery document is reported as such rather than as a failed fetch of "[object Object]". Refs Termix-SSH/Support#1047 * restore the closing quote on the version string (#1147) "Bump version from 2.6.0 to 2.6.1" (2a66775) wrote "version": "2.6.1, dropping the closing quote, so package.json has not been valid JSON since. Anything that parses it fails: npm install, npm run build, and every CI run on this branch -- vitest cannot even load its config, because vite reads package.json before it gets to the test files. 2.6.1 cannot be built or released until this is fixed, which is why it goes in on its own rather than riding along with anything else. * Revert "fix remote sync stalling after the first pass and never propagating deletions (#1140)" (#1146) This reverts commitca7abf8426. Reverted for process, not for content. Both defects were reported by @kacperpietrzyk in Support#1050 and Support#1051, and he opened #1138 and #1139 fixing them 4.5 hours before #1140 was filed. Merging #1140 made two PRs from the person who found and diagnosed the bugs redundant. #1138 and #1139 stand on their own: the same root-cause analysis, complete regression tests, and a tombstone guard that only pays for its extra lookup on a pass that actually carries a deletion. There is no technical reason to prefer the reverted commit over them. The sync fixes land through those two PRs instead. * fix: make sync deletions reach the other side (#1139) * fix: apply sync tombstones to rows outside the incremental window Deletions never reached the other side. `syncEntity` decides whether to apply a tombstone by looking the row up in `localBySyncId` / `remoteBySyncId`, which are built from `pullSide(..., since)` -- the incremental window. A row deleted on one side and untouched on the other is by definition absent from that window, which is the shape every ordinary deletion takes once the two sides have converged, so the tombstone was silently skipped and never retried. The guard cannot simply be dropped. `POST /sync/tombstones` records a tombstone on the receiving side, so an unconditional push would give the other side a fresh tombstone to push back on the following pass, and the two would trade deletions forever. Instead ask the receiving side what it still holds, ignoring the window, and only when there is a deletion to apply -- so an ordinary pass costs nothing extra, and a pass carrying a deletion costs one additional list per affected entity type. Once the row is gone the push stops, so nothing ping-pongs. Note this only becomes observable together with the cursor fix in Termix-SSH/Support#1050: while that defect is present the tombstone endpoint returns nothing at all, so there is no tombstone to apply in the first place. Refs Termix-SSH/Support#1034 * fix: make the sync tombstone endpoint reachable `POST /sync/tombstones` was registered after `POST /:entityType`, and Express matches in registration order, so every deletion push was swallowed by the wildcard: "tombstones" is a perfectly good value for :entityType, fails isValidEntityType, and comes back as 400 "Unknown entity type". The handler below it has never run. Registering the literal path before the parameterised one restores it. The regression test reads the router stack rather than the source, so a future re-order fails the test rather than silently disabling deletions again. The GET pair is unaffected -- "/:entityType/tombstones" and "/:entityType" have different segment counts, so they cannot shadow each other. * feat: add host export dialog with host and field selection (#1108) * fix: compare sync cursors independently of timestamp layout (#1138) * fix: compare sync cursors independently of timestamp layout Incremental sync returned nothing after its first pass. `GET /sync/:entityType` filters with `gt(table.updatedAt, since)` on a TEXT column, and the tombstone endpoint does the same through `listSince`, but the two sides of that comparison are written in different layouts: the columns default to `CURRENT_TIMESTAMP` ("2026-07-29 10:11:21") while the desktop engine sends `new Date().toISOString()` ("2026-07-29T10:06:55.172Z"). Text comparison is decided at position 10, where ' ' (0x20) sorts below 'T' (0x54), so the predicate answers on layout rather than on time and is false for every CURRENT_TIMESTAMP row however new it is. The engine only sends a cursor from the second pass onward, so pass 1 synced everything and passes 2..n pulled zero rows and zero tombstones while reporting success -- edits and deletions silently stopped propagating in both directions. This was masked until now: before the reference fix in #1092 the loop threw before persisting state, so the cursor never advanced past null and every cycle was a full sync. Comparing "YYYY-MM-DD HH:MM:SS" on both sides is layout-independent. `replace` and `substr` are used rather than `datetime()` to keep the expression portable across engines, since the repository layer is deliberately drizzle-only. The comparison is `>=` because normalising truncates sub-second precision, and a strict `>` would permanently skip rows written in the cursor's own second; the re-sent boundary rows are a no-op, as the engine pushes only when one side is strictly newer. `updatedAt` is written in both layouts across the codebase (14 sites use toISOString, 11 use CURRENT_TIMESTAMP), so the tests cover rows of each kind. Closes Termix-SSH/Support#1050 * test: seed the cursor tests against the migrated schema #1134 moved schema creation into the repository test harness, so the hand-written CREATE TABLE blocks here collided with tables that already existed. Seeding into the real tables instead surfaced two constraints the local definitions had papered over: the harness enables foreign keys and both `sync_tombstones.user_id` and `ssh_credentials.user_id` reference `users`, so the owning row has to be seeded first; and `auth_type` is NOT NULL with no default, unlike the local copy. `exec` is awaited, since it only returns synchronously on SQLite. The assertions are unchanged. * Make Proxmox guest discovery and import reliable over a jump host (#1144) * fix: repair unterminated version string in package.json The version field on dev-2.6.1 reads "2.6.1, (no closing quote), which makes package.json invalid JSON and breaks every npm invocation on the branch. Close the string so the branch builds. * fix(proxmox): reliable guest discovery and import over jump hosts Importing Proxmox guests from a node reachable only through a jump host (with the guests behind the same jump) failed in a chain of small ways. - Discovery timed out intermittently: execCommand capped every pvesh call at 8s, but a single call over a jump measured ~8.3s. Raised to 25s for core calls and 12s for best-effort agent/interface lookups. - No IPs were resolved (so nothing imported): resolveIp fanned out 6 concurrent pvesh calls; on a small node they contend (3 concurrent already exceeded the timeout), so every IP came back empty. Lowered CONCURRENCY to 2. - RDP guests aborted the whole sync via NOT NULL on ssh_data.username; use "" instead of null (matches the normal create path). - Guests without a resolvable IP (e.g. QEMU with no guest agent) were skipped entirely; they now import with a 0.0.0.0 placeholder, and re-sync preserves any manually entered IP (guest.ip || existing.ip). - Manual import did not inherit the source host's jump chain or credential (guests ended up unreachable with authType "none"). The discovery result now carries the source jumpHosts, and resolveProxmoxImportAuth uses an available credential even under the default "password" authType (explicit secretless choices still win). - Long discoveries had no feedback and fought client/proxy timeouts; added an SSE endpoint GET /proxmox/discover/stream (heartbeat + n/N progress), keeping POST /discover as a fallback. Also always render the IP cell in the discovery table so IP-less rows stay aligned. Adds a unit test for resolveProxmoxImportAuth covering the credential inheritance behaviour. * test(proxmox): lock resolveProxmoxImportAuth matrix on both copies; fix agent secretless drift - extract the backend decision into src/backend/database/routes/proxmox-import-auth.ts (leaf module mirroring the UI copy) so it is unit-testable without pulling the whole backend module graph into the test env - add src/backend/tests/database/routes/proxmox-import-auth.test.ts asserting the shared matrix (lifted from #1141, thanks @ZacharyZcR) - consolidate the UI test into src/ui/tests/components/proxmox/proxmox-import-auth.test.ts and drop the duplicate src/ui/tests/proxmox/ copy - add 'agent' to the UI SECRETLESS_AUTH_TYPES: the one real auth type where the two copies still diverged (UI -> credential, backend -> passthrough) * fix(hosts): parse portKnockSequence JSON in host-resolver (#1149) host-resolver JSON-parses jumpHosts/tunnelConnections/statsConfig/ terminalConfig/socks5ProxyChain/quickActions but NOT portKnockSequence. Empty knock is stored as the string "[]" (UI save of empty array); the terminal code then checks portKnockSequence.length > 0 on the STRING, so "[]".length === 2 is truthy -> logs 'Loaded 2 port knock(s)' and attempts a bogus knock. Real knock sequences (JSON string) are likewise never parsed to the Array<{port,...}> that performPortKnocking expects, so a genuine knock would never fire. Parse portKnockSequence like the other JSON columns: '[]' -> [] (length 0, no knock), real seq -> array. Adds unit tests for both cases. Co-authored-by: XtraLarge <xtralarge@users.noreply.github.com> * Feature request map OIDC provider groups to RBAC roles (#1148) * Bump version from 2.6.0 to 2.6.1 in package-lock.json * Fix formatting issue in package-lock.json * Feature request map OIDC provider groups to RBAC roles Group membership from an OIDC provider currently drives only a single boolean: OIDC_ADMIN_GROUP toggles isAdmin and switches the user between the built-in `admin` and `user` roles. There is no way to map a provider group onto a custom role, so deployments that use host_access grants for environment-scoped access (e.g. a role that can reach staging hosts and another that can reach production) have to assign those roles by hand for every user. Add OIDC_ROLE_MAP, a comma- or newline-separated list of `group:role` pairs, reconciled against the user's roles on each OIDC login: OIDC_ROLE_MAP=devops-interns:devops-intern,devops-seniors:devops-senior Only roles named in the map are ever added or removed. Roles assigned by hand, and the admin/user pair maintained by the existing admin-group sync, are deliberately left untouched so the two mechanisms don't fight each other. Group names are matched case-insensitively with leading slashes stripped, so providers that emit full group paths (Keycloak's "Full group path" option) work without extra configuration. Reuses the existing extractOidcGroups claim handling, so custom claim paths via OIDC_GROUP_CLAIM are supported too, and invalidates the permission cache when roles change so new grants apply to the session that triggered the sync. Malformed map entries are skipped and a failed sync is logged but non-fatal — neither can block a valid login. Adds unit tests for the parser and resolver covering full group paths, multi-group membership, colons in group names and malformed input. --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: support for overriding shared host ssh credentials (#1145) * Bump version from 2.6.0 to 2.6.1 in package-lock.json * Fix formatting issue in package-lock.json * feat: support for overriding ssh credentials --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * ci(deps): bump the github-actions group with 2 updates (#1150) * Bump version from 2.6.0 to 2.6.1 in package-lock.json * Fix formatting issue in package-lock.json * Update README to remove Tailscale and add Ginernet Removed Tailscale logo and link from the README. Added Ginernet logo and link. * Update README.md * ci(deps): bump the github-actions group with 2 updates Bumps the github-actions group with 2 updates: [actions/setup-node](https://github.com/actions/setup-node) and [useblacksmith/setup-docker-builder](https://github.com/useblacksmith/setup-docker-builder). Updates `actions/setup-node` from 6 to 7 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v6...v7) Updates `useblacksmith/setup-docker-builder` from 1 to 2 - [Release notes](https://github.com/useblacksmith/setup-docker-builder/releases) - [Commits](https://github.com/useblacksmith/setup-docker-builder/compare/v1...v2) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: useblacksmith/setup-docker-builder dependency-version: '2' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the prod-minor-updates group with 3 updates (#1154) * Bump version from 2.6.0 to 2.6.1 in package-lock.json * Fix formatting issue in package-lock.json * Update README to remove Tailscale and add Ginernet Removed Tailscale logo and link from the README. Added Ginernet logo and link. * Update README.md * chore(deps): bump the prod-minor-updates group with 3 updates Bumps the prod-minor-updates group with 3 updates: [axios](https://github.com/axios/axios), [motion](https://github.com/motiondivision/motion) and [undici](https://github.com/nodejs/undici). Updates `axios` from 1.18.1 to 1.19.0 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.18.1...v1.19.0) Updates `motion` from 12.42.2 to 12.43.0 - [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md) - [Commits](https://github.com/motiondivision/motion/compare/v12.42.2...v12.43.0) Updates `undici` from 8.7.0 to 8.9.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v8.7.0...v8.9.0) --- updated-dependencies: - dependency-name: axios dependency-version: 1.19.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: motion dependency-version: 12.43.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates - dependency-name: undici dependency-version: 8.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] <support@github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: data guard test failure * chore(deps): bump 23 dependencies and fix dialect-unsafe queries Applies the non-major updates from the open dependabot PRs directly, since dependabot rebases against main and could not resolve its lockfiles against this branch. Holds back typescript 7 and jsdom 30; those majors need their own pass. Reformats with prettier 3.9.6, which collapses short union types onto one line. Formatting only: the compiled backend output is byte for byte identical. Also fixes two lint errors in the shared host auth override repository, where onConflictDoUpdate and .returning() are SQLite-only and broke the Postgres and MySQL builds, and drops unused imports left over from the shared host auth override merge. * chore: reversal of legal work * feat: improve pin side rail button position and added env var for telemetrics * Add Ctrl+F terminal search (#1156) * Bump version from 2.6.0 to 2.6.1 in package-lock.json * Fix formatting issue in package-lock.json * Update README to remove Tailscale and add Ginernet Removed Tailscale logo and link from the README. Added Ginernet logo and link. * Update README.md * Add Ctrl+F terminal search --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: host export dialog using incorrect widths * fix: made logger display expanded errors * feat: added support for multi disk usage in file manager and host metrics * chore: harden nginx headers and improve static asset caching * chore: format * chore: update release notes * fix: default font size to md instead of lg * feat: support Tailscale SSH check mode * chore: sync Crowdin translations for 2.6.1 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brennan Neoh <497569+brennanneoh@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: kacperpietrzyk <105545577+kacperpietrzyk@users.noreply.github.com> Co-authored-by: Max <50905012+maxiwolleb@users.noreply.github.com> Co-authored-by: XtraLarge <eMail@WilliWerres.de> Co-authored-by: XtraLarge <xtralarge@users.noreply.github.com> Co-authored-by: Devin Dissanayaka <dsdissanayaka2002@gmail.com> Co-authored-by: Peter Cinibulk <petercinibulk@gmail.com> Co-authored-by: Med Ali Ezzeddine <47082236+xDaly@users.noreply.github.com>
3750 lines
197 KiB
JSON
3750 lines
197 KiB
JSON
{
|
||
"termixId": {
|
||
"title": "Termix ID",
|
||
"loadFailed": "Falha ao carregar o Termix ID",
|
||
"claimTitle": "Reivindicar o seu Termix ID",
|
||
"claimIntro": "Escolha um identificador único. As suas chaves públicas SSH serão publicadas num URL público que pode adicionar ao ficheiro authorized_keys de qualquer servidor.",
|
||
"handleLabel": "Identificador",
|
||
"handlePlaceholder": "alice",
|
||
"checking": "A verificar…",
|
||
"available": "Disponível",
|
||
"taken": "Já utilizado",
|
||
"invalidHandle": "Apenas letras minúsculas, números, - e _",
|
||
"descriptionLabel": "Descrição (opcional)",
|
||
"descriptionPlaceholder": "Chaves do portátil de trabalho e do telemóvel",
|
||
"create": "Criar Termix ID",
|
||
"created": "Termix ID criado",
|
||
"createFailed": "Falha ao criar o Termix ID",
|
||
"deleteConfirm": "Eliminar o seu Termix ID e todas as chaves publicadas? Os servidores que provisionou manterão as chaves até as remover manualmente.",
|
||
"deleted": "Termix ID eliminado",
|
||
"deleteFailed": "Falha ao eliminar o Termix ID",
|
||
"copyFailed": "Falha ao copiar",
|
||
"resolverUrlLabel": "URL público de resolução",
|
||
"provisionLabel": "Provisionar um servidor",
|
||
"publishTitle": "Publicar uma chave pública",
|
||
"generate": "Gerar",
|
||
"generateTooltip": "Gerar um par de chaves Ed25519 — publica a chave pública e descarrega a chave privada para o seu dispositivo",
|
||
"saveToVault": "Guardar nas credenciais",
|
||
"keyPlaceholder": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@host",
|
||
"labelPlaceholder": "Etiqueta (opcional)",
|
||
"add": "Adicionar",
|
||
"importFromCredential": "Ou importar de uma credencial guardada",
|
||
"keyPublished": "Chave publicada",
|
||
"addKeyFailed": "Falha ao adicionar chave",
|
||
"generatedSaved": "Par de chaves gerado e guardado no cofre de credenciais. A chave privada também foi descarregada.",
|
||
"generatedOnly": "Par de chaves gerado — chave privada descarregada (exibida apenas uma vez).",
|
||
"generateFailed": "Falha ao gerar chave",
|
||
"imported": "Chave importada da credencial",
|
||
"importFailed": "Falha ao importar chave",
|
||
"noKeys": "Nenhuma chave pública publicada ainda.",
|
||
"keysTitle": "Chaves publicadas",
|
||
"published": "Publicada",
|
||
"hidden": "Oculta",
|
||
"keyRemoved": "Chave removida",
|
||
"removeKeyFailed": "Falha ao remover chave",
|
||
"updateKeyFailed": "Falha ao atualizar chave",
|
||
"fromVault": "Do cofre de credenciais",
|
||
"linkedToTermixId": "Publicada via Termix ID",
|
||
"selectCredential": "Selecionar uma credencial...",
|
||
"import": "Importar",
|
||
"caTitle": "Autoridade de certificação",
|
||
"caIntro": "Confie nesta CA num servidor e ele aceitará qualquer certificado que assinar. Rode para revogar tudo de uma só vez; os certificados também expiram automaticamente.",
|
||
"caEnable": "Ativar CA",
|
||
"caEnabled": "CA ativada",
|
||
"caCreateFailed": "Falha ao ativar CA",
|
||
"caPublicKeyLabel": "Chave pública da CA",
|
||
"caTrustLabel": "Confiar num servidor (executar como root)",
|
||
"caRotate": "Rodar",
|
||
"caRotateConfirm": "Rodar a CA? Todos os certificados que assinou deixarão de ser aceites e terão de ser reemitidos.",
|
||
"caRotated": "CA rodada — certificados anteriores revogados",
|
||
"caRotateFailed": "Falha ao rodar CA",
|
||
"caDelete": "Remover CA",
|
||
"caDeleteConfirm": "Remover a CA?",
|
||
"caDeleted": "CA removida",
|
||
"caDeleteFailed": "Falha ao remover CA",
|
||
"caValidityLabel": "Validade do certificado (dias)",
|
||
"issueCert": "Certificado",
|
||
"issueCertTooltip": "Emitir um certificado SSH para esta chave, assinado pela sua CA",
|
||
"certIssued": "Certificado emitido e transferido",
|
||
"certIssueFailed": "Falha ao emitir certificado"
|
||
},
|
||
"credentials": {
|
||
"folders": "Pastas",
|
||
"folder": "Pasta",
|
||
"password": "Palavra-passe",
|
||
"key": "Chave",
|
||
"sshPrivateKey": "Chave Privada SSH",
|
||
"upload": "Carregar",
|
||
"keyPassword": "Palavra-passe da Chave",
|
||
"sshKey": "Chave SSH",
|
||
"uploadPrivateKeyFile": "Carregar Ficheiro de Chave Privada",
|
||
"searchCredentials": "Pesquisar credenciais...",
|
||
"addCredential": "Adicionar Credencial",
|
||
"caCertificate": "Certificado CA (-cert.pub)",
|
||
"caCertificateDescription": "Opcional: Carregar ou colar o ficheiro de certificado assinado pela CA (ex.: id_ed25519-cert.pub). Necessário quando o seu servidor SSH utiliza autorização baseada em certificados.",
|
||
"uploadCertFile": "Carregar ficheiro -cert.pub",
|
||
"clearCert": "Limpar",
|
||
"certLoaded": "Certificado carregado",
|
||
"certPublicKeyLabel": "Certificado CA",
|
||
"certTypeLabel": "Tipo de certificado",
|
||
"pasteOrUploadCert": "Colar ou carregar um certificado -cert.pub...",
|
||
"hasCaCert": "Tem Certificado CA",
|
||
"noCaCert": "Sem Certificado CA",
|
||
"noPublicKeyAvailable": "Nenhuma chave pública disponível. Abra o editor de credenciais primeiro.",
|
||
"deployCommandCopied": "Comando de implementação copiado",
|
||
"sortCredentials": "Ordenar Credenciais",
|
||
"sortDefault": "Ordem predefinida",
|
||
"sortNameAsc": "Nome (A → Z)",
|
||
"sortNameDesc": "Nome (Z → A)",
|
||
"sortUsernameAsc": "Nome de utilizador (A → Z)",
|
||
"sortUsernameDesc": "Nome de utilizador (Z → A)",
|
||
"filterCredentials": "Filtrar Credenciais",
|
||
"filterClearAll": "Limpar Filtros",
|
||
"filterTypeGroup": "Tipo",
|
||
"filterTypePassword": "Palavra-passe",
|
||
"filterTypeKey": "Chave SSH",
|
||
"filterTagsGroup": "Etiquetas"
|
||
},
|
||
"homepage": {
|
||
"title": "Página Inicial",
|
||
"addWidget": "Adicionar widget",
|
||
"editWidget": "Editar widget",
|
||
"deleteWidget": "Apagar",
|
||
"widgetTypes": "Tipos de Widgets",
|
||
"serviceLink": "Link de Serviço",
|
||
"folder": "Pasta",
|
||
"clock": "Relógio",
|
||
"notes": "Notas",
|
||
"hostStatus": "Estado do Host",
|
||
"bookmarkList": "Marcadores",
|
||
"zoomIn": "Ampliar",
|
||
"zoomOut": "Reduzir",
|
||
"resetView": "Repor Vista",
|
||
"lockLayout": "Bloquear Disposição",
|
||
"unlockLayout": "Desbloquear Disposição",
|
||
"noWidgets": "Clique com o botão direito ou em + para adicionar o seu primeiro widget",
|
||
"openFullView": "Abrir Vista Completa",
|
||
"previewTitle": "Pré-visualização da Página Inicial",
|
||
"cancel": "Cancelar",
|
||
"save": "Guardar",
|
||
"title_label": "Título",
|
||
"widgetTitlePlaceholder": "Título do widget (opcional)",
|
||
"url": "URL",
|
||
"imageUrl": "URL de Imagem Personalizada",
|
||
"imageUrlHint": "Deixe em branco para usar automaticamente o favicon do site",
|
||
"showImage": "Mostrar Imagem",
|
||
"description": "Descrição",
|
||
"color": "Cor",
|
||
"icon": "Ícone",
|
||
"expanded": "Expandido por predefinição",
|
||
"timezone": "Fuso Horário",
|
||
"showSeconds": "Mostrar segundos",
|
||
"format12h": "12 horas",
|
||
"format24h": "24 horas",
|
||
"content": "Conteúdo",
|
||
"backgroundColor": "Cor de Fundo",
|
||
"host": "Host",
|
||
"showMetrics": "Mostrar métricas",
|
||
"links": "Hiperligações",
|
||
"addLink": "Adicionar ligação",
|
||
"linkLabel": "Etiqueta",
|
||
"linkUrl": "URL",
|
||
"removeLink": "Remover",
|
||
"categoryLinks": "Hiperligações",
|
||
"categoryInfo": "Info",
|
||
"categorySystem": "Sistema",
|
||
"widgetServiceLinkDesc": "Um mosaico clicável que liga a um URL de serviço",
|
||
"widgetFolderDesc": "Um contentor para agrupar widgets relacionados",
|
||
"widgetClockDesc": "Um relógio em tempo real com fuso horário configurável",
|
||
"widgetNotesDesc": "Um widget de notas em markdown",
|
||
"widgetHostStatusDesc": "Mostra CPU, memória e disco em tempo real para um anfitrião SSH",
|
||
"widgetBookmarkListDesc": "Uma lista de hiperligações rápidas",
|
||
"copyLink": "Copiar ligação",
|
||
"linkCopied": "Ligação copiada!",
|
||
"location": "Localização",
|
||
"temperatureUnit": "Unidade de temperatura",
|
||
"showForecast": "Mostrar previsão de 3 dias",
|
||
"scrolling": "Permitir deslocamento",
|
||
"feedUrl": "URL do feed",
|
||
"maxItems": "Itens máx.",
|
||
"showDescription": "Mostrar descrição",
|
||
"widgetWeatherName": "Tempo",
|
||
"widgetWeatherDesc": "Tempo em direto para qualquer localização",
|
||
"widgetIframeName": "Incorporação iFrame",
|
||
"widgetIframeDesc": "Incorpora qualquer URL num iframe",
|
||
"widgetRssName": "Feed RSS",
|
||
"widgetRssDesc": "Mostra itens de um feed RSS ou Atom",
|
||
"dragToFolder": "Arraste widgets aqui ou use + para adicionar",
|
||
"showDisk": "Mostrar utilização do disco",
|
||
"addToFolder": "Adicionar widget à pasta",
|
||
"noHostSelected": "Nenhum anfitrião selecionado",
|
||
"metricsNotAvailable": "Métricas não disponíveis",
|
||
"selectHost": "Selecionar um host...",
|
||
"displayedMetrics": "Métricas Exibidas",
|
||
"metricCpu": "CPU",
|
||
"metricMemory": "Memória",
|
||
"metricDisk": "Disco",
|
||
"metricUptime": "Tempo de atividade",
|
||
"metricSystem": "Sistema",
|
||
"metricOs": "SO",
|
||
"metricKernel": "Kernel",
|
||
"metricHostname": "Nome do host",
|
||
"metricNetwork": "Rede",
|
||
"metricProcesses": "Processos",
|
||
"metricProcessesTotal": "total",
|
||
"metricProcessesRunning": "em execução",
|
||
"categoryMonitoring": "Monitorização",
|
||
"loading": "A carregar...",
|
||
"noData": "Sem dados disponíveis",
|
||
"allClear": "Tudo em ordem",
|
||
"acknowledgeAlert": "Reconhecer",
|
||
"noPingUrls": "Nenhum URL configurado",
|
||
"pingLabel": "Etiqueta",
|
||
"addPingUrl": "Adicionar URL",
|
||
"showLatency": "Mostrar latência",
|
||
"refreshInterval": "Intervalo de atualização",
|
||
"seconds": "segundos",
|
||
"filterActivityTypes": "Filtrar tipos",
|
||
"filterTypesHint": "Deixar vazio para mostrar todos",
|
||
"showTimestamp": "Mostrar timestamp",
|
||
"uptimeUnavailable": "Tempo de atividade indisponível",
|
||
"uptimeLabel": "Tempo de atividade",
|
||
"overviewVersion": "Versão",
|
||
"overviewUpdate": "Atualizado",
|
||
"overviewUpdateAvailable": "Atualização disponível",
|
||
"overviewDatabase": "Base de dados",
|
||
"overviewUptime": "Tempo de atividade",
|
||
"noHosts": "Sem hosts configurados",
|
||
"hostGridHosts": "Hosts",
|
||
"hostGridAllHint": "Deixar em branco para mostrar todos os hosts",
|
||
"columns": "Colunas",
|
||
"showIp": "Mostrar endereço IP",
|
||
"connectionType": "Tipo de ligação",
|
||
"layout": "Layout",
|
||
"showStatus": "Mostrar estado",
|
||
"showHostName": "Mostrar nome do host",
|
||
"noDockerActivity": "Sem atividade do Docker",
|
||
"noActivity": "Sem atividade",
|
||
"showAcknowledged": "Mostrar reconhecidos",
|
||
"showCurrentValue": "Mostrar valor atual",
|
||
"chartMetric": "Métrica",
|
||
"metricRange": "Intervalo",
|
||
"widgetMetricsChartName": "Gráfico de métricas",
|
||
"widgetMetricsChartDesc": "Gráfico histórico de CPU, memória, disco ou rede para um host",
|
||
"widgetHostGridName": "Grelha de hosts",
|
||
"widgetHostGridDesc": "Vista em grelha dos estados dos hosts SSH",
|
||
"widgetAlertFeedName": "Feed de alertas",
|
||
"widgetAlertFeedDesc": "Disparos de alertas em tempo real com suporte a reconhecimento",
|
||
"widgetPingStatusName": "Estado do ping",
|
||
"widgetPingStatusDesc": "Estado do ping HTTP para um ou mais URLs",
|
||
"widgetRecentActivityName": "Atividade recente",
|
||
"widgetRecentActivityDesc": "Feed deslocável da atividade recente do Termix",
|
||
"widgetTermixUptimeName": "Tempo de atividade do Termix",
|
||
"widgetTermixUptimeDesc": "Contador em tempo real do tempo de atividade do servidor Termix",
|
||
"widgetSystemOverviewName": "Visão geral do sistema",
|
||
"widgetSystemOverviewDesc": "Versão do Termix, saúde da base de dados e tempo de atividade de relance",
|
||
"widgetSshQuickConnectName": "Ligação rápida SSH",
|
||
"widgetSshQuickConnectDesc": "Botões de um clique para abrir sessões SSH",
|
||
"widgetDockerActivityName": "Atividade do Docker",
|
||
"widgetDockerActivityDesc": "Eventos recentes de contentores Docker em todos os hosts",
|
||
"widgetCalendarName": "Calendário",
|
||
"widgetCalendarDesc": "Um calendário mensal com o dia de hoje em destaque",
|
||
"widgetCountdownName": "Contagem Decrescente",
|
||
"widgetCountdownDesc": "Temporizador de contagem decrescente até uma data alvo",
|
||
"widgetSearchBarName": "Barra de Pesquisa",
|
||
"widgetSearchBarDesc": "Widget de pesquisa rápida na web",
|
||
"widgetTextBannerName": "Banner de Texto",
|
||
"widgetTextBannerDesc": "Um rótulo ou cabeçalho de secção em destaque para a tela",
|
||
"widgetImageWidgetName": "Imagem",
|
||
"widgetImageWidgetDesc": "Exibir uma imagem a partir de um URL",
|
||
"widgetMarkdownNotesName": "Notas Markdown",
|
||
"widgetMarkdownNotesDesc": "Notas enriquecidas com renderização inline de Markdown",
|
||
"widgetCustomApiName": "API Personalizada",
|
||
"widgetCustomApiDesc": "Obter e exibir dados de qualquer API JSON",
|
||
"widgetServiceGridName": "Grelha de Serviços",
|
||
"widgetServiceGridDesc": "Uma grelha configurável de links de serviços em mosaico",
|
||
"widgetDashboardLinksName": "Links do Painel",
|
||
"widgetDashboardLinksDesc": "Exibir os seus links de serviço configurados a partir do painel",
|
||
"widgetSearchLinksName": "Atalhos de Pesquisa",
|
||
"widgetSearchLinksDesc": "Botões de atalho para pesquisa rápida com entrada inline",
|
||
"widgetLinkTreeName": "Árvore de Links",
|
||
"widgetLinkTreeDesc": "Secções agrupadas de links com cabeçalhos",
|
||
"calMon": "Seg",
|
||
"calTue": "Ter",
|
||
"calWed": "Qua",
|
||
"calThu": "Qui",
|
||
"calFri": "Sex",
|
||
"calSat": "Sáb",
|
||
"calSun": "Dom",
|
||
"startOnMonday": "Começar a semana na segunda-feira",
|
||
"countdownNoDate": "Nenhuma data alvo definida",
|
||
"countdownPast": "O evento já passou",
|
||
"countdownDays": "dias",
|
||
"countdownHours": "horas",
|
||
"countdownMinutes": "min",
|
||
"countdownSeconds": "seg",
|
||
"countdownLabel": "Rótulo",
|
||
"countdownLabelPlaceholder": "p. ex. Dia de Lançamento",
|
||
"countdownShowDays": "Mostrar Dias",
|
||
"countdownShowHours": "Mostrar Horas",
|
||
"targetDate": "Data Alvo",
|
||
"searchEngine": "Motor de Pesquisa",
|
||
"customSearchUrl": "URL de Pesquisa Personalizada",
|
||
"searchPlaceholder": "Pesquisar...",
|
||
"searchGo": "Ir",
|
||
"searchPlaceholderLabel": "Texto do Placeholder",
|
||
"searchPlaceholderHint": "Texto apresentado no campo de pesquisa",
|
||
"openInNewTab": "Abrir num Novo Separador",
|
||
"searchQueryPlaceholder": "Introduzir consulta...",
|
||
"noSearchShortcuts": "Nenhum atalho configurado",
|
||
"addSearchShortcut": "Adicionar Atalho",
|
||
"fontSize": "Tamanho da Letra",
|
||
"textAlign": "Alinhamento do Texto",
|
||
"fontWeight": "Peso da Fonte",
|
||
"clearColor": "Limpar Cor",
|
||
"imageFit": "Ajuste da Imagem",
|
||
"imageLinkUrl": "URL do Link",
|
||
"noImage": "Nenhum URL de imagem definido",
|
||
"altText": "Texto Alternativo",
|
||
"altTextPlaceholder": "Descreva a imagem",
|
||
"renderMarkdown": "Renderizar Markdown",
|
||
"displayMode": "Modo de Exibição",
|
||
"displayField": "Campo de Exibição",
|
||
"jsonPath": "Caminho JSON",
|
||
"customApiLabel": "Etiqueta",
|
||
"customApiLabelPlaceholder": "p. ex. Temperatura",
|
||
"customApiUnit": "Unidade",
|
||
"customApiNoUrl": "Nenhum URL de API configurado",
|
||
"customApiError": "Falha ao obter",
|
||
"customApiNotArray": "A resposta não é um array",
|
||
"addService": "Adicionar Serviço",
|
||
"showLabels": "Mostrar Etiquetas",
|
||
"iconSize": "Tamanho do Ícone",
|
||
"noDashboardLinks": "Nenhuma ligação do painel configurada",
|
||
"noLimit": "Sem limite",
|
||
"sectionHeading": "Cabeçalho da Secção",
|
||
"addSection": "Adicionar Secção",
|
||
"compactMode": "Modo Compacto",
|
||
"showDetailed": "Mostrar Detalhes",
|
||
"selectHosts": "Selecionar Hosts",
|
||
"allHosts": "Todos os hosts",
|
||
"listLayout": "Lista",
|
||
"gridLayout": "Grelha",
|
||
"terminal": "Terminal",
|
||
"files": "Ficheiros",
|
||
"docker": "Docker",
|
||
"range15m": "15 minutos",
|
||
"range1h": "1 hora",
|
||
"range6h": "6 horas",
|
||
"range24h": "24 horas",
|
||
"metricNetRx": "Download de Rede",
|
||
"metricNetTx": "Upload de Rede",
|
||
"severityFilter": "Filtro de Gravidade",
|
||
"filterAll": "Tudo",
|
||
"accentColor": "Cor de Destaque",
|
||
"widgetSshTerminalName": "Terminal SSH",
|
||
"widgetSshTerminalDesc": "Um terminal SSH integrado ligado a um host configurado",
|
||
"sshTerminalNoHost": "Nenhum host configurado",
|
||
"sshTerminalConnect": "Ligar",
|
||
"sshTerminalAutoConnect": "Ligação automática ao carregar",
|
||
"widgetQuickConnectName": "Ligação Rápida",
|
||
"widgetQuickConnectDesc": "Botões de lançamento num clique para qualquer tipo de ligação em todos os seus hosts",
|
||
"connectionTypes": "Tipos de Ligação",
|
||
"connType_terminal": "Terminal",
|
||
"connType_files": "Gestor de Ficheiros",
|
||
"connType_docker": "Docker",
|
||
"connType_tunnel": "Túnel",
|
||
"connType_host-metrics": "Métricas do Host",
|
||
"connType_rdp": "RDP",
|
||
"connType_vnc": "VNC",
|
||
"connType_telnet": "Telnet",
|
||
"widgetFileManagerName": "Gestor de Ficheiros",
|
||
"widgetFileManagerDesc": "Gestor de ficheiros SFTP integrado para um host configurado",
|
||
"widgetDockerName": "Gestor Docker",
|
||
"widgetDockerDesc": "Gestor de contentores Docker integrado para um host configurado",
|
||
"widgetTunnelName": "Gestor de Túneis",
|
||
"widgetTunnelDesc": "Gestor de túneis SSH integrado para um host configurado",
|
||
"widgetNoHostSelected": "Nenhum host configurado"
|
||
},
|
||
"serverConfig": {
|
||
"title": "Configuração do Servidor",
|
||
"description": "Configure o URL do servidor Termix para se ligar aos seus serviços de backend",
|
||
"serverUrl": "URL do Servidor",
|
||
"enterServerUrl": "Por favor, insira um URL do servidor",
|
||
"saveFailed": "Falha ao guardar a configuração",
|
||
"saveError": "Erro ao guardar a configuração",
|
||
"saving": "A guardar...",
|
||
"saveConfig": "Guardar Configuração",
|
||
"helpText": "Insira o URL onde o seu servidor Termix está a ser executado (ex: http://localhost:30001 ou https://your-server.com)",
|
||
"changeServer": "Alterar Servidor",
|
||
"mustIncludeProtocol": "O URL do servidor deve começar com http:// ou https://",
|
||
"allowInvalidCertificate": "Permitir certificado inválido",
|
||
"allowInvalidCertificateDesc": "Usar apenas para servidores auto-hospedados de confiança com certificados auto-assinados ou de endereço IP.",
|
||
"useEmbedded": "Usar Servidor Local",
|
||
"embeddedDesc": "Executar o Termix com o servidor local incorporado (não é necessário servidor remoto)",
|
||
"embeddedConnecting": "A ligar ao servidor local...",
|
||
"embeddedNotReady": "O servidor local ainda não está pronto. Aguarde um momento e tente novamente.",
|
||
"localServer": "Servidor Local",
|
||
"savedServers": "Servidores Guardados",
|
||
"noSavedServers": "Nenhum servidor guardado",
|
||
"removeServer": "Remover"
|
||
},
|
||
"migrationNotice": {
|
||
"title": "O Termix Desktop funciona agora de forma independente.",
|
||
"body1": "Esta aplicação costumava ligar-se diretamente ao seu servidor Termix. Foi reformulado para funcionar de forma totalmente independente, armazenando hosts e credenciais localmente para que continue a funcionar offline. A sincronização bidirecional com um servidor Termix auto-hospedado é agora opcional.",
|
||
"body2": "Os seus hosts e credenciais atuais ainda estão em {{url}}. Ative a Sincronização Remota e volte a ligar-se a esse servidor para os recuperar e mantê-los sincronizados daqui para a frente.",
|
||
"dismiss": "Agora não",
|
||
"setUpSync": "Configurar sincronização remota"
|
||
},
|
||
"remoteSync": {
|
||
"title": "Sincronização remota",
|
||
"description": "Opcionalmente, ligue esta aplicação de desktop a um servidor Termix auto-hospedado para sincronizar os seus hosts, credenciais e pedaços de código entre dispositivos. A aplicação funciona sempre totalmente offline, independentemente de estar ligado ou não.",
|
||
"notConnected": "Não conectado",
|
||
"connected": "Conectado",
|
||
"connectedTo": "Ligado a {{url}}",
|
||
"lastSynced": "Última sincronização {{time}}",
|
||
"neverSynced": "Nunca sincronizado",
|
||
"syncError": "Erro de sincronização: {{message}}",
|
||
"needsReauth": "Login expirou",
|
||
"connectButton": "Ligar ao servidor",
|
||
"disconnectButton": "Desconectar",
|
||
"syncNowButton": "Sincronizar agora",
|
||
"syncing": "Sincronizando...",
|
||
"serverUrl": "URL do servidor",
|
||
"enterServerUrl": "Por favor, introduza um URL de servidor.",
|
||
"mustIncludeProtocol": "O URL do servidor deve começar por http:// ou https://",
|
||
"connectionTestFailed": "Não foi possível aceder a um servidor Termix nesse URL.",
|
||
"allowInvalidCertificate": "Permitir certificado inválido",
|
||
"allowInvalidCertificateDesc": "Utilize apenas em servidores auto-hospedados fidedignos com certificados autoassinados ou de endereço IP.",
|
||
"savedServers": "Servidores salvos",
|
||
"removeServer": "Remover",
|
||
"continueButton": "Continuar",
|
||
"cancelButton": "Cancelar",
|
||
"signInTitle": "Faça login em {{url}}",
|
||
"originTitle": "Origem da ligação",
|
||
"originDescription": "Por predefinição, escolha de onde se originam as ligações SSH. Esta configuração pode ser alterada para cada host individualmente.",
|
||
"originLocal": "Este dispositivo (rede local)",
|
||
"originRemote": "Servidor remoto",
|
||
"bannerReconnect": "Reconectar",
|
||
"bannerMessage": "A sincronização remota requer nova autenticação."
|
||
},
|
||
"versionCheck": {
|
||
"error": "Erro na Verificação de Versão",
|
||
"checkFailed": "Falha ao verificar atualizações",
|
||
"upToDate": "A aplicação está atualizada",
|
||
"currentVersion": "Está a executar a versão {{version}}",
|
||
"updateAvailable": "Atualização disponível",
|
||
"newVersionAvailable": "Está disponível uma nova versão! Está a executar {{current}}, mas a {{latest}} está disponível.",
|
||
"betaVersion": "Versão Beta",
|
||
"betaVersionDesc": "Está a executar a {{current}}, que é mais recente do que a última versão estável {{latest}}.",
|
||
"releasedOn": "Lançado a {{date}}",
|
||
"downloadUpdate": "Descarregar Atualização",
|
||
"checking": "A verificar atualizações...",
|
||
"checkUpdates": "Verificar Atualizações",
|
||
"checkingUpdates": "A verificar atualizações...",
|
||
"updateRequired": "Atualização necessária"
|
||
},
|
||
"common": {
|
||
"close": "Fechar",
|
||
"minimize": "Minimizar",
|
||
"online": "Online",
|
||
"offline": "Offline",
|
||
"unknown": "Desconhecido",
|
||
"continue": "Continuar",
|
||
"maintenance": "Manutenção",
|
||
"degraded": "Degradado",
|
||
"error": "Erro",
|
||
"warning": "Aviso",
|
||
"unsavedChanges": "Alterações não guardadas",
|
||
"dismiss": "Ignorar",
|
||
"loading": "A carregar...",
|
||
"optional": "Opcional",
|
||
"connect": "Ligar",
|
||
"copied": "Copiado",
|
||
"connecting": "A ligar...",
|
||
"updateAvailable": "Atualização disponível",
|
||
"appName": "Termix",
|
||
"openInNewTab": "Abrir num novo separador",
|
||
"noReleases": "Sem lançamentos",
|
||
"updatesAndReleases": "Atualizações e Lançamentos",
|
||
"newVersionAvailable": "Está disponível uma nova versão ({{version}}).",
|
||
"failedToFetchUpdateInfo": "Falha ao obter informações de atualização",
|
||
"preRelease": "Pré-lançamento",
|
||
"noReleasesFound": "Nenhum lançamento encontrado.",
|
||
"cancel": "Cancelar",
|
||
"username": "Nome de utilizador",
|
||
"login": "Iniciar sessão",
|
||
"logout": "Terminar sessão",
|
||
"register": "Registar",
|
||
"password": "Palavra-passe",
|
||
"confirmPassword": "Confirmar palavra-passe",
|
||
"back": "Voltar",
|
||
"save": "Guardar",
|
||
"saving": "A guardar...",
|
||
"delete": "Eliminar",
|
||
"rename": "Renomear",
|
||
"edit": "Editar",
|
||
"add": "Adicionar",
|
||
"confirm": "Confirmar",
|
||
"no": "Não",
|
||
"or": "OU",
|
||
"next": "Seguinte",
|
||
"previous": "Anterior",
|
||
"refresh": "Atualizar",
|
||
"language": "Idioma",
|
||
"checking": "A verificar...",
|
||
"checkingDatabase": "A verificar a ligação à base de dados...",
|
||
"checkingAuthentication": "A verificar a autenticação...",
|
||
"backendReconnected": "Ligação ao servidor restabelecida",
|
||
"connectionDegraded": "Ligação ao servidor perdida, a recuperar…",
|
||
"reload": "Recarregar",
|
||
"remove": "Remover",
|
||
"create": "Criar",
|
||
"update": "Atualizar",
|
||
"copy": "Copiar",
|
||
"copyFailed": "Falha ao copiar para a área de transferência",
|
||
"maximize": "Maximizar",
|
||
"restore": "Restaurar",
|
||
"of": "de",
|
||
"saved": "Guardado",
|
||
"deleted": "Eliminado",
|
||
"deleteFailed": "Falha ao eliminar",
|
||
"saveFailed": "Falha ao guardar",
|
||
"required": "Obrigatório"
|
||
},
|
||
"nav": {
|
||
"home": "Início",
|
||
"terminal": "Terminal",
|
||
"docker": "Docker",
|
||
"tunnels": "Túneis",
|
||
"fileManager": "Gestor de ficheiros",
|
||
"serverStats": "Métricas do Servidor",
|
||
"hostMetrics": "Métricas do Servidor",
|
||
"admin": "Administração",
|
||
"termixId": "ID",
|
||
"userProfile": "Perfil do Utilizador",
|
||
"splitScreen": "Ecrã Dividido",
|
||
"confirmClose": "Fechar esta sessão ativa?",
|
||
"close": "Fechar",
|
||
"cancel": "Cancelar",
|
||
"sshManager": "Gestor SSH",
|
||
"cannotSplitTab": "Não é possível dividir este separador",
|
||
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
|
||
"copyPassword": "Copiar Palavra-passe",
|
||
"copySudoPassword": "Copiar Palavra-passe do Sudo",
|
||
"passwordCopied": "Palavra-passe copiada para a área de transferência",
|
||
"noPasswordAvailable": "Nenhuma palavra-passe disponível",
|
||
"failedToCopyPassword": "Falha ao copiar a palavra-passe",
|
||
"refreshTab": "Atualizar ligação",
|
||
"renameTab": "Renomear separador",
|
||
"openFileManager": "Abrir Gestor de Ficheiros",
|
||
"dashboard": "Painel de controlo",
|
||
"networkGraph": "Gráfico de rede",
|
||
"tmuxMonitor": "Monitor Tmux",
|
||
"homepage": "Página inicial",
|
||
"quickConnect": "Ligação Rápida",
|
||
"sshTools": "Ferramentas SSH",
|
||
"history": "Histórico",
|
||
"sessionLogs": "Registos de Sessão",
|
||
"sidebarSettings": "Definições da barra lateral...",
|
||
"hosts": "Máquinas",
|
||
"snippets": "Fragmentos",
|
||
"hostManager": "Gestor de Máquinas",
|
||
"credentials": "Credenciais",
|
||
"connections": "Ligações",
|
||
"alerts": "Alertas",
|
||
"serial": "Serial",
|
||
"roleAdministrator": "Administrador",
|
||
"roleUser": "Utilizador"
|
||
},
|
||
"hosts": {
|
||
"hosts": "Máquinas",
|
||
"noHosts": "Sem máquinas SSH",
|
||
"retry": "Tentar novamente",
|
||
"refresh": "Atualizar",
|
||
"optional": "Opcional",
|
||
"downloadSample": "Transferir exemplo",
|
||
"failedToDeleteHost": "Falha ao eliminar {{name}}",
|
||
"importSkipExisting": "Importar (ignorar existentes)",
|
||
"importSSHConfig": "Importar da configuração SSH",
|
||
"connectionDetails": "Detalhes da ligação",
|
||
"ssh": "SSH",
|
||
"telnet": "Telnet",
|
||
"remoteDesktop": "Ambiente de trabalho remoto",
|
||
"port": "Porta",
|
||
"username": "Nome de utilizador",
|
||
"folder": "Pasta",
|
||
"tags": "Etiquetas",
|
||
"pin": "Fixar",
|
||
"addHost": "Adicionar máquina",
|
||
"editHost": "Editar máquina",
|
||
"cloneHost": "Clonar máquina",
|
||
"enableTerminal": "Ativar Terminal",
|
||
"enableTunnel": "Ativar Túnel",
|
||
"enableFileManager": "Ativar Gestor de Ficheiros",
|
||
"enableDocker": "Ativar Docker",
|
||
"defaultPath": "Caminho Predefinido",
|
||
"connection": "Ligação",
|
||
"upload": "Carregar",
|
||
"authentication": "Autenticação",
|
||
"password": "Palavra-passe",
|
||
"key": "Chave",
|
||
"credential": "Credencial",
|
||
"none": "Nenhum",
|
||
"sshPrivateKey": "Chave Privada SSH",
|
||
"keyType": "Tipo de Chave",
|
||
"uploadFile": "Carregar Ficheiro",
|
||
"tabGeneral": "Geral",
|
||
"tabSsh": "SSH",
|
||
"tabTerminal": "Terminal",
|
||
"tabRdp": "RDP",
|
||
"tabVnc": "VNC",
|
||
"tabTunnels": "Túneis",
|
||
"tabDocker": "Docker",
|
||
"tabFiles": "Ficheiros",
|
||
"tabStats": "Métricas do Host",
|
||
"tabHostMetrics": "Métricas do Host",
|
||
"tabTelnet": "Telnet",
|
||
"tabSharing": "Partilha",
|
||
"tabAuthentication": "Autenticação",
|
||
"terminal": "Terminal",
|
||
"tunnel": "Túnel",
|
||
"fileManager": "Gestor de Ficheiros",
|
||
"serverStats": "Métricas do Host",
|
||
"status": "Estado",
|
||
"folderRenamed": "Pasta \"{{oldName}}\" renomeada para \"{{newName}}\" com sucesso",
|
||
"failedToRenameFolder": "Falha ao renomear a pasta",
|
||
"movedToFolder": "Movido(s) {{count}} host(s) para \"{{folder}}\"",
|
||
"editHostTooltip": "Editar host",
|
||
"statusChecks": "Verificações de estado",
|
||
"metricsCollection": "Recolha de métricas",
|
||
"metricsInterval": "Intervalo de recolha de métricas",
|
||
"metricsIntervalDesc": "Com que frequência recolher estatísticas do servidor (5s - 1h)",
|
||
"behavior": "Comportamento",
|
||
"themePreview": "Pré-visualização do tema",
|
||
"theme": "Tema",
|
||
"fontFamily": "Família da fonte",
|
||
"fontSize": "Tamanho da fonte",
|
||
"letterSpacing": "Espaçamento de letras",
|
||
"lineHeight": "Altura da linha",
|
||
"cursorStyle": "Estilo do cursor",
|
||
"cursorBlink": "Piscar do cursor",
|
||
"scrollbackBuffer": "Buffer de rolagem",
|
||
"bellStyle": "Estilo da campainha",
|
||
"rightClickSelectsWord": "Clique direito seleciona palavra",
|
||
"fastScrollModifier": "Modificador de deslocamento rápido",
|
||
"fastScrollSensitivity": "Sensibilidade do deslocamento rápido",
|
||
"sshAgentForwarding": "Reencaminhamento do agente SSH",
|
||
"backspaceMode": "Modo de retrocesso",
|
||
"startupSnippet": "Snippet de arranque",
|
||
"selectSnippet": "Selecionar snippet",
|
||
"forceKeyboardInteractive": "Forçar autenticação Keyboard-Interactive",
|
||
"overrideCredentialUsername": "Substituir nome de utilizador da credencial",
|
||
"overrideCredentialUsernameDesc": "Utilizar o nome de utilizador especificado acima em vez do nome de utilizador da credencial",
|
||
"oidcUsernameHint": "Utilize $oidc.preferred_username para substituir o seu nome de início de sessão OIDC.",
|
||
"tailscaleUsernameHint": "Este deve ser um utilizador Unix cuja identidade Tailscale é concedida na ACL SSH da tailnet, não necessariamente o utilizador root.",
|
||
"jumpHostChain": "Cadeia de hosts de salto",
|
||
"portKnocking": "Port Knocking",
|
||
"addKnock": "Adicionar porta",
|
||
"addProxyNode": "Adicionar nó",
|
||
"proxyNode": "Nó de proxy",
|
||
"proxyType": "Tipo de proxy",
|
||
"quickActions": "Ações rápidas",
|
||
"sudoPasswordAutoFill": "Preenchimento Automático da Palavra-passe Sudo",
|
||
"sudoPassword": "Palavra-passe Sudo",
|
||
"keepaliveInterval": "Intervalo de keepalive (ms)",
|
||
"moshCommand": "Comando MOSH",
|
||
"environmentVariables": "Variáveis de Ambiente",
|
||
"addVariable": "Adicionar Variável",
|
||
"docker": "Docker",
|
||
"copyTerminalUrl": "Copiar URL do Terminal",
|
||
"copyFileManagerUrl": "Copiar URL do Gestor de Ficheiros",
|
||
"copyRemoteDesktopUrl": "Copiar URL do Ambiente de Trabalho Remoto",
|
||
"failedToConnect": "Falha ao ligar à consola",
|
||
"connect": "Ligar",
|
||
"disconnect": "Desligar",
|
||
"start": "Iniciar",
|
||
"enableStatusCheck": "Ativar Verificação de Estado",
|
||
"enableMetrics": "Ativar Métricas",
|
||
"bulkUpdateFailed": "Falha na atualização em massa",
|
||
"selectAll": "Selecionar Todos",
|
||
"deselectAll": "Desmarcar Todos",
|
||
"protocols": "Protocolos",
|
||
"secureShell": "Shell Seguro",
|
||
"virtualNetwork": "Rede Virtual",
|
||
"unencryptedShell": "Shell não encriptado",
|
||
"addressIp": "Endereço / IP",
|
||
"friendlyName": "Nome Amigável",
|
||
"macAddress": "Endereço MAC",
|
||
"wolBroadcastAddress": "Endereço de broadcast WoL",
|
||
"wolBroadcastAddressDesc": "Broadcast direcionado opcional para Docker/redes encaminhadas (p. ex., 192.168.1.255). Deixar vazio para usar 255.255.255.255.",
|
||
"folderAndAdvanced": "Pasta e Avançado",
|
||
"privateNotes": "Notas Privadas",
|
||
"privateNotesPlaceholder": "Detalhes sobre este servidor...",
|
||
"pinToTop": "Fixar no Topo",
|
||
"pinToTopDesc": "Mostrar sempre este host no topo da lista",
|
||
"portKnockingSequence": "Sequência de Port Knocking",
|
||
"addKnockBtn": "Adicionar Knock",
|
||
"noPortKnocking": "Nenhum port knocking configurado.",
|
||
"knockPort": "Porta Knock",
|
||
"protocol": "Protocolo",
|
||
"delayAfterMs": "Atraso após (ms)",
|
||
"useSocks5Proxy": "Usar proxy SOCKS5",
|
||
"useSocks5ProxyDesc": "Encaminhar ligação através de um servidor proxy",
|
||
"connectionOrigin": "Origem da ligação",
|
||
"connectionOriginDesc": "De onde se origina a ligação SSH deste host. Substitui o padrão global da aplicação de desktop.",
|
||
"connectionOriginDefault": "Usar padrão",
|
||
"connectionOriginLocal": "Este dispositivo (rede local)",
|
||
"connectionOriginRemote": "Servidor remoto",
|
||
"proxyHost": "Host do proxy",
|
||
"proxyPort": "Porta do proxy",
|
||
"proxyUsername": "Nome de utilizador do proxy",
|
||
"proxyPassword": "Palavra-passe do proxy",
|
||
"proxySingleMode": "Proxy único",
|
||
"proxyChainMode": "Cadeia de proxy",
|
||
"you": "Tu",
|
||
"jumpHostChainLabel": "Cadeia de jump hosts",
|
||
"addJumpBtn": "Adicionar jump",
|
||
"noJumpHosts": "Nenhum jump host configurado.",
|
||
"selectAServer": "Selecionar um servidor...",
|
||
"sshPort": "Porta SSH",
|
||
"authMethod": "Método de autenticação",
|
||
"storedCredential": "Credencial guardada",
|
||
"selectACredential": "Selecionar uma credencial...",
|
||
"vaultProfile": "Perfil de assinatura Vault",
|
||
"selectAVaultProfile": "Selecionar um perfil Vault...",
|
||
"vaultProfileHint": "As definições provêm do perfil partilhado; ao ligar, iniciará sessão no Vault via OIDC. Nenhum segredo é armazenado.",
|
||
"vaultNewProfile": "Novo perfil",
|
||
"vaultManageProfiles": "Gerir perfis Vault",
|
||
"vaultAddrLabel": "Endereço Vault",
|
||
"vaultNamespaceLabel": "Namespace",
|
||
"vaultOidcMountLabel": "Mount de autenticação OIDC",
|
||
"vaultOidcRoleLabel": "Função OIDC",
|
||
"vaultSshMountLabel": "Mount de segredos SSH",
|
||
"vaultSshRoleLabel": "Função de assinatura SSH",
|
||
"vaultValidPrincipalsLabel": "Principais válidos",
|
||
"vaultKeyTypeLabel": "Tipo de chave efémera",
|
||
"vaultSharedLabel": "Partilhar com todos os utilizadores",
|
||
"vaultCreateProfile": "Criar perfil",
|
||
"vaultProfileCreated": "Perfil Vault criado",
|
||
"vaultProfileSaved": "Perfil Vault guardado",
|
||
"vaultProfileDeleted": "Perfil Vault eliminado",
|
||
"vaultProfileSaveFailed": "Falha ao guardar perfil Vault",
|
||
"vaultProfileDeleteFailed": "Falha ao eliminar perfil Vault",
|
||
"vaultSaveProfile": "Guardar perfil",
|
||
"vaultProfileValidationError": "Nome, endereço Vault e função de signatário SSH são obrigatórios",
|
||
"vaultNoProfiles": "Ainda sem perfis Vault.",
|
||
"vaultSharedBadge": "partilhado",
|
||
"keyTypeLabel": "Tipo de chave",
|
||
"keyTypeAuto": "Detetar automaticamente",
|
||
"keyPasteTab": "Colar",
|
||
"keyUploadTab": "Carregar",
|
||
"keyFileLoaded": "Ficheiro de chave carregado",
|
||
"keyUploadClick": "Clique para carregar .pem / .key / .ppk",
|
||
"clearKey": "Limpar chave",
|
||
"keySaved": "Chave SSH guardada",
|
||
"keyReplaceNotice": "cole uma nova chave abaixo para substituí-la",
|
||
"keyPassphraseSaved": "Frase-passe guardada, escreva para alterar",
|
||
"replaceKey": "Substituir chave",
|
||
"docsLink": "Ver documentação",
|
||
"opksshLabel": "OPKSSH",
|
||
"opksshDesc": "Inicie sessão neste anfitrião usando o seu fornecedor de identidade em vez de uma palavra-passe ou chave. Requer que o OPKSSH esteja configurado no servidor.",
|
||
"warpgateLabel": "Warpgate Gateway",
|
||
"warpgateDesc": "Este anfitrião liga-se através de um proxy SSH Warpgate. O Termix irá gerir automaticamente o fluxo de aprovação baseado no navegador após a autenticação.",
|
||
"agentLabel": "Agente SSH",
|
||
"agentDesc": "Autentique-se usando um agente SSH em execução no servidor Termix (Bitwarden, 1Password, gpg-agent, KeeAgent, ssh-agent). O agente deve estar em execução na máquina onde o Termix está alojado.",
|
||
"agentSocketPathLabel": "Caminho do socket do agente",
|
||
"agentSocketPathPlaceholder": "Deixar vazio para usar SSH_AUTH_SOCK",
|
||
"agentSocketPathHint": "Deixar vazio para detetar automaticamente a partir da variável de ambiente SSH_AUTH_SOCK, ou introduza um caminho de socket personalizado (ex.: /run/user/1000/gnupg/S.gpg-agent.ssh).",
|
||
"shareSshAuthLabel": "Partilhar autenticação SSH",
|
||
"shareSshAuthDesc": "Forneça aos destinatários cópias encriptadas da autenticação SSH deste host. As credenciais pessoais do destinatário ainda têm precedência.",
|
||
"tailscaleDeviceSelect": "Selecionar dispositivo Tailscale",
|
||
"tailscaleDeviceSelectPlaceholder": "Selecionar um dispositivo...",
|
||
"tailscaleNoApiKey": "Nenhuma chave de API Tailscale configurada. Adicione uma nas Definições de Administrador para ativar a descoberta de dispositivos.",
|
||
"tailscaleDocsLink": "Ver documentação",
|
||
"tailscaleLoadingDevices": "A carregar dispositivos...",
|
||
"tailscaleNoDevices": "Nenhum dispositivo encontrado na sua tailnet.",
|
||
"tailscaleDeviceAutoFill": "Selecionar um dispositivo preencherá automaticamente o endereço IP do host.",
|
||
"forceKeyboardInteractiveLabel": "Forçar Keyboard Interactive",
|
||
"forceKeyboardInteractiveShortDesc": "Forçar a entrada manual da palavra-passe mesmo que existam chaves.",
|
||
"allowLegacyAlgorithmsLabel": "Permitir Algoritmos Legados",
|
||
"allowLegacyAlgorithmsDesc": "Ativar algoritmos SSH obsoletos (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) para ligações a dispositivos antigos que não podem ser atualizados.",
|
||
"insecure": "Inseguro",
|
||
"terminalAppearance": "Aparência do Terminal",
|
||
"colorTheme": "Tema de Cores",
|
||
"fontFamilyLabel": "Família da Fonte",
|
||
"fontSizeLabel": "Tamanho da Fonte",
|
||
"cursorStyleLabel": "Estilo do Cursor",
|
||
"letterSpacingPx": "Espaçamento entre Letras (px)",
|
||
"lineHeightLabel": "Altura da Linha",
|
||
"bellStyleLabel": "Estilo do Alerta Sonoro",
|
||
"backspaceModeLabel": "Modo da Tecla Retrocesso",
|
||
"cursorBlinking": "Piscar do Cursor",
|
||
"cursorBlinkingDesc": "Ativar a animação de piscar para o cursor do terminal",
|
||
"rightClickSelectsWordLabel": "Clique Direito Seleciona Palavra",
|
||
"rightClickSelectsWordShortDesc": "Selecionar a palavra sob o cursor ao clicar com o botão direito",
|
||
"backgroundImageLabel": "URL da Imagem de Fundo",
|
||
"backgroundImageDesc": "URL opcional para uma imagem de fundo do terminal",
|
||
"backgroundImageOpacityLabel": "Opacidade da Imagem de Fundo",
|
||
"customThemeColors": "Cores Personalizadas",
|
||
"customThemeBackground": "Fundo",
|
||
"customThemeForeground": "Primeiro Plano",
|
||
"customThemeCursor": "Cursor",
|
||
"customThemeCursorAccent": "Destaque do Cursor",
|
||
"customThemeSelection": "Seleção",
|
||
"customThemeAnsiColors": "Cores ANSI",
|
||
"customThemeBlack": "Preto",
|
||
"customThemeRed": "Vermelho",
|
||
"customThemeGreen": "Verde",
|
||
"customThemeYellow": "Amarelo",
|
||
"customThemeBlue": "Azul",
|
||
"customThemeMagenta": "Magenta",
|
||
"customThemeCyan": "Ciano",
|
||
"customThemeWhite": "Branco",
|
||
"customThemeBrightBlack": "Preto Brilhante",
|
||
"customThemeBrightRed": "Vermelho Brilhante",
|
||
"customThemeBrightGreen": "Verde Brilhante",
|
||
"customThemeBrightYellow": "Amarelo Brilhante",
|
||
"customThemeBrightBlue": "Azul Brilhante",
|
||
"customThemeBrightMagenta": "Magenta Brilhante",
|
||
"customThemeBrightCyan": "Ciano Brilhante",
|
||
"customThemeBrightWhite": "Branco Brilhante",
|
||
"customThemeResetTooltip": "Repor predefinições",
|
||
"savedThemesLabel": "Temas guardados",
|
||
"saveAsGlobalTheme": "Guardar como tema global",
|
||
"saveGlobalThemeNamePrompt": "Introduza um nome para este tema.",
|
||
"saveGlobalThemeSuccess": "Tema guardado",
|
||
"saveGlobalThemeError": "Falha ao guardar o tema",
|
||
"applyGlobalThemeTooltip": "Aplique este tema",
|
||
"deleteGlobalThemeTooltip": "Apagar este tema",
|
||
"noSavedThemes": "Ainda não há temas guardados.",
|
||
"syntaxHighlightingLabel": "Realce de Sintaxe",
|
||
"syntaxHighlightingDesc": "Colorir a saída do terminal (erros, caminhos, IPs, marcas temporais)",
|
||
"syntaxHighlightingCategories": "Categorias de Realce",
|
||
"syntaxHighlightingCategoriesDesc": "Escolher os tipos de conteúdo a colorir",
|
||
"syntaxCategoryLogLevels": "Níveis de Registo",
|
||
"syntaxCategoryLogLevelsDesc": "erro, aviso, info, depuração, fatal",
|
||
"syntaxCategoryPaths": "Caminhos de Ficheiros",
|
||
"syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt",
|
||
"syntaxCategoryTimestamps": "Marcas Temporais",
|
||
"syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15",
|
||
"syntaxCategoryIpAddresses": "Endereços IP",
|
||
"syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080",
|
||
"syntaxCategoryUrls": "URLs",
|
||
"syntaxCategoryUrlsDesc": "https://example.com",
|
||
"syntaxCategoryNumbers": "Números com Rótulo",
|
||
"syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404",
|
||
"behaviorAndAdvanced": "Comportamento e Avançado",
|
||
"scrollbackBufferLabel": "Buffer de Retrocesso",
|
||
"scrollbackMaxLines": "Número máximo de linhas guardadas no histórico",
|
||
"sshAgentForwardingLabel": "Reencaminhamento do Agente SSH",
|
||
"sshAgentForwardingShortDesc": "Passar as suas chaves SSH locais para este anfitrião",
|
||
"useSSHTitleLabel": "Usar o Título da Janela SSH",
|
||
"useSSHTitleDesc": "Atualizar o título do separador a partir do título da janela do shell em vez do nome do host",
|
||
"enableAutoMosh": "Ativar Auto-Mosh",
|
||
"enableAutoMoshDesc": "Preferir Mosh a SSH, se disponível",
|
||
"enableAutoTmux": "Ativar Auto-Tmux",
|
||
"enableAutoTmuxDesc": "Iniciar ou anexar automaticamente a uma sessão tmux",
|
||
"enableSessionLogging": "Registo de sessão",
|
||
"enableSessionLoggingDesc": "Gravar a saída da sessão de terminal para revisão posterior",
|
||
"allowSessionSharing": "Permitir partilha de sessão",
|
||
"allowSessionSharingDesc": "Permitir que as sessões em direto neste servidor sejam partilhadas através de link ou com outros utilizadores.",
|
||
"enableCommandHistory": "Histórico de comandos",
|
||
"enableCommandHistoryDesc": "Gravar comandos executados neste terminal para histórico e autocompletar",
|
||
"linkClickBehaviorLabel": "Comportamento ao clicar em ligações",
|
||
"linkClickBehaviorDesc": "Controla o que acontece ao clicar numa ligação no terminal. Use 'Predefinido' para seguir a definição da aplicação.",
|
||
"linkClickBehaviorDefault": "Predefinido (seguir a definição da aplicação)",
|
||
"linkClickBehaviorConfirm": "Mostrar pop-up para abrir ou copiar",
|
||
"linkClickBehaviorDirect": "Abrir diretamente",
|
||
"sudoPasswordAutoFillLabel": "Preenchimento automático da palavra-passe sudo",
|
||
"sudoPasswordAutoFillShortDesc": "Fornecer automaticamente a palavra-passe sudo quando solicitada",
|
||
"sudoPasswordAutoFillDesc": "Armazenar uma palavra-passe sudo para que as métricas do host, prompts do terminal e outros possam executar comandos com privilégios automaticamente.",
|
||
"sudoPasswordLabel": "Palavra-passe sudo",
|
||
"environmentVariablesLabel": "Variáveis de ambiente",
|
||
"addVariableBtn": "Adicionar variável",
|
||
"noEnvVars": "Nenhuma variável de ambiente configurada.",
|
||
"fastScrollModifierLabel": "Modificador de deslocamento rápido",
|
||
"fastScrollSensitivityLabel": "Sensibilidade do deslocamento rápido",
|
||
"moshCommandLabel": "Comando Mosh",
|
||
"startupSnippetLabel": "Fragmento de inicialização",
|
||
"keepaliveIntervalLabel": "Intervalo de Keepalive (segundos)",
|
||
"maxKeepaliveMisses": "Máximo de falhas de Keepalive",
|
||
"tunnelSettings": "Definições de túnel",
|
||
"enableTunneling": "Ativar tunelamento",
|
||
"enableTunnelingDesc": "Ativar a funcionalidade de túnel SSH para este host",
|
||
"serverTunnelsSection": "Túneis do servidor",
|
||
"addTunnelBtn": "Adicionar túnel",
|
||
"noTunnelsConfigured": "Nenhum túnel configurado.",
|
||
"tunnelLabel": "Túnel {{number}}",
|
||
"tunnelType": "Tipo de túnel",
|
||
"tunnelModeLocalDesc": "Reencaminhar uma porta local para uma porta no servidor remoto (ou um host acessível a partir dele).",
|
||
"tunnelModeRemoteDesc": "Reencaminhar uma porta no servidor remoto de volta para uma porta local na sua máquina.",
|
||
"tunnelModeDynamicDesc": "Criar um proxy SOCKS5 numa porta local para reencaminhamento dinâmico de portas.",
|
||
"sameHost": "Este host (túnel direto)",
|
||
"endpointHost": "Host de Destino",
|
||
"endpointHostPlaceholder": "Mesmo host, host SSH ou host/IP acessível",
|
||
"endpointPort": "Porta de Destino",
|
||
"bindHost": "Host de Ligação",
|
||
"sourcePort": "Porta de Origem",
|
||
"maxRetries": "Tentativas Máximas",
|
||
"retryIntervalS": "Intervalo de Repetição (s)",
|
||
"autoStartLabel": "Início Automático",
|
||
"autoStartDesc": "Conectar automaticamente este túnel quando o host for carregado",
|
||
"tunnelConnecting": "Túnel a conectar...",
|
||
"tunnelDisconnected": "Túnel desligado",
|
||
"failedToConnectTunnel": "Falha ao conectar",
|
||
"failedToDisconnectTunnel": "Falha ao desligar",
|
||
"dockerIntegration": "Integração com Docker",
|
||
"enableDockerMonitor": "Ativar Docker",
|
||
"enableDockerMonitorDesc": "Monitorizar e gerir contentores neste host via Docker",
|
||
"containerRuntime": "Runtime de Contentores",
|
||
"containerRuntimeDesc": "Escolha a CLI usada para a gestão de contentores neste host",
|
||
"containerRuntimeDocker": "Docker",
|
||
"containerRuntimePodman": "Podman",
|
||
"enableTmuxMonitor": "Ativar Monitor Tmux",
|
||
"enableTmuxMonitorDesc": "Mostrar este host no Monitor Tmux e adicionar as suas ações tmux à barra lateral",
|
||
"tabProxmox": "Proxmox",
|
||
"proxmoxIntegration": "Integração com Proxmox",
|
||
"enableProxmox": "Ativar Proxmox",
|
||
"enableProxmoxDesc": "Marcar este host como um nó Proxmox. Permite a descoberta e importação de convidados diretamente a partir deste host.",
|
||
"proxmoxDefaultAuthType": "Tipo de Autenticação Padrão",
|
||
"proxmoxDefaultAuthTypeDesc": "Método de autenticação aplicado aos hosts convidados importados. Escolha o tipo de autenticação que corresponde à forma como se liga aos seus convidados.",
|
||
"authTypePassword": "Palavra-passe",
|
||
"authTypeKey": "Chave SSH",
|
||
"authTypeCredential": "Credencial",
|
||
"authTypeOpkssh": "OPKSSH",
|
||
"authTypeNone": "Nenhum",
|
||
"proxmoxDefaultCredential": "Credencial padrão",
|
||
"proxmoxDefaultCredentialDesc": "Credencial usada para os convidados importados quando o tipo de autenticação é definido como Credencial.",
|
||
"proxmoxWindowsDetection": "Deteção de Windows / RDP",
|
||
"proxmoxWindowsDetectionDesc": "Padrões de nomes separados por vírgulas que acionam RDP em vez de SSH (sem distinção entre maiúsculas/minúsculas)",
|
||
"proxmoxDockerDetection": "Deteção de Docker",
|
||
"proxmoxDockerDetectionDesc": "Padrões de nomes separados por vírgulas que ativam o Docker nos convidados que correspondam.",
|
||
"proxmoxPreferredRanges": "Intervalos de IP preferenciais",
|
||
"proxmoxPreferredRangesDesc": "Prefixos separados por vírgulas em ordem de prioridade para seleção de IP quando um convidado tem várias interfaces.",
|
||
"proxmoxAutoSync": "Sincronização automática",
|
||
"proxmoxAutoSyncDesc": "Descobrir periodicamente este nó Proxmox e criar ou atualizar os convidados importados enquanto a sessão estiver desbloqueada.",
|
||
"proxmoxSyncInterval": "Intervalo de sincronização (minutos)",
|
||
"proxmoxSyncIntervalDesc": "Mínimo de 5 minutos. O agendador ignora sessões de utilizador bloqueadas.",
|
||
"proxmoxMarkMissing": "Marcar convidados em falta",
|
||
"proxmoxMarkMissingDesc": "Adicionar a etiqueta proxmox-missing quando um convidado previamente importado desaparecer, em vez de o eliminar.",
|
||
"proxmoxLastSync": "Última sincronização",
|
||
"proxmoxLastSyncNever": "Ainda não sincronizado",
|
||
"proxmoxLastSyncNoResult": "Sem detalhes do resultado",
|
||
"proxmoxLastSyncSummary": "{{created}} criados, {{updated}} atualizados, {{markedMissing}} em falta, {{skipped}} ignorados",
|
||
"proxmoxLastSyncStatus": {
|
||
"success": "Sucesso",
|
||
"error": "Falhou",
|
||
"pending": "Pendente"
|
||
},
|
||
"proxmoxDiscoverAction": "Descobrir e importar convidados",
|
||
"proxmoxImportTitle": "Importar do Proxmox",
|
||
"proxmoxSelectHost": "Selecionar um host Proxmox…",
|
||
"proxmoxDiscover": "Descobrir",
|
||
"proxmoxDiscovering": "A descobrir…",
|
||
"proxmoxDiscoverGuests": "Descobrir convidados",
|
||
"proxmoxGuestsSelected_one": "{{count}} convidado — {{selected}} selecionado",
|
||
"proxmoxGuestsSelected_other": "{{count}} convidados — {{selected}} selecionados",
|
||
"proxmoxSelectAll": "Selecionar todos",
|
||
"proxmoxDeselectAll": "Desmarcar todos",
|
||
"proxmoxNoGuests": "Nenhum convidado encontrado neste nó Proxmox.",
|
||
"proxmoxImportButton_one": "Importar {{count}} host",
|
||
"proxmoxImportButton_other": "Importar {{count}} hosts",
|
||
"proxmoxResultImported": "{{count}} importados",
|
||
"proxmoxResultUpdated": "{{count}} atualizados",
|
||
"proxmoxResultFailed": "{{count}} falhados",
|
||
"proxmoxResultSkippedNoIp": "{{count}} ignorado (nenhum IP encontrado)",
|
||
"proxmoxImportComplete": "Importação Proxmox concluída: {{summary}}",
|
||
"proxmoxDiscoveryFailed": "Descoberta falhou",
|
||
"proxmoxImportFailed": "Importação falhou",
|
||
"enableFileManagerMonitor": "Ativar Gestor de Ficheiros",
|
||
"enableFileManagerMonitorDesc": "Explorar e gerir ficheiros neste host via SFTP",
|
||
"scpLegacyLabel": "Modo SCP Legado",
|
||
"scpLegacyDesc": "Utilizar transferência de ficheiros legada para servidores que não suportam o subsistema SFTP (ex.: servidores SSH embebidos ou mínimos)",
|
||
"defaultPathLabel": "Caminho Predefinido",
|
||
"fileManagerPathHint": "O diretório a abrir quando o gestor de ficheiros for iniciado para este host",
|
||
"statusChecksLabel": "Verificações de Estado",
|
||
"enableStatusChecks": "Ativar Verificações de Estado",
|
||
"enableStatusChecksDesc": "Fazer ping periodicamente a este host para verificar a disponibilidade",
|
||
"useGlobalInterval": "Usar Intervalo Global",
|
||
"useGlobalIntervalDesc": "Substituir pelo intervalo de verificação de estado global do servidor",
|
||
"checkIntervalS": "Intervalo de Verificação (s)",
|
||
"checkIntervalDesc": "Segundos entre cada ping de conectividade",
|
||
"metricsCollectionLabel": "Recolha de Métricas",
|
||
"enableMetricsLabel": "Ativar Métricas",
|
||
"enableMetricsDesc": "Recolher métricas de CPU, RAM, disco e outras deste host",
|
||
"useGlobalMetrics": "Usar Intervalo Global",
|
||
"useGlobalMetricsDesc": "Substituir pelo intervalo de métricas global do servidor",
|
||
"metricsIntervalS": "Intervalo de Métricas (s)",
|
||
"metricsIntervalDesc2": "Segundos entre cada registo de métricas",
|
||
"visibleWidgets": "Widgets Visíveis",
|
||
"widgetsMovedToHostMetrics": "Os cartões são agora adicionados, organizados e redimensionados diretamente no separador Métricas do Host. Abra as Métricas do Host para este host e use Personalizar para escolher quais os cartões a mostrar.",
|
||
"cpuUsageLabel": "Utilização da CPU",
|
||
"cpuUsageDesc": "Percentagem da CPU, médias de carga, gráfico de linha",
|
||
"memoryLabel": "Utilização da Memória",
|
||
"memoryDesc": "Utilização da RAM, swap, em cache",
|
||
"storageLabel": "Utilização do Disco",
|
||
"storageDesc": "Utilização do disco por ponto de montagem",
|
||
"networkLabel": "Interfaces de Rede",
|
||
"networkDesc": "Lista de interfaces e largura de banda",
|
||
"uptimeLabel": "Tempo de Atividade",
|
||
"uptimeDesc": "Tempo de atividade do sistema e hora de arranque",
|
||
"systemInfoLabel": "Informação do Sistema",
|
||
"systemInfoDesc": "SO, kernel, nome de máquina, arquitetura",
|
||
"recentLoginsLabel": "Inícios de Sessão Recentes",
|
||
"recentLoginsDesc": "Eventos de início de sessão bem-sucedidos e falhados",
|
||
"topProcessesLabel": "Principais Processos",
|
||
"topProcessesDesc": "PID, CPU%, MEM%, comando",
|
||
"listeningPortsLabel": "Portas à Escuta",
|
||
"listeningPortsDesc": "Portas abertas com processo e estado",
|
||
"firewallLabel": "Firewall",
|
||
"firewallDesc": "Estado do Firewall, AppArmor, SELinux",
|
||
"quickActionsLabel": "Ações Rápidas",
|
||
"quickActionsToolbar": "As ações rápidas aparecem como botões na barra de ferramentas de Métricas do Host para execução de comandos com um clique.",
|
||
"noQuickActions": "Ainda não existem ações rápidas.",
|
||
"buttonLabel": "Texto do botão",
|
||
"selectSnippetPlaceholder": "Selecionar snippet...",
|
||
"addActionBtn": "Adicionar Ação",
|
||
"hostSharedSuccessfully": "Host partilhado com sucesso",
|
||
"failedToShareHost": "Falha ao partilhar o host",
|
||
"accessRevoked": "Acesso revogado",
|
||
"failedToRevokeAccess": "Falha ao revogar o acesso",
|
||
"cancelBtn": "Cancelar",
|
||
"savingBtn": "A guardar...",
|
||
"addHostBtn": "Adicionar Host",
|
||
"hostUpdated": "Host atualizado",
|
||
"hostCreated": "Host criado",
|
||
"failedToSave": "Falha ao guardar o host",
|
||
"credentialUpdated": "Credencial atualizada",
|
||
"credentialCreated": "Credencial criada",
|
||
"failedToSaveCredential": "Falha ao guardar a credencial",
|
||
"credentialNameRequired": "Introduza um nome para a credencial",
|
||
"credentialAuthRequired": "Adicione uma palavra-passe, uma chave SSH, ou ambas",
|
||
"createCredentialFromHostBtn": "Criar credencial",
|
||
"createCredentialFromHostTitle": "Criar credencial a partir do host",
|
||
"createCredentialFromHostDesc": "Crie uma entrada de credencial reutilizável e partilhável, previamente preenchida com o nome de utilizador, palavra-passe e/ou chave SSH atuais deste host.",
|
||
"backToHosts": "Voltar aos hosts",
|
||
"backToCredentials": "Voltar às Credenciais",
|
||
"pinned": "Fixado",
|
||
"noHostsFound": "Nenhum host encontrado",
|
||
"tryDifferentTerm": "Experimente um termo diferente",
|
||
"addFirstHost": "Adicione o seu primeiro host para começar",
|
||
"noCredentialsFound": "Nenhuma credencial encontrada",
|
||
"addCredentialBtn": "Adicionar Credencial",
|
||
"updateCredentialBtn": "Atualizar Credencial",
|
||
"features": "Funcionalidades",
|
||
"noFolder": "(Nenhuma pasta)",
|
||
"deleteSelected": "Eliminar",
|
||
"exitSelection": "Sair da seleção",
|
||
"importSkip": "Importar (ignorar existentes)",
|
||
"importOverwrite": "Importar (substituir)",
|
||
"collapseBtn": "Recolher",
|
||
"importExportBtn": "Importar / Exportar",
|
||
"hostStatusesRefreshed": "Estados dos hosts atualizados",
|
||
"failedToRefreshHosts": "Falha ao atualizar hosts",
|
||
"movedHostTo": "Moveu {{host}} para \"{{folder}}\"",
|
||
"failedToMoveHost": "Falha ao mover host",
|
||
"folderRenamedTo": "Pasta renomeada para \"{{name}}\"",
|
||
"deletedFolder": "Pasta \"{{name}}\" eliminada",
|
||
"failedToDeleteFolder": "Falha ao eliminar pasta",
|
||
"deleteAllInFolder": "Eliminar todos os hosts em \"{{name}}\"? Esta ação não pode ser desfeita.",
|
||
"folderPickerPlaceholder": "Nenhuma pasta",
|
||
"folderPickerSearch": "Pesquisar ou criar (use / para subpastas)...",
|
||
"folderPickerNone": "Nenhuma pasta",
|
||
"folderPickerCreate": "Criar \"{{path}}\"",
|
||
"folderPickerEmpty": "Nenhuma pasta correspondente",
|
||
"newFolder": "Nova pasta",
|
||
"createFolderTitle": "Criar pasta",
|
||
"editFolderTitle": "Editar pasta",
|
||
"folderDialogDescription": "Escolha um nome, cor e ícone. Use / para aninhar pastas.",
|
||
"folderNameLabel": "Nome da pasta",
|
||
"folderNamePlaceholder": "ex.: Produção/Web",
|
||
"folderNestingHint": "Utilize / para separar níveis e criar pastas aninhadas.",
|
||
"folderColor": "Cor",
|
||
"folderIcon": "Ícone",
|
||
"folderCredential": "Credencial",
|
||
"folderCredentialNone": "Nenhuma credencial atribuída",
|
||
"folderCredentialHint": "Os hosts nesta pasta que utilizem autenticação com \"Credenciais armazenadas\" sem que as suas próprias credenciais estejam seleccionadas herdarão esta.",
|
||
"folderPreview": "Pré-visualização",
|
||
"folderNameFallback": "Pasta sem título",
|
||
"createFolderButton": "Criar pasta",
|
||
"saveFolderButton": "Guardar pasta",
|
||
"cancel": "Cancelar",
|
||
"iconSearchPlaceholder": "Pesquisar ícones...",
|
||
"openAllSessions": "Abrir todas as sessões",
|
||
"editFolder": "Editar pasta",
|
||
"deleteFolder": "Eliminar pasta",
|
||
"folderSaved": "Pasta guardada",
|
||
"failedToSaveFolder": "Falha ao guardar pasta",
|
||
"folderDeleted": "Pasta \"{{name}}\" eliminada",
|
||
"deleteFolderConfirm": "Eliminar \"{{name}}\" e os seus {{count}} host(s)? Esta ação não pode ser anulada.",
|
||
"failedToMoveHosts": "Falha ao mover hosts",
|
||
"expandAll": "Expandir todas as pastas",
|
||
"collapseAll": "Recolher todas as pastas",
|
||
"moreActions": "Mais",
|
||
"groupBy": "Agrupar por",
|
||
"GroupByFolder": "Pasta",
|
||
"GroupByTag": "Etiqueta",
|
||
"GroupByStatus": "Estado",
|
||
"GroupByProtocol": "Protocolo",
|
||
"GroupByAuth": "Tipo de autenticação",
|
||
"groupUngrouped": "Não agrupados",
|
||
"deletedHost": "{{name}} eliminado",
|
||
"copiedToClipboard": "Copiado para a área de transferência",
|
||
"terminalUrlCopied": "URL do terminal copiada",
|
||
"fileManagerUrlCopied": "URL do gestor de ficheiros copiada",
|
||
"tunnelUrlCopied": "URL do túnel copiada",
|
||
"dockerUrlCopied": "URL do Docker copiada",
|
||
"hostMetricsUrlCopied": "URL das métricas do host copiada",
|
||
"tmuxMonitorUrlCopied": "URL do Monitor Tmux copiado",
|
||
"rdpUrlCopied": "URL RDP copiado",
|
||
"vncUrlCopied": "URL VNC copiado",
|
||
"telnetUrlCopied": "URL Telnet copiado",
|
||
"remoteDesktopUrlCopied": "URL do Ambiente de Trabalho Remoto copiado",
|
||
"expandActions": "Expandir ações",
|
||
"collapseActions": "Recolher ações",
|
||
"wakeOnLanAction": "Wake on LAN",
|
||
"wakeOnLanSuccess": "Pacote mágico enviado para {{name}}",
|
||
"wakeOnLanError": "Falha ao enviar pacote mágico",
|
||
"cloneHostAction": "Clonar host",
|
||
"copyAddress": "Copiar endereço",
|
||
"copyLink": "Copiar link",
|
||
"copyTerminalUrlAction": "Copiar URL do Terminal",
|
||
"copyFileManagerUrlAction": "Copiar URL do Gestor de Ficheiros",
|
||
"copyTunnelUrlAction": "Copiar URL do Túnel",
|
||
"copyDockerUrlAction": "Copiar URL do Docker",
|
||
"copyHostMetricsUrlAction": "Copiar URL das Métricas do host",
|
||
"copyTmuxMonitorUrlAction": "Copiar URL do Monitor Tmux",
|
||
"copyRdpUrlAction": "Copiar URL RDP",
|
||
"copyVncUrlAction": "Copiar URL VNC",
|
||
"copyTelnetUrlAction": "Copiar URL Telnet",
|
||
"copyRemoteDesktopUrlAction": "Copiar URL do Ambiente de Trabalho Remoto",
|
||
"deleteCredentialConfirm": "Eliminar credencial \"{{name}}\"?",
|
||
"deletedCredential": "Eliminada {{name}}",
|
||
"deploySSHKeyTitle": "Implementar chave SSH",
|
||
"deployingBtn": "A implementar...",
|
||
"deployBtn": "Implementar",
|
||
"failedToDeployKey": "Falha ao implementar chave",
|
||
"deleteHostsConfirm": "Eliminar {{count}} host{{plural}}? Esta ação não pode ser desfeita.",
|
||
"movedToRoot": "Movido para a raiz",
|
||
"enableTerminalFeature": "Ativar Terminal",
|
||
"disableTerminalFeature": "Desativar Terminal",
|
||
"enableFilesFeature": "Ativar Ficheiros",
|
||
"disableFilesFeature": "Desativar Ficheiros",
|
||
"enableTunnelsFeature": "Ativar Tunnels",
|
||
"disableTunnelsFeature": "Desativar Tunnels",
|
||
"enableDockerFeature": "Ativar Docker",
|
||
"disableDockerFeature": "Desativar Docker",
|
||
"enableProxmoxFeature": "Ativar Proxmox",
|
||
"disableProxmoxFeature": "Desativar Proxmox",
|
||
"addTagsPlaceholder": "Adicionar tags...",
|
||
"authDetails": "Detalhes de autenticação",
|
||
"credType": "Tipo",
|
||
"generateKeyPairDesc": "Gerar um novo par de chaves; as chaves privada e pública serão preenchidas automaticamente.",
|
||
"generatingKey": "A gerar...",
|
||
"generateLabel": "Gerar {{label}}",
|
||
"uploadFileBtn": "Carregar ficheiro",
|
||
"keyPassphraseOptional": "Frase-senha da chave (Opcional)",
|
||
"sshPublicKeyOptional": "Chave pública SSH (Opcional)",
|
||
"publicKeyGenerated": "Chave pública gerada",
|
||
"failedToGeneratePublicKey": "Falha ao derivar a chave pública",
|
||
"publicKeyCopied": "Chave pública copiada",
|
||
"keyPairGenerated": "Par de chaves {{label}} gerado",
|
||
"failedToGenerateKeyPair": "Falha ao gerar par de chaves",
|
||
"searchHostsPlaceholder": "Pesquisar anfitriões, endereços, tags…",
|
||
"searchCredentialsPlaceholder": "Pesquisar credenciais…",
|
||
"refreshBtn": "Atualizar",
|
||
"addTag": "Adicionar tags...",
|
||
"deleteConfirmBtn": "Eliminar",
|
||
"tunnelRequirementsText": "O servidor SSH deve ter GatewayPorts yes, AllowTcpForwarding yes e PermitRootLogin yes definidos em /etc/ssh/sshd_config.",
|
||
"deleteHostConfirm": "Eliminar \"{{name}}\"?",
|
||
"enableAtLeastOneProtocol": "Ative pelo menos um protocolo acima para configurar as definições de autenticação e ligação.",
|
||
"keyPassphrase": "Frase-senha da chave",
|
||
"connectBtn": "Ligar",
|
||
"disconnectBtn": "Desligar",
|
||
"basicInformation": "Informação básica",
|
||
"authDetailsSection": "Detalhes de autenticação",
|
||
"credTypeLabel": "Tipo",
|
||
"hostsTab": "Anfitriões",
|
||
"credentialsTab": "Credenciais",
|
||
"selectMultiple": "Selecionar vários",
|
||
"selectHosts": "Selecionar hosts",
|
||
"connectionLabel": "Ligação",
|
||
"authenticationLabel": "Autenticação",
|
||
"generateKeyPairTitle": "Gerar par de chaves",
|
||
"generateKeyPairDescription": "Gerar um novo par de chaves, as chaves privada e pública serão preenchidas automaticamente.",
|
||
"generateFromPrivateKey": "Gerar a partir da chave privada",
|
||
"refreshBtn2": "Atualizar",
|
||
"exitSelectionTitle": "Sair da seleção",
|
||
"addHostBtn2": "Adicionar host",
|
||
"addCredentialBtn2": "Adicionar credencial",
|
||
"checkingHostStatuses": "A verificar o estado dos hosts...",
|
||
"pinnedSection": "Fixados",
|
||
"hostsExported": "Hosts exportados com sucesso",
|
||
"export": {
|
||
"menuItem": "Exportar...",
|
||
"title": "Hosts de exportação",
|
||
"scope": "Âmbito",
|
||
"scopeAll": "Tudo",
|
||
"scopeSelected": "Selecionado",
|
||
"searchHosts": "Pesquisar hosts...",
|
||
"include": "Incluir",
|
||
"groupConnection": "Conexão",
|
||
"groupCredentials": "Credenciais",
|
||
"groupNotes": "Notas",
|
||
"groupTags": "Etiquetas e alfinete",
|
||
"groupTunnels": "Túneis",
|
||
"groupJumpHosts": "Apresentadores do Jump",
|
||
"groupQuickActions": "Ações rápidas",
|
||
"groupFeatureFlags": "Sinalizadores de recursos",
|
||
"groupAdvanced": "Configuração avançada",
|
||
"preview": "Pré-visualização",
|
||
"moreHosts": "... {{count}} mais hosts",
|
||
"summary": "{{selected}} de {{total}} anfitriões",
|
||
"credentialsIncluded": "credenciais incluídas",
|
||
"credentialsExcluded": "credenciais excluídas",
|
||
"noneSelected": "Nenhum host selecionado",
|
||
"cancel": "Cancelar",
|
||
"confirm": "Exportar",
|
||
"fetchFailed": "Falha ao carregar os hosts para exportação.",
|
||
"bulkButton": "Exportar"
|
||
},
|
||
"sampleDownloaded": "Ficheiro de exemplo descarregado",
|
||
"failedToDeleteCredential2": "Falha ao eliminar a credencial",
|
||
"noFolderOption": "(Sem pasta)",
|
||
"nSelected": "{{count}} selecionado(s)",
|
||
"featuresMenu": "Funcionalidades",
|
||
"moveMenu": "Mover",
|
||
"connectSelected": "Ligar",
|
||
"cancelSelection": "Cancelar",
|
||
"deployDialogDesc": "Implementar {{name}} no ficheiro authorized_keys de um host.",
|
||
"targetHostLabel": "Host de destino",
|
||
"selectHostOption": "Selecionar um host...",
|
||
"keyDeployedSuccess": "Chave implementada com sucesso",
|
||
"failedToDeployKey2": "Falha ao implementar a chave",
|
||
"deletedCount": "Eliminados {{count}} hosts",
|
||
"failedToDeleteCount": "Falha ao eliminar {{count}} hosts",
|
||
"duplicatedHost": "Duplicado \"{{name}}\"",
|
||
"failedToDuplicateHost": "Falha ao duplicar o host",
|
||
"updatedCount": "Atualizados {{count}} hosts",
|
||
"friendlyNameLabel": "Nome Amigável",
|
||
"descriptionLabel": "Descrição",
|
||
"loadingHost": "A carregar o host...",
|
||
"loadingHosts": "A carregar hosts...",
|
||
"loadingCredentials": "A carregar credenciais...",
|
||
"noHostsYet": "Ainda sem hosts",
|
||
"noHostsMatchSearch": "Nenhum host corresponde à sua pesquisa",
|
||
"hostNotFound": "Host não encontrado",
|
||
"searchHosts": "Pesquisar hosts...",
|
||
"sortHosts": "Ordenar Hosts",
|
||
"sortDefault": "Ordem Padrão",
|
||
"sortNameAsc": "Nome (A → Z)",
|
||
"sortNameDesc": "Nome (Z → A)",
|
||
"sortIpAsc": "Endereço IP (Asc)",
|
||
"sortIpDesc": "Endereço IP (Desc)",
|
||
"sortOnlineFirst": "Online primeiro",
|
||
"sortOfflineFirst": "Offline primeiro",
|
||
"sortPinnedFirst": "Fixados primeiro",
|
||
"filterHosts": "Filtrar Hosts",
|
||
"filterClearAll": "Limpar Filtros",
|
||
"filterStatusGroup": "Estado",
|
||
"filterOnline": "Online",
|
||
"filterOffline": "Offline",
|
||
"filterPinned": "Fixados",
|
||
"filterAuthGroup": "Tipo de Autenticação",
|
||
"filterAuthPassword": "Palavra-passe",
|
||
"filterAuthKey": "Chave SSH",
|
||
"filterAuthCredential": "Credencial",
|
||
"filterAuthNone": "Nenhuma",
|
||
"filterAuthOpkssh": "OPKSSH",
|
||
"filterProtocolGroup": "Protocolo",
|
||
"filterProtocolSsh": "SSH",
|
||
"filterProtocolRdp": "RDP",
|
||
"filterProtocolVnc": "VNC",
|
||
"filterProtocolTelnet": "Telnet",
|
||
"filterFeaturesGroup": "Funcionalidades",
|
||
"filterFeatureTerminal": "Terminal",
|
||
"filterFeatureFileManager": "Gestor de Ficheiros",
|
||
"filterFeatureTunnel": "Túnel",
|
||
"filterFeatureDocker": "Docker",
|
||
"filterTagsGroup": "Etiquetas",
|
||
"shareHost": "Partilhar Anfitrião",
|
||
"shareHostTitle": "Partilhar: {{name}}",
|
||
"shareFolder": "Pasta partilhada",
|
||
"shareFolderTitle": "Pasta partilhada: {{name}}",
|
||
"folderSharedSuccessfully": "Host(ns) partilhado(s) {{count}} na pasta",
|
||
"failedToShareFolder": "Falha ao partilhar a pasta",
|
||
"sharing": {
|
||
"loadError": "Erro ao carregar dados de partilha. Tente novamente.",
|
||
"shareWithSection": "Partilhar com",
|
||
"usersTab": "Utilizadores",
|
||
"rolesTab": "Funções",
|
||
"searchPlaceholder": "Procurar utilizadores ou funções...",
|
||
"noMatches": "Nenhuma correspondência encontrada",
|
||
"permissionLevelLabel": "Nível de permissão",
|
||
"levels": {
|
||
"connect": {
|
||
"label": "Ligar",
|
||
"description": "Abrir apenas sessões: terminal, ambiente de trabalho remoto, gestor de ficheiros, túneis e Docker. Sem acesso à configuração do anfitrião."
|
||
},
|
||
"view": {
|
||
"label": "Ver",
|
||
"description": "Ligar e ver a configuração do anfitrião. Os segredos nunca são mostrados."
|
||
},
|
||
"edit": {
|
||
"label": "Editar",
|
||
"description": "Visualize e modifique as definições do host que não requerem autenticação. A autenticação SSH do proprietário permanece privada e restrita ao proprietário."
|
||
},
|
||
"manage": {
|
||
"label": "Gerir",
|
||
"description": "Editar, além de partilhar o anfitrião com outras pessoas, alterar os níveis de permissão e revogar o acesso."
|
||
}
|
||
},
|
||
"expiryLabel": "Expiração do acesso",
|
||
"expiry": {
|
||
"never": "Nunca",
|
||
"oneHour": "1 hora",
|
||
"oneDay": "24 horas",
|
||
"sevenDays": "7 dias",
|
||
"thirtyDays": "30 dias",
|
||
"custom": "Personalizado"
|
||
},
|
||
"customHoursPlaceholder": "Horas até à expiração do acesso",
|
||
"shareButton": "Partilhar",
|
||
"shareWithCount": "Partilhar ({{count}})",
|
||
"currentAccess": "Acesso atual",
|
||
"noAccessEntries": "Este anfitrião ainda não foi partilhado",
|
||
"folderShareSummary": "Partilhado {{shared}} de {{total}} hosts nesta pasta",
|
||
"grantedBy": "Concedido por",
|
||
"expires": "Expira",
|
||
"expired": "Expirado",
|
||
"never": "Nunca",
|
||
"revoke": "Revogar",
|
||
"accessUpdated": "Acesso atualizado",
|
||
"accessUpdateFailed": "Falha ao atualizar o acesso",
|
||
"sharedBadge": "Partilhado",
|
||
"sharedBadgeTooltip": "Partilhado por {{owner}} (acesso de {{level}})",
|
||
"viewOnlyBanner": "Este anfitrião é partilhado consigo por {{owner}} com acesso de visualização. A configuração é só de leitura.",
|
||
"sharedEditBanner": "Este anfitrião é partilhado consigo por {{owner}} com acesso de edição. As alterações aplicam-se ao anfitrião real; as referências de autenticação só podem ser alteradas pelo proprietário.",
|
||
"ownerOnlyControl": "Apenas o proprietário do anfitrião pode alterar isto",
|
||
"ownerAuthPrivate": "A autenticação SSH do proprietário do host é privada. Utilize a opção “Definir autenticação SSH pessoal” no menu do host para escolher as suas próprias credenciais.",
|
||
"ownerAuthShared": "O proprietário do host partilhou a autenticação SSH para este host. Pode utilizá-la ou escolher as suas próprias credenciais em \"Definir autenticação SSH pessoal\".",
|
||
"authOverrideAction": "Configure a autenticação SSH pessoal.",
|
||
"authOverrideTitle": "Autenticação SSH pessoal",
|
||
"authOverrideDescriptionPrivate": "As credenciais SSH do proprietário do host permanecem privadas. Escolha uma das suas credenciais guardadas para ligações a {{host}}.",
|
||
"authOverrideDescriptionShared": "Utilize a autenticação partilhada pelo proprietário do host ou substitua-a por uma das suas credenciais guardadas para ligações a {{host}}.",
|
||
"authOverrideCredentialLabel": "Credencial de autenticação",
|
||
"useSharedAuthentication": "Utilizar autenticação de host partilhada",
|
||
"noPersonalCredential": "Sem credencial pessoal",
|
||
"authOverrideNoCredentials": "Ainda não guardou nenhuma credencial SSH. Crie uma em Credenciais para se ligar a hosts que exijam autenticação.",
|
||
"authOverrideRequired": "Este host requer uma das suas credenciais guardadas para que se possa ligar.",
|
||
"authOverridePrivateHint": "Esta credencial é privada e intransmissível. O proprietário do host e outros destinatários não a podem ver nem utilizar.",
|
||
"authOverrideSaved": "Autenticação SSH pessoal guardada",
|
||
"authOverrideCleared": "Autenticação SSH pessoal removida",
|
||
"authOverrideClearedToShared": "Utilizando autenticação de host partilhado",
|
||
"authOverrideLoadError": "Falha ao carregar a sua autenticação SSH. Tente novamente.",
|
||
"authOverrideSaveError": "Falha ao guardar a sua autenticação SSH."
|
||
},
|
||
"guac": {
|
||
"connection": "Ligação",
|
||
"authentication": "Autenticação",
|
||
"storedCredential": "Credencial Armazenada",
|
||
"noCredential": "Sem credencial (credenciais diretas abaixo)",
|
||
"authMethod": "Método de Autenticação",
|
||
"authTypeDirect": "Direta",
|
||
"authTypeCredential": "Credencial",
|
||
"authTypeNone": "Nenhum",
|
||
"authTypeNoneDesc": "Nenhuma credencial é armazenada. Ser-lhe-á pedido que insira um nome de utilizador e uma senha sempre que se conectar; não são salvos.",
|
||
"selectCredential": "Selecionar uma credencial...",
|
||
"connectionSettings": "Definições de Ligação",
|
||
"displaySettings": "Definições de Ecrã",
|
||
"audioSettings": "Definições de Áudio",
|
||
"rdpPerformance": "Desempenho do RDP",
|
||
"deviceRedirection": "Redirecionamento de Dispositivos",
|
||
"session": "Sessão",
|
||
"gateway": "Gateway",
|
||
"remoteApp": "RemoteApp",
|
||
"clipboard": "Área de Transferência",
|
||
"sessionRecording": "Gravação de Sessão",
|
||
"wakeOnLan": "Wake-on-LAN",
|
||
"vncSettings": "Definições VNC",
|
||
"terminalSettings": "Definições do Terminal",
|
||
"rdpPort": "Porta RDP",
|
||
"username": "Nome de utilizador",
|
||
"password": "Palavra-passe",
|
||
"passwordSaved": "Palavra-passe guardada, digite para alterar",
|
||
"domain": "Domínio",
|
||
"securityMode": "Modo de segurança",
|
||
"colorDepth": "Profundidade de cor",
|
||
"width": "Largura",
|
||
"height": "Altura",
|
||
"dpi": "DPI",
|
||
"resizeMethod": "Método de redimensionamento",
|
||
"clientName": "Nome do cliente",
|
||
"initialProgram": "Programa inicial",
|
||
"serverLayout": "Layout do servidor",
|
||
"timezone": "Fuso horário",
|
||
"loadBalanceInfo": "Informação de balanceamento de carga / Cookie",
|
||
"loadBalanceInfoDesc": "Cookie do RD Connection Broker para balanceamento de carga em farms RDS (ex: tsv://MS Terminal Services Plugin.1.CollectionName)",
|
||
"guacdProxy": "Proxy guacd",
|
||
"guacdHostname": "Host guacd",
|
||
"guacdHostnamePlaceholder": "Padrão global",
|
||
"guacdPort": "Porta guacd",
|
||
"guacdProxyDesc": "Substituir a instância guacd global para esta ligação. Deixe em branco para usar o guacd configurado globalmente.",
|
||
"gatewayHostname": "Nome de host do gateway",
|
||
"gatewayPort": "Porta do gateway",
|
||
"gatewayUsername": "Nome de utilizador do gateway",
|
||
"gatewayPassword": "Palavra-passe do gateway",
|
||
"gatewayDomain": "Domínio do gateway",
|
||
"remoteAppProgram": "Programa RemoteApp",
|
||
"workingDirectory": "Diretório de trabalho",
|
||
"arguments": "Argumentos",
|
||
"normalizeLineEndings": "Normalizar fins de linha",
|
||
"recordingPath": "Caminho da gravação",
|
||
"recordingName": "Nome da gravação",
|
||
"macAddress": "Endereço MAC",
|
||
"broadcastAddress": "Endereço de broadcast",
|
||
"udpPort": "Porta UDP",
|
||
"waitTimeS": "Tempo de Espera (s)",
|
||
"driveName": "Nome da Unidade",
|
||
"drivePath": "Caminho da Unidade",
|
||
"ignoreCertificate": "Ignorar Certificado",
|
||
"ignoreCertificateDesc": "Permitir ligações a hosts com certificados auto-assinados",
|
||
"forceLossless": "Forçar sem perdas",
|
||
"forceLosslessDesc": "Forçar codificação de imagem sem perdas (maior qualidade, mais largura de banda)",
|
||
"disableAudio": "Desativar Áudio",
|
||
"disableAudioDesc": "Silenciar todo o áudio da sessão remota",
|
||
"enableAudioInput": "Ativar Entrada de Áudio (Microfone)",
|
||
"enableAudioInputDesc": "Encaminhar microfone local para a sessão remota",
|
||
"wallpaper": "Fundo de ecrã",
|
||
"wallpaperDesc": "Mostrar fundo de ecrã (desativar melhora o desempenho)",
|
||
"theming": "Temas",
|
||
"themingDesc": "Ativar temas e estilos visuais",
|
||
"fontSmoothing": "Suavização de Fontes",
|
||
"fontSmoothingDesc": "Ativar renderização de fontes ClearType",
|
||
"fullWindowDrag": "Arrasto de Janela Completo",
|
||
"fullWindowDragDesc": "Mostrar conteúdo da janela ao arrastar",
|
||
"desktopComposition": "Composição do ambiente de trabalho",
|
||
"desktopCompositionDesc": "Ativar efeitos de transparência Aero",
|
||
"menuAnimations": "Animações de Menu",
|
||
"menuAnimationsDesc": "Ativar animações de desvanecimento e deslizamento de menus",
|
||
"disableBitmapCaching": "Desativar cache de bitmaps",
|
||
"disableBitmapCachingDesc": "Desativar a cache de bitmaps (pode ajudar com falhas)",
|
||
"disableOffscreenCaching": "Desativar cache fora do ecrã",
|
||
"disableOffscreenCachingDesc": "Desativar a cache fora do ecrã",
|
||
"disableGlyphCaching": "Desativar cache de glifos",
|
||
"disableGlyphCachingDesc": "Desativar a cache de glifos",
|
||
"enableGfx": "Ativar GFX",
|
||
"enableGfxDesc": "Usar pipeline gráfico RemoteFX",
|
||
"enablePrinting": "Ativar Impressão",
|
||
"enablePrintingDesc": "Redirecionar impressoras locais para a sessão remota",
|
||
"enableDriveRedirection": "Ativar Redirecionamento de Unidades",
|
||
"enableDriveRedirectionDesc": "Mapear uma pasta local como unidade na sessão remota",
|
||
"createDrivePath": "Criar Caminho de Unidade",
|
||
"createDrivePathDesc": "Criar automaticamente a pasta se não existir",
|
||
"disableDownload": "Desativar Download",
|
||
"disableDownloadDesc": "Impedir o download de ficheiros da sessão remota",
|
||
"disableUpload": "Desativar Upload",
|
||
"disableUploadDesc": "Impedir o envio de ficheiros para a sessão remota",
|
||
"enableTouch": "Ativar Toque",
|
||
"enableTouchDesc": "Ativar o reencaminhamento de entrada tátil",
|
||
"consoleSession": "Sessão de Consola",
|
||
"consoleSessionDesc": "Ligar à consola (sessão 0) em vez de uma nova sessão",
|
||
"sendWolPacket": "Enviar Pacote WOL",
|
||
"sendWolPacketDesc": "Enviar um pacote mágico para despertar este host antes de ligar",
|
||
"disableCopy": "Desativar Cópia",
|
||
"disableCopyDesc": "Impedir a cópia de texto da sessão remota",
|
||
"disablePaste": "Desativar Colagem",
|
||
"disablePasteDesc": "Impedir a colagem de texto na sessão remota",
|
||
"createPathIfMissing": "Criar caminho se não existir",
|
||
"createPathIfMissingDesc": "Criar automaticamente o diretório de gravação",
|
||
"excludeOutput": "Excluir Saída",
|
||
"excludeOutputDesc": "Não gravar a saída do ecrã (apenas metadados)",
|
||
"excludeMouse": "Excluir Rato",
|
||
"excludeMouseDesc": "Não gravar os movimentos do rato",
|
||
"includeKeystrokes": "Incluir Teclas",
|
||
"includeKeystrokesDesc": "Gravar as teclas premidas em bruto, além da saída do ecrã",
|
||
"vncPort": "Porta VNC",
|
||
"vncPassword": "Palavra-passe VNC",
|
||
"vncUsernameOptional": "Nome de utilizador (opcional)",
|
||
"vncLeaveBlank": "Deixar em branco se não for necessário",
|
||
"cursorMode": "Modo do Cursor",
|
||
"swapRedBlue": "Trocar Vermelho/Azul",
|
||
"swapRedBlueDesc": "Trocar os canais de cor vermelha e azul (corrige alguns problemas de cor)",
|
||
"readOnly": "Apenas leitura",
|
||
"readOnlyDesc": "Visualizar o ecrã remoto sem enviar qualquer entrada",
|
||
"telnetPort": "Porta Telnet",
|
||
"terminalType": "Tipo de Terminal",
|
||
"fontName": "Nome da Fonte",
|
||
"fontSize": "Tamanho da Fonte",
|
||
"colorScheme": "Esquema de Cores",
|
||
"backspaceKey": "Tecla Backspace",
|
||
"saveHostFirst": "Guarde o host primeiro.",
|
||
"sharingOptionsAfterSave": "As opções de partilha estão disponíveis após o host ter sido guardado.",
|
||
"permissionLevel": "Nível de Permissão",
|
||
"typeHeader": "Tipo",
|
||
"targetHeader": "Destino",
|
||
"permissionHeader": "Permissão",
|
||
"cancelBtn": "Cancelar",
|
||
"savingBtn": "A guardar...",
|
||
"updateHostBtn": "Atualizar Host",
|
||
"addHostBtn": "Adicionar Host"
|
||
}
|
||
},
|
||
"commandPalette": {
|
||
"searchPlaceholder": "Pesquisar hosts, comandos ou definições...",
|
||
"quickActions": "Ações Rápidas",
|
||
"hostManager": "Gestor de Hosts",
|
||
"hostManagerDesc": "Gerir, adicionar ou editar hosts",
|
||
"addNewHost": "Adicionar Novo Host",
|
||
"addNewHostDesc": "Registar um novo host",
|
||
"adminSettings": "Definições de Administrador",
|
||
"adminSettingsDesc": "Configurar preferências do sistema e utilizadores",
|
||
"userProfile": "Perfil do Utilizador",
|
||
"userProfileDesc": "Gerir a sua conta e preferências",
|
||
"addCredential": "Adicionar Credencial",
|
||
"addCredentialDesc": "Guardar chaves SSH ou palavras-passe",
|
||
"tmuxMonitor": "Monitor Tmux",
|
||
"tmuxMonitorDesc": "Monitorizar sessões tmux nos seus hosts",
|
||
"recentActivity": "Atividade Recente",
|
||
"serversAndHosts": "Servidores e Hosts",
|
||
"noHostsFound": "Nenhum host encontrado que corresponda a \"{{search}}\"",
|
||
"links": "Ligações",
|
||
"navigate": "Navegar",
|
||
"select": "Selecionar",
|
||
"toggleWith": "Alternar com"
|
||
},
|
||
"splitScreen": {
|
||
"paneEmpty": "Painel {{index}} - vazio",
|
||
"noTabAssigned": "Nenhum separador atribuído",
|
||
"focusedPane": "Painel ativo"
|
||
},
|
||
"connections": {
|
||
"noConnections": "Sem ligações",
|
||
"noConnectionsDesc": "Abra um terminal, gestor de ficheiros ou desktop remoto para ver as ligações aqui",
|
||
"connectedFor": "Ligado há {{duration}}",
|
||
"connected": "Ligado",
|
||
"disconnected": "Desligado",
|
||
"closeTab": "Fechar separador",
|
||
"closeConnection": "Fechar ligação",
|
||
"forgetTab": "Esquecer",
|
||
"removeBackground": "Remover",
|
||
"reconnect": "Religar",
|
||
"reopenTab": "Reabrir",
|
||
"sectionOpen": "Abertas",
|
||
"sectionBackground": "Em segundo plano",
|
||
"backgroundDesc": "As sessões persistem durante 30 minutos após a desligação e podem ser religadas.",
|
||
"persisted": "Persistida em segundo plano",
|
||
"expiresIn": "Expira em {{duration}}",
|
||
"search": "Pesquisar ligações...",
|
||
"noSearchResults": "Nenhuma ligação corresponde à sua pesquisa",
|
||
"rename": "Renomear sessão",
|
||
"sectionSharedWithMe": "Partilhou comigo",
|
||
"sharedBy": "Partilhado por {{username}}",
|
||
"join": "Juntar",
|
||
"sharedSessionLabel": "{{hostName}} (partilhado)"
|
||
},
|
||
"sessionSharing": {
|
||
"guestView": {
|
||
"loading": "Ligar à sessão partilhada...",
|
||
"linkInvalid": "Este link de partilha é inválido, expirou ou foi revogado.",
|
||
"rateLimited": "Muitas tentativas foram feitas, tente novamente em breve.",
|
||
"sessionEnded": "Esta sessão terminou.",
|
||
"readOnlyBadge": "Somente visualização"
|
||
},
|
||
"modalTitle": "Sessão de partilha",
|
||
"shareButton": "Partilhar",
|
||
"notReadyToShare": "A sessão ainda não está pronta para ser partilhada.",
|
||
"modeTab": {
|
||
"link": "Ligação",
|
||
"user": "Usuário"
|
||
},
|
||
"linkModeDescription": "Qualquer pessoa com este link pode participar, sem necessidade de criar conta.",
|
||
"userModeDescription": "Partilhe com um utilizador específico que já tenha acesso a este host. Caso ainda não tenha acesso, partilhe primeiro o host com ele ou utilize um link. Após a partilha, a sessão aparecerá no separador Conexões do utilizador.",
|
||
"permissionLevel": {
|
||
"label": "Nível de permissão",
|
||
"readOnly": "Somente leitura",
|
||
"readOnlyDescription": "É possível assistir à sessão em direto, mas não é possível digitar ou interagir.",
|
||
"readWrite": "Ler e escrever",
|
||
"readWriteDescription": "Pode digitar e interagir com a sessão da mesma forma que o proprietário."
|
||
},
|
||
"expiryLabel": "Expiração do link",
|
||
"createLinkButton": "Criar link",
|
||
"createShareButton": "Partilhar com o usuário",
|
||
"searchUsersPlaceholder": "Pesquisar utilizadores...",
|
||
"noUsersFound": "Nenhum utilizador encontrado",
|
||
"linkCreated": "Partilhar link criado",
|
||
"linkCopied": "Ligação copiada para a área de transferência",
|
||
"copyLink": "Copiar link",
|
||
"shareCreated": "Sessão partilhada. Ela aparecerá no separador Conexões deles.",
|
||
"shareFailed": "Falha ao criar partilha",
|
||
"userLacksHostAccess": "Esse utilizador ainda não tem acesso a este host. Partilhe o host com ele primeiro ou use um link.",
|
||
"activeShares": "Ações ativas",
|
||
"noActiveShares": "Sem ação ativa nesta sessão.",
|
||
"revoke": "Revogar",
|
||
"revokeConfirmTitle": "Revogar essa participação?",
|
||
"revokeConfirmDescription": "Qualquer pessoa que utilize esta partilha perderá o acesso imediatamente.",
|
||
"revoked": "Ações revogadas",
|
||
"revokeFailed": "Falha ao revogar a participação",
|
||
"joinCount": "{{count}} junte-se",
|
||
"joinCount_other": "{{count}} entra",
|
||
"expiresAt": "Expira em {{date}}",
|
||
"linkShareBadge": "Ligação",
|
||
"userShareBadge": "Utilizador: {{username}}",
|
||
"loadSharesFailed": "Falha ao carregar partilhas ativas"
|
||
},
|
||
"guacamole": {
|
||
"connecting": "A ligar à sessão {{type}}...",
|
||
"connectionError": "Erro de ligação",
|
||
"connectionFailed": "Falha na ligação",
|
||
"failedToConnect": "Falha ao obter o token de ligação",
|
||
"hostNotFound": "Servidor não encontrado",
|
||
"noHostSelected": "Nenhum servidor selecionado",
|
||
"reconnect": "Religar",
|
||
"retry": "Repetir",
|
||
"guacdUnavailable": "O serviço de ambiente de trabalho remoto (guacd) não está disponível. Certifique-se de que o guacd está em execução, acessível e devidamente configurado nas definições de administração.",
|
||
"credentialPromptTitle": "Introduza as credenciais RDP",
|
||
"credentialPromptDescription": "Este host está configurado para solicitar credenciais ao ligar. São utilizadas apenas para esta sessão e não são guardadas.",
|
||
"connect": "Ligar",
|
||
"ctrlAltDel": "Ctrl+Alt+Del",
|
||
"toolbar": {
|
||
"ctrlAltDel": "Ctrl+Alt+Del",
|
||
"winL": "Win+L (Bloquear ecrã)",
|
||
"winKey": "Tecla Windows",
|
||
"ctrl": "Ctrl",
|
||
"alt": "Alt",
|
||
"shift": "Shift",
|
||
"win": "Win",
|
||
"stickyActive": "{{key}} (bloqueado - clique para libertar)",
|
||
"stickyInactive": "{{key}} (clique para bloquear)",
|
||
"esc": "Escape",
|
||
"tab": "Tab",
|
||
"home": "Home",
|
||
"end": "End",
|
||
"pageUp": "Page Up",
|
||
"pageDown": "Page Down",
|
||
"arrowUp": "Arrow Up",
|
||
"arrowDown": "Arrow Down",
|
||
"arrowLeft": "Arrow Left",
|
||
"arrowRight": "Arrow Right",
|
||
"fnToggle": "Teclas de Função",
|
||
"reconnect": "Reconectar Sessão",
|
||
"collapse": "Recolher barra",
|
||
"expand": "Expandir barra",
|
||
"dragHandle": "Arraste para reposicionar",
|
||
"switchToTrackpad": "Mudar para o modo trackpad (arraste para mover o cursor, toque para clicar)",
|
||
"switchToTouch": "Mude para o modo de toque (toque diretamente onde pretende clicar)."
|
||
}
|
||
},
|
||
"terminal": {
|
||
"connect": "Ligar ao Host",
|
||
"clear": "Limpar",
|
||
"paste": "Colar",
|
||
"reconnect": "Reconectar",
|
||
"connectionLost": "Ligação perdida",
|
||
"connected": "Ligado",
|
||
"clipboardWriteFailed": "Erro ao copiar para a área de transferência. Certifique-se de que a página é servida via HTTPS ou localhost.",
|
||
"clipboardReadFailed": "Erro ao ler da área de transferência. Certifique-se de que as permissões da área de transferência foram concedidas.",
|
||
"clipboardHttpWarning": "Colar requer HTTPS. Use Ctrl+Shift+V ou sirva o Termix via HTTPS.",
|
||
"passwordPromptFillTitle": "Preencher a palavra-passe guardada neste pedido?",
|
||
"unknownError": "Ocorreu um erro desconhecido.",
|
||
"websocketError": "Erro de ligação WebSocket",
|
||
"connecting": "A ligar...",
|
||
"noHostSelected": "Nenhum host selecionado",
|
||
"reconnecting": "A restabelecer ligação... ({{attempt}}/{{max}})",
|
||
"reconnected": "Ligação restabelecida com sucesso",
|
||
"tmuxSessionCreated": "Sessão tmux criada: {{name}}",
|
||
"tmuxSessionAttached": "Sessão tmux anexada: {{name}}",
|
||
"tmuxUnavailable": "O tmux não está instalado no host remoto, a reverter para shell padrão",
|
||
"tmuxSessionPickerTitle": "Sessões tmux",
|
||
"tmuxSessionPickerDesc": "Foram encontradas sessões tmux neste host. Selecione uma para retomar ou crie uma nova sessão.",
|
||
"tmuxWindows": "Janelas",
|
||
"tmuxWindowCount": "{{count}} janela",
|
||
"tmuxAttached": "Clientes anexados",
|
||
"tmuxAttachedCount": "{{count}} anexado",
|
||
"tmuxLastActivity": "Última atividade",
|
||
"tmuxTimeJustNow": "agora mesmo",
|
||
"tmuxTimeMinutes": "há {{count}} min",
|
||
"tmuxTimeHours": "há {{count}} h",
|
||
"tmuxTimeDays": "há {{count}} d",
|
||
"tmuxCreateNew": "Iniciar nova sessão",
|
||
"tmuxCopyHint": "Ajuste a seleção e prima Enter para copiar para a área de transferência",
|
||
"tmuxDetach": "Desanexar da sessão tmux",
|
||
"tmuxDetached": "Desanexado da sessão tmux",
|
||
"searchPlaceholder": "Encontrar",
|
||
"searchCaseSensitive": "Caixa de fósforos",
|
||
"searchWholeWord": "Combine a palavra inteira",
|
||
"searchRegex": "Utilizar expressão regular",
|
||
"searchNoResults": "Nenhum resultado",
|
||
"searchResultCount": "{{index}} de {{count}}",
|
||
"searchNext": "Próxima partida (Entrar)",
|
||
"searchPrevious": "Partida anterior (Shift+Enter)",
|
||
"searchClose": "Fechar (Esc)",
|
||
"maxReconnectAttemptsReached": "Número máximo de tentativas de restabelecimento de ligação atingido",
|
||
"closeTab": "Fechar",
|
||
"connectionTimeout": "Tempo limite da ligação",
|
||
"terminalTitle": "Terminal - {{host}}",
|
||
"terminalWithPath": "Terminal - {{host}}:{{path}}",
|
||
"runTitle": "A executar {{command}} - {{host}}",
|
||
"totpRequired": "Autenticação de dois fatores necessária",
|
||
"totpCodeLabel": "Código de verificação",
|
||
"totpVerify": "Verificar",
|
||
"mfaPromptRequired": "Autenticação necessária",
|
||
"mfaPushRequired": "Autenticação Push necessária",
|
||
"mfaMenuPlaceholder": "Insira a sua resposta",
|
||
"mfaWaitingApproval": "Aguarda aprovação no seu dispositivo...",
|
||
"mfaSendRequest": "Enviar solicitação",
|
||
"warpgateAuthRequired": "Autenticação Warpgate necessária",
|
||
"warpgateSecurityKey": "Chave de segurança",
|
||
"warpgateAuthUrl": "URL de autenticação",
|
||
"warpgateOpenBrowser": "Abrir no navegador",
|
||
"warpgateContinue": "Concluí a autenticação",
|
||
"opksshAuthRequired": "Autenticação OPKSSH necessária",
|
||
"opksshAuthDescription": "Conclua a autenticação no seu navegador para continuar. Esta sessão permanecerá válida por 24 horas.",
|
||
"opksshOpenBrowser": "Abrir navegador para autenticar",
|
||
"opksshWaitingForAuth": "A aguardar autenticação no navegador...",
|
||
"opksshAuthenticating": "A processar autenticação...",
|
||
"opksshTimeout": "A autenticação expirou. Tente novamente.",
|
||
"opksshAuthFailed": "A autenticação falhou. Verifique as suas credenciais e tente novamente.",
|
||
"opksshSignInWith": "Iniciar sessão com {{provider}}",
|
||
"tailscaleCheckRequired": "Autenticação Tailscale necessária",
|
||
"tailscaleCheckDescription": "O Tailscale SSH requer uma verificação adicional. Autentique-se no seu browser para continuar.",
|
||
"tailscaleCheckOpenBrowser": "Abra o browser para autenticar.",
|
||
"tailscaleCheckWaiting": "Aguarda-se autenticação do Tailscale...",
|
||
"tailscaleCheckTimeout": "A autenticação no Tailscale expirou. Tente novamente.",
|
||
"vaultAuthTitle": "Início de sessão no Vault necessário",
|
||
"vaultAuthDescription": "Foi aberta uma janela para iniciar sessão no HashiCorp Vault. Conclua o início de sessão aí; esta ligação continuará automaticamente.",
|
||
"vaultAuthFailed": "A autenticação no Vault falhou. Tente novamente.",
|
||
"vaultReopen": "Reabrir janela de início de sessão",
|
||
"sudoPasswordPopupTitle": "Inserir Password?",
|
||
"linkDialogTitle": "Abrir Ligação",
|
||
"linkDialogOpen": "Abrir",
|
||
"linkDialogCopy": "Copiar",
|
||
"websocketAbnormalClose": "A ligação foi fechada inesperadamente. Isto pode dever-se a um problema de configuração do proxy reverso ou SSL. Verifique os registos do servidor.",
|
||
"connectionLogTitle": "Registo da Ligação",
|
||
"connectionLogCopy": "Copiar registos para a área de transferência",
|
||
"connectionLogEmpty": "Ainda não há registos da ligação",
|
||
"connectionLogWaiting": "A aguardar registos da ligação...",
|
||
"connectionLogCopied": "Registos da ligação copiados para a área de transferência",
|
||
"connectionLogCopyFailed": "Falha ao copiar registos para a área de transferência",
|
||
"connectionRejected": "Ligação rejeitada pelo servidor. Verifique a sua autenticação e configuração de rede.",
|
||
"hostKeyRejected": "Verificação da chave de host SSH rejeitada. Ligação cancelada.",
|
||
"sessionTakenOver": "A sessão foi aberta noutro separador. A restabelecer ligação...",
|
||
"split": {
|
||
"splitTab": "Dividir Separador",
|
||
"addToSplit": "Adicionar à Divisão",
|
||
"removeFromSplit": "Remover da Divisão"
|
||
}
|
||
},
|
||
"fileManager": {
|
||
"noHostSelected": "Nenhum host selecionado",
|
||
"initializingEditor": "A inicializar editor...",
|
||
"file": "Ficheiro",
|
||
"folder": "Pasta",
|
||
"uploadFile": "Carregar Ficheiro",
|
||
"downloadFile": "Descarregar",
|
||
"extractArchive": "Extrair Arquivo",
|
||
"extractingArchive": "A extrair {{name}}...",
|
||
"archiveExtractedSuccessfully": "{{name}} extraído com sucesso",
|
||
"extractFailed": "Extração falhou",
|
||
"compressFile": "Comprimir Ficheiro",
|
||
"compressFiles": "Comprimir Ficheiros",
|
||
"compressFilesDesc": "Comprimir {{count}} itens num arquivo",
|
||
"archiveName": "Nome do arquivo",
|
||
"enterArchiveName": "Introduza o nome do arquivo...",
|
||
"compressionFormat": "Formato de compressão",
|
||
"selectedFiles": "Ficheiros selecionados",
|
||
"andMoreFiles": "e mais {{count}}...",
|
||
"compress": "Comprimir",
|
||
"compressingFiles": "A comprimir {{count}} itens em {{name}}...",
|
||
"filesCompressedSuccessfully": "{{name}} criado com sucesso",
|
||
"compressFailed": "Compressão falhou",
|
||
"edit": "Editar",
|
||
"preview": "Pré-visualizar",
|
||
"previous": "Anterior",
|
||
"next": "Seguinte",
|
||
"pageXOfY": "Página {{current}} de {{total}}",
|
||
"zoomOut": "Reduzir",
|
||
"zoomIn": "Ampliar",
|
||
"newFile": "Novo Ficheiro",
|
||
"newFolder": "Nova Pasta",
|
||
"rename": "Renomear",
|
||
"uploading": "A enviar...",
|
||
"uploadingFile": "A enviar {{name}}...",
|
||
"fileName": "Nome do ficheiro",
|
||
"folderName": "Nome da pasta",
|
||
"fileUploadedSuccessfully": "Ficheiro \"{{name}}\" enviado com sucesso",
|
||
"failedToUploadFile": "Falha ao enviar ficheiro",
|
||
"fileDownloadedSuccessfully": "Ficheiro \"{{name}}\" descarregado com sucesso",
|
||
"failedToDownloadFile": "Falha ao descarregar ficheiro",
|
||
"fileCreatedSuccessfully": "Ficheiro \"{{name}}\" criado com sucesso",
|
||
"folderCreatedSuccessfully": "Pasta \"{{name}}\" criada com sucesso",
|
||
"failedToCreateItem": "Falha ao criar item",
|
||
"operationFailed": "Operação {{operation}} falhou para {{name}}: {{error}}",
|
||
"failedToResolveSymlink": "Falha ao resolver ligação simbólica",
|
||
"itemsDeletedSuccessfully": "{{count}} itens eliminados com êxito",
|
||
"failedToDeleteItems": "Falha ao eliminar itens",
|
||
"sudoPasswordRequired": "Palavra-passe de administrador necessária",
|
||
"enterSudoPassword": "Introduza a palavra-passe sudo para continuar esta operação",
|
||
"sudoPassword": "Palavra-passe sudo",
|
||
"sudoOperationFailed": "Operação sudo falhou",
|
||
"sudoAuthFailed": "Autenticação sudo falhou",
|
||
"dragFilesToUpload": "Arraste ficheiros aqui para carregar",
|
||
"emptyFolder": "Esta pasta está vazia",
|
||
"searchFiles": "Procurar ficheiros...",
|
||
"upload": "Carregar",
|
||
"selectHostToStart": "Selecione uma máquina para iniciar a gestão de ficheiros",
|
||
"sshRequiredForFileManager": "O gestor de ficheiros requer SSH. Esta máquina não tem SSH ativado.",
|
||
"failedToConnect": "Falha ao ligar ao SSH",
|
||
"failedToLoadDirectory": "Falha ao carregar diretório",
|
||
"noSSHConnection": "Nenhuma ligação SSH disponível",
|
||
"copy": "Copiar",
|
||
"cut": "Cortar",
|
||
"paste": "Colar",
|
||
"copyPath": "Copiar caminho",
|
||
"copyPaths": "Copiar caminhos",
|
||
"delete": "Eliminar",
|
||
"properties": "Propriedades",
|
||
"refresh": "Atualizar",
|
||
"downloadFiles": "Descarregar {{count}} ficheiros para o navegador",
|
||
"copyFiles": "Copiar {{count}} itens",
|
||
"cutFiles": "Cortar {{count}} itens",
|
||
"deleteFiles": "Eliminar {{count}} itens",
|
||
"filesCopiedToClipboard": "{{count}} itens copiados para a área de transferência",
|
||
"filesCutToClipboard": "{{count}} itens cortados para a área de transferência",
|
||
"pathCopiedToClipboard": "Caminho copiado para a área de transferência",
|
||
"pathsCopiedToClipboard": "{{count}} caminhos copiados para a área de transferência",
|
||
"failedToCopyPath": "Falha ao copiar o caminho para a área de transferência",
|
||
"copyFolderLink": "Copiar ligação para a pasta",
|
||
"copyCurrentFolderLink": "Copiar ligação para a pasta atual",
|
||
"folderLinkCopied": "Ligação da pasta copiada para a área de transferência",
|
||
"failedToCopyFolderLink": "Falha ao copiar a ligação da pasta",
|
||
"movedItems": "{{count}} itens movidos",
|
||
"failedToDeleteItem": "Falha ao eliminar o item",
|
||
"itemRenamedSuccessfully": "Renomeação de {{type}} bem-sucedida.",
|
||
"failedToRenameItem": "Falha ao renomear o item",
|
||
"download": "Transferir",
|
||
"openExternalEditor": "Abrir externamente",
|
||
"chooseExternalEditor": "Escolher editor externo",
|
||
"externalEditorSelected": "Editor externo selecionado",
|
||
"externalEditorDesktopOnly": "O editor externo está disponível apenas na aplicação de ambiente de trabalho",
|
||
"externalEditorOpened": "Aberto no editor externo. Ao guardar, as alterações serão enviadas de volta para o servidor.",
|
||
"failedToOpenExternalEditor": "Falha ao abrir o editor externo",
|
||
"failedToSelectExternalEditor": "Falha ao selecionar o editor externo",
|
||
"permissions": "Permissões",
|
||
"size": "Tamanho",
|
||
"modified": "Modificado",
|
||
"path": "Caminho",
|
||
"confirmDelete": "Tem a certeza de que pretende eliminar {{name}}?",
|
||
"permissionDenied": "Permissão negada",
|
||
"serverError": "Erro do servidor",
|
||
"fileSavedSuccessfully": "Ficheiro guardado com sucesso",
|
||
"failedToSaveFile": "Falha ao guardar o ficheiro",
|
||
"confirmDeleteSingleItem": "Tem a certeza de que pretende eliminar permanentemente \"{{name}}\"?",
|
||
"confirmDeleteMultipleItems": "Tem a certeza de que pretende eliminar permanentemente {{count}} itens?",
|
||
"confirmDeleteMultipleItemsWithFolders": "Tem a certeza de que pretende eliminar permanentemente {{count}} itens? Isto inclui pastas e o seu conteúdo.",
|
||
"confirmDeleteFolder": "Tem a certeza de que pretende eliminar permanentemente a pasta \"{{name}}\" e todo o seu conteúdo?",
|
||
"permanentDeleteWarning": "Esta ação não pode ser anulada. Os itens serão permanentemente eliminados do servidor.",
|
||
"recent": "Recentes",
|
||
"pinned": "Fixados",
|
||
"folderShortcuts": "Atalhos de pastas",
|
||
"failedToReconnectSSH": "Falha ao restabelecer a sessão SSH",
|
||
"openTerminalHere": "Abrir Terminal Aqui",
|
||
"run": "Executar",
|
||
"openTerminalInFolder": "Abrir Terminal Nesta Pasta",
|
||
"openTerminalInFileLocation": "Abrir Terminal na Localização do Ficheiro",
|
||
"runningFile": "Em execução - {{file}}",
|
||
"onlyRunExecutableFiles": "Só pode executar ficheiros executáveis",
|
||
"directories": "Pastas",
|
||
"removedFromRecentFiles": "Removido \"{{name}}\" dos ficheiros recentes",
|
||
"removeFailed": "Falha ao remover",
|
||
"unpinnedSuccessfully": "\"{{name}}\" desafixado com sucesso",
|
||
"unpinFailed": "Falha ao desafixar",
|
||
"removedShortcut": "Atalho \"{{name}}\" removido",
|
||
"removeShortcutFailed": "Falha ao remover atalho",
|
||
"clearedAllRecentFiles": "Limpos todos os ficheiros recentes",
|
||
"clearFailed": "Falha ao limpar",
|
||
"removeFromRecentFiles": "Remover dos ficheiros recentes",
|
||
"clearAllRecentFiles": "Limpar todos os ficheiros recentes",
|
||
"unpinFile": "Desafixar ficheiro",
|
||
"removeShortcut": "Remover atalho",
|
||
"pinFile": "Afixar ficheiro",
|
||
"addToShortcuts": "Adicionar aos atalhos",
|
||
"pasteFailed": "Falha ao colar",
|
||
"noUndoableActions": "Sem ações para desfazer",
|
||
"undoCopySuccess": "Desfeita a operação de cópia: Eliminados {{count}} ficheiros copiados",
|
||
"undoCopyFailedDelete": "Falha ao desfazer: Não foi possível eliminar os ficheiros copiados",
|
||
"undoCopyFailedNoInfo": "Falha ao desfazer: Não foi possível encontrar a informação dos ficheiros copiados",
|
||
"undoMoveSuccess": "Desfeita a operação de mover: {{count}} ficheiros movidos de volta para o local original",
|
||
"undoMoveFailedMove": "Falha ao desfazer: Não foi possível mover nenhum ficheiro de volta",
|
||
"undoMoveFailedNoInfo": "Falha ao desfazer: Não foi possível encontrar a informação dos ficheiros movidos",
|
||
"undoDeleteNotSupported": "A operação de eliminar não pode ser desfeita: Os ficheiros foram eliminados permanentemente do servidor",
|
||
"undoTypeNotSupported": "Tipo de operação de desfazer não suportado",
|
||
"undoOperationFailed": "Falha ao desfazer a operação",
|
||
"unknownError": "Erro desconhecido",
|
||
"confirm": "Confirmar",
|
||
"find": "Procurar...",
|
||
"replace": "Substituir",
|
||
"downloadInstead": "Transferir em alternativa",
|
||
"keyboardShortcuts": "Atalhos de teclado",
|
||
"searchAndReplace": "Pesquisar e substituir",
|
||
"editing": "Edição",
|
||
"search": "Pesquisar",
|
||
"findNext": "Localizar seguinte",
|
||
"findPrevious": "Localizar anterior",
|
||
"save": "Guardar",
|
||
"selectAll": "Selecionar tudo",
|
||
"undo": "Desfazer",
|
||
"redo": "Refazer",
|
||
"moveLineUp": "Mover linha para cima",
|
||
"moveLineDown": "Mover linha para baixo",
|
||
"toggleComment": "Alternar comentário",
|
||
"autoComplete": "Autocompletar",
|
||
"imageLoadError": "Erro ao carregar a imagem",
|
||
"startTyping": "Comece a escrever...",
|
||
"unknownSize": "Tamanho desconhecido",
|
||
"fileIsEmpty": "O ficheiro está vazio",
|
||
"largeFileWarning": "Aviso de ficheiro grande",
|
||
"largeFileWarningDesc": "Este ficheiro tem {{size}} de tamanho, o que poderá causar problemas de desempenho ao ser aberto como texto.",
|
||
"fileNotFoundAndRemoved": "O ficheiro \"{{name}}\" não foi encontrado e foi removido dos ficheiros recentes/fixados",
|
||
"failedToLoadFile": "Erro ao carregar o ficheiro: {{error}}",
|
||
"serverErrorOccurred": "Ocorreu um erro no servidor. Por favor, tente novamente mais tarde.",
|
||
"autoSaveFailed": "Falha na gravação automática",
|
||
"fileAutoSaved": "Ficheiro gravado automaticamente",
|
||
"moveFileFailed": "Falha ao mover {{name}}",
|
||
"moveOperationFailed": "Falha na operação de movimentação",
|
||
"canOnlyCompareFiles": "Só é possível comparar dois ficheiros",
|
||
"comparingFiles": "A comparar ficheiros: {{file1}} e {{file2}}",
|
||
"dragFailed": "Falha ao arrastar",
|
||
"filePinnedSuccessfully": "Ficheiro \"{{name}}\" fixado com sucesso",
|
||
"pinFileFailed": "Erro ao fixar o ficheiro",
|
||
"fileUnpinnedSuccessfully": "Ficheiro \"{{name}}\" desafixado com sucesso",
|
||
"unpinFileFailed": "Falha ao desafixar ficheiro",
|
||
"shortcutAddedSuccessfully": "Atalho para a pasta \"{{name}}\" adicionado com sucesso",
|
||
"addShortcutFailed": "Falha ao adicionar atalho",
|
||
"operationCompletedSuccessfully": "{{operation}} {{count}} itens com sucesso",
|
||
"operationCompleted": "{{operation}} {{count}} itens",
|
||
"downloadFileSuccess": "Ficheiro {{name}} descarregado com sucesso",
|
||
"downloadFileFailed": "Falha ao descarregar",
|
||
"moveTo": "Mover para {{name}}",
|
||
"diffCompareWith": "Comparar diferenças com {{name}}",
|
||
"dragOutsideToDownload": "Arraste para fora da janela para descarregar ({{count}} ficheiros)",
|
||
"newFolderDefault": "NovaPasta",
|
||
"newFileDefault": "NovoFicheiro.txt",
|
||
"successfullyMovedItems": "{{count}} itens movidos com sucesso para {{target}}",
|
||
"move": "Mover",
|
||
"searchInFile": "Procurar no ficheiro (Ctrl+F)",
|
||
"showKeyboardShortcuts": "Mostrar atalhos de teclado",
|
||
"decreaseFontSize": "Diminuir tamanho da letra",
|
||
"increaseFontSize": "Aumentar tamanho da letra",
|
||
"startWritingMarkdown": "Comece a escrever o seu conteúdo em markdown...",
|
||
"loadingFileComparison": "A carregar comparação de ficheiros...",
|
||
"reload": "Recarregar",
|
||
"compare": "Comparar",
|
||
"sideBySide": "Lado a lado",
|
||
"inline": "Em linha",
|
||
"fileComparison": "Comparação de ficheiros: {{file1}} vs {{file2}}",
|
||
"fileTooLarge": "Ficheiro demasiado grande: {{error}}",
|
||
"sshConnectionFailed": "Falha na ligação SSH. Verifique a sua ligação a {{name}} ({{ip}}:{{port}})",
|
||
"loadFileFailed": "Falha ao carregar ficheiro: {{error}}",
|
||
"connecting": "A ligar...",
|
||
"connectedSuccessfully": "Ligado com sucesso",
|
||
"totpVerificationFailed": "Falha na verificação TOTP",
|
||
"warpgateVerificationFailed": "Falha na autenticação Warpgate",
|
||
"authenticationFailed": "Falha na autenticação",
|
||
"incorrectPassphrase": "Frase-passe incorreta. Tente novamente.",
|
||
"verificationCodePrompt": "Código de verificação:",
|
||
"changePermissions": "Alterar Permissões",
|
||
"currentPermissions": "Permissões Atuais",
|
||
"owner": "Proprietário",
|
||
"group": "Grupo",
|
||
"others": "Outros",
|
||
"read": "Leitura",
|
||
"write": "Escrita",
|
||
"execute": "Execução",
|
||
"permissionsChangedSuccessfully": "Permissões alteradas com sucesso",
|
||
"failedToChangePermissions": "Falha ao alterar permissões",
|
||
"name": "Nome",
|
||
"sortByName": "Nome",
|
||
"sortByDate": "Data de modificação",
|
||
"sortBySize": "Tamanho",
|
||
"ascending": "Ascendente",
|
||
"descending": "Descendente",
|
||
"root": "Raiz",
|
||
"new": "Novo",
|
||
"sortBy": "Ordenar por",
|
||
"items": "Itens",
|
||
"selected": "Selecionados",
|
||
"editor": "Editor",
|
||
"octal": "Octal",
|
||
"storage": "Armazenamento",
|
||
"disk": "Disco",
|
||
"used": "Utilizado",
|
||
"of": "de",
|
||
"toggleSidebar": "Alternar Barra Lateral",
|
||
"cannotLoadPdf": "Não é possível carregar o PDF",
|
||
"pdfLoadError": "Ocorreu um erro ao carregar este ficheiro PDF.",
|
||
"loadingPdf": "A carregar PDF...",
|
||
"loadingPage": "A carregar página..."
|
||
},
|
||
"transfer": {
|
||
"copyToHost": "Copiar para o host…",
|
||
"moveToHost": "Mover para o host…",
|
||
"copyItemsToHost": "Copiar {{count}} itens para o host…",
|
||
"moveItemsToHost": "Mover {{count}} itens para o host…",
|
||
"noHostsConnected": "Não há outros hosts do gestor de ficheiros disponíveis.",
|
||
"noHostsConnectedHint": "Adicione outro host SSH com o Gestor de Ficheiros ativado no Gestor de Hosts.",
|
||
"selectDestinationHost": "Selecionar host de destino",
|
||
"destinationPath": "Caminho de destino",
|
||
"recentDestinations": "Destinos recentes",
|
||
"collapseRecentDestinations": "Recolher destinos recentes",
|
||
"expandRecentDestinations": "Expandir destinos recentes",
|
||
"browseFolders": "Navegar pelas pastas de destino",
|
||
"browseDestination": "Navegar ou introduzir o caminho",
|
||
"confirmCopy": "Copiar",
|
||
"confirmMove": "Mover",
|
||
"transferring": "A transferir…",
|
||
"compressing": "A comprimir…",
|
||
"extracting": "A extrair…",
|
||
"transferringItems": "A transferir {{current}} de {{total}} itens…",
|
||
"transferSuccess": "Transferência concluída",
|
||
"transferError": "Transferência falhou",
|
||
"transferPartial": "Transferência concluída com {{count}} erros",
|
||
"transferPartialHint": "Não foi possível transferir: {{paths}}",
|
||
"itemsSummary": "{{count}} itens",
|
||
"destMustBeDirectory": "O destino deve ser uma pasta para transferências de vários itens.",
|
||
"selectThisFolder": "Selecionar esta pasta",
|
||
"browsePathWillBeCreated": "Esta pasta ainda não existe. Será criada quando a transferência for iniciada.",
|
||
"browsePathError": "Não foi possível abrir este caminho no host de destino.",
|
||
"goUp": "Subir",
|
||
"copyFolderToHost": "Copiar pasta para o host…",
|
||
"moveFolderToHost": "Mover pasta para o host…",
|
||
"hostReady": "Pronto",
|
||
"hostConnecting": "A ligar…",
|
||
"hostDisconnected": "Desligado",
|
||
"hostAuthRequired": "Autenticação necessária — abra o Gestor de Ficheiros neste host primeiro",
|
||
"hostConnectionFailed": "Falha na ligação",
|
||
"metricsTitle": "Tempos de transferência",
|
||
"metricsPrepare": "Preparar destino: {{duration}}",
|
||
"metricsCompress": "Compressão na origem: {{duration}}",
|
||
"metricsHopSourceRead": "Origem → servidor: {{throughput}}",
|
||
"metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}",
|
||
"metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}",
|
||
"metricsTransfer": "Ponta a ponta: {{throughput}} ({{duration}})",
|
||
"metricsExtract": "Extração no destino: {{duration}}",
|
||
"metricsSourceDelete": "Remoção da origem: {{duration}}",
|
||
"metricsTotal": "Total: {{duration}}",
|
||
"progressCompressing": "A comprimir no host de origem…",
|
||
"progressExtracting": "A extrair no destino…",
|
||
"progressTransferring": "A transferir dados…",
|
||
"progressReconnecting": "A reconectar…",
|
||
"parallelSegmentsLabel": "Vias de transferência paralelas",
|
||
"parallelSegmentsOption": "{{count}} vias",
|
||
"parallelSegmentsHint": "Os ficheiros grandes são divididos em partes de 256 MB. Múltiplas vias utilizam ligações separadas (como iniciar várias transferências) para um maior débito total.",
|
||
"progressTotalSpeed": "{{speed}} total ({{lanes}} vias)",
|
||
"progressTransferringItems": "A transferir ficheiros ({{current}} de {{total}})…",
|
||
"progressBytes": "{{transferred}} / {{total}}",
|
||
"progressItems": "{{current}} / {{total}} ficheiros",
|
||
"sourceNotDeletedPartial": "Ficheiros de origem mantidos (transferência parcial)",
|
||
"jumpHostLimitation": "Ambos os hosts têm de ser acessíveis a partir do servidor Termix. O encaminhamento direto entre hosts não é suportado.",
|
||
"cancel": "Cancelar",
|
||
"methodLabel": "Método de transferência",
|
||
"methodAuto": "Automático",
|
||
"methodTar": "Arquivo Tar",
|
||
"methodItemSftp": "SFTP por ficheiro",
|
||
"methodAutoHint": "Escolhe tar ou SFTP por ficheiro com base no número de ficheiros, tamanho e compressibilidade. Os ficheiros únicos usam sempre SFTP por streaming.",
|
||
"methodTarHint": "Comprime na origem, transfere um arquivo, extrai no destino. Requer tar em ambos os hosts Unix.",
|
||
"methodItemSftpHint": "Transfere cada ficheiro individualmente por SFTP. Funciona em todos os hosts, incluindo Windows.",
|
||
"methodPreviewLoading": "A calcular o método de transferência…",
|
||
"methodPreviewError": "Não foi possível pré-visualizar o método de transferência. O servidor ainda escolherá um método quando iniciar.",
|
||
"methodPreviewWillUseTar": "Utilizará: Arquivo Tar",
|
||
"methodPreviewWillUseItemSftp": "Utilizará: SFTP por ficheiro",
|
||
"methodPreviewScanSummary": "{{fileCount}} ficheiros, {{totalSize}} no total (analisados no host de origem).",
|
||
"methodItemSftpLimitation": "Cada ficheiro utiliza o mesmo stream SFTP como uma cópia de um único ficheiro, um após o outro. O progresso é combinado para todos os ficheiros, pelo que a barra se move lentamente durante ficheiros grandes.",
|
||
"methodReason": {
|
||
"user_item_sftp": "Optou por SFTP ficheiro a ficheiro.",
|
||
"user_tar": "Optou por ficheiro tar.",
|
||
"tar_unavailable": "O tar não está disponível num ou em ambos os anfitriões — será usado SFTP ficheiro a ficheiro.",
|
||
"windows_host": "Está envolvido um anfitrião Windows — o tar não é utilizado.",
|
||
"auto_multi_large": "Automático: vários ficheiros, incluindo um grande ({{largestSize}}) com dados compressíveis — o tar agrupa numa transferência única.",
|
||
"auto_single_large_in_archive": "Automático: um ficheiro grande ({{largestSize}}) neste conjunto — SFTP ficheiro a ficheiro.",
|
||
"auto_many_incompressible": "Automático: dados maioritariamente incompressíveis — SFTP ficheiro a ficheiro.",
|
||
"auto_many_files": "Automático: muitos ficheiros ({{fileCount}}) — o tar reduz a sobrecarga por ficheiro.",
|
||
"auto_default": "Automático: SFTP ficheiro a ficheiro para este conjunto."
|
||
},
|
||
"progressCancel": "Cancelar",
|
||
"progressCancelling": "A cancelar…",
|
||
"progressStalled": "Parado",
|
||
"resumedHint": "Reconectado a uma transferência ativa iniciada noutra janela.",
|
||
"transferCancelled": "Transferência cancelada",
|
||
"transferCancelledCopyHint": "Poderão permanecer ficheiros parciais no destino.",
|
||
"transferCancelledMoveHint": "Poderão permanecer ficheiros parciais no destino. Os ficheiros de origem não foram removidos.",
|
||
"cleanupDestFiles": "Limpar destino",
|
||
"cleanupDestFilesSuccess": "Ficheiros parciais removidos do destino.",
|
||
"cleanupDestFilesPartial": "Não foi possível remover alguns ficheiros parciais.",
|
||
"cleanupDestFilesNothing": "Nada a limpar no destino.",
|
||
"cleanupDestFilesError": "A limpeza falhou.",
|
||
"retryTransfer": "Repetir",
|
||
"retryTransferError": "A repetição falhou.",
|
||
"transferFailedRetryHint": "Foram mantidos dados parciais no destino. A repetição será retomada quando a ligação for restabelecida."
|
||
},
|
||
"tunnels": {
|
||
"noSshTunnels": "Sem túneis SSH",
|
||
"createFirstTunnelMessage": "Ainda não criou nenhum túnel SSH. Configure as ligações de túnel no Gestor de Anfitriões para começar.",
|
||
"connected": "Ligado",
|
||
"disconnected": "Desligado",
|
||
"connecting": "A ligar...",
|
||
"error": "Erro",
|
||
"canceling": "A cancelar...",
|
||
"connect": "Ligar",
|
||
"disconnect": "Desligar",
|
||
"cancel": "Cancelar",
|
||
"port": "Porta",
|
||
"localPort": "Porta local",
|
||
"remotePort": "Porta remota",
|
||
"currentHostPort": "Porta do host atual",
|
||
"endpointPort": "Porta do endpoint",
|
||
"bindIp": "IP local",
|
||
"endpointSshConfig": "Configuração SSH do endpoint",
|
||
"endpointSshHost": "Host SSH do endpoint",
|
||
"endpointSshHostPlaceholder": "Selecionar um host configurado",
|
||
"endpointSshHostRequired": "Selecione um host SSH do endpoint para cada túnel de cliente.",
|
||
"attempt": "Tentativa {{current}} de {{max}}",
|
||
"nextRetryIn": "Próxima tentativa em {{seconds}} segundos",
|
||
"clientTunnels": "Túneis de cliente",
|
||
"clientTunnel": "Túnel de cliente",
|
||
"addClientTunnel": "Adicionar túnel de cliente",
|
||
"noClientTunnels": "Nenhum túnel de cliente configurado neste desktop.",
|
||
"tunnelName": "Nome do túnel",
|
||
"remoteHost": "Host remoto",
|
||
"autoStart": "Arranque automático",
|
||
"clientAutoStartDesc": "Inicia quando este cliente de desktop abre e permanece ligado.",
|
||
"clientManualStartDesc": "Utilize Iniciar e Parar nesta linha. O Termix não o abrirá automaticamente.",
|
||
"clientRemoteServerNote": "O reencaminhamento remoto pode exigir AllowTcpForwarding e GatewayPorts no servidor SSH do endpoint. A porta remota fecha quando este desktop se desliga.",
|
||
"clientTunnelStarted": "Túnel de cliente iniciado",
|
||
"clientTunnelStopped": "Túnel de cliente parado",
|
||
"tunnelTestSucceeded": "Teste do túnel bem-sucedido",
|
||
"tunnelTestFailed": "Teste do túnel falhou",
|
||
"localSaved": "Túneis de cliente guardados",
|
||
"localSaveError": "Falha ao guardar os túneis de cliente locais",
|
||
"invalidBindIp": "O IP local deve ser um endereço IPv4 válido.",
|
||
"invalidLocalTargetIp": "O IP de destino local deve ser um endereço IPv4 válido.",
|
||
"invalidLocalPort": "A porta local deve estar entre 1 e 65535.",
|
||
"invalidRemotePort": "A porta remota deve estar entre 1 e 65535.",
|
||
"invalidLocalTargetPort": "A porta de destino local deve estar entre 1 e 65535.",
|
||
"invalidEndpointPort": "A porta do endpoint deve estar entre 1 e 65535.",
|
||
"duplicateAutoStartBind": "Apenas um túnel de cliente com arranque automático pode utilizar {{bind}}.",
|
||
"manualControlError": "Falha ao atualizar o estado do túnel.",
|
||
"active": "Ativo",
|
||
"start": "Iniciar",
|
||
"stop": "Parar",
|
||
"test": "Testar",
|
||
"type": "Tipo de Túnel",
|
||
"typeLocal": "Local (-L)",
|
||
"typeRemote": "Remoto (-R)",
|
||
"typeDynamic": "Dinâmico (-D)",
|
||
"typeServerLocalDesc": "Do host atual para o endpoint.",
|
||
"typeServerRemoteDesc": "Do endpoint de volta para o host atual.",
|
||
"typeClientLocalDesc": "Do computador local para o endpoint.",
|
||
"typeClientRemoteDesc": "Do endpoint de volta para o computador local.",
|
||
"typeClientDynamicDesc": "SOCKS no computador local.",
|
||
"typeDynamicDesc": "Encaminha tráfego SOCKS5 CONNECT via SSH",
|
||
"forwardDescriptionServerLocal": "Host atual {{sourcePort}} → endpoint {{endpointPort}}.",
|
||
"forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → host atual {{sourcePort}}.",
|
||
"forwardDescriptionServerDynamic": "SOCKS no host atual {{sourcePort}}.",
|
||
"forwardDescriptionClientLocal": "Local {{sourcePort}} → remoto {{endpointPort}}.",
|
||
"forwardDescriptionClientRemote": "Remoto {{sourcePort}} → local {{endpointPort}}.",
|
||
"forwardDescriptionClientDynamic": "SOCKS na porta local {{sourcePort}}.",
|
||
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}",
|
||
"summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}",
|
||
"summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}",
|
||
"autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}",
|
||
"autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}",
|
||
"autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}",
|
||
"route": "Rota:",
|
||
"lastStarted": "Último início",
|
||
"lastTested": "Último teste",
|
||
"lastError": "Último erro",
|
||
"maxRetries": "Máx. tentativas",
|
||
"maxRetriesDescription": "Número máximo de tentativas.",
|
||
"retryInterval": "Intervalo de repetição (segundos)",
|
||
"retryIntervalDescription": "Tempo de espera entre tentativas.",
|
||
"local": "Local",
|
||
"remote": "Remoto",
|
||
"destination": "Destino",
|
||
"host": "Servidor",
|
||
"mode": "Modo",
|
||
"noHostSelected": "Nenhum servidor selecionado",
|
||
"working": "A trabalhar..."
|
||
},
|
||
"cardGrid": {
|
||
"dragToMove": "Arraste para mover",
|
||
"dragToResize": "Arraste para redimensionar",
|
||
"changeWidth": "Alterar largura",
|
||
"removeCard": "Remover {{label}}",
|
||
"addCard": "Adicionar",
|
||
"columns": "Colunas",
|
||
"empty": "Nenhum cartão. Utilize Adicionar abaixo para colocar cartões."
|
||
},
|
||
"hostMetrics": {
|
||
"cpu": "CPU",
|
||
"memory": "Memória",
|
||
"disk": "Disco",
|
||
"network": "Rede",
|
||
"uptime": "Tempo de atividade",
|
||
"processes": "Processos",
|
||
"available": "Disponível",
|
||
"free": "Livre",
|
||
"connecting": "A ligar...",
|
||
"connectionFailed": "Falha ao ligar ao servidor",
|
||
"naCpus": "N/D CPU(s)",
|
||
"cpuCores_one": "{{count}} Núcleo",
|
||
"cpuCores_other": "{{count}} Núcleos",
|
||
"cpuUsage": "Utilização da CPU",
|
||
"memoryUsage": "Utilização da memória",
|
||
"diskUsage": "Utilização do disco",
|
||
"selectFilesystem": "Selecione o sistema de ficheiros",
|
||
"temperature": "Temperatura",
|
||
"highestTemperature": "Temperatura máxima",
|
||
"failedToFetchHostConfig": "Falha ao obter a configuração do servidor",
|
||
"serverOffline": "Servidor offline",
|
||
"cannotFetchMetrics": "Não é possível obter métricas do servidor offline",
|
||
"totpFailed": "Falha na verificação TOTP",
|
||
"noneAuthNotSupported": "Host Metrics não suporta o tipo de autenticação 'none'.",
|
||
"noHostSelected": "Nenhum host selecionado",
|
||
"load": "Carga",
|
||
"systemInfo": "Informação do Sistema",
|
||
"hostname": "Nome do host",
|
||
"operatingSystem": "Sistema Operativo",
|
||
"kernel": "Kernel",
|
||
"seconds": "segundos",
|
||
"networkInterfaces": "Interfaces de Rede",
|
||
"noInterfacesFound": "Nenhuma interface de rede encontrada",
|
||
"noProcessesFound": "Nenhum processo encontrado",
|
||
"processesTotal": "total",
|
||
"processesRunning": "em execução",
|
||
"loginStats": "Estatísticas de início de sessão SSH",
|
||
"noRecentLoginData": "Sem dados de início de sessão recentes",
|
||
"executingQuickAction": "A executar {{name}}...",
|
||
"quickActionSuccess": "{{name}} concluído com sucesso",
|
||
"quickActionFailed": "{{name}} falhou",
|
||
"quickActionError": "Falha ao executar {{name}}",
|
||
"ports": {
|
||
"title": "Portas em escuta",
|
||
"protocol": "Protocolo",
|
||
"port": "Porta",
|
||
"address": "Endereço",
|
||
"process": "Processo",
|
||
"search": "Pesquisar portas...",
|
||
"allProtocols": "Todos",
|
||
"noData": "Sem dados de portas em escuta"
|
||
},
|
||
"firewall": {
|
||
"title": "Firewall",
|
||
"inactive": "Inativo",
|
||
"policy": "Política",
|
||
"rules": "regras",
|
||
"noRules": "Sem regras nesta cadeia",
|
||
"noData": "Sem dados de firewall disponíveis",
|
||
"action": "Ação",
|
||
"protocol": "Proto",
|
||
"port": "Porta",
|
||
"source": "Origem",
|
||
"anywhere": "Qualquer lugar",
|
||
"chains": "cadeias"
|
||
},
|
||
"loadAvg": "Carga Média",
|
||
"swap": "Swap",
|
||
"architecture": "Arquitetura",
|
||
"refresh": "Atualizar",
|
||
"retry": "Tentar novamente",
|
||
"customize": "Personalizar layout",
|
||
"reset": "Redefinir",
|
||
"tabLive": "Ao Vivo",
|
||
"editModeInstructions": "Arraste os cartões para reorganizar, arraste a borda inferior para redimensionar e use o botão de largura para alterar a largura do cartão. Adicione ou remova cartões abaixo.",
|
||
"managers": {
|
||
"services": "Serviços",
|
||
"processInspector": "Inspetor de Processos",
|
||
"logViewer": "Visualizador de Registos",
|
||
"cron": "Tarefas Cron",
|
||
"packages": "Pacotes",
|
||
"ssl": "Certificados SSL",
|
||
"firewall": "Firewall",
|
||
"users": "Utilizadores e Permissões",
|
||
"healthCheck": "Verificações de Estado",
|
||
"diskBreakdown": "Análise de Disco",
|
||
"systemdTimers": "Temporizadores",
|
||
"topMemory": "Top por Memória",
|
||
"noData": "Sem dados",
|
||
"sudoHint": "Defina uma palavra-passe sudo para este host no editor de hosts para ativar ações privilegiadas.",
|
||
"filter": "Filtrar...",
|
||
"start": "Iniciar",
|
||
"stop": "Parar",
|
||
"restart": "Reiniciar",
|
||
"actionDone": "{{name}} atualizado",
|
||
"actionFailed": "A ação falhou",
|
||
"signalSent": "Sinal enviado para o PID {{pid}}",
|
||
"killHint": "Clique: terminar (SIGTERM). Clique direito: forçar encerramento (SIGKILL).",
|
||
"working": "A trabalhar...",
|
||
"update": "Atualizar",
|
||
"upgradeAll": "Atualizar tudo",
|
||
"allUpToDate": "Tudo está atualizado",
|
||
"save": "Guardar",
|
||
"command": "Comando",
|
||
"enabled": "Ativado",
|
||
"cronSaved": "Crontab atualizado",
|
||
"clients": "Clientes",
|
||
"dryRun": "Simulação",
|
||
"renew": "Renovar",
|
||
"noAcmeClient": "Nenhum cliente ACME (certbot ou acme.sh) encontrado neste servidor.",
|
||
"addInputRule": "Adicionar regra INPUT",
|
||
"firewallWarning": "As alterações são efetuadas apenas em execução até serem guardadas. Tenha cuidado para não ficar bloqueado.",
|
||
"ruleApplied": "Regra aplicada",
|
||
"invalidPort": "Introduza uma porta válida (1-65535)",
|
||
"newUsername": "Novo nome de utilizador",
|
||
"addUser": "Adicionar",
|
||
"deleteUser": "Eliminar utilizador",
|
||
"noHealthChecks": "Nenhuma verificação de estado configurada ainda.",
|
||
"follow": "Seguir",
|
||
"noLogData": "Sem saída de registo.",
|
||
"tree": "Árvore",
|
||
"enableDisable": "Ativar / desativar no arranque",
|
||
"grantSudo": "Conceder sudo",
|
||
"revokeSudo": "Revogar sudo",
|
||
"sslIssueCert": "Emitir certificado",
|
||
"sslExpired": "Expirado",
|
||
"sslInDays": "em {{days}}d",
|
||
"sslNeedDomain": "Introduza pelo menos um domínio",
|
||
"sslIssued": "Certificado emitido",
|
||
"sslDomainsPlaceholder": "example.com, www.example.com",
|
||
"sslHttpStandalone": "HTTP (autónomo)",
|
||
"sslHttpWebroot": "HTTP (webroot)",
|
||
"sslDns": "DNS",
|
||
"sslDnsProvider": "Fornecedor DNS (ex. cloudflare)",
|
||
"sslIssueHint": "As credenciais do fornecedor DNS já devem estar configuradas no host.",
|
||
"sslRevoke": "Revogar certificado",
|
||
"sslRevoked": "Certificado revogado",
|
||
"sslRevokeConfirm": "Revogar e remover o certificado \"{{name}}\"? Esta ação não pode ser anulada.",
|
||
"healthRun": "Executar",
|
||
"healthName": "Nome",
|
||
"healthTarget": "Host / endereço",
|
||
"healthAddCheck": "Adicionar verificação",
|
||
"healthSaved": "Verificações de saúde guardadas",
|
||
"healthMissingFields": "Cada verificação necessita de um nome e um destino",
|
||
"logFile": "Ficheiro",
|
||
"logUnit": "Unidade",
|
||
"logCustomPath": "Caminho personalizado em /var/log (opcional)",
|
||
"logGrep": "Filtrar linhas...",
|
||
"firewallPersist": "Persistir regras",
|
||
"firewallPersisted": "Regras de firewall persistidas",
|
||
"wireguard": "WireGuard",
|
||
"tailscale": "Tailscale",
|
||
"wgNotInstalled": "O WireGuard não está instalado neste host",
|
||
"wgNoInterfaces": "Nenhuma interface WireGuard configurada",
|
||
"wgInterfaceUp": "Ativar",
|
||
"wgInterfaceDown": "Desativar",
|
||
"wgBringingUp": "A ativar {{name}}...",
|
||
"wgBringingDown": "A desativar {{name}}...",
|
||
"wgInterfaceUpDone": "{{name}} está ativada",
|
||
"wgInterfaceDownDone": "{{name}} está desativada",
|
||
"wgListenPort": "Porta",
|
||
"wgPublicKey": "Chave pública",
|
||
"wgEndpoint": "Endpoint",
|
||
"wgAllowedIPs": "IPs permitidos",
|
||
"wgLastHandshake": "Último handshake",
|
||
"wgHandshakeNever": "Nunca",
|
||
"wgTransfer": "Transferência",
|
||
"tsNotInstalled": "O Tailscale não está instalado neste host",
|
||
"tsRunning": "A executar",
|
||
"tsStopped": "Parado",
|
||
"tsEnable": "Ligar",
|
||
"tsDisable": "Desligar",
|
||
"tsEnabling": "A ligar ao Tailscale...",
|
||
"tsDisabling": "A desligar do Tailscale...",
|
||
"tsEnabled": "Tailscale ligado",
|
||
"tsDisabled": "Tailscale desligado",
|
||
"tsIPs": "IPs do Tailscale",
|
||
"tsPeers": "Pares",
|
||
"tsOnline": "Online",
|
||
"tsOffline": "Offline",
|
||
"tsExitNode": "Nó de saída",
|
||
"tsExitNodeActive": "Nó de saída ativo",
|
||
"tsHostname": "Nome do host"
|
||
}
|
||
},
|
||
"auth": {
|
||
"tagline": "Gestão auto-hospedada de SSH e ambiente de trabalho remoto",
|
||
"loginTitle": "Bem-vindo de volta",
|
||
"registerTitle": "Criar Conta",
|
||
"forgotPassword": "Esqueceu-se da palavra-passe?",
|
||
"rememberMe": "Lembrar dispositivo por 30 dias (inclui TOTP)",
|
||
"noAccount": "Não tem uma conta?",
|
||
"hasAccount": "Já tem uma conta?",
|
||
"twoFactorAuth": "Autenticação de dois fatores",
|
||
"enterCode": "Introduza o código de verificação",
|
||
"backupCode": "Ou utilize código de backup",
|
||
"verifyCode": "Verificar Código",
|
||
"redirectingToApp": "A redirecionar para a aplicação...",
|
||
"sshAuthenticationRequired": "Autenticação SSH necessária",
|
||
"sshNoKeyboardInteractive": "Autenticação por teclado interativo indisponível",
|
||
"sshAuthenticationFailed": "Falha na autenticação",
|
||
"sshAuthenticationTimeout": "Tempo limite de autenticação excedido",
|
||
"sshNoKeyboardInteractiveDescription": "O servidor não suporta autenticação por teclado interativo. Por favor, forneça a sua palavra-passe ou chave SSH.",
|
||
"sshAuthFailedDescription": "As credenciais fornecidas estavam incorretas. Por favor, tente novamente com credenciais válidas.",
|
||
"sshTimeoutDescription": "A tentativa de autenticação expirou. Por favor, tente novamente.",
|
||
"sshProvideCredentialsDescription": "Por favor, forneça as suas credenciais SSH para se ligar a este servidor.",
|
||
"sshPasswordDescription": "Introduza a palavra-passe para esta ligação SSH.",
|
||
"sshKeyPasswordDescription": "Se a sua chave SSH estiver encriptada, introduza a frase-senha aqui.",
|
||
"passphraseRequired": "Frase-senha obrigatória",
|
||
"passphraseRequiredDescription": "A chave SSH está encriptada. Introduza a frase-senha para a desbloquear.",
|
||
"back": "Voltar",
|
||
"firstUser": "Primeiro Utilizador",
|
||
"firstUserMessage": "É o primeiro utilizador e será configurado como administrador. Pode ver as definições de administrador no menu suspenso do utilizador na barra lateral. Se pensa que isto é um erro, verifique os logs do Docker, ou crie um issue no GitHub.",
|
||
"external": "Externo",
|
||
"loginWithExternal": "Iniciar sessão com fornecedor externo",
|
||
"loginWithExternalDesc": "Inicie sessão utilizando o seu fornecedor de identidade externo configurado",
|
||
"externalNotSupportedInElectron": "A autenticação externa ainda não é suportada na aplicação Electron. Utilize a versão web para iniciar sessão via OIDC.",
|
||
"loginWithProvider": "Iniciar sessão com {{name}}",
|
||
"orContinueWith": "ou continuar com",
|
||
"ldapUsername": "Nome de utilizador LDAP",
|
||
"ldapPassword": "Palavra-passe LDAP",
|
||
"ldapSignIn": "Iniciar sessão",
|
||
"ldapLoginFailed": "Falha no início de sessão LDAP",
|
||
"resetPasswordButton": "Redefinir palavra-passe",
|
||
"sendResetCode": "Enviar código de reposição",
|
||
"resetCodeDesc": "Introduza o seu nome de utilizador para receber um código de reposição de palavra-passe. O código será registado nos logs do contentor Docker.",
|
||
"resetCode": "Código de reposição",
|
||
"verifyCodeButton": "Verificar código",
|
||
"enterResetCode": "Introduza o código de 6 dígitos dos logs do contentor Docker para o utilizador:",
|
||
"newPassword": "Nova palavra-passe",
|
||
"confirmNewPassword": "Confirmar palavra-passe",
|
||
"enterNewPassword": "Introduza a nova palavra-passe para o utilizador:",
|
||
"signUp": "Registar",
|
||
"desktopApp": "Aplicação de ambiente de trabalho",
|
||
"loggingInToDesktopApp": "A iniciar sessão na aplicação de ambiente de trabalho",
|
||
"loadingServer": "A carregar servidor...",
|
||
"dataLossWarning": "Redefinir a sua palavra-passe desta forma irá eliminar todos os anfitriões SSH guardados, credenciais e outros dados encriptados. Esta ação não pode ser desfeita. Utilize apenas se se esqueceu da sua palavra-passe e não tem sessão iniciada.",
|
||
"authenticationDisabled": "Autenticação desativada",
|
||
"authenticationDisabledDesc": "Todos os métodos de autenticação estão atualmente desativados. Contacte o seu administrador.",
|
||
"passwordLoginDisabledDesc": "O início de sessão com palavra-passe está desativado. Utilize uma passkey ou um fornecedor de autenticação externo.",
|
||
"signInWithPasskey": "Iniciar sessão com passkey",
|
||
"passkeyLoginFailed": "Falha no início de sessão com passkey",
|
||
"attemptsRemaining": "{{count}} tentativas restantes",
|
||
"confirmResetDataWipe": "Esta conta não iniciou sessão desde a atualização da encriptação, pelo que os dados armazenados não podem ser recuperados sem a palavra-passe antiga. A reposição irá eliminar permanentemente os seus hosts, credenciais e snippets. Continuar?"
|
||
},
|
||
"hostKey": {
|
||
"verifyNewHost": "Verificar chave de host SSH",
|
||
"keyChangedWarning": "Chave de host SSH alterada",
|
||
"firstConnectionTitle": "Primeira ligação a este host",
|
||
"firstConnectionDescription": "Não é possível estabelecer a autenticidade deste host. Verifique se a impressão digital corresponde ao esperado.",
|
||
"keyChangedDescription": "A chave de host deste servidor foi alterada desde a sua última ligação. Isto pode indicar um problema de segurança.",
|
||
"previousKey": "Chave anterior",
|
||
"newFingerprint": "Nova impressão digital",
|
||
"fingerprint": "Impressão digital",
|
||
"verifyInstructions": "Se confia neste host, clique em Aceitar para continuar e guardar esta impressão digital para futuras ligações.",
|
||
"securityWarning": "Aviso de segurança",
|
||
"acceptAndContinue": "Aceitar e continuar",
|
||
"acceptNewKey": "Aceitar nova chave e continuar"
|
||
},
|
||
"errors": {
|
||
"databaseConnection": "Não foi possível ligar à base de dados",
|
||
"unknownError": "Erro desconhecido",
|
||
"loginFailed": "Falha no início de sessão",
|
||
"failedPasswordReset": "Falha ao iniciar a reposição da palavra-passe",
|
||
"failedVerifyCode": "Falha ao verificar o código de reposição",
|
||
"failedCompleteReset": "Falha ao concluir a reposição da palavra-passe",
|
||
"invalidTotpCode": "Código TOTP inválido",
|
||
"failedOidcLogin": "Falha ao iniciar sessão OIDC",
|
||
"silentSigninOidcUnavailable": "Foi solicitado um início de sessão silencioso, mas o início de sessão OIDC não está disponível.",
|
||
"failedUserInfo": "Falha ao obter informações do utilizador após o início de sessão",
|
||
"oidcAuthFailed": "Falha na autenticação OIDC",
|
||
"invalidAuthUrl": "URL de autorização inválida recebida do backend",
|
||
"requiredField": "Este campo é obrigatório",
|
||
"minLength": "O comprimento mínimo é {{min}}",
|
||
"passwordMismatch": "As palavras-passe não coincidem",
|
||
"passwordLoginDisabled": "O início de sessão com nome de utilizador/palavra-passe está atualmente desativado",
|
||
"sessionExpired": "Sessão expirada - inicie sessão novamente",
|
||
"totpRateLimited": "Limite de tentativas atingido: demasiadas tentativas de verificação TOTP. Tente novamente mais tarde.",
|
||
"totpRateLimitedWithTime": "Limite de tentativas atingido: demasiadas tentativas de verificação TOTP. Aguarde {{time}} segundos antes de tentar novamente.",
|
||
"resetCodeRateLimited": "Limite de tentativas atingido: demasiadas tentativas de verificação. Tente novamente mais tarde.",
|
||
"resetCodeRateLimitedWithTime": "Limite de tentativas: demasiadas tentativas de verificação. Por favor, aguarde {{time}} segundos antes de tentar novamente.",
|
||
"authTokenSaveFailed": "Falha ao guardar o token de autenticação",
|
||
"failedToLoadServer": "Falha ao carregar o servidor",
|
||
"remoteServerRequired": "É necessário um servidor remoto. Ligue um servidor remoto nas Definições para utilizar este tipo de ligação."
|
||
},
|
||
"messages": {
|
||
"registrationDisabled": "O registo de novas contas está atualmente desativado por um administrador. Por favor, inicie sessão ou contacte um administrador.",
|
||
"userNotAllowed": "A sua conta não está autorizada a registar-se. Por favor, contacte um administrador.",
|
||
"databaseConnectionFailed": "Falha ao ligar ao servidor de base de dados",
|
||
"resetCodeSent": "Código de reposição enviado para os registos do Docker",
|
||
"codeVerified": "Código verificado com sucesso",
|
||
"passwordResetSuccess": "Palavra-passe redefinida com sucesso",
|
||
"loginSuccess": "Início de sessão bem-sucedido",
|
||
"registrationSuccess": "Registo bem-sucedido"
|
||
},
|
||
"profile": {
|
||
"c2sTunnelConfigDesc": "Túneis locais do ambiente de trabalho direcionados para hosts SSH configurados.",
|
||
"c2sTunnelPresets": "Predefinições de túneis do cliente",
|
||
"c2sTunnelPresetsDesc": "Guarde a lista de túneis locais deste cliente de ambiente de trabalho como uma predefinição de servidor nomeada ou carregue uma predefinição de volta para este cliente.",
|
||
"c2sTunnelPresetsUnavailable": "As predefinições de túneis do cliente estão disponíveis apenas no cliente de ambiente de trabalho.",
|
||
"c2sPresetName": "Nome da predefinição",
|
||
"c2sPresetNamePlaceholder": "Nome da predefinição do cliente",
|
||
"c2sPresetToLoad": "Predefinição a carregar",
|
||
"c2sNoPresetSelected": "Nenhuma predefinição selecionada",
|
||
"c2sNoPresets": "Nenhuma predefinição guardada",
|
||
"c2sLoadPreset": "Carregar",
|
||
"c2sCurrentLocalConfig": "{{count}} túnel/túneis de cliente local configurado(s) neste ambiente de trabalho.",
|
||
"c2sPresetSyncNote": "As predefinições são instantâneos explícitos; carregar uma substitui a lista de túneis de cliente local deste cliente de ambiente de trabalho.",
|
||
"c2sPresetSaved": "Predefinição de túnel do cliente guardada",
|
||
"c2sPresetLoaded": "Predefinição de túnel do cliente carregada localmente",
|
||
"c2sPresetRenamed": "Predefinição de túnel do cliente renomeada",
|
||
"c2sPresetDeleted": "Predefinição de túnel do cliente eliminada",
|
||
"c2sPresetLoadError": "Falha ao carregar as predefinições de túneis do cliente"
|
||
},
|
||
"placeholders": {
|
||
"maxRetries": "3",
|
||
"retryInterval": "10",
|
||
"language": "Idioma",
|
||
"keyPassword": "palavra-passe da chave",
|
||
"pastePrivateKey": "Cole aqui a sua chave privada...",
|
||
"localListenerHost": "127.0.0.1 (escuta localmente)",
|
||
"localTargetHost": "127.0.0.1 (alvo neste computador)",
|
||
"socksListenerHost": "127.0.0.1 (escuta SOCKS)",
|
||
"enterPassword": "Introduza a sua palavra-passe",
|
||
"defaultPort": "22",
|
||
"defaultEndpointPort": "224"
|
||
},
|
||
"dashboard": {
|
||
"title": "Painel de Controlo",
|
||
"loading": "A carregar painel de controlo...",
|
||
"github": "GitHub",
|
||
"support": "Suporte",
|
||
"discord": "Discord",
|
||
"docs": "Documentação",
|
||
"donate": "Doar",
|
||
"serverOverview": "Visão Geral do Servidor",
|
||
"version": "Versão",
|
||
"upToDate": "Atualizado",
|
||
"updateAvailable": "Atualização Disponível",
|
||
"beta": "Beta",
|
||
"uptime": "Tempo de Atividade",
|
||
"database": "Base de Dados",
|
||
"healthy": "Operacional",
|
||
"error": "Erro",
|
||
"totalHosts": "Total de Hosts",
|
||
"totalTunnels": "Total de Túneis",
|
||
"totalCredentials": "Total de Credenciais",
|
||
"recentActivity": "Atividade Recente",
|
||
"reset": "Repor",
|
||
"loadingRecentActivity": "A carregar atividade recente...",
|
||
"noRecentActivity": "Sem atividade recente",
|
||
"quickActions": "Ações Rápidas",
|
||
"addHost": "Adicionar Host",
|
||
"addCredential": "Adicionar Credencial",
|
||
"adminSettings": "Definições de Administrador",
|
||
"userProfile": "Perfil do Utilizador",
|
||
"serverStats": "Estatísticas do Servidor",
|
||
"loadingServerStats": "A carregar estatísticas do servidor...",
|
||
"noServerData": "Nenhum dado do servidor disponível",
|
||
"cpu": "CPU",
|
||
"ram": "RAM",
|
||
"customizeLayout": "Personalizar Dashboard",
|
||
"dashboardSettings": "Definições do Dashboard",
|
||
"enableDisableCards": "Ativar/Desativar Cartões",
|
||
"resetLayout": "Repor para a Predefinição",
|
||
"serverOverviewCard": "Visão Geral do Servidor",
|
||
"recentActivityCard": "Atividade Recente",
|
||
"networkGraphCard": "Gráfico de Rede",
|
||
"networkGraph": "Gráfico de Rede",
|
||
"quickActionsCard": "Ações Rápidas",
|
||
"serverStatsCard": "Estatísticas do Servidor",
|
||
"panelMain": "Principal",
|
||
"panelSide": "Lateral",
|
||
"justNow": "agora mesmo",
|
||
"serviceLinks": "Links de Serviço",
|
||
"homepagePreview": "Pré-visualização da Página Inicial"
|
||
},
|
||
"donation": {
|
||
"title": "Está a gostar do Termix?",
|
||
"body": "O Termix é gratuito e de código aberto, desenvolvido e mantido por uma equipa de duas pessoas nos nossos tempos livres. Se substituiu uma ferramenta comercial pela qual estaria a pagar, um donativo ajuda a cobrir os custos de alojamento e mantém o desenvolvimento ativo. De momento, os donativos são apenas em criptomoedas.",
|
||
"milestones": "Os donativos também ajudam a financiar o tempo para pesquisar e aprender o necessário para criar funcionalidades como suporte para SAML e Kubernetes. Veja o progresso na página de donativos.",
|
||
"cta": "Doar",
|
||
"dismiss": "Talvez mais tarde"
|
||
},
|
||
"dashboardTab": {
|
||
"stable": "ESTÁVEL",
|
||
"hostsOnline": "Hosts Online",
|
||
"activeTunnels": "Túneis Ativos",
|
||
"registerNewServer": "Registar um novo servidor",
|
||
"storeSshKeysOrPasswords": "Armazenar chaves SSH ou palavras-passe",
|
||
"manageUsersAndRoles": "Gerir utilizadores e funções",
|
||
"manageYourAccount": "Gerir a sua conta",
|
||
"hostStatus": "Estado do Host",
|
||
"noHostsConfigured": "Nenhum host configurado",
|
||
"online": "ONLINE",
|
||
"offline": "OFFLINE",
|
||
"checking": "A VERIFICAR",
|
||
"onlineLower": "Online",
|
||
"nodes": "{{count}} nós",
|
||
"add": "Adicionar:",
|
||
"commandPalette": "Paleta de Comandos",
|
||
"done": "Concluído",
|
||
"editModeInstructions": "Arraste cartões para reordenar · Arraste o divisor de coluna para redimensionar colunas · Arraste a borda inferior de um cartão para redimensionar a sua altura · Lixo para remover",
|
||
"empty": "Vazio",
|
||
"clear": "Limpar",
|
||
"serviceLinksTitle": "Links de Serviço",
|
||
"serviceLinksEmpty": "Ainda sem links de serviço",
|
||
"serviceLinksAddLabel": "Etiqueta",
|
||
"serviceLinksAddUrl": "URL",
|
||
"serviceLinksAdd": "Adicionar",
|
||
"serviceLinksLabelPlaceholder": "O Meu Serviço",
|
||
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
|
||
"serviceLinksInvalidUrl": "Insira um endereço web válido",
|
||
"serviceLinksAddFailed": "Falha ao adicionar link de serviço",
|
||
"disk": "Disco",
|
||
"viewServerDetails": "Ver detalhes do servidor"
|
||
},
|
||
"sessionLogs": {
|
||
"title": "Registos de Sessão",
|
||
"noLogs": "Ainda sem registos de sessão",
|
||
"noLogsDesc": "Ative o registo de sessão num host para começar a gravar",
|
||
"duration": "Duração",
|
||
"viewLog": "Ver registo",
|
||
"downloadLog": "Transferir",
|
||
"deleteLog": "Eliminar",
|
||
"confirmDelete": "Eliminar este registo de sessão?",
|
||
"confirmDeleteDesc": "Esta ação não pode ser desfeita.",
|
||
"copyContent": "Copiar",
|
||
"copied": "Copiado!",
|
||
"loadError": "Falha ao carregar registos de sessão",
|
||
"deleteError": "Falha ao eliminar registo de sessão",
|
||
"filterByHost": "Filtrar por host..."
|
||
},
|
||
"networkGraph": {
|
||
"addHost": "Adicionar Host",
|
||
"addGroup": "Adicionar Grupo",
|
||
"addLink": "Adicionar Ligação",
|
||
"zoomIn": "Ampliar",
|
||
"zoomOut": "Reduzir",
|
||
"resetView": "Repor Vista",
|
||
"selectHost": "Selecionar Host",
|
||
"chooseHost": "Escolher um host...",
|
||
"parentGroup": "Grupo Pai",
|
||
"noGroup": "Nenhum grupo",
|
||
"groupName": "Nome do Grupo",
|
||
"color": "Cor",
|
||
"source": "Origem",
|
||
"target": "Destino",
|
||
"moveToGroup": "Mover para Grupo",
|
||
"selectGroup": "Selecionar grupo...",
|
||
"addConnection": "Adicionar Ligação",
|
||
"hostDetails": "Detalhes do Host",
|
||
"removeFromGroup": "Remover do Grupo",
|
||
"addHostHere": "Adicionar Host Aqui",
|
||
"editGroup": "Editar Grupo",
|
||
"delete": "Eliminar",
|
||
"add": "Adicionar",
|
||
"create": "Criar",
|
||
"move": "Mover",
|
||
"connect": "Ligar",
|
||
"createGroup": "Criar Grupo",
|
||
"selectSourcePlaceholder": "Selecionar Origem...",
|
||
"selectTargetPlaceholder": "Selecionar Destino...",
|
||
"invalidFile": "Ficheiro Inválido",
|
||
"hostAlreadyExists": "O host já está na topologia.",
|
||
"connectionExists": "A ligação já existe",
|
||
"unknown": "Desconhecido",
|
||
"name": "Nome",
|
||
"ip": "IP",
|
||
"status": "Estado",
|
||
"failedToAddNode": "Falha ao adicionar nó",
|
||
"sourceDifferentFromTarget": "A origem e o destino devem ser diferentes",
|
||
"exportJSON": "Exportar JSON",
|
||
"importJSON": "Importar JSON",
|
||
"terminal": "Terminal",
|
||
"fileManager": "Gestor de ficheiros",
|
||
"tunnel": "Túnel",
|
||
"docker": "Docker",
|
||
"serverStats": "Métricas do host",
|
||
"hostMetrics": "Métricas do host",
|
||
"noNodes": "Ainda sem nós"
|
||
},
|
||
"docker": {
|
||
"notEnabled": "Docker não está ativado para este host",
|
||
"validating": "A validar o Docker...",
|
||
"connecting": "A ligar...",
|
||
"error": "Erro",
|
||
"version": "Docker {{version}}",
|
||
"connectionFailed": "Falha ao ligar ao Docker",
|
||
"containerStarted": "Contentor {{name}} iniciado",
|
||
"failedToStartContainer": "Falha ao iniciar o contentor {{name}}",
|
||
"containerStopped": "Contentor {{name}} parado",
|
||
"failedToStopContainer": "Falha ao parar o contentor {{name}}",
|
||
"containerRestarted": "Contentor {{name}} reiniciado",
|
||
"failedToRestartContainer": "Falha ao reiniciar o contentor {{name}}",
|
||
"containerPaused": "Contentor {{name}} suspenso",
|
||
"containerUnpaused": "Contentor {{name}} retomado",
|
||
"failedToTogglePauseContainer": "Falha ao alternar estado de pausa do contentor {{name}}",
|
||
"containerRemoved": "Contentor {{name}} removido",
|
||
"failedToRemoveContainer": "Falha ao remover o contentor {{name}}",
|
||
"image": "Imagem",
|
||
"ports": "Portas",
|
||
"noPorts": "Sem portas",
|
||
"start": "Iniciar",
|
||
"confirmRemoveContainer": "Tem a certeza de que pretende remover o contentor '{{name}}'? Esta ação não pode ser desfeita.",
|
||
"runningContainerWarning": "Aviso: Este contentor está em execução. Removê-lo irá pará-lo primeiro.",
|
||
"loadingContainers": "A carregar contentores...",
|
||
"manager": "Gestor Docker",
|
||
"autoRefresh": "Atualização automática",
|
||
"timestamps": "Marcas de tempo",
|
||
"lines": "Linhas",
|
||
"filterLogs": "Filtrar registos...",
|
||
"refresh": "Atualizar",
|
||
"download": "Transferir",
|
||
"clear": "Limpar",
|
||
"logsDownloaded": "Registos transferidos com sucesso",
|
||
"last50": "Últimos 50",
|
||
"last100": "Últimos 100",
|
||
"last500": "Últimos 500",
|
||
"last1000": "Últimos 1000",
|
||
"allLogs": "Todos os registos",
|
||
"noLogsMatching": "Nenhum registo corresponde a \"{{query}}\"",
|
||
"noLogsAvailable": "Nenhum registo disponível",
|
||
"noContainersFound": "Nenhum contentor encontrado",
|
||
"noContainersFoundHint": "Não existem contentores Docker disponíveis neste host",
|
||
"searchPlaceholder": "Pesquisar contentores...",
|
||
"allStatuses": "Todos os estados",
|
||
"stateRunning": "Em execução",
|
||
"statePaused": "Em pausa",
|
||
"stateExited": "Terminado",
|
||
"stateRestarting": "A reiniciar",
|
||
"noContainersMatchFilters": "Nenhum contentor corresponde aos seus filtros",
|
||
"noContainersMatchFiltersHint": "Tente ajustar os seus critérios de pesquisa ou filtro",
|
||
"failedToFetchStats": "Falha ao obter estatísticas do contentor",
|
||
"containerNotRunning": "O contentor não está em execução",
|
||
"startContainerToViewStats": "Inicie o contentor para ver as estatísticas",
|
||
"loadingStats": "A carregar estatísticas...",
|
||
"errorLoadingStats": "Erro ao carregar estatísticas",
|
||
"noStatsAvailable": "Nenhuma estatística disponível",
|
||
"cpuUsage": "Utilização da CPU",
|
||
"current": "Atual",
|
||
"memoryUsage": "Utilização da memória",
|
||
"networkIo": "I/O de rede",
|
||
"input": "Entrada",
|
||
"output": "Saída",
|
||
"blockIo": "E/S de blocos",
|
||
"read": "Leitura",
|
||
"write": "Escrita",
|
||
"pids": "PIDs",
|
||
"containerInformation": "Informações do contentor",
|
||
"name": "Nome",
|
||
"id": "ID",
|
||
"state": "Estado",
|
||
"containerMustBeRunning": "O contentor tem de estar em execução para aceder à consola",
|
||
"verificationCodePrompt": "Introduza o código de verificação",
|
||
"totpVerificationFailed": "A verificação TOTP falhou. Por favor, tente novamente.",
|
||
"warpgateVerificationFailed": "A autenticação Warpgate falhou. Por favor, tente novamente.",
|
||
"connectedTo": "Ligado a {{containerName}}",
|
||
"disconnected": "Desligado",
|
||
"consoleError": "Erro da consola",
|
||
"errorMessage": "Erro: {{message}}",
|
||
"failedToConnect": "Falha ao ligar ao contentor",
|
||
"console": "Consola",
|
||
"selectShell": "Selecionar shell",
|
||
"bash": "Bash",
|
||
"sh": "sh",
|
||
"ash": "ash",
|
||
"connect": "Ligar",
|
||
"disconnect": "Desligar",
|
||
"notConnected": "Não ligado",
|
||
"clickToConnect": "Clique em Ligar para iniciar uma sessão shell",
|
||
"connectingTo": "A ligar a {{containerName}}...",
|
||
"containerNotFound": "Contentor não encontrado",
|
||
"backToList": "Voltar à lista",
|
||
"logs": "Registos",
|
||
"stats": "Estatísticas",
|
||
"consoleTab": "Consola",
|
||
"startContainerToAccess": "Inicie o contentor para aceder à consola"
|
||
},
|
||
"admin": {
|
||
"sectionGeneral": "Geral",
|
||
"sectionOidc": "OIDC",
|
||
"sectionSso": "Provedores de SSO",
|
||
"ssoAddProvider": "Adicionar Provedor",
|
||
"ssoDocsLink": "Ver docs",
|
||
"ssoProviderDocsLink": "Ver docs",
|
||
"ssoNoProviders": "Nenhum provedor de SSO configurado.",
|
||
"ssoProviderName": "Nome de apresentação",
|
||
"ssoProviderType": "Tipo de Provedor",
|
||
"ssoDeleteProvider": "Eliminar Provedor",
|
||
"ssoDeleteConfirm": "Eliminar este provedor? Os utilizadores associados não poderão iniciar sessão.",
|
||
"ssoTypeOidc": "OIDC",
|
||
"ssoTypeLdap": "LDAP",
|
||
"ssoTypeGithub": "GitHub",
|
||
"ssoTypeGoogle": "Google",
|
||
"ssoEnabled": "Ativado",
|
||
"ssoDisabled": "Desativado",
|
||
"ssoSaveProvider": "Guardar Provedor",
|
||
"ssoTestConnection": "Testar Ligação",
|
||
"ssoEditProvider": "Editar Provedor",
|
||
"ldapHost": "Servidor LDAP",
|
||
"ldapPort": "Porta",
|
||
"ldapUseTls": "Usar TLS (LDAPS)",
|
||
"ldapBindDn": "Bind DN",
|
||
"ldapBindPassword": "Palavra-passe de Bind",
|
||
"ldapUserSearchBase": "Base de pesquisa de utilizadores",
|
||
"ldapUserSearchFilter": "Filtro de pesquisa de utilizadores",
|
||
"ldapUsernameAttr": "Atributo de nome de utilizador",
|
||
"ldapDisplayNameAttr": "Atributo de nome de apresentação",
|
||
"ldapGroupSearchBase": "Base de pesquisa de grupos",
|
||
"ldapAdminGroup": "Grupo de administradores",
|
||
"ldapAllowedUsers": "Utilizadores permitidos",
|
||
"sectionUsers": "Utilizadores",
|
||
"sectionSessions": "Sessões",
|
||
"sectionRoles": "Funções",
|
||
"sectionDatabase": "Base de Dados",
|
||
"sectionApiKeys": "Chaves API",
|
||
"sectionAuditLog": "Registo de auditoria",
|
||
"sectionSsl": "SSL / Let's Encrypt",
|
||
"sslDescription": "Emitir e renovar automaticamente um certificado SSL confiável da Let's Encrypt. Requer um domínio público e acesso à porta 80 ou DNS.",
|
||
"sslDocsLink": "Ver documentação SSL",
|
||
"sslDomain": "Domínio",
|
||
"sslDomainPlaceholder": "termix.example.com",
|
||
"sslDomainDesc": "O nome de domínio público para o certificado.",
|
||
"sslEmail": "E-mail",
|
||
"sslEmailPlaceholder": "admin@example.com",
|
||
"sslEmailDesc": "E-mail de contacto para notificações e conta Let's Encrypt.",
|
||
"sslChallengeType": "Tipo de desafio",
|
||
"sslChallengeTypeDesc": "Como provar a propriedade do domínio à Let's Encrypt.",
|
||
"sslChallengeHttp": "HTTP (webroot) - requer que a porta 80 esteja acessível a partir da internet",
|
||
"sslChallengeDns": "DNS (Cloudflare) - requer um token de API da Cloudflare",
|
||
"sslCloudflareToken": "Token de API da Cloudflare",
|
||
"sslCloudflareTokenPlaceholder": "Introduzir token...",
|
||
"sslCloudflareTokenDesc": "Token com âmbito e permissão Zone:DNS:Edit para o seu domínio.",
|
||
"sslCertStatus": "Estado do certificado",
|
||
"sslCertStatusNone": "Sem certificado",
|
||
"sslCertStatusValid": "Válido",
|
||
"sslCertStatusExpiring": "A expirar em breve",
|
||
"sslCertStatusExpired": "Expirado",
|
||
"sslCertExpiresAt": "Expira a {{date}}",
|
||
"sslLastIssued": "Última emissão a {{date}}",
|
||
"sslRequestCert": "Emitir / Renovar certificado",
|
||
"sslRequestCertLoading": "A solicitar certificado...",
|
||
"sslRequestCertSuccess": "Certificado emitido e instalado com sucesso",
|
||
"sslRequestCertFailed": "Pedido de certificado falhou",
|
||
"sslSave": "Guardar definições",
|
||
"sslSaved": "Definições SSL guardadas",
|
||
"sslSaveFailed": "Falha ao guardar definições SSL",
|
||
"sslRequiresDomain": "Domínio e e-mail são obrigatórios",
|
||
"sslInfoNote": "Após emitir um certificado, ative o SSL nas variáveis de ambiente (ENABLE_SSL=true) e reinicie o Termix.",
|
||
"sslManualOption": "Manual (envio do certificado)",
|
||
"sslManualCert": "Certificado (PEM)",
|
||
"sslManualCertPlaceholder": "-----INÍCIO DO CERTIFICADO-----",
|
||
"sslManualKey": "Chave privada (PEM)",
|
||
"sslManualKeyPlaceholder": "-----INÍCIO DA CHAVE PRIVADA-----",
|
||
"sslManualDesc": "Cole aqui o seu certificado e chave privada existentes, incluindo a cadeia completa, se tal for exigido pela sua Autoridade Certificadora.",
|
||
"sslManualUpload": "Carregar e instalar certificado",
|
||
"sslManualUploadLoading": "Envio de certificado...",
|
||
"sslManualUploadSuccess": "Certificado carregado e instalado com sucesso.",
|
||
"sslManualUploadFailed": "O envio do certificado falhou",
|
||
"sslManualRequiresFields": "É necessário certificado e chave privada.",
|
||
"auditLogTotal": "{{total}} entradas no total",
|
||
"auditLogEmpty": "Nenhuma entrada de registo de auditoria encontrada",
|
||
"auditLogSuccess": "Sucesso",
|
||
"auditLogFailed": "Falhou",
|
||
"auditLogClearFilters": "Limpar Filtros",
|
||
"auditLogPage": "Página {{page}} de {{totalPages}} ({{total}} total)",
|
||
"auditLogIp": "IP",
|
||
"auditLogResourceId": "ID do Recurso",
|
||
"auditLogFilterUser": "Utilizador",
|
||
"auditLogFilterAction": "Ação",
|
||
"auditLogFilterResourceType": "Tipo de Recurso",
|
||
"auditLogFilterStatus": "Estado",
|
||
"auditLogFilterFrom": "De",
|
||
"auditLogFilterTo": "Até",
|
||
"auditLogFilterAll": "Todos",
|
||
"allowRegistration": "Permitir Registo de Utilizadores",
|
||
"allowRegistrationDesc": "Permitir que novos utilizadores se auto-registem com nome de utilizador e palavra-passe",
|
||
"allowPasswordLogin": "Permitir Início de Sessão com Palavra-passe",
|
||
"allowPasswordLoginDesc": "Início de sessão com nome de utilizador/palavra-passe",
|
||
"oidcAutoProvision": "Aprovisionamento Automático OIDC",
|
||
"oidcAutoProvisionDesc": "Criar automaticamente contas para utilizadores OIDC/SSO no primeiro início de sessão (independente da opção de registo)",
|
||
"oidcSilentLoginDefault": "Início de Sessão Silencioso OIDC por Defeito",
|
||
"oidcSilentLoginDefaultDesc": "Redirecionar automaticamente para o início de sessão OIDC em cada visita, ignorando completamente o formulário de início de sessão",
|
||
"allowPasswordReset": "Permitir Reposição de Palavra-passe",
|
||
"allowPasswordResetDesc": "Código de reposição via registos do Docker",
|
||
"commandHistoryEnabled": "Histórico de Comandos",
|
||
"commandHistoryEnabledDesc": "Permitir o registo do histórico de comandos. Quando desativado, o histórico não é guardado independentemente das definições por máquina.",
|
||
"updateCommandHistoryFailed": "Falha ao atualizar a definição de histórico de comandos",
|
||
"analyticsEnabled": "Partilhar estatísticas de uso anónimas",
|
||
"analyticsEnabledDesc": "Envia uma contagem diária anónima de utilizadores, hosts e utilização de recursos para ajudar a melhorar o Termix. Nenhum dado pessoal ou detalhe de ligação é incluído.",
|
||
"analyticsEnabledLockedDesc": "Esta definição está bloqueada pela variável de ambiente ENABLE_TELEMETRY e não pode ser alterada aqui.",
|
||
"updateAnalyticsFailed": "Falha ao atualizar as definições de análise",
|
||
"sessionSharingGloballyEnabled": "Permitir partilha de sessão",
|
||
"sessionSharingGloballyEnabledDesc": "Permite que as sessões de terminal ao vivo, RDP, VNC e Telnet sejam partilhadas em toda a instância. Substitui todas as definições de partilha por host quando desativada.",
|
||
"updateSessionSharingFailed": "Falha ao atualizar as definições de partilha de sessão.",
|
||
"sessionTimeout": "Tempo Limite da Sessão",
|
||
"hours": "horas",
|
||
"sessionTimeoutRange": "Mín. 1h · Máx. 720h",
|
||
"monitoringDefaults": "Padrões de Monitorização",
|
||
"statusCheck": "Verificação de Estado",
|
||
"metrics": "Métricas",
|
||
"sec": "seg",
|
||
"logLevel": "Nível de Registo",
|
||
"enableGuacamole": "Ativar Guacamole",
|
||
"enableGuacamoleDesc": "Ambiente de trabalho remoto RDP/VNC",
|
||
"enableGuacamoleDocsLink": "Ver documentação",
|
||
"guacdUrl": "URL do guacd",
|
||
"tailscaleApiKey": "Chave de API do Tailscale",
|
||
"tailscaleApiKeyDescription": "Utilizada para deteção de dispositivos no editor de anfitriões. Gere uma chave em tailscale.com/admin/settings/keys.",
|
||
"tailscaleApiKeyDocsLink": "Ver documentação",
|
||
"oidcDescription": "Configurar o OpenID Connect para SSO. Os campos marcados com * são obrigatórios.",
|
||
"oidcDocsLink": "Ver documentação",
|
||
"oidcClientId": "ID do cliente",
|
||
"oidcClientSecret": "Segredo do cliente",
|
||
"oidcAuthUrl": "URL de autorização",
|
||
"oidcIssuerUrl": "URL do emissor",
|
||
"oidcTokenUrl": "URL do token",
|
||
"oidcUserIdentifier": "Caminho do identificador do utilizador",
|
||
"oidcDisplayName": "Caminho do nome de exibição",
|
||
"oidcScopes": "Âmbitos",
|
||
"oidcUserinfoUrl": "Substituir URL do Userinfo",
|
||
"oidcAllowedUsers": "Utilizadores permitidos",
|
||
"oidcAllowedUsersDesc": "Um email por linha. Deixe em branco para permitir todos.",
|
||
"oidcAdminGroup": "Grupo de administração",
|
||
"oidcAdminGroupDesc": "Os utilizadores neste grupo recebem privilégios de administrador. Deixe em branco para desativar a sincronização de grupos.",
|
||
"oidcGroupClaim": "Atributo de grupo",
|
||
"oidcGroupClaimDesc": "Opcional. O caminho do atributo que contém os grupos do utilizador. Predefinido para groups, roles e depois group. Utilize para fornecedores com um atributo personalizado (ex.: Zitadel).",
|
||
"oidcCaCert": "Certificado CA personalizado",
|
||
"oidcCaCertDesc": "Opcional. Certificado CA codificado em PEM para fornecedores OIDC que utilizam uma CA privada ou autoassinada. Deixe em branco para utilizar o repositório de confiança do sistema.",
|
||
"removeOidc": "Remover",
|
||
"usersCount": "{{count}} utilizadores",
|
||
"createUser": "Criar",
|
||
"newRole": "Nova função",
|
||
"roleName": "Nome",
|
||
"roleDisplayName": "Nome de exibição",
|
||
"roleDescription": "Descrição",
|
||
"rolesCount": "{{count}} funções",
|
||
"createRole": "Criar",
|
||
"creating": "A criar...",
|
||
"exportDatabase": "Exportar Base de Dados",
|
||
"exportDatabaseDesc": "Transferir uma cópia de segurança de todos os hosts, credenciais e definições",
|
||
"export": "Exportar",
|
||
"exporting": "A exportar...",
|
||
"importDatabase": "Importar Base de Dados",
|
||
"importDatabaseDesc": "Restaurar a partir de um ficheiro de cópia de segurança .sqlite",
|
||
"importDatabaseSelected": "Selecionado: {{name}}",
|
||
"selectFile": "Selecionar Ficheiro",
|
||
"changeFile": "Alterar",
|
||
"import": "Importar",
|
||
"importing": "A importar...",
|
||
"apiKeysCount": "{{count}} chaves",
|
||
"apiKeysDocsLink": "Ver docs",
|
||
"newApiKey": "Nova Chave API",
|
||
"apiKeyCreatedWarning": "Chave criada - copie-a agora, não será mostrada novamente.",
|
||
"apiKeyName": "Nome",
|
||
"apiKeyUser": "Utilizador",
|
||
"apiKeySelectUser": "Selecionar um utilizador...",
|
||
"apiKeyExpiresAt": "Expira em",
|
||
"createKey": "Criar Chave",
|
||
"apiKeyNoExpiry": "Sem expiração",
|
||
"revokedBadge": "REVOGADA",
|
||
"authTypeDual": "Autenticação Dupla",
|
||
"authTypeOidc": "OIDC",
|
||
"authTypeLocal": "Local",
|
||
"adminStatusAdministrator": "Administrador",
|
||
"adminStatusRegularUser": "Utilizador Regular",
|
||
"adminBadge": "ADMIN",
|
||
"systemBadge": "SYS",
|
||
"customBadge": "PERSONALIZADO",
|
||
"youBadge": "VOCÊ",
|
||
"sessionsActive": "{{count}} ativas",
|
||
"sessionActive": "Ativa: {{time}}",
|
||
"sessionExpires": "Exp: {{time}}",
|
||
"revokeAll": "Todas",
|
||
"revokeAllSessionsSuccess": "Todas as sessões do utilizador foram revogadas.",
|
||
"revokeAllSessionsFailed": "Falha ao revogar sessões",
|
||
"revokeSessionFailed": "Falha ao revogar a sessão",
|
||
"addRole": "Adicionar função",
|
||
"noCustomRoles": "Nenhuma função personalizada definida.",
|
||
"removeRoleFailed": "Falha ao remover a função",
|
||
"assignRoleFailed": "Falha ao atribuir a função",
|
||
"deleteRoleFailed": "Falha ao eliminar a função",
|
||
"userAdminAccess": "Administrador",
|
||
"userAdminAccessDesc": "Acesso total a todas as definições de administrador.",
|
||
"userRoles": "Funções",
|
||
"revokeAllUserSessions": "Revogar todas as sessões",
|
||
"revokeAllUserSessionsDesc": "Forçar novo início de sessão em todos os dispositivos.",
|
||
"revoke": "Revogar",
|
||
"deleteUserWarning": "A eliminação deste utilizador é permanente.",
|
||
"deleteUser": "Eliminar {{username}}",
|
||
"deleting": "A eliminar...",
|
||
"deleteUserFailed": "Falha ao eliminar o utilizador",
|
||
"deleteUserSuccess": "Utilizador \"{{username}}\" eliminado.",
|
||
"deleteRoleSuccess": "Função \"{{name}}\" eliminada.",
|
||
"revokeKeySuccess": "Chave \"{{name}}\" revogada.",
|
||
"revokeKeyFailed": "Falha ao revogar a chave",
|
||
"copiedToClipboard": "Copiado para a área de transferência.",
|
||
"done": "Concluído",
|
||
"createUserTitle": "Criar Utilizador",
|
||
"createUserDesc": "Criar uma nova conta local.",
|
||
"createUserUsername": "Nome de utilizador",
|
||
"createUserPassword": "Palavra-passe",
|
||
"createUserPasswordHint": "Mínimo 6 caracteres.",
|
||
"createUserEnterUsername": "Introduzir nome de utilizador",
|
||
"createUserEnterPassword": "Introduzir palavra-passe",
|
||
"createUserSubmit": "Criar Utilizador",
|
||
"editUserTitle": "Gerir Utilizador: {{username}}",
|
||
"editUserDesc": "Editar funções, estado de administrador, sessões e definições da conta.",
|
||
"editUserUsername": "Nome de utilizador",
|
||
"editUserAuthType": "Tipo de autenticação",
|
||
"editUserAdminStatus": "Estado de administrador",
|
||
"editUserUserId": "ID de utilizador",
|
||
"linkAccountTitle": "Associar contas",
|
||
"linkAccountDesc": "Fundir a conta OIDC {{username}} com uma conta local existente.",
|
||
"linkAccountDescLocal": "Associar uma conta local {{username}} a uma conta exclusivamente OIDC existente.",
|
||
"linkAccountWarningTitle": "Isto irá:",
|
||
"linkAccountEffect1": "Eliminar a conta exclusivamente OIDC",
|
||
"linkAccountEffect2": "Adicionar início de sessão OIDC à conta de destino",
|
||
"linkAccountEffect3": "Permitir início de sessão por OIDC e palavra-passe",
|
||
"linkAccountTargetUsername": "Nome de utilizador da conta local",
|
||
"linkAccountTargetPlaceholder": "Introduza o nome de utilizador da conta local a associar",
|
||
"linkAccountOidcUsername": "Nome de utilizador da conta OIDC",
|
||
"linkAccountOidcPlaceholder": "Introduza o nome de utilizador da conta exclusivamente OIDC a fundir",
|
||
"linkAccountOidcNotFound": "Nenhuma conta exclusivamente OIDC encontrada com esse nome de utilizador",
|
||
"linkAccounts": "Associar contas",
|
||
"linkAccountSuccess": "Contas associadas com sucesso",
|
||
"linkAccountFailed": "Falha ao associar contas",
|
||
"linkAccountInProgress": "A associar...",
|
||
"unlinkAccountTitle": "Desassociar OIDC",
|
||
"unlinkAccountDesc": "Remover a autenticação OIDC de {{username}}. Poderá iniciar sessão apenas com a sua palavra-passe.",
|
||
"unlinkAccountWarning": "Isto irá remover o início de sessão OIDC desta conta. O utilizador deve ter uma palavra-passe definida para continuar a iniciar sessão.",
|
||
"unlinkAccount": "Desassociar OIDC",
|
||
"unlinkAccountInProgress": "A desassociar...",
|
||
"unlinkAccountSuccess": "OIDC desassociado com sucesso",
|
||
"unlinkAccountFailed": "Falha ao desassociar OIDC",
|
||
"saving": "A guardar...",
|
||
"updateRegistrationFailed": "Falha ao atualizar a definição de registo",
|
||
"updatePasswordLoginFailed": "Falha ao atualizar a definição de início de sessão por palavra-passe",
|
||
"cannotDisablePasswordLoginWithTotp": "Não é possível desativar o início de sessão por palavra-passe enquanto a 2FA estiver ativa para um ou mais utilizadores. Desative a 2FA primeiro.",
|
||
"updateOidcAutoProvisionFailed": "Falha ao atualizar a definição de provisionamento automático OIDC",
|
||
"updateOidcSilentLoginDefaultFailed": "Falha ao atualizar a definição de início de sessão silencioso OIDC",
|
||
"updatePasswordResetFailed": "Falha ao atualizar a definição de reposição de palavra-passe",
|
||
"sessionTimeoutRange2": "O tempo limite da sessão deve estar entre 1 e 720 horas",
|
||
"sessionTimeoutSaved": "Timeout da sessão guardado",
|
||
"sessionTimeoutSaveFailed": "Falha ao guardar timeout da sessão",
|
||
"monitoringIntervalInvalid": "Valores de intervalo inválidos",
|
||
"monitoringSaved": "Definições de monitorização guardadas",
|
||
"monitoringSaveFailed": "Falha ao guardar definições de monitorização",
|
||
"metricsHistoryRetention": "Retenção do histórico de métricas",
|
||
"metricsHistoryRetentionRange": "1 a 90 dias",
|
||
"days": "dias",
|
||
"guacamoleSaved": "Definições do Guacamole guardadas",
|
||
"guacamoleSaveFailed": "Falha ao guardar definições do Guacamole",
|
||
"guacamoleUpdateFailed": "Falha ao atualizar definição do Guacamole",
|
||
"tailscaleSettingsSaved": "Definições do Tailscale guardadas",
|
||
"tailscaleSettingsSaveFailed": "Falha ao guardar definições do Tailscale",
|
||
"logLevelUpdateFailed": "Falha ao atualizar nível de registo",
|
||
"oidcSaved": "Configuração OIDC guardada",
|
||
"oidcSaveFailed": "Falha ao guardar configuração OIDC",
|
||
"oidcRemoved": "Configuração OIDC removida",
|
||
"oidcRemoveFailed": "Falha ao remover configuração OIDC",
|
||
"createUserRequired": "Nome de utilizador e palavra-passe são obrigatórios",
|
||
"createUserPasswordTooShort": "A palavra-passe deve ter pelo menos 6 caracteres",
|
||
"createUserSuccess": "Utilizador \"{{username}}\" criado",
|
||
"createUserFailed": "Falha ao criar utilizador",
|
||
"updateAdminStatusFailed": "Falha ao atualizar estado de administrador",
|
||
"allSessionsRevoked": "Todas as sessões revogadas",
|
||
"revokeSessionsFailed": "Falha ao revogar sessões",
|
||
"manageUserData": "Gerir dados do utilizador",
|
||
"backToUsers": "Voltar aos utilizadores",
|
||
"manageTabAccount": "Conta",
|
||
"manageTabHosts": "Máquinas",
|
||
"manageTabCredentials": "Credenciais",
|
||
"manageTabSnippets": "Snippets",
|
||
"manageTabSessions": "Sessões",
|
||
"manageTabDanger": "Perigo",
|
||
"manageEditorBack": "Voltar aos dados de {{username}}",
|
||
"dataLockedBadge": "BLOQUEADO",
|
||
"dataLockedNotice": "Os dados de {{username}} permanecem bloqueados até ao próximo início de sessão. As suas máquinas, credenciais e fragmentos não podem ser visualizados nem editados até lá.",
|
||
"resetPasswordTitle": "Redefinir palavra-passe",
|
||
"resetPasswordOidcOnly": "Este utilizador autentica-se através de um fornecedor externo e não tem palavra-passe.",
|
||
"resetPasswordPlaceholder": "Nova palavra-passe",
|
||
"resetPasswordBtn": "Redefinir",
|
||
"resetPasswordWorking": "A redefinir...",
|
||
"resetPasswordSuccess": "Palavra-passe redefinida",
|
||
"resetPasswordSuccessWiped": "Palavra-passe redefinida. Os dados encriptados do utilizador foram eliminados.",
|
||
"resetPasswordFailed": "Falha ao redefinir a palavra-passe",
|
||
"resetPasswordConfirmWipe": "{{username}} não iniciou sessão desde a atualização da encriptação, pelo que os seus dados não podem ser recuperados. Redefinir agora eliminará as suas máquinas, credenciais e fragmentos. Continuar?",
|
||
"totpSectionTitle": "Autenticação de dois fatores",
|
||
"totpStatusEnabled": "TOTP está ativado para este utilizador",
|
||
"totpStatusDisabled": "TOTP não está ativado para este utilizador",
|
||
"disableTotp": "Desativar",
|
||
"disableTotpConfirm": "Desativar a autenticação de dois fatores para {{username}}? Poderá iniciar sessão apenas com a sua palavra-passe.",
|
||
"totpDisabledSuccess": "TOTP desativado",
|
||
"totpDisableFailed": "Falha ao desativar TOTP",
|
||
"manageApiKeys": "Chaves de API",
|
||
"apiKeyNamePlaceholder": "Nome da chave",
|
||
"apiKeyCopyNotice": "Copie esta chave agora, não será mostrada novamente.",
|
||
"noApiKeysForUser": "Sem chaves de API",
|
||
"apiKeyDeleteFailed": "Falha ao eliminar a chave de API",
|
||
"exportUserData": "Exportação de dados",
|
||
"exportUserDataDesc": "Descarregar as máquinas, credenciais e dados do gestor de ficheiros deste utilizador como JSON. Os segredos são desencriptados.",
|
||
"exportUserDataSuccess": "Dados do utilizador exportados",
|
||
"exportUserDataFailed": "Falha ao exportar os dados do utilizador",
|
||
"hostsCount": "{{count}} máquinas",
|
||
"addHostForUser": "Adicionar máquina",
|
||
"noHostsForUser": "Este utilizador não tem máquinas",
|
||
"connectToHost": "Ligar",
|
||
"deleteHostConfirm": "Eliminar a máquina \"{{name}}\" pertencente a {{username}}?",
|
||
"hostDeletedSuccess": "Máquina eliminada",
|
||
"hostDeleteFailed": "Falha ao eliminar a máquina",
|
||
"credentialsCount": "{{count}} credenciais",
|
||
"addCredentialForUser": "Adicionar credencial",
|
||
"noCredentialsForUser": "Este utilizador não tem credenciais",
|
||
"deleteCredentialConfirm": "Eliminar credencial \"{{name}}\" de {{username}}?",
|
||
"credentialDeletedSuccess": "Credencial eliminada",
|
||
"credentialDeleteFailed": "Falha ao eliminar credencial",
|
||
"snippetsCount": "{{count}} snippets",
|
||
"addSnippetForUser": "Adicionar snippet",
|
||
"noSnippetsForUser": "Este utilizador não tem snippets",
|
||
"snippetRequiredFields": "O nome e o conteúdo do snippet são obrigatórios",
|
||
"snippetNamePlaceholder": "Nome do snippet",
|
||
"snippetContentPlaceholder": "Conteúdo do comando",
|
||
"snippetFolderPlaceholder": "Pasta (opcional)",
|
||
"snippetSaved": "Snippet guardado",
|
||
"snippetSaveFailed": "Falha ao guardar snippet",
|
||
"deleteSnippetConfirm": "Eliminar snippet \"{{name}}\" de {{username}}?",
|
||
"snippetDeletedSuccess": "Snippet eliminado",
|
||
"snippetDeleteFailed": "Falha ao eliminar snippet",
|
||
"noSessionsForUser": "Sem sessões ativas",
|
||
"deleteUserDangerDesc": "Eliminar permanentemente {{username}} e todos os seus dados (hosts, credenciais, snippets, histórico). Esta ação não pode ser desfeita.",
|
||
"deleteUserConfirm": "Eliminar permanentemente {{username}} e todos os seus dados?",
|
||
"deleteUserAdminBlocked": "Remova o estatuto de administrador antes de eliminar este utilizador.",
|
||
"createRoleRequired": "O nome e o nome de exibição são obrigatórios",
|
||
"createRoleSuccess": "Função \"{{name}}\" criada",
|
||
"createRoleFailed": "Falha ao criar função",
|
||
"apiKeyNameRequired": "O nome da chave é obrigatório",
|
||
"apiKeyUserRequired": "O ID do utilizador é obrigatório",
|
||
"apiKeyCreatedSuccess": "Chave de API \"{{name}}\" criada",
|
||
"apiKeyCreateFailed": "Falha ao criar chave de API",
|
||
"exportSuccess": "Base de dados exportada com sucesso",
|
||
"exportFailed": "Falha na exportação da base de dados",
|
||
"importSelectFile": "Selecione um ficheiro primeiro",
|
||
"importCompleted": "Importação concluída: {{total}} itens importados, {{skipped}} ignorados",
|
||
"importFailed": "Importação falhou: {{error}}",
|
||
"importError": "Falha na importação da base de dados",
|
||
"sectionHostDefaults": "Predefinições de Host",
|
||
"hostDefaultsDesc": "Definições aplicadas automaticamente ao criar um novo host. Os hosts individuais podem substituí-las.",
|
||
"hostDefaultsSocks5": "Proxy SOCKS5",
|
||
"hostDefaultsUseSocks5": "Ativar Proxy SOCKS5",
|
||
"hostDefaultsUseSocks5Desc": "Preencher automaticamente o proxy SOCKS5 em todos os novos hosts",
|
||
"hostDefaultsSocks5Host": "Host / Porta do proxy",
|
||
"hostDefaultsSocks5Username": "Nome de utilizador do proxy",
|
||
"hostDefaultsSocks5Password": "Palavra-passe do proxy",
|
||
"hostDefaultsMetrics": "Métricas do Host",
|
||
"hostDefaultsMetricsEnabled": "Ativar Métricas",
|
||
"hostDefaultsMetricsEnabledDesc": "Recolher CPU, memória e outras estatísticas nos novos hosts por predefinição",
|
||
"hostDefaultsStatusCheckEnabled": "Ativar Verificação de Estado",
|
||
"hostDefaultsStatusCheckEnabledDesc": "Consultar o estado online/offline nos novos hosts por predefinição",
|
||
"hostDefaultsTerminal": "Terminal",
|
||
"hostDefaultsSessionLogging": "Registo de Sessão",
|
||
"hostDefaultsSessionLoggingDesc": "Gravar sessões de terminal nos novos hosts por predefinição",
|
||
"hostDefaultsCommandHistory": "Histórico de Comandos",
|
||
"hostDefaultsCommandHistoryDesc": "Acompanhar o histórico de comandos nos novos hosts por predefinição",
|
||
"hostDefaultsSaved": "Predefinições do host guardadas",
|
||
"hostDefaultsSaveFailed": "Falha ao guardar as predefinições do host",
|
||
"rolePermissions": {
|
||
"count": "{{count}} permissões",
|
||
"editAction": "Editar permissões",
|
||
"loadError": "Falha ao carregar o catálogo de permissões",
|
||
"saved": "Permissões do cargo guardadas",
|
||
"saveError": "Falha ao guardar as permissões do cargo",
|
||
"save": "Guardar",
|
||
"saving": "A guardar..."
|
||
}
|
||
},
|
||
"newUi": {
|
||
"sidebar": {
|
||
"quickConnect": {
|
||
"hostLabel": "Host",
|
||
"hostPlaceholder": "192.168.1.1 or example.com",
|
||
"portLabel": "Porta",
|
||
"portPlaceholder": "22",
|
||
"usernameLabel": "Nome de utilizador",
|
||
"usernamePlaceholder": "utilizador",
|
||
"authLabel": "Autenticação",
|
||
"passwordLabel": "Palavra-passe",
|
||
"passwordPlaceholder": "palavra-passe",
|
||
"privateKeyLabel": "Chave Privada",
|
||
"privateKeyPlaceholder": "Colar chave privada...",
|
||
"credentialLabel": "Credencial",
|
||
"credentialPlaceholder": "Selecionar uma credencial guardada",
|
||
"connectToTerminal": "Ligar ao Terminal",
|
||
"connectToFiles": "Ligar aos Ficheiros"
|
||
},
|
||
"history": {
|
||
"noTerminalSelected": "Nenhum terminal selecionado",
|
||
"noTerminalSelectedHint": "Abra um separador de terminal SSH para ver o histórico de comandos",
|
||
"searchPlaceholder": "Pesquisar histórico...",
|
||
"clearAll": "Limpar Tudo",
|
||
"noHistoryEntries": "Sem entradas no histórico",
|
||
"trackingDisabled": "O rastreio do histórico está desativado",
|
||
"trackingDisabledHint": "Ative-o nas definições do terminal do anfitrião."
|
||
},
|
||
"sshTools": {
|
||
"keyRecordingTitle": "Gravação de Teclas",
|
||
"recordToTerminals": "Gravar para terminais",
|
||
"selectAll": "Todos",
|
||
"selectNone": "Nenhum",
|
||
"noTerminalTabsOpen": "Nenhum separador de terminal aberto",
|
||
"selectTerminalsAbove": "Selecionar terminais acima",
|
||
"broadcastInputPlaceholder": "Digite aqui para difundir as teclas premidas...",
|
||
"fillPassword": "Preencher palavra-passe",
|
||
"fillPasswordSuccess": "Palavra-passe preenchida em {{count}} terminal(is)",
|
||
"fillPasswordMissing": "Nenhuma palavra-passe guardada para {{count}} terminal(is) selecionado(s)",
|
||
"stopRecording": "Parar Gravação",
|
||
"startRecording": "Iniciar Gravação",
|
||
"settingsTitle": "Definições",
|
||
"enableRightClickCopyPaste": "Ativar copiar/colar com clique direito"
|
||
},
|
||
"splitScreen": {
|
||
"layoutTitle": "Esquema",
|
||
"selectLayoutAbove": "Selecionar um esquema acima",
|
||
"selectLayoutHint": "Escolha quantos painéis mostrar",
|
||
"panesTitle": "Painéis",
|
||
"openTabsTitle": "Separadores abertos",
|
||
"dragTabsHint": "Arraste os separadores para os painéis acima ou use Atribuição Rápida",
|
||
"dropHere": "Largar aqui",
|
||
"emptyPane": "Vazio",
|
||
"dashboard": "Painel",
|
||
"clearSplitScreen": "Limpar Ecrã Dividido",
|
||
"quickAssign": "Atribuição Rápida",
|
||
"alreadyAssigned": "Painel {{index}}",
|
||
"splitTab": "Dividir Separador",
|
||
"addToSplit": "Adicionar à Divisão",
|
||
"removeFromSplit": "Remover da Divisão",
|
||
"assignToPane": "Atribuir ao painel",
|
||
"hotkeysTitle": "Atalhos de Teclado",
|
||
"hotkeysSplitRight": "Alternar divisão de 2 painéis",
|
||
"hotkeysSplitBelow": "Alternar divisão de 3 painéis",
|
||
"hotkeysNavigatePane": "Navegar entre painéis",
|
||
"hotkeysNextTab": "Separador seguinte",
|
||
"hotkeysPrevTab": "Separador anterior"
|
||
},
|
||
"snippets": {
|
||
"title": "Fragmentos",
|
||
"createSnippetTitle": "Criar Fragmento",
|
||
"createSnippetDescription": "Criar um novo fragmento de comando para execução rápida",
|
||
"nameLabel": "Nome",
|
||
"namePlaceholder": "p. ex., Reiniciar Nginx",
|
||
"descriptionLabel": "Descrição",
|
||
"descriptionPlaceholder": "Descrição opcional",
|
||
"optional": "Opcional",
|
||
"folderLabel": "Pasta",
|
||
"noFolder": "Sem pasta (Não categorizado)",
|
||
"commandLabel": "Comando",
|
||
"commandPlaceholder": "p. ex., sudo systemctl restart nginx",
|
||
"cancel": "Cancelar",
|
||
"createSnippetButton": "Criar Fragmento",
|
||
"createFolderTitle": "Criar Pasta",
|
||
"createFolderDescription": "Organize os seus fragmentos em pastas",
|
||
"folderNameLabel": "Nome da Pasta",
|
||
"folderNamePlaceholder": "p. ex., Comandos de Sistema, Scripts Docker",
|
||
"folderColorLabel": "Cor da Pasta",
|
||
"folderIconLabel": "Ícone da Pasta",
|
||
"previewLabel": "Pré-visualização",
|
||
"folderNameFallback": "Nome da Pasta",
|
||
"createFolderButton": "Criar Pasta",
|
||
"targetTerminals": "Terminais de Destino",
|
||
"selectAll": "Todos",
|
||
"selectNone": "Nenhum",
|
||
"noTerminalTabsOpen": "Nenhum separador de terminal aberto",
|
||
"searchPlaceholder": "Pesquisar snippets...",
|
||
"newSnippet": "Novo Snippet",
|
||
"newFolder": "Nova Pasta",
|
||
"run": "Executar",
|
||
"noSnippetsInFolder": "Nenhum snippet nesta pasta",
|
||
"uncategorized": "Sem categoria",
|
||
"editSnippetTitle": "Editar Snippet",
|
||
"editSnippetDescription": "Atualizar este snippet de comando",
|
||
"saveSnippetButton": "Guardar Alterações",
|
||
"createSuccess": "Snippet criado com sucesso",
|
||
"createFailed": "Falha ao criar snippet",
|
||
"updateSuccess": "Snippet atualizado com sucesso",
|
||
"updateFailed": "Falha ao atualizar snippet",
|
||
"deleteFailed": "Falha ao eliminar snippet",
|
||
"folderCreateSuccess": "Pasta criada com sucesso",
|
||
"folderCreateFailed": "Falha ao criar pasta",
|
||
"editFolderTitle": "Editar Pasta",
|
||
"editFolderDescription": "Renomear ou alterar a aparência desta pasta",
|
||
"saveFolderButton": "Guardar Alterações",
|
||
"editFolder": "Editar pasta",
|
||
"deleteFolder": "Eliminar pasta",
|
||
"folderDeleteSuccess": "Pasta \"{{name}}\" eliminada",
|
||
"folderDeleteFailed": "Falha ao eliminar pasta",
|
||
"folderEditSuccess": "Pasta atualizada com sucesso",
|
||
"folderEditFailed": "Falha ao atualizar pasta",
|
||
"confirmRunMessage": "Executar \"{{name}}\"?",
|
||
"confirmRunButton": "Executar",
|
||
"runSuccess": "Executado \"{{name}}\" em {{count}} terminal(is)",
|
||
"copySuccess": "Copiado \"{{name}}\" para a área de transferência",
|
||
"shareTitle": "Partilhar Snippet",
|
||
"shareUser": "Utilizador",
|
||
"shareRole": "Função",
|
||
"selectUser": "Selecionar um utilizador...",
|
||
"selectRole": "Selecionar uma função...",
|
||
"shareSuccess": "Fragmento partilhado com sucesso",
|
||
"shareFailed": "Falha ao partilhar fragmento",
|
||
"revokeSuccess": "Acesso revogado",
|
||
"revokeFailed": "Falha ao revogar acesso",
|
||
"currentAccess": "Acesso Atual",
|
||
"shareLoadError": "Falha ao carregar dados de partilha",
|
||
"loading": "A carregar...",
|
||
"close": "Fechar",
|
||
"reorderFailed": "Falha ao guardar ordem dos fragmentos",
|
||
"importExport": "Importar / Exportar",
|
||
"exportBtn": "Exportar JSON",
|
||
"importBtn": "Importar JSON",
|
||
"exportSuccess": "Fragmentos exportados com sucesso",
|
||
"exportFailed": "Falha ao exportar fragmentos",
|
||
"importTitle": "Importar Fragmentos",
|
||
"importDescription": "Importar fragmentos e pastas de um ficheiro JSON exportado pelo Termix",
|
||
"importDropOrClick": "Arraste um ficheiro JSON aqui ou clique para procurar",
|
||
"importSelectedFile": "Selecionado: {{name}}",
|
||
"importOverwrite": "Substituir fragmentos existentes com o mesmo nome e pasta",
|
||
"importStartBtn": "Importar",
|
||
"importSuccess": "Importação concluída: {{snippets}} fragmento(s) adicionado(s), {{updated}} atualizado(s), {{skipped}} ignorado(s), {{folders}} pasta(s) adicionada(s)",
|
||
"importFailed": "Falha ao importar fragmentos",
|
||
"importInvalidFile": "Ficheiro inválido: esperado um objeto JSON com arrays de fragmentos ou pastas",
|
||
"targetHostsLabel": "Máquinas de Destino",
|
||
"targetHostsHint": "Atribuir máquinas para executar este fragmento diretamente sem um terminal aberto.",
|
||
"noHostsAvailable": "Nenhuma máquina configurada",
|
||
"clearTargetHosts": "Limpar tudo",
|
||
"hasTargetHosts": "Possui máquinas de destino",
|
||
"runOnTargets": "Executar nos Destinos",
|
||
"directRunSuccess": "Executou \"{{name}}\" em {{count}} máquina(s)",
|
||
"directRunPartialFail": "\"{{name}}\" falhou numa ou mais máquinas",
|
||
"executionResultTitle": "Resultados da Execução: {{name}}",
|
||
"executionResultDescription": "Saída da execução do fragmento em cada host de destino.",
|
||
"executionSuccess": "Sucesso",
|
||
"executionFailed": "Falhou"
|
||
},
|
||
"keybindings": {
|
||
"title": "Atalhos de teclado",
|
||
"description": "Personalize os atalhos de copiar, colar e controlar o terminal, ou associe teclas para enviar texto ou executar um trecho de código.",
|
||
"defaultsHeading": "Atalhos integrados",
|
||
"customHeading": "Atalhos personalizados",
|
||
"addBinding": "Adicionar atalho",
|
||
"addBindingTitle": "Adicionar atalho",
|
||
"editBindingTitle": "Atalho para edição",
|
||
"loading": "Carregando...",
|
||
"noCustomBindings": "Ainda não existem atalhos personalizados.",
|
||
"defaultBadge": "Predefinição",
|
||
"customizedBadge": "Personalizado",
|
||
"customize": "Personalizar",
|
||
"resetToDefault": "Restaurar para as definições padrão",
|
||
"resetAllToDefaults": "Repor tudo para os valores de fábrica",
|
||
"close": "Perto",
|
||
"cancel": "Cancelar",
|
||
"saveBinding": "Atalho para guardar",
|
||
"saveError": "Falha ao guardar os atalhos de teclado.",
|
||
"pressKeysToRecord": "Combinação de teclas",
|
||
"pressKeysPlaceholder": "Clique e pressione as teclas.",
|
||
"recording": "Pressione as teclas...",
|
||
"comboRequiredError": "Pressione primeiro uma combinação de teclas",
|
||
"textRequiredError": "Introduza o texto que pretende enviar.",
|
||
"controlCodeRequiredError": "Introduza uma única letra para o código de controlo.",
|
||
"snippetRequiredError": "Selecione um excerto",
|
||
"conflictWarning": "Esta combinação já está ligada a {{combo}}. Guardar fará com que ambas disparem.",
|
||
"actionLabel": "Ação",
|
||
"actionCopy": "Copiar seleção",
|
||
"actionPaste": "Colar",
|
||
"actionSendControlCode": "Enviar sinal Ctrl+letra",
|
||
"actionSendText": "Enviar mensagem de texto",
|
||
"actionRunSnippet": "Executar excerto de código existente",
|
||
"controlCodeLabel": "Carta",
|
||
"textLabel": "Texto a enviar",
|
||
"appendEnterLabel": "Prima Enter após enviar",
|
||
"snippetLabel": "Trecho",
|
||
"selectSnippetPlaceholder": "Selecione um excerto",
|
||
"orphanedSnippetWarning": "trecho não encontrado",
|
||
"clipboardPermissionNote": "Pode solicitar permissão para aceder à área de transferência na primeira utilização em alguns navegadores."
|
||
},
|
||
"userProfile": {
|
||
"donateTitle": "Mantenha o Termix ativo",
|
||
"donateDescription": "O Termix é gratuito, auto-hospedado e desenvolvido por apenas algumas pessoas no seu tempo livre. Se lhe poupou tempo ou dinheiro, uma doação em criptomoeda ajuda a mantê-lo a funcionar.",
|
||
"donateMilestones": "As doações ajudam a financiar o tempo para investigar e aprender o que é necessário para implementar suporte para SAML, Kubernetes e Agente. Veja o progresso e doe.",
|
||
"donateButton": "Doar criptomoeda",
|
||
"storageModeLocal": "Navegador",
|
||
"storageModeCloud": "Base de Dados",
|
||
"storageModeDescription": "O navegador guarda as definições apenas neste navegador. A base de dados sincroniza com o servidor e carrega em qualquer dispositivo.",
|
||
"resetToDefaults": "Repor Predefinições",
|
||
"resetToDefaultsSuccess": "Definições repostas para as predefinições.",
|
||
"storageModeSwitch": "Armazenamento de Preferências",
|
||
"sectionAccount": "Conta",
|
||
"desktopProfileTitle": "Perfil de área de trabalho local automático",
|
||
"desktopProfileDescription": "Este perfil está restrito ao backend integrado e o login é automático. Não possui password de login; a Sincronização Remota abaixo utiliza uma conta de servidor separada.",
|
||
"sectionAppearance": "Aparência",
|
||
"sectionSecurity": "Segurança",
|
||
"sectionApiKeys": "Chaves API",
|
||
"sectionData": "Dados",
|
||
"sectionC2sTunnels": "Túneis C2S",
|
||
"usernameLabel": "Nome de utilizador",
|
||
"roleLabel": "Função",
|
||
"roleAdministrator": "Administrador",
|
||
"authMethodLabel": "Método de Autenticação",
|
||
"authMethodLocal": "Local",
|
||
"twoFaLabel": "2FA",
|
||
"twoFaOn": "Ativado",
|
||
"twoFaOff": "Desativado",
|
||
"versionLabel": "Versão",
|
||
"betaProgramTitle": "Programa Beta",
|
||
"betaProgramDescription": "Experimente novas funcionalidades antecipadamente com a tag Docker semanal :beta. Instável, não para produção.",
|
||
"betaProgramFeedback": "Encontrou um bug? Reporte-o aqui.",
|
||
"betaProgramLearnMore": "Saber Mais",
|
||
"deleteAccount": "Eliminar Conta",
|
||
"deleteAccountDescription": "Eliminar permanentemente a sua conta",
|
||
"changeServerDescription": "Mudar para um servidor de backend Termix diferente",
|
||
"deleteButton": "Eliminar",
|
||
"deleteAccountPermanent": "Esta ação é permanente e não pode ser anulada.",
|
||
"deleteAccountWarning": "Todas as sessões, anfitriões, credenciais e configurações serão permanentemente eliminadas.",
|
||
"confirmPasswordDeletePlaceholder": "Introduza a sua palavra-passe para confirmar",
|
||
"languageLabel": "Idioma",
|
||
"themeLabel": "Tema",
|
||
"fontSizeLabel": "Tamanho da fonte",
|
||
"accentColorLabel": "Cor de destaque",
|
||
"settingsTerminal": "Terminal",
|
||
"commandAutocomplete": "Autocompletar comandos",
|
||
"commandAutocompleteDesc": "Mostrar autocompletamento durante a digitação",
|
||
"keyboardShortcuts": "Atalhos de teclado",
|
||
"keyboardShortcutsDescription": "Personalize os atalhos de copiar, colar e os comandos do terminal.",
|
||
"manageShortcuts": "Gerir",
|
||
"terminalLinkBehavior": "Clique em links do terminal",
|
||
"terminalLinkBehaviorDesc": "Comportamento predefinido ao clicar em links no terminal",
|
||
"historyTracking": "Registo de histórico",
|
||
"historyTrackingDesc": "Registar comandos do terminal",
|
||
"commandPalette": "Paleta de Comandos",
|
||
"commandPaletteDesc": "Ativar atalho de teclado",
|
||
"reopenTabsOnLogin": "Reabrir separadores ao iniciar sessão",
|
||
"reopenTabsOnLoginDesc": "Restaurar os separadores abertos ao iniciar sessão ou atualizar a página, mesmo a partir de outro dispositivo",
|
||
"confirmTabClose": "Confirmar fecho de separador",
|
||
"confirmTabCloseDesc": "Perguntar antes de fechar separadores do terminal",
|
||
"settingsSidebar": "Barra lateral",
|
||
"showHostTags": "Mostrar etiquetas de anfitrião",
|
||
"showHostTagsDesc": "Apresentar etiquetas na lista de anfitriões",
|
||
"hostTrayOnClick": "Clicar para expandir ações do anfitrião",
|
||
"hostTrayOnClickDesc": "Mostrar sempre os botões de ligação; clicar para expandir as opções de gestão em vez de passar o rato",
|
||
"compactHostView": "Vista compacta de anfitriões",
|
||
"compactHostViewDesc": "Reduzir cada anfitrião a uma única linha mostrando apenas o nome e o endereço",
|
||
"statusColors": "Cores de estado reais",
|
||
"statusColorsDesc": "Usar verde/vermelho para estado online/offline em vez da cor de destaque",
|
||
"pinAppRail": "Fixar barra de aplicações",
|
||
"pinAppRailDesc": "Manter a barra de aplicações da barra lateral esquerda sempre expandida em vez de expandir ao passar o rato",
|
||
"openFullscreenSettings": "Abrir definições em tela cheia",
|
||
"exitFullscreenSettings": "Sair do modo de ecrã inteiro",
|
||
"expandAppRailOnHover": "Expandir barra de aplicações ao passar o rato",
|
||
"expandAppRailOnHoverDesc": "Permitir que a barra de aplicações da barra lateral esquerda se expanda quando o ponteiro passa sobre ela",
|
||
"settingsNavigation": "Navegação",
|
||
"navigationTabsDesc": "Escolha quais separadores aparecem na barra lateral da aplicação",
|
||
"settingsSnippets": "Fragmentos",
|
||
"foldersCollapsed": "Pastas recolhidas",
|
||
"foldersCollapsedDesc": "Recolher pastas por predefinição",
|
||
"confirmExecution": "Confirmar execução",
|
||
"confirmExecutionDesc": "Confirmar antes de executar fragmentos",
|
||
"settingsUpdates": "Atualizações",
|
||
"disableUpdateChecks": "Desativar verificações de atualizações",
|
||
"disableUpdateChecksDesc": "Parar de verificar atualizações",
|
||
"totpAuthenticator": "Autenticador TOTP",
|
||
"totpEnabled": "2FA está ativada",
|
||
"totpDisabled": "Adicionar segurança extra de início de sessão",
|
||
"disable": "Desativar",
|
||
"enable": "Ativar",
|
||
"setupTotp": "Configurar TOTP",
|
||
"qrCode": "Código QR",
|
||
"totpInstructions": "Leia o código QR ou introduza o segredo na sua aplicação autenticadora e depois introduza o código de 6 dígitos",
|
||
"totpCodePlaceholder": "000000",
|
||
"verify": "Verificar",
|
||
"changePassword": "Alterar palavra-passe",
|
||
"currentPasswordLabel": "Palavra-passe atual",
|
||
"currentPasswordPlaceholder": "Palavra-passe atual",
|
||
"newPasswordLabel": "Nova palavra-passe",
|
||
"newPasswordPlaceholder": "Nova palavra-passe",
|
||
"confirmPasswordLabel": "Confirmar nova palavra-passe",
|
||
"confirmPasswordPlaceholder": "Confirmar nova palavra-passe",
|
||
"updatePassword": "Atualizar palavra-passe",
|
||
"createApiKeyTitle": "Criar chave API",
|
||
"createApiKeyDescription": "Gerar uma nova chave API para acesso programático.",
|
||
"apiKeyNameLabel": "Nome",
|
||
"apiKeyNamePlaceholder": "ex.: CI Pipeline",
|
||
"expiryDateLabel": "Data de validade",
|
||
"optional": "opcional",
|
||
"cancel": "Cancelar",
|
||
"createKey": "Criar chave",
|
||
"apiKeyCount": "{{count}} chaves",
|
||
"newKey": "Nova Chave",
|
||
"noApiKeys": "Ainda sem chaves de API.",
|
||
"apiKeyActive": "Ativa",
|
||
"apiKeyUsageHint": "Inclua a sua chave no",
|
||
"apiKeyUsageHintHeader": "cabeçalho.",
|
||
"apiKeyPermissionsHint": "As chaves herdam as permissões do utilizador que as criou.",
|
||
"exportData": "Exportar os meus dados",
|
||
"exportDataDesc": "Faça o download de um backup dos seus hosts, credenciais e definições para transferir para outro dispositivo.",
|
||
"export": "Exportar",
|
||
"exporting": "Exportador...",
|
||
"importData": "Importar os meus dados",
|
||
"importDataDesc": "Restaure os seus hosts, credenciais e definições a partir de um ficheiro de cópia de segurança . sqlite.",
|
||
"importDataSelected": "Selecionado: {{name}}",
|
||
"selectFile": "Selecionar ficheiro",
|
||
"changeFile": "Mudar",
|
||
"import": "Importação",
|
||
"importing": "Importando...",
|
||
"exportSuccess": "Dados exportados com sucesso",
|
||
"exportFailed": "A exportação de dados falhou",
|
||
"importSelectFile": "Por favor, selecione primeiro um ficheiro.",
|
||
"importCompleted": "Importação concluída: {{total}} artigos importados, {{skipped}} ignorados",
|
||
"importFailed": "A importação falhou: {{error}}",
|
||
"roleUser": "Utilizador",
|
||
"authMethodDual": "Autenticação Dupla",
|
||
"authMethodOidc": "OIDC",
|
||
"totpSetupFailed": "Falha ao iniciar a configuração de TOTP",
|
||
"totpEnter6Digits": "Insira um código de 6 dígitos",
|
||
"totpEnabledSuccess": "Autenticação de dois fatores ativada",
|
||
"totpInvalidCode": "Código inválido, tente novamente",
|
||
"totpDisableInputRequired": "Insira o seu código TOTP ou palavra-passe",
|
||
"totpDisabledSuccess": "Autenticação de dois fatores desativada",
|
||
"totpDisableFailed": "Falha ao desativar 2FA",
|
||
"totpDisableTitle": "Desativar 2FA",
|
||
"totpDisablePlaceholder": "Insira o código TOTP ou palavra-passe",
|
||
"totpDisableConfirm": "Desativar 2FA",
|
||
"totpContinueVerify": "Continuar para Verificação",
|
||
"totpVerifyTitle": "Verificar Código",
|
||
"totpBackupTitle": "Códigos de Backup",
|
||
"totpDownloadBackup": "Descarregar Códigos de Backup",
|
||
"passkeys": "Passkeys",
|
||
"passkeysDesc": "Utilize credenciais WebAuthn/FIDO2 para iniciar sessão sem palavra-passe",
|
||
"passkeyName": "Nome da passkey",
|
||
"passkeyUvPreferred": "Preferencial",
|
||
"passkeyUvRequired": "Obrigatório",
|
||
"passkeyUvDiscouraged": "Desaconselhado",
|
||
"addPasskey": "Adicionar Passkey",
|
||
"noPasskeys": "Nenhuma passkey registada.",
|
||
"passkeyAdded": "Passkey adicionada",
|
||
"passkeyAddFailed": "Falha ao adicionar passkey",
|
||
"passkeyDeleted": "Passkey eliminada",
|
||
"passkeyDeleteFailed": "Falha ao eliminar chave de acesso",
|
||
"done": "Concluído",
|
||
"secretCopied": "Segredo copiado para a área de transferência",
|
||
"apiKeyNameRequired": "Nome da chave é obrigatório",
|
||
"apiKeyCreated": "Chave de API \"{{name}}\" criada",
|
||
"apiKeyCreateFailed": "Falha ao criar chave de API",
|
||
"apiKeyUser": "Utilizador",
|
||
"apiKeyExpires": "Expira",
|
||
"apiKeyRevoked": "Chave de API \"{{name}}\" revogada",
|
||
"apiKeyRevokeFailed": "Falha ao revogar chave de API",
|
||
"passwordFieldsRequired": "As palavras-passe atual e nova são obrigatórias",
|
||
"passwordMismatch": "As palavras-passe não coincidem",
|
||
"passwordTooShort": "A palavra-passe deve ter pelo menos 6 caracteres",
|
||
"passwordUpdated": "Palavra-passe atualizada com sucesso",
|
||
"passwordUpdateFailed": "Falha ao atualizar palavra-passe",
|
||
"deletePasswordRequired": "É necessária a palavra-passe para eliminar a sua conta",
|
||
"deleteFailed": "Falha ao eliminar conta",
|
||
"deleting": "A eliminar...",
|
||
"colorPickerTooltip": "Abrir seletor de cores",
|
||
"themeSystem": "Sistema",
|
||
"themeLight": "Claro",
|
||
"themeDark": "Escuro",
|
||
"themeDracula": "Dracula",
|
||
"themeCatppuccin": "Catppuccin",
|
||
"themeNord": "Nord",
|
||
"themeSolarized": "Solarized",
|
||
"themeTokyoNight": "Tokyo Night",
|
||
"themeOneDark": "One Dark",
|
||
"themeGruvbox": "Gruvbox"
|
||
}
|
||
}
|
||
},
|
||
"tmuxMonitor": {
|
||
"title": "Monitor Tmux",
|
||
"failedToLoadHosts": "Falha ao carregar anfitriões",
|
||
"failedToLoad": "Falha ao carregar sessões tmux",
|
||
"tmuxUnavailable": "tmux não está instalado neste anfitrião",
|
||
"noSessions": "Sem sessões tmux neste anfitrião",
|
||
"noHostSelected": "Nenhum anfitrião selecionado",
|
||
"attached": "Anexado",
|
||
"detached": "Desanexado",
|
||
"attach": "Anexar",
|
||
"editTags": "Editar etiquetas",
|
||
"tagsHint": "Etiquetas separadas por vírgulas (ex: YOLO, lab, training)",
|
||
"tagsSaved": "Etiquetas guardadas",
|
||
"tagsSaveFailed": "Falha ao guardar etiquetas",
|
||
"searchPlaceholder": "Pesquisar saída em todas as sessões...",
|
||
"searchResults": "{{count}} correspondências",
|
||
"searchFailed": "Pesquisa falhou",
|
||
"selectPaneHint": "Selecione um painel para pré-visualizar a sua saída",
|
||
"closePreview": "Fechar pré-visualização",
|
||
"newSession": "Nova sessão",
|
||
"newSessionHint": "Nome da sessão (letras, dígitos, _ @ % + = -)",
|
||
"newSessionPlaceholder": "my-session",
|
||
"create": "Criar",
|
||
"sessionCreated": "Sessão \"{{name}}\" criada",
|
||
"sessionCreateFailed": "Falha ao criar sessão",
|
||
"splitRight": "Dividir à direita",
|
||
"splitDown": "Dividir para baixo",
|
||
"splitFailed": "Falha ao dividir painel",
|
||
"newWindow": "Nova janela",
|
||
"windowCreateFailed": "Falha ao criar janela",
|
||
"attachSessionTooltip": "Anexar a {{session}}",
|
||
"refresh": "Atualizar",
|
||
"refreshFailed": "Falha ao atualizar sessões",
|
||
"collapseAll": "Recolher tudo",
|
||
"expandAll": "Expandir tudo",
|
||
"moreActions": "Mais ações",
|
||
"sessionStats": "Estatísticas da sessão",
|
||
"renameSessionTitle": "Renomear sessão \"{{name}}\"",
|
||
"rename": "Renomear",
|
||
"sessionRenamed": "Sessão renomeada para \"{{name}}\"",
|
||
"sessionRenameFailed": "Falha ao renomear sessão",
|
||
"editTagsTitle": "Editar etiquetas para \"{{name}}\"",
|
||
"killPane": "Terminar painel",
|
||
"resizeTree": "Arraste para redimensionar — clique duplo para repor",
|
||
"reattach": "Reanexar (corrige uma visualização distorcida)",
|
||
"killWindow": "Terminar janela",
|
||
"killWindowTitle": "Terminar janela {{index}} de \"{{session}}\"?",
|
||
"killWindowBody": "Todos os painéis e processos nesta janela serão terminados. Terminar a última janela encerra a sessão.",
|
||
"windowKillFailed": "Falha ao terminar janela",
|
||
"statusActivity": "Atividade",
|
||
"statusWindows": "Janelas",
|
||
"statusPanes": "painéis",
|
||
"statusTags": "Etiquetas",
|
||
"killPaneTitle": "Terminar painel {{id}}?",
|
||
"killPaneBody": "O processo em execução neste painel será terminado. Terminar o último painel fecha a sua janela.",
|
||
"paneKillFailed": "Falha ao terminar painel",
|
||
"killSessionTitle": "Terminar sessão \"{{name}}\"?",
|
||
"killSessionBody": "Todas as janelas e processos em execução nesta sessão serão terminados. Isto não pode ser desfeito.",
|
||
"kill": "Terminar",
|
||
"sessionKilled": "Sessão \"{{name}}\" terminada",
|
||
"sessionKillFailed": "Falha ao terminar sessão",
|
||
"hostUnreachable": "Não foi possível ligar ao anfitrião. Verifique se está online e acessível.",
|
||
"noServer": "Não há nenhum servidor tmux em execução neste anfitrião.",
|
||
"searchTruncated": "Resultados parciais — a pesquisa abrange as últimas {{lines}} linhas de cada painel e, no máximo, {{panes}} painéis.",
|
||
"closeSearchResults": "Fechar resultados da pesquisa",
|
||
"retry": "Tentar novamente",
|
||
"noHosts": "Nenhum anfitrião SSH disponível",
|
||
"noHostsHint": "Ative a opção Monitor Tmux num anfitrião SSH (Gestor de Anfitriões → separador Terminal) para monitorizar as suas sessões tmux.",
|
||
"tmuxInstallHint": "Instale-o no anfitrião com:",
|
||
"attachTooltip": "Abrir um terminal para {{host}}",
|
||
"attachTooltipPane": "Abrir um terminal para {{host}} — sessão tmux {{session}}",
|
||
"timeJustNow": "agora mesmo",
|
||
"timeMinutes": "há {{count}} min",
|
||
"timeHours": "há {{count}} h",
|
||
"timeDays": "há {{count}} d"
|
||
},
|
||
"mobileKeyboard": {
|
||
"shift": "Shift",
|
||
"ctrl": "Ctrl",
|
||
"esc": "Esc",
|
||
"tab": "Tab",
|
||
"backTab": "⇥",
|
||
"arrowUp": "Seta para Cima",
|
||
"arrowDown": "Seta para Baixo",
|
||
"arrowLeft": "Seta para a Esquerda",
|
||
"arrowRight": "Seta para a Direita",
|
||
"home": "Início",
|
||
"end": "Fim",
|
||
"pageUp": "PgUp",
|
||
"pageDown": "PgDn",
|
||
"delete": "Del",
|
||
"paste": "Colar",
|
||
"editQuickKeys": "Editar teclas rápidas",
|
||
"quickKeysTitle": "Teclas Rápidas",
|
||
"quickKeysDesc": "Toque no × para remover. Suporta até 8 caracteres.",
|
||
"quickKeyPlaceholder": "ex: sudo ",
|
||
"addQuickKey": "Adicionar",
|
||
"removeQuickKey": "Remover",
|
||
"resetDefaults": "Restaurar predefinições",
|
||
"done": "Concluir"
|
||
},
|
||
"serial": {
|
||
"title": "Serial",
|
||
"portLabel": "Porta",
|
||
"portPlaceholder": "/dev/ttyUSB0 ou COM3",
|
||
"baudRateLabel": "Taxa Baud",
|
||
"dataBitsLabel": "Dados",
|
||
"stopBitsLabel": "Stop",
|
||
"parityLabel": "Paridade",
|
||
"parityNone": "Nenhuma",
|
||
"parityEven": "Par",
|
||
"parityOdd": "Ímpar",
|
||
"connect": "Ligar à Serial",
|
||
"disconnect": "Desligar",
|
||
"refreshPorts": "Atualizar portas",
|
||
"connected": "Ligado a {{path}} a {{baud}} baud",
|
||
"disconnected": "Porta série desligada",
|
||
"connectionError": "Falha ao abrir a porta série",
|
||
"wsError": "Erro de WebSocket",
|
||
"errorNoServerUrl": "Nenhum URL de servidor configurado",
|
||
"notSupportedTitle": "Série não suportada",
|
||
"notSupported": "As ligações série requerem um navegador com suporte à Web Serial API (Chrome, Edge ou Firefox 151+) ou a aplicação de ambiente de trabalho Termix.",
|
||
"hideHint": "Pode ocultar o separador Série em Perfil do Utilizador > Aparência > Barra Lateral > Navegação.",
|
||
"browserPickerHint": "Clique em Ligar e o seu navegador abrirá um seletor de porta para escolher o dispositivo."
|
||
},
|
||
"metricsHistory": {
|
||
"title": "Histórico de Métricas",
|
||
"historySuffix": "Histórico",
|
||
"cpuMemoryDisk": "CPU / Memória / Disco",
|
||
"network": "Rede",
|
||
"download": "RX",
|
||
"upload": "TX",
|
||
"noData": "Sem dados de histórico disponíveis para este intervalo de tempo.",
|
||
"custom": "Personalizado",
|
||
"to": "a",
|
||
"apply": "Aplicar",
|
||
"viewHistory": "Ver Histórico"
|
||
},
|
||
"alerts": {
|
||
"tabFirings": "Alertas",
|
||
"tabRules": "Regras",
|
||
"tabChannels": "Canais",
|
||
"noFirings": "Nenhum alerta por reconhecer",
|
||
"noRules": "Nenhuma regra de alerta configurada",
|
||
"noChannels": "Nenhum canal de notificação configurado",
|
||
"rulesDesc": "As regras de alerta disparam notificações",
|
||
"channelsDesc": "Onde as notificações de alerta são enviadas",
|
||
"acknowledge": "Reconhecer",
|
||
"ackAll": "Reconhecer Todos",
|
||
"allAcknowledged": "Todos os alertas reconhecidos",
|
||
"ackFailed": "Falha ao reconhecer o alerta",
|
||
"ackAllFailed": "Falha ao reconhecer todos os alertas",
|
||
"showAcknowledged": "Mostrar Todos",
|
||
"hideAcknowledged": "Ocultar Reconhecidos",
|
||
"addChannel": "Adicionar Canal",
|
||
"editChannel": "Editar Canal",
|
||
"channelName": "Nome",
|
||
"channelType": "Tipo",
|
||
"channelNameRequired": "O nome é obrigatório",
|
||
"webhookUrl": "URL",
|
||
"webhookUrlRequired": "O URL do webhook é obrigatório",
|
||
"webhookDesc": "Enviar payload JSON via POST para este URL em cada disparo do alerta",
|
||
"ntfyServer": "URL do servidor",
|
||
"ntfyTopic": "Tópico",
|
||
"ntfyTopicRequired": "O tópico é obrigatório",
|
||
"ntfyToken": "Token de acesso (opcional)",
|
||
"channelSaveFailed": "Falha ao guardar o canal",
|
||
"test": "Testar",
|
||
"testSent": "Notificação de teste enviada",
|
||
"testFailed": "Falha na notificação de teste",
|
||
"addRule": "Adicionar regra de alerta",
|
||
"editRule": "Editar regra de alerta",
|
||
"ruleName": "Nome da regra",
|
||
"ruleNameRequired": "O nome é obrigatório",
|
||
"triggerType": "Gatilho",
|
||
"thresholdValue": "Limiar (%)",
|
||
"durationSeconds": "Duração (segundos, 0 = disparar imediatamente)",
|
||
"cooldownMinutes": "Período de arrefecimento (minutos)",
|
||
"channels": "Canais de notificação",
|
||
"noChannelsHint": "Adicione canais primeiro no separador Canais",
|
||
"ruleSaveFailed": "Falha ao guardar a regra"
|
||
}
|
||
}
|