mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-08-29 18:31:33 +00:00
release-2.6.0 (#1085)
* fix: general bug fixes * fix: general qol additions * ci(deps): bump actions/setup-node in the github-actions group (#1068) Bumps the github-actions group with 1 update: [actions/setup-node](https://github.com/actions/setup-node). 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) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '7' 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 28 updates (#1069) Bumps the dev-patch-updates group with 28 updates: | Package | From | To | | --- | --- | --- | | [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.5.2` | `2.5.4` | | [@codemirror/view](https://github.com/codemirror/view) | `6.43.5` | `6.43.6` | | [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.15` | `1.2.17` | | [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.18` | `1.1.20` | | [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.6` | `1.3.8` | | [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.18` | `1.1.20` | | [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.19` | `2.1.21` | | [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.11` | `2.1.12` | | [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.18` | `1.1.20` | | [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress) | `1.1.11` | `1.1.13` | | [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.13` | `1.2.15` | | [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.2` | `2.3.4` | | [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.11` | `1.1.12` | | [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.2` | `1.4.4` | | [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.2` | `1.3.4` | | [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.16` | `1.1.18` | | [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.11` | `1.2.13` | | [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) | `4.3.2` | `4.3.3` | | [@uiw/codemirror-extensions-langs](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` | | [@uiw/codemirror-theme-github](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` | | [@uiw/react-codemirror](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` | | [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `4.1.9` | `4.1.10` | | [@vitest/ui](https://github.com/vitest-dev/vitest/tree/HEAD/packages/ui) | `4.1.9` | `4.1.10` | | [i18next](https://github.com/i18next/i18next) | `26.3.4` | `26.3.6` | | [radix-ui](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/radix-ui) | `1.6.1` | `1.6.3` | | [react-i18next](https://github.com/i18next/react-i18next) | `17.0.8` | `17.0.10` | | [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.3.2` | `4.3.3` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.9` | `4.1.10` | Updates `@biomejs/biome` from 2.5.2 to 2.5.4 - [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.4/packages/@biomejs/biome) Updates `@codemirror/view` from 6.43.5 to 6.43.6 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/commits) Updates `@radix-ui/react-accordion` from 1.2.15 to 1.2.17 - [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.18 to 1.1.20 - [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.6 to 1.3.8 - [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.18 to 1.1.20 - [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.19 to 2.1.21 - [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.11 to 2.1.12 - [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.18 to 1.1.20 - [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.11 to 1.1.13 - [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.13 to 1.2.15 - [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.2 to 2.3.4 - [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.11 to 1.1.12 - [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.2 to 1.4.4 - [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-switch` from 1.3.2 to 1.3.4 - [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.16 to 1.1.18 - [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.11 to 1.2.13 - [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 `@tailwindcss/vite` from 4.3.2 to 4.3.3 - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/@tailwindcss-vite) Updates `@uiw/codemirror-extensions-langs` from 4.25.10 to 4.25.11 - [Release notes](https://github.com/uiwjs/react-codemirror/releases) - [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11) Updates `@uiw/codemirror-theme-github` from 4.25.10 to 4.25.11 - [Release notes](https://github.com/uiwjs/react-codemirror/releases) - [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11) Updates `@uiw/react-codemirror` from 4.25.10 to 4.25.11 - [Release notes](https://github.com/uiwjs/react-codemirror/releases) - [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11) Updates `@vitest/coverage-v8` from 4.1.9 to 4.1.10 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/coverage-v8) Updates `@vitest/ui` from 4.1.9 to 4.1.10 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/ui) Updates `i18next` from 26.3.4 to 26.3.6 - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v26.3.4...v26.3.6) Updates `radix-ui` from 1.6.1 to 1.6.3 - [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/radix-ui/CHANGELOG.md) - [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/radix-ui) Updates `react-i18next` from 17.0.8 to 17.0.10 - [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/react-i18next/compare/v17.0.8...v17.0.10) Updates `tailwindcss` from 4.3.2 to 4.3.3 - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/tailwindcss) Updates `vitest` from 4.1.9 to 4.1.10 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/vitest) --- updated-dependencies: - dependency-name: "@biomejs/biome" dependency-version: 2.5.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@codemirror/view" dependency-version: 6.43.6 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.17 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.20 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.8 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.20 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.21 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.12 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.20 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.13 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.15 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.4 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.12 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.4 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.4 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.18 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.13 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@tailwindcss/vite" dependency-version: 4.3.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@uiw/codemirror-extensions-langs" dependency-version: 4.25.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@uiw/codemirror-theme-github" dependency-version: 4.25.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@uiw/react-codemirror" dependency-version: 4.25.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@vitest/coverage-v8" dependency-version: 4.1.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: "@vitest/ui" dependency-version: 4.1.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: i18next dependency-version: 26.3.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: radix-ui dependency-version: 1.6.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: react-i18next dependency-version: 17.0.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: tailwindcss dependency-version: 4.3.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-patch-updates - dependency-name: vitest dependency-version: 4.1.10 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 ws in the prod-patch-updates group (#1071) Bumps the prod-patch-updates group with 1 update: [ws](https://github.com/websockets/ws). Updates `ws` from 8.21.0 to 8.21.1 - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.21.0...8.21.1) --- updated-dependencies: - dependency-name: ws dependency-version: 8.21.1 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 the major-updates group with 2 updates (#1072) Bumps the major-updates group with 2 updates: [nanoid](https://github.com/ai/nanoid) and [typescript](https://github.com/microsoft/TypeScript). Updates `nanoid` from 5.1.16 to 6.0.0 - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/5.1.16...6.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: nanoid dependency-version: 6.0.0 dependency-type: direct:production 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> * fix: general qol additions and new analytics/telemetrics feature * fix: incorrect version sent to posthog * feat: add multiplayer/shared sessions for terminal and guacd * feat: rework Electron desktop app to run standalone-first with optional two-way sync to a remote Termix server * Fix Guacamole tab visibility lifecycle (#1074) Co-authored-by: default-student <default-student@github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix(alerts): send channel config as object payload instead of JSON string (#1075) * fix tmux-monitor tailscale issue (#1076) * Initial plan * fix(tmux-monitor): explicitly handle tailscale auth in PanePreview hostConfig For Tailscale-auth hosts the pane-preview attach path was building the Terminal hostConfig with only the generic spread of host fields. This could omit or mismap auth-critical details and trigger a plain TCP/SSH reachability path that doesn't work with Tailscale-only SSH endpoints. The fix branches on `host.authType === "tailscale"` and: - Carries `authType: "tailscale"` explicitly so the backend always selects the Tailscale-aware PTY path regardless of how the host object evolves. - Derives `port` from `host.sshPort ?? host.port` so Tailscale SSH endpoints on a non-default SSH port are reached correctly. - Leaves all non-tailscale auth types on the unchanged code path. Reattach (bumping instanceId + attachNonce) continues to work because terminalHostConfig is recomputed on every render with the latest instanceIdRef.current value. * refactor(tmux-monitor): simplify tailscale port logic with extracted variable Address code review feedback: extract resolvedPort into a local variable to avoid the duplicated `host.sshPort ?? host.port` expression that was assigned to both `port` and `sshPort`. Restructure as an if/else block instead of an IIFE for readability. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * chore: run prettier * chore: update beta release text * fix: cant update credential of an RDP host * feat: add custom key shortcuts * feat: add support for MFA over SSH * fix: Invalid websocket frame causing code 10006 crash triggering restart loop * fix(net): correct SSRF blocklist false-positive blocking all outbound IPv4 (#1079) * fix: correct IPv4-mapped-IPv6 blocklist entry blocking all outbound IPv4 ::ffff:0:0/96 in the IPv6 blocklist matches every IPv4 address once mapped, since Node's BlockList compares addresses in their mapped form internally regardless of the declared family. This caused safeOutboundFetch to reject all IPv4-resolved destinations as private, breaking outbound requests (e.g. ntfy/webhook notifications) whenever DNS resolved to IPv4. Replaced with individual mapped ranges mirroring the existing IPv4 blocklist. * test: cover isBlockedAddress and link the Node BlockList citation Exports isBlockedAddress so its family-crossing behavior around IPv4-mapped-IPv6 addresses can actually be asserted, instead of relying on manual container debugging to notice a regression. Also swaps the prior "Node's BlockList compares addresses in mapped form" comment for one citing the documented example in the Node docs (https://nodejs.org/api/net.html#class-netblocklist), since that behavior isn't otherwise obvious from the addSubnet/check call sites. Related: Termix-SSH/Support#1024 * refactor: derive IPv6 mirror from IPv4 list, split DNS error messages Two follow-ups from review: - The IPv6 blocklist previously hand-duplicated each IPv4 range as its IPv4-mapped-IPv6 equivalent. Nothing enforced the two stayed in sync, which is exactly how the original bug (a mismatched ::ffff:0:0/96 entry blocking all IPv4) was introduced in the first place. Now derived from a single blockedIpv4Ranges list in one loop. - The connect.lookup hook threw the same "Private destinations are not allowed" for both an empty DNS result and an actually-blocked address. An empty result is a resolution failure, not a privacy decision, and conflating the two is the same kind of opaque-error problem that made this bug slow to diagnose in production. Split into distinct messages. Also extracted the lookup hook itself (createDnsLookupHook) so it can be unit-tested against a fake resolver directly, instead of only through a real fetch()/Agent call — the bug lived entirely in this callback, and undici wraps any error thrown here as a generic "fetch failed" TypeError, which is why isolating it matters for testability. --------- Co-authored-by: brennanneoh <497569+brennanneoh@users.noreply.github.com> * fix(ssh): do not offer chacha20-poly1305 without the native ssh2 binding (#1081) The availability probe treated a working OpenSSL "chacha20" cipher as proof that chacha20-poly1305@openssh.com is usable. It is not: ssh2 pure-JS chacha20-poly1305 corrupts the transport, so the peer aborts the KEX ("incomplete message [preauth]") and the connection times out. Easy to hit on jump-host connections whose target sshd negotiates chacha20-poly1305 first. Only trust the native binding (sshcrypto.node); otherwise leave the cipher disabled so filterCiphers() drops it and AES-GCM is negotiated instead. Co-authored-by: XtraLarge <> * fix: add Swiss German server layout (#1078) * chore: update release notes * feat: continue improving desktop app 2-way sync with logic fixes and a migration dialog * fix: dekstop app showing auth form without syncing * feat: create desktop auto sessions for existing setups * feat: add electron backend killing * fix: electron login and session related bugs and updated readme for v2.6.0 * chore: finalize release notes * fix: click to expand hosts including extra bottom margin * fix: desktop auth modal failing to log users in * fix: desktop app failing to sync * fix: reverse proxy causing sync error * chore: lint, format, and bump version to 2.6.0 * chore: sync Crowdin translations for 2.6.0 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: L.H. <117188168+default-student@users.noreply.github.com> Co-authored-by: default-student <default-student@github.com> Co-authored-by: Brad Baker <xyzulu@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Brennan Neoh <brennanneoh@users.noreply.github.com> Co-authored-by: brennanneoh <497569+brennanneoh@users.noreply.github.com> Co-authored-by: XtraLarge <eMail@WilliWerres.de> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
This commit is contained in:
co-authored by
XtraLarge <>
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
L.H.
default-student
Brad Baker
copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Copilot Autofix powered by AI
Brennan Neoh
brennanneoh
XtraLarge
ZacharyZcR
parent
cf3e2cb499
commit
1a26628a48
@@ -389,6 +389,45 @@
|
||||
"noSavedServers": "Nenhum servidor salvo",
|
||||
"removeServer": "Remover"
|
||||
},
|
||||
"migrationNotice": {
|
||||
"title": "O Termix Desktop agora funciona de forma independente.",
|
||||
"body1": "Este aplicativo costumava se conectar diretamente ao seu servidor Termix. Ele foi reformulado para funcionar de forma totalmente independente, armazenando hosts e credenciais localmente para que continue funcionando offline. A sincronização bidirecional com um servidor Termix auto-hospedado agora é opcional.",
|
||||
"body2": "Seus hosts e credenciais atuais ainda estão em {{url}}. Ative a Sincronização Remota e reconecte-se a esse servidor para recuperá-los e mantê-los sincronizados daqui para frente.",
|
||||
"dismiss": "Agora não",
|
||||
"setUpSync": "Configurar sincronização remota"
|
||||
},
|
||||
"remoteSync": {
|
||||
"title": "Sincronização remota",
|
||||
"description": "Opcionalmente, conecte este aplicativo de desktop a um servidor Termix auto-hospedado para sincronizar seus hosts, credenciais e trechos de código entre dispositivos. O aplicativo funciona sempre totalmente offline, independentemente de estar conectado ou não.",
|
||||
"notConnected": "Não conectado",
|
||||
"connected": "Conectado",
|
||||
"connectedTo": "Conectado a {{url}}",
|
||||
"lastSynced": "Última sincronização {{time}}",
|
||||
"neverSynced": "Nunca sincronizado",
|
||||
"syncError": "Erro de sincronização: {{message}}",
|
||||
"needsReauth": "Login expirou",
|
||||
"connectButton": "Conectar ao servidor",
|
||||
"disconnectButton": "Desconectar",
|
||||
"syncNowButton": "Sincronizar agora",
|
||||
"syncing": "Sincronizando...",
|
||||
"serverUrl": "URL do servidor",
|
||||
"enterServerUrl": "Por favor, insira um URL de servidor.",
|
||||
"mustIncludeProtocol": "O URL do servidor deve começar com http:// ou https://",
|
||||
"connectionTestFailed": "Não foi possível acessar um servidor Termix nesse URL.",
|
||||
"allowInvalidCertificate": "Permitir certificado inválido",
|
||||
"allowInvalidCertificateDesc": "Utilize somente em servidores autohospedados confiáveis 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 conexão",
|
||||
"originDescription": "Por padrão, escolha de onde as conexões SSH se originam. Essa 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 se há atualizações",
|
||||
@@ -602,6 +641,7 @@
|
||||
"overrideCredentialUsername": "Substituir nome de usuário da credencial",
|
||||
"overrideCredentialUsernameDesc": "Use o nome de usuário especificado acima em vez do nome de usuário da credencial.",
|
||||
"oidcUsernameHint": "Use $oidc.preferred_username para substituir seu nome de login OIDC.",
|
||||
"tailscaleUsernameHint": "Este deve ser um usuário Unix cuja identidade Tailscale é concedida na ACL SSH da tailnet, não necessariamente o usuário root.",
|
||||
"jumpHostChain": "Cadeia de anfitriões de salto",
|
||||
"portKnocking": "Batendo ao porto",
|
||||
"addKnock": "Adicionar porta",
|
||||
@@ -650,6 +690,11 @@
|
||||
"delayAfterMs": "Atraso após (ms)",
|
||||
"useSocks5Proxy": "Usar proxy SOCKS5",
|
||||
"useSocks5ProxyDesc": "Encaminhar a conexão através de um servidor proxy",
|
||||
"connectionOrigin": "Origem da conexão",
|
||||
"connectionOriginDesc": "De onde se origina a conexão SSH deste host. Substitui o padrão global do aplicativo de desktop.",
|
||||
"connectionOriginDefault": "Usar padrão",
|
||||
"connectionOriginLocal": "Este dispositivo (rede local)",
|
||||
"connectionOriginRemote": "Servidor remoto",
|
||||
"proxyHost": "Host proxy",
|
||||
"proxyPort": "Porta proxy",
|
||||
"proxyUsername": "Nome de usuário do proxy",
|
||||
@@ -762,6 +807,14 @@
|
||||
"customThemeBrightCyan": "Ciano brilhante",
|
||||
"customThemeBrightWhite": "Branco brilhante",
|
||||
"customThemeResetTooltip": "Restaurar padrões de fábrica",
|
||||
"savedThemesLabel": "Temas salvos",
|
||||
"saveAsGlobalTheme": "Salvar como tema global",
|
||||
"saveGlobalThemeNamePrompt": "Insira um nome para este tema.",
|
||||
"saveGlobalThemeSuccess": "Tema salvo",
|
||||
"saveGlobalThemeError": "Falha ao salvar o tema",
|
||||
"applyGlobalThemeTooltip": "Aplique este tema",
|
||||
"deleteGlobalThemeTooltip": "Excluir este tema",
|
||||
"noSavedThemes": "Ainda não há temas salvos.",
|
||||
"syntaxHighlightingLabel": "Realce de sintaxe",
|
||||
"syntaxHighlightingDesc": "Colorir a saída do terminal (erros, caminhos, IPs, registros de data e hora)",
|
||||
"syntaxHighlightingCategories": "Categorias em destaque",
|
||||
@@ -791,6 +844,8 @@
|
||||
"enableAutoTmuxDesc": "Iniciar ou conectar-se automaticamente a uma sessão do tmux",
|
||||
"enableSessionLogging": "Registro de sessão",
|
||||
"enableSessionLoggingDesc": "Registre a saída da sessão do terminal para revisão posterior.",
|
||||
"allowSessionSharing": "Permitir compartilhamento de sessão",
|
||||
"allowSessionSharingDesc": "Permitir que as sessões ao vivo neste servidor sejam compartilhadas por meio de link ou com outros usuários.",
|
||||
"enableCommandHistory": "Histórico de comandos",
|
||||
"enableCommandHistoryDesc": "Registre os comandos executados neste terminal para histórico e preenchimento automático.",
|
||||
"linkClickBehaviorLabel": "Comportamento de clique em links",
|
||||
@@ -895,6 +950,7 @@
|
||||
"proxmoxResultImported": "{{count}} importado",
|
||||
"proxmoxResultUpdated": "{{count}} atualizado",
|
||||
"proxmoxResultFailed": "{{count}} falhou",
|
||||
"proxmoxResultSkippedNoIp": "{{count}} ignorado (nenhum IP encontrado)",
|
||||
"proxmoxImportComplete": "Importação do Proxmox concluída: {{summary}}",
|
||||
"proxmoxDiscoveryFailed": "A descoberta falhou",
|
||||
"proxmoxImportFailed": "A importação falhou",
|
||||
@@ -961,6 +1017,9 @@
|
||||
"failedToSaveCredential": "Falha ao salvar as credenciais",
|
||||
"credentialNameRequired": "Por favor, insira um nome para a credencial.",
|
||||
"credentialAuthRequired": "Adicione uma senha, uma chave SSH ou ambas.",
|
||||
"createCredentialFromHostBtn": "Criar credencial",
|
||||
"createCredentialFromHostTitle": "Criar credencial a partir do host",
|
||||
"createCredentialFromHostDesc": "Crie uma entrada de credencial reutilizável e compartilhável, preenchida previamente com o nome de usuário, senha e/ou chave SSH atuais deste host.",
|
||||
"backToHosts": "Voltar para Anfitriões",
|
||||
"backToCredentials": "Voltar às credenciais",
|
||||
"pinned": "Fixado",
|
||||
@@ -1000,6 +1059,9 @@
|
||||
"folderNestingHint": "Use / 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 usam autenticação com \"Credenciais armazenadas\" sem que suas próprias credenciais estejam selecionadas herdarão esta.",
|
||||
"folderPreview": "Pré-visualização",
|
||||
"folderNameFallback": "Pasta sem título",
|
||||
"createFolderButton": "Criar pasta",
|
||||
@@ -1181,6 +1243,10 @@
|
||||
"filterTagsGroup": "Etiquetas",
|
||||
"shareHost": "Compartilhar Host",
|
||||
"shareHostTitle": "Compartilhar: {{name}}",
|
||||
"shareFolder": "Pasta compartilhada",
|
||||
"shareFolderTitle": "Pasta compartilhada: {{name}}",
|
||||
"folderSharedSuccessfully": "Host(ns) compartilhado(s) {{count}} na pasta",
|
||||
"failedToShareFolder": "Falha ao compartilhar a pasta",
|
||||
"sharing": {
|
||||
"loadError": "Não foi possível carregar os dados de compartilhamento. Tente novamente.",
|
||||
"shareWithSection": "Compartilhe com",
|
||||
@@ -1221,6 +1287,7 @@
|
||||
"shareWithCount": "Compartilhar ({{count}})",
|
||||
"currentAccess": "Acesso atual",
|
||||
"noAccessEntries": "Este host ainda não foi compartilhado.",
|
||||
"folderShareSummary": "Compartilhado {{shared}} de {{total}} hosts nesta pasta",
|
||||
"grantedBy": "Concedido por",
|
||||
"expires": "Expira",
|
||||
"expired": "Expirado",
|
||||
@@ -1242,6 +1309,8 @@
|
||||
"authMethod": "Método de autenticação",
|
||||
"authTypeDirect": "Direto",
|
||||
"authTypeCredential": "Credencial",
|
||||
"authTypeNone": "Nenhum",
|
||||
"authTypeNoneDesc": "Nenhuma credencial é armazenada. Você será solicitado a inserir um nome de usuário e uma senha sempre que se conectar; eles não são salvos.",
|
||||
"selectCredential": "Selecione uma credencial...",
|
||||
"connectionSettings": "Configurações de conexão",
|
||||
"displaySettings": "Configurações de exibição",
|
||||
@@ -1259,6 +1328,7 @@
|
||||
"rdpPort": "Porta RDP",
|
||||
"username": "Nome de usuário",
|
||||
"password": "Senha",
|
||||
"passwordSaved": "Senha salva, digite para alterar",
|
||||
"domain": "Domínio",
|
||||
"securityMode": "Modo de segurança",
|
||||
"colorDepth": "Profundidade de cor",
|
||||
@@ -1424,7 +1494,60 @@
|
||||
"expiresIn": "Expira em {{duration}}",
|
||||
"search": "Buscar conexões...",
|
||||
"noSearchResults": "Nenhuma conexão corresponde à sua pesquisa.",
|
||||
"rename": "Renomear sessão"
|
||||
"rename": "Renomear sessão",
|
||||
"sectionSharedWithMe": "Compartilhou comigo",
|
||||
"sharedBy": "Compartilhado por {{username}}",
|
||||
"join": "Juntar",
|
||||
"sharedSessionLabel": "{{hostName}} (compartilhado)"
|
||||
},
|
||||
"sessionSharing": {
|
||||
"guestView": {
|
||||
"loading": "Conectando à sessão compartilhada...",
|
||||
"linkInvalid": "Este link de compartilhamento é 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 compartilhamento",
|
||||
"shareButton": "Compartilhar",
|
||||
"notReadyToShare": "A sessão ainda não está pronta para ser compartilhada.",
|
||||
"modeTab": {
|
||||
"link": "Link",
|
||||
"user": "Usuário"
|
||||
},
|
||||
"linkModeDescription": "Qualquer pessoa com este link pode participar, sem necessidade de criar uma conta.",
|
||||
"userModeDescription": "Compartilhe com um usuário específico que já tenha acesso a este host. Caso ele ainda não tenha acesso, compartilhe o host com ele primeiro ou use um link. Após o compartilhamento, a sessão aparecerá na aba Conexões do usuário.",
|
||||
"permissionLevel": {
|
||||
"label": "Nível de permissão",
|
||||
"readOnly": "Somente leitura",
|
||||
"readOnlyDescription": "É possível assistir à sessão ao vivo, 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": "Compartilhar com o usuário",
|
||||
"searchUsersPlaceholder": "Pesquisar usuários...",
|
||||
"noUsersFound": "Nenhum usuário encontrado",
|
||||
"linkCreated": "Compartilhar link criado",
|
||||
"linkCopied": "Link copiado para a área de transferência",
|
||||
"copyLink": "Copiar link",
|
||||
"shareCreated": "Sessão compartilhada. Ela aparecerá na aba Conexões deles.",
|
||||
"shareFailed": "Falha ao criar compartilhamento",
|
||||
"userLacksHostAccess": "Esse usuário ainda não tem acesso a este host. Compartilhe o host com ele primeiro ou use um link.",
|
||||
"activeShares": "Ações ativas",
|
||||
"noActiveShares": "Nenhuma ação ativa nesta sessão.",
|
||||
"revoke": "Revogar",
|
||||
"revokeConfirmTitle": "Revogar essa participação?",
|
||||
"revokeConfirmDescription": "Qualquer pessoa que usar este compartilhamento 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": "Link",
|
||||
"userShareBadge": "Usuário: {{username}}",
|
||||
"loadSharesFailed": "Falha ao carregar compartilhamentos ativos"
|
||||
},
|
||||
"guacamole": {
|
||||
"connecting": "Conectando à sessão {{type}}...",
|
||||
@@ -1436,6 +1559,9 @@
|
||||
"reconnect": "Reconectar",
|
||||
"retry": "Tentar novamente",
|
||||
"guacdUnavailable": "O serviço de área de trabalho remota (guacd) não está disponível. Certifique-se de que o guacd esteja em execução, acessível e configurado corretamente nas configurações de administrador.",
|
||||
"credentialPromptTitle": "Insira as credenciais RDP",
|
||||
"credentialPromptDescription": "Este host está configurado para solicitar credenciais ao conectar. Elas são usadas apenas para esta sessão e não são salvas.",
|
||||
"connect": "Conectar",
|
||||
"ctrlAltDel": "Ctrl+Alt+Del",
|
||||
"toolbar": {
|
||||
"ctrlAltDel": "Ctrl+Alt+Del",
|
||||
@@ -1461,7 +1587,9 @@
|
||||
"reconnect": "Sessão de reconexão",
|
||||
"collapse": "Recolher barra de ferramentas",
|
||||
"expand": "Expandir barra de ferramentas",
|
||||
"dragHandle": "Arraste para reposicionar"
|
||||
"dragHandle": "Arraste para reposicionar",
|
||||
"switchToTrackpad": "Alternar para o modo trackpad (arraste para mover o cursor, toque para clicar)",
|
||||
"switchToTouch": "Mude para o modo de toque (toque diretamente onde deseja clicar)."
|
||||
}
|
||||
},
|
||||
"terminal": {
|
||||
@@ -1508,6 +1636,11 @@
|
||||
"totpRequired": "Autenticação de dois fatores obrigatória",
|
||||
"totpCodeLabel": "Código de verificação",
|
||||
"totpVerify": "Verificar",
|
||||
"mfaPromptRequired": "Autenticação necessária",
|
||||
"mfaPushRequired": "Autenticação Push necessária",
|
||||
"mfaMenuPlaceholder": "Insira sua resposta",
|
||||
"mfaWaitingApproval": "Aguardando 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",
|
||||
@@ -2277,7 +2410,8 @@
|
||||
"resetCodeRateLimited": "Taxa de tentativas limitada: Muitas tentativas de verificação. Tente novamente mais tarde.",
|
||||
"resetCodeRateLimitedWithTime": "Taxa de tentativas limitada: Muitas tentativas de verificação. Aguarde {{time}} segundos antes de tentar novamente.",
|
||||
"authTokenSaveFailed": "Falha ao salvar o token de autenticação",
|
||||
"failedToLoadServer": "Falha ao carregar o servidor"
|
||||
"failedToLoadServer": "Falha ao carregar o servidor",
|
||||
"remoteServerRequired": "É necessário um servidor remoto. Conecte um servidor remoto nas Configurações para usar este tipo de conexão."
|
||||
},
|
||||
"messages": {
|
||||
"registrationDisabled": "O cadastro de novas contas está temporariamente desativado por um administrador. Faça login ou entre em contato com um administrador.",
|
||||
@@ -2644,6 +2778,17 @@
|
||||
"sslSaveFailed": "Falha ao salvar as configurações SSL",
|
||||
"sslRequiresDomain": "Domínio e e-mail são obrigatórios.",
|
||||
"sslInfoNote": "Após emitir o certificado, habilite o SSL nas suas 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 seu certificado e chave privada existentes, incluindo a cadeia completa, se exigido pela sua Autoridade Certificadora.",
|
||||
"sslManualUpload": "Carregar e instalar certificado",
|
||||
"sslManualUploadLoading": "Enviando certificado...",
|
||||
"sslManualUploadSuccess": "Certificado carregado e instalado com sucesso.",
|
||||
"sslManualUploadFailed": "O envio do certificado falhou",
|
||||
"sslManualRequiresFields": "É necessário certificado e chave privada.",
|
||||
"auditLogTotal": "{{total}} total de entradas",
|
||||
"auditLogEmpty": "Nenhuma entrada de log de auditoria encontrada.",
|
||||
"auditLogSuccess": "Sucesso",
|
||||
@@ -2672,6 +2817,12 @@
|
||||
"commandHistoryEnabled": "Histórico de comandos",
|
||||
"commandHistoryEnabledDesc": "Permitir o registro do histórico de comandos. Quando desativado, o histórico não é salvo, independentemente das configurações de cada host.",
|
||||
"updateCommandHistoryFailed": "Falha ao atualizar a configuração do histórico de comandos",
|
||||
"analyticsEnabled": "Compartilhar estatísticas de uso anônimas",
|
||||
"analyticsEnabledDesc": "Envia uma contagem diária anônima de usuários, hosts e uso de recursos para ajudar a melhorar o Termix. Nenhum dado pessoal ou detalhe de conexão é incluído.",
|
||||
"updateAnalyticsFailed": "Falha ao atualizar as configurações de análise",
|
||||
"sessionSharingGloballyEnabled": "Permitir compartilhamento de sessão",
|
||||
"sessionSharingGloballyEnabledDesc": "Permite que sessões de terminal ao vivo, RDP, VNC e Telnet sejam compartilhadas em toda a instância. Substitui todas as configurações de compartilhamento por host quando desativada.",
|
||||
"updateSessionSharingFailed": "Falha ao atualizar as configurações de compartilhamento de sessão.",
|
||||
"sessionTimeout": "Tempo limite da sessão",
|
||||
"hours": "horas",
|
||||
"sessionTimeoutRange": "Mínimo 1h · Máximo 720h",
|
||||
@@ -3119,6 +3270,47 @@
|
||||
"executionSuccess": "Sucesso",
|
||||
"executionFailed": "Fracassado"
|
||||
},
|
||||
"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 há atalhos personalizados.",
|
||||
"defaultBadge": "Padrão",
|
||||
"customizedBadge": "Personalizado",
|
||||
"customize": "Personalizar",
|
||||
"resetToDefault": "Restaurar para as configurações padrão",
|
||||
"resetAllToDefaults": "Redefinir tudo para os padrões de fábrica",
|
||||
"close": "Fechar",
|
||||
"cancel": "Cancelar",
|
||||
"saveBinding": "Atalho para salvar",
|
||||
"saveError": "Falha ao salvar 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": "Digite o texto que deseja enviar.",
|
||||
"controlCodeRequiredError": "Digite uma única letra para o código de controle.",
|
||||
"snippetRequiredError": "Selecione um trecho",
|
||||
"conflictWarning": "Esta combinação já está vinculada a {{combo}}. Salvar 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 trecho de código existente",
|
||||
"controlCodeLabel": "Carta",
|
||||
"textLabel": "Texto a enviar",
|
||||
"appendEnterLabel": "Pressione Enter após enviar",
|
||||
"snippetLabel": "Trecho",
|
||||
"selectSnippetPlaceholder": "Selecione um trecho",
|
||||
"orphanedSnippetWarning": "trecho não encontrado",
|
||||
"clipboardPermissionNote": "Pode solicitar permissão para acessar a área de transferência no primeiro uso em alguns navegadores."
|
||||
},
|
||||
"userProfile": {
|
||||
"donateTitle": "Mantenha o Termix vivo",
|
||||
"donateDescription": "O Termix é gratuito, auto-hospedado e desenvolvido por apenas algumas pessoas em seu tempo livre. Se ele lhe economizou tempo ou dinheiro, uma doação em criptomoedas ajuda a mantê-lo funcionando.",
|
||||
@@ -3134,6 +3326,7 @@
|
||||
"sectionAppearance": "Aparência",
|
||||
"sectionSecurity": "Segurança",
|
||||
"sectionApiKeys": "Chaves de API",
|
||||
"sectionData": "Dados",
|
||||
"sectionC2sTunnels": "Túneis C2S",
|
||||
"usernameLabel": "Nome de usuário",
|
||||
"roleLabel": "Papel",
|
||||
@@ -3162,6 +3355,9 @@
|
||||
"settingsTerminal": "terminal",
|
||||
"commandAutocomplete": "Preenchimento automático de comandos",
|
||||
"commandAutocompleteDesc": "Mostrar o recurso de autocompletar enquanto digita",
|
||||
"keyboardShortcuts": "Atalhos de teclado",
|
||||
"keyboardShortcutsDescription": "Personalize os atalhos de copiar, colar e comandos do terminal.",
|
||||
"manageShortcuts": "Gerenciar",
|
||||
"terminalLinkBehavior": "Clique no link do terminal",
|
||||
"terminalLinkBehaviorDesc": "Comportamento padrão ao clicar em links no terminal.",
|
||||
"historyTracking": "Rastreamento de histórico",
|
||||
@@ -3228,6 +3424,22 @@
|
||||
"apiKeyUsageHint": "Inclua sua chave no",
|
||||
"apiKeyUsageHintHeader": "cabeçalho.",
|
||||
"apiKeyPermissionsHint": "As chaves herdam as permissões do usuário que as criou.",
|
||||
"exportData": "Exportar meus dados",
|
||||
"exportDataDesc": "Faça o download de um backup dos seus hosts, credenciais e configurações para transferir para outro dispositivo.",
|
||||
"export": "Exportar",
|
||||
"exporting": "Exportador...",
|
||||
"importData": "Importar meus dados",
|
||||
"importDataDesc": "Restaure seus hosts, credenciais e configurações a partir de um arquivo de backup .sqlite.",
|
||||
"importDataSelected": "Selecionado: {{name}}",
|
||||
"selectFile": "Selecionar arquivo",
|
||||
"changeFile": "Mudar",
|
||||
"import": "Importar",
|
||||
"importing": "Importando...",
|
||||
"exportSuccess": "Dados exportados com sucesso",
|
||||
"exportFailed": "A exportação de dados falhou",
|
||||
"importSelectFile": "Por favor, selecione um arquivo primeiro.",
|
||||
"importCompleted": "Importação concluída: {{total}} itens importados, {{skipped}} ignorados",
|
||||
"importFailed": "A importação falhou: {{error}}",
|
||||
"roleUser": "Usuário",
|
||||
"authMethodDual": "Autenticação dupla",
|
||||
"authMethodOidc": "OIDC",
|
||||
@@ -3379,6 +3591,7 @@
|
||||
"pageUp": "PgUp",
|
||||
"pageDown": "PgDn",
|
||||
"delete": "Del",
|
||||
"paste": "Colar",
|
||||
"editQuickKeys": "Editar teclas de atalho",
|
||||
"quickKeysTitle": "Teclas de atalho",
|
||||
"quickKeysDesc": "Toque em × para remover. Suporta até 8 caracteres.",
|
||||
|
||||
Reference in New Issue
Block a user